this repo has no description
0
fork

Configure Feed

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

Add base frontend

James Blair ffb95b6e

+3757
+3
.gitignore
··· 1 + dist/ 2 + node_modules/ 3 + .tanstack/
+19
biome.json
··· 1 + { 2 + "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", 3 + "files": { 4 + "includes": ["src/**/*.{css,js,jsx,ts,tsx}", "!src/routeTree.gen.ts"] 5 + }, 6 + "linter": { 7 + "rules": { 8 + "recommended": true, 9 + "nursery": { 10 + "useSortedClasses": "error" 11 + } 12 + } 13 + }, 14 + "css": { 15 + "parser": { 16 + "tailwindDirectives": true 17 + } 18 + } 19 + }
+990
bun.lock
··· 1 + { 2 + "lockfileVersion": 1, 3 + "configVersion": 1, 4 + "workspaces": { 5 + "": { 6 + "name": "cai", 7 + "dependencies": { 8 + "@base-ui/react": "^1.4.1", 9 + "@fontsource-variable/dm-sans": "^5.2.8", 10 + "@tailwindcss/vite": "^4.1.18", 11 + "@tanstack/react-query": "^5.100.5", 12 + "@tanstack/react-router": "latest", 13 + "@tanstack/router-plugin": "^1.132.0", 14 + "class-variance-authority": "^0.7.1", 15 + "lucide-react": "^1.11.0", 16 + "react": "^19.2.0", 17 + "react-dom": "^19.2.0", 18 + "shadcn": "^4.5.0", 19 + "tailwindcss": "^4.1.18", 20 + "tw-animate-css": "^1.4.0", 21 + }, 22 + "devDependencies": { 23 + "@biomejs/biome": "^2.4.13", 24 + "@tailwindcss/typography": "^0.5.16", 25 + "@types/node": "^22.10.2", 26 + "@types/react": "^19.2.0", 27 + "@types/react-dom": "^19.2.0", 28 + "@vitejs/plugin-react": "^6.0.1", 29 + "clsx": "^2.1.1", 30 + "tailwind-merge": "^3.5.0", 31 + "vite": "^8.0.0", 32 + }, 33 + }, 34 + }, 35 + "packages": { 36 + "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], 37 + 38 + "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="], 39 + 40 + "@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="], 41 + 42 + "@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="], 43 + 44 + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], 45 + 46 + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], 47 + 48 + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow=="], 49 + 50 + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], 51 + 52 + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="], 53 + 54 + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], 55 + 56 + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], 57 + 58 + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], 59 + 60 + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="], 61 + 62 + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.28.6", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg=="], 63 + 64 + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], 65 + 66 + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], 67 + 68 + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], 69 + 70 + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], 71 + 72 + "@babel/helpers": ["@babel/helpers@7.29.2", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.29.0" } }, "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw=="], 73 + 74 + "@babel/parser": ["@babel/parser@7.29.2", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA=="], 75 + 76 + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="], 77 + 78 + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="], 79 + 80 + "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.28.6", "", { "dependencies": { "@babel/helper-module-transforms": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA=="], 81 + 82 + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw=="], 83 + 84 + "@babel/preset-typescript": ["@babel/preset-typescript@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="], 85 + 86 + "@babel/runtime": ["@babel/runtime@7.29.2", "", {}, "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g=="], 87 + 88 + "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], 89 + 90 + "@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], 91 + 92 + "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], 93 + 94 + "@base-ui/react": ["@base-ui/react@1.4.1", "", { "dependencies": { "@babel/runtime": "^7.29.2", "@base-ui/utils": "0.2.8", "@floating-ui/react-dom": "^2.1.8", "@floating-ui/utils": "^0.2.11", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@date-fns/tz": "^1.2.0", "@types/react": "^17 || ^18 || ^19", "date-fns": "^4.0.0", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@date-fns/tz", "@types/react", "date-fns"] }, "sha512-Ab5/LIhcmL8BQcsBUYiOfkSDRdLpvgUBzMK30cu684JPcLclYlztharvCZyNNgzJtbAiREzI9q0pI5erHCMgCw=="], 95 + 96 + "@base-ui/utils": ["@base-ui/utils@0.2.8", "", { "dependencies": { "@babel/runtime": "^7.29.2", "@floating-ui/utils": "^0.2.11", "reselect": "^5.1.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-jvOi+c+ftGlGotNcKnzPVg2IhCaDTB6/6R3JeqdjdXktuAJi3wKH9T7+svuaKh1mmfVU11UWzUZVH74JDfi/wQ=="], 97 + 98 + "@biomejs/biome": ["@biomejs/biome@2.4.13", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.4.13", "@biomejs/cli-darwin-x64": "2.4.13", "@biomejs/cli-linux-arm64": "2.4.13", "@biomejs/cli-linux-arm64-musl": "2.4.13", "@biomejs/cli-linux-x64": "2.4.13", "@biomejs/cli-linux-x64-musl": "2.4.13", "@biomejs/cli-win32-arm64": "2.4.13", "@biomejs/cli-win32-x64": "2.4.13" }, "bin": { "biome": "bin/biome" } }, "sha512-gLXOwkOBBg0tr7bDsqlkIh4uFeKuMjxvqsrb1Tukww1iDmHcfr4Uu8MoQxp0Rcte+69+osRNWXwHsu/zxT6XqA=="], 99 + 100 + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.4.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2KImO1jhNFBa2oWConyr0x6flxbQpGKv6902uGXpYM62Xyem8U80j441SyUJ8KyngsmKbQjeIv1q2CQfDkNnYg=="], 101 + 102 + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.4.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-BKrJklbaFN4p1Ts4kPBczo+PkbsHQg57kmJ+vON9u2t6uN5okYHaSr7h/MutPCWQgg2lglaWoSmm+zhYW+oOkg=="], 103 + 104 + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.4.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-NzkUDSqfvMBrPplKgVr3aXLHZ2NEELvvF4vZxXulEylKWIGqlvNEcwUcj9OLrn75TD3lJ/GIqCVlBwd1MZCuYQ=="], 105 + 106 + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.4.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-U5MsuBQW25dXaYtqWWSPM3P96H6Y+fHuja3TQpMNnylocHW0tEbtFTDlUj6oM+YJLntvEkQy4grBvQNUD4+RCg=="], 107 + 108 + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.4.13", "", { "os": "linux", "cpu": "x64" }, "sha512-Az3ZZedYRBo9EQzNnD9SxFcR1G5QsGo6VEc2hIyVPZ1rdKwee/7E9oeBBZFpE8Z44ekxsDQBqbiWGW5ShOhUSQ=="], 109 + 110 + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.4.13", "", { "os": "linux", "cpu": "x64" }, "sha512-Z601MienRgTBDza/+u2CH3RSrWoXo9rtr8NK6A4KJzqGgfxx+H3VlyLgTJ4sRo40T3pIsqpTmiOQEvYzQvBRvQ=="], 111 + 112 + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.4.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-Px9PS2B5/Q183bUwy/5VHqp3J2lzdOCeVGzMpphYfl8oSa7VDCqenBdqWpy6DCy/en4Rbf/Y1RieZF6dJPcc9A=="], 113 + 114 + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.4.13", "", { "os": "win32", "cpu": "x64" }, "sha512-tTcMkXyBrmHi9BfrD2VNHs/5rYIUKETqsBlYOvSAABwBkJhSDVb5e7wPukftsQbO3WzQkXe6kaztC6WtUOXSoQ=="], 115 + 116 + "@dotenvx/dotenvx": ["@dotenvx/dotenvx@1.63.0", "", { "dependencies": { "commander": "^11.1.0", "dotenv": "^17.2.1", "eciesjs": "^0.4.10", "execa": "^5.1.1", "fdir": "^6.2.0", "ignore": "^5.3.0", "object-treeify": "1.1.33", "picomatch": "^4.0.4", "which": "^4.0.0", "yocto-spinner": "^1.1.0" }, "bin": { "dotenvx": "src/cli/dotenvx.js" } }, "sha512-jjkmzIRu19uH78AjFInqfcALehbDCZZ7M09hurVawyqNxtOXEg2LR73L59y4QnzfYDEzjbhVzGAd2uDHu0D1aQ=="], 117 + 118 + "@ecies/ciphers": ["@ecies/ciphers@0.2.6", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g=="], 119 + 120 + "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], 121 + 122 + "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], 123 + 124 + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], 125 + 126 + "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="], 127 + 128 + "@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="], 129 + 130 + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="], 131 + 132 + "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="], 133 + 134 + "@fontsource-variable/dm-sans": ["@fontsource-variable/dm-sans@5.2.8", "", {}, "sha512-AxkvMTvNWgfrmlyjiV05vlHYJa+nRQCf1EfvIrQAPBpFJW0O9VTz7oAFr9S3lvbWdmnFoBk7yFqQL86u64nl2g=="], 135 + 136 + "@hono/node-server": ["@hono/node-server@1.19.14", "", { "peerDependencies": { "hono": "^4" } }, "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw=="], 137 + 138 + "@inquirer/ansi": ["@inquirer/ansi@2.0.5", "", {}, "sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw=="], 139 + 140 + "@inquirer/confirm": ["@inquirer/confirm@6.0.12", "", { "dependencies": { "@inquirer/core": "^11.1.9", "@inquirer/type": "^4.0.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og=="], 141 + 142 + "@inquirer/core": ["@inquirer/core@11.1.9", "", { "dependencies": { "@inquirer/ansi": "^2.0.5", "@inquirer/figures": "^2.0.5", "@inquirer/type": "^4.0.5", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-BDE4fG22uYh1bGSifcj7JSx119TVYNViMhMu85usp4Fswrzh6M0DV3yld64jA98uOAa2GSQ4Bg4bZRm2d2cwSg=="], 143 + 144 + "@inquirer/figures": ["@inquirer/figures@2.0.5", "", {}, "sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ=="], 145 + 146 + "@inquirer/type": ["@inquirer/type@4.0.5", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-aetVUNeKNc/VriqXlw1NRSW0zhMBB0W4bNbWRJgzRl/3d0QNDQFfk0GO5SDdtjMZVg6o8ZKEiadd7SCCzoOn5Q=="], 147 + 148 + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], 149 + 150 + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], 151 + 152 + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], 153 + 154 + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], 155 + 156 + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], 157 + 158 + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="], 159 + 160 + "@mswjs/interceptors": ["@mswjs/interceptors@0.41.6", "", { "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" } }, "sha512-qmDvJIjcNsZ6tXWy2G9yuCgMPTTn35GMA3dPpSLm7QJVpbQzYdw0ALy1bKoivXnEM3U93/OrK+/M719b+fg84Q=="], 161 + 162 + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], 163 + 164 + "@noble/ciphers": ["@noble/ciphers@1.3.0", "", {}, "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw=="], 165 + 166 + "@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], 167 + 168 + "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], 169 + 170 + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], 171 + 172 + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], 173 + 174 + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], 175 + 176 + "@open-draft/deferred-promise": ["@open-draft/deferred-promise@3.0.0", "", {}, "sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA=="], 177 + 178 + "@open-draft/logger": ["@open-draft/logger@0.3.0", "", { "dependencies": { "is-node-process": "^1.2.0", "outvariant": "^1.4.0" } }, "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ=="], 179 + 180 + "@open-draft/until": ["@open-draft/until@2.1.0", "", {}, "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg=="], 181 + 182 + "@oxc-project/types": ["@oxc-project/types@0.127.0", "", {}, "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ=="], 183 + 184 + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.17", "", { "os": "android", "cpu": "arm64" }, "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ=="], 185 + 186 + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.17", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw=="], 187 + 188 + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-rc.17", "", { "os": "darwin", "cpu": "x64" }, "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw=="], 189 + 190 + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-rc.17", "", { "os": "freebsd", "cpu": "x64" }, "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw=="], 191 + 192 + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17", "", { "os": "linux", "cpu": "arm" }, "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ=="], 193 + 194 + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q=="], 195 + 196 + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-rc.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg=="], 197 + 198 + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA=="], 199 + 200 + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "s390x" }, "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA=="], 201 + 202 + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "x64" }, "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA=="], 203 + 204 + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-rc.17", "", { "os": "linux", "cpu": "x64" }, "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw=="], 205 + 206 + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-rc.17", "", { "os": "none", "cpu": "arm64" }, "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA=="], 207 + 208 + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-rc.17", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA=="], 209 + 210 + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17", "", { "os": "win32", "cpu": "arm64" }, "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA=="], 211 + 212 + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.17", "", { "os": "win32", "cpu": "x64" }, "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg=="], 213 + 214 + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.7", "", {}, "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA=="], 215 + 216 + "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], 217 + 218 + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], 219 + 220 + "@tailwindcss/node": ["@tailwindcss/node@4.2.4", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.4" } }, "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA=="], 221 + 222 + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.4", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.4", "@tailwindcss/oxide-darwin-arm64": "4.2.4", "@tailwindcss/oxide-darwin-x64": "4.2.4", "@tailwindcss/oxide-freebsd-x64": "4.2.4", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4", "@tailwindcss/oxide-linux-arm64-musl": "4.2.4", "@tailwindcss/oxide-linux-x64-gnu": "4.2.4", "@tailwindcss/oxide-linux-x64-musl": "4.2.4", "@tailwindcss/oxide-wasm32-wasi": "4.2.4", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4", "@tailwindcss/oxide-win32-x64-msvc": "4.2.4" } }, "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q=="], 223 + 224 + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.4", "", { "os": "android", "cpu": "arm64" }, "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g=="], 225 + 226 + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg=="], 227 + 228 + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg=="], 229 + 230 + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw=="], 231 + 232 + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA=="], 233 + 234 + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw=="], 235 + 236 + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g=="], 237 + 238 + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA=="], 239 + 240 + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA=="], 241 + 242 + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.4", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw=="], 243 + 244 + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ=="], 245 + 246 + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.4", "", { "os": "win32", "cpu": "x64" }, "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw=="], 247 + 248 + "@tailwindcss/typography": ["@tailwindcss/typography@0.5.19", "", { "dependencies": { "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg=="], 249 + 250 + "@tailwindcss/vite": ["@tailwindcss/vite@4.2.4", "", { "dependencies": { "@tailwindcss/node": "4.2.4", "@tailwindcss/oxide": "4.2.4", "tailwindcss": "4.2.4" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw=="], 251 + 252 + "@tanstack/history": ["@tanstack/history@1.161.6", "", {}, "sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg=="], 253 + 254 + "@tanstack/query-core": ["@tanstack/query-core@5.100.5", "", {}, "sha512-t20KrhKkf0HXzqQkPbJ5erhFesup68BAbwFgYmTrS7bxMF7O5MdmL8jUkik4thsG7Hg00fblz30h6yF1d5TxGg=="], 255 + 256 + "@tanstack/react-query": ["@tanstack/react-query@5.100.5", "", { "dependencies": { "@tanstack/query-core": "5.100.5" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-aNwj1mi2v2bQ9IxkyR1grLOUkv3BYWoykHy9KDyLNbjC3tsahbOHJibK+Wjtr1wRhG59/AvJhiJG5OlthaCgJA=="], 257 + 258 + "@tanstack/react-router": ["@tanstack/react-router@1.168.25", "", { "dependencies": { "@tanstack/history": "1.161.6", "@tanstack/react-store": "^0.9.3", "@tanstack/router-core": "1.168.17", "isbot": "^5.1.22" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-4U/E76dc+fYuLixjV1RLNfqrkQoexSL8MqGNpIHOodtvY3fMPGaALrvDVtBDQYBEU4z5r5fHaV6+kclWAVFP9A=="], 259 + 260 + "@tanstack/react-store": ["@tanstack/react-store@0.9.3", "", { "dependencies": { "@tanstack/store": "0.9.3", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg=="], 261 + 262 + "@tanstack/router-core": ["@tanstack/router-core@1.168.17", "", { "dependencies": { "@tanstack/history": "1.161.6", "cookie-es": "^3.0.0", "seroval": "^1.5.0", "seroval-plugins": "^1.5.0" }, "bin": { "intent": "bin/intent.js" } }, "sha512-VDq7HCqRK3sdpxoETwYoTXTaYi+OVQC197g1fdzaiZBUmhntfjn+PQc15OzTqNNhf8Menk6r6ftmuphybMKdig=="], 263 + 264 + "@tanstack/router-generator": ["@tanstack/router-generator@1.166.36", "", { "dependencies": { "@babel/types": "^7.28.5", "@tanstack/router-core": "1.168.17", "@tanstack/router-utils": "1.161.7", "@tanstack/virtual-file-routes": "1.161.7", "jiti": "^2.6.1", "magic-string": "^0.30.21", "prettier": "^3.5.0", "zod": "^3.24.2" } }, "sha512-ce8Sg+ONwdd483kXJBYhTcdIAjEwSlWUOkoLsgPdNUIfA05hdnd9JkNnM4X1OnzpFL8/+TBSMo4WYQp9CHhDPg=="], 265 + 266 + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.167.28", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@tanstack/router-core": "1.168.17", "@tanstack/router-generator": "1.166.36", "@tanstack/router-utils": "1.161.7", "@tanstack/virtual-file-routes": "1.161.7", "chokidar": "^3.6.0", "unplugin": "^3.0.0", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2 || ^2.0.0", "@tanstack/react-router": "^1.168.25", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"], "bin": { "intent": "bin/intent.js" } }, "sha512-O23ba7JaKvx5Eu0l6iTpknu79QcdkMmoW1VtZdsZe5NoQ6dHHru6caoapDc/uOxmz7h7VYfSuLjs/UYg7EA1cA=="], 267 + 268 + "@tanstack/router-utils": ["@tanstack/router-utils@1.161.7", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ansis": "^4.1.0", "babel-dead-code-elimination": "^1.0.12", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-VkY0u7ax/GD0qU6ZLLnfPC+UMxVzxRbvZp4yV4iUSXjgJZ/siAT5/QlLm9FEDJ9QDoC0VD9W7f00tKKreUI7Ng=="], 269 + 270 + "@tanstack/store": ["@tanstack/store@0.9.3", "", {}, "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw=="], 271 + 272 + "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.161.7", "", { "bin": { "intent": "bin/intent.js" } }, "sha512-olW33+Cn+bsCsZKPwEGhlkqS6w3M2slFv11JIobdnCFKMLG97oAI2kWKdx5/zsywTL8flpnoIgaZZPlQTFYhdQ=="], 273 + 274 + "@ts-morph/common": ["@ts-morph/common@0.27.0", "", { "dependencies": { "fast-glob": "^3.3.3", "minimatch": "^10.0.1", "path-browserify": "^1.0.1" } }, "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ=="], 275 + 276 + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], 277 + 278 + "@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], 279 + 280 + "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], 281 + 282 + "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], 283 + 284 + "@types/set-cookie-parser": ["@types/set-cookie-parser@2.4.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw=="], 285 + 286 + "@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="], 287 + 288 + "@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="], 289 + 290 + "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.1", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.7" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ=="], 291 + 292 + "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], 293 + 294 + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], 295 + 296 + "ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], 297 + 298 + "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], 299 + 300 + "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], 301 + 302 + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], 303 + 304 + "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="], 305 + 306 + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], 307 + 308 + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], 309 + 310 + "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="], 311 + 312 + "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], 313 + 314 + "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], 315 + 316 + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.23", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-xwVXGqevyKPsiuQdLj+dZMVjidjJV508TBqexND5HrF89cGdCYCJFB3qhcxRHSeMctdCfbR1jrxBajhDy7o29g=="], 317 + 318 + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], 319 + 320 + "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], 321 + 322 + "brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], 323 + 324 + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], 325 + 326 + "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], 327 + 328 + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], 329 + 330 + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], 331 + 332 + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], 333 + 334 + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], 335 + 336 + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], 337 + 338 + "caniuse-lite": ["caniuse-lite@1.0.30001791", "", {}, "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ=="], 339 + 340 + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], 341 + 342 + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], 343 + 344 + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], 345 + 346 + "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], 347 + 348 + "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], 349 + 350 + "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="], 351 + 352 + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], 353 + 354 + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], 355 + 356 + "code-block-writer": ["code-block-writer@13.0.3", "", {}, "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="], 357 + 358 + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], 359 + 360 + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], 361 + 362 + "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], 363 + 364 + "content-disposition": ["content-disposition@1.1.0", "", {}, "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g=="], 365 + 366 + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], 367 + 368 + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], 369 + 370 + "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], 371 + 372 + "cookie-es": ["cookie-es@3.1.1", "", {}, "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg=="], 373 + 374 + "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], 375 + 376 + "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="], 377 + 378 + "cosmiconfig": ["cosmiconfig@9.0.1", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ=="], 379 + 380 + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], 381 + 382 + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], 383 + 384 + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], 385 + 386 + "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], 387 + 388 + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], 389 + 390 + "dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="], 391 + 392 + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], 393 + 394 + "default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="], 395 + 396 + "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="], 397 + 398 + "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], 399 + 400 + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], 401 + 402 + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], 403 + 404 + "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], 405 + 406 + "dotenv": ["dotenv@17.4.2", "", {}, "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw=="], 407 + 408 + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], 409 + 410 + "eciesjs": ["eciesjs@0.4.18", "", { "dependencies": { "@ecies/ciphers": "^0.2.5", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.7", "@noble/hashes": "^1.8.0" } }, "sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ=="], 411 + 412 + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], 413 + 414 + "electron-to-chromium": ["electron-to-chromium@1.5.344", "", {}, "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg=="], 415 + 416 + "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], 417 + 418 + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], 419 + 420 + "enhanced-resolve": ["enhanced-resolve@5.21.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA=="], 421 + 422 + "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], 423 + 424 + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], 425 + 426 + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], 427 + 428 + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], 429 + 430 + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], 431 + 432 + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], 433 + 434 + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], 435 + 436 + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], 437 + 438 + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], 439 + 440 + "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], 441 + 442 + "eventsource-parser": ["eventsource-parser@3.0.8", "", {}, "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ=="], 443 + 444 + "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="], 445 + 446 + "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], 447 + 448 + "express-rate-limit": ["express-rate-limit@8.4.1", "", { "dependencies": { "ip-address": "10.1.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-NGVYwQSAyEQgzxX1iCM978PP9AdO/hW93gMcF6ZwQCm+rFvLsBH6w4xcXWTcliS8La5EPRN3p9wzItqBwJrfNw=="], 449 + 450 + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], 451 + 452 + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 453 + 454 + "fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="], 455 + 456 + "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="], 457 + 458 + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], 459 + 460 + "fast-wrap-ansi": ["fast-wrap-ansi@0.2.0", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w=="], 461 + 462 + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], 463 + 464 + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], 465 + 466 + "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], 467 + 468 + "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="], 469 + 470 + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], 471 + 472 + "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], 473 + 474 + "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], 475 + 476 + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], 477 + 478 + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], 479 + 480 + "fs-extra": ["fs-extra@11.3.4", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA=="], 481 + 482 + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], 483 + 484 + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], 485 + 486 + "fuzzysort": ["fuzzysort@3.1.0", "", {}, "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ=="], 487 + 488 + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], 489 + 490 + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], 491 + 492 + "get-east-asian-width": ["get-east-asian-width@1.5.0", "", {}, "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA=="], 493 + 494 + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], 495 + 496 + "get-own-enumerable-keys": ["get-own-enumerable-keys@1.0.0", "", {}, "sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA=="], 497 + 498 + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], 499 + 500 + "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], 501 + 502 + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 503 + 504 + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], 505 + 506 + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], 507 + 508 + "graphql": ["graphql@16.13.2", "", {}, "sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig=="], 509 + 510 + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], 511 + 512 + "hasown": ["hasown@2.0.3", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="], 513 + 514 + "headers-polyfill": ["headers-polyfill@5.0.1", "", { "dependencies": { "@types/set-cookie-parser": "^2.4.10", "set-cookie-parser": "^3.0.1" } }, "sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA=="], 515 + 516 + "hono": ["hono@4.12.15", "", {}, "sha512-qM0jDhFEaCBb4TxoW7f53Qrpv9RBiayUHo0S52JudprkhvpjIrGoU1mnnr29Fvd1U335ZFPZQY1wlkqgfGXyLg=="], 517 + 518 + "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], 519 + 520 + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], 521 + 522 + "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="], 523 + 524 + "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], 525 + 526 + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], 527 + 528 + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], 529 + 530 + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], 531 + 532 + "ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="], 533 + 534 + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], 535 + 536 + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], 537 + 538 + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], 539 + 540 + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], 541 + 542 + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], 543 + 544 + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], 545 + 546 + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], 547 + 548 + "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="], 549 + 550 + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], 551 + 552 + "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], 553 + 554 + "is-node-process": ["is-node-process@1.2.0", "", {}, "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw=="], 555 + 556 + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], 557 + 558 + "is-obj": ["is-obj@3.0.0", "", {}, "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ=="], 559 + 560 + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], 561 + 562 + "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], 563 + 564 + "is-regexp": ["is-regexp@3.1.0", "", {}, "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA=="], 565 + 566 + "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="], 567 + 568 + "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], 569 + 570 + "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], 571 + 572 + "isbot": ["isbot@5.1.39", "", {}, "sha512-obH0yYahGXdzNxo+djmHhBYThUKDkz565cxkIlt2L9hXfv1NlaLKoDBHo6KxXsYrIXx2RK3x5vY36CfZcobxEw=="], 573 + 574 + "isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], 575 + 576 + "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], 577 + 578 + "jose": ["jose@6.2.2", "", {}, "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ=="], 579 + 580 + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], 581 + 582 + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], 583 + 584 + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], 585 + 586 + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], 587 + 588 + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], 589 + 590 + "json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="], 591 + 592 + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], 593 + 594 + "jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="], 595 + 596 + "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], 597 + 598 + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], 599 + 600 + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], 601 + 602 + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], 603 + 604 + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], 605 + 606 + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], 607 + 608 + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], 609 + 610 + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], 611 + 612 + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], 613 + 614 + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], 615 + 616 + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], 617 + 618 + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], 619 + 620 + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], 621 + 622 + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], 623 + 624 + "log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="], 625 + 626 + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], 627 + 628 + "lucide-react": ["lucide-react@1.11.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-UOhjdztXCgdBReRcIhsvz2siIBogfv/lhJEIViCpLt924dO+GDms9T7DNoucI23s6kEPpe988m5N0D2ajnzb2g=="], 629 + 630 + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], 631 + 632 + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], 633 + 634 + "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], 635 + 636 + "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], 637 + 638 + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], 639 + 640 + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], 641 + 642 + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], 643 + 644 + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], 645 + 646 + "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], 647 + 648 + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], 649 + 650 + "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], 651 + 652 + "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], 653 + 654 + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], 655 + 656 + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 657 + 658 + "msw": ["msw@2.13.6", "", { "dependencies": { "@inquirer/confirm": "^6.0.11", "@mswjs/interceptors": "^0.41.3", "@open-draft/deferred-promise": "^3.0.0", "@types/statuses": "^2.0.6", "cookie": "^1.1.1", "graphql": "^16.13.2", "headers-polyfill": "^5.0.1", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "rettime": "^0.11.7", "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.1", "type-fest": "^5.5.0", "until-async": "^3.0.2", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": ">= 4.8.x" }, "optionalPeers": ["typescript"], "bin": { "msw": "cli/index.js" } }, "sha512-GAJbQy8Ra/Ydjt0Hb2MGT2qhzd83J3+QZMHdH85uW7r/XkKc846+Ma2PLif5hGvTm5Yqa+wkcstpim0WeLZU9g=="], 659 + 660 + "mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], 661 + 662 + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], 663 + 664 + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], 665 + 666 + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], 667 + 668 + "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], 669 + 670 + "node-releases": ["node-releases@2.0.38", "", {}, "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw=="], 671 + 672 + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], 673 + 674 + "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], 675 + 676 + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], 677 + 678 + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], 679 + 680 + "object-treeify": ["object-treeify@1.1.33", "", {}, "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A=="], 681 + 682 + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], 683 + 684 + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], 685 + 686 + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], 687 + 688 + "open": ["open@11.0.0", "", { "dependencies": { "default-browser": "^5.4.0", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", "powershell-utils": "^0.1.0", "wsl-utils": "^0.3.0" } }, "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw=="], 689 + 690 + "ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="], 691 + 692 + "outvariant": ["outvariant@1.4.3", "", {}, "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA=="], 693 + 694 + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], 695 + 696 + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], 697 + 698 + "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], 699 + 700 + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], 701 + 702 + "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], 703 + 704 + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], 705 + 706 + "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], 707 + 708 + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], 709 + 710 + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], 711 + 712 + "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], 713 + 714 + "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="], 715 + 716 + "postcss": ["postcss@8.5.12", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA=="], 717 + 718 + "postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="], 719 + 720 + "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="], 721 + 722 + "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="], 723 + 724 + "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="], 725 + 726 + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], 727 + 728 + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], 729 + 730 + "qs": ["qs@6.15.1", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg=="], 731 + 732 + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], 733 + 734 + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], 735 + 736 + "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], 737 + 738 + "react": ["react@19.2.5", "", {}, "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA=="], 739 + 740 + "react-dom": ["react-dom@19.2.5", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.5" } }, "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag=="], 741 + 742 + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], 743 + 744 + "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="], 745 + 746 + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], 747 + 748 + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], 749 + 750 + "reselect": ["reselect@5.1.1", "", {}, "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="], 751 + 752 + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], 753 + 754 + "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], 755 + 756 + "rettime": ["rettime@0.11.8", "", {}, "sha512-0fERGXktJTyJ+h8fBEiPxHPEFOu0h15JY7JtwrOVqR5K+vb99ho6IyOo7ekLS3h4sJCzIDy4VWKIbZUfe9njmg=="], 757 + 758 + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], 759 + 760 + "rolldown": ["rolldown@1.0.0-rc.17", "", { "dependencies": { "@oxc-project/types": "=0.127.0", "@rolldown/pluginutils": "1.0.0-rc.17" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.17", "@rolldown/binding-darwin-arm64": "1.0.0-rc.17", "@rolldown/binding-darwin-x64": "1.0.0-rc.17", "@rolldown/binding-freebsd-x64": "1.0.0-rc.17", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.17", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.17", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.17", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA=="], 761 + 762 + "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], 763 + 764 + "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], 765 + 766 + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], 767 + 768 + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], 769 + 770 + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], 771 + 772 + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 773 + 774 + "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], 775 + 776 + "seroval": ["seroval@1.5.2", "", {}, "sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q=="], 777 + 778 + "seroval-plugins": ["seroval-plugins@1.5.2", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-qpY0Cl+fKYFn4GOf3cMiq6l72CpuVaawb6ILjubOQ+diJ54LfOWaSSPsaswN8DRPIPW4Yq+tE1k5aKd7ILyaFg=="], 779 + 780 + "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], 781 + 782 + "set-cookie-parser": ["set-cookie-parser@3.1.0", "", {}, "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw=="], 783 + 784 + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], 785 + 786 + "shadcn": ["shadcn@4.5.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/plugin-transform-typescript": "^7.28.0", "@babel/preset-typescript": "^7.27.1", "@dotenvx/dotenvx": "^1.48.4", "@modelcontextprotocol/sdk": "^1.26.0", "@types/validate-npm-package-name": "^4.0.2", "browserslist": "^4.26.2", "commander": "^14.0.0", "cosmiconfig": "^9.0.0", "dedent": "^1.6.0", "deepmerge": "^4.3.1", "diff": "^8.0.2", "execa": "^9.6.0", "fast-glob": "^3.3.3", "fs-extra": "^11.3.1", "fuzzysort": "^3.1.0", "https-proxy-agent": "^7.0.6", "kleur": "^4.1.5", "msw": "^2.10.4", "node-fetch": "^3.3.2", "open": "^11.0.0", "ora": "^8.2.0", "postcss": "^8.5.6", "postcss-selector-parser": "^7.1.0", "prompts": "^2.4.2", "recast": "^0.23.11", "stringify-object": "^5.0.0", "tailwind-merge": "^3.0.1", "ts-morph": "^26.0.0", "tsconfig-paths": "^4.2.0", "validate-npm-package-name": "^7.0.1", "zod": "^3.24.1", "zod-to-json-schema": "^3.24.6" }, "bin": { "shadcn": "dist/index.js" } }, "sha512-ZpNOz7IMI5aezbMEWNxBvl2aJ1ek6NuAMqpL/FUnk5IuRxERl8ohYEnqqAmhPOcur8RbGuCoqTZLQ3Oi4Xkf8A=="], 787 + 788 + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], 789 + 790 + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], 791 + 792 + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], 793 + 794 + "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], 795 + 796 + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], 797 + 798 + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], 799 + 800 + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], 801 + 802 + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], 803 + 804 + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], 805 + 806 + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], 807 + 808 + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], 809 + 810 + "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="], 811 + 812 + "strict-event-emitter": ["strict-event-emitter@0.5.1", "", {}, "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ=="], 813 + 814 + "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], 815 + 816 + "stringify-object": ["stringify-object@5.0.0", "", { "dependencies": { "get-own-enumerable-keys": "^1.0.0", "is-obj": "^3.0.0", "is-regexp": "^3.1.0" } }, "sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg=="], 817 + 818 + "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], 819 + 820 + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], 821 + 822 + "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], 823 + 824 + "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], 825 + 826 + "tailwind-merge": ["tailwind-merge@3.5.0", "", {}, "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A=="], 827 + 828 + "tailwindcss": ["tailwindcss@4.2.4", "", {}, "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA=="], 829 + 830 + "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], 831 + 832 + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], 833 + 834 + "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], 835 + 836 + "tldts": ["tldts@7.0.28", "", { "dependencies": { "tldts-core": "^7.0.28" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw=="], 837 + 838 + "tldts-core": ["tldts-core@7.0.28", "", {}, "sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ=="], 839 + 840 + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], 841 + 842 + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], 843 + 844 + "tough-cookie": ["tough-cookie@6.0.1", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw=="], 845 + 846 + "ts-morph": ["ts-morph@26.0.0", "", { "dependencies": { "@ts-morph/common": "~0.27.0", "code-block-writer": "^13.0.3" } }, "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug=="], 847 + 848 + "tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="], 849 + 850 + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 851 + 852 + "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="], 853 + 854 + "type-fest": ["type-fest@5.6.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA=="], 855 + 856 + "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], 857 + 858 + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], 859 + 860 + "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], 861 + 862 + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], 863 + 864 + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], 865 + 866 + "unplugin": ["unplugin@3.0.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg=="], 867 + 868 + "until-async": ["until-async@3.0.2", "", {}, "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw=="], 869 + 870 + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], 871 + 872 + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], 873 + 874 + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], 875 + 876 + "validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="], 877 + 878 + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], 879 + 880 + "vite": ["vite@8.0.10", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.10", "rolldown": "1.0.0-rc.17", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw=="], 881 + 882 + "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], 883 + 884 + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], 885 + 886 + "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], 887 + 888 + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], 889 + 890 + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], 891 + 892 + "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="], 893 + 894 + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], 895 + 896 + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], 897 + 898 + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], 899 + 900 + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], 901 + 902 + "yocto-spinner": ["yocto-spinner@1.1.0", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-/BY0AUXnS7IKO354uLLA2eRcWiqDifEbd6unXCsOxkFDAkhgUL3PH9X2bFoaU0YchnDXsF+iKleeTLJGckbXfA=="], 903 + 904 + "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], 905 + 906 + "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], 907 + 908 + "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], 909 + 910 + "@dotenvx/dotenvx/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], 911 + 912 + "@dotenvx/dotenvx/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], 913 + 914 + "@mswjs/interceptors/@open-draft/deferred-promise": ["@open-draft/deferred-promise@2.2.0", "", {}, "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="], 915 + 916 + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" }, "bundled": true }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], 917 + 918 + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], 919 + 920 + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], 921 + 922 + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], 923 + 924 + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], 925 + 926 + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 927 + 928 + "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], 929 + 930 + "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 931 + 932 + "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 933 + 934 + "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], 935 + 936 + "express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], 937 + 938 + "log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], 939 + 940 + "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], 941 + 942 + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], 943 + 944 + "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], 945 + 946 + "readdirp/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], 947 + 948 + "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], 949 + 950 + "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.17", "", {}, "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg=="], 951 + 952 + "router/path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], 953 + 954 + "shadcn/postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], 955 + 956 + "wrap-ansi/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 957 + 958 + "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 959 + 960 + "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 961 + 962 + "@dotenvx/dotenvx/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], 963 + 964 + "@dotenvx/dotenvx/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], 965 + 966 + "@dotenvx/dotenvx/execa/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], 967 + 968 + "@dotenvx/dotenvx/execa/npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], 969 + 970 + "@dotenvx/dotenvx/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], 971 + 972 + "@dotenvx/dotenvx/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], 973 + 974 + "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 975 + 976 + "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 977 + 978 + "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], 979 + 980 + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 981 + 982 + "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 983 + 984 + "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 985 + 986 + "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 987 + 988 + "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 989 + } 990 + }
+25
components.json
··· 1 + { 2 + "$schema": "https://ui.shadcn.com/schema.json", 3 + "style": "base-luma", 4 + "rsc": false, 5 + "tsx": true, 6 + "tailwind": { 7 + "config": "", 8 + "css": "src/styles.css", 9 + "baseColor": "zinc", 10 + "cssVariables": true, 11 + "prefix": "" 12 + }, 13 + "iconLibrary": "lucide", 14 + "rtl": false, 15 + "aliases": { 16 + "components": "#/components", 17 + "utils": "#/lib/utils", 18 + "ui": "#/components/ui", 19 + "lib": "#/lib", 20 + "hooks": "#/hooks" 21 + }, 22 + "menuColor": "default", 23 + "menuAccent": "subtle", 24 + "registries": {} 25 + }
+12
index.html
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 + <title>cAI</title> 7 + </head> 8 + <body> 9 + <div id="app"></div> 10 + <script type="module" src="/src/main.tsx"></script> 11 + </body> 12 + </html>
+40
package.json
··· 1 + { 2 + "name": "cai", 3 + "private": true, 4 + "type": "module", 5 + "scripts": { 6 + "dev": "vite dev --port 3000", 7 + "build": "vite build", 8 + "preview": "vite preview", 9 + "lint": "biome lint .", 10 + "lint:fix": "biome lint --write .", 11 + "format": "biome format --write .", 12 + "check": "biome check ." 13 + }, 14 + "dependencies": { 15 + "@base-ui/react": "^1.4.1", 16 + "@fontsource-variable/dm-sans": "^5.2.8", 17 + "@tailwindcss/vite": "^4.1.18", 18 + "@tanstack/react-query": "^5.100.5", 19 + "@tanstack/react-router": "latest", 20 + "@tanstack/router-plugin": "^1.132.0", 21 + "class-variance-authority": "^0.7.1", 22 + "lucide-react": "^1.11.0", 23 + "react": "^19.2.0", 24 + "react-dom": "^19.2.0", 25 + "shadcn": "^4.5.0", 26 + "tailwindcss": "^4.1.18", 27 + "tw-animate-css": "^1.4.0" 28 + }, 29 + "devDependencies": { 30 + "@biomejs/biome": "^2.4.13", 31 + "@tailwindcss/typography": "^0.5.16", 32 + "@types/node": "^22.10.2", 33 + "@types/react": "^19.2.0", 34 + "@types/react-dom": "^19.2.0", 35 + "@vitejs/plugin-react": "^6.0.1", 36 + "clsx": "^2.1.1", 37 + "tailwind-merge": "^3.5.0", 38 + "vite": "^8.0.0" 39 + } 40 + }
public/favicon.ico

