[READ-ONLY] Mirror of https://github.com/bombshell-dev/docs. bomb.sh/docs
0

Configure Feed

Select the types of activity you want to include in your feed.

add: initial documentation structure and baseline content

Paul Valladares (Mar 21, 2025, 2:31 PM -0600) b390c158 a93fb9e8

+1252 -447
+44 -23
astro.config.mjs
··· 1 1 // @ts-check 2 - import { defineConfig } from 'astro/config'; 3 - import starlight from '@astrojs/starlight'; 2 + import { defineConfig } from "astro/config"; 3 + import starlight from "@astrojs/starlight"; 4 + import ecTwoSlash from "expressive-code-twoslash"; 4 5 5 6 // https://astro.build/config 6 7 export default defineConfig({ 7 - integrations: [ 8 - starlight({ 9 - title: 'My Docs', 10 - social: { 11 - github: 'https://github.com/withastro/starlight', 12 - }, 13 - sidebar: [ 14 - { 15 - label: 'Guides', 16 - items: [ 17 - // Each item here is one entry in the navigation menu. 18 - { label: 'Example Guide', slug: 'guides/example' }, 19 - ], 20 - }, 21 - { 22 - label: 'Reference', 23 - autogenerate: { directory: 'reference' }, 24 - }, 25 - ], 26 - }), 27 - ], 8 + integrations: [ 9 + starlight({ 10 + title: "Bombshell", 11 + customCss: [ 12 + // Relative path to your @font-face CSS file. 13 + "./src/fonts/font-face.css", 14 + ], 15 + logo: { 16 + dark: "./src/assets/dark.svg", 17 + light: "./src/assets/light.svg", 18 + }, 19 + components: { 20 + Head: "./src/starlightOverrides/Head.astro", 21 + }, 22 + expressiveCode: { 23 + plugins: [ecTwoSlash()], 24 + }, 25 + editLink: { 26 + baseUrl: "https://github.com/bombshell-dev/clack/docs/edit/main/", 27 + }, 28 + social: { 29 + discord: "https://bomb.sh/chat", 30 + blueSky: "https://bomb.sh/on/bluesky", 31 + github: "https://bomb.sh/on/github", 32 + }, 33 + sidebar: [ 34 + { 35 + label: "Basics", 36 + autogenerate: { directory: "basics" }, 37 + }, 38 + { 39 + label: "Clack", 40 + autogenerate: { directory: "clack" }, 41 + }, 42 + { 43 + label: "Guides", 44 + autogenerate: { directory: "guides" }, 45 + }, 46 + ], 47 + }), 48 + ], 28 49 });
+9 -5
package.json
··· 1 1 { 2 - "name": "", 2 + "name": "clack-docs", 3 3 "type": "module", 4 4 "version": "0.0.1", 5 5 "scripts": { ··· 10 10 "astro": "astro" 11 11 }, 12 12 "dependencies": { 13 - "@astrojs/starlight": "^0.32.4", 14 - "astro": "^5.5.3", 15 - "sharp": "^0.32.5" 13 + "@astrojs/starlight": "^0.32.2", 14 + "@clack/core": "^0.4.1", 15 + "@clack/prompts": "^0.10.0", 16 + "@types/node": "^22.13.11", 17 + "astro": "^5.1.5", 18 + "expressive-code-twoslash": "^0.4.0", 19 + "sharp": "^0.33.5" 16 20 } 17 - } 21 + }
+107 -370
pnpm-lock.yaml
··· 9 9 .: 10 10 dependencies: 11 11 '@astrojs/starlight': 12 - specifier: ^0.32.4 13 - version: 0.32.4(astro@5.5.4(rollup@4.36.0)(typescript@5.8.2)) 12 + specifier: ^0.32.2 13 + version: 0.32.4(astro@5.5.4(@types/node@22.13.11)(rollup@4.36.0)(typescript@5.8.2)) 14 + '@clack/core': 15 + specifier: ^0.4.1 16 + version: 0.4.1 17 + '@clack/prompts': 18 + specifier: ^0.10.0 19 + version: 0.10.0 20 + '@types/node': 21 + specifier: ^22.13.11 22 + version: 22.13.11 14 23 astro: 15 - specifier: ^5.5.3 16 - version: 5.5.4(rollup@4.36.0)(typescript@5.8.2) 24 + specifier: ^5.1.5 25 + version: 5.5.4(@types/node@22.13.11)(rollup@4.36.0)(typescript@5.8.2) 26 + expressive-code-twoslash: 27 + specifier: ^0.4.0 28 + version: 0.4.0(@expressive-code/core@0.40.2)(expressive-code@0.40.2)(typescript@5.8.2) 17 29 sharp: 18 - specifier: ^0.32.5 19 - version: 0.32.6 30 + specifier: ^0.33.5 31 + version: 0.33.5 20 32 21 33 packages: 22 34 ··· 71 83 '@babel/types@7.26.10': 72 84 resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} 73 85 engines: {node: '>=6.9.0'} 86 + 87 + '@clack/core@0.4.1': 88 + resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==} 89 + 90 + '@clack/prompts@0.10.0': 91 + resolution: {integrity: sha512-H3rCl6CwW1NdQt9rE3n373t7o5cthPv7yUoxF2ytZvyvlJv89C5RYMJu83Hed8ODgys5vpBU0GKxIRG83jd8NQ==} 74 92 75 93 '@ctrl/tinycolor@4.1.0': 76 94 resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} ··· 559 577 '@types/node@17.0.45': 560 578 resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} 561 579 580 + '@types/node@22.13.11': 581 + resolution: {integrity: sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==} 582 + 562 583 '@types/sax@1.2.7': 563 584 resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} 564 585 ··· 567 588 568 589 '@types/unist@3.0.3': 569 590 resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} 591 + 592 + '@typescript/vfs@1.6.1': 593 + resolution: {integrity: sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA==} 594 + peerDependencies: 595 + typescript: '*' 570 596 571 597 '@ungap/structured-clone@1.3.0': 572 598 resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} ··· 631 657 resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 632 658 engines: {node: '>= 0.4'} 633 659 634 - b4a@1.6.7: 635 - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} 636 - 637 660 bail@2.0.2: 638 661 resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} 639 662 640 - bare-events@2.5.4: 641 - resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} 642 - 643 - bare-fs@4.0.1: 644 - resolution: {integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==} 645 - engines: {bare: '>=1.7.0'} 646 - 647 - bare-os@3.6.0: 648 - resolution: {integrity: sha512-BUrFS5TqSBdA0LwHop4OjPJwisqxGy6JsWVqV6qaFoe965qqtaKfDzHY5T2YA1gUL0ZeeQeA+4BBc1FJTcHiPw==} 649 - engines: {bare: '>=1.14.0'} 650 - 651 - bare-path@3.0.0: 652 - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} 653 - 654 - bare-stream@2.6.5: 655 - resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} 656 - peerDependencies: 657 - bare-buffer: '*' 658 - bare-events: '*' 659 - peerDependenciesMeta: 660 - bare-buffer: 661 - optional: true 662 - bare-events: 663 - optional: true 664 - 665 663 base-64@1.0.0: 666 664 resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} 667 665 668 - base64-js@1.5.1: 669 - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 670 - 671 666 bcp-47-match@2.0.3: 672 667 resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} 673 668 674 669 bcp-47@2.1.0: 675 670 resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} 676 - 677 - bl@4.1.0: 678 - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 679 671 680 672 boolbase@1.0.0: 681 673 resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} ··· 683 675 boxen@8.0.1: 684 676 resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} 685 677 engines: {node: '>=18'} 686 - 687 - buffer@5.7.1: 688 - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 689 678 690 679 camelcase@8.0.0: 691 680 resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} ··· 714 703 resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 715 704 engines: {node: '>= 14.16.0'} 716 705 717 - chownr@1.1.4: 718 - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} 719 - 720 706 ci-info@4.2.0: 721 707 resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} 722 708 engines: {node: '>=8'} ··· 782 768 decode-named-character-reference@1.1.0: 783 769 resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} 784 770 785 - decompress-response@6.0.0: 786 - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 787 - engines: {node: '>=10'} 788 - 789 - deep-extend@0.6.0: 790 - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 791 - engines: {node: '>=4.0.0'} 792 - 793 771 defu@6.1.4: 794 772 resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 795 773 ··· 838 816 emoji-regex@8.0.0: 839 817 resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 840 818 841 - end-of-stream@1.4.4: 842 - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 843 - 844 819 entities@4.5.0: 845 820 resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 846 821 engines: {node: '>=0.12'} ··· 890 865 eventemitter3@5.0.1: 891 866 resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} 892 867 893 - expand-template@2.0.3: 894 - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} 895 - engines: {node: '>=6'} 868 + expressive-code-twoslash@0.4.0: 869 + resolution: {integrity: sha512-7HffO04pYLNHX0P8/8xX+pdgWYpFWdP9/gYi7dAH1nSAxO1W7pQHW4Ly6OXD3fs4SChkGP/PWkE4oLo6CeXTfg==} 870 + peerDependencies: 871 + '@expressive-code/core': ^0.40.0 872 + expressive-code: ^0.40.0 873 + typescript: ^5.7 896 874 897 875 expressive-code@0.40.2: 898 876 resolution: {integrity: sha512-1zIda2rB0qiDZACawzw2rbdBQiWHBT56uBctS+ezFe5XMAaFaHLnnSYND/Kd+dVzO9HfCXRDpzH3d+3fvOWRcw==} ··· 900 878 extend@3.0.2: 901 879 resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 902 880 903 - fast-fifo@1.3.2: 904 - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} 905 - 906 881 fdir@6.4.3: 907 882 resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} 908 883 peerDependencies: ··· 915 890 resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} 916 891 engines: {node: '>=8'} 917 892 918 - fs-constants@1.0.0: 919 - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 920 - 921 893 fsevents@2.3.3: 922 894 resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 923 895 engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} ··· 926 898 get-east-asian-width@1.3.0: 927 899 resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} 928 900 engines: {node: '>=18'} 929 - 930 - github-from-package@0.0.0: 931 - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} 932 901 933 902 github-slugger@2.0.0: 934 903 resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} ··· 1011 980 i18next@23.16.8: 1012 981 resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} 1013 982 1014 - ieee754@1.2.1: 1015 - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1016 - 1017 983 import-meta-resolve@4.1.0: 1018 984 resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} 1019 - 1020 - inherits@2.0.4: 1021 - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1022 - 1023 - ini@1.3.8: 1024 - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 1025 985 1026 986 inline-style-parser@0.2.4: 1027 987 resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} ··· 1263 1223 micromark@4.0.2: 1264 1224 resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} 1265 1225 1266 - mimic-response@3.1.0: 1267 - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 1268 - engines: {node: '>=10'} 1269 - 1270 - minimist@1.2.8: 1271 - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1272 - 1273 - mkdirp-classic@0.5.3: 1274 - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} 1275 - 1276 1226 mrmime@2.0.1: 1277 1227 resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} 1278 1228 engines: {node: '>=10'} ··· 1285 1235 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1286 1236 hasBin: true 1287 1237 1288 - napi-build-utils@2.0.0: 1289 - resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} 1290 - 1291 1238 neotraverse@0.6.18: 1292 1239 resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} 1293 1240 engines: {node: '>= 10'} ··· 1295 1242 nlcst-to-string@4.0.0: 1296 1243 resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} 1297 1244 1298 - node-abi@3.74.0: 1299 - resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} 1300 - engines: {node: '>=10'} 1301 - 1302 - node-addon-api@6.1.0: 1303 - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} 1304 - 1305 1245 node-fetch-native@1.6.6: 1306 1246 resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} 1307 1247 ··· 1317 1257 1318 1258 ofetch@1.4.1: 1319 1259 resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} 1320 - 1321 - once@1.4.0: 1322 - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1323 1260 1324 1261 oniguruma-parser@0.5.4: 1325 1262 resolution: {integrity: sha512-yNxcQ8sKvURiTwP0mV6bLQCYE7NKfKRRWunhbZnXgxSmB1OXa1lHrN3o4DZd+0Si0kU5blidK7BcROO8qv5TZA==} ··· 1383 1320 resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 1384 1321 engines: {node: ^10 || ^12 || >=14} 1385 1322 1386 - prebuild-install@7.1.3: 1387 - resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} 1388 - engines: {node: '>=10'} 1389 - hasBin: true 1390 - 1391 1323 prismjs@1.30.0: 1392 1324 resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} 1393 1325 engines: {node: '>=6'} ··· 1402 1334 property-information@7.0.0: 1403 1335 resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} 1404 1336 1405 - pump@3.0.2: 1406 - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} 1407 - 1408 1337 radix3@1.1.2: 1409 1338 resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} 1410 1339 1411 - rc@1.2.8: 1412 - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 1413 - hasBin: true 1414 - 1415 - readable-stream@3.6.2: 1416 - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 1417 - engines: {node: '>= 6'} 1418 - 1419 1340 readdirp@4.1.2: 1420 1341 resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1421 1342 engines: {node: '>= 14.18.0'} ··· 1510 1431 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1511 1432 hasBin: true 1512 1433 1513 - safe-buffer@5.2.1: 1514 - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1515 - 1516 1434 sax@1.4.1: 1517 1435 resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} 1518 1436 ··· 1521 1439 engines: {node: '>=10'} 1522 1440 hasBin: true 1523 1441 1524 - sharp@0.32.6: 1525 - resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} 1526 - engines: {node: '>=14.15.0'} 1527 - 1528 1442 sharp@0.33.5: 1529 1443 resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} 1530 1444 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} ··· 1535 1449 shiki@3.2.1: 1536 1450 resolution: {integrity: sha512-VML/2o1/KGYkEf/stJJ+s9Ypn7jUKQPomGLGYso4JJFMFxVDyPNsjsI3MB3KLjlMOeH44gyaPdXC6rik2WXvUQ==} 1537 1451 1538 - simple-concat@1.0.1: 1539 - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} 1540 - 1541 - simple-get@4.0.1: 1542 - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} 1543 - 1544 1452 simple-swizzle@0.2.2: 1545 1453 resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 1546 1454 ··· 1570 1478 stream-replace-string@2.0.0: 1571 1479 resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} 1572 1480 1573 - streamx@2.22.0: 1574 - resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} 1575 - 1576 1481 string-width@4.2.3: 1577 1482 resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1578 1483 engines: {node: '>=8'} ··· 1581 1486 resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} 1582 1487 engines: {node: '>=18'} 1583 1488 1584 - string_decoder@1.3.0: 1585 - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1586 - 1587 1489 stringify-entities@4.0.4: 1588 1490 resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} 1589 1491 ··· 1595 1497 resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1596 1498 engines: {node: '>=12'} 1597 1499 1598 - strip-json-comments@2.0.1: 1599 - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 1600 - engines: {node: '>=0.10.0'} 1601 - 1602 1500 style-to-js@1.1.16: 1603 1501 resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} 1604 1502 1605 1503 style-to-object@1.0.8: 1606 1504 resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} 1607 1505 1608 - tar-fs@2.1.2: 1609 - resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} 1610 - 1611 - tar-fs@3.0.8: 1612 - resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} 1613 - 1614 - tar-stream@2.2.0: 1615 - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} 1616 - engines: {node: '>=6'} 1617 - 1618 - tar-stream@3.1.7: 1619 - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} 1620 - 1621 - text-decoder@1.2.3: 1622 - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} 1623 - 1624 1506 tinyexec@0.3.2: 1625 1507 resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1626 1508 ··· 1647 1529 tslib@2.8.1: 1648 1530 resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1649 1531 1650 - tunnel-agent@0.6.0: 1651 - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} 1532 + twoslash-protocol@0.2.12: 1533 + resolution: {integrity: sha512-5qZLXVYfZ9ABdjqbvPc4RWMr7PrpPaaDSeaYY55vl/w1j6H6kzsWK/urAEIXlzYlyrFmyz1UbwIt+AA0ck+wbg==} 1534 + 1535 + twoslash@0.2.12: 1536 + resolution: {integrity: sha512-tEHPASMqi7kqwfJbkk7hc/4EhlrKCSLcur+TcvYki3vhIfaRMXnXjaYFgXpoZRbT6GdprD4tGuVBEmTpUgLBsw==} 1537 + peerDependencies: 1538 + typescript: '*' 1652 1539 1653 1540 type-fest@4.37.0: 1654 1541 resolution: {integrity: sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==} ··· 1667 1554 1668 1555 uncrypto@0.1.3: 1669 1556 resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} 1557 + 1558 + undici-types@6.20.0: 1559 + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1670 1560 1671 1561 unified@11.0.5: 1672 1562 resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} ··· 1835 1725 resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} 1836 1726 engines: {node: '>=18'} 1837 1727 1838 - wrappy@1.0.2: 1839 - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1840 - 1841 1728 xxhash-wasm@1.1.0: 1842 1729 resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} 1843 1730 ··· 1906 1793 transitivePeerDependencies: 1907 1794 - supports-color 1908 1795 1909 - '@astrojs/mdx@4.2.1(astro@5.5.4(rollup@4.36.0)(typescript@5.8.2))': 1796 + '@astrojs/mdx@4.2.1(astro@5.5.4(@types/node@22.13.11)(rollup@4.36.0)(typescript@5.8.2))': 1910 1797 dependencies: 1911 1798 '@astrojs/markdown-remark': 6.3.1 1912 1799 '@mdx-js/mdx': 3.1.0(acorn@8.14.1) 1913 1800 acorn: 8.14.1 1914 - astro: 5.5.4(rollup@4.36.0)(typescript@5.8.2) 1801 + astro: 5.5.4(@types/node@22.13.11)(rollup@4.36.0)(typescript@5.8.2) 1915 1802 es-module-lexer: 1.6.0 1916 1803 estree-util-visit: 2.0.0 1917 1804 hast-util-to-html: 9.0.5 ··· 1935 1822 stream-replace-string: 2.0.0 1936 1823 zod: 3.24.2 1937 1824 1938 - '@astrojs/starlight@0.32.4(astro@5.5.4(rollup@4.36.0)(typescript@5.8.2))': 1825 + '@astrojs/starlight@0.32.4(astro@5.5.4(@types/node@22.13.11)(rollup@4.36.0)(typescript@5.8.2))': 1939 1826 dependencies: 1940 - '@astrojs/mdx': 4.2.1(astro@5.5.4(rollup@4.36.0)(typescript@5.8.2)) 1827 + '@astrojs/mdx': 4.2.1(astro@5.5.4(@types/node@22.13.11)(rollup@4.36.0)(typescript@5.8.2)) 1941 1828 '@astrojs/sitemap': 3.3.0 1942 1829 '@pagefind/default-ui': 1.3.0 1943 1830 '@types/hast': 3.0.4 1944 1831 '@types/js-yaml': 4.0.9 1945 1832 '@types/mdast': 4.0.4 1946 - astro: 5.5.4(rollup@4.36.0)(typescript@5.8.2) 1947 - astro-expressive-code: 0.40.2(astro@5.5.4(rollup@4.36.0)(typescript@5.8.2)) 1833 + astro: 5.5.4(@types/node@22.13.11)(rollup@4.36.0)(typescript@5.8.2) 1834 + astro-expressive-code: 0.40.2(astro@5.5.4(@types/node@22.13.11)(rollup@4.36.0)(typescript@5.8.2)) 1948 1835 bcp-47: 2.1.0 1949 1836 hast-util-from-html: 2.0.3 1950 1837 hast-util-select: 6.0.4 ··· 1994 1881 dependencies: 1995 1882 '@babel/helper-string-parser': 7.25.9 1996 1883 '@babel/helper-validator-identifier': 7.25.9 1884 + 1885 + '@clack/core@0.4.1': 1886 + dependencies: 1887 + picocolors: 1.1.1 1888 + sisteransi: 1.0.5 1889 + 1890 + '@clack/prompts@0.10.0': 1891 + dependencies: 1892 + '@clack/core': 0.4.1 1893 + picocolors: 1.1.1 1894 + sisteransi: 1.0.5 1997 1895 1998 1896 '@ctrl/tinycolor@4.1.0': {} 1999 1897 ··· 2393 2291 2394 2292 '@types/node@17.0.45': {} 2395 2293 2294 + '@types/node@22.13.11': 2295 + dependencies: 2296 + undici-types: 6.20.0 2297 + 2396 2298 '@types/sax@1.2.7': 2397 2299 dependencies: 2398 - '@types/node': 17.0.45 2300 + '@types/node': 22.13.11 2399 2301 2400 2302 '@types/unist@2.0.11': {} 2401 2303 2402 2304 '@types/unist@3.0.3': {} 2403 2305 2306 + '@typescript/vfs@1.6.1(typescript@5.8.2)': 2307 + dependencies: 2308 + debug: 4.4.0 2309 + typescript: 5.8.2 2310 + transitivePeerDependencies: 2311 + - supports-color 2312 + 2404 2313 '@ungap/structured-clone@1.3.0': {} 2405 2314 2406 2315 acorn-jsx@5.3.2(acorn@8.14.1): ··· 2434 2343 2435 2344 astring@1.9.0: {} 2436 2345 2437 - astro-expressive-code@0.40.2(astro@5.5.4(rollup@4.36.0)(typescript@5.8.2)): 2346 + astro-expressive-code@0.40.2(astro@5.5.4(@types/node@22.13.11)(rollup@4.36.0)(typescript@5.8.2)): 2438 2347 dependencies: 2439 - astro: 5.5.4(rollup@4.36.0)(typescript@5.8.2) 2348 + astro: 5.5.4(@types/node@22.13.11)(rollup@4.36.0)(typescript@5.8.2) 2440 2349 rehype-expressive-code: 0.40.2 2441 2350 2442 - astro@5.5.4(rollup@4.36.0)(typescript@5.8.2): 2351 + astro@5.5.4(@types/node@22.13.11)(rollup@4.36.0)(typescript@5.8.2): 2443 2352 dependencies: 2444 2353 '@astrojs/compiler': 2.11.0 2445 2354 '@astrojs/internal-helpers': 0.6.1 ··· 2490 2399 unist-util-visit: 5.0.0 2491 2400 unstorage: 1.15.0 2492 2401 vfile: 6.0.3 2493 - vite: 6.2.2 2494 - vitefu: 1.0.6(vite@6.2.2) 2402 + vite: 6.2.2(@types/node@22.13.11) 2403 + vitefu: 1.0.6(vite@6.2.2(@types/node@22.13.11)) 2495 2404 xxhash-wasm: 1.1.0 2496 2405 yargs-parser: 21.1.1 2497 2406 yocto-spinner: 0.2.1 ··· 2536 2445 2537 2446 axobject-query@4.1.0: {} 2538 2447 2539 - b4a@1.6.7: {} 2540 - 2541 2448 bail@2.0.2: {} 2542 2449 2543 - bare-events@2.5.4: 2544 - optional: true 2545 - 2546 - bare-fs@4.0.1: 2547 - dependencies: 2548 - bare-events: 2.5.4 2549 - bare-path: 3.0.0 2550 - bare-stream: 2.6.5(bare-events@2.5.4) 2551 - transitivePeerDependencies: 2552 - - bare-buffer 2553 - optional: true 2554 - 2555 - bare-os@3.6.0: 2556 - optional: true 2557 - 2558 - bare-path@3.0.0: 2559 - dependencies: 2560 - bare-os: 3.6.0 2561 - optional: true 2562 - 2563 - bare-stream@2.6.5(bare-events@2.5.4): 2564 - dependencies: 2565 - streamx: 2.22.0 2566 - optionalDependencies: 2567 - bare-events: 2.5.4 2568 - optional: true 2569 - 2570 2450 base-64@1.0.0: {} 2571 2451 2572 - base64-js@1.5.1: {} 2573 - 2574 2452 bcp-47-match@2.0.3: {} 2575 2453 2576 2454 bcp-47@2.1.0: ··· 2578 2456 is-alphabetical: 2.0.1 2579 2457 is-alphanumerical: 2.0.1 2580 2458 is-decimal: 2.0.1 2581 - 2582 - bl@4.1.0: 2583 - dependencies: 2584 - buffer: 5.7.1 2585 - inherits: 2.0.4 2586 - readable-stream: 3.6.2 2587 2459 2588 2460 boolbase@1.0.0: {} 2589 2461 ··· 2598 2470 widest-line: 5.0.0 2599 2471 wrap-ansi: 9.0.0 2600 2472 2601 - buffer@5.7.1: 2602 - dependencies: 2603 - base64-js: 1.5.1 2604 - ieee754: 1.2.1 2605 - 2606 2473 camelcase@8.0.0: {} 2607 2474 2608 2475 ccount@2.0.1: {} ··· 2620 2487 chokidar@4.0.3: 2621 2488 dependencies: 2622 2489 readdirp: 4.1.2 2623 - 2624 - chownr@1.1.4: {} 2625 2490 2626 2491 ci-info@4.2.0: {} 2627 2492 ··· 2671 2536 dependencies: 2672 2537 character-entities: 2.0.2 2673 2538 2674 - decompress-response@6.0.0: 2675 - dependencies: 2676 - mimic-response: 3.1.0 2677 - 2678 - deep-extend@0.6.0: {} 2679 - 2680 2539 defu@6.1.4: {} 2681 2540 2682 2541 dequal@2.0.3: {} ··· 2708 2567 emoji-regex@10.4.0: {} 2709 2568 2710 2569 emoji-regex@8.0.0: {} 2711 - 2712 - end-of-stream@1.4.4: 2713 - dependencies: 2714 - once: 1.4.0 2715 2570 2716 2571 entities@4.5.0: {} 2717 2572 ··· 2798 2653 2799 2654 eventemitter3@5.0.1: {} 2800 2655 2801 - expand-template@2.0.3: {} 2656 + expressive-code-twoslash@0.4.0(@expressive-code/core@0.40.2)(expressive-code@0.40.2)(typescript@5.8.2): 2657 + dependencies: 2658 + '@expressive-code/core': 0.40.2 2659 + expressive-code: 0.40.2 2660 + mdast-util-from-markdown: 2.0.2 2661 + mdast-util-gfm: 3.1.0 2662 + mdast-util-to-hast: 13.2.0 2663 + twoslash: 0.2.12(typescript@5.8.2) 2664 + typescript: 5.8.2 2665 + transitivePeerDependencies: 2666 + - supports-color 2802 2667 2803 2668 expressive-code@0.40.2: 2804 2669 dependencies: ··· 2808 2673 '@expressive-code/plugin-text-markers': 0.40.2 2809 2674 2810 2675 extend@3.0.2: {} 2811 - 2812 - fast-fifo@1.3.2: {} 2813 2676 2814 2677 fdir@6.4.3(picomatch@4.0.2): 2815 2678 optionalDependencies: ··· 2817 2680 2818 2681 flattie@1.1.1: {} 2819 2682 2820 - fs-constants@1.0.0: {} 2821 - 2822 2683 fsevents@2.3.3: 2823 2684 optional: true 2824 2685 2825 2686 get-east-asian-width@1.3.0: {} 2826 - 2827 - github-from-package@0.0.0: {} 2828 2687 2829 2688 github-slugger@2.0.0: {} 2830 2689 ··· 3041 2900 dependencies: 3042 2901 '@babel/runtime': 7.26.10 3043 2902 3044 - ieee754@1.2.1: {} 3045 - 3046 2903 import-meta-resolve@4.1.0: {} 3047 - 3048 - inherits@2.0.4: {} 3049 - 3050 - ini@1.3.8: {} 3051 2904 3052 2905 inline-style-parser@0.2.4: {} 3053 2906 ··· 3567 3420 transitivePeerDependencies: 3568 3421 - supports-color 3569 3422 3570 - mimic-response@3.1.0: {} 3571 - 3572 - minimist@1.2.8: {} 3573 - 3574 - mkdirp-classic@0.5.3: {} 3575 - 3576 3423 mrmime@2.0.1: {} 3577 3424 3578 3425 ms@2.1.3: {} 3579 3426 3580 3427 nanoid@3.3.11: {} 3581 3428 3582 - napi-build-utils@2.0.0: {} 3583 - 3584 3429 neotraverse@0.6.18: {} 3585 3430 3586 3431 nlcst-to-string@4.0.0: 3587 3432 dependencies: 3588 3433 '@types/nlcst': 2.0.3 3589 3434 3590 - node-abi@3.74.0: 3591 - dependencies: 3592 - semver: 7.7.1 3593 - 3594 - node-addon-api@6.1.0: {} 3595 - 3596 3435 node-fetch-native@1.6.6: {} 3597 3436 3598 3437 node-mock-http@1.0.0: {} ··· 3608 3447 destr: 2.0.3 3609 3448 node-fetch-native: 1.6.6 3610 3449 ufo: 1.5.4 3611 - 3612 - once@1.4.0: 3613 - dependencies: 3614 - wrappy: 1.0.2 3615 3450 3616 3451 oniguruma-parser@0.5.4: {} 3617 3452 ··· 3694 3529 picocolors: 1.1.1 3695 3530 source-map-js: 1.2.1 3696 3531 3697 - prebuild-install@7.1.3: 3698 - dependencies: 3699 - detect-libc: 2.0.3 3700 - expand-template: 2.0.3 3701 - github-from-package: 0.0.0 3702 - minimist: 1.2.8 3703 - mkdirp-classic: 0.5.3 3704 - napi-build-utils: 2.0.0 3705 - node-abi: 3.74.0 3706 - pump: 3.0.2 3707 - rc: 1.2.8 3708 - simple-get: 4.0.1 3709 - tar-fs: 2.1.2 3710 - tunnel-agent: 0.6.0 3711 - 3712 3532 prismjs@1.30.0: {} 3713 3533 3714 3534 prompts@2.4.2: ··· 3719 3539 property-information@6.5.0: {} 3720 3540 3721 3541 property-information@7.0.0: {} 3722 - 3723 - pump@3.0.2: 3724 - dependencies: 3725 - end-of-stream: 1.4.4 3726 - once: 1.4.0 3727 3542 3728 3543 radix3@1.1.2: {} 3729 - 3730 - rc@1.2.8: 3731 - dependencies: 3732 - deep-extend: 0.6.0 3733 - ini: 1.3.8 3734 - minimist: 1.2.8 3735 - strip-json-comments: 2.0.1 3736 - 3737 - readable-stream@3.6.2: 3738 - dependencies: 3739 - inherits: 2.0.4 3740 - string_decoder: 1.3.0 3741 - util-deprecate: 1.0.2 3742 3544 3743 3545 readdirp@4.1.2: {} 3744 3546 ··· 3942 3744 '@rollup/rollup-win32-x64-msvc': 4.36.0 3943 3745 fsevents: 2.3.3 3944 3746 3945 - safe-buffer@5.2.1: {} 3946 - 3947 3747 sax@1.4.1: {} 3948 3748 3949 3749 semver@7.7.1: {} 3950 3750 3951 - sharp@0.32.6: 3952 - dependencies: 3953 - color: 4.2.3 3954 - detect-libc: 2.0.3 3955 - node-addon-api: 6.1.0 3956 - prebuild-install: 7.1.3 3957 - semver: 7.7.1 3958 - simple-get: 4.0.1 3959 - tar-fs: 3.0.8 3960 - tunnel-agent: 0.6.0 3961 - transitivePeerDependencies: 3962 - - bare-buffer 3963 - 3964 3751 sharp@0.33.5: 3965 3752 dependencies: 3966 3753 color: 4.2.3 ··· 3986 3773 '@img/sharp-wasm32': 0.33.5 3987 3774 '@img/sharp-win32-ia32': 0.33.5 3988 3775 '@img/sharp-win32-x64': 0.33.5 3989 - optional: true 3990 3776 3991 3777 shiki@1.29.2: 3992 3778 dependencies: ··· 4010 3796 '@shikijs/vscode-textmate': 10.0.2 4011 3797 '@types/hast': 3.0.4 4012 3798 4013 - simple-concat@1.0.1: {} 4014 - 4015 - simple-get@4.0.1: 4016 - dependencies: 4017 - decompress-response: 6.0.0 4018 - once: 1.4.0 4019 - simple-concat: 1.0.1 4020 - 4021 3799 simple-swizzle@0.2.2: 4022 3800 dependencies: 4023 3801 is-arrayish: 0.3.2 ··· 4041 3819 4042 3820 stream-replace-string@2.0.0: {} 4043 3821 4044 - streamx@2.22.0: 4045 - dependencies: 4046 - fast-fifo: 1.3.2 4047 - text-decoder: 1.2.3 4048 - optionalDependencies: 4049 - bare-events: 2.5.4 4050 - 4051 3822 string-width@4.2.3: 4052 3823 dependencies: 4053 3824 emoji-regex: 8.0.0 ··· 4060 3831 get-east-asian-width: 1.3.0 4061 3832 strip-ansi: 7.1.0 4062 3833 4063 - string_decoder@1.3.0: 4064 - dependencies: 4065 - safe-buffer: 5.2.1 4066 - 4067 3834 stringify-entities@4.0.4: 4068 3835 dependencies: 4069 3836 character-entities-html4: 2.1.0 ··· 4077 3844 dependencies: 4078 3845 ansi-regex: 6.1.0 4079 3846 4080 - strip-json-comments@2.0.1: {} 4081 - 4082 3847 style-to-js@1.1.16: 4083 3848 dependencies: 4084 3849 style-to-object: 1.0.8 ··· 4087 3852 dependencies: 4088 3853 inline-style-parser: 0.2.4 4089 3854 4090 - tar-fs@2.1.2: 4091 - dependencies: 4092 - chownr: 1.1.4 4093 - mkdirp-classic: 0.5.3 4094 - pump: 3.0.2 4095 - tar-stream: 2.2.0 4096 - 4097 - tar-fs@3.0.8: 4098 - dependencies: 4099 - pump: 3.0.2 4100 - tar-stream: 3.1.7 4101 - optionalDependencies: 4102 - bare-fs: 4.0.1 4103 - bare-path: 3.0.0 4104 - transitivePeerDependencies: 4105 - - bare-buffer 4106 - 4107 - tar-stream@2.2.0: 4108 - dependencies: 4109 - bl: 4.1.0 4110 - end-of-stream: 1.4.4 4111 - fs-constants: 1.0.0 4112 - inherits: 2.0.4 4113 - readable-stream: 3.6.2 4114 - 4115 - tar-stream@3.1.7: 4116 - dependencies: 4117 - b4a: 1.6.7 4118 - fast-fifo: 1.3.2 4119 - streamx: 2.22.0 4120 - 4121 - text-decoder@1.2.3: 4122 - dependencies: 4123 - b4a: 1.6.7 4124 - 4125 3855 tinyexec@0.3.2: {} 4126 3856 4127 3857 tinyglobby@0.2.12: ··· 4140 3870 tslib@2.8.1: 4141 3871 optional: true 4142 3872 4143 - tunnel-agent@0.6.0: 3873 + twoslash-protocol@0.2.12: {} 3874 + 3875 + twoslash@0.2.12(typescript@5.8.2): 4144 3876 dependencies: 4145 - safe-buffer: 5.2.1 3877 + '@typescript/vfs': 1.6.1(typescript@5.8.2) 3878 + twoslash-protocol: 0.2.12 3879 + typescript: 5.8.2 3880 + transitivePeerDependencies: 3881 + - supports-color 4146 3882 4147 3883 type-fest@4.37.0: {} 4148 3884 ··· 4153 3889 ultrahtml@1.5.3: {} 4154 3890 4155 3891 uncrypto@0.1.3: {} 3892 + 3893 + undici-types@6.20.0: {} 4156 3894 4157 3895 unified@11.0.5: 4158 3896 dependencies: ··· 4238 3976 '@types/unist': 3.0.3 4239 3977 vfile-message: 4.0.2 4240 3978 4241 - vite@6.2.2: 3979 + vite@6.2.2(@types/node@22.13.11): 4242 3980 dependencies: 4243 3981 esbuild: 0.25.1 4244 3982 postcss: 8.5.3 4245 3983 rollup: 4.36.0 4246 3984 optionalDependencies: 3985 + '@types/node': 22.13.11 4247 3986 fsevents: 2.3.3 4248 3987 4249 - vitefu@1.0.6(vite@6.2.2): 3988 + vitefu@1.0.6(vite@6.2.2(@types/node@22.13.11)): 4250 3989 optionalDependencies: 4251 - vite: 6.2.2 3990 + vite: 6.2.2(@types/node@22.13.11) 4252 3991 4253 3992 web-namespaces@2.0.1: {} 4254 3993 ··· 4263 4002 ansi-styles: 6.2.1 4264 4003 string-width: 7.2.0 4265 4004 strip-ansi: 7.1.0 4266 - 4267 - wrappy@1.0.2: {} 4268 4005 4269 4006 xxhash-wasm@1.1.0: {} 4270 4007
+5
public/_redirects
··· 1 + /on/github https://github.com/bombshell-dev 2 + /on/bluesky https://bsky.app/profile/bomb.sh 3 + 4 + /chat https://discord.gg/2uEVGZSkjX 5 + /sponsor https://polar.sh/bombshell-dev
+9 -1
public/favicon.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M81 36 64 0 47 36l-1 2-9-10a6 6 0 0 0-9 9l10 10h-2L0 64l36 17h2L28 91a6 6 0 1 0 9 9l9-10 1 2 17 36 17-36v-2l9 10a6 6 0 1 0 9-9l-9-9 2-1 36-17-36-17-2-1 9-9a6 6 0 1 0-9-9l-9 10v-2Zm-17 2-2 5c-4 8-11 15-19 19l-5 2 5 2c8 4 15 11 19 19l2 5 2-5c4-8 11-15 19-19l5-2-5-2c-8-4-15-11-19-19l-2-5Z" clip-rule="evenodd"/><path d="M118 19a6 6 0 0 0-9-9l-3 3a6 6 0 1 0 9 9l3-3Zm-96 4c-2 2-6 2-9 0l-3-3a6 6 0 1 1 9-9l3 3c3 2 3 6 0 9Zm0 82c-2-2-6-2-9 0l-3 3a6 6 0 1 0 9 9l3-3c3-2 3-6 0-9Zm96 4a6 6 0 0 1-9 9l-3-3a6 6 0 1 1 9-9l3 3Z"/><style>path{fill:#000}@media (prefers-color-scheme:dark){path{fill:#fff}}</style></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 256 256"> 2 + <path d="M0 127.84c0 42.37 34.47 76.84 76.84 76.84 42.37 0 76.84-34.47 76.84-76.84 0-42.37-34.47-76.84-76.84-76.84C34.47 51 0 85.47 0 127.84Zm226-35h-22.77l3.26 28.62-26.2-12-7.05 21.65 28.32 5.7-19.44 21.33 18.3 13.21 14.2-24.9 14.2 24.9 18.3-13.21-19.44-21.34 28.32-5.7-7.06-21.63-26.2 12 3.27-28.63Z" /> 3 + <style> 4 + path { fill: #000; } 5 + @media (prefers-color-scheme: dark) { 6 + path { fill: #FFF; } 7 + } 8 + </style> 9 + </svg>
src/assets/clack-dark.gif

This is a binary file and will not be displayed.

src/assets/clack-light.gif

This is a binary file and will not be displayed.

src/assets/clack-logo.png

This is a binary file and will not be displayed.

+15
src/assets/dark.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 256 256"> 2 + <style> 3 + #asterisk { 4 + transform-origin: 201px 131px; 5 + animation: 2s spin infinite linear; 6 + } 7 + 8 + @keyframes spin { 9 + from { transform: rotate(0deg) } 10 + to { transform: rotate(360deg) } 11 + } 12 + </style> 13 + <path id="circle" d="M20.4727 127.768C20.4727 163.48 49.5287 192.536 85.2407 192.536C120.953 192.536 150.009 163.48 150.009 127.768C150.009 92.056 120.953 63 85.2407 63C49.5287 63 20.4727 92.056 20.4727 127.768Z" fill="white" /> 14 + <path id="asterisk" d="M191.77 98.264H210.97L208.218 122.392L230.298 112.28L236.25 130.52L212.378 135.32L228.762 153.304L213.338 164.44L201.37 143.448L189.402 164.44L173.978 153.304L190.362 135.32L166.49 130.52L172.442 112.28L194.522 122.392L191.77 98.264Z" fill="white" /> 15 + </svg>
src/assets/houston.webp

This is a binary file and will not be displayed.

+15
src/assets/light.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 256 256"> 2 + <style> 3 + #asterisk { 4 + transform-origin: 201px 131px; 5 + animation: 2s spin infinite linear; 6 + } 7 + 8 + @keyframes spin { 9 + from { transform: rotate(0deg) } 10 + to { transform: rotate(360deg) } 11 + } 12 + </style> 13 + <path id="circle" d="M20.4727 127.768C20.4727 163.48 49.5287 192.536 85.2407 192.536C120.953 192.536 150.009 163.48 150.009 127.768C150.009 92.056 120.953 63 85.2407 63C49.5287 63 20.4727 92.056 20.4727 127.768Z" fill="black" /> 14 + <path id="asterisk" d="M191.77 98.264H210.97L208.218 122.392L230.298 112.28L236.25 130.52L212.378 135.32L228.762 153.304L213.338 164.44L201.37 143.448L189.402 164.44L173.978 153.304L190.362 135.32L166.49 130.52L172.442 112.28L194.522 122.392L191.77 98.264Z" fill="black" /> 15 + </svg>
+143
src/content/docs/basics/getting-started.mdx
··· 1 + --- 2 + title: Getting Started 3 + description: Learn how to get started with Clack 4 + --- 5 + 6 + import { Tabs, TabItem } from '@astrojs/starlight/components'; 7 + 8 + Clack is a modern, flexible and powerful CLI library that helps you build beautiful command-line interfaces with ease. It provides a set of high-level components and low-level primitives that make it simple to create interactive command-line applications. 9 + 10 + ## Features 11 + 12 + - 🎨 Beautiful, modern UI components 13 + - 🎯 Type-safe with full TypeScript support 14 + - 🎭 Customizable styling and theming 15 + - 🎮 Interactive prompts and menus 16 + - 🎪 Progressive disclosure 17 + - 🎭 Form validation 18 + - 🎯 Error handling 19 + - 🎨 Consistent styling 20 + 21 + ## Installation 22 + 23 + You can install Clack using npm, yarn, or pnpm: 24 + 25 + <Tabs> 26 + <TabItem label="npm" icon="seti:npm"> 27 + ```bash 28 + npm install @clack/prompts 29 + ``` 30 + </TabItem> 31 + <TabItem label="pnpm" icon="pnpm"> 32 + ```bash 33 + pnpm add @clack/prompts 34 + ``` 35 + </TabItem> 36 + <TabItem label="Yarn" icon="seti:yarn"> 37 + ```bash 38 + yarn add @clack/prompts 39 + ``` 40 + </TabItem> 41 + </Tabs> 42 + 43 + ## Quick Start 44 + 45 + Here's a simple example to get you started: 46 + 47 + ```ts twoslash 48 + import { text, select, confirm, isCancel } from '@clack/prompts'; 49 + 50 + async function main() { 51 + // Get user's name 52 + const name = await text({ 53 + message: 'What is your name?', 54 + placeholder: 'John Doe', 55 + }) as string; 56 + 57 + // Get user's preferred framework 58 + const framework = await select({ 59 + message: 'Choose a framework:', 60 + options: [ 61 + { value: 'react', label: 'React' }, 62 + { value: 'vue', label: 'Vue' }, 63 + { value: 'svelte', label: 'Svelte' }, 64 + ], 65 + }); 66 + 67 + if (isCancel(framework)) { 68 + console.log('Operation cancelled'); 69 + process.exit(0); 70 + } 71 + 72 + // Confirm the selection 73 + const shouldProceed = await confirm({ 74 + message: `Create a ${framework} project for ${name}?`, 75 + }); 76 + 77 + if (shouldProceed) { 78 + console.log('Creating project...'); 79 + } 80 + } 81 + ``` 82 + 83 + ## Core Concepts 84 + 85 + ### High-Level Components 86 + 87 + Clack provides several high-level components that make it easy to build interactive CLIs: 88 + 89 + - `text()` - For text input with validation 90 + - `select()` - For selection menus 91 + - `confirm()` - For yes/no confirmations 92 + - `multiselect()` - For multiple selections 93 + - `note()` - For displaying information 94 + - `spinner()` - For loading states 95 + 96 + ### Low-Level Primitives 97 + 98 + For more control, you can use the low-level primitives: 99 + 100 + ```ts twoslash 101 + import { TextPrompt, isCancel } from '@clack/core'; 102 + 103 + const p = new TextPrompt({ 104 + render() { 105 + return `What's your name?\n${this.valueWithCursor}`; 106 + }, 107 + }); 108 + 109 + const name = await p.prompt(); 110 + if (isCancel(name)) { 111 + process.exit(0); 112 + } 113 + ``` 114 + 115 + ## Next Steps 116 + 117 + 1. Check out our [Examples](/guides/examples) for more practical use cases 118 + 2. Learn about [Best Practices](/guides/best-practices) for building CLIs 119 + 3. Explore the [API Reference](/api) for detailed documentation 120 + 4. Join our [Discord community](https://bomb.sh/chat) for support and discussions 121 + 122 + ## TypeScript Support 123 + 124 + Clack is built with TypeScript and provides full type safety. All components and primitives are properly typed, making it easy to catch errors at compile time. 125 + 126 + ```ts twoslash 127 + import { text } from '@clack/prompts'; 128 + 129 + // TypeScript will ensure the validation function returns the correct type 130 + const age = await text({ 131 + message: 'Enter your age:', 132 + validate: (value: string) => { 133 + const num = parseInt(value); 134 + if (isNaN(num)) return 'Please enter a valid number'; 135 + if (num < 0 || num > 120) return 'Age must be between 0 and 120'; 136 + return undefined; 137 + }, 138 + }); 139 + ``` 140 + 141 + ## Contributing 142 + 143 + We welcome contributions! Please check out our [Contributing Guide](/contributing) for details on our code of conduct and the process for submitting pull requests.
+53
src/content/docs/clack/core.mdx
··· 1 + --- 2 + title: Core 3 + description: Learn about the core functionality of Clack 4 + --- 5 + 6 + The `@clack/core` package provides the fundamental building blocks for creating interactive command-line interfaces. It's designed to be flexible, extensible, and easy to use. 7 + 8 + ## Key Features 9 + 10 + - **Low-level primitives**: Base components for building custom prompts 11 + - **Type-safe**: Built with TypeScript for better developer experience 12 + - **Flexible rendering**: Customizable rendering system for prompts 13 + - **Cancel handling**: Built-in support for handling user cancellation 14 + 15 + ## Package Structure 16 + 17 + The core package is organized into two main directories: 18 + 19 + - `prompts/`: Contains the base prompt implementations 20 + - `utils/`: Contains utility functions and helpers 21 + 22 + ## Core Components 23 + 24 + ### Base Prompt Class 25 + 26 + The `Prompt` class serves as the foundation for all prompt types. It provides: 27 + 28 + - Custom rendering capabilities 29 + - Input handling 30 + - State management 31 + - Event system 32 + 33 + ### Available Prompts 34 + 35 + 1. **TextPrompt**: For text input 36 + 2. **SelectPrompt**: For selection from options 37 + 3. **ConfirmPrompt**: For yes/no confirmations 38 + 39 + ## Getting Started 40 + 41 + To start using the core package, first install it: 42 + 43 + ```bash 44 + npm install @clack/core 45 + ``` 46 + 47 + Then import the components you need: 48 + 49 + ```ts 50 + import { TextPrompt, SelectPrompt, ConfirmPrompt } from '@clack/core'; 51 + ``` 52 + 53 + For detailed examples and usage patterns, check out our [examples guide](/docs/guides/examples).
+67
src/content/docs/clack/prompts.mdx
··· 1 + --- 2 + title: Prompts 3 + description: Learn about the prompts package and its capabilities 4 + --- 5 + 6 + The `@clack/prompts` package provides a collection of pre-built, high-level prompts that make it easy to create interactive command-line interfaces. It builds on top of the core package to provide a more developer-friendly experience. 7 + 8 + ## Key Features 9 + 10 + - **Pre-built prompts**: Ready-to-use prompt components 11 + - **Consistent styling**: Unified look and feel across all prompts 12 + - **Type-safe**: Full TypeScript support 13 + - **Customizable**: Easy to extend and modify 14 + 15 + ## Available Prompts 16 + 17 + ### Text Input 18 + ```ts twoslash 19 + // @errors: 2339 20 + import { text } from '@clack/prompts'; 21 + 22 + const name = await text({ 23 + message: 'What is your name?', 24 + placeholder: 'John Doe', 25 + validate: (value) => { 26 + if (value.length < 2) return 'Name must be at least 2 characters'; 27 + return undefined; 28 + }, 29 + }); 30 + ``` 31 + 32 + ### Selection 33 + 34 + ```ts twoslash 35 + import { select } from '@clack/prompts'; 36 + 37 + const framework = await select({ 38 + message: 'Pick a framework', 39 + options: [ 40 + { value: 'next', label: 'Next.js' }, 41 + { value: 'astro', label: 'Astro' }, 42 + { value: 'svelte', label: 'SvelteKit' }, 43 + ], 44 + }); 45 + ``` 46 + 47 + ### Confirmation 48 + 49 + ```ts twoslash 50 + import { confirm } from '@clack/prompts'; 51 + 52 + const shouldProceed = await confirm({ 53 + message: 'Do you want to continue?', 54 + }); 55 + ``` 56 + 57 + ## Installation 58 + 59 + ```bash 60 + npm install @clack/prompts 61 + ``` 62 + 63 + ## Usage 64 + 65 + The prompts package is designed to be intuitive and easy to use. Each prompt function returns a Promise that resolves to the user's input. 66 + 67 + For more detailed examples and advanced usage patterns, check out our [examples guide](/docs/guides/examples) and [best practices](/docs/guides/best-practices).
+288
src/content/docs/guides/best-practices.mdx
··· 1 + --- 2 + title: Best Practices 3 + description: Learn the best practices for using Clack effectively 4 + --- 5 + 6 + This guide covers recommended practices and patterns for using Clack effectively in your applications. 7 + 8 + ## General Guidelines 9 + 10 + ### 1. Error Handling 11 + 12 + Always handle potential errors and cancellations: 13 + 14 + ```ts twoslash 15 + import { text, isCancel } from '@clack/prompts'; 16 + 17 + try { 18 + const name = await text({ 19 + message: 'What is your name?', 20 + }); 21 + 22 + if (isCancel(name)) { 23 + console.log('Operation cancelled'); 24 + process.exit(0); 25 + } 26 + 27 + // Use the name value 28 + } catch (error) { 29 + console.error('An error occurred:', error); 30 + process.exit(1); 31 + } 32 + ``` 33 + 34 + ### 2. Input Validation 35 + 36 + Implement proper validation for user inputs: 37 + 38 + ```ts twoslash 39 + import { text } from '@clack/prompts'; 40 + 41 + // Define validation function outside for reusability 42 + function validateAge(value: string): string | undefined { 43 + const num = parseInt(value); 44 + if (isNaN(num)) return 'Please enter a valid number'; 45 + if (num < 0 || num > 120) return 'Age must be between 0 and 120'; 46 + return undefined; 47 + } 48 + 49 + const age = await text({ 50 + message: 'Enter your age:', 51 + validate: validateAge, 52 + }); 53 + ``` 54 + 55 + ### 3. Consistent Messaging 56 + 57 + Use clear and consistent messaging across your prompts: 58 + 59 + ```ts twoslash 60 + // @errors: 2322 61 + import { select, isCancel } from '@clack/prompts'; 62 + 63 + // Good 64 + const userAction = await select({ 65 + message: 'What would you like to do?', 66 + options: [ 67 + { value: 'create', label: 'Create new project' }, 68 + { value: 'update', label: 'Update existing project' }, 69 + ], 70 + }); 71 + 72 + if (isCancel(userAction)) { 73 + console.log('Operation cancelled'); 74 + process.exit(0); 75 + } 76 + 77 + // Avoid 78 + const quickAction = await select({ 79 + message: 'Action:', // Too vague 80 + options: [ 81 + { value: 'c', label: 'Create' }, // Inconsistent formatting 82 + { value: 'u', label: 'Update' }, 83 + ], 84 + }); 85 + ``` 86 + 87 + ### 4. Progressive Disclosure 88 + 89 + Break complex interactions into smaller, manageable steps: 90 + 91 + ```ts twoslash 92 + import { select, isCancel } from '@clack/prompts'; 93 + 94 + // First, get the project type 95 + const projectType = await select({ 96 + message: 'Select project type:', 97 + options: [ 98 + { value: 'web', label: 'Web Application' }, 99 + { value: 'cli', label: 'CLI Tool' }, 100 + ], 101 + }); 102 + 103 + if (isCancel(projectType)) { 104 + console.log('Operation cancelled'); 105 + process.exit(0); 106 + } 107 + 108 + // Then, get specific details based on the type 109 + if (projectType === 'web') { 110 + const framework = await select({ 111 + message: 'Choose a framework:', 112 + options: [ 113 + { value: 'react', label: 'React' }, 114 + { value: 'vue', label: 'Vue' }, 115 + ], 116 + }); 117 + } 118 + ``` 119 + 120 + ### 5. Default Values 121 + 122 + Provide sensible defaults when appropriate: 123 + 124 + ```ts twoslash 125 + import { text } from '@clack/prompts'; 126 + 127 + const configPath = await text({ 128 + message: 'Configuration file path:', 129 + defaultValue: './config.json', 130 + placeholder: 'Enter path to config file', 131 + }); 132 + ``` 133 + 134 + ### 6. Type Safety 135 + 136 + Leverage TypeScript for better type safety: 137 + 138 + ```ts twoslash 139 + // @errors: 2322 2339 140 + import { text, select, isCancel } from '@clack/prompts'; 141 + 142 + // Define validation functions outside 143 + function validateProjectName(value: string): string | undefined { 144 + if (value.length === 0) return 'Name is required'; 145 + if (!/^[a-z0-9-]+$/.test(value)) return 'Name can only contain lowercase letters, numbers, and hyphens'; 146 + return undefined; 147 + } 148 + 149 + // Define types for better type safety 150 + interface ProjectConfig { 151 + name: string | symbol; 152 + type: 'web' | 'cli'; 153 + framework?: string; 154 + } 155 + 156 + // Collect project configuration with type safety 157 + async function collectProjectConfig(): Promise<ProjectConfig> { 158 + const name = await text({ 159 + message: 'Project name:', 160 + validate: validateProjectName, 161 + }); 162 + 163 + const type = await select({ 164 + message: 'Project type:', 165 + options: [ 166 + { value: 'web', label: 'Web Application' }, 167 + { value: 'cli', label: 'CLI Tool' }, 168 + ], 169 + }); 170 + 171 + if (isCancel(type)) { 172 + console.log('Operation cancelled'); 173 + process.exit(0); 174 + } 175 + 176 + return { 177 + name, 178 + type, 179 + }; 180 + } 181 + ``` 182 + 183 + ## Performance Considerations 184 + 185 + ### 1. Batch Operations 186 + 187 + When dealing with multiple prompts, consider using `Promise.all` for parallel execution: 188 + 189 + ```ts twoslash 190 + import { text } from '@clack/prompts'; 191 + 192 + const [userName, userEmail, userAge] = await Promise.all([ 193 + text({ message: 'Name:' }), 194 + text({ message: 'Email:' }), 195 + text({ message: 'Age:' }), 196 + ]); 197 + ``` 198 + 199 + ### 2. Lazy Loading 200 + 201 + Load prompts only when needed: 202 + 203 + ```ts twoslash 204 + import { select, isCancel } from '@clack/prompts'; 205 + 206 + // Mock function for demonstration 207 + async function loadWebPrompts() { 208 + // This simulates loading web-specific prompts 209 + return { 210 + setupWebProject: async () => { 211 + // Implementation would go here 212 + return true; 213 + } 214 + }; 215 + } 216 + 217 + async function setupProject() { 218 + const projectType = await select({ 219 + message: 'Project type:', 220 + options: [ 221 + { value: 'web', label: 'Web Application' }, 222 + { value: 'cli', label: 'CLI Tool' }, 223 + ], 224 + }); 225 + 226 + if (isCancel(projectType)) { 227 + console.log('Operation cancelled'); 228 + process.exit(0); 229 + } 230 + 231 + // Only load web-specific prompts if needed 232 + if (projectType === 'web') { 233 + const { setupWebProject } = await loadWebPrompts(); 234 + await setupWebProject(); 235 + } 236 + } 237 + ``` 238 + 239 + ## Accessibility 240 + 241 + ### 1. Clear Labels 242 + 243 + Use descriptive labels for options: 244 + 245 + ```ts twoslash 246 + import { select, isCancel } from '@clack/prompts'; 247 + 248 + // Good 249 + const operationMode = await select({ 250 + message: 'Select operation mode:', 251 + options: [ 252 + { value: 'dev', label: 'Development Mode' }, 253 + { value: 'prod', label: 'Production Mode' }, 254 + ], 255 + }); 256 + 257 + if (isCancel(operationMode)) { 258 + console.log('Operation cancelled'); 259 + process.exit(0); 260 + } 261 + 262 + // Avoid 263 + const mode = await select({ 264 + message: 'Mode:', 265 + options: [ 266 + { value: 'd', label: 'Dev' }, 267 + { value: 'p', label: 'Prod' }, 268 + ], 269 + }); 270 + ``` 271 + 272 + ### 2. Helpful Error Messages 273 + 274 + Provide clear error messages that guide users to correct input: 275 + 276 + ```ts twoslash 277 + import { text } from '@clack/prompts'; 278 + 279 + const serverPort = await text({ 280 + message: 'Enter port number:', 281 + validate: (value: string) => { 282 + const num = parseInt(value); 283 + if (isNaN(num)) return 'Please enter a valid number'; 284 + if (num < 1 || num > 65535) return 'Port must be between 1 and 65535'; 285 + return undefined; 286 + }, 287 + }); 288 + ```
-11
src/content/docs/guides/example.md
··· 1 - --- 2 - title: Example Guide 3 - description: A guide in my new Starlight docs site. 4 - --- 5 - 6 - Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. 7 - Writing a good guide requires thinking about what your users are trying to do. 8 - 9 - ## Further reading 10 - 11 - - Read [about how-to guides](https://diataxis.fr/how-to-guides/) in the Diátaxis framework
+305
src/content/docs/guides/examples.mdx
··· 1 + --- 2 + title: Examples 3 + description: Learn through practical examples of using Clack 4 + --- 5 + 6 + This guide provides practical examples of using Clack in different scenarios. 7 + 8 + ## Basic Examples 9 + 10 + ### Simple Text Input 11 + 12 + ```ts twoslash 13 + import { text } from '@clack/prompts'; 14 + 15 + const name = await text({ 16 + message: 'What is your name?', 17 + placeholder: 'John Doe', 18 + }) as string; 19 + 20 + console.log(`Hello, ${name}!`); 21 + ``` 22 + 23 + ### Selection Menu 24 + 25 + ```ts twoslash 26 + import { select, isCancel } from '@clack/prompts'; 27 + 28 + const framework = await select({ 29 + message: 'Choose a framework:', 30 + options: [ 31 + { value: 'react', label: 'React' }, 32 + { value: 'vue', label: 'Vue' }, 33 + { value: 'svelte', label: 'Svelte' }, 34 + ], 35 + }); 36 + 37 + if (isCancel(framework)) { 38 + console.log('Operation cancelled'); 39 + process.exit(0); 40 + } 41 + 42 + // Convert to string before using in template literal 43 + const frameworkStr = String(framework); 44 + console.log(`You selected ${frameworkStr}`); 45 + ``` 46 + 47 + ### Confirmation Dialog 48 + 49 + ```ts twoslash 50 + import { confirm } from '@clack/prompts'; 51 + 52 + const shouldProceed = await confirm({ 53 + message: 'Do you want to continue?', 54 + }); 55 + 56 + if (shouldProceed) { 57 + console.log('Proceeding...'); 58 + } else { 59 + console.log('Operation cancelled'); 60 + } 61 + ``` 62 + 63 + ## Advanced Examples 64 + 65 + ### Project Setup Wizard 66 + 67 + ```ts twoslash 68 + import { text, select, confirm, isCancel } from '@clack/prompts'; 69 + 70 + async function setupProject() { 71 + // Get project details 72 + const name = await text({ 73 + message: 'Project name:', 74 + validate: (value) => { 75 + if (value.length === 0) return 'Name is required'; 76 + return undefined; 77 + }, 78 + }) as string; 79 + 80 + const type = await select({ 81 + message: 'Project type:', 82 + options: [ 83 + { value: 'web', label: 'Web Application' }, 84 + { value: 'cli', label: 'CLI Tool' }, 85 + { value: 'api', label: 'API Server' }, 86 + ], 87 + }); 88 + 89 + if (isCancel(type)) { 90 + console.log('Operation cancelled'); 91 + process.exit(0); 92 + } 93 + 94 + // Get additional details based on project type 95 + let framework; 96 + if (String(type) === 'web') { 97 + framework = await select({ 98 + message: 'Choose a framework:', 99 + options: [ 100 + { value: 'react', label: 'React' }, 101 + { value: 'vue', label: 'Vue' }, 102 + { value: 'svelte', label: 'Svelte' }, 103 + ], 104 + }); 105 + 106 + if (isCancel(framework)) { 107 + console.log('Operation cancelled'); 108 + process.exit(0); 109 + } 110 + } 111 + 112 + // Confirm setup 113 + const shouldProceed = await confirm({ 114 + message: `Create ${String(type)} project "${name}"${framework ? ` with ${String(framework)}` : ''}?`, 115 + }); 116 + 117 + if (shouldProceed) { 118 + // Project creation logic here 119 + console.log('Creating project...'); 120 + } 121 + } 122 + ``` 123 + 124 + ### Configuration Setup 125 + 126 + ```ts twoslash 127 + import { text, select, confirm, isCancel } from '@clack/prompts'; 128 + 129 + interface Config { 130 + port: number; 131 + host: string | symbol; 132 + mode: 'development' | 'production'; 133 + features: string[]; 134 + } 135 + 136 + async function setupConfig(): Promise<Config> { 137 + const port = await text({ 138 + message: 'Enter port number:', 139 + defaultValue: '3000', 140 + validate: (value) => { 141 + const num = parseInt(value); 142 + if (isNaN(num)) return 'Please enter a valid number'; 143 + if (num < 1 || num > 65535) return 'Port must be between 1 and 65535'; 144 + return undefined; 145 + }, 146 + }); 147 + 148 + const host = await text({ 149 + message: 'Enter host:', 150 + defaultValue: 'localhost', 151 + }); 152 + 153 + const mode = await select({ 154 + message: 'Select mode:', 155 + options: [ 156 + { value: 'development', label: 'Development' }, 157 + { value: 'production', label: 'Production' }, 158 + ], 159 + }); 160 + 161 + if (isCancel(mode)) { 162 + console.log('Operation cancelled'); 163 + process.exit(0); 164 + } 165 + 166 + const features = await select({ 167 + message: 'Select features:', 168 + options: [ 169 + { value: 'auth', label: 'Authentication' }, 170 + { value: 'logging', label: 'Logging' }, 171 + { value: 'metrics', label: 'Metrics' }, 172 + ], 173 + }); 174 + 175 + if (isCancel(features)) { 176 + console.log('Operation cancelled'); 177 + process.exit(0); 178 + } 179 + 180 + return { 181 + port: Number(port), 182 + host, 183 + mode: String(mode) as 'development' | 'production', 184 + features: [String(features)], 185 + }; 186 + } 187 + ``` 188 + 189 + ### Interactive CLI Tool 190 + 191 + ```ts twoslash 192 + import { text, select, confirm as confirmPrompt, isCancel } from '@clack/prompts'; 193 + 194 + async function cliTool() { 195 + while (true) { 196 + const action = await select({ 197 + message: 'What would you like to do?', 198 + options: [ 199 + { value: 'create', label: 'Create new item' }, 200 + { value: 'list', label: 'List items' }, 201 + { value: 'delete', label: 'Delete item' }, 202 + { value: 'exit', label: 'Exit' }, 203 + ], 204 + }); 205 + 206 + if (isCancel(action)) { 207 + console.log('Operation cancelled'); 208 + process.exit(0); 209 + } 210 + 211 + if (String(action) === 'exit') break; 212 + 213 + switch (String(action)) { 214 + case 'create': { 215 + const name = await text({ 216 + message: 'Enter item name:', 217 + }) as string; 218 + console.log(`Created item: ${name}`); 219 + break; 220 + } 221 + case 'list': { 222 + console.log('Listing items...'); 223 + break; 224 + } 225 + case 'delete': { 226 + const item = await text({ 227 + message: 'Enter item to delete:', 228 + }) as string; 229 + const shouldDelete = await confirmPrompt({ 230 + message: `Delete ${item}?`, 231 + }); 232 + if (shouldDelete) { 233 + console.log(`Deleted ${item}`); 234 + } 235 + break; 236 + } 237 + } 238 + } 239 + } 240 + ``` 241 + 242 + ### Form Validation 243 + 244 + ```ts twoslash 245 + // @errors: 2731 2322 2345 246 + import { text, select, isCancel } from '@clack/prompts'; 247 + 248 + interface UserData { 249 + name: string | symbol; 250 + email: string | symbol; 251 + age: number; 252 + role: string; 253 + } 254 + 255 + async function collectUserData(): Promise<UserData> { 256 + const name = await text({ 257 + message: 'Full name:', 258 + validate: (value) => { 259 + if (value.length < 2) return 'Name must be at least 2 characters'; 260 + if (!/^[a-zA-Z\s]*$/.test(value)) return 'Name can only contain letters and spaces'; 261 + return undefined; 262 + }, 263 + }); 264 + 265 + const email = await text({ 266 + message: 'Email address:', 267 + validate: (value) => { 268 + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; 269 + if (!emailRegex.test(value)) return 'Please enter a valid email address'; 270 + return undefined; 271 + }, 272 + }); 273 + 274 + const age = await text({ 275 + message: 'Age:', 276 + validate: (value) => { 277 + const num = parseInt(value); 278 + if (isNaN(num)) return 'Please enter a valid number'; 279 + if (num < 18 || num > 100) return 'Age must be between 18 and 100'; 280 + return undefined; 281 + }, 282 + }); 283 + 284 + const role = await select({ 285 + message: 'Select role:', 286 + options: [ 287 + { value: 'admin', label: 'Administrator' }, 288 + { value: 'user', label: 'User' }, 289 + { value: 'guest', label: 'Guest' }, 290 + ], 291 + }); 292 + 293 + if (isCancel(role)) { 294 + console.log('Operation cancelled'); 295 + process.exit(0); 296 + } 297 + 298 + return { 299 + name, 300 + email, 301 + age: Number(age), 302 + role: String(role), 303 + }; 304 + } 305 + ```
+46 -26
src/content/docs/index.mdx
··· 1 1 --- 2 - title: Welcome to Starlight 3 - description: Get started building your docs site with Starlight. 2 + i18nReady: true 3 + title: Bombshell 4 + description: Effortlessly build beautiful command-line apps. 4 5 template: splash 6 + editUrl: false 7 + lastUpdated: false 5 8 hero: 6 - tagline: Congrats on setting up a new Starlight project! 9 + tagline: Effortlessly build beautiful command-line apps. 7 10 image: 8 - file: ../../assets/houston.webp 11 + alt: Bombshell Logo 12 + dark: "../../assets/dark.svg" 13 + light: "../../assets/light.svg" 9 14 actions: 10 - - text: Example Guide 11 - link: /guides/example/ 15 + - text: Get started 16 + link: /basics/getting-started/ 12 17 icon: right-arrow 13 - - text: Read the Starlight docs 14 - link: https://starlight.astro.build 15 - icon: external 16 - variant: minimal 18 + variant: primary 19 + - text: GitHub repository 20 + link: https://github.com/bombshell-dev/clack 21 + icon: github 17 22 --- 18 23 19 - import { Card, CardGrid } from '@astrojs/starlight/components'; 24 + import { CardGrid, LinkButton, Card } from '@astrojs/starlight/components'; 20 25 21 - ## Next steps 26 + <CardGrid> 22 27 23 - <CardGrid stagger> 24 - <Card title="Update content" icon="pencil"> 25 - Edit `src/content/docs/index.mdx` to see this page change. 26 - </Card> 27 - <Card title="Add new content" icon="add-document"> 28 - Add Markdown or MDX files to `src/content/docs` to create new pages. 29 - </Card> 30 - <Card title="Configure your site" icon="setting"> 31 - Edit your `sidebar` and other config in `astro.config.mjs`. 32 - </Card> 33 - <Card title="Read the docs" icon="open-book"> 34 - Learn more in [the Starlight Docs](https://starlight.astro.build/). 35 - </Card> 36 - </CardGrid> 28 + <Card title="Type-Safe" icon="rocket"> 29 + Built with TypeScript from the ground up. Get full type safety and autocompletion for all components and primitives. 30 + </Card> 31 + 32 + <Card title="Beautiful UI" icon="seti:smarty"> 33 + Modern, consistent, and beautiful command-line interfaces with customizable styling and theming. 34 + </Card> 35 + 36 + <Card title="Interactive Prompts" icon="seti:smarty"> 37 + Rich set of interactive components including text input, selection menus, confirmations, and more. 38 + </Card> 39 + 40 + <Card title="Form Validation" icon="approve-check"> 41 + Built-in validation with custom error messages and type checking for all input fields. 42 + </Card> 43 + 44 + <Card title="Progressive Disclosure" icon="information"> 45 + Show relevant options based on user input, making complex workflows simple and intuitive. 46 + </Card> 47 + 48 + <Card title="Error Handling" icon="warning"> 49 + Graceful error handling with cancellation support and clear error messages. 50 + </Card> 51 + 52 + <Card title="Customizable" icon="sun"> 53 + Extend and customize every aspect of your CLI with low-level primitives and custom components. 54 + </Card> 55 + 56 + </CardGrid>
-11
src/content/docs/reference/example.md
··· 1 - --- 2 - title: Example Reference 3 - description: A reference page in my new Starlight docs site. 4 - --- 5 - 6 - Reference pages are ideal for outlining how things work in terse and clear terms. 7 - Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what you're documenting. 8 - 9 - ## Further reading 10 - 11 - - Read [about reference](https://diataxis.fr/reference/) in the Diátaxis framework
+93
src/fonts/LICENSE
··· 1 + Google Inc. 2 + 3 + This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 + This license is copied below, and is also available with a FAQ at: 5 + http://scripts.sil.org/OFL 6 + 7 + 8 + ----------------------------------------------------------- 9 + SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 + ----------------------------------------------------------- 11 + 12 + PREAMBLE 13 + The goals of the Open Font License (OFL) are to stimulate worldwide 14 + development of collaborative font projects, to support the font creation 15 + efforts of academic and linguistic communities, and to provide a free and 16 + open framework in which fonts may be shared and improved in partnership 17 + with others. 18 + 19 + The OFL allows the licensed fonts to be used, studied, modified and 20 + redistributed freely as long as they are not sold by themselves. The 21 + fonts, including any derivative works, can be bundled, embedded, 22 + redistributed and/or sold with any software provided that any reserved 23 + names are not used by derivative works. The fonts and derivatives, 24 + however, cannot be released under any other type of license. The 25 + requirement for fonts to remain under this license does not apply 26 + to any document created using the fonts or their derivatives. 27 + 28 + DEFINITIONS 29 + "Font Software" refers to the set of files released by the Copyright 30 + Holder(s) under this license and clearly marked as such. This may 31 + include source files, build scripts and documentation. 32 + 33 + "Reserved Font Name" refers to any names specified as such after the 34 + copyright statement(s). 35 + 36 + "Original Version" refers to the collection of Font Software components as 37 + distributed by the Copyright Holder(s). 38 + 39 + "Modified Version" refers to any derivative made by adding to, deleting, 40 + or substituting -- in part or in whole -- any of the components of the 41 + Original Version, by changing formats or by porting the Font Software to a 42 + new environment. 43 + 44 + "Author" refers to any designer, engineer, programmer, technical 45 + writer or other person who contributed to the Font Software. 46 + 47 + PERMISSION & CONDITIONS 48 + Permission is hereby granted, free of charge, to any person obtaining 49 + a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 + redistribute, and sell modified and unmodified copies of the Font 51 + Software, subject to the following conditions: 52 + 53 + 1) Neither the Font Software nor any of its individual components, 54 + in Original or Modified Versions, may be sold by itself. 55 + 56 + 2) Original or Modified Versions of the Font Software may be bundled, 57 + redistributed and/or sold with any software, provided that each copy 58 + contains the above copyright notice and this license. These can be 59 + included either as stand-alone text files, human-readable headers or 60 + in the appropriate machine-readable metadata fields within text or 61 + binary files as long as those fields can be easily viewed by the user. 62 + 63 + 3) No Modified Version of the Font Software may use the Reserved Font 64 + Name(s) unless explicit written permission is granted by the corresponding 65 + Copyright Holder. This restriction only applies to the primary font name as 66 + presented to the users. 67 + 68 + 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 + Software shall not be used to promote, endorse or advertise any 70 + Modified Version, except to acknowledge the contribution(s) of the 71 + Copyright Holder(s) and the Author(s) or with their explicit written 72 + permission. 73 + 74 + 5) The Font Software, modified or unmodified, in part or in whole, 75 + must be distributed entirely under this license, and must not be 76 + distributed under any other license. The requirement for fonts to 77 + remain under this license does not apply to any document created 78 + using the Font Software. 79 + 80 + TERMINATION 81 + This license becomes null and void if any of the above conditions are 82 + not met. 83 + 84 + DISCLAIMER 85 + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 + OTHER DEALINGS IN THE FONT SOFTWARE.
+8
src/fonts/font-face.css
··· 1 + @font-face { 2 + font-family: "Urbanist"; 3 + /* Use a relative path to the local font file in `url()`. */ 4 + src: url("./urbanist-latin-ext-600-normal.ttf") format("opentype"); 5 + font-weight: 600; 6 + font-style: normal; 7 + font-display: swap; 8 + }
src/fonts/urbanist-latin-ext-600-normal.ttf

This is a binary file and will not be displayed.

+22
src/starlightOverrides/Head.astro
··· 1 + --- 2 + import Default from "@astrojs/starlight/components/Head.astro"; 3 + import "../styles/starlight.css"; 4 + --- 5 + 6 + <Default><slot /></Default> 7 + <meta name="twitter:site" content="bombshell" /> 8 + <meta name="twitter:creator" content="bombshell" /> 9 + <style is:global> 10 + /* Remove the general html font-family override to prevent it from overriding our specific rules */ 11 + h1, 12 + h2, 13 + h3, 14 + h4, 15 + h5, 16 + h6, 17 + .site-title, 18 + .sl-doc-title, 19 + .sl-nav-link { 20 + font-family: var(--sl-font-heading); 21 + } 22 + </style>
+23
src/styles/starlight.css
··· 1 + :root { 2 + /* Font settings */ 3 + --sl-font: 'Urbanis', sans-serif; 4 + --sl-font-heading: 'Urbanist', sans-serif; 5 + 6 + /* Ensure these are set for both light and dark themes */ 7 + --sl-color-text-heading: var(--sl-color-text); 8 + } 9 + 10 + /* Target specific elements */ 11 + .sl-nav-link, 12 + .site-title, 13 + .sl-doc-title, 14 + header h1 { 15 + font-family: var(--sl-font-heading); 16 + } 17 + 18 + p, 19 + li, 20 + td, 21 + blockquote { 22 + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; 23 + }