A very performant and light (2mb in memory) link shortener and tracker. Written in Rust and React and uses Postgres/SQLite.

VERY MESSY FRONTEND NOTHING IS WORKING AAAAAAAAAAA

+274
frontend/bun.lock
··· 5 5 "name": "frontend", 6 6 "dependencies": { 7 7 "@emotion/react": "^11.14.0", 8 + "@hookform/resolvers": "^3.10.0", 8 9 "@mantine/core": "^7.16.1", 9 10 "@mantine/form": "^7.16.1", 10 11 "@mantine/hooks": "^7.16.1", 12 + "@radix-ui/react-label": "^2.1.1", 13 + "@radix-ui/react-slot": "^1.1.1", 14 + "@radix-ui/react-tabs": "^1.1.2", 15 + "@radix-ui/react-toast": "^1.2.5", 16 + "@tailwindcss/vite": "^4.0.0", 11 17 "axios": "^1.7.9", 18 + "class-variance-authority": "^0.7.1", 19 + "clsx": "^2.1.1", 20 + "lucide-react": "^0.474.0", 12 21 "react": "^18.3.1", 13 22 "react-dom": "^18.3.1", 23 + "react-hook-form": "^7.54.2", 24 + "tailwind-merge": "^2.6.0", 25 + "tailwindcss-animate": "^1.0.7", 26 + "zod": "^3.24.1", 14 27 }, 15 28 "devDependencies": { 16 29 "@eslint/js": "^9.17.0", ··· 18 31 "@types/react": "^18.3.18", 19 32 "@types/react-dom": "^18.3.5", 20 33 "@vitejs/plugin-react": "^4.3.4", 34 + "autoprefixer": "^10.4.20", 21 35 "eslint": "^9.17.0", 22 36 "eslint-plugin-react-hooks": "^5.0.0", 23 37 "eslint-plugin-react-refresh": "^0.4.16", 24 38 "globals": "^15.14.0", 39 + "postcss": "^8.5.1", 40 + "tailwindcss": "3.4.17", 25 41 "typescript": "~5.6.2", 26 42 "typescript-eslint": "^8.18.2", 27 43 "vite": "^6.0.5", ··· 29 45 }, 30 46 }, 31 47 "packages": { 48 + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], 49 + 32 50 "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], 33 51 34 52 "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], ··· 167 185 168 186 "@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="], 169 187 188 + "@hookform/resolvers": ["@hookform/resolvers@3.10.0", "", { "peerDependencies": { "react-hook-form": "^7.0.0" } }, "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag=="], 189 + 170 190 "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], 171 191 172 192 "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], ··· 174 194 "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], 175 195 176 196 "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.1", "", {}, "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA=="], 197 + 198 + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], 177 199 178 200 "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], 179 201 ··· 197 219 198 220 "@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=="], 199 221 222 + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], 223 + 224 + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.1", "", {}, "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA=="], 225 + 226 + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-slot": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA=="], 227 + 228 + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="], 229 + 230 + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q=="], 231 + 232 + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg=="], 233 + 234 + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-XDUI0IVYVSwjMXxM6P4Dfti7AH+Y4oS/TB+sglZ/EXc7cqLwGAmp1NlMrcUjj7ks6R5WTZuWKv44FBbLpwU3sA=="], 235 + 236 + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA=="], 237 + 238 + "@radix-ui/react-label": ["@radix-ui/react-label@2.1.1", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw=="], 239 + 240 + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw=="], 241 + 242 + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg=="], 243 + 244 + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.1", "", { "dependencies": { "@radix-ui/react-slot": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg=="], 245 + 246 + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.1", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw=="], 247 + 248 + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g=="], 249 + 250 + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-roving-focus": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ=="], 251 + 252 + "@radix-ui/react-toast": ["@radix-ui/react-toast@1.2.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.4", "@radix-ui/react-portal": "1.1.3", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ZzUsAaOx8NdXZZKcFNDhbSlbsCUy8qQWmzTdgrlrhhZAOx2ofLtKrBDW9fkqhFvXgmtv560Uj16pkLkqML7SHA=="], 253 + 254 + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw=="], 255 + 256 + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw=="], 257 + 258 + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw=="], 259 + 260 + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w=="], 261 + 262 + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.1.1", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg=="], 263 + 200 264 "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.32.0", "", { "os": "android", "cpu": "arm" }, "sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg=="], 201 265 202 266 "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A=="], ··· 235 299 236 300 "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA=="], 237 301 302 + "@tailwindcss/node": ["@tailwindcss/node@4.0.0", "", { "dependencies": { "enhanced-resolve": "^5.18.0", "jiti": "^2.4.2", "tailwindcss": "4.0.0" } }, "sha512-tfG2uBvo6j6kDIPmntxwXggCOZAt7SkpAXJ6pTIYirNdk5FBqh/CZZ9BZPpgcl/tNFLs6zc4yghM76sqiELG9g=="], 303 + 304 + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.0.0", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.0.0", "@tailwindcss/oxide-darwin-arm64": "4.0.0", "@tailwindcss/oxide-darwin-x64": "4.0.0", "@tailwindcss/oxide-freebsd-x64": "4.0.0", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.0", "@tailwindcss/oxide-linux-arm64-gnu": "4.0.0", "@tailwindcss/oxide-linux-arm64-musl": "4.0.0", "@tailwindcss/oxide-linux-x64-gnu": "4.0.0", "@tailwindcss/oxide-linux-x64-musl": "4.0.0", "@tailwindcss/oxide-win32-arm64-msvc": "4.0.0", "@tailwindcss/oxide-win32-x64-msvc": "4.0.0" } }, "sha512-W3FjpJgy4VV1JiL7iBYDf2n/WkeDg1Il+0Q7eWnqPyvkPPCo/Mbwc5BiaT7dfBNV6tQKAhVE34rU5xl8pSl50w=="], 305 + 306 + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.0.0", "", { "os": "android", "cpu": "arm64" }, "sha512-EAhjU0+FIdyGPR+7MbBWubLLPtmOu+p7c2egTTFBRk/n//zYjNvVK0WhcBK5Y7oUB5mo4EjA2mCbY7dcEMWSRw=="], 307 + 308 + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.0.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-hdz4xnSWS11cIp+7ye+3dGHqs0X33z+BXXTtgPOguDWVa+TdXUzwxonklSzf5wlJFuot3dv5eWzhlNai0oYYQg=="], 309 + 310 + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.0.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-+dOUUaXTkPKKhtUI9QtVaYg+MpmLh2CN0dHohiYXaBirEyPMkjaT0zbRgzQlNnQWjCVVXPQluIEb0OMEjSTH+Q=="], 311 + 312 + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.0.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-CJhGDhxnrmu4SwyC62fA+wP24MhA/TZlIhRHqg1kRuIHoGoVR2uSSm1qxTxU37tSSZj8Up0q6jsBJCAP4k7rgQ=="], 313 + 314 + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.0.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Wy7Av0xzXfY2ujZBcYy4+7GQm25/J1iHvlQU2CfwdDCuPWfIjYzR6kggz+uVdSJyKV2s64znchBxRE8kV4uXSA=="], 315 + 316 + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-srwBo2l6pvM0swBntc1ucuhGsfFOLkqPRFQ3dWARRTfSkL1U9nAsob2MKc/n47Eva/W9pZZgMOuf7rDw8pK1Ew=="], 317 + 318 + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-abhusswkduYWuezkBmgo0K0/erGq3M4Se5xP0fhc/0dKs0X/rJUYYCFWntHb3IGh3aVzdQ0SXJs93P76DbUqtw=="], 319 + 320 + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-hGtRYIUEx377/HlU49+jvVKKwU1MDSKYSMMs0JFO2Wp7LGxk5+0j5+RBk9NFnmp/lbp32yPTgIOO5m1BmDq36A=="], 321 + 322 + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-7xgQgSAThs0I14VAgmxpJnK6XFSZBxHMGoDXkLyYkEnu+8WRQMbCP93dkCUn2PIv+Q+JulRgc00PJ09uORSLXQ=="], 323 + 324 + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.0.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-qEcgTIPcWY5ZE7f6VxQ/JPrSFMcehzVIlZj7sGE3mVd5YWreAT+Fl1vSP8q2pjnWXn0avZG3Iw7a2hJQAm+fTQ=="], 325 + 326 + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.0.0", "", { "os": "win32", "cpu": "x64" }, "sha512-bqT0AY8RXb8GMDy28JtngvqaOSB2YixbLPLvUo6I6lkvvUwA6Eqh2Tj60e2Lh7O/k083f8tYiB0WEK4wmTI7Jg=="], 327 + 328 + "@tailwindcss/vite": ["@tailwindcss/vite@4.0.0", "", { "dependencies": { "@tailwindcss/node": "^4.0.0", "@tailwindcss/oxide": "^4.0.0", "lightningcss": "^1.29.1", "tailwindcss": "4.0.0" }, "peerDependencies": { "vite": "^5.2.0 || ^6" } }, "sha512-4uukMiU9gHui8KMPMdWic5SP1O/tmQ1NFSRNrQWmcop5evAVl/LZ6/LuWL3quEiecp2RBcRWwqJrG+mFXlRlew=="], 329 + 238 330 "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], 239 331 240 332 "@types/babel__generator": ["@types/babel__generator@7.6.8", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw=="], ··· 281 373 282 374 "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], 283 375 376 + "ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], 377 + 284 378 "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], 285 379 380 + "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], 381 + 382 + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], 383 + 384 + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], 385 + 286 386 "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], 287 387 288 388 "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], 289 389 390 + "autoprefixer": ["autoprefixer@10.4.20", "", { "dependencies": { "browserslist": "^4.23.3", "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g=="], 391 + 290 392 "axios": ["axios@1.7.9", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw=="], 291 393 292 394 "babel-plugin-macros": ["babel-plugin-macros@3.1.0", "", { "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" } }, "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="], 293 395 294 396 "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], 295 397 398 + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], 399 + 296 400 "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], 297 401 298 402 "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], ··· 301 405 302 406 "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], 303 407 408 + "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], 409 + 304 410 "caniuse-lite": ["caniuse-lite@1.0.30001695", "", {}, "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw=="], 305 411 306 412 "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], 307 413 414 + "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=="], 415 + 416 + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], 417 + 308 418 "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], 309 419 310 420 "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], ··· 312 422 "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], 313 423 314 424 "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], 425 + 426 + "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], 315 427 316 428 "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], 317 429 ··· 321 433 322 434 "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], 323 435 436 + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], 437 + 324 438 "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], 325 439 326 440 "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], ··· 328 442 "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], 329 443 330 444 "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], 445 + 446 + "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], 331 447 332 448 "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], 333 449 450 + "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], 451 + 452 + "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], 453 + 454 + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], 455 + 334 456 "electron-to-chromium": ["electron-to-chromium@1.5.88", "", {}, "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw=="], 457 + 458 + "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], 459 + 460 + "enhanced-resolve": ["enhanced-resolve@5.18.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ=="], 335 461 336 462 "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], 337 463 ··· 385 511 386 512 "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], 387 513 514 + "foreground-child": ["foreground-child@3.3.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg=="], 515 + 388 516 "form-data": ["form-data@4.0.1", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw=="], 517 + 518 + "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="], 389 519 390 520 "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], 391 521 ··· 394 524 "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], 395 525 396 526 "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], 527 + 528 + "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], 397 529 398 530 "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], 399 531 400 532 "globals": ["globals@15.14.0", "", {}, "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig=="], 401 533 534 + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], 535 + 402 536 "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], 403 537 404 538 "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], ··· 415 549 416 550 "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], 417 551 552 + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], 553 + 418 554 "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], 419 555 420 556 "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], 421 557 558 + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], 559 + 422 560 "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], 423 561 424 562 "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], 425 563 426 564 "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], 565 + 566 + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], 567 + 568 + "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], 427 569 428 570 "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], 429 571 ··· 447 589 448 590 "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], 449 591 592 + "lightningcss": ["lightningcss@1.29.1", "", { "dependencies": { "detect-libc": "^1.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.29.1", "lightningcss-darwin-x64": "1.29.1", "lightningcss-freebsd-x64": "1.29.1", "lightningcss-linux-arm-gnueabihf": "1.29.1", "lightningcss-linux-arm64-gnu": "1.29.1", "lightningcss-linux-arm64-musl": "1.29.1", "lightningcss-linux-x64-gnu": "1.29.1", "lightningcss-linux-x64-musl": "1.29.1", "lightningcss-win32-arm64-msvc": "1.29.1", "lightningcss-win32-x64-msvc": "1.29.1" } }, "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q=="], 593 + 594 + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.29.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw=="], 595 + 596 + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.29.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA=="], 597 + 598 + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.29.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ=="], 599 + 600 + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.29.1", "", { "os": "linux", "cpu": "arm" }, "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg=="], 601 + 602 + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.29.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ=="], 603 + 604 + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.29.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw=="], 605 + 606 + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.29.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw=="], 607 + 608 + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.29.1", "", { "os": "linux", "cpu": "x64" }, "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw=="], 609 + 610 + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.29.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog=="], 611 + 612 + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.29.1", "", { "os": "win32", "cpu": "x64" }, "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q=="], 613 + 614 + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], 615 + 450 616 "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], 451 617 452 618 "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], ··· 456 622 "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], 457 623 458 624 "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], 625 + 626 + "lucide-react": ["lucide-react@0.474.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-CmghgHkh0OJNmxGKWc0qfPJCYHASPMVSyGY8fj3xgk4v84ItqDg64JNKFZn5hC6E0vHi6gxnbCgwhyVB09wQtA=="], 459 627 460 628 "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], 461 629 ··· 467 635 468 636 "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], 469 637 638 + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], 639 + 470 640 "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 641 + 642 + "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], 471 643 472 644 "nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], 473 645 ··· 475 647 476 648 "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], 477 649 650 + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], 651 + 652 + "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="], 653 + 654 + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], 655 + 656 + "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], 657 + 478 658 "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], 479 659 480 660 "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], 481 661 482 662 "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], 483 663 664 + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], 665 + 484 666 "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], 485 667 486 668 "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=="], ··· 491 673 492 674 "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], 493 675 676 + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], 677 + 494 678 "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], 495 679 496 680 "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], 497 681 498 682 "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 499 683 684 + "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], 685 + 686 + "pirates": ["pirates@4.0.6", "", {}, "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg=="], 687 + 500 688 "postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="], 501 689 690 + "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="], 691 + 692 + "postcss-js": ["postcss-js@4.0.1", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw=="], 693 + 694 + "postcss-load-config": ["postcss-load-config@4.0.2", "", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="], 695 + 696 + "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], 697 + 698 + "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], 699 + 700 + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], 701 + 502 702 "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], 503 703 504 704 "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], ··· 510 710 "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], 511 711 512 712 "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], 713 + 714 + "react-hook-form": ["react-hook-form@7.54.2", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg=="], 513 715 514 716 "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], 515 717 ··· 524 726 "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], 525 727 526 728 "react-textarea-autosize": ["react-textarea-autosize@8.5.6", "", { "dependencies": { "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-aT3ioKXMa8f6zHYGebhbdMD2L00tKeRX1zuVuDx9YQK/JLLRSaSxq3ugECEmUB9z2kvk6bFSIoRHLkkUv0RJiw=="], 729 + 730 + "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], 731 + 732 + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], 527 733 528 734 "regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], 529 735 ··· 545 751 546 752 "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], 547 753 754 + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], 755 + 548 756 "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], 549 757 550 758 "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], 551 759 760 + "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], 761 + 762 + "string-width-cjs": ["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=="], 763 + 764 + "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], 765 + 766 + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 767 + 552 768 "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], 553 769 554 770 "stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="], 771 + 772 + "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], 555 773 556 774 "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], 557 775 ··· 559 777 560 778 "tabbable": ["tabbable@6.2.0", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="], 561 779 780 + "tailwind-merge": ["tailwind-merge@2.6.0", "", {}, "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA=="], 781 + 782 + "tailwindcss": ["tailwindcss@3.4.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.6", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og=="], 783 + 784 + "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], 785 + 786 + "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="], 787 + 788 + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], 789 + 790 + "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], 791 + 562 792 "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], 563 793 564 794 "ts-api-utils": ["ts-api-utils@2.0.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ=="], 795 + 796 + "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], 565 797 566 798 "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 567 799 ··· 589 821 590 822 "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], 591 823 824 + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], 825 + 592 826 "vite": ["vite@6.0.11", "", { "dependencies": { "esbuild": "^0.24.2", "postcss": "^8.4.49", "rollup": "^4.23.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg=="], 593 827 594 828 "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], 595 829 596 830 "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], 597 831 832 + "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], 833 + 834 + "wrap-ansi-cjs": ["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=="], 835 + 598 836 "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], 599 837 600 838 "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], 601 839 602 840 "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], 841 + 842 + "zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="], 603 843 604 844 "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], 605 845 ··· 611 851 612 852 "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], 613 853 854 + "@tailwindcss/node/tailwindcss": ["tailwindcss@4.0.0", "", {}, "sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ=="], 855 + 856 + "@tailwindcss/vite/tailwindcss": ["tailwindcss@4.0.0", "", {}, "sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ=="], 857 + 614 858 "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 615 859 616 860 "@typescript-eslint/typescript-estree/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], 617 861 862 + "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 863 + 618 864 "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 619 865 866 + "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 867 + 868 + "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], 869 + 870 + "postcss-load-config/yaml": ["yaml@2.7.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA=="], 871 + 872 + "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 873 + 874 + "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 875 + 876 + "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 877 + 878 + "tailwindcss/jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], 879 + 880 + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], 881 + 882 + "wrap-ansi-cjs/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=="], 883 + 884 + "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 885 + 620 886 "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 887 + 888 + "glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 889 + 890 + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 891 + 892 + "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 893 + 894 + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 621 895 } 622 896 }
+21
frontend/components.json
··· 1 + { 2 + "$schema": "https://ui.shadcn.com/schema.json", 3 + "style": "new-york", 4 + "rsc": false, 5 + "tsx": true, 6 + "tailwind": { 7 + "config": "tailwind.config.js", 8 + "css": "src/index.css", 9 + "baseColor": "stone", 10 + "cssVariables": true, 11 + "prefix": "" 12 + }, 13 + "aliases": { 14 + "components": "@/components", 15 + "utils": "@/lib/utils", 16 + "ui": "@/components/ui", 17 + "lib": "@/lib", 18 + "hooks": "@/hooks" 19 + }, 20 + "iconLibrary": "lucide" 21 + }
+4806
frontend/package-lock.json
··· 1 + { 2 + "name": "frontend", 3 + "version": "0.0.0", 4 + "lockfileVersion": 3, 5 + "requires": true, 6 + "packages": { 7 + "": { 8 + "name": "frontend", 9 + "version": "0.0.0", 10 + "dependencies": { 11 + "@emotion/react": "^11.14.0", 12 + "@hookform/resolvers": "^3.10.0", 13 + "@mantine/core": "^7.16.1", 14 + "@mantine/form": "^7.16.1", 15 + "@mantine/hooks": "^7.16.1", 16 + "@radix-ui/react-dialog": "^1.1.5", 17 + "@radix-ui/react-label": "^2.1.1", 18 + "@radix-ui/react-slot": "^1.1.1", 19 + "@radix-ui/react-tabs": "^1.1.2", 20 + "@radix-ui/react-toast": "^1.2.5", 21 + "@tailwindcss/vite": "^4.0.0", 22 + "axios": "^1.7.9", 23 + "class-variance-authority": "^0.7.1", 24 + "clsx": "^2.1.1", 25 + "lucide-react": "^0.474.0", 26 + "react": "^18.3.1", 27 + "react-dom": "^18.3.1", 28 + "react-hook-form": "^7.54.2", 29 + "tailwind-merge": "^2.6.0", 30 + "tailwindcss-animate": "^1.0.7", 31 + "zod": "^3.24.1" 32 + }, 33 + "devDependencies": { 34 + "@eslint/js": "^9.17.0", 35 + "@types/node": "^22.10.10", 36 + "@types/react": "^18.3.18", 37 + "@types/react-dom": "^18.3.5", 38 + "@vitejs/plugin-react": "^4.3.4", 39 + "autoprefixer": "^10.4.20", 40 + "eslint": "^9.17.0", 41 + "eslint-plugin-react-hooks": "^5.0.0", 42 + "eslint-plugin-react-refresh": "^0.4.16", 43 + "globals": "^15.14.0", 44 + "postcss": "^8.5.1", 45 + "tailwindcss": "3.4.17", 46 + "typescript": "~5.6.2", 47 + "typescript-eslint": "^8.18.2", 48 + "vite": "^6.0.5" 49 + } 50 + }, 51 + "node_modules/@alloc/quick-lru": { 52 + "version": "5.2.0", 53 + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 54 + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 55 + "license": "MIT", 56 + "engines": { 57 + "node": ">=10" 58 + }, 59 + "funding": { 60 + "url": "https://github.com/sponsors/sindresorhus" 61 + } 62 + }, 63 + "node_modules/@ampproject/remapping": { 64 + "version": "2.3.0", 65 + "dev": true, 66 + "license": "Apache-2.0", 67 + "dependencies": { 68 + "@jridgewell/gen-mapping": "^0.3.5", 69 + "@jridgewell/trace-mapping": "^0.3.24" 70 + }, 71 + "engines": { 72 + "node": ">=6.0.0" 73 + } 74 + }, 75 + "node_modules/@babel/code-frame": { 76 + "version": "7.26.2", 77 + "license": "MIT", 78 + "dependencies": { 79 + "@babel/helper-validator-identifier": "^7.25.9", 80 + "js-tokens": "^4.0.0", 81 + "picocolors": "^1.0.0" 82 + }, 83 + "engines": { 84 + "node": ">=6.9.0" 85 + } 86 + }, 87 + "node_modules/@babel/compat-data": { 88 + "version": "7.26.5", 89 + "dev": true, 90 + "license": "MIT", 91 + "engines": { 92 + "node": ">=6.9.0" 93 + } 94 + }, 95 + "node_modules/@babel/core": { 96 + "version": "7.26.7", 97 + "dev": true, 98 + "license": "MIT", 99 + "dependencies": { 100 + "@ampproject/remapping": "^2.2.0", 101 + "@babel/code-frame": "^7.26.2", 102 + "@babel/generator": "^7.26.5", 103 + "@babel/helper-compilation-targets": "^7.26.5", 104 + "@babel/helper-module-transforms": "^7.26.0", 105 + "@babel/helpers": "^7.26.7", 106 + "@babel/parser": "^7.26.7", 107 + "@babel/template": "^7.25.9", 108 + "@babel/traverse": "^7.26.7", 109 + "@babel/types": "^7.26.7", 110 + "convert-source-map": "^2.0.0", 111 + "debug": "^4.1.0", 112 + "gensync": "^1.0.0-beta.2", 113 + "json5": "^2.2.3", 114 + "semver": "^6.3.1" 115 + }, 116 + "engines": { 117 + "node": ">=6.9.0" 118 + }, 119 + "funding": { 120 + "type": "opencollective", 121 + "url": "https://opencollective.com/babel" 122 + } 123 + }, 124 + "node_modules/@babel/generator": { 125 + "version": "7.26.5", 126 + "license": "MIT", 127 + "dependencies": { 128 + "@babel/parser": "^7.26.5", 129 + "@babel/types": "^7.26.5", 130 + "@jridgewell/gen-mapping": "^0.3.5", 131 + "@jridgewell/trace-mapping": "^0.3.25", 132 + "jsesc": "^3.0.2" 133 + }, 134 + "engines": { 135 + "node": ">=6.9.0" 136 + } 137 + }, 138 + "node_modules/@babel/helper-compilation-targets": { 139 + "version": "7.26.5", 140 + "dev": true, 141 + "license": "MIT", 142 + "dependencies": { 143 + "@babel/compat-data": "^7.26.5", 144 + "@babel/helper-validator-option": "^7.25.9", 145 + "browserslist": "^4.24.0", 146 + "lru-cache": "^5.1.1", 147 + "semver": "^6.3.1" 148 + }, 149 + "engines": { 150 + "node": ">=6.9.0" 151 + } 152 + }, 153 + "node_modules/@babel/helper-module-imports": { 154 + "version": "7.25.9", 155 + "license": "MIT", 156 + "dependencies": { 157 + "@babel/traverse": "^7.25.9", 158 + "@babel/types": "^7.25.9" 159 + }, 160 + "engines": { 161 + "node": ">=6.9.0" 162 + } 163 + }, 164 + "node_modules/@babel/helper-module-transforms": { 165 + "version": "7.26.0", 166 + "dev": true, 167 + "license": "MIT", 168 + "dependencies": { 169 + "@babel/helper-module-imports": "^7.25.9", 170 + "@babel/helper-validator-identifier": "^7.25.9", 171 + "@babel/traverse": "^7.25.9" 172 + }, 173 + "engines": { 174 + "node": ">=6.9.0" 175 + }, 176 + "peerDependencies": { 177 + "@babel/core": "^7.0.0" 178 + } 179 + }, 180 + "node_modules/@babel/helper-plugin-utils": { 181 + "version": "7.26.5", 182 + "dev": true, 183 + "license": "MIT", 184 + "engines": { 185 + "node": ">=6.9.0" 186 + } 187 + }, 188 + "node_modules/@babel/helper-string-parser": { 189 + "version": "7.25.9", 190 + "license": "MIT", 191 + "engines": { 192 + "node": ">=6.9.0" 193 + } 194 + }, 195 + "node_modules/@babel/helper-validator-identifier": { 196 + "version": "7.25.9", 197 + "license": "MIT", 198 + "engines": { 199 + "node": ">=6.9.0" 200 + } 201 + }, 202 + "node_modules/@babel/helper-validator-option": { 203 + "version": "7.25.9", 204 + "dev": true, 205 + "license": "MIT", 206 + "engines": { 207 + "node": ">=6.9.0" 208 + } 209 + }, 210 + "node_modules/@babel/helpers": { 211 + "version": "7.26.7", 212 + "dev": true, 213 + "license": "MIT", 214 + "dependencies": { 215 + "@babel/template": "^7.25.9", 216 + "@babel/types": "^7.26.7" 217 + }, 218 + "engines": { 219 + "node": ">=6.9.0" 220 + } 221 + }, 222 + "node_modules/@babel/parser": { 223 + "version": "7.26.7", 224 + "license": "MIT", 225 + "dependencies": { 226 + "@babel/types": "^7.26.7" 227 + }, 228 + "bin": { 229 + "parser": "bin/babel-parser.js" 230 + }, 231 + "engines": { 232 + "node": ">=6.0.0" 233 + } 234 + }, 235 + "node_modules/@babel/plugin-transform-react-jsx-self": { 236 + "version": "7.25.9", 237 + "dev": true, 238 + "license": "MIT", 239 + "dependencies": { 240 + "@babel/helper-plugin-utils": "^7.25.9" 241 + }, 242 + "engines": { 243 + "node": ">=6.9.0" 244 + }, 245 + "peerDependencies": { 246 + "@babel/core": "^7.0.0-0" 247 + } 248 + }, 249 + "node_modules/@babel/plugin-transform-react-jsx-source": { 250 + "version": "7.25.9", 251 + "dev": true, 252 + "license": "MIT", 253 + "dependencies": { 254 + "@babel/helper-plugin-utils": "^7.25.9" 255 + }, 256 + "engines": { 257 + "node": ">=6.9.0" 258 + }, 259 + "peerDependencies": { 260 + "@babel/core": "^7.0.0-0" 261 + } 262 + }, 263 + "node_modules/@babel/runtime": { 264 + "version": "7.26.7", 265 + "license": "MIT", 266 + "dependencies": { 267 + "regenerator-runtime": "^0.14.0" 268 + }, 269 + "engines": { 270 + "node": ">=6.9.0" 271 + } 272 + }, 273 + "node_modules/@babel/template": { 274 + "version": "7.25.9", 275 + "license": "MIT", 276 + "dependencies": { 277 + "@babel/code-frame": "^7.25.9", 278 + "@babel/parser": "^7.25.9", 279 + "@babel/types": "^7.25.9" 280 + }, 281 + "engines": { 282 + "node": ">=6.9.0" 283 + } 284 + }, 285 + "node_modules/@babel/traverse": { 286 + "version": "7.26.7", 287 + "license": "MIT", 288 + "dependencies": { 289 + "@babel/code-frame": "^7.26.2", 290 + "@babel/generator": "^7.26.5", 291 + "@babel/parser": "^7.26.7", 292 + "@babel/template": "^7.25.9", 293 + "@babel/types": "^7.26.7", 294 + "debug": "^4.3.1", 295 + "globals": "^11.1.0" 296 + }, 297 + "engines": { 298 + "node": ">=6.9.0" 299 + } 300 + }, 301 + "node_modules/@babel/traverse/node_modules/globals": { 302 + "version": "11.12.0", 303 + "license": "MIT", 304 + "engines": { 305 + "node": ">=4" 306 + } 307 + }, 308 + "node_modules/@babel/types": { 309 + "version": "7.26.7", 310 + "license": "MIT", 311 + "dependencies": { 312 + "@babel/helper-string-parser": "^7.25.9", 313 + "@babel/helper-validator-identifier": "^7.25.9" 314 + }, 315 + "engines": { 316 + "node": ">=6.9.0" 317 + } 318 + }, 319 + "node_modules/@emotion/babel-plugin": { 320 + "version": "11.13.5", 321 + "license": "MIT", 322 + "dependencies": { 323 + "@babel/helper-module-imports": "^7.16.7", 324 + "@babel/runtime": "^7.18.3", 325 + "@emotion/hash": "^0.9.2", 326 + "@emotion/memoize": "^0.9.0", 327 + "@emotion/serialize": "^1.3.3", 328 + "babel-plugin-macros": "^3.1.0", 329 + "convert-source-map": "^1.5.0", 330 + "escape-string-regexp": "^4.0.0", 331 + "find-root": "^1.1.0", 332 + "source-map": "^0.5.7", 333 + "stylis": "4.2.0" 334 + } 335 + }, 336 + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { 337 + "version": "1.9.0", 338 + "license": "MIT" 339 + }, 340 + "node_modules/@emotion/cache": { 341 + "version": "11.14.0", 342 + "license": "MIT", 343 + "dependencies": { 344 + "@emotion/memoize": "^0.9.0", 345 + "@emotion/sheet": "^1.4.0", 346 + "@emotion/utils": "^1.4.2", 347 + "@emotion/weak-memoize": "^0.4.0", 348 + "stylis": "4.2.0" 349 + } 350 + }, 351 + "node_modules/@emotion/hash": { 352 + "version": "0.9.2", 353 + "license": "MIT" 354 + }, 355 + "node_modules/@emotion/memoize": { 356 + "version": "0.9.0", 357 + "license": "MIT" 358 + }, 359 + "node_modules/@emotion/react": { 360 + "version": "11.14.0", 361 + "license": "MIT", 362 + "dependencies": { 363 + "@babel/runtime": "^7.18.3", 364 + "@emotion/babel-plugin": "^11.13.5", 365 + "@emotion/cache": "^11.14.0", 366 + "@emotion/serialize": "^1.3.3", 367 + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", 368 + "@emotion/utils": "^1.4.2", 369 + "@emotion/weak-memoize": "^0.4.0", 370 + "hoist-non-react-statics": "^3.3.1" 371 + }, 372 + "peerDependencies": { 373 + "react": ">=16.8.0" 374 + }, 375 + "peerDependenciesMeta": { 376 + "@types/react": { 377 + "optional": true 378 + } 379 + } 380 + }, 381 + "node_modules/@emotion/serialize": { 382 + "version": "1.3.3", 383 + "license": "MIT", 384 + "dependencies": { 385 + "@emotion/hash": "^0.9.2", 386 + "@emotion/memoize": "^0.9.0", 387 + "@emotion/unitless": "^0.10.0", 388 + "@emotion/utils": "^1.4.2", 389 + "csstype": "^3.0.2" 390 + } 391 + }, 392 + "node_modules/@emotion/sheet": { 393 + "version": "1.4.0", 394 + "license": "MIT" 395 + }, 396 + "node_modules/@emotion/unitless": { 397 + "version": "0.10.0", 398 + "license": "MIT" 399 + }, 400 + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { 401 + "version": "1.2.0", 402 + "license": "MIT", 403 + "peerDependencies": { 404 + "react": ">=16.8.0" 405 + } 406 + }, 407 + "node_modules/@emotion/utils": { 408 + "version": "1.4.2", 409 + "license": "MIT" 410 + }, 411 + "node_modules/@emotion/weak-memoize": { 412 + "version": "0.4.0", 413 + "license": "MIT" 414 + }, 415 + "node_modules/@esbuild/darwin-arm64": { 416 + "version": "0.24.2", 417 + "cpu": [ 418 + "arm64" 419 + ], 420 + "license": "MIT", 421 + "optional": true, 422 + "os": [ 423 + "darwin" 424 + ], 425 + "engines": { 426 + "node": ">=18" 427 + } 428 + }, 429 + "node_modules/@eslint-community/eslint-utils": { 430 + "version": "4.4.1", 431 + "dev": true, 432 + "license": "MIT", 433 + "dependencies": { 434 + "eslint-visitor-keys": "^3.4.3" 435 + }, 436 + "engines": { 437 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 438 + }, 439 + "funding": { 440 + "url": "https://opencollective.com/eslint" 441 + }, 442 + "peerDependencies": { 443 + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 444 + } 445 + }, 446 + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 447 + "version": "3.4.3", 448 + "dev": true, 449 + "license": "Apache-2.0", 450 + "engines": { 451 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 452 + }, 453 + "funding": { 454 + "url": "https://opencollective.com/eslint" 455 + } 456 + }, 457 + "node_modules/@eslint-community/regexpp": { 458 + "version": "4.12.1", 459 + "dev": true, 460 + "license": "MIT", 461 + "engines": { 462 + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 463 + } 464 + }, 465 + "node_modules/@eslint/config-array": { 466 + "version": "0.19.1", 467 + "dev": true, 468 + "license": "Apache-2.0", 469 + "dependencies": { 470 + "@eslint/object-schema": "^2.1.5", 471 + "debug": "^4.3.1", 472 + "minimatch": "^3.1.2" 473 + }, 474 + "engines": { 475 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 476 + } 477 + }, 478 + "node_modules/@eslint/core": { 479 + "version": "0.10.0", 480 + "dev": true, 481 + "license": "Apache-2.0", 482 + "dependencies": { 483 + "@types/json-schema": "^7.0.15" 484 + }, 485 + "engines": { 486 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 487 + } 488 + }, 489 + "node_modules/@eslint/eslintrc": { 490 + "version": "3.2.0", 491 + "dev": true, 492 + "license": "MIT", 493 + "dependencies": { 494 + "ajv": "^6.12.4", 495 + "debug": "^4.3.2", 496 + "espree": "^10.0.1", 497 + "globals": "^14.0.0", 498 + "ignore": "^5.2.0", 499 + "import-fresh": "^3.2.1", 500 + "js-yaml": "^4.1.0", 501 + "minimatch": "^3.1.2", 502 + "strip-json-comments": "^3.1.1" 503 + }, 504 + "engines": { 505 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 506 + }, 507 + "funding": { 508 + "url": "https://opencollective.com/eslint" 509 + } 510 + }, 511 + "node_modules/@eslint/eslintrc/node_modules/globals": { 512 + "version": "14.0.0", 513 + "dev": true, 514 + "license": "MIT", 515 + "engines": { 516 + "node": ">=18" 517 + }, 518 + "funding": { 519 + "url": "https://github.com/sponsors/sindresorhus" 520 + } 521 + }, 522 + "node_modules/@eslint/js": { 523 + "version": "9.19.0", 524 + "dev": true, 525 + "license": "MIT", 526 + "engines": { 527 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 528 + } 529 + }, 530 + "node_modules/@eslint/object-schema": { 531 + "version": "2.1.5", 532 + "dev": true, 533 + "license": "Apache-2.0", 534 + "engines": { 535 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 536 + } 537 + }, 538 + "node_modules/@eslint/plugin-kit": { 539 + "version": "0.2.5", 540 + "dev": true, 541 + "license": "Apache-2.0", 542 + "dependencies": { 543 + "@eslint/core": "^0.10.0", 544 + "levn": "^0.4.1" 545 + }, 546 + "engines": { 547 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 548 + } 549 + }, 550 + "node_modules/@floating-ui/core": { 551 + "version": "1.6.9", 552 + "license": "MIT", 553 + "dependencies": { 554 + "@floating-ui/utils": "^0.2.9" 555 + } 556 + }, 557 + "node_modules/@floating-ui/dom": { 558 + "version": "1.6.13", 559 + "license": "MIT", 560 + "dependencies": { 561 + "@floating-ui/core": "^1.6.0", 562 + "@floating-ui/utils": "^0.2.9" 563 + } 564 + }, 565 + "node_modules/@floating-ui/react": { 566 + "version": "0.26.28", 567 + "license": "MIT", 568 + "dependencies": { 569 + "@floating-ui/react-dom": "^2.1.2", 570 + "@floating-ui/utils": "^0.2.8", 571 + "tabbable": "^6.0.0" 572 + }, 573 + "peerDependencies": { 574 + "react": ">=16.8.0", 575 + "react-dom": ">=16.8.0" 576 + } 577 + }, 578 + "node_modules/@floating-ui/react-dom": { 579 + "version": "2.1.2", 580 + "license": "MIT", 581 + "dependencies": { 582 + "@floating-ui/dom": "^1.0.0" 583 + }, 584 + "peerDependencies": { 585 + "react": ">=16.8.0", 586 + "react-dom": ">=16.8.0" 587 + } 588 + }, 589 + "node_modules/@floating-ui/utils": { 590 + "version": "0.2.9", 591 + "license": "MIT" 592 + }, 593 + "node_modules/@hookform/resolvers": { 594 + "version": "3.10.0", 595 + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.10.0.tgz", 596 + "integrity": "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==", 597 + "license": "MIT", 598 + "peerDependencies": { 599 + "react-hook-form": "^7.0.0" 600 + } 601 + }, 602 + "node_modules/@humanfs/core": { 603 + "version": "0.19.1", 604 + "dev": true, 605 + "license": "Apache-2.0", 606 + "engines": { 607 + "node": ">=18.18.0" 608 + } 609 + }, 610 + "node_modules/@humanfs/node": { 611 + "version": "0.16.6", 612 + "dev": true, 613 + "license": "Apache-2.0", 614 + "dependencies": { 615 + "@humanfs/core": "^0.19.1", 616 + "@humanwhocodes/retry": "^0.3.0" 617 + }, 618 + "engines": { 619 + "node": ">=18.18.0" 620 + } 621 + }, 622 + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 623 + "version": "0.3.1", 624 + "dev": true, 625 + "license": "Apache-2.0", 626 + "engines": { 627 + "node": ">=18.18" 628 + }, 629 + "funding": { 630 + "type": "github", 631 + "url": "https://github.com/sponsors/nzakas" 632 + } 633 + }, 634 + "node_modules/@humanwhocodes/module-importer": { 635 + "version": "1.0.1", 636 + "dev": true, 637 + "license": "Apache-2.0", 638 + "engines": { 639 + "node": ">=12.22" 640 + }, 641 + "funding": { 642 + "type": "github", 643 + "url": "https://github.com/sponsors/nzakas" 644 + } 645 + }, 646 + "node_modules/@humanwhocodes/retry": { 647 + "version": "0.4.1", 648 + "dev": true, 649 + "license": "Apache-2.0", 650 + "engines": { 651 + "node": ">=18.18" 652 + }, 653 + "funding": { 654 + "type": "github", 655 + "url": "https://github.com/sponsors/nzakas" 656 + } 657 + }, 658 + "node_modules/@isaacs/cliui": { 659 + "version": "8.0.2", 660 + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 661 + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 662 + "license": "ISC", 663 + "dependencies": { 664 + "string-width": "^5.1.2", 665 + "string-width-cjs": "npm:string-width@^4.2.0", 666 + "strip-ansi": "^7.0.1", 667 + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 668 + "wrap-ansi": "^8.1.0", 669 + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 670 + }, 671 + "engines": { 672 + "node": ">=12" 673 + } 674 + }, 675 + "node_modules/@jridgewell/gen-mapping": { 676 + "version": "0.3.8", 677 + "license": "MIT", 678 + "dependencies": { 679 + "@jridgewell/set-array": "^1.2.1", 680 + "@jridgewell/sourcemap-codec": "^1.4.10", 681 + "@jridgewell/trace-mapping": "^0.3.24" 682 + }, 683 + "engines": { 684 + "node": ">=6.0.0" 685 + } 686 + }, 687 + "node_modules/@jridgewell/resolve-uri": { 688 + "version": "3.1.2", 689 + "license": "MIT", 690 + "engines": { 691 + "node": ">=6.0.0" 692 + } 693 + }, 694 + "node_modules/@jridgewell/set-array": { 695 + "version": "1.2.1", 696 + "license": "MIT", 697 + "engines": { 698 + "node": ">=6.0.0" 699 + } 700 + }, 701 + "node_modules/@jridgewell/sourcemap-codec": { 702 + "version": "1.5.0", 703 + "license": "MIT" 704 + }, 705 + "node_modules/@jridgewell/trace-mapping": { 706 + "version": "0.3.25", 707 + "license": "MIT", 708 + "dependencies": { 709 + "@jridgewell/resolve-uri": "^3.1.0", 710 + "@jridgewell/sourcemap-codec": "^1.4.14" 711 + } 712 + }, 713 + "node_modules/@mantine/core": { 714 + "version": "7.16.1", 715 + "license": "MIT", 716 + "dependencies": { 717 + "@floating-ui/react": "^0.26.28", 718 + "clsx": "^2.1.1", 719 + "react-number-format": "^5.4.3", 720 + "react-remove-scroll": "^2.6.2", 721 + "react-textarea-autosize": "8.5.6", 722 + "type-fest": "^4.27.0" 723 + }, 724 + "peerDependencies": { 725 + "@mantine/hooks": "7.16.1", 726 + "react": "^18.x || ^19.x", 727 + "react-dom": "^18.x || ^19.x" 728 + } 729 + }, 730 + "node_modules/@mantine/form": { 731 + "version": "7.16.1", 732 + "license": "MIT", 733 + "dependencies": { 734 + "fast-deep-equal": "^3.1.3", 735 + "klona": "^2.0.6" 736 + }, 737 + "peerDependencies": { 738 + "react": "^18.x || ^19.x" 739 + } 740 + }, 741 + "node_modules/@mantine/hooks": { 742 + "version": "7.16.1", 743 + "license": "MIT", 744 + "peerDependencies": { 745 + "react": "^18.x || ^19.x" 746 + } 747 + }, 748 + "node_modules/@nodelib/fs.scandir": { 749 + "version": "2.1.5", 750 + "license": "MIT", 751 + "dependencies": { 752 + "@nodelib/fs.stat": "2.0.5", 753 + "run-parallel": "^1.1.9" 754 + }, 755 + "engines": { 756 + "node": ">= 8" 757 + } 758 + }, 759 + "node_modules/@nodelib/fs.stat": { 760 + "version": "2.0.5", 761 + "license": "MIT", 762 + "engines": { 763 + "node": ">= 8" 764 + } 765 + }, 766 + "node_modules/@nodelib/fs.walk": { 767 + "version": "1.2.8", 768 + "license": "MIT", 769 + "dependencies": { 770 + "@nodelib/fs.scandir": "2.1.5", 771 + "fastq": "^1.6.0" 772 + }, 773 + "engines": { 774 + "node": ">= 8" 775 + } 776 + }, 777 + "node_modules/@pkgjs/parseargs": { 778 + "version": "0.11.0", 779 + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 780 + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 781 + "license": "MIT", 782 + "optional": true, 783 + "engines": { 784 + "node": ">=14" 785 + } 786 + }, 787 + "node_modules/@radix-ui/primitive": { 788 + "version": "1.1.1", 789 + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", 790 + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", 791 + "license": "MIT" 792 + }, 793 + "node_modules/@radix-ui/react-collection": { 794 + "version": "1.1.1", 795 + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.1.tgz", 796 + "integrity": "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==", 797 + "license": "MIT", 798 + "dependencies": { 799 + "@radix-ui/react-compose-refs": "1.1.1", 800 + "@radix-ui/react-context": "1.1.1", 801 + "@radix-ui/react-primitive": "2.0.1", 802 + "@radix-ui/react-slot": "1.1.1" 803 + }, 804 + "peerDependencies": { 805 + "@types/react": "*", 806 + "@types/react-dom": "*", 807 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 808 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 809 + }, 810 + "peerDependenciesMeta": { 811 + "@types/react": { 812 + "optional": true 813 + }, 814 + "@types/react-dom": { 815 + "optional": true 816 + } 817 + } 818 + }, 819 + "node_modules/@radix-ui/react-compose-refs": { 820 + "version": "1.1.1", 821 + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", 822 + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", 823 + "license": "MIT", 824 + "peerDependencies": { 825 + "@types/react": "*", 826 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 827 + }, 828 + "peerDependenciesMeta": { 829 + "@types/react": { 830 + "optional": true 831 + } 832 + } 833 + }, 834 + "node_modules/@radix-ui/react-context": { 835 + "version": "1.1.1", 836 + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", 837 + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", 838 + "license": "MIT", 839 + "peerDependencies": { 840 + "@types/react": "*", 841 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 842 + }, 843 + "peerDependenciesMeta": { 844 + "@types/react": { 845 + "optional": true 846 + } 847 + } 848 + }, 849 + "node_modules/@radix-ui/react-dialog": { 850 + "version": "1.1.5", 851 + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.5.tgz", 852 + "integrity": "sha512-LaO3e5h/NOEL4OfXjxD43k9Dx+vn+8n+PCFt6uhX/BADFflllyv3WJG6rgvvSVBxpTch938Qq/LGc2MMxipXPw==", 853 + "license": "MIT", 854 + "dependencies": { 855 + "@radix-ui/primitive": "1.1.1", 856 + "@radix-ui/react-compose-refs": "1.1.1", 857 + "@radix-ui/react-context": "1.1.1", 858 + "@radix-ui/react-dismissable-layer": "1.1.4", 859 + "@radix-ui/react-focus-guards": "1.1.1", 860 + "@radix-ui/react-focus-scope": "1.1.1", 861 + "@radix-ui/react-id": "1.1.0", 862 + "@radix-ui/react-portal": "1.1.3", 863 + "@radix-ui/react-presence": "1.1.2", 864 + "@radix-ui/react-primitive": "2.0.1", 865 + "@radix-ui/react-slot": "1.1.1", 866 + "@radix-ui/react-use-controllable-state": "1.1.0", 867 + "aria-hidden": "^1.2.4", 868 + "react-remove-scroll": "^2.6.2" 869 + }, 870 + "peerDependencies": { 871 + "@types/react": "*", 872 + "@types/react-dom": "*", 873 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 874 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 875 + }, 876 + "peerDependenciesMeta": { 877 + "@types/react": { 878 + "optional": true 879 + }, 880 + "@types/react-dom": { 881 + "optional": true 882 + } 883 + } 884 + }, 885 + "node_modules/@radix-ui/react-direction": { 886 + "version": "1.1.0", 887 + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", 888 + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", 889 + "license": "MIT", 890 + "peerDependencies": { 891 + "@types/react": "*", 892 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 893 + }, 894 + "peerDependenciesMeta": { 895 + "@types/react": { 896 + "optional": true 897 + } 898 + } 899 + }, 900 + "node_modules/@radix-ui/react-dismissable-layer": { 901 + "version": "1.1.4", 902 + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.4.tgz", 903 + "integrity": "sha512-XDUI0IVYVSwjMXxM6P4Dfti7AH+Y4oS/TB+sglZ/EXc7cqLwGAmp1NlMrcUjj7ks6R5WTZuWKv44FBbLpwU3sA==", 904 + "license": "MIT", 905 + "dependencies": { 906 + "@radix-ui/primitive": "1.1.1", 907 + "@radix-ui/react-compose-refs": "1.1.1", 908 + "@radix-ui/react-primitive": "2.0.1", 909 + "@radix-ui/react-use-callback-ref": "1.1.0", 910 + "@radix-ui/react-use-escape-keydown": "1.1.0" 911 + }, 912 + "peerDependencies": { 913 + "@types/react": "*", 914 + "@types/react-dom": "*", 915 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 916 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 917 + }, 918 + "peerDependenciesMeta": { 919 + "@types/react": { 920 + "optional": true 921 + }, 922 + "@types/react-dom": { 923 + "optional": true 924 + } 925 + } 926 + }, 927 + "node_modules/@radix-ui/react-focus-guards": { 928 + "version": "1.1.1", 929 + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", 930 + "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", 931 + "license": "MIT", 932 + "peerDependencies": { 933 + "@types/react": "*", 934 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 935 + }, 936 + "peerDependenciesMeta": { 937 + "@types/react": { 938 + "optional": true 939 + } 940 + } 941 + }, 942 + "node_modules/@radix-ui/react-focus-scope": { 943 + "version": "1.1.1", 944 + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.1.tgz", 945 + "integrity": "sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==", 946 + "license": "MIT", 947 + "dependencies": { 948 + "@radix-ui/react-compose-refs": "1.1.1", 949 + "@radix-ui/react-primitive": "2.0.1", 950 + "@radix-ui/react-use-callback-ref": "1.1.0" 951 + }, 952 + "peerDependencies": { 953 + "@types/react": "*", 954 + "@types/react-dom": "*", 955 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 956 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 957 + }, 958 + "peerDependenciesMeta": { 959 + "@types/react": { 960 + "optional": true 961 + }, 962 + "@types/react-dom": { 963 + "optional": true 964 + } 965 + } 966 + }, 967 + "node_modules/@radix-ui/react-id": { 968 + "version": "1.1.0", 969 + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", 970 + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", 971 + "license": "MIT", 972 + "dependencies": { 973 + "@radix-ui/react-use-layout-effect": "1.1.0" 974 + }, 975 + "peerDependencies": { 976 + "@types/react": "*", 977 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 978 + }, 979 + "peerDependenciesMeta": { 980 + "@types/react": { 981 + "optional": true 982 + } 983 + } 984 + }, 985 + "node_modules/@radix-ui/react-label": { 986 + "version": "2.1.1", 987 + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.1.tgz", 988 + "integrity": "sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==", 989 + "license": "MIT", 990 + "dependencies": { 991 + "@radix-ui/react-primitive": "2.0.1" 992 + }, 993 + "peerDependencies": { 994 + "@types/react": "*", 995 + "@types/react-dom": "*", 996 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 997 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 998 + }, 999 + "peerDependenciesMeta": { 1000 + "@types/react": { 1001 + "optional": true 1002 + }, 1003 + "@types/react-dom": { 1004 + "optional": true 1005 + } 1006 + } 1007 + }, 1008 + "node_modules/@radix-ui/react-portal": { 1009 + "version": "1.1.3", 1010 + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.3.tgz", 1011 + "integrity": "sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==", 1012 + "license": "MIT", 1013 + "dependencies": { 1014 + "@radix-ui/react-primitive": "2.0.1", 1015 + "@radix-ui/react-use-layout-effect": "1.1.0" 1016 + }, 1017 + "peerDependencies": { 1018 + "@types/react": "*", 1019 + "@types/react-dom": "*", 1020 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 1021 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1022 + }, 1023 + "peerDependenciesMeta": { 1024 + "@types/react": { 1025 + "optional": true 1026 + }, 1027 + "@types/react-dom": { 1028 + "optional": true 1029 + } 1030 + } 1031 + }, 1032 + "node_modules/@radix-ui/react-presence": { 1033 + "version": "1.1.2", 1034 + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", 1035 + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", 1036 + "license": "MIT", 1037 + "dependencies": { 1038 + "@radix-ui/react-compose-refs": "1.1.1", 1039 + "@radix-ui/react-use-layout-effect": "1.1.0" 1040 + }, 1041 + "peerDependencies": { 1042 + "@types/react": "*", 1043 + "@types/react-dom": "*", 1044 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 1045 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1046 + }, 1047 + "peerDependenciesMeta": { 1048 + "@types/react": { 1049 + "optional": true 1050 + }, 1051 + "@types/react-dom": { 1052 + "optional": true 1053 + } 1054 + } 1055 + }, 1056 + "node_modules/@radix-ui/react-primitive": { 1057 + "version": "2.0.1", 1058 + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", 1059 + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", 1060 + "license": "MIT", 1061 + "dependencies": { 1062 + "@radix-ui/react-slot": "1.1.1" 1063 + }, 1064 + "peerDependencies": { 1065 + "@types/react": "*", 1066 + "@types/react-dom": "*", 1067 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 1068 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1069 + }, 1070 + "peerDependenciesMeta": { 1071 + "@types/react": { 1072 + "optional": true 1073 + }, 1074 + "@types/react-dom": { 1075 + "optional": true 1076 + } 1077 + } 1078 + }, 1079 + "node_modules/@radix-ui/react-roving-focus": { 1080 + "version": "1.1.1", 1081 + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.1.tgz", 1082 + "integrity": "sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==", 1083 + "license": "MIT", 1084 + "dependencies": { 1085 + "@radix-ui/primitive": "1.1.1", 1086 + "@radix-ui/react-collection": "1.1.1", 1087 + "@radix-ui/react-compose-refs": "1.1.1", 1088 + "@radix-ui/react-context": "1.1.1", 1089 + "@radix-ui/react-direction": "1.1.0", 1090 + "@radix-ui/react-id": "1.1.0", 1091 + "@radix-ui/react-primitive": "2.0.1", 1092 + "@radix-ui/react-use-callback-ref": "1.1.0", 1093 + "@radix-ui/react-use-controllable-state": "1.1.0" 1094 + }, 1095 + "peerDependencies": { 1096 + "@types/react": "*", 1097 + "@types/react-dom": "*", 1098 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 1099 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1100 + }, 1101 + "peerDependenciesMeta": { 1102 + "@types/react": { 1103 + "optional": true 1104 + }, 1105 + "@types/react-dom": { 1106 + "optional": true 1107 + } 1108 + } 1109 + }, 1110 + "node_modules/@radix-ui/react-slot": { 1111 + "version": "1.1.1", 1112 + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", 1113 + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", 1114 + "license": "MIT", 1115 + "dependencies": { 1116 + "@radix-ui/react-compose-refs": "1.1.1" 1117 + }, 1118 + "peerDependencies": { 1119 + "@types/react": "*", 1120 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1121 + }, 1122 + "peerDependenciesMeta": { 1123 + "@types/react": { 1124 + "optional": true 1125 + } 1126 + } 1127 + }, 1128 + "node_modules/@radix-ui/react-tabs": { 1129 + "version": "1.1.2", 1130 + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.2.tgz", 1131 + "integrity": "sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ==", 1132 + "license": "MIT", 1133 + "dependencies": { 1134 + "@radix-ui/primitive": "1.1.1", 1135 + "@radix-ui/react-context": "1.1.1", 1136 + "@radix-ui/react-direction": "1.1.0", 1137 + "@radix-ui/react-id": "1.1.0", 1138 + "@radix-ui/react-presence": "1.1.2", 1139 + "@radix-ui/react-primitive": "2.0.1", 1140 + "@radix-ui/react-roving-focus": "1.1.1", 1141 + "@radix-ui/react-use-controllable-state": "1.1.0" 1142 + }, 1143 + "peerDependencies": { 1144 + "@types/react": "*", 1145 + "@types/react-dom": "*", 1146 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 1147 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1148 + }, 1149 + "peerDependenciesMeta": { 1150 + "@types/react": { 1151 + "optional": true 1152 + }, 1153 + "@types/react-dom": { 1154 + "optional": true 1155 + } 1156 + } 1157 + }, 1158 + "node_modules/@radix-ui/react-toast": { 1159 + "version": "1.2.5", 1160 + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.5.tgz", 1161 + "integrity": "sha512-ZzUsAaOx8NdXZZKcFNDhbSlbsCUy8qQWmzTdgrlrhhZAOx2ofLtKrBDW9fkqhFvXgmtv560Uj16pkLkqML7SHA==", 1162 + "license": "MIT", 1163 + "dependencies": { 1164 + "@radix-ui/primitive": "1.1.1", 1165 + "@radix-ui/react-collection": "1.1.1", 1166 + "@radix-ui/react-compose-refs": "1.1.1", 1167 + "@radix-ui/react-context": "1.1.1", 1168 + "@radix-ui/react-dismissable-layer": "1.1.4", 1169 + "@radix-ui/react-portal": "1.1.3", 1170 + "@radix-ui/react-presence": "1.1.2", 1171 + "@radix-ui/react-primitive": "2.0.1", 1172 + "@radix-ui/react-use-callback-ref": "1.1.0", 1173 + "@radix-ui/react-use-controllable-state": "1.1.0", 1174 + "@radix-ui/react-use-layout-effect": "1.1.0", 1175 + "@radix-ui/react-visually-hidden": "1.1.1" 1176 + }, 1177 + "peerDependencies": { 1178 + "@types/react": "*", 1179 + "@types/react-dom": "*", 1180 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 1181 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1182 + }, 1183 + "peerDependenciesMeta": { 1184 + "@types/react": { 1185 + "optional": true 1186 + }, 1187 + "@types/react-dom": { 1188 + "optional": true 1189 + } 1190 + } 1191 + }, 1192 + "node_modules/@radix-ui/react-use-callback-ref": { 1193 + "version": "1.1.0", 1194 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", 1195 + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", 1196 + "license": "MIT", 1197 + "peerDependencies": { 1198 + "@types/react": "*", 1199 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1200 + }, 1201 + "peerDependenciesMeta": { 1202 + "@types/react": { 1203 + "optional": true 1204 + } 1205 + } 1206 + }, 1207 + "node_modules/@radix-ui/react-use-controllable-state": { 1208 + "version": "1.1.0", 1209 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", 1210 + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", 1211 + "license": "MIT", 1212 + "dependencies": { 1213 + "@radix-ui/react-use-callback-ref": "1.1.0" 1214 + }, 1215 + "peerDependencies": { 1216 + "@types/react": "*", 1217 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1218 + }, 1219 + "peerDependenciesMeta": { 1220 + "@types/react": { 1221 + "optional": true 1222 + } 1223 + } 1224 + }, 1225 + "node_modules/@radix-ui/react-use-escape-keydown": { 1226 + "version": "1.1.0", 1227 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", 1228 + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", 1229 + "license": "MIT", 1230 + "dependencies": { 1231 + "@radix-ui/react-use-callback-ref": "1.1.0" 1232 + }, 1233 + "peerDependencies": { 1234 + "@types/react": "*", 1235 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1236 + }, 1237 + "peerDependenciesMeta": { 1238 + "@types/react": { 1239 + "optional": true 1240 + } 1241 + } 1242 + }, 1243 + "node_modules/@radix-ui/react-use-layout-effect": { 1244 + "version": "1.1.0", 1245 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", 1246 + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", 1247 + "license": "MIT", 1248 + "peerDependencies": { 1249 + "@types/react": "*", 1250 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1251 + }, 1252 + "peerDependenciesMeta": { 1253 + "@types/react": { 1254 + "optional": true 1255 + } 1256 + } 1257 + }, 1258 + "node_modules/@radix-ui/react-visually-hidden": { 1259 + "version": "1.1.1", 1260 + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.1.tgz", 1261 + "integrity": "sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==", 1262 + "license": "MIT", 1263 + "dependencies": { 1264 + "@radix-ui/react-primitive": "2.0.1" 1265 + }, 1266 + "peerDependencies": { 1267 + "@types/react": "*", 1268 + "@types/react-dom": "*", 1269 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 1270 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1271 + }, 1272 + "peerDependenciesMeta": { 1273 + "@types/react": { 1274 + "optional": true 1275 + }, 1276 + "@types/react-dom": { 1277 + "optional": true 1278 + } 1279 + } 1280 + }, 1281 + "node_modules/@rollup/rollup-darwin-arm64": { 1282 + "version": "4.32.0", 1283 + "cpu": [ 1284 + "arm64" 1285 + ], 1286 + "license": "MIT", 1287 + "optional": true, 1288 + "os": [ 1289 + "darwin" 1290 + ] 1291 + }, 1292 + "node_modules/@tailwindcss/node": { 1293 + "version": "4.0.0", 1294 + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.0.tgz", 1295 + "integrity": "sha512-tfG2uBvo6j6kDIPmntxwXggCOZAt7SkpAXJ6pTIYirNdk5FBqh/CZZ9BZPpgcl/tNFLs6zc4yghM76sqiELG9g==", 1296 + "license": "MIT", 1297 + "dependencies": { 1298 + "enhanced-resolve": "^5.18.0", 1299 + "jiti": "^2.4.2", 1300 + "tailwindcss": "4.0.0" 1301 + } 1302 + }, 1303 + "node_modules/@tailwindcss/node/node_modules/tailwindcss": { 1304 + "version": "4.0.0", 1305 + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.0.tgz", 1306 + "integrity": "sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ==", 1307 + "license": "MIT" 1308 + }, 1309 + "node_modules/@tailwindcss/oxide": { 1310 + "version": "4.0.0", 1311 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.0.tgz", 1312 + "integrity": "sha512-W3FjpJgy4VV1JiL7iBYDf2n/WkeDg1Il+0Q7eWnqPyvkPPCo/Mbwc5BiaT7dfBNV6tQKAhVE34rU5xl8pSl50w==", 1313 + "license": "MIT", 1314 + "engines": { 1315 + "node": ">= 10" 1316 + }, 1317 + "optionalDependencies": { 1318 + "@tailwindcss/oxide-android-arm64": "4.0.0", 1319 + "@tailwindcss/oxide-darwin-arm64": "4.0.0", 1320 + "@tailwindcss/oxide-darwin-x64": "4.0.0", 1321 + "@tailwindcss/oxide-freebsd-x64": "4.0.0", 1322 + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.0", 1323 + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.0", 1324 + "@tailwindcss/oxide-linux-arm64-musl": "4.0.0", 1325 + "@tailwindcss/oxide-linux-x64-gnu": "4.0.0", 1326 + "@tailwindcss/oxide-linux-x64-musl": "4.0.0", 1327 + "@tailwindcss/oxide-win32-arm64-msvc": "4.0.0", 1328 + "@tailwindcss/oxide-win32-x64-msvc": "4.0.0" 1329 + } 1330 + }, 1331 + "node_modules/@tailwindcss/oxide-android-arm64": { 1332 + "version": "4.0.0", 1333 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.0.tgz", 1334 + "integrity": "sha512-EAhjU0+FIdyGPR+7MbBWubLLPtmOu+p7c2egTTFBRk/n//zYjNvVK0WhcBK5Y7oUB5mo4EjA2mCbY7dcEMWSRw==", 1335 + "cpu": [ 1336 + "arm64" 1337 + ], 1338 + "license": "MIT", 1339 + "optional": true, 1340 + "os": [ 1341 + "android" 1342 + ], 1343 + "engines": { 1344 + "node": ">= 10" 1345 + } 1346 + }, 1347 + "node_modules/@tailwindcss/oxide-darwin-arm64": { 1348 + "version": "4.0.0", 1349 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.0.tgz", 1350 + "integrity": "sha512-hdz4xnSWS11cIp+7ye+3dGHqs0X33z+BXXTtgPOguDWVa+TdXUzwxonklSzf5wlJFuot3dv5eWzhlNai0oYYQg==", 1351 + "cpu": [ 1352 + "arm64" 1353 + ], 1354 + "license": "MIT", 1355 + "optional": true, 1356 + "os": [ 1357 + "darwin" 1358 + ], 1359 + "engines": { 1360 + "node": ">= 10" 1361 + } 1362 + }, 1363 + "node_modules/@tailwindcss/oxide-darwin-x64": { 1364 + "version": "4.0.0", 1365 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.0.tgz", 1366 + "integrity": "sha512-+dOUUaXTkPKKhtUI9QtVaYg+MpmLh2CN0dHohiYXaBirEyPMkjaT0zbRgzQlNnQWjCVVXPQluIEb0OMEjSTH+Q==", 1367 + "cpu": [ 1368 + "x64" 1369 + ], 1370 + "license": "MIT", 1371 + "optional": true, 1372 + "os": [ 1373 + "darwin" 1374 + ], 1375 + "engines": { 1376 + "node": ">= 10" 1377 + } 1378 + }, 1379 + "node_modules/@tailwindcss/oxide-freebsd-x64": { 1380 + "version": "4.0.0", 1381 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.0.tgz", 1382 + "integrity": "sha512-CJhGDhxnrmu4SwyC62fA+wP24MhA/TZlIhRHqg1kRuIHoGoVR2uSSm1qxTxU37tSSZj8Up0q6jsBJCAP4k7rgQ==", 1383 + "cpu": [ 1384 + "x64" 1385 + ], 1386 + "license": "MIT", 1387 + "optional": true, 1388 + "os": [ 1389 + "freebsd" 1390 + ], 1391 + "engines": { 1392 + "node": ">= 10" 1393 + } 1394 + }, 1395 + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { 1396 + "version": "4.0.0", 1397 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.0.tgz", 1398 + "integrity": "sha512-Wy7Av0xzXfY2ujZBcYy4+7GQm25/J1iHvlQU2CfwdDCuPWfIjYzR6kggz+uVdSJyKV2s64znchBxRE8kV4uXSA==", 1399 + "cpu": [ 1400 + "arm" 1401 + ], 1402 + "license": "MIT", 1403 + "optional": true, 1404 + "os": [ 1405 + "linux" 1406 + ], 1407 + "engines": { 1408 + "node": ">= 10" 1409 + } 1410 + }, 1411 + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { 1412 + "version": "4.0.0", 1413 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.0.tgz", 1414 + "integrity": "sha512-srwBo2l6pvM0swBntc1ucuhGsfFOLkqPRFQ3dWARRTfSkL1U9nAsob2MKc/n47Eva/W9pZZgMOuf7rDw8pK1Ew==", 1415 + "cpu": [ 1416 + "arm64" 1417 + ], 1418 + "license": "MIT", 1419 + "optional": true, 1420 + "os": [ 1421 + "linux" 1422 + ], 1423 + "engines": { 1424 + "node": ">= 10" 1425 + } 1426 + }, 1427 + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { 1428 + "version": "4.0.0", 1429 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.0.tgz", 1430 + "integrity": "sha512-abhusswkduYWuezkBmgo0K0/erGq3M4Se5xP0fhc/0dKs0X/rJUYYCFWntHb3IGh3aVzdQ0SXJs93P76DbUqtw==", 1431 + "cpu": [ 1432 + "arm64" 1433 + ], 1434 + "license": "MIT", 1435 + "optional": true, 1436 + "os": [ 1437 + "linux" 1438 + ], 1439 + "engines": { 1440 + "node": ">= 10" 1441 + } 1442 + }, 1443 + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { 1444 + "version": "4.0.0", 1445 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.0.tgz", 1446 + "integrity": "sha512-hGtRYIUEx377/HlU49+jvVKKwU1MDSKYSMMs0JFO2Wp7LGxk5+0j5+RBk9NFnmp/lbp32yPTgIOO5m1BmDq36A==", 1447 + "cpu": [ 1448 + "x64" 1449 + ], 1450 + "license": "MIT", 1451 + "optional": true, 1452 + "os": [ 1453 + "linux" 1454 + ], 1455 + "engines": { 1456 + "node": ">= 10" 1457 + } 1458 + }, 1459 + "node_modules/@tailwindcss/oxide-linux-x64-musl": { 1460 + "version": "4.0.0", 1461 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.0.tgz", 1462 + "integrity": "sha512-7xgQgSAThs0I14VAgmxpJnK6XFSZBxHMGoDXkLyYkEnu+8WRQMbCP93dkCUn2PIv+Q+JulRgc00PJ09uORSLXQ==", 1463 + "cpu": [ 1464 + "x64" 1465 + ], 1466 + "license": "MIT", 1467 + "optional": true, 1468 + "os": [ 1469 + "linux" 1470 + ], 1471 + "engines": { 1472 + "node": ">= 10" 1473 + } 1474 + }, 1475 + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { 1476 + "version": "4.0.0", 1477 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.0.tgz", 1478 + "integrity": "sha512-qEcgTIPcWY5ZE7f6VxQ/JPrSFMcehzVIlZj7sGE3mVd5YWreAT+Fl1vSP8q2pjnWXn0avZG3Iw7a2hJQAm+fTQ==", 1479 + "cpu": [ 1480 + "arm64" 1481 + ], 1482 + "license": "MIT", 1483 + "optional": true, 1484 + "os": [ 1485 + "win32" 1486 + ], 1487 + "engines": { 1488 + "node": ">= 10" 1489 + } 1490 + }, 1491 + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { 1492 + "version": "4.0.0", 1493 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.0.tgz", 1494 + "integrity": "sha512-bqT0AY8RXb8GMDy28JtngvqaOSB2YixbLPLvUo6I6lkvvUwA6Eqh2Tj60e2Lh7O/k083f8tYiB0WEK4wmTI7Jg==", 1495 + "cpu": [ 1496 + "x64" 1497 + ], 1498 + "license": "MIT", 1499 + "optional": true, 1500 + "os": [ 1501 + "win32" 1502 + ], 1503 + "engines": { 1504 + "node": ">= 10" 1505 + } 1506 + }, 1507 + "node_modules/@tailwindcss/vite": { 1508 + "version": "4.0.0", 1509 + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.0.tgz", 1510 + "integrity": "sha512-4uukMiU9gHui8KMPMdWic5SP1O/tmQ1NFSRNrQWmcop5evAVl/LZ6/LuWL3quEiecp2RBcRWwqJrG+mFXlRlew==", 1511 + "license": "MIT", 1512 + "dependencies": { 1513 + "@tailwindcss/node": "^4.0.0", 1514 + "@tailwindcss/oxide": "^4.0.0", 1515 + "lightningcss": "^1.29.1", 1516 + "tailwindcss": "4.0.0" 1517 + }, 1518 + "peerDependencies": { 1519 + "vite": "^5.2.0 || ^6" 1520 + } 1521 + }, 1522 + "node_modules/@tailwindcss/vite/node_modules/tailwindcss": { 1523 + "version": "4.0.0", 1524 + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.0.tgz", 1525 + "integrity": "sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ==", 1526 + "license": "MIT" 1527 + }, 1528 + "node_modules/@types/babel__core": { 1529 + "version": "7.20.5", 1530 + "dev": true, 1531 + "license": "MIT", 1532 + "dependencies": { 1533 + "@babel/parser": "^7.20.7", 1534 + "@babel/types": "^7.20.7", 1535 + "@types/babel__generator": "*", 1536 + "@types/babel__template": "*", 1537 + "@types/babel__traverse": "*" 1538 + } 1539 + }, 1540 + "node_modules/@types/babel__generator": { 1541 + "version": "7.6.8", 1542 + "dev": true, 1543 + "license": "MIT", 1544 + "dependencies": { 1545 + "@babel/types": "^7.0.0" 1546 + } 1547 + }, 1548 + "node_modules/@types/babel__template": { 1549 + "version": "7.4.4", 1550 + "dev": true, 1551 + "license": "MIT", 1552 + "dependencies": { 1553 + "@babel/parser": "^7.1.0", 1554 + "@babel/types": "^7.0.0" 1555 + } 1556 + }, 1557 + "node_modules/@types/babel__traverse": { 1558 + "version": "7.20.6", 1559 + "dev": true, 1560 + "license": "MIT", 1561 + "dependencies": { 1562 + "@babel/types": "^7.20.7" 1563 + } 1564 + }, 1565 + "node_modules/@types/estree": { 1566 + "version": "1.0.6", 1567 + "license": "MIT" 1568 + }, 1569 + "node_modules/@types/json-schema": { 1570 + "version": "7.0.15", 1571 + "dev": true, 1572 + "license": "MIT" 1573 + }, 1574 + "node_modules/@types/node": { 1575 + "version": "22.10.10", 1576 + "devOptional": true, 1577 + "license": "MIT", 1578 + "dependencies": { 1579 + "undici-types": "~6.20.0" 1580 + } 1581 + }, 1582 + "node_modules/@types/parse-json": { 1583 + "version": "4.0.2", 1584 + "license": "MIT" 1585 + }, 1586 + "node_modules/@types/prop-types": { 1587 + "version": "15.7.14", 1588 + "devOptional": true, 1589 + "license": "MIT" 1590 + }, 1591 + "node_modules/@types/react": { 1592 + "version": "18.3.18", 1593 + "devOptional": true, 1594 + "license": "MIT", 1595 + "dependencies": { 1596 + "@types/prop-types": "*", 1597 + "csstype": "^3.0.2" 1598 + } 1599 + }, 1600 + "node_modules/@types/react-dom": { 1601 + "version": "18.3.5", 1602 + "devOptional": true, 1603 + "license": "MIT", 1604 + "peerDependencies": { 1605 + "@types/react": "^18.0.0" 1606 + } 1607 + }, 1608 + "node_modules/@typescript-eslint/eslint-plugin": { 1609 + "version": "8.21.0", 1610 + "dev": true, 1611 + "license": "MIT", 1612 + "dependencies": { 1613 + "@eslint-community/regexpp": "^4.10.0", 1614 + "@typescript-eslint/scope-manager": "8.21.0", 1615 + "@typescript-eslint/type-utils": "8.21.0", 1616 + "@typescript-eslint/utils": "8.21.0", 1617 + "@typescript-eslint/visitor-keys": "8.21.0", 1618 + "graphemer": "^1.4.0", 1619 + "ignore": "^5.3.1", 1620 + "natural-compare": "^1.4.0", 1621 + "ts-api-utils": "^2.0.0" 1622 + }, 1623 + "engines": { 1624 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1625 + }, 1626 + "funding": { 1627 + "type": "opencollective", 1628 + "url": "https://opencollective.com/typescript-eslint" 1629 + }, 1630 + "peerDependencies": { 1631 + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", 1632 + "eslint": "^8.57.0 || ^9.0.0", 1633 + "typescript": ">=4.8.4 <5.8.0" 1634 + } 1635 + }, 1636 + "node_modules/@typescript-eslint/parser": { 1637 + "version": "8.21.0", 1638 + "dev": true, 1639 + "license": "MIT", 1640 + "dependencies": { 1641 + "@typescript-eslint/scope-manager": "8.21.0", 1642 + "@typescript-eslint/types": "8.21.0", 1643 + "@typescript-eslint/typescript-estree": "8.21.0", 1644 + "@typescript-eslint/visitor-keys": "8.21.0", 1645 + "debug": "^4.3.4" 1646 + }, 1647 + "engines": { 1648 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1649 + }, 1650 + "funding": { 1651 + "type": "opencollective", 1652 + "url": "https://opencollective.com/typescript-eslint" 1653 + }, 1654 + "peerDependencies": { 1655 + "eslint": "^8.57.0 || ^9.0.0", 1656 + "typescript": ">=4.8.4 <5.8.0" 1657 + } 1658 + }, 1659 + "node_modules/@typescript-eslint/scope-manager": { 1660 + "version": "8.21.0", 1661 + "dev": true, 1662 + "license": "MIT", 1663 + "dependencies": { 1664 + "@typescript-eslint/types": "8.21.0", 1665 + "@typescript-eslint/visitor-keys": "8.21.0" 1666 + }, 1667 + "engines": { 1668 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1669 + }, 1670 + "funding": { 1671 + "type": "opencollective", 1672 + "url": "https://opencollective.com/typescript-eslint" 1673 + } 1674 + }, 1675 + "node_modules/@typescript-eslint/type-utils": { 1676 + "version": "8.21.0", 1677 + "dev": true, 1678 + "license": "MIT", 1679 + "dependencies": { 1680 + "@typescript-eslint/typescript-estree": "8.21.0", 1681 + "@typescript-eslint/utils": "8.21.0", 1682 + "debug": "^4.3.4", 1683 + "ts-api-utils": "^2.0.0" 1684 + }, 1685 + "engines": { 1686 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1687 + }, 1688 + "funding": { 1689 + "type": "opencollective", 1690 + "url": "https://opencollective.com/typescript-eslint" 1691 + }, 1692 + "peerDependencies": { 1693 + "eslint": "^8.57.0 || ^9.0.0", 1694 + "typescript": ">=4.8.4 <5.8.0" 1695 + } 1696 + }, 1697 + "node_modules/@typescript-eslint/types": { 1698 + "version": "8.21.0", 1699 + "dev": true, 1700 + "license": "MIT", 1701 + "engines": { 1702 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1703 + }, 1704 + "funding": { 1705 + "type": "opencollective", 1706 + "url": "https://opencollective.com/typescript-eslint" 1707 + } 1708 + }, 1709 + "node_modules/@typescript-eslint/typescript-estree": { 1710 + "version": "8.21.0", 1711 + "dev": true, 1712 + "license": "MIT", 1713 + "dependencies": { 1714 + "@typescript-eslint/types": "8.21.0", 1715 + "@typescript-eslint/visitor-keys": "8.21.0", 1716 + "debug": "^4.3.4", 1717 + "fast-glob": "^3.3.2", 1718 + "is-glob": "^4.0.3", 1719 + "minimatch": "^9.0.4", 1720 + "semver": "^7.6.0", 1721 + "ts-api-utils": "^2.0.0" 1722 + }, 1723 + "engines": { 1724 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1725 + }, 1726 + "funding": { 1727 + "type": "opencollective", 1728 + "url": "https://opencollective.com/typescript-eslint" 1729 + }, 1730 + "peerDependencies": { 1731 + "typescript": ">=4.8.4 <5.8.0" 1732 + } 1733 + }, 1734 + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 1735 + "version": "9.0.5", 1736 + "dev": true, 1737 + "license": "ISC", 1738 + "dependencies": { 1739 + "brace-expansion": "^2.0.1" 1740 + }, 1741 + "engines": { 1742 + "node": ">=16 || 14 >=14.17" 1743 + }, 1744 + "funding": { 1745 + "url": "https://github.com/sponsors/isaacs" 1746 + } 1747 + }, 1748 + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { 1749 + "version": "2.0.1", 1750 + "dev": true, 1751 + "license": "MIT", 1752 + "dependencies": { 1753 + "balanced-match": "^1.0.0" 1754 + } 1755 + }, 1756 + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { 1757 + "version": "7.6.3", 1758 + "dev": true, 1759 + "license": "ISC", 1760 + "bin": { 1761 + "semver": "bin/semver.js" 1762 + }, 1763 + "engines": { 1764 + "node": ">=10" 1765 + } 1766 + }, 1767 + "node_modules/@typescript-eslint/utils": { 1768 + "version": "8.21.0", 1769 + "dev": true, 1770 + "license": "MIT", 1771 + "dependencies": { 1772 + "@eslint-community/eslint-utils": "^4.4.0", 1773 + "@typescript-eslint/scope-manager": "8.21.0", 1774 + "@typescript-eslint/types": "8.21.0", 1775 + "@typescript-eslint/typescript-estree": "8.21.0" 1776 + }, 1777 + "engines": { 1778 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1779 + }, 1780 + "funding": { 1781 + "type": "opencollective", 1782 + "url": "https://opencollective.com/typescript-eslint" 1783 + }, 1784 + "peerDependencies": { 1785 + "eslint": "^8.57.0 || ^9.0.0", 1786 + "typescript": ">=4.8.4 <5.8.0" 1787 + } 1788 + }, 1789 + "node_modules/@typescript-eslint/visitor-keys": { 1790 + "version": "8.21.0", 1791 + "dev": true, 1792 + "license": "MIT", 1793 + "dependencies": { 1794 + "@typescript-eslint/types": "8.21.0", 1795 + "eslint-visitor-keys": "^4.2.0" 1796 + }, 1797 + "engines": { 1798 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1799 + }, 1800 + "funding": { 1801 + "type": "opencollective", 1802 + "url": "https://opencollective.com/typescript-eslint" 1803 + } 1804 + }, 1805 + "node_modules/@vitejs/plugin-react": { 1806 + "version": "4.3.4", 1807 + "dev": true, 1808 + "license": "MIT", 1809 + "dependencies": { 1810 + "@babel/core": "^7.26.0", 1811 + "@babel/plugin-transform-react-jsx-self": "^7.25.9", 1812 + "@babel/plugin-transform-react-jsx-source": "^7.25.9", 1813 + "@types/babel__core": "^7.20.5", 1814 + "react-refresh": "^0.14.2" 1815 + }, 1816 + "engines": { 1817 + "node": "^14.18.0 || >=16.0.0" 1818 + }, 1819 + "peerDependencies": { 1820 + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" 1821 + } 1822 + }, 1823 + "node_modules/acorn": { 1824 + "version": "8.14.0", 1825 + "dev": true, 1826 + "license": "MIT", 1827 + "bin": { 1828 + "acorn": "bin/acorn" 1829 + }, 1830 + "engines": { 1831 + "node": ">=0.4.0" 1832 + } 1833 + }, 1834 + "node_modules/acorn-jsx": { 1835 + "version": "5.3.2", 1836 + "dev": true, 1837 + "license": "MIT", 1838 + "peerDependencies": { 1839 + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 1840 + } 1841 + }, 1842 + "node_modules/ajv": { 1843 + "version": "6.12.6", 1844 + "dev": true, 1845 + "license": "MIT", 1846 + "dependencies": { 1847 + "fast-deep-equal": "^3.1.1", 1848 + "fast-json-stable-stringify": "^2.0.0", 1849 + "json-schema-traverse": "^0.4.1", 1850 + "uri-js": "^4.2.2" 1851 + }, 1852 + "funding": { 1853 + "type": "github", 1854 + "url": "https://github.com/sponsors/epoberezkin" 1855 + } 1856 + }, 1857 + "node_modules/ansi-regex": { 1858 + "version": "6.1.0", 1859 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 1860 + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 1861 + "license": "MIT", 1862 + "engines": { 1863 + "node": ">=12" 1864 + }, 1865 + "funding": { 1866 + "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1867 + } 1868 + }, 1869 + "node_modules/ansi-styles": { 1870 + "version": "4.3.0", 1871 + "license": "MIT", 1872 + "dependencies": { 1873 + "color-convert": "^2.0.1" 1874 + }, 1875 + "engines": { 1876 + "node": ">=8" 1877 + }, 1878 + "funding": { 1879 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1880 + } 1881 + }, 1882 + "node_modules/any-promise": { 1883 + "version": "1.3.0", 1884 + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 1885 + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 1886 + "license": "MIT" 1887 + }, 1888 + "node_modules/anymatch": { 1889 + "version": "3.1.3", 1890 + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1891 + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1892 + "license": "ISC", 1893 + "dependencies": { 1894 + "normalize-path": "^3.0.0", 1895 + "picomatch": "^2.0.4" 1896 + }, 1897 + "engines": { 1898 + "node": ">= 8" 1899 + } 1900 + }, 1901 + "node_modules/arg": { 1902 + "version": "5.0.2", 1903 + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 1904 + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 1905 + "license": "MIT" 1906 + }, 1907 + "node_modules/argparse": { 1908 + "version": "2.0.1", 1909 + "dev": true, 1910 + "license": "Python-2.0" 1911 + }, 1912 + "node_modules/aria-hidden": { 1913 + "version": "1.2.4", 1914 + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", 1915 + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", 1916 + "license": "MIT", 1917 + "dependencies": { 1918 + "tslib": "^2.0.0" 1919 + }, 1920 + "engines": { 1921 + "node": ">=10" 1922 + } 1923 + }, 1924 + "node_modules/asynckit": { 1925 + "version": "0.4.0", 1926 + "license": "MIT" 1927 + }, 1928 + "node_modules/autoprefixer": { 1929 + "version": "10.4.20", 1930 + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", 1931 + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", 1932 + "dev": true, 1933 + "funding": [ 1934 + { 1935 + "type": "opencollective", 1936 + "url": "https://opencollective.com/postcss/" 1937 + }, 1938 + { 1939 + "type": "tidelift", 1940 + "url": "https://tidelift.com/funding/github/npm/autoprefixer" 1941 + }, 1942 + { 1943 + "type": "github", 1944 + "url": "https://github.com/sponsors/ai" 1945 + } 1946 + ], 1947 + "license": "MIT", 1948 + "dependencies": { 1949 + "browserslist": "^4.23.3", 1950 + "caniuse-lite": "^1.0.30001646", 1951 + "fraction.js": "^4.3.7", 1952 + "normalize-range": "^0.1.2", 1953 + "picocolors": "^1.0.1", 1954 + "postcss-value-parser": "^4.2.0" 1955 + }, 1956 + "bin": { 1957 + "autoprefixer": "bin/autoprefixer" 1958 + }, 1959 + "engines": { 1960 + "node": "^10 || ^12 || >=14" 1961 + }, 1962 + "peerDependencies": { 1963 + "postcss": "^8.1.0" 1964 + } 1965 + }, 1966 + "node_modules/axios": { 1967 + "version": "1.7.9", 1968 + "license": "MIT", 1969 + "dependencies": { 1970 + "follow-redirects": "^1.15.6", 1971 + "form-data": "^4.0.0", 1972 + "proxy-from-env": "^1.1.0" 1973 + } 1974 + }, 1975 + "node_modules/babel-plugin-macros": { 1976 + "version": "3.1.0", 1977 + "license": "MIT", 1978 + "dependencies": { 1979 + "@babel/runtime": "^7.12.5", 1980 + "cosmiconfig": "^7.0.0", 1981 + "resolve": "^1.19.0" 1982 + }, 1983 + "engines": { 1984 + "node": ">=10", 1985 + "npm": ">=6" 1986 + } 1987 + }, 1988 + "node_modules/balanced-match": { 1989 + "version": "1.0.2", 1990 + "license": "MIT" 1991 + }, 1992 + "node_modules/binary-extensions": { 1993 + "version": "2.3.0", 1994 + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 1995 + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 1996 + "license": "MIT", 1997 + "engines": { 1998 + "node": ">=8" 1999 + }, 2000 + "funding": { 2001 + "url": "https://github.com/sponsors/sindresorhus" 2002 + } 2003 + }, 2004 + "node_modules/brace-expansion": { 2005 + "version": "1.1.11", 2006 + "dev": true, 2007 + "license": "MIT", 2008 + "dependencies": { 2009 + "balanced-match": "^1.0.0", 2010 + "concat-map": "0.0.1" 2011 + } 2012 + }, 2013 + "node_modules/braces": { 2014 + "version": "3.0.3", 2015 + "license": "MIT", 2016 + "dependencies": { 2017 + "fill-range": "^7.1.1" 2018 + }, 2019 + "engines": { 2020 + "node": ">=8" 2021 + } 2022 + }, 2023 + "node_modules/browserslist": { 2024 + "version": "4.24.4", 2025 + "dev": true, 2026 + "funding": [ 2027 + { 2028 + "type": "opencollective", 2029 + "url": "https://opencollective.com/browserslist" 2030 + }, 2031 + { 2032 + "type": "tidelift", 2033 + "url": "https://tidelift.com/funding/github/npm/browserslist" 2034 + }, 2035 + { 2036 + "type": "github", 2037 + "url": "https://github.com/sponsors/ai" 2038 + } 2039 + ], 2040 + "license": "MIT", 2041 + "dependencies": { 2042 + "caniuse-lite": "^1.0.30001688", 2043 + "electron-to-chromium": "^1.5.73", 2044 + "node-releases": "^2.0.19", 2045 + "update-browserslist-db": "^1.1.1" 2046 + }, 2047 + "bin": { 2048 + "browserslist": "cli.js" 2049 + }, 2050 + "engines": { 2051 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 2052 + } 2053 + }, 2054 + "node_modules/callsites": { 2055 + "version": "3.1.0", 2056 + "license": "MIT", 2057 + "engines": { 2058 + "node": ">=6" 2059 + } 2060 + }, 2061 + "node_modules/camelcase-css": { 2062 + "version": "2.0.1", 2063 + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 2064 + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 2065 + "license": "MIT", 2066 + "engines": { 2067 + "node": ">= 6" 2068 + } 2069 + }, 2070 + "node_modules/caniuse-lite": { 2071 + "version": "1.0.30001695", 2072 + "dev": true, 2073 + "funding": [ 2074 + { 2075 + "type": "opencollective", 2076 + "url": "https://opencollective.com/browserslist" 2077 + }, 2078 + { 2079 + "type": "tidelift", 2080 + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 2081 + }, 2082 + { 2083 + "type": "github", 2084 + "url": "https://github.com/sponsors/ai" 2085 + } 2086 + ], 2087 + "license": "CC-BY-4.0" 2088 + }, 2089 + "node_modules/chalk": { 2090 + "version": "4.1.2", 2091 + "dev": true, 2092 + "license": "MIT", 2093 + "dependencies": { 2094 + "ansi-styles": "^4.1.0", 2095 + "supports-color": "^7.1.0" 2096 + }, 2097 + "engines": { 2098 + "node": ">=10" 2099 + }, 2100 + "funding": { 2101 + "url": "https://github.com/chalk/chalk?sponsor=1" 2102 + } 2103 + }, 2104 + "node_modules/chokidar": { 2105 + "version": "3.6.0", 2106 + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 2107 + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 2108 + "license": "MIT", 2109 + "dependencies": { 2110 + "anymatch": "~3.1.2", 2111 + "braces": "~3.0.2", 2112 + "glob-parent": "~5.1.2", 2113 + "is-binary-path": "~2.1.0", 2114 + "is-glob": "~4.0.1", 2115 + "normalize-path": "~3.0.0", 2116 + "readdirp": "~3.6.0" 2117 + }, 2118 + "engines": { 2119 + "node": ">= 8.10.0" 2120 + }, 2121 + "funding": { 2122 + "url": "https://paulmillr.com/funding/" 2123 + }, 2124 + "optionalDependencies": { 2125 + "fsevents": "~2.3.2" 2126 + } 2127 + }, 2128 + "node_modules/chokidar/node_modules/glob-parent": { 2129 + "version": "5.1.2", 2130 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2131 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2132 + "license": "ISC", 2133 + "dependencies": { 2134 + "is-glob": "^4.0.1" 2135 + }, 2136 + "engines": { 2137 + "node": ">= 6" 2138 + } 2139 + }, 2140 + "node_modules/class-variance-authority": { 2141 + "version": "0.7.1", 2142 + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", 2143 + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", 2144 + "license": "Apache-2.0", 2145 + "dependencies": { 2146 + "clsx": "^2.1.1" 2147 + }, 2148 + "funding": { 2149 + "url": "https://polar.sh/cva" 2150 + } 2151 + }, 2152 + "node_modules/clsx": { 2153 + "version": "2.1.1", 2154 + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", 2155 + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", 2156 + "license": "MIT", 2157 + "engines": { 2158 + "node": ">=6" 2159 + } 2160 + }, 2161 + "node_modules/color-convert": { 2162 + "version": "2.0.1", 2163 + "license": "MIT", 2164 + "dependencies": { 2165 + "color-name": "~1.1.4" 2166 + }, 2167 + "engines": { 2168 + "node": ">=7.0.0" 2169 + } 2170 + }, 2171 + "node_modules/color-name": { 2172 + "version": "1.1.4", 2173 + "license": "MIT" 2174 + }, 2175 + "node_modules/combined-stream": { 2176 + "version": "1.0.8", 2177 + "license": "MIT", 2178 + "dependencies": { 2179 + "delayed-stream": "~1.0.0" 2180 + }, 2181 + "engines": { 2182 + "node": ">= 0.8" 2183 + } 2184 + }, 2185 + "node_modules/commander": { 2186 + "version": "4.1.1", 2187 + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 2188 + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 2189 + "license": "MIT", 2190 + "engines": { 2191 + "node": ">= 6" 2192 + } 2193 + }, 2194 + "node_modules/concat-map": { 2195 + "version": "0.0.1", 2196 + "dev": true, 2197 + "license": "MIT" 2198 + }, 2199 + "node_modules/convert-source-map": { 2200 + "version": "2.0.0", 2201 + "dev": true, 2202 + "license": "MIT" 2203 + }, 2204 + "node_modules/cosmiconfig": { 2205 + "version": "7.1.0", 2206 + "license": "MIT", 2207 + "dependencies": { 2208 + "@types/parse-json": "^4.0.0", 2209 + "import-fresh": "^3.2.1", 2210 + "parse-json": "^5.0.0", 2211 + "path-type": "^4.0.0", 2212 + "yaml": "^1.10.0" 2213 + }, 2214 + "engines": { 2215 + "node": ">=10" 2216 + } 2217 + }, 2218 + "node_modules/cosmiconfig/node_modules/yaml": { 2219 + "version": "1.10.2", 2220 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 2221 + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 2222 + "license": "ISC", 2223 + "engines": { 2224 + "node": ">= 6" 2225 + } 2226 + }, 2227 + "node_modules/cross-spawn": { 2228 + "version": "7.0.6", 2229 + "license": "MIT", 2230 + "dependencies": { 2231 + "path-key": "^3.1.0", 2232 + "shebang-command": "^2.0.0", 2233 + "which": "^2.0.1" 2234 + }, 2235 + "engines": { 2236 + "node": ">= 8" 2237 + } 2238 + }, 2239 + "node_modules/cssesc": { 2240 + "version": "3.0.0", 2241 + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 2242 + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 2243 + "license": "MIT", 2244 + "bin": { 2245 + "cssesc": "bin/cssesc" 2246 + }, 2247 + "engines": { 2248 + "node": ">=4" 2249 + } 2250 + }, 2251 + "node_modules/csstype": { 2252 + "version": "3.1.3", 2253 + "license": "MIT" 2254 + }, 2255 + "node_modules/debug": { 2256 + "version": "4.4.0", 2257 + "license": "MIT", 2258 + "dependencies": { 2259 + "ms": "^2.1.3" 2260 + }, 2261 + "engines": { 2262 + "node": ">=6.0" 2263 + }, 2264 + "peerDependenciesMeta": { 2265 + "supports-color": { 2266 + "optional": true 2267 + } 2268 + } 2269 + }, 2270 + "node_modules/deep-is": { 2271 + "version": "0.1.4", 2272 + "dev": true, 2273 + "license": "MIT" 2274 + }, 2275 + "node_modules/delayed-stream": { 2276 + "version": "1.0.0", 2277 + "license": "MIT", 2278 + "engines": { 2279 + "node": ">=0.4.0" 2280 + } 2281 + }, 2282 + "node_modules/detect-libc": { 2283 + "version": "1.0.3", 2284 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 2285 + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", 2286 + "license": "Apache-2.0", 2287 + "bin": { 2288 + "detect-libc": "bin/detect-libc.js" 2289 + }, 2290 + "engines": { 2291 + "node": ">=0.10" 2292 + } 2293 + }, 2294 + "node_modules/detect-node-es": { 2295 + "version": "1.1.0", 2296 + "license": "MIT" 2297 + }, 2298 + "node_modules/didyoumean": { 2299 + "version": "1.2.2", 2300 + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 2301 + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 2302 + "license": "Apache-2.0" 2303 + }, 2304 + "node_modules/dlv": { 2305 + "version": "1.1.3", 2306 + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 2307 + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 2308 + "license": "MIT" 2309 + }, 2310 + "node_modules/eastasianwidth": { 2311 + "version": "0.2.0", 2312 + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 2313 + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 2314 + "license": "MIT" 2315 + }, 2316 + "node_modules/electron-to-chromium": { 2317 + "version": "1.5.88", 2318 + "dev": true, 2319 + "license": "ISC" 2320 + }, 2321 + "node_modules/emoji-regex": { 2322 + "version": "9.2.2", 2323 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 2324 + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 2325 + "license": "MIT" 2326 + }, 2327 + "node_modules/enhanced-resolve": { 2328 + "version": "5.18.0", 2329 + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", 2330 + "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", 2331 + "license": "MIT", 2332 + "dependencies": { 2333 + "graceful-fs": "^4.2.4", 2334 + "tapable": "^2.2.0" 2335 + }, 2336 + "engines": { 2337 + "node": ">=10.13.0" 2338 + } 2339 + }, 2340 + "node_modules/error-ex": { 2341 + "version": "1.3.2", 2342 + "license": "MIT", 2343 + "dependencies": { 2344 + "is-arrayish": "^0.2.1" 2345 + } 2346 + }, 2347 + "node_modules/esbuild": { 2348 + "version": "0.24.2", 2349 + "hasInstallScript": true, 2350 + "license": "MIT", 2351 + "bin": { 2352 + "esbuild": "bin/esbuild" 2353 + }, 2354 + "engines": { 2355 + "node": ">=18" 2356 + }, 2357 + "optionalDependencies": { 2358 + "@esbuild/aix-ppc64": "0.24.2", 2359 + "@esbuild/android-arm": "0.24.2", 2360 + "@esbuild/android-arm64": "0.24.2", 2361 + "@esbuild/android-x64": "0.24.2", 2362 + "@esbuild/darwin-arm64": "0.24.2", 2363 + "@esbuild/darwin-x64": "0.24.2", 2364 + "@esbuild/freebsd-arm64": "0.24.2", 2365 + "@esbuild/freebsd-x64": "0.24.2", 2366 + "@esbuild/linux-arm": "0.24.2", 2367 + "@esbuild/linux-arm64": "0.24.2", 2368 + "@esbuild/linux-ia32": "0.24.2", 2369 + "@esbuild/linux-loong64": "0.24.2", 2370 + "@esbuild/linux-mips64el": "0.24.2", 2371 + "@esbuild/linux-ppc64": "0.24.2", 2372 + "@esbuild/linux-riscv64": "0.24.2", 2373 + "@esbuild/linux-s390x": "0.24.2", 2374 + "@esbuild/linux-x64": "0.24.2", 2375 + "@esbuild/netbsd-arm64": "0.24.2", 2376 + "@esbuild/netbsd-x64": "0.24.2", 2377 + "@esbuild/openbsd-arm64": "0.24.2", 2378 + "@esbuild/openbsd-x64": "0.24.2", 2379 + "@esbuild/sunos-x64": "0.24.2", 2380 + "@esbuild/win32-arm64": "0.24.2", 2381 + "@esbuild/win32-ia32": "0.24.2", 2382 + "@esbuild/win32-x64": "0.24.2" 2383 + } 2384 + }, 2385 + "node_modules/escalade": { 2386 + "version": "3.2.0", 2387 + "dev": true, 2388 + "license": "MIT", 2389 + "engines": { 2390 + "node": ">=6" 2391 + } 2392 + }, 2393 + "node_modules/escape-string-regexp": { 2394 + "version": "4.0.0", 2395 + "license": "MIT", 2396 + "engines": { 2397 + "node": ">=10" 2398 + }, 2399 + "funding": { 2400 + "url": "https://github.com/sponsors/sindresorhus" 2401 + } 2402 + }, 2403 + "node_modules/eslint": { 2404 + "version": "9.19.0", 2405 + "dev": true, 2406 + "license": "MIT", 2407 + "dependencies": { 2408 + "@eslint-community/eslint-utils": "^4.2.0", 2409 + "@eslint-community/regexpp": "^4.12.1", 2410 + "@eslint/config-array": "^0.19.0", 2411 + "@eslint/core": "^0.10.0", 2412 + "@eslint/eslintrc": "^3.2.0", 2413 + "@eslint/js": "9.19.0", 2414 + "@eslint/plugin-kit": "^0.2.5", 2415 + "@humanfs/node": "^0.16.6", 2416 + "@humanwhocodes/module-importer": "^1.0.1", 2417 + "@humanwhocodes/retry": "^0.4.1", 2418 + "@types/estree": "^1.0.6", 2419 + "@types/json-schema": "^7.0.15", 2420 + "ajv": "^6.12.4", 2421 + "chalk": "^4.0.0", 2422 + "cross-spawn": "^7.0.6", 2423 + "debug": "^4.3.2", 2424 + "escape-string-regexp": "^4.0.0", 2425 + "eslint-scope": "^8.2.0", 2426 + "eslint-visitor-keys": "^4.2.0", 2427 + "espree": "^10.3.0", 2428 + "esquery": "^1.5.0", 2429 + "esutils": "^2.0.2", 2430 + "fast-deep-equal": "^3.1.3", 2431 + "file-entry-cache": "^8.0.0", 2432 + "find-up": "^5.0.0", 2433 + "glob-parent": "^6.0.2", 2434 + "ignore": "^5.2.0", 2435 + "imurmurhash": "^0.1.4", 2436 + "is-glob": "^4.0.0", 2437 + "json-stable-stringify-without-jsonify": "^1.0.1", 2438 + "lodash.merge": "^4.6.2", 2439 + "minimatch": "^3.1.2", 2440 + "natural-compare": "^1.4.0", 2441 + "optionator": "^0.9.3" 2442 + }, 2443 + "bin": { 2444 + "eslint": "bin/eslint.js" 2445 + }, 2446 + "engines": { 2447 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2448 + }, 2449 + "funding": { 2450 + "url": "https://eslint.org/donate" 2451 + }, 2452 + "peerDependencies": { 2453 + "jiti": "*" 2454 + }, 2455 + "peerDependenciesMeta": { 2456 + "jiti": { 2457 + "optional": true 2458 + } 2459 + } 2460 + }, 2461 + "node_modules/eslint-plugin-react-hooks": { 2462 + "version": "5.1.0", 2463 + "dev": true, 2464 + "license": "MIT", 2465 + "engines": { 2466 + "node": ">=10" 2467 + }, 2468 + "peerDependencies": { 2469 + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" 2470 + } 2471 + }, 2472 + "node_modules/eslint-plugin-react-refresh": { 2473 + "version": "0.4.18", 2474 + "dev": true, 2475 + "license": "MIT", 2476 + "peerDependencies": { 2477 + "eslint": ">=8.40" 2478 + } 2479 + }, 2480 + "node_modules/eslint-scope": { 2481 + "version": "8.2.0", 2482 + "dev": true, 2483 + "license": "BSD-2-Clause", 2484 + "dependencies": { 2485 + "esrecurse": "^4.3.0", 2486 + "estraverse": "^5.2.0" 2487 + }, 2488 + "engines": { 2489 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2490 + }, 2491 + "funding": { 2492 + "url": "https://opencollective.com/eslint" 2493 + } 2494 + }, 2495 + "node_modules/eslint-visitor-keys": { 2496 + "version": "4.2.0", 2497 + "dev": true, 2498 + "license": "Apache-2.0", 2499 + "engines": { 2500 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2501 + }, 2502 + "funding": { 2503 + "url": "https://opencollective.com/eslint" 2504 + } 2505 + }, 2506 + "node_modules/espree": { 2507 + "version": "10.3.0", 2508 + "dev": true, 2509 + "license": "BSD-2-Clause", 2510 + "dependencies": { 2511 + "acorn": "^8.14.0", 2512 + "acorn-jsx": "^5.3.2", 2513 + "eslint-visitor-keys": "^4.2.0" 2514 + }, 2515 + "engines": { 2516 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2517 + }, 2518 + "funding": { 2519 + "url": "https://opencollective.com/eslint" 2520 + } 2521 + }, 2522 + "node_modules/esquery": { 2523 + "version": "1.6.0", 2524 + "dev": true, 2525 + "license": "BSD-3-Clause", 2526 + "dependencies": { 2527 + "estraverse": "^5.1.0" 2528 + }, 2529 + "engines": { 2530 + "node": ">=0.10" 2531 + } 2532 + }, 2533 + "node_modules/esrecurse": { 2534 + "version": "4.3.0", 2535 + "dev": true, 2536 + "license": "BSD-2-Clause", 2537 + "dependencies": { 2538 + "estraverse": "^5.2.0" 2539 + }, 2540 + "engines": { 2541 + "node": ">=4.0" 2542 + } 2543 + }, 2544 + "node_modules/estraverse": { 2545 + "version": "5.3.0", 2546 + "dev": true, 2547 + "license": "BSD-2-Clause", 2548 + "engines": { 2549 + "node": ">=4.0" 2550 + } 2551 + }, 2552 + "node_modules/esutils": { 2553 + "version": "2.0.3", 2554 + "dev": true, 2555 + "license": "BSD-2-Clause", 2556 + "engines": { 2557 + "node": ">=0.10.0" 2558 + } 2559 + }, 2560 + "node_modules/fast-deep-equal": { 2561 + "version": "3.1.3", 2562 + "license": "MIT" 2563 + }, 2564 + "node_modules/fast-glob": { 2565 + "version": "3.3.3", 2566 + "license": "MIT", 2567 + "dependencies": { 2568 + "@nodelib/fs.stat": "^2.0.2", 2569 + "@nodelib/fs.walk": "^1.2.3", 2570 + "glob-parent": "^5.1.2", 2571 + "merge2": "^1.3.0", 2572 + "micromatch": "^4.0.8" 2573 + }, 2574 + "engines": { 2575 + "node": ">=8.6.0" 2576 + } 2577 + }, 2578 + "node_modules/fast-glob/node_modules/glob-parent": { 2579 + "version": "5.1.2", 2580 + "license": "ISC", 2581 + "dependencies": { 2582 + "is-glob": "^4.0.1" 2583 + }, 2584 + "engines": { 2585 + "node": ">= 6" 2586 + } 2587 + }, 2588 + "node_modules/fast-json-stable-stringify": { 2589 + "version": "2.1.0", 2590 + "dev": true, 2591 + "license": "MIT" 2592 + }, 2593 + "node_modules/fast-levenshtein": { 2594 + "version": "2.0.6", 2595 + "dev": true, 2596 + "license": "MIT" 2597 + }, 2598 + "node_modules/fastq": { 2599 + "version": "1.18.0", 2600 + "license": "ISC", 2601 + "dependencies": { 2602 + "reusify": "^1.0.4" 2603 + } 2604 + }, 2605 + "node_modules/file-entry-cache": { 2606 + "version": "8.0.0", 2607 + "dev": true, 2608 + "license": "MIT", 2609 + "dependencies": { 2610 + "flat-cache": "^4.0.0" 2611 + }, 2612 + "engines": { 2613 + "node": ">=16.0.0" 2614 + } 2615 + }, 2616 + "node_modules/fill-range": { 2617 + "version": "7.1.1", 2618 + "license": "MIT", 2619 + "dependencies": { 2620 + "to-regex-range": "^5.0.1" 2621 + }, 2622 + "engines": { 2623 + "node": ">=8" 2624 + } 2625 + }, 2626 + "node_modules/find-root": { 2627 + "version": "1.1.0", 2628 + "license": "MIT" 2629 + }, 2630 + "node_modules/find-up": { 2631 + "version": "5.0.0", 2632 + "dev": true, 2633 + "license": "MIT", 2634 + "dependencies": { 2635 + "locate-path": "^6.0.0", 2636 + "path-exists": "^4.0.0" 2637 + }, 2638 + "engines": { 2639 + "node": ">=10" 2640 + }, 2641 + "funding": { 2642 + "url": "https://github.com/sponsors/sindresorhus" 2643 + } 2644 + }, 2645 + "node_modules/flat-cache": { 2646 + "version": "4.0.1", 2647 + "dev": true, 2648 + "license": "MIT", 2649 + "dependencies": { 2650 + "flatted": "^3.2.9", 2651 + "keyv": "^4.5.4" 2652 + }, 2653 + "engines": { 2654 + "node": ">=16" 2655 + } 2656 + }, 2657 + "node_modules/flatted": { 2658 + "version": "3.3.2", 2659 + "dev": true, 2660 + "license": "ISC" 2661 + }, 2662 + "node_modules/follow-redirects": { 2663 + "version": "1.15.9", 2664 + "funding": [ 2665 + { 2666 + "type": "individual", 2667 + "url": "https://github.com/sponsors/RubenVerborgh" 2668 + } 2669 + ], 2670 + "license": "MIT", 2671 + "engines": { 2672 + "node": ">=4.0" 2673 + }, 2674 + "peerDependenciesMeta": { 2675 + "debug": { 2676 + "optional": true 2677 + } 2678 + } 2679 + }, 2680 + "node_modules/foreground-child": { 2681 + "version": "3.3.0", 2682 + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 2683 + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 2684 + "license": "ISC", 2685 + "dependencies": { 2686 + "cross-spawn": "^7.0.0", 2687 + "signal-exit": "^4.0.1" 2688 + }, 2689 + "engines": { 2690 + "node": ">=14" 2691 + }, 2692 + "funding": { 2693 + "url": "https://github.com/sponsors/isaacs" 2694 + } 2695 + }, 2696 + "node_modules/form-data": { 2697 + "version": "4.0.1", 2698 + "license": "MIT", 2699 + "dependencies": { 2700 + "asynckit": "^0.4.0", 2701 + "combined-stream": "^1.0.8", 2702 + "mime-types": "^2.1.12" 2703 + }, 2704 + "engines": { 2705 + "node": ">= 6" 2706 + } 2707 + }, 2708 + "node_modules/fraction.js": { 2709 + "version": "4.3.7", 2710 + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", 2711 + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", 2712 + "dev": true, 2713 + "license": "MIT", 2714 + "engines": { 2715 + "node": "*" 2716 + }, 2717 + "funding": { 2718 + "type": "patreon", 2719 + "url": "https://github.com/sponsors/rawify" 2720 + } 2721 + }, 2722 + "node_modules/fsevents": { 2723 + "version": "2.3.3", 2724 + "license": "MIT", 2725 + "optional": true, 2726 + "os": [ 2727 + "darwin" 2728 + ], 2729 + "engines": { 2730 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 2731 + } 2732 + }, 2733 + "node_modules/function-bind": { 2734 + "version": "1.1.2", 2735 + "license": "MIT", 2736 + "funding": { 2737 + "url": "https://github.com/sponsors/ljharb" 2738 + } 2739 + }, 2740 + "node_modules/gensync": { 2741 + "version": "1.0.0-beta.2", 2742 + "dev": true, 2743 + "license": "MIT", 2744 + "engines": { 2745 + "node": ">=6.9.0" 2746 + } 2747 + }, 2748 + "node_modules/get-nonce": { 2749 + "version": "1.0.1", 2750 + "license": "MIT", 2751 + "engines": { 2752 + "node": ">=6" 2753 + } 2754 + }, 2755 + "node_modules/glob": { 2756 + "version": "10.4.5", 2757 + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 2758 + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 2759 + "license": "ISC", 2760 + "dependencies": { 2761 + "foreground-child": "^3.1.0", 2762 + "jackspeak": "^3.1.2", 2763 + "minimatch": "^9.0.4", 2764 + "minipass": "^7.1.2", 2765 + "package-json-from-dist": "^1.0.0", 2766 + "path-scurry": "^1.11.1" 2767 + }, 2768 + "bin": { 2769 + "glob": "dist/esm/bin.mjs" 2770 + }, 2771 + "funding": { 2772 + "url": "https://github.com/sponsors/isaacs" 2773 + } 2774 + }, 2775 + "node_modules/glob-parent": { 2776 + "version": "6.0.2", 2777 + "license": "ISC", 2778 + "dependencies": { 2779 + "is-glob": "^4.0.3" 2780 + }, 2781 + "engines": { 2782 + "node": ">=10.13.0" 2783 + } 2784 + }, 2785 + "node_modules/glob/node_modules/brace-expansion": { 2786 + "version": "2.0.1", 2787 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 2788 + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 2789 + "license": "MIT", 2790 + "dependencies": { 2791 + "balanced-match": "^1.0.0" 2792 + } 2793 + }, 2794 + "node_modules/glob/node_modules/minimatch": { 2795 + "version": "9.0.5", 2796 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 2797 + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 2798 + "license": "ISC", 2799 + "dependencies": { 2800 + "brace-expansion": "^2.0.1" 2801 + }, 2802 + "engines": { 2803 + "node": ">=16 || 14 >=14.17" 2804 + }, 2805 + "funding": { 2806 + "url": "https://github.com/sponsors/isaacs" 2807 + } 2808 + }, 2809 + "node_modules/globals": { 2810 + "version": "15.14.0", 2811 + "dev": true, 2812 + "license": "MIT", 2813 + "engines": { 2814 + "node": ">=18" 2815 + }, 2816 + "funding": { 2817 + "url": "https://github.com/sponsors/sindresorhus" 2818 + } 2819 + }, 2820 + "node_modules/graceful-fs": { 2821 + "version": "4.2.11", 2822 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 2823 + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 2824 + "license": "ISC" 2825 + }, 2826 + "node_modules/graphemer": { 2827 + "version": "1.4.0", 2828 + "dev": true, 2829 + "license": "MIT" 2830 + }, 2831 + "node_modules/has-flag": { 2832 + "version": "4.0.0", 2833 + "dev": true, 2834 + "license": "MIT", 2835 + "engines": { 2836 + "node": ">=8" 2837 + } 2838 + }, 2839 + "node_modules/hasown": { 2840 + "version": "2.0.2", 2841 + "license": "MIT", 2842 + "dependencies": { 2843 + "function-bind": "^1.1.2" 2844 + }, 2845 + "engines": { 2846 + "node": ">= 0.4" 2847 + } 2848 + }, 2849 + "node_modules/hoist-non-react-statics": { 2850 + "version": "3.3.2", 2851 + "license": "BSD-3-Clause", 2852 + "dependencies": { 2853 + "react-is": "^16.7.0" 2854 + } 2855 + }, 2856 + "node_modules/ignore": { 2857 + "version": "5.3.2", 2858 + "dev": true, 2859 + "license": "MIT", 2860 + "engines": { 2861 + "node": ">= 4" 2862 + } 2863 + }, 2864 + "node_modules/import-fresh": { 2865 + "version": "3.3.0", 2866 + "license": "MIT", 2867 + "dependencies": { 2868 + "parent-module": "^1.0.0", 2869 + "resolve-from": "^4.0.0" 2870 + }, 2871 + "engines": { 2872 + "node": ">=6" 2873 + }, 2874 + "funding": { 2875 + "url": "https://github.com/sponsors/sindresorhus" 2876 + } 2877 + }, 2878 + "node_modules/imurmurhash": { 2879 + "version": "0.1.4", 2880 + "dev": true, 2881 + "license": "MIT", 2882 + "engines": { 2883 + "node": ">=0.8.19" 2884 + } 2885 + }, 2886 + "node_modules/is-arrayish": { 2887 + "version": "0.2.1", 2888 + "license": "MIT" 2889 + }, 2890 + "node_modules/is-binary-path": { 2891 + "version": "2.1.0", 2892 + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2893 + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2894 + "license": "MIT", 2895 + "dependencies": { 2896 + "binary-extensions": "^2.0.0" 2897 + }, 2898 + "engines": { 2899 + "node": ">=8" 2900 + } 2901 + }, 2902 + "node_modules/is-core-module": { 2903 + "version": "2.16.1", 2904 + "license": "MIT", 2905 + "dependencies": { 2906 + "hasown": "^2.0.2" 2907 + }, 2908 + "engines": { 2909 + "node": ">= 0.4" 2910 + }, 2911 + "funding": { 2912 + "url": "https://github.com/sponsors/ljharb" 2913 + } 2914 + }, 2915 + "node_modules/is-extglob": { 2916 + "version": "2.1.1", 2917 + "license": "MIT", 2918 + "engines": { 2919 + "node": ">=0.10.0" 2920 + } 2921 + }, 2922 + "node_modules/is-fullwidth-code-point": { 2923 + "version": "3.0.0", 2924 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2925 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2926 + "license": "MIT", 2927 + "engines": { 2928 + "node": ">=8" 2929 + } 2930 + }, 2931 + "node_modules/is-glob": { 2932 + "version": "4.0.3", 2933 + "license": "MIT", 2934 + "dependencies": { 2935 + "is-extglob": "^2.1.1" 2936 + }, 2937 + "engines": { 2938 + "node": ">=0.10.0" 2939 + } 2940 + }, 2941 + "node_modules/is-number": { 2942 + "version": "7.0.0", 2943 + "license": "MIT", 2944 + "engines": { 2945 + "node": ">=0.12.0" 2946 + } 2947 + }, 2948 + "node_modules/isexe": { 2949 + "version": "2.0.0", 2950 + "license": "ISC" 2951 + }, 2952 + "node_modules/jackspeak": { 2953 + "version": "3.4.3", 2954 + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 2955 + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 2956 + "license": "BlueOak-1.0.0", 2957 + "dependencies": { 2958 + "@isaacs/cliui": "^8.0.2" 2959 + }, 2960 + "funding": { 2961 + "url": "https://github.com/sponsors/isaacs" 2962 + }, 2963 + "optionalDependencies": { 2964 + "@pkgjs/parseargs": "^0.11.0" 2965 + } 2966 + }, 2967 + "node_modules/jiti": { 2968 + "version": "2.4.2", 2969 + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", 2970 + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", 2971 + "license": "MIT", 2972 + "bin": { 2973 + "jiti": "lib/jiti-cli.mjs" 2974 + } 2975 + }, 2976 + "node_modules/js-tokens": { 2977 + "version": "4.0.0", 2978 + "license": "MIT" 2979 + }, 2980 + "node_modules/js-yaml": { 2981 + "version": "4.1.0", 2982 + "dev": true, 2983 + "license": "MIT", 2984 + "dependencies": { 2985 + "argparse": "^2.0.1" 2986 + }, 2987 + "bin": { 2988 + "js-yaml": "bin/js-yaml.js" 2989 + } 2990 + }, 2991 + "node_modules/jsesc": { 2992 + "version": "3.1.0", 2993 + "license": "MIT", 2994 + "bin": { 2995 + "jsesc": "bin/jsesc" 2996 + }, 2997 + "engines": { 2998 + "node": ">=6" 2999 + } 3000 + }, 3001 + "node_modules/json-buffer": { 3002 + "version": "3.0.1", 3003 + "dev": true, 3004 + "license": "MIT" 3005 + }, 3006 + "node_modules/json-parse-even-better-errors": { 3007 + "version": "2.3.1", 3008 + "license": "MIT" 3009 + }, 3010 + "node_modules/json-schema-traverse": { 3011 + "version": "0.4.1", 3012 + "dev": true, 3013 + "license": "MIT" 3014 + }, 3015 + "node_modules/json-stable-stringify-without-jsonify": { 3016 + "version": "1.0.1", 3017 + "dev": true, 3018 + "license": "MIT" 3019 + }, 3020 + "node_modules/json5": { 3021 + "version": "2.2.3", 3022 + "dev": true, 3023 + "license": "MIT", 3024 + "bin": { 3025 + "json5": "lib/cli.js" 3026 + }, 3027 + "engines": { 3028 + "node": ">=6" 3029 + } 3030 + }, 3031 + "node_modules/keyv": { 3032 + "version": "4.5.4", 3033 + "dev": true, 3034 + "license": "MIT", 3035 + "dependencies": { 3036 + "json-buffer": "3.0.1" 3037 + } 3038 + }, 3039 + "node_modules/klona": { 3040 + "version": "2.0.6", 3041 + "license": "MIT", 3042 + "engines": { 3043 + "node": ">= 8" 3044 + } 3045 + }, 3046 + "node_modules/levn": { 3047 + "version": "0.4.1", 3048 + "dev": true, 3049 + "license": "MIT", 3050 + "dependencies": { 3051 + "prelude-ls": "^1.2.1", 3052 + "type-check": "~0.4.0" 3053 + }, 3054 + "engines": { 3055 + "node": ">= 0.8.0" 3056 + } 3057 + }, 3058 + "node_modules/lightningcss": { 3059 + "version": "1.29.1", 3060 + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz", 3061 + "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==", 3062 + "license": "MPL-2.0", 3063 + "dependencies": { 3064 + "detect-libc": "^1.0.3" 3065 + }, 3066 + "engines": { 3067 + "node": ">= 12.0.0" 3068 + }, 3069 + "funding": { 3070 + "type": "opencollective", 3071 + "url": "https://opencollective.com/parcel" 3072 + }, 3073 + "optionalDependencies": { 3074 + "lightningcss-darwin-arm64": "1.29.1", 3075 + "lightningcss-darwin-x64": "1.29.1", 3076 + "lightningcss-freebsd-x64": "1.29.1", 3077 + "lightningcss-linux-arm-gnueabihf": "1.29.1", 3078 + "lightningcss-linux-arm64-gnu": "1.29.1", 3079 + "lightningcss-linux-arm64-musl": "1.29.1", 3080 + "lightningcss-linux-x64-gnu": "1.29.1", 3081 + "lightningcss-linux-x64-musl": "1.29.1", 3082 + "lightningcss-win32-arm64-msvc": "1.29.1", 3083 + "lightningcss-win32-x64-msvc": "1.29.1" 3084 + } 3085 + }, 3086 + "node_modules/lightningcss-darwin-arm64": { 3087 + "version": "1.29.1", 3088 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz", 3089 + "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==", 3090 + "cpu": [ 3091 + "arm64" 3092 + ], 3093 + "license": "MPL-2.0", 3094 + "optional": true, 3095 + "os": [ 3096 + "darwin" 3097 + ], 3098 + "engines": { 3099 + "node": ">= 12.0.0" 3100 + }, 3101 + "funding": { 3102 + "type": "opencollective", 3103 + "url": "https://opencollective.com/parcel" 3104 + } 3105 + }, 3106 + "node_modules/lightningcss-darwin-x64": { 3107 + "version": "1.29.1", 3108 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz", 3109 + "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==", 3110 + "cpu": [ 3111 + "x64" 3112 + ], 3113 + "license": "MPL-2.0", 3114 + "optional": true, 3115 + "os": [ 3116 + "darwin" 3117 + ], 3118 + "engines": { 3119 + "node": ">= 12.0.0" 3120 + }, 3121 + "funding": { 3122 + "type": "opencollective", 3123 + "url": "https://opencollective.com/parcel" 3124 + } 3125 + }, 3126 + "node_modules/lightningcss-freebsd-x64": { 3127 + "version": "1.29.1", 3128 + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz", 3129 + "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==", 3130 + "cpu": [ 3131 + "x64" 3132 + ], 3133 + "license": "MPL-2.0", 3134 + "optional": true, 3135 + "os": [ 3136 + "freebsd" 3137 + ], 3138 + "engines": { 3139 + "node": ">= 12.0.0" 3140 + }, 3141 + "funding": { 3142 + "type": "opencollective", 3143 + "url": "https://opencollective.com/parcel" 3144 + } 3145 + }, 3146 + "node_modules/lightningcss-linux-arm-gnueabihf": { 3147 + "version": "1.29.1", 3148 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz", 3149 + "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==", 3150 + "cpu": [ 3151 + "arm" 3152 + ], 3153 + "license": "MPL-2.0", 3154 + "optional": true, 3155 + "os": [ 3156 + "linux" 3157 + ], 3158 + "engines": { 3159 + "node": ">= 12.0.0" 3160 + }, 3161 + "funding": { 3162 + "type": "opencollective", 3163 + "url": "https://opencollective.com/parcel" 3164 + } 3165 + }, 3166 + "node_modules/lightningcss-linux-arm64-gnu": { 3167 + "version": "1.29.1", 3168 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz", 3169 + "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==", 3170 + "cpu": [ 3171 + "arm64" 3172 + ], 3173 + "license": "MPL-2.0", 3174 + "optional": true, 3175 + "os": [ 3176 + "linux" 3177 + ], 3178 + "engines": { 3179 + "node": ">= 12.0.0" 3180 + }, 3181 + "funding": { 3182 + "type": "opencollective", 3183 + "url": "https://opencollective.com/parcel" 3184 + } 3185 + }, 3186 + "node_modules/lightningcss-linux-arm64-musl": { 3187 + "version": "1.29.1", 3188 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz", 3189 + "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==", 3190 + "cpu": [ 3191 + "arm64" 3192 + ], 3193 + "license": "MPL-2.0", 3194 + "optional": true, 3195 + "os": [ 3196 + "linux" 3197 + ], 3198 + "engines": { 3199 + "node": ">= 12.0.0" 3200 + }, 3201 + "funding": { 3202 + "type": "opencollective", 3203 + "url": "https://opencollective.com/parcel" 3204 + } 3205 + }, 3206 + "node_modules/lightningcss-linux-x64-gnu": { 3207 + "version": "1.29.1", 3208 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz", 3209 + "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==", 3210 + "cpu": [ 3211 + "x64" 3212 + ], 3213 + "license": "MPL-2.0", 3214 + "optional": true, 3215 + "os": [ 3216 + "linux" 3217 + ], 3218 + "engines": { 3219 + "node": ">= 12.0.0" 3220 + }, 3221 + "funding": { 3222 + "type": "opencollective", 3223 + "url": "https://opencollective.com/parcel" 3224 + } 3225 + }, 3226 + "node_modules/lightningcss-linux-x64-musl": { 3227 + "version": "1.29.1", 3228 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz", 3229 + "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==", 3230 + "cpu": [ 3231 + "x64" 3232 + ], 3233 + "license": "MPL-2.0", 3234 + "optional": true, 3235 + "os": [ 3236 + "linux" 3237 + ], 3238 + "engines": { 3239 + "node": ">= 12.0.0" 3240 + }, 3241 + "funding": { 3242 + "type": "opencollective", 3243 + "url": "https://opencollective.com/parcel" 3244 + } 3245 + }, 3246 + "node_modules/lightningcss-win32-arm64-msvc": { 3247 + "version": "1.29.1", 3248 + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz", 3249 + "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==", 3250 + "cpu": [ 3251 + "arm64" 3252 + ], 3253 + "license": "MPL-2.0", 3254 + "optional": true, 3255 + "os": [ 3256 + "win32" 3257 + ], 3258 + "engines": { 3259 + "node": ">= 12.0.0" 3260 + }, 3261 + "funding": { 3262 + "type": "opencollective", 3263 + "url": "https://opencollective.com/parcel" 3264 + } 3265 + }, 3266 + "node_modules/lightningcss-win32-x64-msvc": { 3267 + "version": "1.29.1", 3268 + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz", 3269 + "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==", 3270 + "cpu": [ 3271 + "x64" 3272 + ], 3273 + "license": "MPL-2.0", 3274 + "optional": true, 3275 + "os": [ 3276 + "win32" 3277 + ], 3278 + "engines": { 3279 + "node": ">= 12.0.0" 3280 + }, 3281 + "funding": { 3282 + "type": "opencollective", 3283 + "url": "https://opencollective.com/parcel" 3284 + } 3285 + }, 3286 + "node_modules/lilconfig": { 3287 + "version": "3.1.3", 3288 + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", 3289 + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", 3290 + "license": "MIT", 3291 + "engines": { 3292 + "node": ">=14" 3293 + }, 3294 + "funding": { 3295 + "url": "https://github.com/sponsors/antonk52" 3296 + } 3297 + }, 3298 + "node_modules/lines-and-columns": { 3299 + "version": "1.2.4", 3300 + "license": "MIT" 3301 + }, 3302 + "node_modules/locate-path": { 3303 + "version": "6.0.0", 3304 + "dev": true, 3305 + "license": "MIT", 3306 + "dependencies": { 3307 + "p-locate": "^5.0.0" 3308 + }, 3309 + "engines": { 3310 + "node": ">=10" 3311 + }, 3312 + "funding": { 3313 + "url": "https://github.com/sponsors/sindresorhus" 3314 + } 3315 + }, 3316 + "node_modules/lodash.merge": { 3317 + "version": "4.6.2", 3318 + "dev": true, 3319 + "license": "MIT" 3320 + }, 3321 + "node_modules/loose-envify": { 3322 + "version": "1.4.0", 3323 + "license": "MIT", 3324 + "dependencies": { 3325 + "js-tokens": "^3.0.0 || ^4.0.0" 3326 + }, 3327 + "bin": { 3328 + "loose-envify": "cli.js" 3329 + } 3330 + }, 3331 + "node_modules/lru-cache": { 3332 + "version": "5.1.1", 3333 + "dev": true, 3334 + "license": "ISC", 3335 + "dependencies": { 3336 + "yallist": "^3.0.2" 3337 + } 3338 + }, 3339 + "node_modules/lucide-react": { 3340 + "version": "0.474.0", 3341 + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.474.0.tgz", 3342 + "integrity": "sha512-CmghgHkh0OJNmxGKWc0qfPJCYHASPMVSyGY8fj3xgk4v84ItqDg64JNKFZn5hC6E0vHi6gxnbCgwhyVB09wQtA==", 3343 + "license": "ISC", 3344 + "peerDependencies": { 3345 + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" 3346 + } 3347 + }, 3348 + "node_modules/merge2": { 3349 + "version": "1.4.1", 3350 + "license": "MIT", 3351 + "engines": { 3352 + "node": ">= 8" 3353 + } 3354 + }, 3355 + "node_modules/micromatch": { 3356 + "version": "4.0.8", 3357 + "license": "MIT", 3358 + "dependencies": { 3359 + "braces": "^3.0.3", 3360 + "picomatch": "^2.3.1" 3361 + }, 3362 + "engines": { 3363 + "node": ">=8.6" 3364 + } 3365 + }, 3366 + "node_modules/mime-db": { 3367 + "version": "1.52.0", 3368 + "license": "MIT", 3369 + "engines": { 3370 + "node": ">= 0.6" 3371 + } 3372 + }, 3373 + "node_modules/mime-types": { 3374 + "version": "2.1.35", 3375 + "license": "MIT", 3376 + "dependencies": { 3377 + "mime-db": "1.52.0" 3378 + }, 3379 + "engines": { 3380 + "node": ">= 0.6" 3381 + } 3382 + }, 3383 + "node_modules/minimatch": { 3384 + "version": "3.1.2", 3385 + "dev": true, 3386 + "license": "ISC", 3387 + "dependencies": { 3388 + "brace-expansion": "^1.1.7" 3389 + }, 3390 + "engines": { 3391 + "node": "*" 3392 + } 3393 + }, 3394 + "node_modules/minipass": { 3395 + "version": "7.1.2", 3396 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 3397 + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 3398 + "license": "ISC", 3399 + "engines": { 3400 + "node": ">=16 || 14 >=14.17" 3401 + } 3402 + }, 3403 + "node_modules/ms": { 3404 + "version": "2.1.3", 3405 + "license": "MIT" 3406 + }, 3407 + "node_modules/mz": { 3408 + "version": "2.7.0", 3409 + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 3410 + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 3411 + "license": "MIT", 3412 + "dependencies": { 3413 + "any-promise": "^1.0.0", 3414 + "object-assign": "^4.0.1", 3415 + "thenify-all": "^1.0.0" 3416 + } 3417 + }, 3418 + "node_modules/nanoid": { 3419 + "version": "3.3.8", 3420 + "funding": [ 3421 + { 3422 + "type": "github", 3423 + "url": "https://github.com/sponsors/ai" 3424 + } 3425 + ], 3426 + "license": "MIT", 3427 + "bin": { 3428 + "nanoid": "bin/nanoid.cjs" 3429 + }, 3430 + "engines": { 3431 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 3432 + } 3433 + }, 3434 + "node_modules/natural-compare": { 3435 + "version": "1.4.0", 3436 + "dev": true, 3437 + "license": "MIT" 3438 + }, 3439 + "node_modules/node-releases": { 3440 + "version": "2.0.19", 3441 + "dev": true, 3442 + "license": "MIT" 3443 + }, 3444 + "node_modules/normalize-path": { 3445 + "version": "3.0.0", 3446 + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 3447 + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 3448 + "license": "MIT", 3449 + "engines": { 3450 + "node": ">=0.10.0" 3451 + } 3452 + }, 3453 + "node_modules/normalize-range": { 3454 + "version": "0.1.2", 3455 + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 3456 + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 3457 + "dev": true, 3458 + "license": "MIT", 3459 + "engines": { 3460 + "node": ">=0.10.0" 3461 + } 3462 + }, 3463 + "node_modules/object-assign": { 3464 + "version": "4.1.1", 3465 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 3466 + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 3467 + "license": "MIT", 3468 + "engines": { 3469 + "node": ">=0.10.0" 3470 + } 3471 + }, 3472 + "node_modules/object-hash": { 3473 + "version": "3.0.0", 3474 + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 3475 + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 3476 + "license": "MIT", 3477 + "engines": { 3478 + "node": ">= 6" 3479 + } 3480 + }, 3481 + "node_modules/optionator": { 3482 + "version": "0.9.4", 3483 + "dev": true, 3484 + "license": "MIT", 3485 + "dependencies": { 3486 + "deep-is": "^0.1.3", 3487 + "fast-levenshtein": "^2.0.6", 3488 + "levn": "^0.4.1", 3489 + "prelude-ls": "^1.2.1", 3490 + "type-check": "^0.4.0", 3491 + "word-wrap": "^1.2.5" 3492 + }, 3493 + "engines": { 3494 + "node": ">= 0.8.0" 3495 + } 3496 + }, 3497 + "node_modules/p-limit": { 3498 + "version": "3.1.0", 3499 + "dev": true, 3500 + "license": "MIT", 3501 + "dependencies": { 3502 + "yocto-queue": "^0.1.0" 3503 + }, 3504 + "engines": { 3505 + "node": ">=10" 3506 + }, 3507 + "funding": { 3508 + "url": "https://github.com/sponsors/sindresorhus" 3509 + } 3510 + }, 3511 + "node_modules/p-locate": { 3512 + "version": "5.0.0", 3513 + "dev": true, 3514 + "license": "MIT", 3515 + "dependencies": { 3516 + "p-limit": "^3.0.2" 3517 + }, 3518 + "engines": { 3519 + "node": ">=10" 3520 + }, 3521 + "funding": { 3522 + "url": "https://github.com/sponsors/sindresorhus" 3523 + } 3524 + }, 3525 + "node_modules/package-json-from-dist": { 3526 + "version": "1.0.1", 3527 + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 3528 + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 3529 + "license": "BlueOak-1.0.0" 3530 + }, 3531 + "node_modules/parent-module": { 3532 + "version": "1.0.1", 3533 + "license": "MIT", 3534 + "dependencies": { 3535 + "callsites": "^3.0.0" 3536 + }, 3537 + "engines": { 3538 + "node": ">=6" 3539 + } 3540 + }, 3541 + "node_modules/parse-json": { 3542 + "version": "5.2.0", 3543 + "license": "MIT", 3544 + "dependencies": { 3545 + "@babel/code-frame": "^7.0.0", 3546 + "error-ex": "^1.3.1", 3547 + "json-parse-even-better-errors": "^2.3.0", 3548 + "lines-and-columns": "^1.1.6" 3549 + }, 3550 + "engines": { 3551 + "node": ">=8" 3552 + }, 3553 + "funding": { 3554 + "url": "https://github.com/sponsors/sindresorhus" 3555 + } 3556 + }, 3557 + "node_modules/path-exists": { 3558 + "version": "4.0.0", 3559 + "dev": true, 3560 + "license": "MIT", 3561 + "engines": { 3562 + "node": ">=8" 3563 + } 3564 + }, 3565 + "node_modules/path-key": { 3566 + "version": "3.1.1", 3567 + "license": "MIT", 3568 + "engines": { 3569 + "node": ">=8" 3570 + } 3571 + }, 3572 + "node_modules/path-parse": { 3573 + "version": "1.0.7", 3574 + "license": "MIT" 3575 + }, 3576 + "node_modules/path-scurry": { 3577 + "version": "1.11.1", 3578 + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 3579 + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 3580 + "license": "BlueOak-1.0.0", 3581 + "dependencies": { 3582 + "lru-cache": "^10.2.0", 3583 + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 3584 + }, 3585 + "engines": { 3586 + "node": ">=16 || 14 >=14.18" 3587 + }, 3588 + "funding": { 3589 + "url": "https://github.com/sponsors/isaacs" 3590 + } 3591 + }, 3592 + "node_modules/path-scurry/node_modules/lru-cache": { 3593 + "version": "10.4.3", 3594 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 3595 + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 3596 + "license": "ISC" 3597 + }, 3598 + "node_modules/path-type": { 3599 + "version": "4.0.0", 3600 + "license": "MIT", 3601 + "engines": { 3602 + "node": ">=8" 3603 + } 3604 + }, 3605 + "node_modules/picocolors": { 3606 + "version": "1.1.1", 3607 + "license": "ISC" 3608 + }, 3609 + "node_modules/picomatch": { 3610 + "version": "2.3.1", 3611 + "license": "MIT", 3612 + "engines": { 3613 + "node": ">=8.6" 3614 + }, 3615 + "funding": { 3616 + "url": "https://github.com/sponsors/jonschlinkert" 3617 + } 3618 + }, 3619 + "node_modules/pify": { 3620 + "version": "2.3.0", 3621 + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 3622 + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 3623 + "license": "MIT", 3624 + "engines": { 3625 + "node": ">=0.10.0" 3626 + } 3627 + }, 3628 + "node_modules/pirates": { 3629 + "version": "4.0.6", 3630 + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 3631 + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 3632 + "license": "MIT", 3633 + "engines": { 3634 + "node": ">= 6" 3635 + } 3636 + }, 3637 + "node_modules/postcss": { 3638 + "version": "8.5.1", 3639 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", 3640 + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", 3641 + "funding": [ 3642 + { 3643 + "type": "opencollective", 3644 + "url": "https://opencollective.com/postcss/" 3645 + }, 3646 + { 3647 + "type": "tidelift", 3648 + "url": "https://tidelift.com/funding/github/npm/postcss" 3649 + }, 3650 + { 3651 + "type": "github", 3652 + "url": "https://github.com/sponsors/ai" 3653 + } 3654 + ], 3655 + "license": "MIT", 3656 + "dependencies": { 3657 + "nanoid": "^3.3.8", 3658 + "picocolors": "^1.1.1", 3659 + "source-map-js": "^1.2.1" 3660 + }, 3661 + "engines": { 3662 + "node": "^10 || ^12 || >=14" 3663 + } 3664 + }, 3665 + "node_modules/postcss-import": { 3666 + "version": "15.1.0", 3667 + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", 3668 + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", 3669 + "license": "MIT", 3670 + "dependencies": { 3671 + "postcss-value-parser": "^4.0.0", 3672 + "read-cache": "^1.0.0", 3673 + "resolve": "^1.1.7" 3674 + }, 3675 + "engines": { 3676 + "node": ">=14.0.0" 3677 + }, 3678 + "peerDependencies": { 3679 + "postcss": "^8.0.0" 3680 + } 3681 + }, 3682 + "node_modules/postcss-js": { 3683 + "version": "4.0.1", 3684 + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", 3685 + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", 3686 + "license": "MIT", 3687 + "dependencies": { 3688 + "camelcase-css": "^2.0.1" 3689 + }, 3690 + "engines": { 3691 + "node": "^12 || ^14 || >= 16" 3692 + }, 3693 + "funding": { 3694 + "type": "opencollective", 3695 + "url": "https://opencollective.com/postcss/" 3696 + }, 3697 + "peerDependencies": { 3698 + "postcss": "^8.4.21" 3699 + } 3700 + }, 3701 + "node_modules/postcss-load-config": { 3702 + "version": "4.0.2", 3703 + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", 3704 + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", 3705 + "funding": [ 3706 + { 3707 + "type": "opencollective", 3708 + "url": "https://opencollective.com/postcss/" 3709 + }, 3710 + { 3711 + "type": "github", 3712 + "url": "https://github.com/sponsors/ai" 3713 + } 3714 + ], 3715 + "license": "MIT", 3716 + "dependencies": { 3717 + "lilconfig": "^3.0.0", 3718 + "yaml": "^2.3.4" 3719 + }, 3720 + "engines": { 3721 + "node": ">= 14" 3722 + }, 3723 + "peerDependencies": { 3724 + "postcss": ">=8.0.9", 3725 + "ts-node": ">=9.0.0" 3726 + }, 3727 + "peerDependenciesMeta": { 3728 + "postcss": { 3729 + "optional": true 3730 + }, 3731 + "ts-node": { 3732 + "optional": true 3733 + } 3734 + } 3735 + }, 3736 + "node_modules/postcss-nested": { 3737 + "version": "6.2.0", 3738 + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", 3739 + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", 3740 + "funding": [ 3741 + { 3742 + "type": "opencollective", 3743 + "url": "https://opencollective.com/postcss/" 3744 + }, 3745 + { 3746 + "type": "github", 3747 + "url": "https://github.com/sponsors/ai" 3748 + } 3749 + ], 3750 + "license": "MIT", 3751 + "dependencies": { 3752 + "postcss-selector-parser": "^6.1.1" 3753 + }, 3754 + "engines": { 3755 + "node": ">=12.0" 3756 + }, 3757 + "peerDependencies": { 3758 + "postcss": "^8.2.14" 3759 + } 3760 + }, 3761 + "node_modules/postcss-selector-parser": { 3762 + "version": "6.1.2", 3763 + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", 3764 + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", 3765 + "license": "MIT", 3766 + "dependencies": { 3767 + "cssesc": "^3.0.0", 3768 + "util-deprecate": "^1.0.2" 3769 + }, 3770 + "engines": { 3771 + "node": ">=4" 3772 + } 3773 + }, 3774 + "node_modules/postcss-value-parser": { 3775 + "version": "4.2.0", 3776 + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 3777 + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 3778 + "license": "MIT" 3779 + }, 3780 + "node_modules/prelude-ls": { 3781 + "version": "1.2.1", 3782 + "dev": true, 3783 + "license": "MIT", 3784 + "engines": { 3785 + "node": ">= 0.8.0" 3786 + } 3787 + }, 3788 + "node_modules/proxy-from-env": { 3789 + "version": "1.1.0", 3790 + "license": "MIT" 3791 + }, 3792 + "node_modules/punycode": { 3793 + "version": "2.3.1", 3794 + "dev": true, 3795 + "license": "MIT", 3796 + "engines": { 3797 + "node": ">=6" 3798 + } 3799 + }, 3800 + "node_modules/queue-microtask": { 3801 + "version": "1.2.3", 3802 + "funding": [ 3803 + { 3804 + "type": "github", 3805 + "url": "https://github.com/sponsors/feross" 3806 + }, 3807 + { 3808 + "type": "patreon", 3809 + "url": "https://www.patreon.com/feross" 3810 + }, 3811 + { 3812 + "type": "consulting", 3813 + "url": "https://feross.org/support" 3814 + } 3815 + ], 3816 + "license": "MIT" 3817 + }, 3818 + "node_modules/react": { 3819 + "version": "18.3.1", 3820 + "license": "MIT", 3821 + "dependencies": { 3822 + "loose-envify": "^1.1.0" 3823 + }, 3824 + "engines": { 3825 + "node": ">=0.10.0" 3826 + } 3827 + }, 3828 + "node_modules/react-dom": { 3829 + "version": "18.3.1", 3830 + "license": "MIT", 3831 + "dependencies": { 3832 + "loose-envify": "^1.1.0", 3833 + "scheduler": "^0.23.2" 3834 + }, 3835 + "peerDependencies": { 3836 + "react": "^18.3.1" 3837 + } 3838 + }, 3839 + "node_modules/react-hook-form": { 3840 + "version": "7.54.2", 3841 + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.2.tgz", 3842 + "integrity": "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==", 3843 + "license": "MIT", 3844 + "engines": { 3845 + "node": ">=18.0.0" 3846 + }, 3847 + "funding": { 3848 + "type": "opencollective", 3849 + "url": "https://opencollective.com/react-hook-form" 3850 + }, 3851 + "peerDependencies": { 3852 + "react": "^16.8.0 || ^17 || ^18 || ^19" 3853 + } 3854 + }, 3855 + "node_modules/react-is": { 3856 + "version": "16.13.1", 3857 + "license": "MIT" 3858 + }, 3859 + "node_modules/react-number-format": { 3860 + "version": "5.4.3", 3861 + "license": "MIT", 3862 + "peerDependencies": { 3863 + "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", 3864 + "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 3865 + } 3866 + }, 3867 + "node_modules/react-refresh": { 3868 + "version": "0.14.2", 3869 + "dev": true, 3870 + "license": "MIT", 3871 + "engines": { 3872 + "node": ">=0.10.0" 3873 + } 3874 + }, 3875 + "node_modules/react-remove-scroll": { 3876 + "version": "2.6.3", 3877 + "license": "MIT", 3878 + "dependencies": { 3879 + "react-remove-scroll-bar": "^2.3.7", 3880 + "react-style-singleton": "^2.2.3", 3881 + "tslib": "^2.1.0", 3882 + "use-callback-ref": "^1.3.3", 3883 + "use-sidecar": "^1.1.3" 3884 + }, 3885 + "engines": { 3886 + "node": ">=10" 3887 + }, 3888 + "peerDependencies": { 3889 + "@types/react": "*", 3890 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" 3891 + }, 3892 + "peerDependenciesMeta": { 3893 + "@types/react": { 3894 + "optional": true 3895 + } 3896 + } 3897 + }, 3898 + "node_modules/react-remove-scroll-bar": { 3899 + "version": "2.3.8", 3900 + "license": "MIT", 3901 + "dependencies": { 3902 + "react-style-singleton": "^2.2.2", 3903 + "tslib": "^2.0.0" 3904 + }, 3905 + "engines": { 3906 + "node": ">=10" 3907 + }, 3908 + "peerDependencies": { 3909 + "@types/react": "*", 3910 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 3911 + }, 3912 + "peerDependenciesMeta": { 3913 + "@types/react": { 3914 + "optional": true 3915 + } 3916 + } 3917 + }, 3918 + "node_modules/react-style-singleton": { 3919 + "version": "2.2.3", 3920 + "license": "MIT", 3921 + "dependencies": { 3922 + "get-nonce": "^1.0.0", 3923 + "tslib": "^2.0.0" 3924 + }, 3925 + "engines": { 3926 + "node": ">=10" 3927 + }, 3928 + "peerDependencies": { 3929 + "@types/react": "*", 3930 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" 3931 + }, 3932 + "peerDependenciesMeta": { 3933 + "@types/react": { 3934 + "optional": true 3935 + } 3936 + } 3937 + }, 3938 + "node_modules/react-textarea-autosize": { 3939 + "version": "8.5.6", 3940 + "license": "MIT", 3941 + "dependencies": { 3942 + "@babel/runtime": "^7.20.13", 3943 + "use-composed-ref": "^1.3.0", 3944 + "use-latest": "^1.2.1" 3945 + }, 3946 + "engines": { 3947 + "node": ">=10" 3948 + }, 3949 + "peerDependencies": { 3950 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 3951 + } 3952 + }, 3953 + "node_modules/read-cache": { 3954 + "version": "1.0.0", 3955 + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 3956 + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 3957 + "license": "MIT", 3958 + "dependencies": { 3959 + "pify": "^2.3.0" 3960 + } 3961 + }, 3962 + "node_modules/readdirp": { 3963 + "version": "3.6.0", 3964 + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 3965 + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 3966 + "license": "MIT", 3967 + "dependencies": { 3968 + "picomatch": "^2.2.1" 3969 + }, 3970 + "engines": { 3971 + "node": ">=8.10.0" 3972 + } 3973 + }, 3974 + "node_modules/regenerator-runtime": { 3975 + "version": "0.14.1", 3976 + "license": "MIT" 3977 + }, 3978 + "node_modules/resolve": { 3979 + "version": "1.22.10", 3980 + "license": "MIT", 3981 + "dependencies": { 3982 + "is-core-module": "^2.16.0", 3983 + "path-parse": "^1.0.7", 3984 + "supports-preserve-symlinks-flag": "^1.0.0" 3985 + }, 3986 + "bin": { 3987 + "resolve": "bin/resolve" 3988 + }, 3989 + "engines": { 3990 + "node": ">= 0.4" 3991 + }, 3992 + "funding": { 3993 + "url": "https://github.com/sponsors/ljharb" 3994 + } 3995 + }, 3996 + "node_modules/resolve-from": { 3997 + "version": "4.0.0", 3998 + "license": "MIT", 3999 + "engines": { 4000 + "node": ">=4" 4001 + } 4002 + }, 4003 + "node_modules/reusify": { 4004 + "version": "1.0.4", 4005 + "license": "MIT", 4006 + "engines": { 4007 + "iojs": ">=1.0.0", 4008 + "node": ">=0.10.0" 4009 + } 4010 + }, 4011 + "node_modules/rollup": { 4012 + "version": "4.32.0", 4013 + "license": "MIT", 4014 + "dependencies": { 4015 + "@types/estree": "1.0.6" 4016 + }, 4017 + "bin": { 4018 + "rollup": "dist/bin/rollup" 4019 + }, 4020 + "engines": { 4021 + "node": ">=18.0.0", 4022 + "npm": ">=8.0.0" 4023 + }, 4024 + "optionalDependencies": { 4025 + "@rollup/rollup-android-arm-eabi": "4.32.0", 4026 + "@rollup/rollup-android-arm64": "4.32.0", 4027 + "@rollup/rollup-darwin-arm64": "4.32.0", 4028 + "@rollup/rollup-darwin-x64": "4.32.0", 4029 + "@rollup/rollup-freebsd-arm64": "4.32.0", 4030 + "@rollup/rollup-freebsd-x64": "4.32.0", 4031 + "@rollup/rollup-linux-arm-gnueabihf": "4.32.0", 4032 + "@rollup/rollup-linux-arm-musleabihf": "4.32.0", 4033 + "@rollup/rollup-linux-arm64-gnu": "4.32.0", 4034 + "@rollup/rollup-linux-arm64-musl": "4.32.0", 4035 + "@rollup/rollup-linux-loongarch64-gnu": "4.32.0", 4036 + "@rollup/rollup-linux-powerpc64le-gnu": "4.32.0", 4037 + "@rollup/rollup-linux-riscv64-gnu": "4.32.0", 4038 + "@rollup/rollup-linux-s390x-gnu": "4.32.0", 4039 + "@rollup/rollup-linux-x64-gnu": "4.32.0", 4040 + "@rollup/rollup-linux-x64-musl": "4.32.0", 4041 + "@rollup/rollup-win32-arm64-msvc": "4.32.0", 4042 + "@rollup/rollup-win32-ia32-msvc": "4.32.0", 4043 + "@rollup/rollup-win32-x64-msvc": "4.32.0", 4044 + "fsevents": "~2.3.2" 4045 + } 4046 + }, 4047 + "node_modules/run-parallel": { 4048 + "version": "1.2.0", 4049 + "funding": [ 4050 + { 4051 + "type": "github", 4052 + "url": "https://github.com/sponsors/feross" 4053 + }, 4054 + { 4055 + "type": "patreon", 4056 + "url": "https://www.patreon.com/feross" 4057 + }, 4058 + { 4059 + "type": "consulting", 4060 + "url": "https://feross.org/support" 4061 + } 4062 + ], 4063 + "license": "MIT", 4064 + "dependencies": { 4065 + "queue-microtask": "^1.2.2" 4066 + } 4067 + }, 4068 + "node_modules/scheduler": { 4069 + "version": "0.23.2", 4070 + "license": "MIT", 4071 + "dependencies": { 4072 + "loose-envify": "^1.1.0" 4073 + } 4074 + }, 4075 + "node_modules/semver": { 4076 + "version": "6.3.1", 4077 + "dev": true, 4078 + "license": "ISC", 4079 + "bin": { 4080 + "semver": "bin/semver.js" 4081 + } 4082 + }, 4083 + "node_modules/shebang-command": { 4084 + "version": "2.0.0", 4085 + "license": "MIT", 4086 + "dependencies": { 4087 + "shebang-regex": "^3.0.0" 4088 + }, 4089 + "engines": { 4090 + "node": ">=8" 4091 + } 4092 + }, 4093 + "node_modules/shebang-regex": { 4094 + "version": "3.0.0", 4095 + "license": "MIT", 4096 + "engines": { 4097 + "node": ">=8" 4098 + } 4099 + }, 4100 + "node_modules/signal-exit": { 4101 + "version": "4.1.0", 4102 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 4103 + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 4104 + "license": "ISC", 4105 + "engines": { 4106 + "node": ">=14" 4107 + }, 4108 + "funding": { 4109 + "url": "https://github.com/sponsors/isaacs" 4110 + } 4111 + }, 4112 + "node_modules/source-map": { 4113 + "version": "0.5.7", 4114 + "license": "BSD-3-Clause", 4115 + "engines": { 4116 + "node": ">=0.10.0" 4117 + } 4118 + }, 4119 + "node_modules/source-map-js": { 4120 + "version": "1.2.1", 4121 + "license": "BSD-3-Clause", 4122 + "engines": { 4123 + "node": ">=0.10.0" 4124 + } 4125 + }, 4126 + "node_modules/string-width": { 4127 + "version": "5.1.2", 4128 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 4129 + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 4130 + "license": "MIT", 4131 + "dependencies": { 4132 + "eastasianwidth": "^0.2.0", 4133 + "emoji-regex": "^9.2.2", 4134 + "strip-ansi": "^7.0.1" 4135 + }, 4136 + "engines": { 4137 + "node": ">=12" 4138 + }, 4139 + "funding": { 4140 + "url": "https://github.com/sponsors/sindresorhus" 4141 + } 4142 + }, 4143 + "node_modules/string-width-cjs": { 4144 + "name": "string-width", 4145 + "version": "4.2.3", 4146 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 4147 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 4148 + "license": "MIT", 4149 + "dependencies": { 4150 + "emoji-regex": "^8.0.0", 4151 + "is-fullwidth-code-point": "^3.0.0", 4152 + "strip-ansi": "^6.0.1" 4153 + }, 4154 + "engines": { 4155 + "node": ">=8" 4156 + } 4157 + }, 4158 + "node_modules/string-width-cjs/node_modules/ansi-regex": { 4159 + "version": "5.0.1", 4160 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 4161 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 4162 + "license": "MIT", 4163 + "engines": { 4164 + "node": ">=8" 4165 + } 4166 + }, 4167 + "node_modules/string-width-cjs/node_modules/emoji-regex": { 4168 + "version": "8.0.0", 4169 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 4170 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 4171 + "license": "MIT" 4172 + }, 4173 + "node_modules/string-width-cjs/node_modules/strip-ansi": { 4174 + "version": "6.0.1", 4175 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 4176 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 4177 + "license": "MIT", 4178 + "dependencies": { 4179 + "ansi-regex": "^5.0.1" 4180 + }, 4181 + "engines": { 4182 + "node": ">=8" 4183 + } 4184 + }, 4185 + "node_modules/strip-ansi": { 4186 + "version": "7.1.0", 4187 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 4188 + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 4189 + "license": "MIT", 4190 + "dependencies": { 4191 + "ansi-regex": "^6.0.1" 4192 + }, 4193 + "engines": { 4194 + "node": ">=12" 4195 + }, 4196 + "funding": { 4197 + "url": "https://github.com/chalk/strip-ansi?sponsor=1" 4198 + } 4199 + }, 4200 + "node_modules/strip-ansi-cjs": { 4201 + "name": "strip-ansi", 4202 + "version": "6.0.1", 4203 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 4204 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 4205 + "license": "MIT", 4206 + "dependencies": { 4207 + "ansi-regex": "^5.0.1" 4208 + }, 4209 + "engines": { 4210 + "node": ">=8" 4211 + } 4212 + }, 4213 + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 4214 + "version": "5.0.1", 4215 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 4216 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 4217 + "license": "MIT", 4218 + "engines": { 4219 + "node": ">=8" 4220 + } 4221 + }, 4222 + "node_modules/strip-json-comments": { 4223 + "version": "3.1.1", 4224 + "dev": true, 4225 + "license": "MIT", 4226 + "engines": { 4227 + "node": ">=8" 4228 + }, 4229 + "funding": { 4230 + "url": "https://github.com/sponsors/sindresorhus" 4231 + } 4232 + }, 4233 + "node_modules/stylis": { 4234 + "version": "4.2.0", 4235 + "license": "MIT" 4236 + }, 4237 + "node_modules/sucrase": { 4238 + "version": "3.35.0", 4239 + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", 4240 + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", 4241 + "license": "MIT", 4242 + "dependencies": { 4243 + "@jridgewell/gen-mapping": "^0.3.2", 4244 + "commander": "^4.0.0", 4245 + "glob": "^10.3.10", 4246 + "lines-and-columns": "^1.1.6", 4247 + "mz": "^2.7.0", 4248 + "pirates": "^4.0.1", 4249 + "ts-interface-checker": "^0.1.9" 4250 + }, 4251 + "bin": { 4252 + "sucrase": "bin/sucrase", 4253 + "sucrase-node": "bin/sucrase-node" 4254 + }, 4255 + "engines": { 4256 + "node": ">=16 || 14 >=14.17" 4257 + } 4258 + }, 4259 + "node_modules/supports-color": { 4260 + "version": "7.2.0", 4261 + "dev": true, 4262 + "license": "MIT", 4263 + "dependencies": { 4264 + "has-flag": "^4.0.0" 4265 + }, 4266 + "engines": { 4267 + "node": ">=8" 4268 + } 4269 + }, 4270 + "node_modules/supports-preserve-symlinks-flag": { 4271 + "version": "1.0.0", 4272 + "license": "MIT", 4273 + "engines": { 4274 + "node": ">= 0.4" 4275 + }, 4276 + "funding": { 4277 + "url": "https://github.com/sponsors/ljharb" 4278 + } 4279 + }, 4280 + "node_modules/tabbable": { 4281 + "version": "6.2.0", 4282 + "license": "MIT" 4283 + }, 4284 + "node_modules/tailwind-merge": { 4285 + "version": "2.6.0", 4286 + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", 4287 + "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==", 4288 + "license": "MIT", 4289 + "funding": { 4290 + "type": "github", 4291 + "url": "https://github.com/sponsors/dcastil" 4292 + } 4293 + }, 4294 + "node_modules/tailwindcss": { 4295 + "version": "3.4.17", 4296 + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", 4297 + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", 4298 + "license": "MIT", 4299 + "dependencies": { 4300 + "@alloc/quick-lru": "^5.2.0", 4301 + "arg": "^5.0.2", 4302 + "chokidar": "^3.6.0", 4303 + "didyoumean": "^1.2.2", 4304 + "dlv": "^1.1.3", 4305 + "fast-glob": "^3.3.2", 4306 + "glob-parent": "^6.0.2", 4307 + "is-glob": "^4.0.3", 4308 + "jiti": "^1.21.6", 4309 + "lilconfig": "^3.1.3", 4310 + "micromatch": "^4.0.8", 4311 + "normalize-path": "^3.0.0", 4312 + "object-hash": "^3.0.0", 4313 + "picocolors": "^1.1.1", 4314 + "postcss": "^8.4.47", 4315 + "postcss-import": "^15.1.0", 4316 + "postcss-js": "^4.0.1", 4317 + "postcss-load-config": "^4.0.2", 4318 + "postcss-nested": "^6.2.0", 4319 + "postcss-selector-parser": "^6.1.2", 4320 + "resolve": "^1.22.8", 4321 + "sucrase": "^3.35.0" 4322 + }, 4323 + "bin": { 4324 + "tailwind": "lib/cli.js", 4325 + "tailwindcss": "lib/cli.js" 4326 + }, 4327 + "engines": { 4328 + "node": ">=14.0.0" 4329 + } 4330 + }, 4331 + "node_modules/tailwindcss-animate": { 4332 + "version": "1.0.7", 4333 + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", 4334 + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", 4335 + "license": "MIT", 4336 + "peerDependencies": { 4337 + "tailwindcss": ">=3.0.0 || insiders" 4338 + } 4339 + }, 4340 + "node_modules/tailwindcss/node_modules/jiti": { 4341 + "version": "1.21.7", 4342 + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", 4343 + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", 4344 + "license": "MIT", 4345 + "bin": { 4346 + "jiti": "bin/jiti.js" 4347 + } 4348 + }, 4349 + "node_modules/tapable": { 4350 + "version": "2.2.1", 4351 + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", 4352 + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", 4353 + "license": "MIT", 4354 + "engines": { 4355 + "node": ">=6" 4356 + } 4357 + }, 4358 + "node_modules/thenify": { 4359 + "version": "3.3.1", 4360 + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 4361 + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 4362 + "license": "MIT", 4363 + "dependencies": { 4364 + "any-promise": "^1.0.0" 4365 + } 4366 + }, 4367 + "node_modules/thenify-all": { 4368 + "version": "1.6.0", 4369 + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 4370 + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 4371 + "license": "MIT", 4372 + "dependencies": { 4373 + "thenify": ">= 3.1.0 < 4" 4374 + }, 4375 + "engines": { 4376 + "node": ">=0.8" 4377 + } 4378 + }, 4379 + "node_modules/to-regex-range": { 4380 + "version": "5.0.1", 4381 + "license": "MIT", 4382 + "dependencies": { 4383 + "is-number": "^7.0.0" 4384 + }, 4385 + "engines": { 4386 + "node": ">=8.0" 4387 + } 4388 + }, 4389 + "node_modules/ts-api-utils": { 4390 + "version": "2.0.0", 4391 + "dev": true, 4392 + "license": "MIT", 4393 + "engines": { 4394 + "node": ">=18.12" 4395 + }, 4396 + "peerDependencies": { 4397 + "typescript": ">=4.8.4" 4398 + } 4399 + }, 4400 + "node_modules/ts-interface-checker": { 4401 + "version": "0.1.13", 4402 + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 4403 + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 4404 + "license": "Apache-2.0" 4405 + }, 4406 + "node_modules/tslib": { 4407 + "version": "2.8.1", 4408 + "license": "0BSD" 4409 + }, 4410 + "node_modules/type-check": { 4411 + "version": "0.4.0", 4412 + "dev": true, 4413 + "license": "MIT", 4414 + "dependencies": { 4415 + "prelude-ls": "^1.2.1" 4416 + }, 4417 + "engines": { 4418 + "node": ">= 0.8.0" 4419 + } 4420 + }, 4421 + "node_modules/type-fest": { 4422 + "version": "4.33.0", 4423 + "license": "(MIT OR CC0-1.0)", 4424 + "engines": { 4425 + "node": ">=16" 4426 + }, 4427 + "funding": { 4428 + "url": "https://github.com/sponsors/sindresorhus" 4429 + } 4430 + }, 4431 + "node_modules/typescript": { 4432 + "version": "5.6.3", 4433 + "dev": true, 4434 + "license": "Apache-2.0", 4435 + "bin": { 4436 + "tsc": "bin/tsc", 4437 + "tsserver": "bin/tsserver" 4438 + }, 4439 + "engines": { 4440 + "node": ">=14.17" 4441 + } 4442 + }, 4443 + "node_modules/typescript-eslint": { 4444 + "version": "8.21.0", 4445 + "dev": true, 4446 + "license": "MIT", 4447 + "dependencies": { 4448 + "@typescript-eslint/eslint-plugin": "8.21.0", 4449 + "@typescript-eslint/parser": "8.21.0", 4450 + "@typescript-eslint/utils": "8.21.0" 4451 + }, 4452 + "engines": { 4453 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 4454 + }, 4455 + "funding": { 4456 + "type": "opencollective", 4457 + "url": "https://opencollective.com/typescript-eslint" 4458 + }, 4459 + "peerDependencies": { 4460 + "eslint": "^8.57.0 || ^9.0.0", 4461 + "typescript": ">=4.8.4 <5.8.0" 4462 + } 4463 + }, 4464 + "node_modules/undici-types": { 4465 + "version": "6.20.0", 4466 + "devOptional": true, 4467 + "license": "MIT" 4468 + }, 4469 + "node_modules/update-browserslist-db": { 4470 + "version": "1.1.2", 4471 + "dev": true, 4472 + "funding": [ 4473 + { 4474 + "type": "opencollective", 4475 + "url": "https://opencollective.com/browserslist" 4476 + }, 4477 + { 4478 + "type": "tidelift", 4479 + "url": "https://tidelift.com/funding/github/npm/browserslist" 4480 + }, 4481 + { 4482 + "type": "github", 4483 + "url": "https://github.com/sponsors/ai" 4484 + } 4485 + ], 4486 + "license": "MIT", 4487 + "dependencies": { 4488 + "escalade": "^3.2.0", 4489 + "picocolors": "^1.1.1" 4490 + }, 4491 + "bin": { 4492 + "update-browserslist-db": "cli.js" 4493 + }, 4494 + "peerDependencies": { 4495 + "browserslist": ">= 4.21.0" 4496 + } 4497 + }, 4498 + "node_modules/uri-js": { 4499 + "version": "4.4.1", 4500 + "dev": true, 4501 + "license": "BSD-2-Clause", 4502 + "dependencies": { 4503 + "punycode": "^2.1.0" 4504 + } 4505 + }, 4506 + "node_modules/use-callback-ref": { 4507 + "version": "1.3.3", 4508 + "license": "MIT", 4509 + "dependencies": { 4510 + "tslib": "^2.0.0" 4511 + }, 4512 + "engines": { 4513 + "node": ">=10" 4514 + }, 4515 + "peerDependencies": { 4516 + "@types/react": "*", 4517 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" 4518 + }, 4519 + "peerDependenciesMeta": { 4520 + "@types/react": { 4521 + "optional": true 4522 + } 4523 + } 4524 + }, 4525 + "node_modules/use-composed-ref": { 4526 + "version": "1.4.0", 4527 + "license": "MIT", 4528 + "peerDependencies": { 4529 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 4530 + }, 4531 + "peerDependenciesMeta": { 4532 + "@types/react": { 4533 + "optional": true 4534 + } 4535 + } 4536 + }, 4537 + "node_modules/use-isomorphic-layout-effect": { 4538 + "version": "1.2.0", 4539 + "license": "MIT", 4540 + "peerDependencies": { 4541 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 4542 + }, 4543 + "peerDependenciesMeta": { 4544 + "@types/react": { 4545 + "optional": true 4546 + } 4547 + } 4548 + }, 4549 + "node_modules/use-latest": { 4550 + "version": "1.3.0", 4551 + "license": "MIT", 4552 + "dependencies": { 4553 + "use-isomorphic-layout-effect": "^1.1.1" 4554 + }, 4555 + "peerDependencies": { 4556 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 4557 + }, 4558 + "peerDependenciesMeta": { 4559 + "@types/react": { 4560 + "optional": true 4561 + } 4562 + } 4563 + }, 4564 + "node_modules/use-sidecar": { 4565 + "version": "1.1.3", 4566 + "license": "MIT", 4567 + "dependencies": { 4568 + "detect-node-es": "^1.1.0", 4569 + "tslib": "^2.0.0" 4570 + }, 4571 + "engines": { 4572 + "node": ">=10" 4573 + }, 4574 + "peerDependencies": { 4575 + "@types/react": "*", 4576 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" 4577 + }, 4578 + "peerDependenciesMeta": { 4579 + "@types/react": { 4580 + "optional": true 4581 + } 4582 + } 4583 + }, 4584 + "node_modules/util-deprecate": { 4585 + "version": "1.0.2", 4586 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 4587 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 4588 + "license": "MIT" 4589 + }, 4590 + "node_modules/vite": { 4591 + "version": "6.0.11", 4592 + "license": "MIT", 4593 + "dependencies": { 4594 + "esbuild": "^0.24.2", 4595 + "postcss": "^8.4.49", 4596 + "rollup": "^4.23.0" 4597 + }, 4598 + "bin": { 4599 + "vite": "bin/vite.js" 4600 + }, 4601 + "engines": { 4602 + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 4603 + }, 4604 + "funding": { 4605 + "url": "https://github.com/vitejs/vite?sponsor=1" 4606 + }, 4607 + "optionalDependencies": { 4608 + "fsevents": "~2.3.3" 4609 + }, 4610 + "peerDependencies": { 4611 + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 4612 + "jiti": ">=1.21.0", 4613 + "less": "*", 4614 + "lightningcss": "^1.21.0", 4615 + "sass": "*", 4616 + "sass-embedded": "*", 4617 + "stylus": "*", 4618 + "sugarss": "*", 4619 + "terser": "^5.16.0", 4620 + "tsx": "^4.8.1", 4621 + "yaml": "^2.4.2" 4622 + }, 4623 + "peerDependenciesMeta": { 4624 + "@types/node": { 4625 + "optional": true 4626 + }, 4627 + "jiti": { 4628 + "optional": true 4629 + }, 4630 + "less": { 4631 + "optional": true 4632 + }, 4633 + "lightningcss": { 4634 + "optional": true 4635 + }, 4636 + "sass": { 4637 + "optional": true 4638 + }, 4639 + "sass-embedded": { 4640 + "optional": true 4641 + }, 4642 + "stylus": { 4643 + "optional": true 4644 + }, 4645 + "sugarss": { 4646 + "optional": true 4647 + }, 4648 + "terser": { 4649 + "optional": true 4650 + }, 4651 + "tsx": { 4652 + "optional": true 4653 + }, 4654 + "yaml": { 4655 + "optional": true 4656 + } 4657 + } 4658 + }, 4659 + "node_modules/which": { 4660 + "version": "2.0.2", 4661 + "license": "ISC", 4662 + "dependencies": { 4663 + "isexe": "^2.0.0" 4664 + }, 4665 + "bin": { 4666 + "node-which": "bin/node-which" 4667 + }, 4668 + "engines": { 4669 + "node": ">= 8" 4670 + } 4671 + }, 4672 + "node_modules/word-wrap": { 4673 + "version": "1.2.5", 4674 + "dev": true, 4675 + "license": "MIT", 4676 + "engines": { 4677 + "node": ">=0.10.0" 4678 + } 4679 + }, 4680 + "node_modules/wrap-ansi": { 4681 + "version": "8.1.0", 4682 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 4683 + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 4684 + "license": "MIT", 4685 + "dependencies": { 4686 + "ansi-styles": "^6.1.0", 4687 + "string-width": "^5.0.1", 4688 + "strip-ansi": "^7.0.1" 4689 + }, 4690 + "engines": { 4691 + "node": ">=12" 4692 + }, 4693 + "funding": { 4694 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 4695 + } 4696 + }, 4697 + "node_modules/wrap-ansi-cjs": { 4698 + "name": "wrap-ansi", 4699 + "version": "7.0.0", 4700 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 4701 + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 4702 + "license": "MIT", 4703 + "dependencies": { 4704 + "ansi-styles": "^4.0.0", 4705 + "string-width": "^4.1.0", 4706 + "strip-ansi": "^6.0.0" 4707 + }, 4708 + "engines": { 4709 + "node": ">=10" 4710 + }, 4711 + "funding": { 4712 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 4713 + } 4714 + }, 4715 + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 4716 + "version": "5.0.1", 4717 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 4718 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 4719 + "license": "MIT", 4720 + "engines": { 4721 + "node": ">=8" 4722 + } 4723 + }, 4724 + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 4725 + "version": "8.0.0", 4726 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 4727 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 4728 + "license": "MIT" 4729 + }, 4730 + "node_modules/wrap-ansi-cjs/node_modules/string-width": { 4731 + "version": "4.2.3", 4732 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 4733 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 4734 + "license": "MIT", 4735 + "dependencies": { 4736 + "emoji-regex": "^8.0.0", 4737 + "is-fullwidth-code-point": "^3.0.0", 4738 + "strip-ansi": "^6.0.1" 4739 + }, 4740 + "engines": { 4741 + "node": ">=8" 4742 + } 4743 + }, 4744 + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 4745 + "version": "6.0.1", 4746 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 4747 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 4748 + "license": "MIT", 4749 + "dependencies": { 4750 + "ansi-regex": "^5.0.1" 4751 + }, 4752 + "engines": { 4753 + "node": ">=8" 4754 + } 4755 + }, 4756 + "node_modules/wrap-ansi/node_modules/ansi-styles": { 4757 + "version": "6.2.1", 4758 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 4759 + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 4760 + "license": "MIT", 4761 + "engines": { 4762 + "node": ">=12" 4763 + }, 4764 + "funding": { 4765 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 4766 + } 4767 + }, 4768 + "node_modules/yallist": { 4769 + "version": "3.1.1", 4770 + "dev": true, 4771 + "license": "ISC" 4772 + }, 4773 + "node_modules/yaml": { 4774 + "version": "2.7.0", 4775 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", 4776 + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", 4777 + "license": "ISC", 4778 + "bin": { 4779 + "yaml": "bin.mjs" 4780 + }, 4781 + "engines": { 4782 + "node": ">= 14" 4783 + } 4784 + }, 4785 + "node_modules/yocto-queue": { 4786 + "version": "0.1.0", 4787 + "dev": true, 4788 + "license": "MIT", 4789 + "engines": { 4790 + "node": ">=10" 4791 + }, 4792 + "funding": { 4793 + "url": "https://github.com/sponsors/sindresorhus" 4794 + } 4795 + }, 4796 + "node_modules/zod": { 4797 + "version": "3.24.1", 4798 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", 4799 + "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", 4800 + "license": "MIT", 4801 + "funding": { 4802 + "url": "https://github.com/sponsors/colinhacks" 4803 + } 4804 + } 4805 + } 4806 + }
+18 -1
frontend/package.json
··· 11 11 }, 12 12 "dependencies": { 13 13 "@emotion/react": "^11.14.0", 14 + "@hookform/resolvers": "^3.10.0", 14 15 "@mantine/core": "^7.16.1", 15 16 "@mantine/form": "^7.16.1", 16 17 "@mantine/hooks": "^7.16.1", 18 + "@radix-ui/react-dialog": "^1.1.5", 19 + "@radix-ui/react-label": "^2.1.1", 20 + "@radix-ui/react-slot": "^1.1.1", 21 + "@radix-ui/react-tabs": "^1.1.2", 22 + "@radix-ui/react-toast": "^1.2.5", 23 + "@tailwindcss/vite": "^4.0.0", 17 24 "axios": "^1.7.9", 25 + "class-variance-authority": "^0.7.1", 26 + "clsx": "^2.1.1", 27 + "lucide-react": "^0.474.0", 18 28 "react": "^18.3.1", 19 - "react-dom": "^18.3.1" 29 + "react-dom": "^18.3.1", 30 + "react-hook-form": "^7.54.2", 31 + "tailwind-merge": "^2.6.0", 32 + "tailwindcss-animate": "^1.0.7", 33 + "zod": "^3.24.1" 20 34 }, 21 35 "devDependencies": { 22 36 "@eslint/js": "^9.17.0", ··· 24 38 "@types/react": "^18.3.18", 25 39 "@types/react-dom": "^18.3.5", 26 40 "@vitejs/plugin-react": "^4.3.4", 41 + "autoprefixer": "^10.4.20", 27 42 "eslint": "^9.17.0", 28 43 "eslint-plugin-react-hooks": "^5.0.0", 29 44 "eslint-plugin-react-refresh": "^0.4.16", 30 45 "globals": "^15.14.0", 46 + "postcss": "^8.5.1", 47 + "tailwindcss": "3.4.17", 31 48 "typescript": "~5.6.2", 32 49 "typescript-eslint": "^8.18.2", 33 50 "vite": "^6.0.5"
+6
frontend/postcss.config.js
··· 1 + export default { 2 + plugins: { 3 + tailwindcss: {}, 4 + autoprefixer: {}, 5 + }, 6 + }
-42
frontend/src/App.css
··· 1 - #root { 2 - max-width: 1280px; 3 - margin: 0 auto; 4 - padding: 2rem; 5 - text-align: center; 6 - } 7 - 8 - .logo { 9 - height: 6em; 10 - padding: 1.5em; 11 - will-change: filter; 12 - transition: filter 300ms; 13 - } 14 - .logo:hover { 15 - filter: drop-shadow(0 0 2em #646cffaa); 16 - } 17 - .logo.react:hover { 18 - filter: drop-shadow(0 0 2em #61dafbaa); 19 - } 20 - 21 - @keyframes logo-spin { 22 - from { 23 - transform: rotate(0deg); 24 - } 25 - to { 26 - transform: rotate(360deg); 27 - } 28 - } 29 - 30 - @media (prefers-reduced-motion: no-preference) { 31 - a:nth-of-type(2) .logo { 32 - animation: logo-spin infinite 20s linear; 33 - } 34 - } 35 - 36 - .card { 37 - padding: 2em; 38 - } 39 - 40 - .read-the-docs { 41 - color: #888; 42 - }
+50 -20
frontend/src/App.tsx
··· 1 - import { MantineProvider, Container, Title, Stack } from '@mantine/core'; 2 - import { LinkForm } from './components/LinkForm'; 3 - import { LinkList } from './components/LinkList'; 4 - import { Link } from './types/api'; 1 + import { Container } from './components/ui/container' 2 + import { Button } from './components/ui/button' 3 + import { LinkForm } from './components/LinkForm' 4 + import { LinkList } from './components/LinkList' 5 + import { AuthForms } from './components/AuthForms' 6 + import { AuthProvider, useAuth } from './context/AuthContext' 7 + import { useState } from 'react' 8 + import { Toaster } from './components/ui/toaster' 5 9 6 - function App() { 7 - const handleLinkCreated = (link: Link) => { 8 - // You could update the list here or show a success message 9 - window.location.reload(); 10 - }; 10 + function AppContent() { 11 + const { user, logout } = useAuth() 12 + const [refreshCounter, setRefreshCounter] = useState(0) 13 + 14 + const handleLinkCreated = () => { 15 + // Increment refresh counter to trigger list refresh 16 + setRefreshCounter(prev => prev + 1) 17 + } 11 18 12 19 return ( 13 - <MantineProvider withGlobalStyles withNormalizeCSS> 14 - <Container size="lg" py="xl"> 15 - <Stack spacing="xl"> 16 - <Title order={1}>URL Shortener</Title> 17 - <LinkForm onSuccess={handleLinkCreated} /> 18 - <LinkList /> 19 - </Stack> 20 - </Container> 21 - </MantineProvider> 22 - ); 20 + <div className="container max-w-6xl py-8"> 21 + <div className="space-y-8"> 22 + <div className="flex items-center justify-between"> 23 + <h1 className="text-3xl font-bold">URL Shortener</h1> 24 + {user && ( 25 + <div className="flex items-center gap-4"> 26 + <p className="text-sm text-muted-foreground">Welcome, {user.email}</p> 27 + <Button variant="outline" onClick={logout}> 28 + Logout 29 + </Button> 30 + </div> 31 + )} 32 + </div> 33 + 34 + {user ? ( 35 + <> 36 + <LinkForm onSuccess={handleLinkCreated} /> 37 + <LinkList refresh={refreshCounter} /> 38 + </> 39 + ) : ( 40 + <AuthForms /> 41 + )} 42 + </div> 43 + </div> 44 + ) 23 45 } 24 46 25 - export default App; 47 + function App() { 48 + return ( 49 + <AuthProvider> 50 + <AppContent /> 51 + <Toaster /> 52 + </AuthProvider> 53 + ) 54 + } 26 55 56 + export default App
+32 -1
frontend/src/api/client.ts
··· 1 1 import axios from 'axios'; 2 - import { CreateLinkRequest, Link } from '../types/api'; 2 + import { CreateLinkRequest, Link, AuthResponse } from '../types/api'; 3 3 4 + // Create axios instance with default config 4 5 const api = axios.create({ 5 6 baseURL: '/api', 6 7 }); 7 8 9 + // Add a request interceptor to add the auth token to all requests 10 + api.interceptors.request.use((config) => { 11 + const token = localStorage.getItem('token'); 12 + if (token) { 13 + config.headers.Authorization = `Bearer ${token}`; 14 + } 15 + return config; 16 + }); 17 + 18 + // Auth endpoints 19 + export const login = async (email: string, password: string) => { 20 + const response = await api.post<AuthResponse>('/auth/login', { 21 + email, 22 + password, 23 + }); 24 + return response.data; 25 + }; 26 + 27 + export const register = async (email: string, password: string) => { 28 + const response = await api.post<AuthResponse>('/auth/register', { 29 + email, 30 + password, 31 + }); 32 + return response.data; 33 + }; 34 + 35 + // Protected endpoints 8 36 export const createShortLink = async (data: CreateLinkRequest) => { 9 37 const response = await api.post<Link>('/shorten', data); 10 38 return response.data; ··· 15 43 return response.data; 16 44 }; 17 45 46 + export const deleteLink = async (id: number) => { 47 + await api.delete(`/links/${id}`); 48 + };
+105
frontend/src/components/AuthForms.tsx
··· 1 + import { useState } from 'react' 2 + import { useForm } from 'react-hook-form' 3 + import { z } from 'zod' 4 + import { zodResolver } from '@hookform/resolvers/zod' 5 + import { useAuth } from '../context/AuthContext' 6 + import { Button } from '@/components/ui/button' 7 + import { Input } from '@/components/ui/input' 8 + import { Card } from '@/components/ui/card' 9 + import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' 10 + import { 11 + Form, 12 + FormControl, 13 + FormField, 14 + FormItem, 15 + FormLabel, 16 + FormMessage, 17 + } from '@/components/ui/form' 18 + import { useToast } from '@/hooks/use-toast' 19 + 20 + const formSchema = z.object({ 21 + email: z.string().email('Invalid email address'), 22 + password: z.string().min(6, 'Password must be at least 6 characters long'), 23 + }) 24 + 25 + type FormValues = z.infer<typeof formSchema> 26 + 27 + export function AuthForms() { 28 + const [activeTab, setActiveTab] = useState<'login' | 'register'>('login') 29 + const { login, register } = useAuth() 30 + const { toast } = useToast() 31 + 32 + const form = useForm<FormValues>({ 33 + resolver: zodResolver(formSchema), 34 + defaultValues: { 35 + email: '', 36 + password: '', 37 + }, 38 + }) 39 + 40 + const onSubmit = async (values: FormValues) => { 41 + try { 42 + if (activeTab === 'login') { 43 + await login(values.email, values.password) 44 + } else { 45 + await register(values.email, values.password) 46 + } 47 + form.reset() 48 + } catch (err: any) { 49 + toast({ 50 + variant: 'destructive', 51 + title: 'Error', 52 + description: err.response?.data?.error || 'An error occurred', 53 + }) 54 + } 55 + } 56 + 57 + return ( 58 + <Card className="w-full max-w-md mx-auto p-6"> 59 + <Tabs value={activeTab} onValueChange={(value: 'login' | 'register') => setActiveTab(value)}> 60 + <TabsList className="grid w-full grid-cols-2"> 61 + <TabsTrigger value="login">Login</TabsTrigger> 62 + <TabsTrigger value="register">Register</TabsTrigger> 63 + </TabsList> 64 + 65 + <TabsContent value={activeTab}> 66 + <Form {...form}> 67 + <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4"> 68 + <FormField 69 + control={form.control} 70 + name="email" 71 + render={({ field }) => ( 72 + <FormItem> 73 + <FormLabel>Email</FormLabel> 74 + <FormControl> 75 + <Input type="email" {...field} /> 76 + </FormControl> 77 + <FormMessage /> 78 + </FormItem> 79 + )} 80 + /> 81 + 82 + <FormField 83 + control={form.control} 84 + name="password" 85 + render={({ field }) => ( 86 + <FormItem> 87 + <FormLabel>Password</FormLabel> 88 + <FormControl> 89 + <Input type="password" {...field} /> 90 + </FormControl> 91 + <FormMessage /> 92 + </FormItem> 93 + )} 94 + /> 95 + 96 + <Button type="submit" className="w-full"> 97 + {activeTab === 'login' ? 'Sign in' : 'Create account'} 98 + </Button> 99 + </form> 100 + </Form> 101 + </TabsContent> 102 + </Tabs> 103 + </Card> 104 + ) 105 + }
+90 -64
frontend/src/components/LinkForm.tsx
··· 1 - import { useState } from 'react'; 2 - import { TextInput, Button, Group, Box, Text } from '@mantine/core'; 3 - import { useForm } from '@mantine/form'; 4 - import { CreateLinkRequest, Link } from '../types/api'; 5 - import { createShortLink } from '../api/client'; 1 + import { useState } from 'react' 2 + import { useForm } from 'react-hook-form' 3 + import { zodResolver } from '@hookform/resolvers/zod' 4 + import * as z from 'zod' 5 + import { CreateLinkRequest, Link } from '../types/api' 6 + import { createShortLink } from '../api/client' 7 + import { Button } from "@/components/ui/button" 8 + import { 9 + Form, 10 + FormControl, 11 + FormField, 12 + FormItem, 13 + FormLabel, 14 + FormMessage, 15 + } from "@/components/ui/form" 16 + import { Input } from "@/components/ui/input" 17 + import { useToast } from "@/hooks/use-toast" 18 + 19 + const formSchema = z.object({ 20 + url: z.string() 21 + .min(1, 'URL is required') 22 + .url('Must be a valid URL') 23 + .refine(val => val.startsWith('http://') || val.startsWith('https://'), { 24 + message: 'URL must start with http:// or https://' 25 + }), 26 + custom_code: z.string() 27 + .regex(/^[a-zA-Z0-9_-]{0,32}$/, 'Custom code must contain only letters, numbers, underscores, and hyphens') 28 + .optional() 29 + }) 6 30 7 31 interface LinkFormProps { 8 - onSuccess: (link: Link) => void; 32 + onSuccess: (link: Link) => void 9 33 } 10 34 11 35 export function LinkForm({ onSuccess }: LinkFormProps) { 12 - const [error, setError] = useState<string | null>(null); 13 - const [loading, setLoading] = useState(false); 36 + const [loading, setLoading] = useState(false) 37 + const { toast } = useToast() 14 38 15 - const form = useForm<CreateLinkRequest>({ 16 - initialValues: { 39 + const form = useForm<z.infer<typeof formSchema>>({ 40 + resolver: zodResolver(formSchema), 41 + defaultValues: { 17 42 url: '', 18 43 custom_code: '', 19 44 }, 20 - validate: { 21 - url: (value) => { 22 - if (!value) return 'URL is required'; 23 - if (!value.startsWith('http://') && !value.startsWith('https://')) { 24 - return 'URL must start with http:// or https://'; 25 - } 26 - return null; 27 - }, 28 - custom_code: (value) => { 29 - if (value && !/^[a-zA-Z0-9_-]{1,32}$/.test(value)) { 30 - return 'Custom code must be 1-32 characters and contain only letters, numbers, underscores, and hyphens'; 31 - } 32 - return null; 33 - }, 34 - }, 35 - }); 45 + }) 36 46 37 - const handleSubmit = async (values: CreateLinkRequest) => { 47 + const onSubmit = async (values: z.infer<typeof formSchema>) => { 38 48 try { 39 - setLoading(true); 40 - setError(null); 41 - const link = await createShortLink(values); 42 - form.reset(); 43 - onSuccess(link); 44 - } catch (err) { 45 - setError(err.response?.data?.error || 'An error occurred'); 49 + setLoading(true) 50 + const link = await createShortLink(values as CreateLinkRequest) 51 + form.reset() 52 + onSuccess(link) 53 + toast({ 54 + description: "Short link created successfully", 55 + }) 56 + } catch (err: any) { 57 + toast({ 58 + variant: "destructive", 59 + title: "Error", 60 + description: err.response?.data?.error || 'An error occurred', 61 + }) 46 62 } finally { 47 - setLoading(false); 63 + setLoading(false) 48 64 } 49 - }; 65 + } 50 66 51 67 return ( 52 - <Box mx="auto" sx={{ maxWidth: 500 }}> 53 - <form onSubmit={form.onSubmit(handleSubmit)}> 54 - <TextInput 55 - required 56 - label="URL" 57 - placeholder="https://example.com" 58 - {...form.getInputProps('url')} 59 - /> 68 + <div className="max-w-[500px] mx-auto"> 69 + <Form {...form}> 70 + <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6"> 71 + <FormField 72 + control={form.control} 73 + name="url" 74 + render={({ field }) => ( 75 + <FormItem> 76 + <FormLabel>URL</FormLabel> 77 + <FormControl> 78 + <Input placeholder="https://example.com" {...field} /> 79 + </FormControl> 80 + <FormMessage /> 81 + </FormItem> 82 + )} 83 + /> 60 84 61 - <TextInput 62 - label="Custom Code (optional)" 63 - placeholder="example" 64 - mt="md" 65 - {...form.getInputProps('custom_code')} 66 - /> 67 - 68 - {error && ( 69 - <Text color="red" size="sm" mt="sm"> 70 - {error} 71 - </Text> 72 - )} 85 + <FormField 86 + control={form.control} 87 + name="custom_code" 88 + render={({ field }) => ( 89 + <FormItem> 90 + <FormLabel>Custom Code (optional)</FormLabel> 91 + <FormControl> 92 + <Input placeholder="example" {...field} /> 93 + </FormControl> 94 + <FormMessage /> 95 + </FormItem> 96 + )} 97 + /> 73 98 74 - <Group position="right" mt="md"> 75 - <Button type="submit" loading={loading}> 76 - Create Short Link 77 - </Button> 78 - </Group> 79 - </form> 80 - </Box> 81 - ); 99 + <div className="flex justify-end"> 100 + <Button type="submit" disabled={loading}> 101 + {loading ? "Creating..." : "Create Short Link"} 102 + </Button> 103 + </div> 104 + </form> 105 + </Form> 106 + </div> 107 + ) 82 108 } 83 109
+129 -53
frontend/src/components/LinkList.tsx
··· 1 - import { useEffect, useState } from 'react'; 2 - import { Table, Text, Box, CopyButton, Button } from '@mantine/core'; 3 - import { Link } from '../types/api'; 4 - import { getAllLinks } from '../api/client'; 1 + import { useEffect, useState } from 'react' 2 + import { Link } from '../types/api' 3 + import { getAllLinks, deleteLink } from '../api/client' 4 + import { 5 + Table, 6 + TableBody, 7 + TableCell, 8 + TableHead, 9 + TableHeader, 10 + TableRow, 11 + } from "@/components/ui/table" 12 + import { 13 + Dialog, 14 + DialogContent, 15 + DialogHeader, 16 + DialogTitle, 17 + DialogDescription, 18 + DialogFooter, 19 + } from "@/components/ui/dialog" 20 + import { Button } from "@/components/ui/button" 21 + import { useToast } from "@/hooks/use-toast" 5 22 6 - export function LinkList() { 7 - const [links, setLinks] = useState<Link[]>([]); 8 - const [loading, setLoading] = useState(true); 9 - const [error, setError] = useState<string | null>(null); 23 + interface LinkListProps { 24 + refresh: number 25 + } 26 + 27 + export function LinkList({ refresh }: LinkListProps) { 28 + const [links, setLinks] = useState<Link[]>([]) 29 + const [loading, setLoading] = useState(true) 30 + const [deleteModal, setDeleteModal] = useState<{ isOpen: boolean; linkId: number | null }>({ 31 + isOpen: false, 32 + linkId: null, 33 + }) 34 + const { toast } = useToast() 10 35 11 36 const fetchLinks = async () => { 12 37 try { 13 - setLoading(true); 14 - const data = await getAllLinks(); 15 - setLinks(data); 38 + setLoading(true) 39 + const data = await getAllLinks() 40 + setLinks(data) 16 41 } catch (err) { 17 - setError('Failed to load links'); 42 + toast({ 43 + title: "Error", 44 + description: "Failed to load links", 45 + variant: "destructive", 46 + }) 18 47 } finally { 19 - setLoading(false); 48 + setLoading(false) 20 49 } 21 - }; 50 + } 22 51 23 52 useEffect(() => { 24 - fetchLinks(); 25 - }, []); 53 + fetchLinks() 54 + }, [refresh]) 55 + 56 + const handleDelete = async () => { 57 + if (!deleteModal.linkId) return 58 + 59 + try { 60 + await deleteLink(deleteModal.linkId) 61 + await fetchLinks() 62 + setDeleteModal({ isOpen: false, linkId: null }) 63 + toast({ 64 + title: "Link deleted", 65 + description: "The link has been successfully deleted.", 66 + }) 67 + } catch (err) { 68 + toast({ 69 + title: "Error", 70 + description: "Failed to delete link", 71 + variant: "destructive", 72 + }) 73 + } 74 + } 26 75 27 - if (loading) return <Text>Loading...</Text>; 28 - if (error) return <Text color="red">{error}</Text>; 76 + if (loading && !links.length) { 77 + return <div className="text-center py-4">Loading...</div> 78 + } 29 79 30 80 return ( 31 - <Box> 81 + <div className="space-y-4"> 82 + <Dialog open={deleteModal.isOpen} onOpenChange={(open) => setDeleteModal({ isOpen: open, linkId: null })}> 83 + <DialogContent> 84 + <DialogHeader> 85 + <DialogTitle>Delete Link</DialogTitle> 86 + <DialogDescription> 87 + Are you sure you want to delete this link? This action cannot be undone. 88 + </DialogDescription> 89 + </DialogHeader> 90 + <DialogFooter> 91 + <Button variant="outline" onClick={() => setDeleteModal({ isOpen: false, linkId: null })}> 92 + Cancel 93 + </Button> 94 + <Button variant="destructive" onClick={handleDelete}> 95 + Delete 96 + </Button> 97 + </DialogFooter> 98 + </DialogContent> 99 + </Dialog> 100 + 32 101 <Table> 33 - <thead> 34 - <tr> 35 - <th>Short Code</th> 36 - <th>Original URL</th> 37 - <th>Clicks</th> 38 - <th>Created</th> 39 - <th>Actions</th> 40 - </tr> 41 - </thead> 42 - <tbody> 102 + <TableHeader> 103 + <TableRow> 104 + <TableHead>Short Code</TableHead> 105 + <TableHead>Original URL</TableHead> 106 + <TableHead>Clicks</TableHead> 107 + <TableHead>Created</TableHead> 108 + <TableHead>Actions</TableHead> 109 + </TableRow> 110 + </TableHeader> 111 + <TableBody> 43 112 {links.map((link) => ( 44 - <tr key={link.id}> 45 - <td>{link.short_code}</td> 46 - <td>{link.original_url}</td> 47 - <td>{link.clicks}</td> 48 - <td>{new Date(link.created_at).toLocaleDateString()}</td> 49 - <td> 50 - <CopyButton value={`${window.location.origin}/${link.short_code}`}> 51 - {({ copied, copy }) => ( 52 - <Button 53 - color={copied ? 'teal' : 'blue'} 54 - onClick={copy} 55 - size="xs" 56 - > 57 - {copied ? 'Copied' : 'Copy'} 58 - </Button> 59 - )} 60 - </CopyButton> 61 - </td> 62 - </tr> 113 + <TableRow key={link.id}> 114 + <TableCell>{link.short_code}</TableCell> 115 + <TableCell className="max-w-[300px] truncate">{link.original_url}</TableCell> 116 + <TableCell>{link.clicks}</TableCell> 117 + <TableCell>{new Date(link.created_at).toLocaleDateString()}</TableCell> 118 + <TableCell> 119 + <div className="flex gap-2"> 120 + <Button 121 + variant="secondary" 122 + size="sm" 123 + onClick={() => { 124 + navigator.clipboard.writeText(`http://localhost:8080/${link.short_code}`) 125 + toast({ description: "Link copied to clipboard" }) 126 + }} 127 + > 128 + Copy 129 + </Button> 130 + <Button 131 + variant="destructive" 132 + size="sm" 133 + onClick={() => setDeleteModal({ isOpen: true, linkId: link.id })} 134 + > 135 + Delete 136 + </Button> 137 + </div> 138 + </TableCell> 139 + </TableRow> 63 140 ))} 64 - </tbody> 141 + </TableBody> 65 142 </Table> 66 - </Box> 67 - ); 68 - } 69 - 143 + </div> 144 + ) 145 + }
+57
frontend/src/components/ui/button.tsx
··· 1 + import * as React from "react" 2 + import { Slot } from "@radix-ui/react-slot" 3 + import { cva, type VariantProps } from "class-variance-authority" 4 + 5 + import { cn } from "@/lib/utils" 6 + 7 + const buttonVariants = cva( 8 + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", 9 + { 10 + variants: { 11 + variant: { 12 + default: 13 + "bg-primary text-primary-foreground shadow hover:bg-primary/90", 14 + destructive: 15 + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", 16 + outline: 17 + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", 18 + secondary: 19 + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", 20 + ghost: "hover:bg-accent hover:text-accent-foreground", 21 + link: "text-primary underline-offset-4 hover:underline", 22 + }, 23 + size: { 24 + default: "h-9 px-4 py-2", 25 + sm: "h-8 rounded-md px-3 text-xs", 26 + lg: "h-10 rounded-md px-8", 27 + icon: "h-9 w-9", 28 + }, 29 + }, 30 + defaultVariants: { 31 + variant: "default", 32 + size: "default", 33 + }, 34 + } 35 + ) 36 + 37 + export interface ButtonProps 38 + extends React.ButtonHTMLAttributes<HTMLButtonElement>, 39 + VariantProps<typeof buttonVariants> { 40 + asChild?: boolean 41 + } 42 + 43 + const Button = React.forwardRef<HTMLButtonElement, ButtonProps>( 44 + ({ className, variant, size, asChild = false, ...props }, ref) => { 45 + const Comp = asChild ? Slot : "button" 46 + return ( 47 + <Comp 48 + className={cn(buttonVariants({ variant, size, className }))} 49 + ref={ref} 50 + {...props} 51 + /> 52 + ) 53 + } 54 + ) 55 + Button.displayName = "Button" 56 + 57 + export { Button, buttonVariants }
+76
frontend/src/components/ui/card.tsx
··· 1 + import * as React from "react" 2 + 3 + import { cn } from "@/lib/utils" 4 + 5 + const Card = React.forwardRef< 6 + HTMLDivElement, 7 + React.HTMLAttributes<HTMLDivElement> 8 + >(({ className, ...props }, ref) => ( 9 + <div 10 + ref={ref} 11 + className={cn( 12 + "rounded-xl border bg-card text-card-foreground shadow", 13 + className 14 + )} 15 + {...props} 16 + /> 17 + )) 18 + Card.displayName = "Card" 19 + 20 + const CardHeader = React.forwardRef< 21 + HTMLDivElement, 22 + React.HTMLAttributes<HTMLDivElement> 23 + >(({ className, ...props }, ref) => ( 24 + <div 25 + ref={ref} 26 + className={cn("flex flex-col space-y-1.5 p-6", className)} 27 + {...props} 28 + /> 29 + )) 30 + CardHeader.displayName = "CardHeader" 31 + 32 + const CardTitle = React.forwardRef< 33 + HTMLDivElement, 34 + React.HTMLAttributes<HTMLDivElement> 35 + >(({ className, ...props }, ref) => ( 36 + <div 37 + ref={ref} 38 + className={cn("font-semibold leading-none tracking-tight", className)} 39 + {...props} 40 + /> 41 + )) 42 + CardTitle.displayName = "CardTitle" 43 + 44 + const CardDescription = React.forwardRef< 45 + HTMLDivElement, 46 + React.HTMLAttributes<HTMLDivElement> 47 + >(({ className, ...props }, ref) => ( 48 + <div 49 + ref={ref} 50 + className={cn("text-sm text-muted-foreground", className)} 51 + {...props} 52 + /> 53 + )) 54 + CardDescription.displayName = "CardDescription" 55 + 56 + const CardContent = React.forwardRef< 57 + HTMLDivElement, 58 + React.HTMLAttributes<HTMLDivElement> 59 + >(({ className, ...props }, ref) => ( 60 + <div ref={ref} className={cn("p-6 pt-0", className)} {...props} /> 61 + )) 62 + CardContent.displayName = "CardContent" 63 + 64 + const CardFooter = React.forwardRef< 65 + HTMLDivElement, 66 + React.HTMLAttributes<HTMLDivElement> 67 + >(({ className, ...props }, ref) => ( 68 + <div 69 + ref={ref} 70 + className={cn("flex items-center p-6 pt-0", className)} 71 + {...props} 72 + /> 73 + )) 74 + CardFooter.displayName = "CardFooter" 75 + 76 + export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
+13
frontend/src/components/ui/container.tsx
··· 1 + import { cn } from "@/lib/utils" 2 + 3 + export function Container({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) { 4 + return ( 5 + <div 6 + className={cn( 7 + "mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8", 8 + className 9 + )} 10 + {...props} 11 + /> 12 + ) 13 + }
+120
frontend/src/components/ui/dialog.tsx
··· 1 + import * as React from "react" 2 + import * as DialogPrimitive from "@radix-ui/react-dialog" 3 + import { X } from "lucide-react" 4 + 5 + import { cn } from "@/lib/utils" 6 + 7 + const Dialog = DialogPrimitive.Root 8 + 9 + const DialogTrigger = DialogPrimitive.Trigger 10 + 11 + const DialogPortal = DialogPrimitive.Portal 12 + 13 + const DialogClose = DialogPrimitive.Close 14 + 15 + const DialogOverlay = React.forwardRef< 16 + React.ElementRef<typeof DialogPrimitive.Overlay>, 17 + React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay> 18 + >(({ className, ...props }, ref) => ( 19 + <DialogPrimitive.Overlay 20 + ref={ref} 21 + className={cn( 22 + "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", 23 + className 24 + )} 25 + {...props} 26 + /> 27 + )) 28 + DialogOverlay.displayName = DialogPrimitive.Overlay.displayName 29 + 30 + const DialogContent = React.forwardRef< 31 + React.ElementRef<typeof DialogPrimitive.Content>, 32 + React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> 33 + >(({ className, children, ...props }, ref) => ( 34 + <DialogPortal> 35 + <DialogOverlay /> 36 + <DialogPrimitive.Content 37 + ref={ref} 38 + className={cn( 39 + "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg", 40 + className 41 + )} 42 + {...props} 43 + > 44 + {children} 45 + <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground"> 46 + <X className="h-4 w-4" /> 47 + <span className="sr-only">Close</span> 48 + </DialogPrimitive.Close> 49 + </DialogPrimitive.Content> 50 + </DialogPortal> 51 + )) 52 + DialogContent.displayName = DialogPrimitive.Content.displayName 53 + 54 + const DialogHeader = ({ 55 + className, 56 + ...props 57 + }: React.HTMLAttributes<HTMLDivElement>) => ( 58 + <div 59 + className={cn( 60 + "flex flex-col space-y-1.5 text-center sm:text-left", 61 + className 62 + )} 63 + {...props} 64 + /> 65 + ) 66 + DialogHeader.displayName = "DialogHeader" 67 + 68 + const DialogFooter = ({ 69 + className, 70 + ...props 71 + }: React.HTMLAttributes<HTMLDivElement>) => ( 72 + <div 73 + className={cn( 74 + "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", 75 + className 76 + )} 77 + {...props} 78 + /> 79 + ) 80 + DialogFooter.displayName = "DialogFooter" 81 + 82 + const DialogTitle = React.forwardRef< 83 + React.ElementRef<typeof DialogPrimitive.Title>, 84 + React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title> 85 + >(({ className, ...props }, ref) => ( 86 + <DialogPrimitive.Title 87 + ref={ref} 88 + className={cn( 89 + "text-lg font-semibold leading-none tracking-tight", 90 + className 91 + )} 92 + {...props} 93 + /> 94 + )) 95 + DialogTitle.displayName = DialogPrimitive.Title.displayName 96 + 97 + const DialogDescription = React.forwardRef< 98 + React.ElementRef<typeof DialogPrimitive.Description>, 99 + React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description> 100 + >(({ className, ...props }, ref) => ( 101 + <DialogPrimitive.Description 102 + ref={ref} 103 + className={cn("text-sm text-muted-foreground", className)} 104 + {...props} 105 + /> 106 + )) 107 + DialogDescription.displayName = DialogPrimitive.Description.displayName 108 + 109 + export { 110 + Dialog, 111 + DialogPortal, 112 + DialogOverlay, 113 + DialogTrigger, 114 + DialogClose, 115 + DialogContent, 116 + DialogHeader, 117 + DialogFooter, 118 + DialogTitle, 119 + DialogDescription, 120 + }
+178
frontend/src/components/ui/form.tsx
··· 1 + "use client" 2 + 3 + import * as React from "react" 4 + import * as LabelPrimitive from "@radix-ui/react-label" 5 + import { Slot } from "@radix-ui/react-slot" 6 + import { 7 + Controller, 8 + ControllerProps, 9 + FieldPath, 10 + FieldValues, 11 + FormProvider, 12 + useFormContext, 13 + } from "react-hook-form" 14 + 15 + import { cn } from "@/lib/utils" 16 + import { Label } from "@/components/ui/label" 17 + 18 + const Form = FormProvider 19 + 20 + type FormFieldContextValue< 21 + TFieldValues extends FieldValues = FieldValues, 22 + TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> 23 + > = { 24 + name: TName 25 + } 26 + 27 + const FormFieldContext = React.createContext<FormFieldContextValue>( 28 + {} as FormFieldContextValue 29 + ) 30 + 31 + const FormField = < 32 + TFieldValues extends FieldValues = FieldValues, 33 + TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> 34 + >({ 35 + ...props 36 + }: ControllerProps<TFieldValues, TName>) => { 37 + return ( 38 + <FormFieldContext.Provider value={{ name: props.name }}> 39 + <Controller {...props} /> 40 + </FormFieldContext.Provider> 41 + ) 42 + } 43 + 44 + const useFormField = () => { 45 + const fieldContext = React.useContext(FormFieldContext) 46 + const itemContext = React.useContext(FormItemContext) 47 + const { getFieldState, formState } = useFormContext() 48 + 49 + const fieldState = getFieldState(fieldContext.name, formState) 50 + 51 + if (!fieldContext) { 52 + throw new Error("useFormField should be used within <FormField>") 53 + } 54 + 55 + const { id } = itemContext 56 + 57 + return { 58 + id, 59 + name: fieldContext.name, 60 + formItemId: `${id}-form-item`, 61 + formDescriptionId: `${id}-form-item-description`, 62 + formMessageId: `${id}-form-item-message`, 63 + ...fieldState, 64 + } 65 + } 66 + 67 + type FormItemContextValue = { 68 + id: string 69 + } 70 + 71 + const FormItemContext = React.createContext<FormItemContextValue>( 72 + {} as FormItemContextValue 73 + ) 74 + 75 + const FormItem = React.forwardRef< 76 + HTMLDivElement, 77 + React.HTMLAttributes<HTMLDivElement> 78 + >(({ className, ...props }, ref) => { 79 + const id = React.useId() 80 + 81 + return ( 82 + <FormItemContext.Provider value={{ id }}> 83 + <div ref={ref} className={cn("space-y-2", className)} {...props} /> 84 + </FormItemContext.Provider> 85 + ) 86 + }) 87 + FormItem.displayName = "FormItem" 88 + 89 + const FormLabel = React.forwardRef< 90 + React.ElementRef<typeof LabelPrimitive.Root>, 91 + React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> 92 + >(({ className, ...props }, ref) => { 93 + const { error, formItemId } = useFormField() 94 + 95 + return ( 96 + <Label 97 + ref={ref} 98 + className={cn(error && "text-destructive", className)} 99 + htmlFor={formItemId} 100 + {...props} 101 + /> 102 + ) 103 + }) 104 + FormLabel.displayName = "FormLabel" 105 + 106 + const FormControl = React.forwardRef< 107 + React.ElementRef<typeof Slot>, 108 + React.ComponentPropsWithoutRef<typeof Slot> 109 + >(({ ...props }, ref) => { 110 + const { error, formItemId, formDescriptionId, formMessageId } = useFormField() 111 + 112 + return ( 113 + <Slot 114 + ref={ref} 115 + id={formItemId} 116 + aria-describedby={ 117 + !error 118 + ? `${formDescriptionId}` 119 + : `${formDescriptionId} ${formMessageId}` 120 + } 121 + aria-invalid={!!error} 122 + {...props} 123 + /> 124 + ) 125 + }) 126 + FormControl.displayName = "FormControl" 127 + 128 + const FormDescription = React.forwardRef< 129 + HTMLParagraphElement, 130 + React.HTMLAttributes<HTMLParagraphElement> 131 + >(({ className, ...props }, ref) => { 132 + const { formDescriptionId } = useFormField() 133 + 134 + return ( 135 + <p 136 + ref={ref} 137 + id={formDescriptionId} 138 + className={cn("text-[0.8rem] text-muted-foreground", className)} 139 + {...props} 140 + /> 141 + ) 142 + }) 143 + FormDescription.displayName = "FormDescription" 144 + 145 + const FormMessage = React.forwardRef< 146 + HTMLParagraphElement, 147 + React.HTMLAttributes<HTMLParagraphElement> 148 + >(({ className, children, ...props }, ref) => { 149 + const { error, formMessageId } = useFormField() 150 + const body = error ? String(error?.message) : children 151 + 152 + if (!body) { 153 + return null 154 + } 155 + 156 + return ( 157 + <p 158 + ref={ref} 159 + id={formMessageId} 160 + className={cn("text-[0.8rem] font-medium text-destructive", className)} 161 + {...props} 162 + > 163 + {body} 164 + </p> 165 + ) 166 + }) 167 + FormMessage.displayName = "FormMessage" 168 + 169 + export { 170 + useFormField, 171 + Form, 172 + FormItem, 173 + FormLabel, 174 + FormControl, 175 + FormDescription, 176 + FormMessage, 177 + FormField, 178 + }
+22
frontend/src/components/ui/input.tsx
··· 1 + import * as React from "react" 2 + 3 + import { cn } from "@/lib/utils" 4 + 5 + const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>( 6 + ({ className, type, ...props }, ref) => { 7 + return ( 8 + <input 9 + type={type} 10 + className={cn( 11 + "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", 12 + className 13 + )} 14 + ref={ref} 15 + {...props} 16 + /> 17 + ) 18 + } 19 + ) 20 + Input.displayName = "Input" 21 + 22 + export { Input }
+24
frontend/src/components/ui/label.tsx
··· 1 + import * as React from "react" 2 + import * as LabelPrimitive from "@radix-ui/react-label" 3 + import { cva, type VariantProps } from "class-variance-authority" 4 + 5 + import { cn } from "@/lib/utils" 6 + 7 + const labelVariants = cva( 8 + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" 9 + ) 10 + 11 + const Label = React.forwardRef< 12 + React.ElementRef<typeof LabelPrimitive.Root>, 13 + React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & 14 + VariantProps<typeof labelVariants> 15 + >(({ className, ...props }, ref) => ( 16 + <LabelPrimitive.Root 17 + ref={ref} 18 + className={cn(labelVariants(), className)} 19 + {...props} 20 + /> 21 + )) 22 + Label.displayName = LabelPrimitive.Root.displayName 23 + 24 + export { Label }
+120
frontend/src/components/ui/table.tsx
··· 1 + import * as React from "react" 2 + 3 + import { cn } from "@/lib/utils" 4 + 5 + const Table = React.forwardRef< 6 + HTMLTableElement, 7 + React.HTMLAttributes<HTMLTableElement> 8 + >(({ className, ...props }, ref) => ( 9 + <div className="relative w-full overflow-auto"> 10 + <table 11 + ref={ref} 12 + className={cn("w-full caption-bottom text-sm", className)} 13 + {...props} 14 + /> 15 + </div> 16 + )) 17 + Table.displayName = "Table" 18 + 19 + const TableHeader = React.forwardRef< 20 + HTMLTableSectionElement, 21 + React.HTMLAttributes<HTMLTableSectionElement> 22 + >(({ className, ...props }, ref) => ( 23 + <thead ref={ref} className={cn("[&_tr]:border-b", className)} {...props} /> 24 + )) 25 + TableHeader.displayName = "TableHeader" 26 + 27 + const TableBody = React.forwardRef< 28 + HTMLTableSectionElement, 29 + React.HTMLAttributes<HTMLTableSectionElement> 30 + >(({ className, ...props }, ref) => ( 31 + <tbody 32 + ref={ref} 33 + className={cn("[&_tr:last-child]:border-0", className)} 34 + {...props} 35 + /> 36 + )) 37 + TableBody.displayName = "TableBody" 38 + 39 + const TableFooter = React.forwardRef< 40 + HTMLTableSectionElement, 41 + React.HTMLAttributes<HTMLTableSectionElement> 42 + >(({ className, ...props }, ref) => ( 43 + <tfoot 44 + ref={ref} 45 + className={cn( 46 + "border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", 47 + className 48 + )} 49 + {...props} 50 + /> 51 + )) 52 + TableFooter.displayName = "TableFooter" 53 + 54 + const TableRow = React.forwardRef< 55 + HTMLTableRowElement, 56 + React.HTMLAttributes<HTMLTableRowElement> 57 + >(({ className, ...props }, ref) => ( 58 + <tr 59 + ref={ref} 60 + className={cn( 61 + "border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted", 62 + className 63 + )} 64 + {...props} 65 + /> 66 + )) 67 + TableRow.displayName = "TableRow" 68 + 69 + const TableHead = React.forwardRef< 70 + HTMLTableCellElement, 71 + React.ThHTMLAttributes<HTMLTableCellElement> 72 + >(({ className, ...props }, ref) => ( 73 + <th 74 + ref={ref} 75 + className={cn( 76 + "h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]", 77 + className 78 + )} 79 + {...props} 80 + /> 81 + )) 82 + TableHead.displayName = "TableHead" 83 + 84 + const TableCell = React.forwardRef< 85 + HTMLTableCellElement, 86 + React.TdHTMLAttributes<HTMLTableCellElement> 87 + >(({ className, ...props }, ref) => ( 88 + <td 89 + ref={ref} 90 + className={cn( 91 + "p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]", 92 + className 93 + )} 94 + {...props} 95 + /> 96 + )) 97 + TableCell.displayName = "TableCell" 98 + 99 + const TableCaption = React.forwardRef< 100 + HTMLTableCaptionElement, 101 + React.HTMLAttributes<HTMLTableCaptionElement> 102 + >(({ className, ...props }, ref) => ( 103 + <caption 104 + ref={ref} 105 + className={cn("mt-4 text-sm text-muted-foreground", className)} 106 + {...props} 107 + /> 108 + )) 109 + TableCaption.displayName = "TableCaption" 110 + 111 + export { 112 + Table, 113 + TableHeader, 114 + TableBody, 115 + TableFooter, 116 + TableHead, 117 + TableRow, 118 + TableCell, 119 + TableCaption, 120 + }
+53
frontend/src/components/ui/tabs.tsx
··· 1 + import * as React from "react" 2 + import * as TabsPrimitive from "@radix-ui/react-tabs" 3 + 4 + import { cn } from "@/lib/utils" 5 + 6 + const Tabs = TabsPrimitive.Root 7 + 8 + const TabsList = React.forwardRef< 9 + React.ElementRef<typeof TabsPrimitive.List>, 10 + React.ComponentPropsWithoutRef<typeof TabsPrimitive.List> 11 + >(({ className, ...props }, ref) => ( 12 + <TabsPrimitive.List 13 + ref={ref} 14 + className={cn( 15 + "inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground", 16 + className 17 + )} 18 + {...props} 19 + /> 20 + )) 21 + TabsList.displayName = TabsPrimitive.List.displayName 22 + 23 + const TabsTrigger = React.forwardRef< 24 + React.ElementRef<typeof TabsPrimitive.Trigger>, 25 + React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger> 26 + >(({ className, ...props }, ref) => ( 27 + <TabsPrimitive.Trigger 28 + ref={ref} 29 + className={cn( 30 + "inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow", 31 + className 32 + )} 33 + {...props} 34 + /> 35 + )) 36 + TabsTrigger.displayName = TabsPrimitive.Trigger.displayName 37 + 38 + const TabsContent = React.forwardRef< 39 + React.ElementRef<typeof TabsPrimitive.Content>, 40 + React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content> 41 + >(({ className, ...props }, ref) => ( 42 + <TabsPrimitive.Content 43 + ref={ref} 44 + className={cn( 45 + "mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2", 46 + className 47 + )} 48 + {...props} 49 + /> 50 + )) 51 + TabsContent.displayName = TabsPrimitive.Content.displayName 52 + 53 + export { Tabs, TabsList, TabsTrigger, TabsContent }
+129
frontend/src/components/ui/toast.tsx
··· 1 + "use client" 2 + 3 + import * as React from "react" 4 + import * as ToastPrimitives from "@radix-ui/react-toast" 5 + import { cva, type VariantProps } from "class-variance-authority" 6 + import { X } from "lucide-react" 7 + 8 + import { cn } from "@/lib/utils" 9 + 10 + const ToastProvider = ToastPrimitives.Provider 11 + 12 + const ToastViewport = React.forwardRef< 13 + React.ElementRef<typeof ToastPrimitives.Viewport>, 14 + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport> 15 + >(({ className, ...props }, ref) => ( 16 + <ToastPrimitives.Viewport 17 + ref={ref} 18 + className={cn( 19 + "fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]", 20 + className 21 + )} 22 + {...props} 23 + /> 24 + )) 25 + ToastViewport.displayName = ToastPrimitives.Viewport.displayName 26 + 27 + const toastVariants = cva( 28 + "group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full", 29 + { 30 + variants: { 31 + variant: { 32 + default: "border bg-background text-foreground", 33 + destructive: 34 + "destructive group border-destructive bg-destructive text-destructive-foreground", 35 + }, 36 + }, 37 + defaultVariants: { 38 + variant: "default", 39 + }, 40 + } 41 + ) 42 + 43 + const Toast = React.forwardRef< 44 + React.ElementRef<typeof ToastPrimitives.Root>, 45 + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> & 46 + VariantProps<typeof toastVariants> 47 + >(({ className, variant, ...props }, ref) => { 48 + return ( 49 + <ToastPrimitives.Root 50 + ref={ref} 51 + className={cn(toastVariants({ variant }), className)} 52 + {...props} 53 + /> 54 + ) 55 + }) 56 + Toast.displayName = ToastPrimitives.Root.displayName 57 + 58 + const ToastAction = React.forwardRef< 59 + React.ElementRef<typeof ToastPrimitives.Action>, 60 + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action> 61 + >(({ className, ...props }, ref) => ( 62 + <ToastPrimitives.Action 63 + ref={ref} 64 + className={cn( 65 + "inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium transition-colors hover:bg-secondary focus:outline-none focus:ring-1 focus:ring-ring disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive", 66 + className 67 + )} 68 + {...props} 69 + /> 70 + )) 71 + ToastAction.displayName = ToastPrimitives.Action.displayName 72 + 73 + const ToastClose = React.forwardRef< 74 + React.ElementRef<typeof ToastPrimitives.Close>, 75 + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close> 76 + >(({ className, ...props }, ref) => ( 77 + <ToastPrimitives.Close 78 + ref={ref} 79 + className={cn( 80 + "absolute right-1 top-1 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-1 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600", 81 + className 82 + )} 83 + toast-close="" 84 + {...props} 85 + > 86 + <X className="h-4 w-4" /> 87 + </ToastPrimitives.Close> 88 + )) 89 + ToastClose.displayName = ToastPrimitives.Close.displayName 90 + 91 + const ToastTitle = React.forwardRef< 92 + React.ElementRef<typeof ToastPrimitives.Title>, 93 + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title> 94 + >(({ className, ...props }, ref) => ( 95 + <ToastPrimitives.Title 96 + ref={ref} 97 + className={cn("text-sm font-semibold [&+div]:text-xs", className)} 98 + {...props} 99 + /> 100 + )) 101 + ToastTitle.displayName = ToastPrimitives.Title.displayName 102 + 103 + const ToastDescription = React.forwardRef< 104 + React.ElementRef<typeof ToastPrimitives.Description>, 105 + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description> 106 + >(({ className, ...props }, ref) => ( 107 + <ToastPrimitives.Description 108 + ref={ref} 109 + className={cn("text-sm opacity-90", className)} 110 + {...props} 111 + /> 112 + )) 113 + ToastDescription.displayName = ToastPrimitives.Description.displayName 114 + 115 + type ToastProps = React.ComponentPropsWithoutRef<typeof Toast> 116 + 117 + type ToastActionElement = React.ReactElement<typeof ToastAction> 118 + 119 + export { 120 + type ToastProps, 121 + type ToastActionElement, 122 + ToastProvider, 123 + ToastViewport, 124 + Toast, 125 + ToastTitle, 126 + ToastDescription, 127 + ToastClose, 128 + ToastAction, 129 + }
+35
frontend/src/components/ui/toaster.tsx
··· 1 + "use client" 2 + 3 + import { useToast } from "@/hooks/use-toast" 4 + import { 5 + Toast, 6 + ToastClose, 7 + ToastDescription, 8 + ToastProvider, 9 + ToastTitle, 10 + ToastViewport, 11 + } from "@/components/ui/toast" 12 + 13 + export function Toaster() { 14 + const { toasts } = useToast() 15 + 16 + return ( 17 + <ToastProvider> 18 + {toasts.map(function ({ id, title, description, action, ...props }) { 19 + return ( 20 + <Toast key={id} {...props}> 21 + <div className="grid gap-1"> 22 + {title && <ToastTitle>{title}</ToastTitle>} 23 + {description && ( 24 + <ToastDescription>{description}</ToastDescription> 25 + )} 26 + </div> 27 + {action} 28 + <ToastClose /> 29 + </Toast> 30 + ) 31 + })} 32 + <ToastViewport /> 33 + </ToastProvider> 34 + ) 35 + }
+63
frontend/src/context/AuthContext.tsx
··· 1 + import { createContext, useContext, useEffect, useState } from 'react'; 2 + import { User } from '../types/api'; 3 + import * as api from '../api/client'; 4 + 5 + interface AuthContextType { 6 + user: User | null; 7 + login: (email: string, password: string) => Promise<void>; 8 + register: (email: string, password: string) => Promise<void>; 9 + logout: () => void; 10 + isLoading: boolean; 11 + } 12 + 13 + const AuthContext = createContext<AuthContextType | undefined>(undefined); 14 + 15 + export function AuthProvider({ children }: { children: React.ReactNode }) { 16 + const [user, setUser] = useState<User | null>(null); 17 + const [isLoading, setIsLoading] = useState(true); 18 + 19 + useEffect(() => { 20 + const token = localStorage.getItem('token'); 21 + if (token) { 22 + const userData = JSON.parse(localStorage.getItem('user') || 'null'); 23 + setUser(userData); 24 + } 25 + setIsLoading(false); 26 + }, []); 27 + 28 + const login = async (email: string, password: string) => { 29 + const response = await api.login(email, password); 30 + const { token, user } = response; 31 + localStorage.setItem('token', token); 32 + localStorage.setItem('user', JSON.stringify(user)); 33 + setUser(user); 34 + }; 35 + 36 + const register = async (email: string, password: string) => { 37 + const response = await api.register(email, password); 38 + const { token, user } = response; 39 + localStorage.setItem('token', token); 40 + localStorage.setItem('user', JSON.stringify(user)); 41 + setUser(user); 42 + }; 43 + 44 + const logout = () => { 45 + localStorage.removeItem('token'); 46 + localStorage.removeItem('user'); 47 + setUser(null); 48 + }; 49 + 50 + return ( 51 + <AuthContext.Provider value={{ user, login, register, logout, isLoading }}> 52 + {children} 53 + </AuthContext.Provider> 54 + ); 55 + } 56 + 57 + export function useAuth() { 58 + const context = useContext(AuthContext); 59 + if (context === undefined) { 60 + throw new Error('useAuth must be used within an AuthProvider'); 61 + } 62 + return context; 63 + }
+191
frontend/src/hooks/use-toast.ts
··· 1 + import * as React from "react" 2 + 3 + import type { 4 + ToastActionElement, 5 + ToastProps, 6 + } from "@/components/ui/toast" 7 + 8 + const TOAST_LIMIT = 1 9 + const TOAST_REMOVE_DELAY = 1000000 10 + 11 + type ToasterToast = ToastProps & { 12 + id: string 13 + title?: React.ReactNode 14 + description?: React.ReactNode 15 + action?: ToastActionElement 16 + } 17 + 18 + const actionTypes = { 19 + ADD_TOAST: "ADD_TOAST", 20 + UPDATE_TOAST: "UPDATE_TOAST", 21 + DISMISS_TOAST: "DISMISS_TOAST", 22 + REMOVE_TOAST: "REMOVE_TOAST", 23 + } as const 24 + 25 + let count = 0 26 + 27 + function genId() { 28 + count = (count + 1) % Number.MAX_SAFE_INTEGER 29 + return count.toString() 30 + } 31 + 32 + type ActionType = typeof actionTypes 33 + 34 + type Action = 35 + | { 36 + type: ActionType["ADD_TOAST"] 37 + toast: ToasterToast 38 + } 39 + | { 40 + type: ActionType["UPDATE_TOAST"] 41 + toast: Partial<ToasterToast> 42 + } 43 + | { 44 + type: ActionType["DISMISS_TOAST"] 45 + toastId?: ToasterToast["id"] 46 + } 47 + | { 48 + type: ActionType["REMOVE_TOAST"] 49 + toastId?: ToasterToast["id"] 50 + } 51 + 52 + interface State { 53 + toasts: ToasterToast[] 54 + } 55 + 56 + const toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>() 57 + 58 + const addToRemoveQueue = (toastId: string) => { 59 + if (toastTimeouts.has(toastId)) { 60 + return 61 + } 62 + 63 + const timeout = setTimeout(() => { 64 + toastTimeouts.delete(toastId) 65 + dispatch({ 66 + type: "REMOVE_TOAST", 67 + toastId: toastId, 68 + }) 69 + }, TOAST_REMOVE_DELAY) 70 + 71 + toastTimeouts.set(toastId, timeout) 72 + } 73 + 74 + export const reducer = (state: State, action: Action): State => { 75 + switch (action.type) { 76 + case "ADD_TOAST": 77 + return { 78 + ...state, 79 + toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT), 80 + } 81 + 82 + case "UPDATE_TOAST": 83 + return { 84 + ...state, 85 + toasts: state.toasts.map((t) => 86 + t.id === action.toast.id ? { ...t, ...action.toast } : t 87 + ), 88 + } 89 + 90 + case "DISMISS_TOAST": { 91 + const { toastId } = action 92 + 93 + // ! Side effects ! - This could be extracted into a dismissToast() action, 94 + // but I'll keep it here for simplicity 95 + if (toastId) { 96 + addToRemoveQueue(toastId) 97 + } else { 98 + state.toasts.forEach((toast) => { 99 + addToRemoveQueue(toast.id) 100 + }) 101 + } 102 + 103 + return { 104 + ...state, 105 + toasts: state.toasts.map((t) => 106 + t.id === toastId || toastId === undefined 107 + ? { 108 + ...t, 109 + open: false, 110 + } 111 + : t 112 + ), 113 + } 114 + } 115 + case "REMOVE_TOAST": 116 + if (action.toastId === undefined) { 117 + return { 118 + ...state, 119 + toasts: [], 120 + } 121 + } 122 + return { 123 + ...state, 124 + toasts: state.toasts.filter((t) => t.id !== action.toastId), 125 + } 126 + } 127 + } 128 + 129 + const listeners: Array<(state: State) => void> = [] 130 + 131 + let memoryState: State = { toasts: [] } 132 + 133 + function dispatch(action: Action) { 134 + memoryState = reducer(memoryState, action) 135 + listeners.forEach((listener) => { 136 + listener(memoryState) 137 + }) 138 + } 139 + 140 + type Toast = Omit<ToasterToast, "id"> 141 + 142 + function toast({ ...props }: Toast) { 143 + const id = genId() 144 + 145 + const update = (props: ToasterToast) => 146 + dispatch({ 147 + type: "UPDATE_TOAST", 148 + toast: { ...props, id }, 149 + }) 150 + const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id }) 151 + 152 + dispatch({ 153 + type: "ADD_TOAST", 154 + toast: { 155 + ...props, 156 + id, 157 + open: true, 158 + onOpenChange: (open) => { 159 + if (!open) dismiss() 160 + }, 161 + }, 162 + }) 163 + 164 + return { 165 + id: id, 166 + dismiss, 167 + update, 168 + } 169 + } 170 + 171 + function useToast() { 172 + const [state, setState] = React.useState<State>(memoryState) 173 + 174 + React.useEffect(() => { 175 + listeners.push(setState) 176 + return () => { 177 + const index = listeners.indexOf(setState) 178 + if (index > -1) { 179 + listeners.splice(index, 1) 180 + } 181 + } 182 + }, [state]) 183 + 184 + return { 185 + ...state, 186 + toast, 187 + dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }), 188 + } 189 + } 190 + 191 + export { useToast, toast }
+3 -68
frontend/src/index.css
··· 1 - :root { 2 - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; 3 - line-height: 1.5; 4 - font-weight: 400; 5 - 6 - color-scheme: light dark; 7 - color: rgba(255, 255, 255, 0.87); 8 - background-color: #242424; 9 - 10 - font-synthesis: none; 11 - text-rendering: optimizeLegibility; 12 - -webkit-font-smoothing: antialiased; 13 - -moz-osx-font-smoothing: grayscale; 14 - } 15 - 16 - a { 17 - font-weight: 500; 18 - color: #646cff; 19 - text-decoration: inherit; 20 - } 21 - a:hover { 22 - color: #535bf2; 23 - } 24 - 25 - body { 26 - margin: 0; 27 - display: flex; 28 - place-items: center; 29 - min-width: 320px; 30 - min-height: 100vh; 31 - } 32 - 33 - h1 { 34 - font-size: 3.2em; 35 - line-height: 1.1; 36 - } 37 - 38 - button { 39 - border-radius: 8px; 40 - border: 1px solid transparent; 41 - padding: 0.6em 1.2em; 42 - font-size: 1em; 43 - font-weight: 500; 44 - font-family: inherit; 45 - background-color: #1a1a1a; 46 - cursor: pointer; 47 - transition: border-color 0.25s; 48 - } 49 - button:hover { 50 - border-color: #646cff; 51 - } 52 - button:focus, 53 - button:focus-visible { 54 - outline: 4px auto -webkit-focus-ring-color; 55 - } 56 - 57 - @media (prefers-color-scheme: light) { 58 - :root { 59 - color: #213547; 60 - background-color: #ffffff; 61 - } 62 - a:hover { 63 - color: #747bff; 64 - } 65 - button { 66 - background-color: #f9f9f9; 67 - } 68 - } 1 + @tailwind base; 2 + @tailwind components; 3 + @tailwind utilities;
+6
frontend/src/lib/utils.ts
··· 1 + import { clsx, type ClassValue } from "clsx" 2 + import { twMerge } from "tailwind-merge" 3 + 4 + export function cn(...inputs: ClassValue[]) { 5 + return twMerge(clsx(inputs)) 6 + }
+11 -2
frontend/src/types/api.ts
··· 12 12 clicks: number; 13 13 } 14 14 15 - export interface ApiError { 16 - error: string; 15 + export interface User { 16 + id: number; 17 + email: string; 18 + } 19 + 20 + export interface AuthResponse { 21 + token: string; 22 + user: User; 17 23 } 18 24 25 + export interface ApiError { 26 + error: string; 27 + }
+16
frontend/tailwind.config.js
··· 1 + /** @type {import('tailwindcss').Config} */ 2 + export default { 3 + content: [ 4 + "./index.html", 5 + "./src/**/*.{js,ts,jsx,tsx}", 6 + ], 7 + theme: { 8 + extend: { 9 + colors: { 10 + border: "hsl(var(--border))", 11 + }, 12 + }, 13 + }, 14 + plugins: [], 15 + } 16 +
+16 -6
frontend/tsconfig.app.json
··· 3 3 "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 4 4 "target": "ES2020", 5 5 "useDefineForClassFields": true, 6 - "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 + "lib": [ 7 + "ES2020", 8 + "DOM", 9 + "DOM.Iterable" 10 + ], 7 11 "module": "ESNext", 8 12 "skipLibCheck": true, 9 - 10 13 /* Bundler mode */ 11 14 "moduleResolution": "bundler", 12 15 "allowImportingTsExtensions": true, ··· 14 17 "moduleDetection": "force", 15 18 "noEmit": true, 16 19 "jsx": "react-jsx", 17 - 18 20 /* Linting */ 19 21 "strict": true, 20 22 "noUnusedLocals": true, 21 23 "noUnusedParameters": true, 22 24 "noFallthroughCasesInSwitch": true, 23 - "noUncheckedSideEffectImports": true 25 + "noUncheckedSideEffectImports": true, 26 + "baseUrl": ".", 27 + "paths": { 28 + "@/*": [ 29 + "./src/*" 30 + ] 31 + } 24 32 }, 25 - "include": ["src"] 26 - } 33 + "include": [ 34 + "src" 35 + ] 36 + }
+16 -4
frontend/tsconfig.json
··· 1 1 { 2 2 "files": [], 3 3 "references": [ 4 - { "path": "./tsconfig.app.json" }, 5 - { "path": "./tsconfig.node.json" } 6 - ] 7 - } 4 + { 5 + "path": "./tsconfig.app.json" 6 + }, 7 + { 8 + "path": "./tsconfig.node.json" 9 + } 10 + ], 11 + "compilerOptions": { 12 + "baseUrl": ".", 13 + "paths": { 14 + "@/*": [ 15 + "./src/*" 16 + ] 17 + } 18 + } 19 + }
+11 -1
frontend/vite.config.ts
··· 1 1 import { defineConfig } from 'vite' 2 2 import react from '@vitejs/plugin-react' 3 + import tailwindcss from '@tailwindcss/vite' 4 + import path from "path" 3 5 4 6 export default defineConfig({ 5 - plugins: [react()], 7 + plugins: [ 8 + react(), 9 + tailwindcss(), 10 + ], 6 11 server: { 7 12 proxy: { 8 13 '/api': { 9 14 target: 'http://localhost:8080', 10 15 changeOrigin: true, 11 16 }, 17 + }, 18 + }, 19 + resolve: { 20 + alias: { 21 + "@": path.resolve(__dirname, "./src"), 12 22 }, 13 23 }, 14 24 })