This is a binary file and will not be displayed.

public/kitsune.gif

This is a binary file and will not be displayed.

public/logo192.png

This is a binary file and will not be displayed.

public/logo512.png

This is a binary file and will not be displayed.

+25
public/manifest.json
··· 1 + { 2 + "short_name": "TanStack App", 3 + "name": "Create TanStack App Sample", 4 + "icons": [ 5 + { 6 + "src": "favicon.ico", 7 + "sizes": "64x64 32x32 24x24 16x16", 8 + "type": "image/x-icon" 9 + }, 10 + { 11 + "src": "logo192.png", 12 + "type": "image/png", 13 + "sizes": "192x192" 14 + }, 15 + { 16 + "src": "logo512.png", 17 + "type": "image/png", 18 + "sizes": "512x512" 19 + } 20 + ], 21 + "start_url": ".", 22 + "display": "standalone", 23 + "theme_color": "#000000", 24 + "background_color": "#ffffff" 25 + }
+3
public/robots.txt
··· 1 + # https://www.robotstxt.org/robotstxt.html 2 + User-agent: * 3 + Disallow:
+23
src/components/attribution.tsx
··· 1 + import { Text } from "./text"; 2 + 3 + interface AttributionProps { 4 + title: string; 5 + artist: string; 6 + license: string; 7 + href: string; 8 + } 9 + 10 + export function Attribution({ 11 + title, 12 + artist, 13 + license, 14 + href, 15 + }: AttributionProps) { 16 + return ( 17 + <Text variant="muted" className="max-w-xs text-xs"> 18 + <a href={href} target="_blank" rel="noopener"> 19 + "{title}" by {artist} ({license}) 20 + </a> 21 + </Text> 22 + ); 23 + }
+33
src/components/character-select.tsx
··· 1 + import type * as React from "react"; 2 + import { useCharacters } from "#/hooks/use-characters"; 3 + import { 4 + Select, 5 + SelectContent, 6 + SelectGroup, 7 + SelectItem, 8 + SelectLabel, 9 + SelectTrigger, 10 + SelectValue, 11 + } from "./ui/select"; 12 + 13 + export function CharacterSelect(props: React.ComponentProps<typeof Select>) { 14 + const { data: characters = [] } = useCharacters(); 15 + 16 + return ( 17 + <Select {...props}> 18 + <SelectTrigger className="min-w-40"> 19 + <SelectValue placeholder="Characters" /> 20 + </SelectTrigger> 21 + <SelectContent alignItemWithTrigger={false}> 22 + <SelectGroup> 23 + <SelectLabel>Characters</SelectLabel> 24 + {characters.map((character) => ( 25 + <SelectItem key={character.id} value={character.name}> 26 + {character.name} 27 + </SelectItem> 28 + ))} 29 + </SelectGroup> 30 + </SelectContent> 31 + </Select> 32 + ); 33 + }
+23
src/components/chat-form.tsx
··· 1 + import { CharacterSelect } from "./character-select"; 2 + import { Row, Stack } from "./layout"; 3 + import { Button } from "./ui/button"; 4 + import { Textarea } from "./ui/textarea"; 5 + 6 + export function ChatForm() { 7 + return ( 8 + <form> 9 + <Stack gap="sm"> 10 + <Textarea 11 + placeholder="Write your message here..." 12 + className="wrap-anywhere min-h-25 focus-visible:border-transparent focus-visible:ring-0" 13 + /> 14 + <Row justify="between"> 15 + <CharacterSelect /> 16 + <Button type="submit" size="lg"> 17 + Send 18 + </Button> 19 + </Row> 20 + </Stack> 21 + </form> 22 + ); 23 + }
+24
src/components/chat-message.tsx
··· 1 + import { cva, type VariantProps } from "class-variance-authority"; 2 + import { cn } from "#/lib/utils"; 3 + 4 + const chatBubble = cva( 5 + "max-w-[80%] rounded-2xl px-4 py-2 text-sm leading-relaxed", 6 + { 7 + variants: { 8 + author: { 9 + assistant: "self-start bg-primary text-primary-foreground", 10 + user: "self-end bg-secondary text-secondary-foreground", 11 + }, 12 + }, 13 + defaultVariants: { 14 + author: "assistant", 15 + }, 16 + }, 17 + ); 18 + 19 + type ChatBubbleProps = React.HTMLAttributes<HTMLDivElement> & 20 + VariantProps<typeof chatBubble>; 21 + 22 + export function ChatBubble({ className, author, ...props }: ChatBubbleProps) { 23 + return <div className={cn(chatBubble({ author }), className)} {...props} />; 24 + }
+19
src/components/chat-messages.tsx
··· 1 + import type { ChatMessage as ChatMessageType } from "#/lib/types"; 2 + import { ChatBubble } from "./chat-message"; 3 + import { Stack } from "./layout"; 4 + 5 + interface ChatMessageProps { 6 + messages: ChatMessageType[]; 7 + } 8 + 9 + export function ChatMessages({ messages }: ChatMessageProps) { 10 + return ( 11 + <Stack> 12 + {messages.map((message) => ( 13 + <ChatBubble key={message.id} author={message.author}> 14 + {message.text} 15 + </ChatBubble> 16 + ))} 17 + </Stack> 18 + ); 19 + }
+64
src/components/chat-sidebar.tsx
··· 1 + import { Link, useLocation } from "@tanstack/react-router"; 2 + import { useChats } from "#/hooks/use-chats"; 3 + import type { Chat } from "#/lib/types"; 4 + import { Row } from "./layout"; 5 + import { Logo } from "./logo"; 6 + import { 7 + Sidebar, 8 + SidebarContent, 9 + SidebarFooter, 10 + SidebarGroup, 11 + SidebarGroupLabel, 12 + SidebarHeader, 13 + SidebarMenu, 14 + SidebarMenuButton, 15 + SidebarMenuItem, 16 + } from "./ui/sidebar"; 17 + 18 + export function ChatSidebar() { 19 + const { data: chats = [] } = useChats(); 20 + 21 + return ( 22 + <Sidebar variant="inset"> 23 + <SidebarHeader> 24 + <Row className="px-3 pt-3"> 25 + <Link to="/"> 26 + <Logo /> 27 + </Link> 28 + </Row> 29 + </SidebarHeader> 30 + <SidebarContent> 31 + <SidebarGroup> 32 + <SidebarGroupLabel>Chats</SidebarGroupLabel> 33 + <SidebarMenu> 34 + {chats.map((chat) => ( 35 + <ChatSidebarMenuItem key={chat.id} chat={chat} /> 36 + ))} 37 + </SidebarMenu> 38 + </SidebarGroup> 39 + </SidebarContent> 40 + <SidebarFooter /> 41 + </Sidebar> 42 + ); 43 + } 44 + 45 + interface ChatSidebarMenuItemProps { 46 + chat: Omit<Chat, "messages">; 47 + } 48 + 49 + function ChatSidebarMenuItem({ chat }: ChatSidebarMenuItemProps) { 50 + const pathname = useLocation({ 51 + select: (location) => location.pathname, 52 + }); 53 + 54 + return ( 55 + <SidebarMenuItem> 56 + <SidebarMenuButton 57 + render={<Link to="/chats/$chatId" params={{ chatId: chat.id }} />} 58 + isActive={pathname === `/chats/${chat.id}`} 59 + > 60 + {chat.title} 61 + </SidebarMenuButton> 62 + </SidebarMenuItem> 63 + ); 64 + }
+19
src/components/chat.tsx
··· 1 + import { useChat } from "#/hooks/use-chat"; 2 + import { ChatForm } from "./chat-form"; 3 + import { ChatMessages } from "./chat-messages"; 4 + import { Stack } from "./layout"; 5 + 6 + interface ChatProps { 7 + chatId: string; 8 + } 9 + 10 + export function Chat({ chatId }: ChatProps) { 11 + const { messages } = useChat({ id: chatId }); 12 + 13 + return ( 14 + <Stack justify="between" className="flex-1 py-4 md:py-8"> 15 + <ChatMessages messages={messages} /> 16 + <ChatForm /> 17 + </Stack> 18 + ); 19 + }
+25
src/components/container.tsx
··· 1 + import { cva, type VariantProps } from "class-variance-authority"; 2 + import { cn } from "#/lib/utils"; 3 + 4 + const containerVariants = cva("mx-auto w-full px-4", { 5 + variants: { 6 + size: { 7 + sm: "max-w-2xl", 8 + md: "max-w-4xl", 9 + lg: "max-w-6xl", 10 + full: "max-w-none", 11 + }, 12 + }, 13 + defaultVariants: { 14 + size: "md", 15 + }, 16 + }); 17 + 18 + type ContainerProps = React.HTMLAttributes<HTMLDivElement> & 19 + VariantProps<typeof containerVariants>; 20 + 21 + export function Container({ className, size, ...props }: ContainerProps) { 22 + return ( 23 + <div className={cn(containerVariants({ size }), className)} {...props} /> 24 + ); 25 + }
+33
src/components/heading.tsx
··· 1 + import { cva, type VariantProps } from "class-variance-authority"; 2 + import { cn } from "@/lib/utils"; 3 + 4 + const heading = cva("tracking-tight", { 5 + variants: { 6 + level: { 7 + h1: "text-4xl md:text-5xl font-bold", 8 + h2: "text-2xl md:text-3xl font-semibold", 9 + h3: "text-lg font-medium", 10 + }, 11 + }, 12 + defaultVariants: { 13 + level: "h2", 14 + }, 15 + }); 16 + 17 + type HeadingVariants = VariantProps<typeof heading>; 18 + type HeadingProps = React.HTMLAttributes<HTMLHeadingElement> & HeadingVariants; 19 + 20 + export function Heading({ 21 + level = "h2", 22 + className, 23 + children, 24 + ...props 25 + }: HeadingProps) { 26 + const Tag = level ?? "h2"; 27 + 28 + return ( 29 + <Tag className={cn(heading({ level }), className)} {...props}> 30 + {children} 31 + </Tag> 32 + ); 33 + }
+57
src/components/layout.tsx
··· 1 + import { cva, type VariantProps } from "class-variance-authority"; 2 + import { cn } from "#/lib/utils"; 3 + 4 + const layout = cva("flex flex-wrap", { 5 + variants: { 6 + direction: { 7 + horizontal: "flex-row", 8 + vertical: "flex-col", 9 + }, 10 + gap: { 11 + sm: "gap-2", 12 + md: "gap-4", 13 + lg: "gap-6", 14 + }, 15 + items: { 16 + center: "items-center", 17 + end: "items-end", 18 + start: "items-start", 19 + }, 20 + justify: { 21 + between: "justify-between", 22 + center: "justify-center", 23 + start: "justify-start", 24 + end: "justify-end", 25 + }, 26 + }, 27 + defaultVariants: { 28 + gap: "md", 29 + }, 30 + }); 31 + 32 + type RowProps = React.HTMLAttributes<HTMLDivElement> & 33 + VariantProps<typeof layout>; 34 + 35 + export function Stack({ gap, items, justify, className, ...props }: RowProps) { 36 + return ( 37 + <div 38 + className={cn( 39 + layout({ direction: "vertical", gap, items, justify }), 40 + className, 41 + )} 42 + {...props} 43 + /> 44 + ); 45 + } 46 + 47 + export function Row({ gap, items, justify, className, ...props }: RowProps) { 48 + return ( 49 + <div 50 + className={cn( 51 + layout({ direction: "horizontal", gap, items, justify }), 52 + className, 53 + )} 54 + {...props} 55 + /> 56 + ); 57 + }
+9
src/components/logo.tsx
··· 1 + import { Heading } from "./heading"; 2 + 3 + export function Logo() { 4 + return ( 5 + <Heading level="h3" className="font-semibold"> 6 + cAI ☕ 7 + </Heading> 8 + ); 9 + }
+52
src/components/nav.tsx
··· 1 + import { Link } from "@tanstack/react-router"; 2 + import { Row } from "./layout"; 3 + import { Text } from "./text"; 4 + 5 + const items = [ 6 + { 7 + id: 1, 8 + label: "Home", 9 + to: "/", 10 + }, 11 + { 12 + id: 2, 13 + label: "Chat", 14 + to: "/chats", 15 + }, 16 + ]; 17 + 18 + export function Nav() { 19 + return ( 20 + <nav> 21 + <Row> 22 + {items.map((item) => ( 23 + <NavItem key={item.id} {...item} /> 24 + ))} 25 + </Row> 26 + </nav> 27 + ); 28 + } 29 + 30 + interface NavItemProps { 31 + label: string; 32 + to: string; 33 + } 34 + 35 + function NavItem({ to, label }: NavItemProps) { 36 + return ( 37 + <Link to={to}> 38 + {({ isActive }) => ( 39 + <Text 40 + variant="small" 41 + className={ 42 + isActive 43 + ? "" 44 + : "text-muted-foreground duration-200 hover:text-foreground" 45 + } 46 + > 47 + {label} 48 + </Text> 49 + )} 50 + </Link> 51 + ); 52 + }
+9
src/components/page.tsx
··· 1 + import type { ReactNode } from "react"; 2 + 3 + export function Page({ children }: { children: ReactNode }) { 4 + return ( 5 + <main className="min-h-screen bg-background font-sans text-foreground"> 6 + {children} 7 + </main> 8 + ); 9 + }
+5
src/components/section.tsx
··· 1 + import type { ReactNode } from "react"; 2 + 3 + export function Section({ children }: { children: ReactNode }) { 4 + return <section className="py-12">{children}</section>; 5 + }
+23
src/components/text.tsx
··· 1 + import { cva, type VariantProps } from "class-variance-authority"; 2 + import { cn } from "@/lib/utils"; 3 + 4 + const text = cva("leading-relaxed max-w-prose", { 5 + variants: { 6 + variant: { 7 + body: "text-base", 8 + muted: "text-sm text-muted-foreground", 9 + small: "text-sm", 10 + lead: "text-lg text-muted-foreground", 11 + }, 12 + }, 13 + defaultVariants: { 14 + variant: "body", 15 + }, 16 + }); 17 + 18 + type TextProps = React.HTMLAttributes<HTMLParagraphElement> & 19 + VariantProps<typeof text>; 20 + 21 + export function Text({ variant, className, ...props }: TextProps) { 22 + return <p className={cn(text({ variant }), className)} {...props} />; 23 + }
+56
src/components/ui/button.tsx
··· 1 + import { Button as ButtonPrimitive } from "@base-ui/react/button"; 2 + import { cva, type VariantProps } from "class-variance-authority"; 3 + 4 + import { cn } from "#/lib/utils"; 5 + 6 + const buttonVariants = cva( 7 + "group/button inline-flex shrink-0 items-center justify-center rounded-4xl border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/30 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", 8 + { 9 + variants: { 10 + variant: { 11 + default: "bg-primary text-primary-foreground hover:bg-primary/80", 12 + outline: 13 + "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:bg-transparent dark:hover:bg-input/30", 14 + secondary: 15 + "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground", 16 + ghost: 17 + "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50", 18 + destructive: 19 + "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40", 20 + link: "text-primary underline-offset-4 hover:underline", 21 + }, 22 + size: { 23 + default: 24 + "h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pr-2.5 has-data-[icon=inline-start]:pl-2.5", 25 + xs: "h-6 gap-1 px-2.5 text-xs has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-3", 26 + sm: "h-8 gap-1 px-3 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", 27 + lg: "h-10 gap-1.5 px-4 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3", 28 + icon: "size-9", 29 + "icon-xs": "size-6 [&_svg:not([class*='size-'])]:size-3", 30 + "icon-sm": "size-8", 31 + "icon-lg": "size-10", 32 + }, 33 + }, 34 + defaultVariants: { 35 + variant: "default", 36 + size: "default", 37 + }, 38 + }, 39 + ); 40 + 41 + function Button({ 42 + className, 43 + variant = "default", 44 + size = "default", 45 + ...props 46 + }: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) { 47 + return ( 48 + <ButtonPrimitive 49 + data-slot="button" 50 + className={cn(buttonVariants({ variant, size, className }))} 51 + {...props} 52 + /> 53 + ); 54 + } 55 + 56 + export { Button, buttonVariants };
+269
src/components/ui/dropdown-menu.tsx
··· 1 + import { Menu as MenuPrimitive } from "@base-ui/react/menu"; 2 + import { CheckIcon, ChevronRightIcon } from "lucide-react"; 3 + import type * as React from "react"; 4 + import { cn } from "#/lib/utils"; 5 + 6 + function DropdownMenu({ ...props }: MenuPrimitive.Root.Props) { 7 + return <MenuPrimitive.Root data-slot="dropdown-menu" {...props} />; 8 + } 9 + 10 + function DropdownMenuPortal({ ...props }: MenuPrimitive.Portal.Props) { 11 + return <MenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />; 12 + } 13 + 14 + function DropdownMenuTrigger({ ...props }: MenuPrimitive.Trigger.Props) { 15 + return <MenuPrimitive.Trigger data-slot="dropdown-menu-trigger" {...props} />; 16 + } 17 + 18 + function DropdownMenuContent({ 19 + align = "start", 20 + alignOffset = 0, 21 + side = "bottom", 22 + sideOffset = 4, 23 + className, 24 + ...props 25 + }: MenuPrimitive.Popup.Props & 26 + Pick< 27 + MenuPrimitive.Positioner.Props, 28 + "align" | "alignOffset" | "side" | "sideOffset" 29 + >) { 30 + return ( 31 + <MenuPrimitive.Portal> 32 + <MenuPrimitive.Positioner 33 + className="isolate z-50 outline-none" 34 + align={align} 35 + alignOffset={alignOffset} 36 + side={side} 37 + sideOffset={sideOffset} 38 + > 39 + <MenuPrimitive.Popup 40 + data-slot="dropdown-menu-content" 41 + className={cn( 42 + "data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 z-50 max-h-(--available-height) w-(--anchor-width) min-w-48 origin-(--transform-origin) overflow-y-auto overflow-x-hidden rounded-3xl bg-popover p-1.5 text-popover-foreground shadow-lg outline-none ring-1 ring-foreground/5 duration-100 data-closed:animate-out data-open:animate-in data-closed:overflow-hidden dark:ring-foreground/10", 43 + className, 44 + )} 45 + {...props} 46 + /> 47 + </MenuPrimitive.Positioner> 48 + </MenuPrimitive.Portal> 49 + ); 50 + } 51 + 52 + function DropdownMenuGroup({ ...props }: MenuPrimitive.Group.Props) { 53 + return <MenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />; 54 + } 55 + 56 + function DropdownMenuLabel({ 57 + className, 58 + inset, 59 + ...props 60 + }: MenuPrimitive.GroupLabel.Props & { 61 + inset?: boolean; 62 + }) { 63 + return ( 64 + <MenuPrimitive.GroupLabel 65 + data-slot="dropdown-menu-label" 66 + data-inset={inset} 67 + className={cn( 68 + "px-3 py-2.5 text-muted-foreground text-xs data-inset:pl-9.5", 69 + className, 70 + )} 71 + {...props} 72 + /> 73 + ); 74 + } 75 + 76 + function DropdownMenuItem({ 77 + className, 78 + inset, 79 + variant = "default", 80 + ...props 81 + }: MenuPrimitive.Item.Props & { 82 + inset?: boolean; 83 + variant?: "default" | "destructive"; 84 + }) { 85 + return ( 86 + <MenuPrimitive.Item 87 + data-slot="dropdown-menu-item" 88 + data-inset={inset} 89 + data-variant={variant} 90 + className={cn( 91 + "group/dropdown-menu-item relative flex cursor-default select-none items-center gap-2.5 rounded-2xl px-3 py-2 font-medium text-sm outline-hidden focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-inset:pl-9.5 data-[variant=destructive]:text-destructive data-disabled:opacity-50 data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0 data-[variant=destructive]:*:[svg]:text-destructive", 92 + className, 93 + )} 94 + {...props} 95 + /> 96 + ); 97 + } 98 + 99 + function DropdownMenuSub({ ...props }: MenuPrimitive.SubmenuRoot.Props) { 100 + return <MenuPrimitive.SubmenuRoot data-slot="dropdown-menu-sub" {...props} />; 101 + } 102 + 103 + function DropdownMenuSubTrigger({ 104 + className, 105 + inset, 106 + children, 107 + ...props 108 + }: MenuPrimitive.SubmenuTrigger.Props & { 109 + inset?: boolean; 110 + }) { 111 + return ( 112 + <MenuPrimitive.SubmenuTrigger 113 + data-slot="dropdown-menu-sub-trigger" 114 + data-inset={inset} 115 + className={cn( 116 + "flex cursor-default select-none items-center gap-2 rounded-2xl px-3 py-2 font-medium text-sm outline-hidden focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-open:bg-accent data-popup-open:bg-accent data-inset:pl-9.5 data-open:text-accent-foreground data-popup-open:text-accent-foreground [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", 117 + className, 118 + )} 119 + {...props} 120 + > 121 + {children} 122 + <ChevronRightIcon className="ml-auto" /> 123 + </MenuPrimitive.SubmenuTrigger> 124 + ); 125 + } 126 + 127 + function DropdownMenuSubContent({ 128 + align = "start", 129 + alignOffset = -3, 130 + side = "right", 131 + sideOffset = 0, 132 + className, 133 + ...props 134 + }: React.ComponentProps<typeof DropdownMenuContent>) { 135 + return ( 136 + <DropdownMenuContent 137 + data-slot="dropdown-menu-sub-content" 138 + className={cn( 139 + "data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 w-auto min-w-36 rounded-3xl bg-popover p-1.5 text-popover-foreground shadow-lg ring-1 ring-foreground/5 duration-100 data-closed:animate-out data-open:animate-in dark:ring-foreground/10", 140 + className, 141 + )} 142 + align={align} 143 + alignOffset={alignOffset} 144 + side={side} 145 + sideOffset={sideOffset} 146 + {...props} 147 + /> 148 + ); 149 + } 150 + 151 + function DropdownMenuCheckboxItem({ 152 + className, 153 + children, 154 + checked, 155 + inset, 156 + ...props 157 + }: MenuPrimitive.CheckboxItem.Props & { 158 + inset?: boolean; 159 + }) { 160 + return ( 161 + <MenuPrimitive.CheckboxItem 162 + data-slot="dropdown-menu-checkbox-item" 163 + data-inset={inset} 164 + className={cn( 165 + "relative flex cursor-default select-none items-center gap-2.5 rounded-2xl py-2 pr-8 pl-3 font-medium text-sm outline-hidden focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-disabled:pointer-events-none data-inset:pl-9.5 data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", 166 + className, 167 + )} 168 + checked={checked} 169 + {...props} 170 + > 171 + <span 172 + className="pointer-events-none absolute right-2 flex items-center justify-center" 173 + data-slot="dropdown-menu-checkbox-item-indicator" 174 + > 175 + <MenuPrimitive.CheckboxItemIndicator> 176 + <CheckIcon /> 177 + </MenuPrimitive.CheckboxItemIndicator> 178 + </span> 179 + {children} 180 + </MenuPrimitive.CheckboxItem> 181 + ); 182 + } 183 + 184 + function DropdownMenuRadioGroup({ ...props }: MenuPrimitive.RadioGroup.Props) { 185 + return ( 186 + <MenuPrimitive.RadioGroup 187 + data-slot="dropdown-menu-radio-group" 188 + {...props} 189 + /> 190 + ); 191 + } 192 + 193 + function DropdownMenuRadioItem({ 194 + className, 195 + children, 196 + inset, 197 + ...props 198 + }: MenuPrimitive.RadioItem.Props & { 199 + inset?: boolean; 200 + }) { 201 + return ( 202 + <MenuPrimitive.RadioItem 203 + data-slot="dropdown-menu-radio-item" 204 + data-inset={inset} 205 + className={cn( 206 + "relative flex cursor-default select-none items-center gap-2.5 rounded-2xl py-2 pr-8 pl-3 font-medium text-sm outline-hidden focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-disabled:pointer-events-none data-inset:pl-9.5 data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", 207 + className, 208 + )} 209 + {...props} 210 + > 211 + <span 212 + className="pointer-events-none absolute right-2 flex items-center justify-center" 213 + data-slot="dropdown-menu-radio-item-indicator" 214 + > 215 + <MenuPrimitive.RadioItemIndicator> 216 + <CheckIcon /> 217 + </MenuPrimitive.RadioItemIndicator> 218 + </span> 219 + {children} 220 + </MenuPrimitive.RadioItem> 221 + ); 222 + } 223 + 224 + function DropdownMenuSeparator({ 225 + className, 226 + ...props 227 + }: MenuPrimitive.Separator.Props) { 228 + return ( 229 + <MenuPrimitive.Separator 230 + data-slot="dropdown-menu-separator" 231 + className={cn("-mx-1.5 my-1.5 h-px bg-border/50", className)} 232 + {...props} 233 + /> 234 + ); 235 + } 236 + 237 + function DropdownMenuShortcut({ 238 + className, 239 + ...props 240 + }: React.ComponentProps<"span">) { 241 + return ( 242 + <span 243 + data-slot="dropdown-menu-shortcut" 244 + className={cn( 245 + "ml-auto text-muted-foreground text-xs tracking-widest group-focus/dropdown-menu-item:text-accent-foreground", 246 + className, 247 + )} 248 + {...props} 249 + /> 250 + ); 251 + } 252 + 253 + export { 254 + DropdownMenu, 255 + DropdownMenuCheckboxItem, 256 + DropdownMenuContent, 257 + DropdownMenuGroup, 258 + DropdownMenuItem, 259 + DropdownMenuLabel, 260 + DropdownMenuPortal, 261 + DropdownMenuRadioGroup, 262 + DropdownMenuRadioItem, 263 + DropdownMenuSeparator, 264 + DropdownMenuShortcut, 265 + DropdownMenuSub, 266 + DropdownMenuSubContent, 267 + DropdownMenuSubTrigger, 268 + DropdownMenuTrigger, 269 + };
+20
src/components/ui/input.tsx
··· 1 + import { Input as InputPrimitive } from "@base-ui/react/input"; 2 + import type * as React from "react"; 3 + 4 + import { cn } from "#/lib/utils"; 5 + 6 + function Input({ className, type, ...props }: React.ComponentProps<"input">) { 7 + return ( 8 + <InputPrimitive 9 + type={type} 10 + data-slot="input" 11 + className={cn( 12 + "h-9 w-full min-w-0 rounded-3xl border border-transparent bg-input/50 px-3 py-1 text-base outline-none transition-[color,box-shadow,background-color] file:inline-flex file:h-7 file:border-0 file:bg-transparent file:font-medium file:text-foreground file:text-sm placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/30 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40", 13 + className, 14 + )} 15 + {...props} 16 + /> 17 + ); 18 + } 19 + 20 + export { Input };
+202
src/components/ui/select.tsx
··· 1 + import { Select as SelectPrimitive } from "@base-ui/react/select"; 2 + import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react"; 3 + import type * as React from "react"; 4 + import { cn } from "#/lib/utils"; 5 + 6 + const Select = SelectPrimitive.Root; 7 + 8 + function SelectGroup({ className, ...props }: SelectPrimitive.Group.Props) { 9 + return ( 10 + <SelectPrimitive.Group 11 + data-slot="select-group" 12 + className={cn("scroll-my-1.5 p-1.5", className)} 13 + {...props} 14 + /> 15 + ); 16 + } 17 + 18 + function SelectValue({ className, ...props }: SelectPrimitive.Value.Props) { 19 + return ( 20 + <SelectPrimitive.Value 21 + data-slot="select-value" 22 + className={cn("flex flex-1 text-left", className)} 23 + {...props} 24 + /> 25 + ); 26 + } 27 + 28 + function SelectTrigger({ 29 + className, 30 + size = "default", 31 + children, 32 + ...props 33 + }: SelectPrimitive.Trigger.Props & { 34 + size?: "sm" | "default"; 35 + }) { 36 + return ( 37 + <SelectPrimitive.Trigger 38 + data-slot="select-trigger" 39 + data-size={size} 40 + className={cn( 41 + "flex w-fit items-center justify-between gap-1.5 whitespace-nowrap rounded-3xl border border-transparent bg-input/50 px-3 py-2 text-sm outline-none transition-[color,box-shadow,background-color] focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/30 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-9 data-[size=sm]:h-8 data-placeholder:text-muted-foreground *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", 42 + className, 43 + )} 44 + {...props} 45 + > 46 + {children} 47 + <SelectPrimitive.Icon 48 + render={ 49 + <ChevronDownIcon className="pointer-events-none size-4 text-muted-foreground" /> 50 + } 51 + /> 52 + </SelectPrimitive.Trigger> 53 + ); 54 + } 55 + 56 + function SelectContent({ 57 + className, 58 + children, 59 + side = "bottom", 60 + sideOffset = 4, 61 + align = "center", 62 + alignOffset = 0, 63 + alignItemWithTrigger = true, 64 + ...props 65 + }: SelectPrimitive.Popup.Props & 66 + Pick< 67 + SelectPrimitive.Positioner.Props, 68 + "align" | "alignOffset" | "side" | "sideOffset" | "alignItemWithTrigger" 69 + >) { 70 + return ( 71 + <SelectPrimitive.Portal> 72 + <SelectPrimitive.Positioner 73 + side={side} 74 + sideOffset={sideOffset} 75 + align={align} 76 + alignOffset={alignOffset} 77 + alignItemWithTrigger={alignItemWithTrigger} 78 + className="isolate z-50" 79 + > 80 + <SelectPrimitive.Popup 81 + data-slot="select-content" 82 + data-align-trigger={alignItemWithTrigger} 83 + className={cn( 84 + "data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-y-auto overflow-x-hidden rounded-3xl bg-popover text-popover-foreground shadow-lg ring-1 ring-foreground/5 duration-100 data-[align-trigger=true]:animate-none data-closed:animate-out data-open:animate-in dark:ring-foreground/10", 85 + className, 86 + )} 87 + {...props} 88 + > 89 + <SelectScrollUpButton /> 90 + <SelectPrimitive.List>{children}</SelectPrimitive.List> 91 + <SelectScrollDownButton /> 92 + </SelectPrimitive.Popup> 93 + </SelectPrimitive.Positioner> 94 + </SelectPrimitive.Portal> 95 + ); 96 + } 97 + 98 + function SelectLabel({ 99 + className, 100 + ...props 101 + }: SelectPrimitive.GroupLabel.Props) { 102 + return ( 103 + <SelectPrimitive.GroupLabel 104 + data-slot="select-label" 105 + className={cn("px-3 py-2.5 text-muted-foreground text-xs", className)} 106 + {...props} 107 + /> 108 + ); 109 + } 110 + 111 + function SelectItem({ 112 + className, 113 + children, 114 + ...props 115 + }: SelectPrimitive.Item.Props) { 116 + return ( 117 + <SelectPrimitive.Item 118 + data-slot="select-item" 119 + className={cn( 120 + "relative flex w-full cursor-default select-none items-center gap-2.5 rounded-2xl py-2 pr-8 pl-3 font-medium text-sm outline-hidden focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", 121 + className, 122 + )} 123 + {...props} 124 + > 125 + <SelectPrimitive.ItemText className="flex flex-1 shrink-0 gap-2 whitespace-nowrap"> 126 + {children} 127 + </SelectPrimitive.ItemText> 128 + <SelectPrimitive.ItemIndicator 129 + render={ 130 + <span className="pointer-events-none absolute right-2 flex size-4 items-center justify-center" /> 131 + } 132 + > 133 + <CheckIcon className="pointer-events-none" /> 134 + </SelectPrimitive.ItemIndicator> 135 + </SelectPrimitive.Item> 136 + ); 137 + } 138 + 139 + function SelectSeparator({ 140 + className, 141 + ...props 142 + }: SelectPrimitive.Separator.Props) { 143 + return ( 144 + <SelectPrimitive.Separator 145 + data-slot="select-separator" 146 + className={cn( 147 + "pointer-events-none -mx-1.5 my-1.5 h-px bg-border", 148 + className, 149 + )} 150 + {...props} 151 + /> 152 + ); 153 + } 154 + 155 + function SelectScrollUpButton({ 156 + className, 157 + ...props 158 + }: React.ComponentProps<typeof SelectPrimitive.ScrollUpArrow>) { 159 + return ( 160 + <SelectPrimitive.ScrollUpArrow 161 + data-slot="select-scroll-up-button" 162 + className={cn( 163 + "top-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4", 164 + className, 165 + )} 166 + {...props} 167 + > 168 + <ChevronUpIcon /> 169 + </SelectPrimitive.ScrollUpArrow> 170 + ); 171 + } 172 + 173 + function SelectScrollDownButton({ 174 + className, 175 + ...props 176 + }: React.ComponentProps<typeof SelectPrimitive.ScrollDownArrow>) { 177 + return ( 178 + <SelectPrimitive.ScrollDownArrow 179 + data-slot="select-scroll-down-button" 180 + className={cn( 181 + "bottom-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4", 182 + className, 183 + )} 184 + {...props} 185 + > 186 + <ChevronDownIcon /> 187 + </SelectPrimitive.ScrollDownArrow> 188 + ); 189 + } 190 + 191 + export { 192 + Select, 193 + SelectContent, 194 + SelectGroup, 195 + SelectItem, 196 + SelectLabel, 197 + SelectScrollDownButton, 198 + SelectScrollUpButton, 199 + SelectSeparator, 200 + SelectTrigger, 201 + SelectValue, 202 + };
+23
src/components/ui/separator.tsx
··· 1 + import { Separator as SeparatorPrimitive } from "@base-ui/react/separator"; 2 + 3 + import { cn } from "#/lib/utils"; 4 + 5 + function Separator({ 6 + className, 7 + orientation = "horizontal", 8 + ...props 9 + }: SeparatorPrimitive.Props) { 10 + return ( 11 + <SeparatorPrimitive 12 + data-slot="separator" 13 + orientation={orientation} 14 + className={cn( 15 + "shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch", 16 + className, 17 + )} 18 + {...props} 19 + /> 20 + ); 21 + } 22 + 23 + export { Separator };
+134
src/components/ui/sheet.tsx
··· 1 + import { Dialog as SheetPrimitive } from "@base-ui/react/dialog"; 2 + import { XIcon } from "lucide-react"; 3 + import type * as React from "react"; 4 + import { Button } from "#/components/ui/button"; 5 + import { cn } from "#/lib/utils"; 6 + 7 + function Sheet({ ...props }: SheetPrimitive.Root.Props) { 8 + return <SheetPrimitive.Root data-slot="sheet" {...props} />; 9 + } 10 + 11 + function SheetTrigger({ ...props }: SheetPrimitive.Trigger.Props) { 12 + return <SheetPrimitive.Trigger data-slot="sheet-trigger" {...props} />; 13 + } 14 + 15 + function SheetClose({ ...props }: SheetPrimitive.Close.Props) { 16 + return <SheetPrimitive.Close data-slot="sheet-close" {...props} />; 17 + } 18 + 19 + function SheetPortal({ ...props }: SheetPrimitive.Portal.Props) { 20 + return <SheetPrimitive.Portal data-slot="sheet-portal" {...props} />; 21 + } 22 + 23 + function SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) { 24 + return ( 25 + <SheetPrimitive.Backdrop 26 + data-slot="sheet-overlay" 27 + className={cn( 28 + "fixed inset-0 z-50 bg-black/30 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-sm", 29 + className, 30 + )} 31 + {...props} 32 + /> 33 + ); 34 + } 35 + 36 + function SheetContent({ 37 + className, 38 + children, 39 + side = "right", 40 + showCloseButton = true, 41 + ...props 42 + }: SheetPrimitive.Popup.Props & { 43 + side?: "top" | "right" | "bottom" | "left"; 44 + showCloseButton?: boolean; 45 + }) { 46 + return ( 47 + <SheetPortal> 48 + <SheetOverlay /> 49 + <SheetPrimitive.Popup 50 + data-slot="sheet-content" 51 + data-side={side} 52 + className={cn( 53 + "fixed z-50 flex flex-col bg-popover bg-clip-padding text-popover-foreground text-sm shadow-xl transition duration-200 ease-in-out data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=bottom]:inset-x-0 data-[side=top]:inset-x-0 data-[side=left]:inset-y-0 data-[side=right]:inset-y-0 data-[side=top]:top-0 data-[side=right]:right-0 data-[side=bottom]:bottom-0 data-[side=left]:left-0 data-[side=bottom]:h-auto data-[side=left]:h-full data-[side=right]:h-full data-[side=top]:h-auto data-[side=left]:w-3/4 data-[side=right]:w-3/4 data-[side=bottom]:border-t data-[side=left]:border-r data-[side=top]:border-b data-[side=right]:border-l data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm", 54 + className, 55 + )} 56 + {...props} 57 + > 58 + {children} 59 + {showCloseButton && ( 60 + <SheetPrimitive.Close 61 + data-slot="sheet-close" 62 + render={ 63 + <Button 64 + variant="ghost" 65 + className="absolute top-4 right-4 bg-secondary" 66 + size="icon-sm" 67 + /> 68 + } 69 + > 70 + <XIcon /> 71 + <span className="sr-only">Close</span> 72 + </SheetPrimitive.Close> 73 + )} 74 + </SheetPrimitive.Popup> 75 + </SheetPortal> 76 + ); 77 + } 78 + 79 + function SheetHeader({ className, ...props }: React.ComponentProps<"div">) { 80 + return ( 81 + <div 82 + data-slot="sheet-header" 83 + className={cn("flex flex-col gap-1.5 p-6", className)} 84 + {...props} 85 + /> 86 + ); 87 + } 88 + 89 + function SheetFooter({ className, ...props }: React.ComponentProps<"div">) { 90 + return ( 91 + <div 92 + data-slot="sheet-footer" 93 + className={cn("mt-auto flex flex-col gap-2 p-6", className)} 94 + {...props} 95 + /> 96 + ); 97 + } 98 + 99 + function SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) { 100 + return ( 101 + <SheetPrimitive.Title 102 + data-slot="sheet-title" 103 + className={cn( 104 + "font-heading font-medium text-base text-foreground", 105 + className, 106 + )} 107 + {...props} 108 + /> 109 + ); 110 + } 111 + 112 + function SheetDescription({ 113 + className, 114 + ...props 115 + }: SheetPrimitive.Description.Props) { 116 + return ( 117 + <SheetPrimitive.Description 118 + data-slot="sheet-description" 119 + className={cn("text-muted-foreground text-sm", className)} 120 + {...props} 121 + /> 122 + ); 123 + } 124 + 125 + export { 126 + Sheet, 127 + SheetClose, 128 + SheetContent, 129 + SheetDescription, 130 + SheetFooter, 131 + SheetHeader, 132 + SheetTitle, 133 + SheetTrigger, 134 + };
+757
src/components/ui/sidebar.tsx
··· 1 + "use client"; 2 + 3 + import { mergeProps } from "@base-ui/react/merge-props"; 4 + import { useRender } from "@base-ui/react/use-render"; 5 + import { cva, type VariantProps } from "class-variance-authority"; 6 + import { PanelLeftIcon } from "lucide-react"; 7 + import * as React from "react"; 8 + import { Button } from "#/components/ui/button"; 9 + import { Input } from "#/components/ui/input"; 10 + import { Separator } from "#/components/ui/separator"; 11 + import { 12 + Sheet, 13 + SheetContent, 14 + SheetDescription, 15 + SheetHeader, 16 + SheetTitle, 17 + } from "#/components/ui/sheet"; 18 + import { Skeleton } from "#/components/ui/skeleton"; 19 + import { 20 + Tooltip, 21 + TooltipContent, 22 + TooltipTrigger, 23 + } from "#/components/ui/tooltip"; 24 + import { useIsMobile } from "#/hooks/use-mobile"; 25 + import { cn } from "#/lib/utils"; 26 + 27 + const SIDEBAR_COOKIE_NAME = "sidebar_state"; 28 + const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7; 29 + const SIDEBAR_WIDTH = "16rem"; 30 + const SIDEBAR_WIDTH_MOBILE = "18rem"; 31 + const SIDEBAR_WIDTH_ICON = "3rem"; 32 + const SIDEBAR_KEYBOARD_SHORTCUT = "b"; 33 + 34 + type CookieStoreLike = { 35 + set: (options: { 36 + name: string; 37 + value: string; 38 + path?: string; 39 + expires?: number; 40 + }) => Promise<void>; 41 + }; 42 + 43 + function setSidebarCookie(open: boolean) { 44 + const value = String(open); 45 + const cookieStore = (globalThis as { cookieStore?: CookieStoreLike }) 46 + .cookieStore; 47 + 48 + if (cookieStore) { 49 + void cookieStore.set({ 50 + name: SIDEBAR_COOKIE_NAME, 51 + value, 52 + path: "/", 53 + expires: Date.now() + SIDEBAR_COOKIE_MAX_AGE * 1000, 54 + }); 55 + return; 56 + } 57 + 58 + const cookie = `${SIDEBAR_COOKIE_NAME}=${value}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`; 59 + const cookieDescriptor = 60 + Object.getOwnPropertyDescriptor(Document.prototype, "cookie") ?? 61 + Object.getOwnPropertyDescriptor(HTMLDocument.prototype, "cookie"); 62 + 63 + cookieDescriptor?.set?.call(document, cookie); 64 + } 65 + 66 + type SidebarContextProps = { 67 + state: "expanded" | "collapsed"; 68 + open: boolean; 69 + setOpen: (open: boolean) => void; 70 + openMobile: boolean; 71 + setOpenMobile: (open: boolean) => void; 72 + isMobile: boolean; 73 + toggleSidebar: () => void; 74 + }; 75 + 76 + const SidebarContext = React.createContext<SidebarContextProps | null>(null); 77 + 78 + function useSidebar() { 79 + const context = React.useContext(SidebarContext); 80 + if (!context) { 81 + throw new Error("useSidebar must be used within a SidebarProvider."); 82 + } 83 + 84 + return context; 85 + } 86 + 87 + function SidebarProvider({ 88 + defaultOpen = true, 89 + open: openProp, 90 + onOpenChange: setOpenProp, 91 + className, 92 + style, 93 + children, 94 + ...props 95 + }: React.ComponentProps<"div"> & { 96 + defaultOpen?: boolean; 97 + open?: boolean; 98 + onOpenChange?: (open: boolean) => void; 99 + }) { 100 + const isMobile = useIsMobile(); 101 + const [openMobile, setOpenMobile] = React.useState(false); 102 + 103 + // This is the internal state of the sidebar. 104 + // We use openProp and setOpenProp for control from outside the component. 105 + const [_open, _setOpen] = React.useState(defaultOpen); 106 + const open = openProp ?? _open; 107 + const setOpen = React.useCallback( 108 + (value: boolean | ((value: boolean) => boolean)) => { 109 + const openState = typeof value === "function" ? value(open) : value; 110 + if (setOpenProp) { 111 + setOpenProp(openState); 112 + } else { 113 + _setOpen(openState); 114 + } 115 + 116 + // This sets the cookie to keep the sidebar state. 117 + setSidebarCookie(openState); 118 + }, 119 + [setOpenProp, open], 120 + ); 121 + 122 + // Helper to toggle the sidebar. 123 + const toggleSidebar = React.useCallback(() => { 124 + return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open); 125 + }, [isMobile, setOpen]); 126 + 127 + // Adds a keyboard shortcut to toggle the sidebar. 128 + React.useEffect(() => { 129 + const handleKeyDown = (event: KeyboardEvent) => { 130 + if ( 131 + event.key === SIDEBAR_KEYBOARD_SHORTCUT && 132 + (event.metaKey || event.ctrlKey) 133 + ) { 134 + event.preventDefault(); 135 + toggleSidebar(); 136 + } 137 + }; 138 + 139 + window.addEventListener("keydown", handleKeyDown); 140 + return () => window.removeEventListener("keydown", handleKeyDown); 141 + }, [toggleSidebar]); 142 + 143 + // We add a state so that we can do data-state="expanded" or "collapsed". 144 + // This makes it easier to style the sidebar with Tailwind classes. 145 + const state = open ? "expanded" : "collapsed"; 146 + 147 + const contextValue = React.useMemo<SidebarContextProps>( 148 + () => ({ 149 + state, 150 + open, 151 + setOpen, 152 + isMobile, 153 + openMobile, 154 + setOpenMobile, 155 + toggleSidebar, 156 + }), 157 + [state, open, setOpen, isMobile, openMobile, toggleSidebar], 158 + ); 159 + 160 + return ( 161 + <SidebarContext.Provider value={contextValue}> 162 + <div 163 + data-slot="sidebar-wrapper" 164 + style={ 165 + { 166 + "--sidebar-width": SIDEBAR_WIDTH, 167 + "--sidebar-width-icon": SIDEBAR_WIDTH_ICON, 168 + ...style, 169 + } as React.CSSProperties 170 + } 171 + className={cn( 172 + "group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar", 173 + className, 174 + )} 175 + {...props} 176 + > 177 + {children} 178 + </div> 179 + </SidebarContext.Provider> 180 + ); 181 + } 182 + 183 + function Sidebar({ 184 + side = "left", 185 + variant = "sidebar", 186 + collapsible = "offcanvas", 187 + className, 188 + children, 189 + dir, 190 + ...props 191 + }: React.ComponentProps<"div"> & { 192 + side?: "left" | "right"; 193 + variant?: "sidebar" | "floating" | "inset"; 194 + collapsible?: "offcanvas" | "icon" | "none"; 195 + }) { 196 + const { isMobile, state, openMobile, setOpenMobile } = useSidebar(); 197 + 198 + if (collapsible === "none") { 199 + return ( 200 + <div 201 + data-slot="sidebar" 202 + className={cn( 203 + "flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground", 204 + className, 205 + )} 206 + {...props} 207 + > 208 + {children} 209 + </div> 210 + ); 211 + } 212 + 213 + if (isMobile) { 214 + return ( 215 + <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}> 216 + <SheetContent 217 + dir={dir} 218 + data-sidebar="sidebar" 219 + data-slot="sidebar" 220 + data-mobile="true" 221 + className="w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden" 222 + style={ 223 + { 224 + "--sidebar-width": SIDEBAR_WIDTH_MOBILE, 225 + } as React.CSSProperties 226 + } 227 + side={side} 228 + > 229 + <SheetHeader className="sr-only"> 230 + <SheetTitle>Sidebar</SheetTitle> 231 + <SheetDescription>Displays the mobile sidebar.</SheetDescription> 232 + </SheetHeader> 233 + <div className="flex h-full w-full flex-col">{children}</div> 234 + </SheetContent> 235 + </Sheet> 236 + ); 237 + } 238 + 239 + return ( 240 + <div 241 + className="group peer hidden text-sidebar-foreground md:block" 242 + data-state={state} 243 + data-collapsible={state === "collapsed" ? collapsible : ""} 244 + data-variant={variant} 245 + data-side={side} 246 + data-slot="sidebar" 247 + > 248 + {/* This is what handles the sidebar gap on desktop */} 249 + <div 250 + data-slot="sidebar-gap" 251 + className={cn( 252 + "relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear", 253 + "group-data-[collapsible=offcanvas]:w-0", 254 + "group-data-[side=right]:rotate-180", 255 + variant === "floating" || variant === "inset" 256 + ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" 257 + : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)", 258 + )} 259 + /> 260 + <div 261 + data-slot="sidebar-container" 262 + data-side={side} 263 + className={cn( 264 + "fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=right]:right-0 data-[side=left]:left-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] md:flex", 265 + // Adjust the padding for floating and inset variants. 266 + variant === "floating" || variant === "inset" 267 + ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" 268 + : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l", 269 + className, 270 + )} 271 + {...props} 272 + > 273 + <div 274 + data-sidebar="sidebar" 275 + data-slot="sidebar-inner" 276 + className="flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-2xl group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border" 277 + > 278 + {children} 279 + </div> 280 + </div> 281 + </div> 282 + ); 283 + } 284 + 285 + function SidebarTrigger({ 286 + className, 287 + onClick, 288 + ...props 289 + }: React.ComponentProps<typeof Button>) { 290 + const { toggleSidebar } = useSidebar(); 291 + 292 + return ( 293 + <Button 294 + data-sidebar="trigger" 295 + data-slot="sidebar-trigger" 296 + variant="ghost" 297 + size="icon-sm" 298 + className={cn(className)} 299 + onClick={(event) => { 300 + onClick?.(event); 301 + toggleSidebar(); 302 + }} 303 + {...props} 304 + > 305 + <PanelLeftIcon /> 306 + <span className="sr-only">Toggle Sidebar</span> 307 + </Button> 308 + ); 309 + } 310 + 311 + function SidebarRail({ className, ...props }: React.ComponentProps<"button">) { 312 + const { toggleSidebar } = useSidebar(); 313 + 314 + return ( 315 + <button 316 + data-sidebar="rail" 317 + data-slot="sidebar-rail" 318 + aria-label="Toggle Sidebar" 319 + tabIndex={-1} 320 + onClick={toggleSidebar} 321 + title="Toggle Sidebar" 322 + className={cn( 323 + "absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2", 324 + "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize", 325 + "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize", 326 + "group-data-[collapsible=offcanvas]:translate-x-0 hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:after:left-full", 327 + "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", 328 + "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", 329 + className, 330 + )} 331 + {...props} 332 + /> 333 + ); 334 + } 335 + 336 + function SidebarInset({ className, ...props }: React.ComponentProps<"main">) { 337 + return ( 338 + <main 339 + data-slot="sidebar-inset" 340 + className={cn( 341 + "relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2 md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-2xl md:peer-data-[variant=inset]:shadow-sm", 342 + className, 343 + )} 344 + {...props} 345 + /> 346 + ); 347 + } 348 + 349 + function SidebarInput({ 350 + className, 351 + ...props 352 + }: React.ComponentProps<typeof Input>) { 353 + return ( 354 + <Input 355 + data-slot="sidebar-input" 356 + data-sidebar="input" 357 + className={cn("h-8 w-full bg-input/50 shadow-none", className)} 358 + {...props} 359 + /> 360 + ); 361 + } 362 + 363 + function SidebarHeader({ className, ...props }: React.ComponentProps<"div">) { 364 + return ( 365 + <div 366 + data-slot="sidebar-header" 367 + data-sidebar="header" 368 + className={cn( 369 + "flex flex-col gap-2 p-2 [--radius:var(--radius-xl)]", 370 + className, 371 + )} 372 + {...props} 373 + /> 374 + ); 375 + } 376 + 377 + function SidebarFooter({ className, ...props }: React.ComponentProps<"div">) { 378 + return ( 379 + <div 380 + data-slot="sidebar-footer" 381 + data-sidebar="footer" 382 + className={cn("flex flex-col gap-2 p-2", className)} 383 + {...props} 384 + /> 385 + ); 386 + } 387 + 388 + function SidebarSeparator({ 389 + className, 390 + ...props 391 + }: React.ComponentProps<typeof Separator>) { 392 + return ( 393 + <Separator 394 + data-slot="sidebar-separator" 395 + data-sidebar="separator" 396 + className={cn("mx-2 w-auto bg-sidebar-border", className)} 397 + {...props} 398 + /> 399 + ); 400 + } 401 + 402 + function SidebarContent({ className, ...props }: React.ComponentProps<"div">) { 403 + return ( 404 + <div 405 + data-slot="sidebar-content" 406 + data-sidebar="content" 407 + className={cn( 408 + "no-scrollbar flex min-h-0 flex-1 flex-col gap-2 overflow-auto [--radius:var(--radius-xl)] group-data-[collapsible=icon]:overflow-hidden", 409 + className, 410 + )} 411 + {...props} 412 + /> 413 + ); 414 + } 415 + 416 + function SidebarGroup({ className, ...props }: React.ComponentProps<"div">) { 417 + return ( 418 + <div 419 + data-slot="sidebar-group" 420 + data-sidebar="group" 421 + className={cn("relative flex w-full min-w-0 flex-col p-2", className)} 422 + {...props} 423 + /> 424 + ); 425 + } 426 + 427 + function SidebarGroupLabel({ 428 + className, 429 + render, 430 + ...props 431 + }: useRender.ComponentProps<"div"> & React.ComponentProps<"div">) { 432 + return useRender({ 433 + defaultTagName: "div", 434 + props: mergeProps<"div">( 435 + { 436 + className: cn( 437 + "flex h-8 shrink-0 items-center rounded-xl px-3 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", 438 + className, 439 + ), 440 + }, 441 + props, 442 + ), 443 + render, 444 + state: { 445 + slot: "sidebar-group-label", 446 + sidebar: "group-label", 447 + }, 448 + }); 449 + } 450 + 451 + function SidebarGroupAction({ 452 + className, 453 + render, 454 + ...props 455 + }: useRender.ComponentProps<"button"> & React.ComponentProps<"button">) { 456 + return useRender({ 457 + defaultTagName: "button", 458 + props: mergeProps<"button">( 459 + { 460 + className: cn( 461 + "absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-xl p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0", 462 + className, 463 + ), 464 + }, 465 + props, 466 + ), 467 + render, 468 + state: { 469 + slot: "sidebar-group-action", 470 + sidebar: "group-action", 471 + }, 472 + }); 473 + } 474 + 475 + function SidebarGroupContent({ 476 + className, 477 + ...props 478 + }: React.ComponentProps<"div">) { 479 + return ( 480 + <div 481 + data-slot="sidebar-group-content" 482 + data-sidebar="group-content" 483 + className={cn("w-full text-sm", className)} 484 + {...props} 485 + /> 486 + ); 487 + } 488 + 489 + function SidebarMenu({ className, ...props }: React.ComponentProps<"ul">) { 490 + return ( 491 + <ul 492 + data-slot="sidebar-menu" 493 + data-sidebar="menu" 494 + className={cn("flex w-full min-w-0 flex-col gap-0.5", className)} 495 + {...props} 496 + /> 497 + ); 498 + } 499 + 500 + function SidebarMenuItem({ className, ...props }: React.ComponentProps<"li">) { 501 + return ( 502 + <li 503 + data-slot="sidebar-menu-item" 504 + data-sidebar="menu-item" 505 + className={cn("group/menu-item relative", className)} 506 + {...props} 507 + /> 508 + ); 509 + } 510 + 511 + const sidebarMenuButtonVariants = cva( 512 + "peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-xl px-3 py-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate", 513 + { 514 + variants: { 515 + variant: { 516 + default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", 517 + outline: 518 + "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]", 519 + }, 520 + size: { 521 + default: "h-9 text-sm", 522 + sm: "h-8 text-xs", 523 + lg: "h-14 px-3 text-sm group-data-[collapsible=icon]:p-0!", 524 + }, 525 + }, 526 + defaultVariants: { 527 + variant: "default", 528 + size: "default", 529 + }, 530 + }, 531 + ); 532 + 533 + function SidebarMenuButton({ 534 + render, 535 + isActive = false, 536 + variant = "default", 537 + size = "default", 538 + tooltip, 539 + className, 540 + ...props 541 + }: useRender.ComponentProps<"button"> & 542 + React.ComponentProps<"button"> & { 543 + isActive?: boolean; 544 + tooltip?: string | React.ComponentProps<typeof TooltipContent>; 545 + } & VariantProps<typeof sidebarMenuButtonVariants>) { 546 + const { isMobile, state } = useSidebar(); 547 + const comp = useRender({ 548 + defaultTagName: "button", 549 + props: mergeProps<"button">( 550 + { 551 + className: cn(sidebarMenuButtonVariants({ variant, size }), className), 552 + }, 553 + props, 554 + ), 555 + render: !tooltip ? render : <TooltipTrigger render={render} />, 556 + state: { 557 + slot: "sidebar-menu-button", 558 + sidebar: "menu-button", 559 + size, 560 + active: isActive, 561 + }, 562 + }); 563 + 564 + if (!tooltip) { 565 + return comp; 566 + } 567 + 568 + if (typeof tooltip === "string") { 569 + tooltip = { 570 + children: tooltip, 571 + }; 572 + } 573 + 574 + return ( 575 + <Tooltip> 576 + {comp} 577 + <TooltipContent 578 + side="right" 579 + align="center" 580 + hidden={state !== "collapsed" || isMobile} 581 + {...tooltip} 582 + /> 583 + </Tooltip> 584 + ); 585 + } 586 + 587 + function SidebarMenuAction({ 588 + className, 589 + render, 590 + showOnHover = false, 591 + ...props 592 + }: useRender.ComponentProps<"button"> & 593 + React.ComponentProps<"button"> & { 594 + showOnHover?: boolean; 595 + }) { 596 + return useRender({ 597 + defaultTagName: "button", 598 + props: mergeProps<"button">( 599 + { 600 + className: cn( 601 + "absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-xl p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-2 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0", 602 + showOnHover && 603 + "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0", 604 + className, 605 + ), 606 + }, 607 + props, 608 + ), 609 + render, 610 + state: { 611 + slot: "sidebar-menu-action", 612 + sidebar: "menu-action", 613 + }, 614 + }); 615 + } 616 + 617 + function SidebarMenuBadge({ 618 + className, 619 + ...props 620 + }: React.ComponentProps<"div">) { 621 + return ( 622 + <div 623 + data-slot="sidebar-menu-badge" 624 + data-sidebar="menu-badge" 625 + className={cn( 626 + "pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-xl px-1 font-medium text-sidebar-foreground text-xs tabular-nums peer-hover/menu-button:text-sidebar-accent-foreground group-data-[collapsible=icon]:hidden peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground", 627 + className, 628 + )} 629 + {...props} 630 + /> 631 + ); 632 + } 633 + 634 + function SidebarMenuSkeleton({ 635 + className, 636 + showIcon = false, 637 + ...props 638 + }: React.ComponentProps<"div"> & { 639 + showIcon?: boolean; 640 + }) { 641 + // Random width between 50 to 90%. 642 + const [width] = React.useState(() => { 643 + return `${Math.floor(Math.random() * 40) + 50}%`; 644 + }); 645 + 646 + return ( 647 + <div 648 + data-slot="sidebar-menu-skeleton" 649 + data-sidebar="menu-skeleton" 650 + className={cn("flex h-8 items-center gap-2 rounded-xl px-2", className)} 651 + {...props} 652 + > 653 + {showIcon && ( 654 + <Skeleton 655 + className="size-4 rounded-xl" 656 + data-sidebar="menu-skeleton-icon" 657 + /> 658 + )} 659 + <Skeleton 660 + className="h-4 max-w-(--skeleton-width) flex-1" 661 + data-sidebar="menu-skeleton-text" 662 + style={ 663 + { 664 + "--skeleton-width": width, 665 + } as React.CSSProperties 666 + } 667 + /> 668 + </div> 669 + ); 670 + } 671 + 672 + function SidebarMenuSub({ className, ...props }: React.ComponentProps<"ul">) { 673 + return ( 674 + <ul 675 + data-slot="sidebar-menu-sub" 676 + data-sidebar="menu-sub" 677 + className={cn( 678 + "mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-sidebar-border border-l px-2.5 py-0.5 group-data-[collapsible=icon]:hidden", 679 + className, 680 + )} 681 + {...props} 682 + /> 683 + ); 684 + } 685 + 686 + function SidebarMenuSubItem({ 687 + className, 688 + ...props 689 + }: React.ComponentProps<"li">) { 690 + return ( 691 + <li 692 + data-slot="sidebar-menu-sub-item" 693 + data-sidebar="menu-sub-item" 694 + className={cn("group/menu-sub-item relative", className)} 695 + {...props} 696 + /> 697 + ); 698 + } 699 + 700 + function SidebarMenuSubButton({ 701 + render, 702 + size = "md", 703 + isActive = false, 704 + className, 705 + ...props 706 + }: useRender.ComponentProps<"a"> & 707 + React.ComponentProps<"a"> & { 708 + size?: "sm" | "md"; 709 + isActive?: boolean; 710 + }) { 711 + return useRender({ 712 + defaultTagName: "a", 713 + props: mergeProps<"a">( 714 + { 715 + className: cn( 716 + "flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-xl px-3 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground", 717 + className, 718 + ), 719 + }, 720 + props, 721 + ), 722 + render, 723 + state: { 724 + slot: "sidebar-menu-sub-button", 725 + sidebar: "menu-sub-button", 726 + size, 727 + active: isActive, 728 + }, 729 + }); 730 + } 731 + 732 + export { 733 + Sidebar, 734 + SidebarContent, 735 + SidebarFooter, 736 + SidebarGroup, 737 + SidebarGroupAction, 738 + SidebarGroupContent, 739 + SidebarGroupLabel, 740 + SidebarHeader, 741 + SidebarInput, 742 + SidebarInset, 743 + SidebarMenu, 744 + SidebarMenuAction, 745 + SidebarMenuBadge, 746 + SidebarMenuButton, 747 + SidebarMenuItem, 748 + SidebarMenuSkeleton, 749 + SidebarMenuSub, 750 + SidebarMenuSubButton, 751 + SidebarMenuSubItem, 752 + SidebarProvider, 753 + SidebarRail, 754 + SidebarSeparator, 755 + SidebarTrigger, 756 + useSidebar, 757 + };
+13
src/components/ui/skeleton.tsx
··· 1 + import { cn } from "#/lib/utils"; 2 + 3 + function Skeleton({ className, ...props }: React.ComponentProps<"div">) { 4 + return ( 5 + <div 6 + data-slot="skeleton" 7 + className={cn("animate-pulse rounded-2xl bg-muted", className)} 8 + {...props} 9 + /> 10 + ); 11 + } 12 + 13 + export { Skeleton };
+18
src/components/ui/textarea.tsx
··· 1 + import type * as React from "react"; 2 + 3 + import { cn } from "#/lib/utils"; 4 + 5 + function Textarea({ className, ...props }: React.ComponentProps<"textarea">) { 6 + return ( 7 + <textarea 8 + data-slot="textarea" 9 + className={cn( 10 + "field-sizing-content flex min-h-16 w-full resize-none rounded-2xl border border-transparent bg-input/50 px-3 py-3 text-base outline-none transition-[color,box-shadow,background-color] placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/30 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40", 11 + className, 12 + )} 13 + {...props} 14 + /> 15 + ); 16 + } 17 + 18 + export { Textarea };
+66
src/components/ui/tooltip.tsx
··· 1 + "use client"; 2 + 3 + import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip"; 4 + 5 + import { cn } from "#/lib/utils"; 6 + 7 + function TooltipProvider({ 8 + delay = 0, 9 + ...props 10 + }: TooltipPrimitive.Provider.Props) { 11 + return ( 12 + <TooltipPrimitive.Provider 13 + data-slot="tooltip-provider" 14 + delay={delay} 15 + {...props} 16 + /> 17 + ); 18 + } 19 + 20 + function Tooltip({ ...props }: TooltipPrimitive.Root.Props) { 21 + return <TooltipPrimitive.Root data-slot="tooltip" {...props} />; 22 + } 23 + 24 + function TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) { 25 + return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />; 26 + } 27 + 28 + function TooltipContent({ 29 + className, 30 + side = "top", 31 + sideOffset = 4, 32 + align = "center", 33 + alignOffset = 0, 34 + children, 35 + ...props 36 + }: TooltipPrimitive.Popup.Props & 37 + Pick< 38 + TooltipPrimitive.Positioner.Props, 39 + "align" | "alignOffset" | "side" | "sideOffset" 40 + >) { 41 + return ( 42 + <TooltipPrimitive.Portal> 43 + <TooltipPrimitive.Positioner 44 + align={align} 45 + alignOffset={alignOffset} 46 + side={side} 47 + sideOffset={sideOffset} 48 + className="isolate z-50" 49 + > 50 + <TooltipPrimitive.Popup 51 + data-slot="tooltip-content" 52 + className={cn( 53 + "data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-xl bg-foreground px-3 py-1.5 text-background text-xs has-data-[slot=kbd]:pr-1.5 data-[state=delayed-open]:animate-in data-closed:animate-out data-open:animate-in **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-lg", 54 + className, 55 + )} 56 + {...props} 57 + > 58 + {children} 59 + <TooltipPrimitive.Arrow className="z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-start]:top-1/2! data-[side=left]:top-1/2! data-[side=right]:top-1/2! data-[side=inline-start]:-right-1 data-[side=left]:-right-1 data-[side=top]:-bottom-2.5 data-[side=inline-end]:-left-1 data-[side=right]:-left-1 data-[side=inline-end]:translate-x-[1.5px] data-[side=inline-start]:translate-x-[-1.5px] data-[side=left]:translate-x-[-1.5px] data-[side=right]:translate-x-[1.5px] data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:-translate-y-1/2 data-[side=right]:-translate-y-1/2" /> 60 + </TooltipPrimitive.Popup> 61 + </TooltipPrimitive.Positioner> 62 + </TooltipPrimitive.Portal> 63 + ); 64 + } 65 + 66 + export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
+11
src/hooks/use-characters.ts
··· 1 + import { useQuery } from "@tanstack/react-query"; 2 + import { characters } from "#/lib/mock"; 3 + 4 + export function useCharacters() { 5 + return useQuery({ 6 + queryKey: ["characters"], 7 + queryFn: () => { 8 + return characters; 9 + }, 10 + }); 11 + }
+22
src/hooks/use-chat.ts
··· 1 + import { useQuery } from "@tanstack/react-query"; 2 + import { chats } from "#/lib/mock"; 3 + 4 + interface UseChatOptions { 5 + id: string; 6 + } 7 + 8 + export function useChat({ id }: UseChatOptions) { 9 + const chatQuery = useQuery({ 10 + queryKey: ["chat", id], 11 + queryFn: () => { 12 + return chats.find((chat) => chat.id === id); 13 + }, 14 + }); 15 + 16 + return { 17 + chat: chatQuery.data, 18 + messages: chatQuery.data?.messages ?? [], 19 + isLoading: chatQuery.isLoading, 20 + isError: chatQuery.isError, 21 + }; 22 + }
+14
src/hooks/use-chats.ts
··· 1 + import { useQuery } from "@tanstack/react-query"; 2 + import { chats } from "#/lib/mock"; 3 + 4 + export function useChats() { 5 + return useQuery({ 6 + queryKey: ["chats"], 7 + queryFn: () => { 8 + return chats.map((chat) => { 9 + const { messages, ...chatWithoutMessages } = chat; 10 + return chatWithoutMessages; 11 + }); 12 + }, 13 + }); 14 + }
+21
src/hooks/use-mobile.ts
··· 1 + import * as React from "react"; 2 + 3 + const MOBILE_BREAKPOINT = 768; 4 + 5 + export function useIsMobile() { 6 + const [isMobile, setIsMobile] = React.useState<boolean | undefined>( 7 + undefined, 8 + ); 9 + 10 + React.useEffect(() => { 11 + const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`); 12 + const onChange = () => { 13 + setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); 14 + }; 15 + mql.addEventListener("change", onChange); 16 + setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); 17 + return () => mql.removeEventListener("change", onChange); 18 + }, []); 19 + 20 + return !!isMobile; 21 + }
+49
src/lib/mock.ts
··· 1 + import type { Character, Chat } from "./types"; 2 + 3 + export const characters: Character[] = [ 4 + { 5 + id: "1", 6 + name: "Katsune", 7 + }, 8 + { 9 + id: "2", 10 + name: "Neko", 11 + }, 12 + ]; 13 + 14 + export const chats: Chat[] = [ 15 + { 16 + id: "1", 17 + title: "Hello", 18 + character: characters[0], 19 + messages: [ 20 + { 21 + id: "1", 22 + author: "user", 23 + text: "Hello!", 24 + }, 25 + { 26 + id: "2", 27 + author: "assistant", 28 + text: "hello! :3", 29 + }, 30 + ], 31 + }, 32 + { 33 + id: "2", 34 + title: "Kia ora", 35 + character: characters[1], 36 + messages: [ 37 + { 38 + id: "3", 39 + author: "user", 40 + text: "kia ora!", 41 + }, 42 + { 43 + id: "4", 44 + author: "assistant", 45 + text: "teenaa koe! :3", 46 + }, 47 + ], 48 + }, 49 + ];
+3
src/lib/query.ts
··· 1 + import { QueryClient } from "@tanstack/react-query"; 2 + 3 + export const queryClient = new QueryClient();
+17
src/lib/types.ts
··· 1 + export interface Character { 2 + id: string; 3 + name: string; 4 + } 5 + 6 + export interface Chat { 7 + id: string; 8 + title: string; 9 + character: Character; 10 + messages: ChatMessage[]; 11 + } 12 + 13 + export interface ChatMessage { 14 + id: string; 15 + author: "assistant" | "user"; 16 + text: string; 17 + }
+6
src/lib/utils.ts
··· 1 + import { type ClassValue, clsx } from "clsx"; 2 + import { twMerge } from "tailwind-merge"; 3 + 4 + export function cn(...inputs: ClassValue[]) { 5 + return twMerge(clsx(inputs)); 6 + }
+17
src/main.tsx
··· 1 + import { RouterProvider } from "@tanstack/react-router"; 2 + import { StrictMode } from "react"; 3 + import { createRoot } from "react-dom/client"; 4 + import { getRouter } from "./router"; 5 + import "./styles.css"; 6 + 7 + const rootElement = document.getElementById("app"); 8 + 9 + if (!rootElement) { 10 + throw new Error("Missing root element #app"); 11 + } 12 + 13 + createRoot(rootElement).render( 14 + <StrictMode> 15 + <RouterProvider router={getRouter()} /> 16 + </StrictMode>, 17 + );
+120
src/routeTree.gen.ts
··· 1 + /* eslint-disable */ 2 + 3 + // @ts-nocheck 4 + 5 + // noinspection JSUnusedGlobalSymbols 6 + 7 + // This file was automatically generated by TanStack Router. 8 + // You should NOT make any changes in this file as it will be overwritten. 9 + // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. 10 + 11 + import { Route as rootRouteImport } from './routes/__root' 12 + import { Route as ChatsRouteImport } from './routes/chats' 13 + import { Route as IndexRouteImport } from './routes/index' 14 + import { Route as ChatsIndexRouteImport } from './routes/chats.index' 15 + import { Route as ChatsChatIdRouteImport } from './routes/chats/$chatId' 16 + 17 + const ChatsRoute = ChatsRouteImport.update({ 18 + id: '/chats', 19 + path: '/chats', 20 + getParentRoute: () => rootRouteImport, 21 + } as any) 22 + const IndexRoute = IndexRouteImport.update({ 23 + id: '/', 24 + path: '/', 25 + getParentRoute: () => rootRouteImport, 26 + } as any) 27 + const ChatsIndexRoute = ChatsIndexRouteImport.update({ 28 + id: '/', 29 + path: '/', 30 + getParentRoute: () => ChatsRoute, 31 + } as any) 32 + const ChatsChatIdRoute = ChatsChatIdRouteImport.update({ 33 + id: '/$chatId', 34 + path: '/$chatId', 35 + getParentRoute: () => ChatsRoute, 36 + } as any) 37 + 38 + export interface FileRoutesByFullPath { 39 + '/': typeof IndexRoute 40 + '/chats': typeof ChatsRouteWithChildren 41 + '/chats/$chatId': typeof ChatsChatIdRoute 42 + '/chats/': typeof ChatsIndexRoute 43 + } 44 + export interface FileRoutesByTo { 45 + '/': typeof IndexRoute 46 + '/chats/$chatId': typeof ChatsChatIdRoute 47 + '/chats': typeof ChatsIndexRoute 48 + } 49 + export interface FileRoutesById { 50 + __root__: typeof rootRouteImport 51 + '/': typeof IndexRoute 52 + '/chats': typeof ChatsRouteWithChildren 53 + '/chats/$chatId': typeof ChatsChatIdRoute 54 + '/chats/': typeof ChatsIndexRoute 55 + } 56 + export interface FileRouteTypes { 57 + fileRoutesByFullPath: FileRoutesByFullPath 58 + fullPaths: '/' | '/chats' | '/chats/$chatId' | '/chats/' 59 + fileRoutesByTo: FileRoutesByTo 60 + to: '/' | '/chats/$chatId' | '/chats' 61 + id: '__root__' | '/' | '/chats' | '/chats/$chatId' | '/chats/' 62 + fileRoutesById: FileRoutesById 63 + } 64 + export interface RootRouteChildren { 65 + IndexRoute: typeof IndexRoute 66 + ChatsRoute: typeof ChatsRouteWithChildren 67 + } 68 + 69 + declare module '@tanstack/react-router' { 70 + interface FileRoutesByPath { 71 + '/chats': { 72 + id: '/chats' 73 + path: '/chats' 74 + fullPath: '/chats' 75 + preLoaderRoute: typeof ChatsRouteImport 76 + parentRoute: typeof rootRouteImport 77 + } 78 + '/': { 79 + id: '/' 80 + path: '/' 81 + fullPath: '/' 82 + preLoaderRoute: typeof IndexRouteImport 83 + parentRoute: typeof rootRouteImport 84 + } 85 + '/chats/': { 86 + id: '/chats/' 87 + path: '/' 88 + fullPath: '/chats/' 89 + preLoaderRoute: typeof ChatsIndexRouteImport 90 + parentRoute: typeof ChatsRoute 91 + } 92 + '/chats/$chatId': { 93 + id: '/chats/$chatId' 94 + path: '/$chatId' 95 + fullPath: '/chats/$chatId' 96 + preLoaderRoute: typeof ChatsChatIdRouteImport 97 + parentRoute: typeof ChatsRoute 98 + } 99 + } 100 + } 101 + 102 + interface ChatsRouteChildren { 103 + ChatsChatIdRoute: typeof ChatsChatIdRoute 104 + ChatsIndexRoute: typeof ChatsIndexRoute 105 + } 106 + 107 + const ChatsRouteChildren: ChatsRouteChildren = { 108 + ChatsChatIdRoute: ChatsChatIdRoute, 109 + ChatsIndexRoute: ChatsIndexRoute, 110 + } 111 + 112 + const ChatsRouteWithChildren = ChatsRoute._addFileChildren(ChatsRouteChildren) 113 + 114 + const rootRouteChildren: RootRouteChildren = { 115 + IndexRoute: IndexRoute, 116 + ChatsRoute: ChatsRouteWithChildren, 117 + } 118 + export const routeTree = rootRouteImport 119 + ._addFileChildren(rootRouteChildren) 120 + ._addFileTypes<FileRouteTypes>()
+19
src/router.tsx
··· 1 + import { createRouter as createTanStackRouter } from "@tanstack/react-router"; 2 + import { routeTree } from "./routeTree.gen"; 3 + 4 + export function getRouter() { 5 + const router = createTanStackRouter({ 6 + routeTree, 7 + scrollRestoration: true, 8 + defaultPreload: "intent", 9 + defaultPreloadStaleTime: 0, 10 + }); 11 + 12 + return router; 13 + } 14 + 15 + declare module "@tanstack/react-router" { 16 + interface Register { 17 + router: ReturnType<typeof getRouter>; 18 + } 19 + }
+15
src/routes/__root.tsx
··· 1 + import { QueryClientProvider } from "@tanstack/react-query"; 2 + import { createRootRoute, Outlet } from "@tanstack/react-router"; 3 + import { queryClient } from "#/lib/query"; 4 + 5 + export const Route = createRootRoute({ 6 + component: Root, 7 + }); 8 + 9 + function Root() { 10 + return ( 11 + <QueryClientProvider client={queryClient}> 12 + <Outlet /> 13 + </QueryClientProvider> 14 + ); 15 + }
+15
src/routes/chats.index.tsx
··· 1 + import { createFileRoute } from "@tanstack/react-router"; 2 + import { ChatForm } from "#/components/chat-form"; 3 + import { Stack } from "#/components/layout"; 4 + 5 + export const Route = createFileRoute("/chats/")({ 6 + component: RouteComponent, 7 + }); 8 + 9 + function RouteComponent() { 10 + return ( 11 + <Stack justify="end" className="flex-1 py-4 md:py-8"> 12 + <ChatForm /> 13 + </Stack> 14 + ); 15 + }
+21
src/routes/chats.tsx
··· 1 + import { createFileRoute, Outlet } from "@tanstack/react-router"; 2 + import { ChatSidebar } from "#/components/chat-sidebar"; 3 + import { Container } from "#/components/container"; 4 + import { SidebarInset, SidebarProvider } from "#/components/ui/sidebar"; 5 + 6 + export const Route = createFileRoute("/chats")({ 7 + component: RouteComponent, 8 + }); 9 + 10 + function RouteComponent() { 11 + return ( 12 + <SidebarProvider> 13 + <ChatSidebar /> 14 + <SidebarInset> 15 + <Container size="sm" className="flex h-full"> 16 + <Outlet /> 17 + </Container> 18 + </SidebarInset> 19 + </SidebarProvider> 20 + ); 21 + }
+12
src/routes/chats/$chatId.tsx
··· 1 + import { createFileRoute } from "@tanstack/react-router"; 2 + import { Chat } from "#/components/chat"; 3 + 4 + export const Route = createFileRoute("/chats/$chatId")({ 5 + component: RouteComponent, 6 + }); 7 + 8 + function RouteComponent() { 9 + const { chatId } = Route.useParams(); 10 + 11 + return <Chat chatId={chatId} />; 12 + }
+56
src/routes/index.tsx
··· 1 + import { createFileRoute, Link } from "@tanstack/react-router"; 2 + import { Attribution } from "#/components/attribution"; 3 + import { Container } from "#/components/container"; 4 + import { Heading } from "#/components/heading"; 5 + import { Row, Stack } from "#/components/layout"; 6 + import { Page } from "#/components/page"; 7 + import { Text } from "#/components/text"; 8 + import { Button } from "#/components/ui/button"; 9 + 10 + export const Route = createFileRoute("/")({ component: Home }); 11 + 12 + function Home() { 13 + return ( 14 + <Page> 15 + <Container> 16 + <Stack className="min-h-screen" justify="center"> 17 + <Row gap="lg" items="center" justify="between"> 18 + <Stack> 19 + <Stack gap="sm"> 20 + <Heading>Welcome to cAI ☕</Heading> 21 + <Text variant="lead"> 22 + The place to chat with AI characters. 23 + </Text> 24 + </Stack> 25 + <Row gap="sm"> 26 + <Button size="lg" render={<Link to="/chats" />}> 27 + Chat 28 + </Button> 29 + <Button size="lg" variant="ghost" render={<Link to="/" />}> 30 + Learn more 31 + </Button> 32 + </Row> 33 + </Stack> 34 + <figure className="relative"> 35 + <img 36 + src="/kitsune.gif" 37 + alt="Fox girl" 38 + width="318" 39 + height="292" 40 + className="h-72 w-auto" 41 + /> 42 + <figcaption className="absolute top-full pt-2"> 43 + <Attribution 44 + title="RoopyRoo! - CM" 45 + artist="Doosio" 46 + license="CC BY-NC-ND 3.0" 47 + href="https://www.deviantart.com/doosio/art/RoopyRoo-CM-887196542" 48 + /> 49 + </figcaption> 50 + </figure> 51 + </Row> 52 + </Stack> 53 + </Container> 54 + </Page> 55 + ); 56 + }
+190
src/styles.css
··· 1 + @import "tailwindcss"; 2 + @import "tw-animate-css"; 3 + @import "shadcn/tailwind.css"; 4 + @import "@fontsource-variable/dm-sans"; 5 + 6 + @custom-variant dark (&:is(.dark *)); 7 + 8 + :root { 9 + --background: oklch(0.9754 0.0084 325.6414); 10 + --foreground: oklch(0.3257 0.1161 325.0372); 11 + --card: oklch(0.9754 0.0084 325.6414); 12 + --card-foreground: oklch(0.3257 0.1161 325.0372); 13 + --popover: oklch(1 0 0); 14 + --popover-foreground: oklch(0.3257 0.1161 325.0372); 15 + --primary: oklch(0.5316 0.1409 355.1999); 16 + --primary-foreground: oklch(1 0 0); 17 + --secondary: oklch(0.8696 0.0675 334.8991); 18 + --secondary-foreground: oklch(0.4448 0.1341 324.7991); 19 + --muted: oklch(0.9395 0.026 331.5454); 20 + --muted-foreground: oklch(0.4924 0.1244 324.4523); 21 + --accent: oklch(0.8696 0.0675 334.8991); 22 + --accent-foreground: oklch(0.4448 0.1341 324.7991); 23 + --destructive: oklch(0.5248 0.1368 20.8317); 24 + --destructive-foreground: oklch(1 0 0); 25 + --border: oklch(0.8568 0.0829 328.911); 26 + --input: oklch(0.8517 0.0558 336.6002); 27 + --ring: oklch(0.5916 0.218 0.5844); 28 + --chart-1: oklch(0.6038 0.2363 344.4657); 29 + --chart-2: oklch(0.4445 0.2251 300.6246); 30 + --chart-3: oklch(0.379 0.0438 226.1538); 31 + --chart-4: oklch(0.833 0.1185 88.3461); 32 + --chart-5: oklch(0.7843 0.1256 58.9964); 33 + --sidebar: oklch(0.936 0.0288 320.5788); 34 + --sidebar-foreground: oklch(0.4948 0.1909 354.5435); 35 + --sidebar-primary: oklch(0.3963 0.0251 285.1962); 36 + --sidebar-primary-foreground: oklch(0.9668 0.0124 337.5228); 37 + --sidebar-accent: oklch(0.9789 0.0013 106.4235); 38 + --sidebar-accent-foreground: oklch(0.3963 0.0251 285.1962); 39 + --sidebar-border: oklch(0.9383 0.0026 48.7178); 40 + --sidebar-ring: oklch(0.5916 0.218 0.5844); 41 + --font-sans: 42 + ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 43 + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; 44 + --font-mono: 45 + ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", 46 + "Courier New", monospace; 47 + --radius: 0.5rem; 48 + --shadow-x: 0; 49 + --shadow-y: 1px; 50 + --shadow-blur: 3px; 51 + --shadow-spread: 0px; 52 + --shadow-opacity: 0.1; 53 + --shadow-color: oklch(0 0 0); 54 + --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); 55 + --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); 56 + --shadow-sm: 57 + 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1); 58 + --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1); 59 + --shadow-md: 60 + 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1); 61 + --shadow-lg: 62 + 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1); 63 + --shadow-xl: 64 + 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1); 65 + --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25); 66 + --tracking-normal: 0em; 67 + --spacing: 0.25rem; 68 + } 69 + 70 + .dark { 71 + --background: oklch(0.2409 0.0201 307.5346); 72 + --foreground: oklch(0.8398 0.0387 309.5391); 73 + --card: oklch(0.2803 0.0232 307.5413); 74 + --card-foreground: oklch(0.8456 0.0302 341.4597); 75 + --popover: oklch(0.1548 0.0132 338.9015); 76 + --popover-foreground: oklch(0.9647 0.0091 341.8035); 77 + --primary: oklch(0.4607 0.1853 4.0994); 78 + --primary-foreground: oklch(0.856 0.0618 346.3684); 79 + --secondary: oklch(0.3137 0.0306 310.061); 80 + --secondary-foreground: oklch(0.8483 0.0382 307.9613); 81 + --muted: oklch(0.2634 0.0219 309.4748); 82 + --muted-foreground: oklch(0.794 0.0372 307.1032); 83 + --accent: oklch(0.3649 0.0508 308.4911); 84 + --accent-foreground: oklch(0.9647 0.0091 341.8035); 85 + --destructive: oklch(0.2258 0.0524 12.6119); 86 + --destructive-foreground: oklch(1 0 0); 87 + --border: oklch(0.3286 0.0154 343.4461); 88 + --input: oklch(0.3387 0.0195 332.8347); 89 + --ring: oklch(0.5916 0.218 0.5844); 90 + --chart-1: oklch(0.5316 0.1409 355.1999); 91 + --chart-2: oklch(0.5633 0.1912 306.8561); 92 + --chart-3: oklch(0.7227 0.1502 60.5799); 93 + --chart-4: oklch(0.6193 0.2029 312.7422); 94 + --chart-5: oklch(0.6118 0.2093 6.1387); 95 + --sidebar: oklch(0.1893 0.0163 331.0475); 96 + --sidebar-foreground: oklch(0.8607 0.0293 343.6612); 97 + --sidebar-primary: oklch(0.4882 0.2172 264.3763); 98 + --sidebar-primary-foreground: oklch(1 0 0); 99 + --sidebar-accent: oklch(0.2337 0.0261 338.1961); 100 + --sidebar-accent-foreground: oklch(0.9674 0.0013 286.3752); 101 + --sidebar-border: oklch(0 0 0); 102 + --sidebar-ring: oklch(0.5916 0.218 0.5844); 103 + --font-sans: 104 + ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 105 + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; 106 + --font-mono: 107 + ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", 108 + "Courier New", monospace; 109 + --radius: 0.5rem; 110 + --shadow-x: 0; 111 + --shadow-y: 1px; 112 + --shadow-blur: 3px; 113 + --shadow-spread: 0px; 114 + --shadow-opacity: 0.1; 115 + --shadow-color: oklch(0 0 0); 116 + --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); 117 + --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); 118 + --shadow-sm: 119 + 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1); 120 + --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1); 121 + --shadow-md: 122 + 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1); 123 + --shadow-lg: 124 + 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1); 125 + --shadow-xl: 126 + 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1); 127 + --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25); 128 + } 129 + 130 + @theme inline { 131 + --color-background: var(--background); 132 + --color-foreground: var(--foreground); 133 + --color-card: var(--card); 134 + --color-card-foreground: var(--card-foreground); 135 + --color-popover: var(--popover); 136 + --color-popover-foreground: var(--popover-foreground); 137 + --color-primary: var(--primary); 138 + --color-primary-foreground: var(--primary-foreground); 139 + --color-secondary: var(--secondary); 140 + --color-secondary-foreground: var(--secondary-foreground); 141 + --color-muted: var(--muted); 142 + --color-muted-foreground: var(--muted-foreground); 143 + --color-accent: var(--accent); 144 + --color-accent-foreground: var(--accent-foreground); 145 + --color-destructive: var(--destructive); 146 + --color-destructive-foreground: var(--destructive-foreground); 147 + --color-border: var(--border); 148 + --color-input: var(--input); 149 + --color-ring: var(--ring); 150 + --color-chart-1: var(--chart-1); 151 + --color-chart-2: var(--chart-2); 152 + --color-chart-3: var(--chart-3); 153 + --color-chart-4: var(--chart-4); 154 + --color-chart-5: var(--chart-5); 155 + --color-sidebar: var(--sidebar); 156 + --color-sidebar-foreground: var(--sidebar-foreground); 157 + --color-sidebar-primary: var(--sidebar-primary); 158 + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); 159 + --color-sidebar-accent: var(--sidebar-accent); 160 + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); 161 + --color-sidebar-border: var(--sidebar-border); 162 + --color-sidebar-ring: var(--sidebar-ring); 163 + 164 + --font-sans: var(--font-sans); 165 + --font-mono: var(--font-mono); 166 + --font-serif: var(--font-serif); 167 + 168 + --radius-sm: calc(var(--radius) - 4px); 169 + --radius-md: calc(var(--radius) - 2px); 170 + --radius-lg: var(--radius); 171 + --radius-xl: calc(var(--radius) + 4px); 172 + 173 + --shadow-2xs: var(--shadow-2xs); 174 + --shadow-xs: var(--shadow-xs); 175 + --shadow-sm: var(--shadow-sm); 176 + --shadow: var(--shadow); 177 + --shadow-md: var(--shadow-md); 178 + --shadow-lg: var(--shadow-lg); 179 + --shadow-xl: var(--shadow-xl); 180 + --shadow-2xl: var(--shadow-2xl); 181 + } 182 + 183 + @layer base { 184 + * { 185 + @apply border-border outline-ring/50; 186 + } 187 + body { 188 + @apply bg-background text-foreground; 189 + } 190 + }
+28
tsconfig.json
··· 1 + { 2 + "include": ["**/*.ts", "**/*.tsx"], 3 + "compilerOptions": { 4 + "target": "ES2022", 5 + "jsx": "react-jsx", 6 + "module": "ESNext", 7 + "paths": { 8 + "#/*": ["./src/*"], 9 + "@/*": ["./src/*"] 10 + }, 11 + "lib": ["ES2022", "DOM", "DOM.Iterable"], 12 + "types": ["vite/client"], 13 + 14 + /* Bundler mode */ 15 + "moduleResolution": "bundler", 16 + "allowImportingTsExtensions": true, 17 + "verbatimModuleSyntax": true, 18 + "noEmit": true, 19 + 20 + /* Linting */ 21 + "skipLibCheck": true, 22 + "strict": true, 23 + "noUnusedLocals": true, 24 + "noUnusedParameters": true, 25 + "noFallthroughCasesInSwitch": true, 26 + "noUncheckedSideEffectImports": true 27 + } 28 + }
+28
vite.config.ts
··· 1 + import tailwindcss from "@tailwindcss/vite"; 2 + import tanstackRouter from "@tanstack/router-plugin/vite"; 3 + 4 + import react from "@vitejs/plugin-react"; 5 + import { defineConfig } from "vite"; 6 + 7 + const config = defineConfig({ 8 + resolve: { tsconfigPaths: true }, 9 + server: { 10 + port: 3000, 11 + proxy: { 12 + "/api": { 13 + target: process.env.VITE_API_TARGET ?? "http://localhost:3001", 14 + changeOrigin: true, 15 + }, 16 + }, 17 + }, 18 + plugins: [ 19 + tanstackRouter({ 20 + target: "react", 21 + autoCodeSplitting: true, 22 + }), 23 + react(), 24 + tailwindcss(), 25 + ], 26 + }); 27 + 28 + export default config;