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
···
"name": "frontend",
"dependencies": {
"@emotion/react": "^11.14.0",
+
"@hookform/resolvers": "^3.10.0",
"@mantine/core": "^7.16.1",
"@mantine/form": "^7.16.1",
"@mantine/hooks": "^7.16.1",
+
"@radix-ui/react-label": "^2.1.1",
+
"@radix-ui/react-slot": "^1.1.1",
+
"@radix-ui/react-tabs": "^1.1.2",
+
"@radix-ui/react-toast": "^1.2.5",
+
"@tailwindcss/vite": "^4.0.0",
"axios": "^1.7.9",
+
"class-variance-authority": "^0.7.1",
+
"clsx": "^2.1.1",
+
"lucide-react": "^0.474.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
+
"react-hook-form": "^7.54.2",
+
"tailwind-merge": "^2.6.0",
+
"tailwindcss-animate": "^1.0.7",
+
"zod": "^3.24.1",
},
"devDependencies": {
"@eslint/js": "^9.17.0",
···
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"@vitejs/plugin-react": "^4.3.4",
+
"autoprefixer": "^10.4.20",
"eslint": "^9.17.0",
"eslint-plugin-react-hooks": "^5.0.0",
"eslint-plugin-react-refresh": "^0.4.16",
"globals": "^15.14.0",
+
"postcss": "^8.5.1",
+
"tailwindcss": "3.4.17",
"typescript": "~5.6.2",
"typescript-eslint": "^8.18.2",
"vite": "^6.0.5",
···
},
},
"packages": {
+
"@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
+
"@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
"@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=="],
···
"@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="],
+
"@hookform/resolvers": ["@hookform/resolvers@3.10.0", "", { "peerDependencies": { "react-hook-form": "^7.0.0" } }, "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag=="],
+
"@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
"@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="],
···
"@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
"@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.1", "", {}, "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA=="],
+
+
"@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=="],
"@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=="],
···
"@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=="],
+
"@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
+
+
"@radix-ui/primitive": ["@radix-ui/primitive@1.1.1", "", {}, "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
+
"@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=="],
+
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.32.0", "", { "os": "android", "cpu": "arm" }, "sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg=="],
"@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A=="],
···
"@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA=="],
+
"@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=="],
+
+
"@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=="],
+
+
"@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.0.0", "", { "os": "android", "cpu": "arm64" }, "sha512-EAhjU0+FIdyGPR+7MbBWubLLPtmOu+p7c2egTTFBRk/n//zYjNvVK0WhcBK5Y7oUB5mo4EjA2mCbY7dcEMWSRw=="],
+
+
"@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.0.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-hdz4xnSWS11cIp+7ye+3dGHqs0X33z+BXXTtgPOguDWVa+TdXUzwxonklSzf5wlJFuot3dv5eWzhlNai0oYYQg=="],
+
+
"@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.0.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-+dOUUaXTkPKKhtUI9QtVaYg+MpmLh2CN0dHohiYXaBirEyPMkjaT0zbRgzQlNnQWjCVVXPQluIEb0OMEjSTH+Q=="],
+
+
"@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.0.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-CJhGDhxnrmu4SwyC62fA+wP24MhA/TZlIhRHqg1kRuIHoGoVR2uSSm1qxTxU37tSSZj8Up0q6jsBJCAP4k7rgQ=="],
+
+
"@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.0.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Wy7Av0xzXfY2ujZBcYy4+7GQm25/J1iHvlQU2CfwdDCuPWfIjYzR6kggz+uVdSJyKV2s64znchBxRE8kV4uXSA=="],
+
+
"@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-srwBo2l6pvM0swBntc1ucuhGsfFOLkqPRFQ3dWARRTfSkL1U9nAsob2MKc/n47Eva/W9pZZgMOuf7rDw8pK1Ew=="],
+
+
"@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-abhusswkduYWuezkBmgo0K0/erGq3M4Se5xP0fhc/0dKs0X/rJUYYCFWntHb3IGh3aVzdQ0SXJs93P76DbUqtw=="],
+
+
"@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-hGtRYIUEx377/HlU49+jvVKKwU1MDSKYSMMs0JFO2Wp7LGxk5+0j5+RBk9NFnmp/lbp32yPTgIOO5m1BmDq36A=="],
+
+
"@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-7xgQgSAThs0I14VAgmxpJnK6XFSZBxHMGoDXkLyYkEnu+8WRQMbCP93dkCUn2PIv+Q+JulRgc00PJ09uORSLXQ=="],
+
+
"@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.0.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-qEcgTIPcWY5ZE7f6VxQ/JPrSFMcehzVIlZj7sGE3mVd5YWreAT+Fl1vSP8q2pjnWXn0avZG3Iw7a2hJQAm+fTQ=="],
+
+
"@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.0.0", "", { "os": "win32", "cpu": "x64" }, "sha512-bqT0AY8RXb8GMDy28JtngvqaOSB2YixbLPLvUo6I6lkvvUwA6Eqh2Tj60e2Lh7O/k083f8tYiB0WEK4wmTI7Jg=="],
+
+
"@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=="],
+
"@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=="],
"@types/babel__generator": ["@types/babel__generator@7.6.8", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw=="],
···
"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=="],
+
"ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
+
"ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
+
"any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
+
+
"anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
+
+
"arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="],
+
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
"asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
+
"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=="],
+
"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=="],
"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=="],
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
"binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
+
"brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="],
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
···
"callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
+
"camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="],
+
"caniuse-lite": ["caniuse-lite@1.0.30001695", "", {}, "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw=="],
"chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
"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=="],
+
+
"class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
+
"clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
···
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
"combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="],
+
+
"commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
"concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
···
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
+
"cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
+
"csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
"debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
···
"deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
"delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
+
+
"detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="],
"detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="],
+
"didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="],
+
+
"dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="],
+
+
"eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
+
"electron-to-chromium": ["electron-to-chromium@1.5.88", "", {}, "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw=="],
+
+
"emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
+
+
"enhanced-resolve": ["enhanced-resolve@5.18.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ=="],
"error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="],
···
"follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="],
+
"foreground-child": ["foreground-child@3.3.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg=="],
+
"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=="],
+
+
"fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="],
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
···
"gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
"get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="],
+
+
"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=="],
"glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
"globals": ["globals@15.14.0", "", {}, "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig=="],
+
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
+
"graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="],
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
···
"is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
+
"is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
+
"is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
"is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
+
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
+
"is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+
+
"jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
+
+
"jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
"js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
···
"levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
+
"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=="],
+
+
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.29.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw=="],
+
+
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.29.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA=="],
+
+
"lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.29.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ=="],
+
+
"lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.29.1", "", { "os": "linux", "cpu": "arm" }, "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg=="],
+
+
"lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.29.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ=="],
+
+
"lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.29.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw=="],
+
+
"lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.29.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw=="],
+
+
"lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.29.1", "", { "os": "linux", "cpu": "x64" }, "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw=="],
+
+
"lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.29.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog=="],
+
+
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.29.1", "", { "os": "win32", "cpu": "x64" }, "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q=="],
+
+
"lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
+
"lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
"locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
···
"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=="],
"lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
+
+
"lucide-react": ["lucide-react@0.474.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-CmghgHkh0OJNmxGKWc0qfPJCYHASPMVSyGY8fj3xgk4v84ItqDg64JNKFZn5hC6E0vHi6gxnbCgwhyVB09wQtA=="],
"merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
···
"minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
+
"minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
+
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+
"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=="],
"nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="],
···
"node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="],
+
"normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
+
+
"normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="],
+
+
"object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
+
+
"object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="],
+
"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=="],
"p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
"p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
+
"package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
+
"parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
"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=="],
···
"path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
+
"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=="],
+
"path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
"picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+
"pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="],
+
+
"pirates": ["pirates@4.0.6", "", {}, "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg=="],
+
"postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="],
+
"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=="],
+
+
"postcss-js": ["postcss-js@4.0.1", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw=="],
+
+
"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=="],
+
+
"postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="],
+
+
"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=="],
+
+
"postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
+
"prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
"proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
···
"react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="],
"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=="],
+
+
"react-hook-form": ["react-hook-form@7.54.2", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg=="],
"react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
···
"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=="],
"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=="],
+
+
"read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="],
+
+
"readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
"regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="],
···
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
+
"signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
+
"source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="],
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
"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=="],
+
+
"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=="],
+
+
"strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
+
+
"strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
"strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
"stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="],
+
+
"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=="],
"supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
···
"tabbable": ["tabbable@6.2.0", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="],
+
"tailwind-merge": ["tailwind-merge@2.6.0", "", {}, "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA=="],
+
+
"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=="],
+
+
"tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="],
+
+
"tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="],
+
+
"thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
+
+
"thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
+
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
"ts-api-utils": ["ts-api-utils@2.0.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ=="],
+
+
"ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
···
"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=="],
+
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
+
"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=="],
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
"word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
+
"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=="],
+
+
"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=="],
+
"yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
"yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="],
"yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
+
+
"zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="],
"@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="],
···
"@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="],
+
"@tailwindcss/node/tailwindcss": ["tailwindcss@4.0.0", "", {}, "sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ=="],
+
+
"@tailwindcss/vite/tailwindcss": ["tailwindcss@4.0.0", "", {}, "sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ=="],
+
"@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
"@typescript-eslint/typescript-estree/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="],
+
"chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+
"glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+
"path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
+
+
"postcss-load-config/yaml": ["yaml@2.7.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA=="],
+
+
"string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
+
"string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+
"strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+
"tailwindcss/jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="],
+
+
"wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
+
+
"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=="],
+
+
"wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
"@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
+
+
"glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
+
+
"string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+
"wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
+
"wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
}
}
+21
frontend/components.json
···
+
{
+
"$schema": "https://ui.shadcn.com/schema.json",
+
"style": "new-york",
+
"rsc": false,
+
"tsx": true,
+
"tailwind": {
+
"config": "tailwind.config.js",
+
"css": "src/index.css",
+
"baseColor": "stone",
+
"cssVariables": true,
+
"prefix": ""
+
},
+
"aliases": {
+
"components": "@/components",
+
"utils": "@/lib/utils",
+
"ui": "@/components/ui",
+
"lib": "@/lib",
+
"hooks": "@/hooks"
+
},
+
"iconLibrary": "lucide"
+
}
+4806
frontend/package-lock.json
···
+
{
+
"name": "frontend",
+
"version": "0.0.0",
+
"lockfileVersion": 3,
+
"requires": true,
+
"packages": {
+
"": {
+
"name": "frontend",
+
"version": "0.0.0",
+
"dependencies": {
+
"@emotion/react": "^11.14.0",
+
"@hookform/resolvers": "^3.10.0",
+
"@mantine/core": "^7.16.1",
+
"@mantine/form": "^7.16.1",
+
"@mantine/hooks": "^7.16.1",
+
"@radix-ui/react-dialog": "^1.1.5",
+
"@radix-ui/react-label": "^2.1.1",
+
"@radix-ui/react-slot": "^1.1.1",
+
"@radix-ui/react-tabs": "^1.1.2",
+
"@radix-ui/react-toast": "^1.2.5",
+
"@tailwindcss/vite": "^4.0.0",
+
"axios": "^1.7.9",
+
"class-variance-authority": "^0.7.1",
+
"clsx": "^2.1.1",
+
"lucide-react": "^0.474.0",
+
"react": "^18.3.1",
+
"react-dom": "^18.3.1",
+
"react-hook-form": "^7.54.2",
+
"tailwind-merge": "^2.6.0",
+
"tailwindcss-animate": "^1.0.7",
+
"zod": "^3.24.1"
+
},
+
"devDependencies": {
+
"@eslint/js": "^9.17.0",
+
"@types/node": "^22.10.10",
+
"@types/react": "^18.3.18",
+
"@types/react-dom": "^18.3.5",
+
"@vitejs/plugin-react": "^4.3.4",
+
"autoprefixer": "^10.4.20",
+
"eslint": "^9.17.0",
+
"eslint-plugin-react-hooks": "^5.0.0",
+
"eslint-plugin-react-refresh": "^0.4.16",
+
"globals": "^15.14.0",
+
"postcss": "^8.5.1",
+
"tailwindcss": "3.4.17",
+
"typescript": "~5.6.2",
+
"typescript-eslint": "^8.18.2",
+
"vite": "^6.0.5"
+
}
+
},
+
"node_modules/@alloc/quick-lru": {
+
"version": "5.2.0",
+
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/@ampproject/remapping": {
+
"version": "2.3.0",
+
"dev": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@jridgewell/gen-mapping": "^0.3.5",
+
"@jridgewell/trace-mapping": "^0.3.24"
+
},
+
"engines": {
+
"node": ">=6.0.0"
+
}
+
},
+
"node_modules/@babel/code-frame": {
+
"version": "7.26.2",
+
"license": "MIT",
+
"dependencies": {
+
"@babel/helper-validator-identifier": "^7.25.9",
+
"js-tokens": "^4.0.0",
+
"picocolors": "^1.0.0"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/compat-data": {
+
"version": "7.26.5",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/core": {
+
"version": "7.26.7",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@ampproject/remapping": "^2.2.0",
+
"@babel/code-frame": "^7.26.2",
+
"@babel/generator": "^7.26.5",
+
"@babel/helper-compilation-targets": "^7.26.5",
+
"@babel/helper-module-transforms": "^7.26.0",
+
"@babel/helpers": "^7.26.7",
+
"@babel/parser": "^7.26.7",
+
"@babel/template": "^7.25.9",
+
"@babel/traverse": "^7.26.7",
+
"@babel/types": "^7.26.7",
+
"convert-source-map": "^2.0.0",
+
"debug": "^4.1.0",
+
"gensync": "^1.0.0-beta.2",
+
"json5": "^2.2.3",
+
"semver": "^6.3.1"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/babel"
+
}
+
},
+
"node_modules/@babel/generator": {
+
"version": "7.26.5",
+
"license": "MIT",
+
"dependencies": {
+
"@babel/parser": "^7.26.5",
+
"@babel/types": "^7.26.5",
+
"@jridgewell/gen-mapping": "^0.3.5",
+
"@jridgewell/trace-mapping": "^0.3.25",
+
"jsesc": "^3.0.2"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-compilation-targets": {
+
"version": "7.26.5",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/compat-data": "^7.26.5",
+
"@babel/helper-validator-option": "^7.25.9",
+
"browserslist": "^4.24.0",
+
"lru-cache": "^5.1.1",
+
"semver": "^6.3.1"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-module-imports": {
+
"version": "7.25.9",
+
"license": "MIT",
+
"dependencies": {
+
"@babel/traverse": "^7.25.9",
+
"@babel/types": "^7.25.9"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-module-transforms": {
+
"version": "7.26.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/helper-module-imports": "^7.25.9",
+
"@babel/helper-validator-identifier": "^7.25.9",
+
"@babel/traverse": "^7.25.9"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
},
+
"peerDependencies": {
+
"@babel/core": "^7.0.0"
+
}
+
},
+
"node_modules/@babel/helper-plugin-utils": {
+
"version": "7.26.5",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-string-parser": {
+
"version": "7.25.9",
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-validator-identifier": {
+
"version": "7.25.9",
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-validator-option": {
+
"version": "7.25.9",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helpers": {
+
"version": "7.26.7",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/template": "^7.25.9",
+
"@babel/types": "^7.26.7"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/parser": {
+
"version": "7.26.7",
+
"license": "MIT",
+
"dependencies": {
+
"@babel/types": "^7.26.7"
+
},
+
"bin": {
+
"parser": "bin/babel-parser.js"
+
},
+
"engines": {
+
"node": ">=6.0.0"
+
}
+
},
+
"node_modules/@babel/plugin-transform-react-jsx-self": {
+
"version": "7.25.9",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/helper-plugin-utils": "^7.25.9"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
},
+
"peerDependencies": {
+
"@babel/core": "^7.0.0-0"
+
}
+
},
+
"node_modules/@babel/plugin-transform-react-jsx-source": {
+
"version": "7.25.9",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/helper-plugin-utils": "^7.25.9"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
},
+
"peerDependencies": {
+
"@babel/core": "^7.0.0-0"
+
}
+
},
+
"node_modules/@babel/runtime": {
+
"version": "7.26.7",
+
"license": "MIT",
+
"dependencies": {
+
"regenerator-runtime": "^0.14.0"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/template": {
+
"version": "7.25.9",
+
"license": "MIT",
+
"dependencies": {
+
"@babel/code-frame": "^7.25.9",
+
"@babel/parser": "^7.25.9",
+
"@babel/types": "^7.25.9"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/traverse": {
+
"version": "7.26.7",
+
"license": "MIT",
+
"dependencies": {
+
"@babel/code-frame": "^7.26.2",
+
"@babel/generator": "^7.26.5",
+
"@babel/parser": "^7.26.7",
+
"@babel/template": "^7.25.9",
+
"@babel/types": "^7.26.7",
+
"debug": "^4.3.1",
+
"globals": "^11.1.0"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/traverse/node_modules/globals": {
+
"version": "11.12.0",
+
"license": "MIT",
+
"engines": {
+
"node": ">=4"
+
}
+
},
+
"node_modules/@babel/types": {
+
"version": "7.26.7",
+
"license": "MIT",
+
"dependencies": {
+
"@babel/helper-string-parser": "^7.25.9",
+
"@babel/helper-validator-identifier": "^7.25.9"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@emotion/babel-plugin": {
+
"version": "11.13.5",
+
"license": "MIT",
+
"dependencies": {
+
"@babel/helper-module-imports": "^7.16.7",
+
"@babel/runtime": "^7.18.3",
+
"@emotion/hash": "^0.9.2",
+
"@emotion/memoize": "^0.9.0",
+
"@emotion/serialize": "^1.3.3",
+
"babel-plugin-macros": "^3.1.0",
+
"convert-source-map": "^1.5.0",
+
"escape-string-regexp": "^4.0.0",
+
"find-root": "^1.1.0",
+
"source-map": "^0.5.7",
+
"stylis": "4.2.0"
+
}
+
},
+
"node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
+
"version": "1.9.0",
+
"license": "MIT"
+
},
+
"node_modules/@emotion/cache": {
+
"version": "11.14.0",
+
"license": "MIT",
+
"dependencies": {
+
"@emotion/memoize": "^0.9.0",
+
"@emotion/sheet": "^1.4.0",
+
"@emotion/utils": "^1.4.2",
+
"@emotion/weak-memoize": "^0.4.0",
+
"stylis": "4.2.0"
+
}
+
},
+
"node_modules/@emotion/hash": {
+
"version": "0.9.2",
+
"license": "MIT"
+
},
+
"node_modules/@emotion/memoize": {
+
"version": "0.9.0",
+
"license": "MIT"
+
},
+
"node_modules/@emotion/react": {
+
"version": "11.14.0",
+
"license": "MIT",
+
"dependencies": {
+
"@babel/runtime": "^7.18.3",
+
"@emotion/babel-plugin": "^11.13.5",
+
"@emotion/cache": "^11.14.0",
+
"@emotion/serialize": "^1.3.3",
+
"@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
+
"@emotion/utils": "^1.4.2",
+
"@emotion/weak-memoize": "^0.4.0",
+
"hoist-non-react-statics": "^3.3.1"
+
},
+
"peerDependencies": {
+
"react": ">=16.8.0"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@emotion/serialize": {
+
"version": "1.3.3",
+
"license": "MIT",
+
"dependencies": {
+
"@emotion/hash": "^0.9.2",
+
"@emotion/memoize": "^0.9.0",
+
"@emotion/unitless": "^0.10.0",
+
"@emotion/utils": "^1.4.2",
+
"csstype": "^3.0.2"
+
}
+
},
+
"node_modules/@emotion/sheet": {
+
"version": "1.4.0",
+
"license": "MIT"
+
},
+
"node_modules/@emotion/unitless": {
+
"version": "0.10.0",
+
"license": "MIT"
+
},
+
"node_modules/@emotion/use-insertion-effect-with-fallbacks": {
+
"version": "1.2.0",
+
"license": "MIT",
+
"peerDependencies": {
+
"react": ">=16.8.0"
+
}
+
},
+
"node_modules/@emotion/utils": {
+
"version": "1.4.2",
+
"license": "MIT"
+
},
+
"node_modules/@emotion/weak-memoize": {
+
"version": "0.4.0",
+
"license": "MIT"
+
},
+
"node_modules/@esbuild/darwin-arm64": {
+
"version": "0.24.2",
+
"cpu": [
+
"arm64"
+
],
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/@eslint-community/eslint-utils": {
+
"version": "4.4.1",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"eslint-visitor-keys": "^3.4.3"
+
},
+
"engines": {
+
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+
},
+
"funding": {
+
"url": "https://opencollective.com/eslint"
+
},
+
"peerDependencies": {
+
"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+
}
+
},
+
"node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+
"version": "3.4.3",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+
},
+
"funding": {
+
"url": "https://opencollective.com/eslint"
+
}
+
},
+
"node_modules/@eslint-community/regexpp": {
+
"version": "4.12.1",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+
}
+
},
+
"node_modules/@eslint/config-array": {
+
"version": "0.19.1",
+
"dev": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@eslint/object-schema": "^2.1.5",
+
"debug": "^4.3.1",
+
"minimatch": "^3.1.2"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
}
+
},
+
"node_modules/@eslint/core": {
+
"version": "0.10.0",
+
"dev": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@types/json-schema": "^7.0.15"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
}
+
},
+
"node_modules/@eslint/eslintrc": {
+
"version": "3.2.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"ajv": "^6.12.4",
+
"debug": "^4.3.2",
+
"espree": "^10.0.1",
+
"globals": "^14.0.0",
+
"ignore": "^5.2.0",
+
"import-fresh": "^3.2.1",
+
"js-yaml": "^4.1.0",
+
"minimatch": "^3.1.2",
+
"strip-json-comments": "^3.1.1"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"url": "https://opencollective.com/eslint"
+
}
+
},
+
"node_modules/@eslint/eslintrc/node_modules/globals": {
+
"version": "14.0.0",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=18"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/@eslint/js": {
+
"version": "9.19.0",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
}
+
},
+
"node_modules/@eslint/object-schema": {
+
"version": "2.1.5",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
}
+
},
+
"node_modules/@eslint/plugin-kit": {
+
"version": "0.2.5",
+
"dev": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@eslint/core": "^0.10.0",
+
"levn": "^0.4.1"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
}
+
},
+
"node_modules/@floating-ui/core": {
+
"version": "1.6.9",
+
"license": "MIT",
+
"dependencies": {
+
"@floating-ui/utils": "^0.2.9"
+
}
+
},
+
"node_modules/@floating-ui/dom": {
+
"version": "1.6.13",
+
"license": "MIT",
+
"dependencies": {
+
"@floating-ui/core": "^1.6.0",
+
"@floating-ui/utils": "^0.2.9"
+
}
+
},
+
"node_modules/@floating-ui/react": {
+
"version": "0.26.28",
+
"license": "MIT",
+
"dependencies": {
+
"@floating-ui/react-dom": "^2.1.2",
+
"@floating-ui/utils": "^0.2.8",
+
"tabbable": "^6.0.0"
+
},
+
"peerDependencies": {
+
"react": ">=16.8.0",
+
"react-dom": ">=16.8.0"
+
}
+
},
+
"node_modules/@floating-ui/react-dom": {
+
"version": "2.1.2",
+
"license": "MIT",
+
"dependencies": {
+
"@floating-ui/dom": "^1.0.0"
+
},
+
"peerDependencies": {
+
"react": ">=16.8.0",
+
"react-dom": ">=16.8.0"
+
}
+
},
+
"node_modules/@floating-ui/utils": {
+
"version": "0.2.9",
+
"license": "MIT"
+
},
+
"node_modules/@hookform/resolvers": {
+
"version": "3.10.0",
+
"resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.10.0.tgz",
+
"integrity": "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==",
+
"license": "MIT",
+
"peerDependencies": {
+
"react-hook-form": "^7.0.0"
+
}
+
},
+
"node_modules/@humanfs/core": {
+
"version": "0.19.1",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": ">=18.18.0"
+
}
+
},
+
"node_modules/@humanfs/node": {
+
"version": "0.16.6",
+
"dev": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@humanfs/core": "^0.19.1",
+
"@humanwhocodes/retry": "^0.3.0"
+
},
+
"engines": {
+
"node": ">=18.18.0"
+
}
+
},
+
"node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
+
"version": "0.3.1",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": ">=18.18"
+
},
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/nzakas"
+
}
+
},
+
"node_modules/@humanwhocodes/module-importer": {
+
"version": "1.0.1",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": ">=12.22"
+
},
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/nzakas"
+
}
+
},
+
"node_modules/@humanwhocodes/retry": {
+
"version": "0.4.1",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": ">=18.18"
+
},
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/nzakas"
+
}
+
},
+
"node_modules/@isaacs/cliui": {
+
"version": "8.0.2",
+
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+
"license": "ISC",
+
"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"
+
},
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@jridgewell/gen-mapping": {
+
"version": "0.3.8",
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/set-array": "^1.2.1",
+
"@jridgewell/sourcemap-codec": "^1.4.10",
+
"@jridgewell/trace-mapping": "^0.3.24"
+
},
+
"engines": {
+
"node": ">=6.0.0"
+
}
+
},
+
"node_modules/@jridgewell/resolve-uri": {
+
"version": "3.1.2",
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.0.0"
+
}
+
},
+
"node_modules/@jridgewell/set-array": {
+
"version": "1.2.1",
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.0.0"
+
}
+
},
+
"node_modules/@jridgewell/sourcemap-codec": {
+
"version": "1.5.0",
+
"license": "MIT"
+
},
+
"node_modules/@jridgewell/trace-mapping": {
+
"version": "0.3.25",
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/resolve-uri": "^3.1.0",
+
"@jridgewell/sourcemap-codec": "^1.4.14"
+
}
+
},
+
"node_modules/@mantine/core": {
+
"version": "7.16.1",
+
"license": "MIT",
+
"dependencies": {
+
"@floating-ui/react": "^0.26.28",
+
"clsx": "^2.1.1",
+
"react-number-format": "^5.4.3",
+
"react-remove-scroll": "^2.6.2",
+
"react-textarea-autosize": "8.5.6",
+
"type-fest": "^4.27.0"
+
},
+
"peerDependencies": {
+
"@mantine/hooks": "7.16.1",
+
"react": "^18.x || ^19.x",
+
"react-dom": "^18.x || ^19.x"
+
}
+
},
+
"node_modules/@mantine/form": {
+
"version": "7.16.1",
+
"license": "MIT",
+
"dependencies": {
+
"fast-deep-equal": "^3.1.3",
+
"klona": "^2.0.6"
+
},
+
"peerDependencies": {
+
"react": "^18.x || ^19.x"
+
}
+
},
+
"node_modules/@mantine/hooks": {
+
"version": "7.16.1",
+
"license": "MIT",
+
"peerDependencies": {
+
"react": "^18.x || ^19.x"
+
}
+
},
+
"node_modules/@nodelib/fs.scandir": {
+
"version": "2.1.5",
+
"license": "MIT",
+
"dependencies": {
+
"@nodelib/fs.stat": "2.0.5",
+
"run-parallel": "^1.1.9"
+
},
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/@nodelib/fs.stat": {
+
"version": "2.0.5",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/@nodelib/fs.walk": {
+
"version": "1.2.8",
+
"license": "MIT",
+
"dependencies": {
+
"@nodelib/fs.scandir": "2.1.5",
+
"fastq": "^1.6.0"
+
},
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/@pkgjs/parseargs": {
+
"version": "0.11.0",
+
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+
"integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+
"license": "MIT",
+
"optional": true,
+
"engines": {
+
"node": ">=14"
+
}
+
},
+
"node_modules/@radix-ui/primitive": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz",
+
"integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==",
+
"license": "MIT"
+
},
+
"node_modules/@radix-ui/react-collection": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.1.tgz",
+
"integrity": "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==",
+
"license": "MIT",
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-compose-refs": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz",
+
"integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==",
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-context": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz",
+
"integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-dialog": {
+
"version": "1.1.5",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.5.tgz",
+
"integrity": "sha512-LaO3e5h/NOEL4OfXjxD43k9Dx+vn+8n+PCFt6uhX/BADFflllyv3WJG6rgvvSVBxpTch938Qq/LGc2MMxipXPw==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "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-focus-guards": "1.1.1",
+
"@radix-ui/react-focus-scope": "1.1.1",
+
"@radix-ui/react-id": "1.1.0",
+
"@radix-ui/react-portal": "1.1.3",
+
"@radix-ui/react-presence": "1.1.2",
+
"@radix-ui/react-primitive": "2.0.1",
+
"@radix-ui/react-slot": "1.1.1",
+
"@radix-ui/react-use-controllable-state": "1.1.0",
+
"aria-hidden": "^1.2.4",
+
"react-remove-scroll": "^2.6.2"
+
},
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-direction": {
+
"version": "1.1.0",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz",
+
"integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==",
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-dismissable-layer": {
+
"version": "1.1.4",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.4.tgz",
+
"integrity": "sha512-XDUI0IVYVSwjMXxM6P4Dfti7AH+Y4oS/TB+sglZ/EXc7cqLwGAmp1NlMrcUjj7ks6R5WTZuWKv44FBbLpwU3sA==",
+
"license": "MIT",
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-focus-guards": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz",
+
"integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==",
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-focus-scope": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.1.tgz",
+
"integrity": "sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-compose-refs": "1.1.1",
+
"@radix-ui/react-primitive": "2.0.1",
+
"@radix-ui/react-use-callback-ref": "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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-id": {
+
"version": "1.1.0",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz",
+
"integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==",
+
"license": "MIT",
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-label": {
+
"version": "2.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.1.tgz",
+
"integrity": "sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==",
+
"license": "MIT",
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-portal": {
+
"version": "1.1.3",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.3.tgz",
+
"integrity": "sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==",
+
"license": "MIT",
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-presence": {
+
"version": "1.1.2",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz",
+
"integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==",
+
"license": "MIT",
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-primitive": {
+
"version": "2.0.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz",
+
"integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==",
+
"license": "MIT",
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-roving-focus": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.1.tgz",
+
"integrity": "sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==",
+
"license": "MIT",
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-slot": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
+
"integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
+
"license": "MIT",
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-tabs": {
+
"version": "1.1.2",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.2.tgz",
+
"integrity": "sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ==",
+
"license": "MIT",
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-toast": {
+
"version": "1.2.5",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.5.tgz",
+
"integrity": "sha512-ZzUsAaOx8NdXZZKcFNDhbSlbsCUy8qQWmzTdgrlrhhZAOx2ofLtKrBDW9fkqhFvXgmtv560Uj16pkLkqML7SHA==",
+
"license": "MIT",
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-use-callback-ref": {
+
"version": "1.1.0",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz",
+
"integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==",
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-use-controllable-state": {
+
"version": "1.1.0",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz",
+
"integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==",
+
"license": "MIT",
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-use-escape-keydown": {
+
"version": "1.1.0",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz",
+
"integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==",
+
"license": "MIT",
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-use-layout-effect": {
+
"version": "1.1.0",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz",
+
"integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==",
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-visually-hidden": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.1.tgz",
+
"integrity": "sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==",
+
"license": "MIT",
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@rollup/rollup-darwin-arm64": {
+
"version": "4.32.0",
+
"cpu": [
+
"arm64"
+
],
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
]
+
},
+
"node_modules/@tailwindcss/node": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.0.tgz",
+
"integrity": "sha512-tfG2uBvo6j6kDIPmntxwXggCOZAt7SkpAXJ6pTIYirNdk5FBqh/CZZ9BZPpgcl/tNFLs6zc4yghM76sqiELG9g==",
+
"license": "MIT",
+
"dependencies": {
+
"enhanced-resolve": "^5.18.0",
+
"jiti": "^2.4.2",
+
"tailwindcss": "4.0.0"
+
}
+
},
+
"node_modules/@tailwindcss/node/node_modules/tailwindcss": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.0.tgz",
+
"integrity": "sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ==",
+
"license": "MIT"
+
},
+
"node_modules/@tailwindcss/oxide": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.0.tgz",
+
"integrity": "sha512-W3FjpJgy4VV1JiL7iBYDf2n/WkeDg1Il+0Q7eWnqPyvkPPCo/Mbwc5BiaT7dfBNV6tQKAhVE34rU5xl8pSl50w==",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 10"
+
},
+
"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"
+
}
+
},
+
"node_modules/@tailwindcss/oxide-android-arm64": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.0.tgz",
+
"integrity": "sha512-EAhjU0+FIdyGPR+7MbBWubLLPtmOu+p7c2egTTFBRk/n//zYjNvVK0WhcBK5Y7oUB5mo4EjA2mCbY7dcEMWSRw==",
+
"cpu": [
+
"arm64"
+
],
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"android"
+
],
+
"engines": {
+
"node": ">= 10"
+
}
+
},
+
"node_modules/@tailwindcss/oxide-darwin-arm64": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.0.tgz",
+
"integrity": "sha512-hdz4xnSWS11cIp+7ye+3dGHqs0X33z+BXXTtgPOguDWVa+TdXUzwxonklSzf5wlJFuot3dv5eWzhlNai0oYYQg==",
+
"cpu": [
+
"arm64"
+
],
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": ">= 10"
+
}
+
},
+
"node_modules/@tailwindcss/oxide-darwin-x64": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.0.tgz",
+
"integrity": "sha512-+dOUUaXTkPKKhtUI9QtVaYg+MpmLh2CN0dHohiYXaBirEyPMkjaT0zbRgzQlNnQWjCVVXPQluIEb0OMEjSTH+Q==",
+
"cpu": [
+
"x64"
+
],
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": ">= 10"
+
}
+
},
+
"node_modules/@tailwindcss/oxide-freebsd-x64": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.0.tgz",
+
"integrity": "sha512-CJhGDhxnrmu4SwyC62fA+wP24MhA/TZlIhRHqg1kRuIHoGoVR2uSSm1qxTxU37tSSZj8Up0q6jsBJCAP4k7rgQ==",
+
"cpu": [
+
"x64"
+
],
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"freebsd"
+
],
+
"engines": {
+
"node": ">= 10"
+
}
+
},
+
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.0.tgz",
+
"integrity": "sha512-Wy7Av0xzXfY2ujZBcYy4+7GQm25/J1iHvlQU2CfwdDCuPWfIjYzR6kggz+uVdSJyKV2s64znchBxRE8kV4uXSA==",
+
"cpu": [
+
"arm"
+
],
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 10"
+
}
+
},
+
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.0.tgz",
+
"integrity": "sha512-srwBo2l6pvM0swBntc1ucuhGsfFOLkqPRFQ3dWARRTfSkL1U9nAsob2MKc/n47Eva/W9pZZgMOuf7rDw8pK1Ew==",
+
"cpu": [
+
"arm64"
+
],
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 10"
+
}
+
},
+
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.0.tgz",
+
"integrity": "sha512-abhusswkduYWuezkBmgo0K0/erGq3M4Se5xP0fhc/0dKs0X/rJUYYCFWntHb3IGh3aVzdQ0SXJs93P76DbUqtw==",
+
"cpu": [
+
"arm64"
+
],
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 10"
+
}
+
},
+
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.0.tgz",
+
"integrity": "sha512-hGtRYIUEx377/HlU49+jvVKKwU1MDSKYSMMs0JFO2Wp7LGxk5+0j5+RBk9NFnmp/lbp32yPTgIOO5m1BmDq36A==",
+
"cpu": [
+
"x64"
+
],
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 10"
+
}
+
},
+
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.0.tgz",
+
"integrity": "sha512-7xgQgSAThs0I14VAgmxpJnK6XFSZBxHMGoDXkLyYkEnu+8WRQMbCP93dkCUn2PIv+Q+JulRgc00PJ09uORSLXQ==",
+
"cpu": [
+
"x64"
+
],
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 10"
+
}
+
},
+
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.0.tgz",
+
"integrity": "sha512-qEcgTIPcWY5ZE7f6VxQ/JPrSFMcehzVIlZj7sGE3mVd5YWreAT+Fl1vSP8q2pjnWXn0avZG3Iw7a2hJQAm+fTQ==",
+
"cpu": [
+
"arm64"
+
],
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">= 10"
+
}
+
},
+
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.0.tgz",
+
"integrity": "sha512-bqT0AY8RXb8GMDy28JtngvqaOSB2YixbLPLvUo6I6lkvvUwA6Eqh2Tj60e2Lh7O/k083f8tYiB0WEK4wmTI7Jg==",
+
"cpu": [
+
"x64"
+
],
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">= 10"
+
}
+
},
+
"node_modules/@tailwindcss/vite": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.0.tgz",
+
"integrity": "sha512-4uukMiU9gHui8KMPMdWic5SP1O/tmQ1NFSRNrQWmcop5evAVl/LZ6/LuWL3quEiecp2RBcRWwqJrG+mFXlRlew==",
+
"license": "MIT",
+
"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"
+
}
+
},
+
"node_modules/@tailwindcss/vite/node_modules/tailwindcss": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.0.tgz",
+
"integrity": "sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ==",
+
"license": "MIT"
+
},
+
"node_modules/@types/babel__core": {
+
"version": "7.20.5",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/parser": "^7.20.7",
+
"@babel/types": "^7.20.7",
+
"@types/babel__generator": "*",
+
"@types/babel__template": "*",
+
"@types/babel__traverse": "*"
+
}
+
},
+
"node_modules/@types/babel__generator": {
+
"version": "7.6.8",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/types": "^7.0.0"
+
}
+
},
+
"node_modules/@types/babel__template": {
+
"version": "7.4.4",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/parser": "^7.1.0",
+
"@babel/types": "^7.0.0"
+
}
+
},
+
"node_modules/@types/babel__traverse": {
+
"version": "7.20.6",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/types": "^7.20.7"
+
}
+
},
+
"node_modules/@types/estree": {
+
"version": "1.0.6",
+
"license": "MIT"
+
},
+
"node_modules/@types/json-schema": {
+
"version": "7.0.15",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/@types/node": {
+
"version": "22.10.10",
+
"devOptional": true,
+
"license": "MIT",
+
"dependencies": {
+
"undici-types": "~6.20.0"
+
}
+
},
+
"node_modules/@types/parse-json": {
+
"version": "4.0.2",
+
"license": "MIT"
+
},
+
"node_modules/@types/prop-types": {
+
"version": "15.7.14",
+
"devOptional": true,
+
"license": "MIT"
+
},
+
"node_modules/@types/react": {
+
"version": "18.3.18",
+
"devOptional": true,
+
"license": "MIT",
+
"dependencies": {
+
"@types/prop-types": "*",
+
"csstype": "^3.0.2"
+
}
+
},
+
"node_modules/@types/react-dom": {
+
"version": "18.3.5",
+
"devOptional": true,
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "^18.0.0"
+
}
+
},
+
"node_modules/@typescript-eslint/eslint-plugin": {
+
"version": "8.21.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@eslint-community/regexpp": "^4.10.0",
+
"@typescript-eslint/scope-manager": "8.21.0",
+
"@typescript-eslint/type-utils": "8.21.0",
+
"@typescript-eslint/utils": "8.21.0",
+
"@typescript-eslint/visitor-keys": "8.21.0",
+
"graphemer": "^1.4.0",
+
"ignore": "^5.3.1",
+
"natural-compare": "^1.4.0",
+
"ts-api-utils": "^2.0.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <5.8.0"
+
}
+
},
+
"node_modules/@typescript-eslint/parser": {
+
"version": "8.21.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/scope-manager": "8.21.0",
+
"@typescript-eslint/types": "8.21.0",
+
"@typescript-eslint/typescript-estree": "8.21.0",
+
"@typescript-eslint/visitor-keys": "8.21.0",
+
"debug": "^4.3.4"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <5.8.0"
+
}
+
},
+
"node_modules/@typescript-eslint/scope-manager": {
+
"version": "8.21.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/types": "8.21.0",
+
"@typescript-eslint/visitor-keys": "8.21.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
}
+
},
+
"node_modules/@typescript-eslint/type-utils": {
+
"version": "8.21.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/typescript-estree": "8.21.0",
+
"@typescript-eslint/utils": "8.21.0",
+
"debug": "^4.3.4",
+
"ts-api-utils": "^2.0.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <5.8.0"
+
}
+
},
+
"node_modules/@typescript-eslint/types": {
+
"version": "8.21.0",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
}
+
},
+
"node_modules/@typescript-eslint/typescript-estree": {
+
"version": "8.21.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/types": "8.21.0",
+
"@typescript-eslint/visitor-keys": "8.21.0",
+
"debug": "^4.3.4",
+
"fast-glob": "^3.3.2",
+
"is-glob": "^4.0.3",
+
"minimatch": "^9.0.4",
+
"semver": "^7.6.0",
+
"ts-api-utils": "^2.0.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"typescript": ">=4.8.4 <5.8.0"
+
}
+
},
+
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+
"version": "9.0.5",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"brace-expansion": "^2.0.1"
+
},
+
"engines": {
+
"node": ">=16 || 14 >=14.17"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": {
+
"version": "2.0.1",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"balanced-match": "^1.0.0"
+
}
+
},
+
"node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+
"version": "7.6.3",
+
"dev": true,
+
"license": "ISC",
+
"bin": {
+
"semver": "bin/semver.js"
+
},
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/@typescript-eslint/utils": {
+
"version": "8.21.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@eslint-community/eslint-utils": "^4.4.0",
+
"@typescript-eslint/scope-manager": "8.21.0",
+
"@typescript-eslint/types": "8.21.0",
+
"@typescript-eslint/typescript-estree": "8.21.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <5.8.0"
+
}
+
},
+
"node_modules/@typescript-eslint/visitor-keys": {
+
"version": "8.21.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/types": "8.21.0",
+
"eslint-visitor-keys": "^4.2.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
}
+
},
+
"node_modules/@vitejs/plugin-react": {
+
"version": "4.3.4",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/core": "^7.26.0",
+
"@babel/plugin-transform-react-jsx-self": "^7.25.9",
+
"@babel/plugin-transform-react-jsx-source": "^7.25.9",
+
"@types/babel__core": "^7.20.5",
+
"react-refresh": "^0.14.2"
+
},
+
"engines": {
+
"node": "^14.18.0 || >=16.0.0"
+
},
+
"peerDependencies": {
+
"vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
+
}
+
},
+
"node_modules/acorn": {
+
"version": "8.14.0",
+
"dev": true,
+
"license": "MIT",
+
"bin": {
+
"acorn": "bin/acorn"
+
},
+
"engines": {
+
"node": ">=0.4.0"
+
}
+
},
+
"node_modules/acorn-jsx": {
+
"version": "5.3.2",
+
"dev": true,
+
"license": "MIT",
+
"peerDependencies": {
+
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+
}
+
},
+
"node_modules/ajv": {
+
"version": "6.12.6",
+
"dev": true,
+
"license": "MIT",
+
"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"
+
},
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/epoberezkin"
+
}
+
},
+
"node_modules/ansi-regex": {
+
"version": "6.1.0",
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=12"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
+
}
+
},
+
"node_modules/ansi-styles": {
+
"version": "4.3.0",
+
"license": "MIT",
+
"dependencies": {
+
"color-convert": "^2.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
+
}
+
},
+
"node_modules/any-promise": {
+
"version": "1.3.0",
+
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+
"integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+
"license": "MIT"
+
},
+
"node_modules/anymatch": {
+
"version": "3.1.3",
+
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+
"license": "ISC",
+
"dependencies": {
+
"normalize-path": "^3.0.0",
+
"picomatch": "^2.0.4"
+
},
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/arg": {
+
"version": "5.0.2",
+
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+
"license": "MIT"
+
},
+
"node_modules/argparse": {
+
"version": "2.0.1",
+
"dev": true,
+
"license": "Python-2.0"
+
},
+
"node_modules/aria-hidden": {
+
"version": "1.2.4",
+
"resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz",
+
"integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==",
+
"license": "MIT",
+
"dependencies": {
+
"tslib": "^2.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/asynckit": {
+
"version": "0.4.0",
+
"license": "MIT"
+
},
+
"node_modules/autoprefixer": {
+
"version": "10.4.20",
+
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
+
"integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
+
"dev": true,
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/postcss/"
+
},
+
{
+
"type": "tidelift",
+
"url": "https://tidelift.com/funding/github/npm/autoprefixer"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"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"
+
},
+
"bin": {
+
"autoprefixer": "bin/autoprefixer"
+
},
+
"engines": {
+
"node": "^10 || ^12 || >=14"
+
},
+
"peerDependencies": {
+
"postcss": "^8.1.0"
+
}
+
},
+
"node_modules/axios": {
+
"version": "1.7.9",
+
"license": "MIT",
+
"dependencies": {
+
"follow-redirects": "^1.15.6",
+
"form-data": "^4.0.0",
+
"proxy-from-env": "^1.1.0"
+
}
+
},
+
"node_modules/babel-plugin-macros": {
+
"version": "3.1.0",
+
"license": "MIT",
+
"dependencies": {
+
"@babel/runtime": "^7.12.5",
+
"cosmiconfig": "^7.0.0",
+
"resolve": "^1.19.0"
+
},
+
"engines": {
+
"node": ">=10",
+
"npm": ">=6"
+
}
+
},
+
"node_modules/balanced-match": {
+
"version": "1.0.2",
+
"license": "MIT"
+
},
+
"node_modules/binary-extensions": {
+
"version": "2.3.0",
+
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/brace-expansion": {
+
"version": "1.1.11",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"balanced-match": "^1.0.0",
+
"concat-map": "0.0.1"
+
}
+
},
+
"node_modules/braces": {
+
"version": "3.0.3",
+
"license": "MIT",
+
"dependencies": {
+
"fill-range": "^7.1.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/browserslist": {
+
"version": "4.24.4",
+
"dev": true,
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/browserslist"
+
},
+
{
+
"type": "tidelift",
+
"url": "https://tidelift.com/funding/github/npm/browserslist"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"caniuse-lite": "^1.0.30001688",
+
"electron-to-chromium": "^1.5.73",
+
"node-releases": "^2.0.19",
+
"update-browserslist-db": "^1.1.1"
+
},
+
"bin": {
+
"browserslist": "cli.js"
+
},
+
"engines": {
+
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+
}
+
},
+
"node_modules/callsites": {
+
"version": "3.1.0",
+
"license": "MIT",
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/camelcase-css": {
+
"version": "2.0.1",
+
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"node_modules/caniuse-lite": {
+
"version": "1.0.30001695",
+
"dev": true,
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/browserslist"
+
},
+
{
+
"type": "tidelift",
+
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "CC-BY-4.0"
+
},
+
"node_modules/chalk": {
+
"version": "4.1.2",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"ansi-styles": "^4.1.0",
+
"supports-color": "^7.1.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/chalk?sponsor=1"
+
}
+
},
+
"node_modules/chokidar": {
+
"version": "3.6.0",
+
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+
"license": "MIT",
+
"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"
+
},
+
"engines": {
+
"node": ">= 8.10.0"
+
},
+
"funding": {
+
"url": "https://paulmillr.com/funding/"
+
},
+
"optionalDependencies": {
+
"fsevents": "~2.3.2"
+
}
+
},
+
"node_modules/chokidar/node_modules/glob-parent": {
+
"version": "5.1.2",
+
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+
"license": "ISC",
+
"dependencies": {
+
"is-glob": "^4.0.1"
+
},
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"node_modules/class-variance-authority": {
+
"version": "0.7.1",
+
"resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
+
"integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
+
"license": "Apache-2.0",
+
"dependencies": {
+
"clsx": "^2.1.1"
+
},
+
"funding": {
+
"url": "https://polar.sh/cva"
+
}
+
},
+
"node_modules/clsx": {
+
"version": "2.1.1",
+
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+
"integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/color-convert": {
+
"version": "2.0.1",
+
"license": "MIT",
+
"dependencies": {
+
"color-name": "~1.1.4"
+
},
+
"engines": {
+
"node": ">=7.0.0"
+
}
+
},
+
"node_modules/color-name": {
+
"version": "1.1.4",
+
"license": "MIT"
+
},
+
"node_modules/combined-stream": {
+
"version": "1.0.8",
+
"license": "MIT",
+
"dependencies": {
+
"delayed-stream": "~1.0.0"
+
},
+
"engines": {
+
"node": ">= 0.8"
+
}
+
},
+
"node_modules/commander": {
+
"version": "4.1.1",
+
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"node_modules/concat-map": {
+
"version": "0.0.1",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/convert-source-map": {
+
"version": "2.0.0",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/cosmiconfig": {
+
"version": "7.1.0",
+
"license": "MIT",
+
"dependencies": {
+
"@types/parse-json": "^4.0.0",
+
"import-fresh": "^3.2.1",
+
"parse-json": "^5.0.0",
+
"path-type": "^4.0.0",
+
"yaml": "^1.10.0"
+
},
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/cosmiconfig/node_modules/yaml": {
+
"version": "1.10.2",
+
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+
"license": "ISC",
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"node_modules/cross-spawn": {
+
"version": "7.0.6",
+
"license": "MIT",
+
"dependencies": {
+
"path-key": "^3.1.0",
+
"shebang-command": "^2.0.0",
+
"which": "^2.0.1"
+
},
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/cssesc": {
+
"version": "3.0.0",
+
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+
"license": "MIT",
+
"bin": {
+
"cssesc": "bin/cssesc"
+
},
+
"engines": {
+
"node": ">=4"
+
}
+
},
+
"node_modules/csstype": {
+
"version": "3.1.3",
+
"license": "MIT"
+
},
+
"node_modules/debug": {
+
"version": "4.4.0",
+
"license": "MIT",
+
"dependencies": {
+
"ms": "^2.1.3"
+
},
+
"engines": {
+
"node": ">=6.0"
+
},
+
"peerDependenciesMeta": {
+
"supports-color": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/deep-is": {
+
"version": "0.1.4",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/delayed-stream": {
+
"version": "1.0.0",
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.4.0"
+
}
+
},
+
"node_modules/detect-libc": {
+
"version": "1.0.3",
+
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+
"integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+
"license": "Apache-2.0",
+
"bin": {
+
"detect-libc": "bin/detect-libc.js"
+
},
+
"engines": {
+
"node": ">=0.10"
+
}
+
},
+
"node_modules/detect-node-es": {
+
"version": "1.1.0",
+
"license": "MIT"
+
},
+
"node_modules/didyoumean": {
+
"version": "1.2.2",
+
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+
"license": "Apache-2.0"
+
},
+
"node_modules/dlv": {
+
"version": "1.1.3",
+
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+
"license": "MIT"
+
},
+
"node_modules/eastasianwidth": {
+
"version": "0.2.0",
+
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+
"license": "MIT"
+
},
+
"node_modules/electron-to-chromium": {
+
"version": "1.5.88",
+
"dev": true,
+
"license": "ISC"
+
},
+
"node_modules/emoji-regex": {
+
"version": "9.2.2",
+
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+
"license": "MIT"
+
},
+
"node_modules/enhanced-resolve": {
+
"version": "5.18.0",
+
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz",
+
"integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==",
+
"license": "MIT",
+
"dependencies": {
+
"graceful-fs": "^4.2.4",
+
"tapable": "^2.2.0"
+
},
+
"engines": {
+
"node": ">=10.13.0"
+
}
+
},
+
"node_modules/error-ex": {
+
"version": "1.3.2",
+
"license": "MIT",
+
"dependencies": {
+
"is-arrayish": "^0.2.1"
+
}
+
},
+
"node_modules/esbuild": {
+
"version": "0.24.2",
+
"hasInstallScript": true,
+
"license": "MIT",
+
"bin": {
+
"esbuild": "bin/esbuild"
+
},
+
"engines": {
+
"node": ">=18"
+
},
+
"optionalDependencies": {
+
"@esbuild/aix-ppc64": "0.24.2",
+
"@esbuild/android-arm": "0.24.2",
+
"@esbuild/android-arm64": "0.24.2",
+
"@esbuild/android-x64": "0.24.2",
+
"@esbuild/darwin-arm64": "0.24.2",
+
"@esbuild/darwin-x64": "0.24.2",
+
"@esbuild/freebsd-arm64": "0.24.2",
+
"@esbuild/freebsd-x64": "0.24.2",
+
"@esbuild/linux-arm": "0.24.2",
+
"@esbuild/linux-arm64": "0.24.2",
+
"@esbuild/linux-ia32": "0.24.2",
+
"@esbuild/linux-loong64": "0.24.2",
+
"@esbuild/linux-mips64el": "0.24.2",
+
"@esbuild/linux-ppc64": "0.24.2",
+
"@esbuild/linux-riscv64": "0.24.2",
+
"@esbuild/linux-s390x": "0.24.2",
+
"@esbuild/linux-x64": "0.24.2",
+
"@esbuild/netbsd-arm64": "0.24.2",
+
"@esbuild/netbsd-x64": "0.24.2",
+
"@esbuild/openbsd-arm64": "0.24.2",
+
"@esbuild/openbsd-x64": "0.24.2",
+
"@esbuild/sunos-x64": "0.24.2",
+
"@esbuild/win32-arm64": "0.24.2",
+
"@esbuild/win32-ia32": "0.24.2",
+
"@esbuild/win32-x64": "0.24.2"
+
}
+
},
+
"node_modules/escalade": {
+
"version": "3.2.0",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/escape-string-regexp": {
+
"version": "4.0.0",
+
"license": "MIT",
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/eslint": {
+
"version": "9.19.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@eslint-community/eslint-utils": "^4.2.0",
+
"@eslint-community/regexpp": "^4.12.1",
+
"@eslint/config-array": "^0.19.0",
+
"@eslint/core": "^0.10.0",
+
"@eslint/eslintrc": "^3.2.0",
+
"@eslint/js": "9.19.0",
+
"@eslint/plugin-kit": "^0.2.5",
+
"@humanfs/node": "^0.16.6",
+
"@humanwhocodes/module-importer": "^1.0.1",
+
"@humanwhocodes/retry": "^0.4.1",
+
"@types/estree": "^1.0.6",
+
"@types/json-schema": "^7.0.15",
+
"ajv": "^6.12.4",
+
"chalk": "^4.0.0",
+
"cross-spawn": "^7.0.6",
+
"debug": "^4.3.2",
+
"escape-string-regexp": "^4.0.0",
+
"eslint-scope": "^8.2.0",
+
"eslint-visitor-keys": "^4.2.0",
+
"espree": "^10.3.0",
+
"esquery": "^1.5.0",
+
"esutils": "^2.0.2",
+
"fast-deep-equal": "^3.1.3",
+
"file-entry-cache": "^8.0.0",
+
"find-up": "^5.0.0",
+
"glob-parent": "^6.0.2",
+
"ignore": "^5.2.0",
+
"imurmurhash": "^0.1.4",
+
"is-glob": "^4.0.0",
+
"json-stable-stringify-without-jsonify": "^1.0.1",
+
"lodash.merge": "^4.6.2",
+
"minimatch": "^3.1.2",
+
"natural-compare": "^1.4.0",
+
"optionator": "^0.9.3"
+
},
+
"bin": {
+
"eslint": "bin/eslint.js"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"url": "https://eslint.org/donate"
+
},
+
"peerDependencies": {
+
"jiti": "*"
+
},
+
"peerDependenciesMeta": {
+
"jiti": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/eslint-plugin-react-hooks": {
+
"version": "5.1.0",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=10"
+
},
+
"peerDependencies": {
+
"eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+
}
+
},
+
"node_modules/eslint-plugin-react-refresh": {
+
"version": "0.4.18",
+
"dev": true,
+
"license": "MIT",
+
"peerDependencies": {
+
"eslint": ">=8.40"
+
}
+
},
+
"node_modules/eslint-scope": {
+
"version": "8.2.0",
+
"dev": true,
+
"license": "BSD-2-Clause",
+
"dependencies": {
+
"esrecurse": "^4.3.0",
+
"estraverse": "^5.2.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"url": "https://opencollective.com/eslint"
+
}
+
},
+
"node_modules/eslint-visitor-keys": {
+
"version": "4.2.0",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"url": "https://opencollective.com/eslint"
+
}
+
},
+
"node_modules/espree": {
+
"version": "10.3.0",
+
"dev": true,
+
"license": "BSD-2-Clause",
+
"dependencies": {
+
"acorn": "^8.14.0",
+
"acorn-jsx": "^5.3.2",
+
"eslint-visitor-keys": "^4.2.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"url": "https://opencollective.com/eslint"
+
}
+
},
+
"node_modules/esquery": {
+
"version": "1.6.0",
+
"dev": true,
+
"license": "BSD-3-Clause",
+
"dependencies": {
+
"estraverse": "^5.1.0"
+
},
+
"engines": {
+
"node": ">=0.10"
+
}
+
},
+
"node_modules/esrecurse": {
+
"version": "4.3.0",
+
"dev": true,
+
"license": "BSD-2-Clause",
+
"dependencies": {
+
"estraverse": "^5.2.0"
+
},
+
"engines": {
+
"node": ">=4.0"
+
}
+
},
+
"node_modules/estraverse": {
+
"version": "5.3.0",
+
"dev": true,
+
"license": "BSD-2-Clause",
+
"engines": {
+
"node": ">=4.0"
+
}
+
},
+
"node_modules/esutils": {
+
"version": "2.0.3",
+
"dev": true,
+
"license": "BSD-2-Clause",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/fast-deep-equal": {
+
"version": "3.1.3",
+
"license": "MIT"
+
},
+
"node_modules/fast-glob": {
+
"version": "3.3.3",
+
"license": "MIT",
+
"dependencies": {
+
"@nodelib/fs.stat": "^2.0.2",
+
"@nodelib/fs.walk": "^1.2.3",
+
"glob-parent": "^5.1.2",
+
"merge2": "^1.3.0",
+
"micromatch": "^4.0.8"
+
},
+
"engines": {
+
"node": ">=8.6.0"
+
}
+
},
+
"node_modules/fast-glob/node_modules/glob-parent": {
+
"version": "5.1.2",
+
"license": "ISC",
+
"dependencies": {
+
"is-glob": "^4.0.1"
+
},
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"node_modules/fast-json-stable-stringify": {
+
"version": "2.1.0",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/fast-levenshtein": {
+
"version": "2.0.6",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/fastq": {
+
"version": "1.18.0",
+
"license": "ISC",
+
"dependencies": {
+
"reusify": "^1.0.4"
+
}
+
},
+
"node_modules/file-entry-cache": {
+
"version": "8.0.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"flat-cache": "^4.0.0"
+
},
+
"engines": {
+
"node": ">=16.0.0"
+
}
+
},
+
"node_modules/fill-range": {
+
"version": "7.1.1",
+
"license": "MIT",
+
"dependencies": {
+
"to-regex-range": "^5.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/find-root": {
+
"version": "1.1.0",
+
"license": "MIT"
+
},
+
"node_modules/find-up": {
+
"version": "5.0.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"locate-path": "^6.0.0",
+
"path-exists": "^4.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/flat-cache": {
+
"version": "4.0.1",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"flatted": "^3.2.9",
+
"keyv": "^4.5.4"
+
},
+
"engines": {
+
"node": ">=16"
+
}
+
},
+
"node_modules/flatted": {
+
"version": "3.3.2",
+
"dev": true,
+
"license": "ISC"
+
},
+
"node_modules/follow-redirects": {
+
"version": "1.15.9",
+
"funding": [
+
{
+
"type": "individual",
+
"url": "https://github.com/sponsors/RubenVerborgh"
+
}
+
],
+
"license": "MIT",
+
"engines": {
+
"node": ">=4.0"
+
},
+
"peerDependenciesMeta": {
+
"debug": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/foreground-child": {
+
"version": "3.3.0",
+
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+
"integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+
"license": "ISC",
+
"dependencies": {
+
"cross-spawn": "^7.0.0",
+
"signal-exit": "^4.0.1"
+
},
+
"engines": {
+
"node": ">=14"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"node_modules/form-data": {
+
"version": "4.0.1",
+
"license": "MIT",
+
"dependencies": {
+
"asynckit": "^0.4.0",
+
"combined-stream": "^1.0.8",
+
"mime-types": "^2.1.12"
+
},
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"node_modules/fraction.js": {
+
"version": "4.3.7",
+
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+
"integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "*"
+
},
+
"funding": {
+
"type": "patreon",
+
"url": "https://github.com/sponsors/rawify"
+
}
+
},
+
"node_modules/fsevents": {
+
"version": "2.3.3",
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+
}
+
},
+
"node_modules/function-bind": {
+
"version": "1.1.2",
+
"license": "MIT",
+
"funding": {
+
"url": "https://github.com/sponsors/ljharb"
+
}
+
},
+
"node_modules/gensync": {
+
"version": "1.0.0-beta.2",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/get-nonce": {
+
"version": "1.0.1",
+
"license": "MIT",
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/glob": {
+
"version": "10.4.5",
+
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+
"integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+
"license": "ISC",
+
"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"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"node_modules/glob-parent": {
+
"version": "6.0.2",
+
"license": "ISC",
+
"dependencies": {
+
"is-glob": "^4.0.3"
+
},
+
"engines": {
+
"node": ">=10.13.0"
+
}
+
},
+
"node_modules/glob/node_modules/brace-expansion": {
+
"version": "2.0.1",
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+
"license": "MIT",
+
"dependencies": {
+
"balanced-match": "^1.0.0"
+
}
+
},
+
"node_modules/glob/node_modules/minimatch": {
+
"version": "9.0.5",
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+
"license": "ISC",
+
"dependencies": {
+
"brace-expansion": "^2.0.1"
+
},
+
"engines": {
+
"node": ">=16 || 14 >=14.17"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"node_modules/globals": {
+
"version": "15.14.0",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=18"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/graceful-fs": {
+
"version": "4.2.11",
+
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+
"license": "ISC"
+
},
+
"node_modules/graphemer": {
+
"version": "1.4.0",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/has-flag": {
+
"version": "4.0.0",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/hasown": {
+
"version": "2.0.2",
+
"license": "MIT",
+
"dependencies": {
+
"function-bind": "^1.1.2"
+
},
+
"engines": {
+
"node": ">= 0.4"
+
}
+
},
+
"node_modules/hoist-non-react-statics": {
+
"version": "3.3.2",
+
"license": "BSD-3-Clause",
+
"dependencies": {
+
"react-is": "^16.7.0"
+
}
+
},
+
"node_modules/ignore": {
+
"version": "5.3.2",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">= 4"
+
}
+
},
+
"node_modules/import-fresh": {
+
"version": "3.3.0",
+
"license": "MIT",
+
"dependencies": {
+
"parent-module": "^1.0.0",
+
"resolve-from": "^4.0.0"
+
},
+
"engines": {
+
"node": ">=6"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/imurmurhash": {
+
"version": "0.1.4",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.8.19"
+
}
+
},
+
"node_modules/is-arrayish": {
+
"version": "0.2.1",
+
"license": "MIT"
+
},
+
"node_modules/is-binary-path": {
+
"version": "2.1.0",
+
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+
"license": "MIT",
+
"dependencies": {
+
"binary-extensions": "^2.0.0"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/is-core-module": {
+
"version": "2.16.1",
+
"license": "MIT",
+
"dependencies": {
+
"hasown": "^2.0.2"
+
},
+
"engines": {
+
"node": ">= 0.4"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/ljharb"
+
}
+
},
+
"node_modules/is-extglob": {
+
"version": "2.1.1",
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/is-fullwidth-code-point": {
+
"version": "3.0.0",
+
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/is-glob": {
+
"version": "4.0.3",
+
"license": "MIT",
+
"dependencies": {
+
"is-extglob": "^2.1.1"
+
},
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/is-number": {
+
"version": "7.0.0",
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.12.0"
+
}
+
},
+
"node_modules/isexe": {
+
"version": "2.0.0",
+
"license": "ISC"
+
},
+
"node_modules/jackspeak": {
+
"version": "3.4.3",
+
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+
"integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+
"license": "BlueOak-1.0.0",
+
"dependencies": {
+
"@isaacs/cliui": "^8.0.2"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
},
+
"optionalDependencies": {
+
"@pkgjs/parseargs": "^0.11.0"
+
}
+
},
+
"node_modules/jiti": {
+
"version": "2.4.2",
+
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
+
"integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
+
"license": "MIT",
+
"bin": {
+
"jiti": "lib/jiti-cli.mjs"
+
}
+
},
+
"node_modules/js-tokens": {
+
"version": "4.0.0",
+
"license": "MIT"
+
},
+
"node_modules/js-yaml": {
+
"version": "4.1.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"argparse": "^2.0.1"
+
},
+
"bin": {
+
"js-yaml": "bin/js-yaml.js"
+
}
+
},
+
"node_modules/jsesc": {
+
"version": "3.1.0",
+
"license": "MIT",
+
"bin": {
+
"jsesc": "bin/jsesc"
+
},
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/json-buffer": {
+
"version": "3.0.1",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/json-parse-even-better-errors": {
+
"version": "2.3.1",
+
"license": "MIT"
+
},
+
"node_modules/json-schema-traverse": {
+
"version": "0.4.1",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/json-stable-stringify-without-jsonify": {
+
"version": "1.0.1",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/json5": {
+
"version": "2.2.3",
+
"dev": true,
+
"license": "MIT",
+
"bin": {
+
"json5": "lib/cli.js"
+
},
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/keyv": {
+
"version": "4.5.4",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"json-buffer": "3.0.1"
+
}
+
},
+
"node_modules/klona": {
+
"version": "2.0.6",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/levn": {
+
"version": "0.4.1",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"prelude-ls": "^1.2.1",
+
"type-check": "~0.4.0"
+
},
+
"engines": {
+
"node": ">= 0.8.0"
+
}
+
},
+
"node_modules/lightningcss": {
+
"version": "1.29.1",
+
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz",
+
"integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==",
+
"license": "MPL-2.0",
+
"dependencies": {
+
"detect-libc": "^1.0.3"
+
},
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
},
+
"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"
+
}
+
},
+
"node_modules/lightningcss-darwin-arm64": {
+
"version": "1.29.1",
+
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz",
+
"integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==",
+
"cpu": [
+
"arm64"
+
],
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-darwin-x64": {
+
"version": "1.29.1",
+
"resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz",
+
"integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==",
+
"cpu": [
+
"x64"
+
],
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-freebsd-x64": {
+
"version": "1.29.1",
+
"resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz",
+
"integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==",
+
"cpu": [
+
"x64"
+
],
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"freebsd"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-linux-arm-gnueabihf": {
+
"version": "1.29.1",
+
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz",
+
"integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==",
+
"cpu": [
+
"arm"
+
],
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-linux-arm64-gnu": {
+
"version": "1.29.1",
+
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz",
+
"integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==",
+
"cpu": [
+
"arm64"
+
],
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-linux-arm64-musl": {
+
"version": "1.29.1",
+
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz",
+
"integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==",
+
"cpu": [
+
"arm64"
+
],
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-linux-x64-gnu": {
+
"version": "1.29.1",
+
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz",
+
"integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==",
+
"cpu": [
+
"x64"
+
],
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-linux-x64-musl": {
+
"version": "1.29.1",
+
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz",
+
"integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==",
+
"cpu": [
+
"x64"
+
],
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-win32-arm64-msvc": {
+
"version": "1.29.1",
+
"resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz",
+
"integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==",
+
"cpu": [
+
"arm64"
+
],
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-win32-x64-msvc": {
+
"version": "1.29.1",
+
"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz",
+
"integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==",
+
"cpu": [
+
"x64"
+
],
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lilconfig": {
+
"version": "3.1.3",
+
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+
"integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=14"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/antonk52"
+
}
+
},
+
"node_modules/lines-and-columns": {
+
"version": "1.2.4",
+
"license": "MIT"
+
},
+
"node_modules/locate-path": {
+
"version": "6.0.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"p-locate": "^5.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/lodash.merge": {
+
"version": "4.6.2",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/loose-envify": {
+
"version": "1.4.0",
+
"license": "MIT",
+
"dependencies": {
+
"js-tokens": "^3.0.0 || ^4.0.0"
+
},
+
"bin": {
+
"loose-envify": "cli.js"
+
}
+
},
+
"node_modules/lru-cache": {
+
"version": "5.1.1",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"yallist": "^3.0.2"
+
}
+
},
+
"node_modules/lucide-react": {
+
"version": "0.474.0",
+
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.474.0.tgz",
+
"integrity": "sha512-CmghgHkh0OJNmxGKWc0qfPJCYHASPMVSyGY8fj3xgk4v84ItqDg64JNKFZn5hC6E0vHi6gxnbCgwhyVB09wQtA==",
+
"license": "ISC",
+
"peerDependencies": {
+
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+
}
+
},
+
"node_modules/merge2": {
+
"version": "1.4.1",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/micromatch": {
+
"version": "4.0.8",
+
"license": "MIT",
+
"dependencies": {
+
"braces": "^3.0.3",
+
"picomatch": "^2.3.1"
+
},
+
"engines": {
+
"node": ">=8.6"
+
}
+
},
+
"node_modules/mime-db": {
+
"version": "1.52.0",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 0.6"
+
}
+
},
+
"node_modules/mime-types": {
+
"version": "2.1.35",
+
"license": "MIT",
+
"dependencies": {
+
"mime-db": "1.52.0"
+
},
+
"engines": {
+
"node": ">= 0.6"
+
}
+
},
+
"node_modules/minimatch": {
+
"version": "3.1.2",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"brace-expansion": "^1.1.7"
+
},
+
"engines": {
+
"node": "*"
+
}
+
},
+
"node_modules/minipass": {
+
"version": "7.1.2",
+
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+
"license": "ISC",
+
"engines": {
+
"node": ">=16 || 14 >=14.17"
+
}
+
},
+
"node_modules/ms": {
+
"version": "2.1.3",
+
"license": "MIT"
+
},
+
"node_modules/mz": {
+
"version": "2.7.0",
+
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+
"integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+
"license": "MIT",
+
"dependencies": {
+
"any-promise": "^1.0.0",
+
"object-assign": "^4.0.1",
+
"thenify-all": "^1.0.0"
+
}
+
},
+
"node_modules/nanoid": {
+
"version": "3.3.8",
+
"funding": [
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"bin": {
+
"nanoid": "bin/nanoid.cjs"
+
},
+
"engines": {
+
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+
}
+
},
+
"node_modules/natural-compare": {
+
"version": "1.4.0",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/node-releases": {
+
"version": "2.0.19",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/normalize-path": {
+
"version": "3.0.0",
+
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/normalize-range": {
+
"version": "0.1.2",
+
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+
"integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/object-assign": {
+
"version": "4.1.1",
+
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/object-hash": {
+
"version": "3.0.0",
+
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"node_modules/optionator": {
+
"version": "0.9.4",
+
"dev": true,
+
"license": "MIT",
+
"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"
+
},
+
"engines": {
+
"node": ">= 0.8.0"
+
}
+
},
+
"node_modules/p-limit": {
+
"version": "3.1.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"yocto-queue": "^0.1.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/p-locate": {
+
"version": "5.0.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"p-limit": "^3.0.2"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/package-json-from-dist": {
+
"version": "1.0.1",
+
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+
"license": "BlueOak-1.0.0"
+
},
+
"node_modules/parent-module": {
+
"version": "1.0.1",
+
"license": "MIT",
+
"dependencies": {
+
"callsites": "^3.0.0"
+
},
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/parse-json": {
+
"version": "5.2.0",
+
"license": "MIT",
+
"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"
+
},
+
"engines": {
+
"node": ">=8"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/path-exists": {
+
"version": "4.0.0",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/path-key": {
+
"version": "3.1.1",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/path-parse": {
+
"version": "1.0.7",
+
"license": "MIT"
+
},
+
"node_modules/path-scurry": {
+
"version": "1.11.1",
+
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+
"integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+
"license": "BlueOak-1.0.0",
+
"dependencies": {
+
"lru-cache": "^10.2.0",
+
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+
},
+
"engines": {
+
"node": ">=16 || 14 >=14.18"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"node_modules/path-scurry/node_modules/lru-cache": {
+
"version": "10.4.3",
+
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+
"license": "ISC"
+
},
+
"node_modules/path-type": {
+
"version": "4.0.0",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/picocolors": {
+
"version": "1.1.1",
+
"license": "ISC"
+
},
+
"node_modules/picomatch": {
+
"version": "2.3.1",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8.6"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/jonschlinkert"
+
}
+
},
+
"node_modules/pify": {
+
"version": "2.3.0",
+
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/pirates": {
+
"version": "4.0.6",
+
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+
"integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"node_modules/postcss": {
+
"version": "8.5.1",
+
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
+
"integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/postcss/"
+
},
+
{
+
"type": "tidelift",
+
"url": "https://tidelift.com/funding/github/npm/postcss"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"nanoid": "^3.3.8",
+
"picocolors": "^1.1.1",
+
"source-map-js": "^1.2.1"
+
},
+
"engines": {
+
"node": "^10 || ^12 || >=14"
+
}
+
},
+
"node_modules/postcss-import": {
+
"version": "15.1.0",
+
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+
"integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+
"license": "MIT",
+
"dependencies": {
+
"postcss-value-parser": "^4.0.0",
+
"read-cache": "^1.0.0",
+
"resolve": "^1.1.7"
+
},
+
"engines": {
+
"node": ">=14.0.0"
+
},
+
"peerDependencies": {
+
"postcss": "^8.0.0"
+
}
+
},
+
"node_modules/postcss-js": {
+
"version": "4.0.1",
+
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+
"integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+
"license": "MIT",
+
"dependencies": {
+
"camelcase-css": "^2.0.1"
+
},
+
"engines": {
+
"node": "^12 || ^14 || >= 16"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/postcss/"
+
},
+
"peerDependencies": {
+
"postcss": "^8.4.21"
+
}
+
},
+
"node_modules/postcss-load-config": {
+
"version": "4.0.2",
+
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+
"integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/postcss/"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"lilconfig": "^3.0.0",
+
"yaml": "^2.3.4"
+
},
+
"engines": {
+
"node": ">= 14"
+
},
+
"peerDependencies": {
+
"postcss": ">=8.0.9",
+
"ts-node": ">=9.0.0"
+
},
+
"peerDependenciesMeta": {
+
"postcss": {
+
"optional": true
+
},
+
"ts-node": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/postcss-nested": {
+
"version": "6.2.0",
+
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+
"integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/postcss/"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"postcss-selector-parser": "^6.1.1"
+
},
+
"engines": {
+
"node": ">=12.0"
+
},
+
"peerDependencies": {
+
"postcss": "^8.2.14"
+
}
+
},
+
"node_modules/postcss-selector-parser": {
+
"version": "6.1.2",
+
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+
"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+
"license": "MIT",
+
"dependencies": {
+
"cssesc": "^3.0.0",
+
"util-deprecate": "^1.0.2"
+
},
+
"engines": {
+
"node": ">=4"
+
}
+
},
+
"node_modules/postcss-value-parser": {
+
"version": "4.2.0",
+
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+
"license": "MIT"
+
},
+
"node_modules/prelude-ls": {
+
"version": "1.2.1",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">= 0.8.0"
+
}
+
},
+
"node_modules/proxy-from-env": {
+
"version": "1.1.0",
+
"license": "MIT"
+
},
+
"node_modules/punycode": {
+
"version": "2.3.1",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/queue-microtask": {
+
"version": "1.2.3",
+
"funding": [
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/feross"
+
},
+
{
+
"type": "patreon",
+
"url": "https://www.patreon.com/feross"
+
},
+
{
+
"type": "consulting",
+
"url": "https://feross.org/support"
+
}
+
],
+
"license": "MIT"
+
},
+
"node_modules/react": {
+
"version": "18.3.1",
+
"license": "MIT",
+
"dependencies": {
+
"loose-envify": "^1.1.0"
+
},
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/react-dom": {
+
"version": "18.3.1",
+
"license": "MIT",
+
"dependencies": {
+
"loose-envify": "^1.1.0",
+
"scheduler": "^0.23.2"
+
},
+
"peerDependencies": {
+
"react": "^18.3.1"
+
}
+
},
+
"node_modules/react-hook-form": {
+
"version": "7.54.2",
+
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.2.tgz",
+
"integrity": "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=18.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/react-hook-form"
+
},
+
"peerDependencies": {
+
"react": "^16.8.0 || ^17 || ^18 || ^19"
+
}
+
},
+
"node_modules/react-is": {
+
"version": "16.13.1",
+
"license": "MIT"
+
},
+
"node_modules/react-number-format": {
+
"version": "5.4.3",
+
"license": "MIT",
+
"peerDependencies": {
+
"react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+
"react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+
}
+
},
+
"node_modules/react-refresh": {
+
"version": "0.14.2",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/react-remove-scroll": {
+
"version": "2.6.3",
+
"license": "MIT",
+
"dependencies": {
+
"react-remove-scroll-bar": "^2.3.7",
+
"react-style-singleton": "^2.2.3",
+
"tslib": "^2.1.0",
+
"use-callback-ref": "^1.3.3",
+
"use-sidecar": "^1.1.3"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/react-remove-scroll-bar": {
+
"version": "2.3.8",
+
"license": "MIT",
+
"dependencies": {
+
"react-style-singleton": "^2.2.2",
+
"tslib": "^2.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/react-style-singleton": {
+
"version": "2.2.3",
+
"license": "MIT",
+
"dependencies": {
+
"get-nonce": "^1.0.0",
+
"tslib": "^2.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/react-textarea-autosize": {
+
"version": "8.5.6",
+
"license": "MIT",
+
"dependencies": {
+
"@babel/runtime": "^7.20.13",
+
"use-composed-ref": "^1.3.0",
+
"use-latest": "^1.2.1"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"peerDependencies": {
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+
}
+
},
+
"node_modules/read-cache": {
+
"version": "1.0.0",
+
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+
"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+
"license": "MIT",
+
"dependencies": {
+
"pify": "^2.3.0"
+
}
+
},
+
"node_modules/readdirp": {
+
"version": "3.6.0",
+
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+
"license": "MIT",
+
"dependencies": {
+
"picomatch": "^2.2.1"
+
},
+
"engines": {
+
"node": ">=8.10.0"
+
}
+
},
+
"node_modules/regenerator-runtime": {
+
"version": "0.14.1",
+
"license": "MIT"
+
},
+
"node_modules/resolve": {
+
"version": "1.22.10",
+
"license": "MIT",
+
"dependencies": {
+
"is-core-module": "^2.16.0",
+
"path-parse": "^1.0.7",
+
"supports-preserve-symlinks-flag": "^1.0.0"
+
},
+
"bin": {
+
"resolve": "bin/resolve"
+
},
+
"engines": {
+
"node": ">= 0.4"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/ljharb"
+
}
+
},
+
"node_modules/resolve-from": {
+
"version": "4.0.0",
+
"license": "MIT",
+
"engines": {
+
"node": ">=4"
+
}
+
},
+
"node_modules/reusify": {
+
"version": "1.0.4",
+
"license": "MIT",
+
"engines": {
+
"iojs": ">=1.0.0",
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/rollup": {
+
"version": "4.32.0",
+
"license": "MIT",
+
"dependencies": {
+
"@types/estree": "1.0.6"
+
},
+
"bin": {
+
"rollup": "dist/bin/rollup"
+
},
+
"engines": {
+
"node": ">=18.0.0",
+
"npm": ">=8.0.0"
+
},
+
"optionalDependencies": {
+
"@rollup/rollup-android-arm-eabi": "4.32.0",
+
"@rollup/rollup-android-arm64": "4.32.0",
+
"@rollup/rollup-darwin-arm64": "4.32.0",
+
"@rollup/rollup-darwin-x64": "4.32.0",
+
"@rollup/rollup-freebsd-arm64": "4.32.0",
+
"@rollup/rollup-freebsd-x64": "4.32.0",
+
"@rollup/rollup-linux-arm-gnueabihf": "4.32.0",
+
"@rollup/rollup-linux-arm-musleabihf": "4.32.0",
+
"@rollup/rollup-linux-arm64-gnu": "4.32.0",
+
"@rollup/rollup-linux-arm64-musl": "4.32.0",
+
"@rollup/rollup-linux-loongarch64-gnu": "4.32.0",
+
"@rollup/rollup-linux-powerpc64le-gnu": "4.32.0",
+
"@rollup/rollup-linux-riscv64-gnu": "4.32.0",
+
"@rollup/rollup-linux-s390x-gnu": "4.32.0",
+
"@rollup/rollup-linux-x64-gnu": "4.32.0",
+
"@rollup/rollup-linux-x64-musl": "4.32.0",
+
"@rollup/rollup-win32-arm64-msvc": "4.32.0",
+
"@rollup/rollup-win32-ia32-msvc": "4.32.0",
+
"@rollup/rollup-win32-x64-msvc": "4.32.0",
+
"fsevents": "~2.3.2"
+
}
+
},
+
"node_modules/run-parallel": {
+
"version": "1.2.0",
+
"funding": [
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/feross"
+
},
+
{
+
"type": "patreon",
+
"url": "https://www.patreon.com/feross"
+
},
+
{
+
"type": "consulting",
+
"url": "https://feross.org/support"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"queue-microtask": "^1.2.2"
+
}
+
},
+
"node_modules/scheduler": {
+
"version": "0.23.2",
+
"license": "MIT",
+
"dependencies": {
+
"loose-envify": "^1.1.0"
+
}
+
},
+
"node_modules/semver": {
+
"version": "6.3.1",
+
"dev": true,
+
"license": "ISC",
+
"bin": {
+
"semver": "bin/semver.js"
+
}
+
},
+
"node_modules/shebang-command": {
+
"version": "2.0.0",
+
"license": "MIT",
+
"dependencies": {
+
"shebang-regex": "^3.0.0"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/shebang-regex": {
+
"version": "3.0.0",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/signal-exit": {
+
"version": "4.1.0",
+
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+
"license": "ISC",
+
"engines": {
+
"node": ">=14"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"node_modules/source-map": {
+
"version": "0.5.7",
+
"license": "BSD-3-Clause",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/source-map-js": {
+
"version": "1.2.1",
+
"license": "BSD-3-Clause",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/string-width": {
+
"version": "5.1.2",
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+
"license": "MIT",
+
"dependencies": {
+
"eastasianwidth": "^0.2.0",
+
"emoji-regex": "^9.2.2",
+
"strip-ansi": "^7.0.1"
+
},
+
"engines": {
+
"node": ">=12"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/string-width-cjs": {
+
"name": "string-width",
+
"version": "4.2.3",
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+
"license": "MIT",
+
"dependencies": {
+
"emoji-regex": "^8.0.0",
+
"is-fullwidth-code-point": "^3.0.0",
+
"strip-ansi": "^6.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/string-width-cjs/node_modules/ansi-regex": {
+
"version": "5.0.1",
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/string-width-cjs/node_modules/emoji-regex": {
+
"version": "8.0.0",
+
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+
"license": "MIT"
+
},
+
"node_modules/string-width-cjs/node_modules/strip-ansi": {
+
"version": "6.0.1",
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+
"license": "MIT",
+
"dependencies": {
+
"ansi-regex": "^5.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/strip-ansi": {
+
"version": "7.1.0",
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+
"license": "MIT",
+
"dependencies": {
+
"ansi-regex": "^6.0.1"
+
},
+
"engines": {
+
"node": ">=12"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
+
}
+
},
+
"node_modules/strip-ansi-cjs": {
+
"name": "strip-ansi",
+
"version": "6.0.1",
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+
"license": "MIT",
+
"dependencies": {
+
"ansi-regex": "^5.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+
"version": "5.0.1",
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/strip-json-comments": {
+
"version": "3.1.1",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/stylis": {
+
"version": "4.2.0",
+
"license": "MIT"
+
},
+
"node_modules/sucrase": {
+
"version": "3.35.0",
+
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+
"integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+
"license": "MIT",
+
"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"
+
},
+
"engines": {
+
"node": ">=16 || 14 >=14.17"
+
}
+
},
+
"node_modules/supports-color": {
+
"version": "7.2.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"has-flag": "^4.0.0"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/supports-preserve-symlinks-flag": {
+
"version": "1.0.0",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 0.4"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/ljharb"
+
}
+
},
+
"node_modules/tabbable": {
+
"version": "6.2.0",
+
"license": "MIT"
+
},
+
"node_modules/tailwind-merge": {
+
"version": "2.6.0",
+
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz",
+
"integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==",
+
"license": "MIT",
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/dcastil"
+
}
+
},
+
"node_modules/tailwindcss": {
+
"version": "3.4.17",
+
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
+
"integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
+
"license": "MIT",
+
"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"
+
},
+
"engines": {
+
"node": ">=14.0.0"
+
}
+
},
+
"node_modules/tailwindcss-animate": {
+
"version": "1.0.7",
+
"resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz",
+
"integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==",
+
"license": "MIT",
+
"peerDependencies": {
+
"tailwindcss": ">=3.0.0 || insiders"
+
}
+
},
+
"node_modules/tailwindcss/node_modules/jiti": {
+
"version": "1.21.7",
+
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+
"integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+
"license": "MIT",
+
"bin": {
+
"jiti": "bin/jiti.js"
+
}
+
},
+
"node_modules/tapable": {
+
"version": "2.2.1",
+
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/thenify": {
+
"version": "3.3.1",
+
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+
"integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+
"license": "MIT",
+
"dependencies": {
+
"any-promise": "^1.0.0"
+
}
+
},
+
"node_modules/thenify-all": {
+
"version": "1.6.0",
+
"resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+
"integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+
"license": "MIT",
+
"dependencies": {
+
"thenify": ">= 3.1.0 < 4"
+
},
+
"engines": {
+
"node": ">=0.8"
+
}
+
},
+
"node_modules/to-regex-range": {
+
"version": "5.0.1",
+
"license": "MIT",
+
"dependencies": {
+
"is-number": "^7.0.0"
+
},
+
"engines": {
+
"node": ">=8.0"
+
}
+
},
+
"node_modules/ts-api-utils": {
+
"version": "2.0.0",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=18.12"
+
},
+
"peerDependencies": {
+
"typescript": ">=4.8.4"
+
}
+
},
+
"node_modules/ts-interface-checker": {
+
"version": "0.1.13",
+
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+
"integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+
"license": "Apache-2.0"
+
},
+
"node_modules/tslib": {
+
"version": "2.8.1",
+
"license": "0BSD"
+
},
+
"node_modules/type-check": {
+
"version": "0.4.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"prelude-ls": "^1.2.1"
+
},
+
"engines": {
+
"node": ">= 0.8.0"
+
}
+
},
+
"node_modules/type-fest": {
+
"version": "4.33.0",
+
"license": "(MIT OR CC0-1.0)",
+
"engines": {
+
"node": ">=16"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/typescript": {
+
"version": "5.6.3",
+
"dev": true,
+
"license": "Apache-2.0",
+
"bin": {
+
"tsc": "bin/tsc",
+
"tsserver": "bin/tsserver"
+
},
+
"engines": {
+
"node": ">=14.17"
+
}
+
},
+
"node_modules/typescript-eslint": {
+
"version": "8.21.0",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/eslint-plugin": "8.21.0",
+
"@typescript-eslint/parser": "8.21.0",
+
"@typescript-eslint/utils": "8.21.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <5.8.0"
+
}
+
},
+
"node_modules/undici-types": {
+
"version": "6.20.0",
+
"devOptional": true,
+
"license": "MIT"
+
},
+
"node_modules/update-browserslist-db": {
+
"version": "1.1.2",
+
"dev": true,
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/browserslist"
+
},
+
{
+
"type": "tidelift",
+
"url": "https://tidelift.com/funding/github/npm/browserslist"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"escalade": "^3.2.0",
+
"picocolors": "^1.1.1"
+
},
+
"bin": {
+
"update-browserslist-db": "cli.js"
+
},
+
"peerDependencies": {
+
"browserslist": ">= 4.21.0"
+
}
+
},
+
"node_modules/uri-js": {
+
"version": "4.4.1",
+
"dev": true,
+
"license": "BSD-2-Clause",
+
"dependencies": {
+
"punycode": "^2.1.0"
+
}
+
},
+
"node_modules/use-callback-ref": {
+
"version": "1.3.3",
+
"license": "MIT",
+
"dependencies": {
+
"tslib": "^2.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/use-composed-ref": {
+
"version": "1.4.0",
+
"license": "MIT",
+
"peerDependencies": {
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/use-isomorphic-layout-effect": {
+
"version": "1.2.0",
+
"license": "MIT",
+
"peerDependencies": {
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/use-latest": {
+
"version": "1.3.0",
+
"license": "MIT",
+
"dependencies": {
+
"use-isomorphic-layout-effect": "^1.1.1"
+
},
+
"peerDependencies": {
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/use-sidecar": {
+
"version": "1.1.3",
+
"license": "MIT",
+
"dependencies": {
+
"detect-node-es": "^1.1.0",
+
"tslib": "^2.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/util-deprecate": {
+
"version": "1.0.2",
+
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+
"license": "MIT"
+
},
+
"node_modules/vite": {
+
"version": "6.0.11",
+
"license": "MIT",
+
"dependencies": {
+
"esbuild": "^0.24.2",
+
"postcss": "^8.4.49",
+
"rollup": "^4.23.0"
+
},
+
"bin": {
+
"vite": "bin/vite.js"
+
},
+
"engines": {
+
"node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+
},
+
"funding": {
+
"url": "https://github.com/vitejs/vite?sponsor=1"
+
},
+
"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"
+
},
+
"peerDependenciesMeta": {
+
"@types/node": {
+
"optional": true
+
},
+
"jiti": {
+
"optional": true
+
},
+
"less": {
+
"optional": true
+
},
+
"lightningcss": {
+
"optional": true
+
},
+
"sass": {
+
"optional": true
+
},
+
"sass-embedded": {
+
"optional": true
+
},
+
"stylus": {
+
"optional": true
+
},
+
"sugarss": {
+
"optional": true
+
},
+
"terser": {
+
"optional": true
+
},
+
"tsx": {
+
"optional": true
+
},
+
"yaml": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/which": {
+
"version": "2.0.2",
+
"license": "ISC",
+
"dependencies": {
+
"isexe": "^2.0.0"
+
},
+
"bin": {
+
"node-which": "bin/node-which"
+
},
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/word-wrap": {
+
"version": "1.2.5",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/wrap-ansi": {
+
"version": "8.1.0",
+
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+
"license": "MIT",
+
"dependencies": {
+
"ansi-styles": "^6.1.0",
+
"string-width": "^5.0.1",
+
"strip-ansi": "^7.0.1"
+
},
+
"engines": {
+
"node": ">=12"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+
}
+
},
+
"node_modules/wrap-ansi-cjs": {
+
"name": "wrap-ansi",
+
"version": "7.0.0",
+
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+
"license": "MIT",
+
"dependencies": {
+
"ansi-styles": "^4.0.0",
+
"string-width": "^4.1.0",
+
"strip-ansi": "^6.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+
}
+
},
+
"node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+
"version": "5.0.1",
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+
"version": "8.0.0",
+
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+
"license": "MIT"
+
},
+
"node_modules/wrap-ansi-cjs/node_modules/string-width": {
+
"version": "4.2.3",
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+
"license": "MIT",
+
"dependencies": {
+
"emoji-regex": "^8.0.0",
+
"is-fullwidth-code-point": "^3.0.0",
+
"strip-ansi": "^6.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+
"version": "6.0.1",
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+
"license": "MIT",
+
"dependencies": {
+
"ansi-regex": "^5.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/wrap-ansi/node_modules/ansi-styles": {
+
"version": "6.2.1",
+
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=12"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
+
}
+
},
+
"node_modules/yallist": {
+
"version": "3.1.1",
+
"dev": true,
+
"license": "ISC"
+
},
+
"node_modules/yaml": {
+
"version": "2.7.0",
+
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
+
"integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
+
"license": "ISC",
+
"bin": {
+
"yaml": "bin.mjs"
+
},
+
"engines": {
+
"node": ">= 14"
+
}
+
},
+
"node_modules/yocto-queue": {
+
"version": "0.1.0",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/zod": {
+
"version": "3.24.1",
+
"resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz",
+
"integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==",
+
"license": "MIT",
+
"funding": {
+
"url": "https://github.com/sponsors/colinhacks"
+
}
+
}
+
}
+
}
+18 -1
frontend/package.json
···
},
"dependencies": {
"@emotion/react": "^11.14.0",
+
"@hookform/resolvers": "^3.10.0",
"@mantine/core": "^7.16.1",
"@mantine/form": "^7.16.1",
"@mantine/hooks": "^7.16.1",
+
"@radix-ui/react-dialog": "^1.1.5",
+
"@radix-ui/react-label": "^2.1.1",
+
"@radix-ui/react-slot": "^1.1.1",
+
"@radix-ui/react-tabs": "^1.1.2",
+
"@radix-ui/react-toast": "^1.2.5",
+
"@tailwindcss/vite": "^4.0.0",
"axios": "^1.7.9",
+
"class-variance-authority": "^0.7.1",
+
"clsx": "^2.1.1",
+
"lucide-react": "^0.474.0",
"react": "^18.3.1",
-
"react-dom": "^18.3.1"
+
"react-dom": "^18.3.1",
+
"react-hook-form": "^7.54.2",
+
"tailwind-merge": "^2.6.0",
+
"tailwindcss-animate": "^1.0.7",
+
"zod": "^3.24.1"
},
"devDependencies": {
"@eslint/js": "^9.17.0",
···
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"@vitejs/plugin-react": "^4.3.4",
+
"autoprefixer": "^10.4.20",
"eslint": "^9.17.0",
"eslint-plugin-react-hooks": "^5.0.0",
"eslint-plugin-react-refresh": "^0.4.16",
"globals": "^15.14.0",
+
"postcss": "^8.5.1",
+
"tailwindcss": "3.4.17",
"typescript": "~5.6.2",
"typescript-eslint": "^8.18.2",
"vite": "^6.0.5"
+6
frontend/postcss.config.js
···
+
export default {
+
plugins: {
+
tailwindcss: {},
+
autoprefixer: {},
+
},
+
}
-42
frontend/src/App.css
···
-
#root {
-
max-width: 1280px;
-
margin: 0 auto;
-
padding: 2rem;
-
text-align: center;
-
}
-
-
.logo {
-
height: 6em;
-
padding: 1.5em;
-
will-change: filter;
-
transition: filter 300ms;
-
}
-
.logo:hover {
-
filter: drop-shadow(0 0 2em #646cffaa);
-
}
-
.logo.react:hover {
-
filter: drop-shadow(0 0 2em #61dafbaa);
-
}
-
-
@keyframes logo-spin {
-
from {
-
transform: rotate(0deg);
-
}
-
to {
-
transform: rotate(360deg);
-
}
-
}
-
-
@media (prefers-reduced-motion: no-preference) {
-
a:nth-of-type(2) .logo {
-
animation: logo-spin infinite 20s linear;
-
}
-
}
-
-
.card {
-
padding: 2em;
-
}
-
-
.read-the-docs {
-
color: #888;
-
}
+50 -20
frontend/src/App.tsx
···
-
import { MantineProvider, Container, Title, Stack } from '@mantine/core';
-
import { LinkForm } from './components/LinkForm';
-
import { LinkList } from './components/LinkList';
-
import { Link } from './types/api';
+
import { Container } from './components/ui/container'
+
import { Button } from './components/ui/button'
+
import { LinkForm } from './components/LinkForm'
+
import { LinkList } from './components/LinkList'
+
import { AuthForms } from './components/AuthForms'
+
import { AuthProvider, useAuth } from './context/AuthContext'
+
import { useState } from 'react'
+
import { Toaster } from './components/ui/toaster'
-
function App() {
-
const handleLinkCreated = (link: Link) => {
-
// You could update the list here or show a success message
-
window.location.reload();
-
};
+
function AppContent() {
+
const { user, logout } = useAuth()
+
const [refreshCounter, setRefreshCounter] = useState(0)
+
+
const handleLinkCreated = () => {
+
// Increment refresh counter to trigger list refresh
+
setRefreshCounter(prev => prev + 1)
+
}
return (
-
<MantineProvider withGlobalStyles withNormalizeCSS>
-
<Container size="lg" py="xl">
-
<Stack spacing="xl">
-
<Title order={1}>URL Shortener</Title>
-
<LinkForm onSuccess={handleLinkCreated} />
-
<LinkList />
-
</Stack>
-
</Container>
-
</MantineProvider>
-
);
+
<div className="container max-w-6xl py-8">
+
<div className="space-y-8">
+
<div className="flex items-center justify-between">
+
<h1 className="text-3xl font-bold">URL Shortener</h1>
+
{user && (
+
<div className="flex items-center gap-4">
+
<p className="text-sm text-muted-foreground">Welcome, {user.email}</p>
+
<Button variant="outline" onClick={logout}>
+
Logout
+
</Button>
+
</div>
+
)}
+
</div>
+
+
{user ? (
+
<>
+
<LinkForm onSuccess={handleLinkCreated} />
+
<LinkList refresh={refreshCounter} />
+
</>
+
) : (
+
<AuthForms />
+
)}
+
</div>
+
</div>
+
)
}
-
export default App;
+
function App() {
+
return (
+
<AuthProvider>
+
<AppContent />
+
<Toaster />
+
</AuthProvider>
+
)
+
}
+
export default App
+32 -1
frontend/src/api/client.ts
···
import axios from 'axios';
-
import { CreateLinkRequest, Link } from '../types/api';
+
import { CreateLinkRequest, Link, AuthResponse } from '../types/api';
+
// Create axios instance with default config
const api = axios.create({
baseURL: '/api',
});
+
// Add a request interceptor to add the auth token to all requests
+
api.interceptors.request.use((config) => {
+
const token = localStorage.getItem('token');
+
if (token) {
+
config.headers.Authorization = `Bearer ${token}`;
+
}
+
return config;
+
});
+
+
// Auth endpoints
+
export const login = async (email: string, password: string) => {
+
const response = await api.post<AuthResponse>('/auth/login', {
+
email,
+
password,
+
});
+
return response.data;
+
};
+
+
export const register = async (email: string, password: string) => {
+
const response = await api.post<AuthResponse>('/auth/register', {
+
email,
+
password,
+
});
+
return response.data;
+
};
+
+
// Protected endpoints
export const createShortLink = async (data: CreateLinkRequest) => {
const response = await api.post<Link>('/shorten', data);
return response.data;
···
return response.data;
};
+
export const deleteLink = async (id: number) => {
+
await api.delete(`/links/${id}`);
+
};
+105
frontend/src/components/AuthForms.tsx
···
+
import { useState } from 'react'
+
import { useForm } from 'react-hook-form'
+
import { z } from 'zod'
+
import { zodResolver } from '@hookform/resolvers/zod'
+
import { useAuth } from '../context/AuthContext'
+
import { Button } from '@/components/ui/button'
+
import { Input } from '@/components/ui/input'
+
import { Card } from '@/components/ui/card'
+
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
+
import {
+
Form,
+
FormControl,
+
FormField,
+
FormItem,
+
FormLabel,
+
FormMessage,
+
} from '@/components/ui/form'
+
import { useToast } from '@/hooks/use-toast'
+
+
const formSchema = z.object({
+
email: z.string().email('Invalid email address'),
+
password: z.string().min(6, 'Password must be at least 6 characters long'),
+
})
+
+
type FormValues = z.infer<typeof formSchema>
+
+
export function AuthForms() {
+
const [activeTab, setActiveTab] = useState<'login' | 'register'>('login')
+
const { login, register } = useAuth()
+
const { toast } = useToast()
+
+
const form = useForm<FormValues>({
+
resolver: zodResolver(formSchema),
+
defaultValues: {
+
email: '',
+
password: '',
+
},
+
})
+
+
const onSubmit = async (values: FormValues) => {
+
try {
+
if (activeTab === 'login') {
+
await login(values.email, values.password)
+
} else {
+
await register(values.email, values.password)
+
}
+
form.reset()
+
} catch (err: any) {
+
toast({
+
variant: 'destructive',
+
title: 'Error',
+
description: err.response?.data?.error || 'An error occurred',
+
})
+
}
+
}
+
+
return (
+
<Card className="w-full max-w-md mx-auto p-6">
+
<Tabs value={activeTab} onValueChange={(value: 'login' | 'register') => setActiveTab(value)}>
+
<TabsList className="grid w-full grid-cols-2">
+
<TabsTrigger value="login">Login</TabsTrigger>
+
<TabsTrigger value="register">Register</TabsTrigger>
+
</TabsList>
+
+
<TabsContent value={activeTab}>
+
<Form {...form}>
+
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
+
<FormField
+
control={form.control}
+
name="email"
+
render={({ field }) => (
+
<FormItem>
+
<FormLabel>Email</FormLabel>
+
<FormControl>
+
<Input type="email" {...field} />
+
</FormControl>
+
<FormMessage />
+
</FormItem>
+
)}
+
/>
+
+
<FormField
+
control={form.control}
+
name="password"
+
render={({ field }) => (
+
<FormItem>
+
<FormLabel>Password</FormLabel>
+
<FormControl>
+
<Input type="password" {...field} />
+
</FormControl>
+
<FormMessage />
+
</FormItem>
+
)}
+
/>
+
+
<Button type="submit" className="w-full">
+
{activeTab === 'login' ? 'Sign in' : 'Create account'}
+
</Button>
+
</form>
+
</Form>
+
</TabsContent>
+
</Tabs>
+
</Card>
+
)
+
}
+90 -64
frontend/src/components/LinkForm.tsx
···
-
import { useState } from 'react';
-
import { TextInput, Button, Group, Box, Text } from '@mantine/core';
-
import { useForm } from '@mantine/form';
-
import { CreateLinkRequest, Link } from '../types/api';
-
import { createShortLink } from '../api/client';
+
import { useState } from 'react'
+
import { useForm } from 'react-hook-form'
+
import { zodResolver } from '@hookform/resolvers/zod'
+
import * as z from 'zod'
+
import { CreateLinkRequest, Link } from '../types/api'
+
import { createShortLink } from '../api/client'
+
import { Button } from "@/components/ui/button"
+
import {
+
Form,
+
FormControl,
+
FormField,
+
FormItem,
+
FormLabel,
+
FormMessage,
+
} from "@/components/ui/form"
+
import { Input } from "@/components/ui/input"
+
import { useToast } from "@/hooks/use-toast"
+
+
const formSchema = z.object({
+
url: z.string()
+
.min(1, 'URL is required')
+
.url('Must be a valid URL')
+
.refine(val => val.startsWith('http://') || val.startsWith('https://'), {
+
message: 'URL must start with http:// or https://'
+
}),
+
custom_code: z.string()
+
.regex(/^[a-zA-Z0-9_-]{0,32}$/, 'Custom code must contain only letters, numbers, underscores, and hyphens')
+
.optional()
+
})
interface LinkFormProps {
-
onSuccess: (link: Link) => void;
+
onSuccess: (link: Link) => void
}
export function LinkForm({ onSuccess }: LinkFormProps) {
-
const [error, setError] = useState<string | null>(null);
-
const [loading, setLoading] = useState(false);
+
const [loading, setLoading] = useState(false)
+
const { toast } = useToast()
-
const form = useForm<CreateLinkRequest>({
-
initialValues: {
+
const form = useForm<z.infer<typeof formSchema>>({
+
resolver: zodResolver(formSchema),
+
defaultValues: {
url: '',
custom_code: '',
},
-
validate: {
-
url: (value) => {
-
if (!value) return 'URL is required';
-
if (!value.startsWith('http://') && !value.startsWith('https://')) {
-
return 'URL must start with http:// or https://';
-
}
-
return null;
-
},
-
custom_code: (value) => {
-
if (value && !/^[a-zA-Z0-9_-]{1,32}$/.test(value)) {
-
return 'Custom code must be 1-32 characters and contain only letters, numbers, underscores, and hyphens';
-
}
-
return null;
-
},
-
},
-
});
+
})
-
const handleSubmit = async (values: CreateLinkRequest) => {
+
const onSubmit = async (values: z.infer<typeof formSchema>) => {
try {
-
setLoading(true);
-
setError(null);
-
const link = await createShortLink(values);
-
form.reset();
-
onSuccess(link);
-
} catch (err) {
-
setError(err.response?.data?.error || 'An error occurred');
+
setLoading(true)
+
const link = await createShortLink(values as CreateLinkRequest)
+
form.reset()
+
onSuccess(link)
+
toast({
+
description: "Short link created successfully",
+
})
+
} catch (err: any) {
+
toast({
+
variant: "destructive",
+
title: "Error",
+
description: err.response?.data?.error || 'An error occurred',
+
})
} finally {
-
setLoading(false);
+
setLoading(false)
}
-
};
+
}
return (
-
<Box mx="auto" sx={{ maxWidth: 500 }}>
-
<form onSubmit={form.onSubmit(handleSubmit)}>
-
<TextInput
-
required
-
label="URL"
-
placeholder="https://example.com"
-
{...form.getInputProps('url')}
-
/>
+
<div className="max-w-[500px] mx-auto">
+
<Form {...form}>
+
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6">
+
<FormField
+
control={form.control}
+
name="url"
+
render={({ field }) => (
+
<FormItem>
+
<FormLabel>URL</FormLabel>
+
<FormControl>
+
<Input placeholder="https://example.com" {...field} />
+
</FormControl>
+
<FormMessage />
+
</FormItem>
+
)}
+
/>
-
<TextInput
-
label="Custom Code (optional)"
-
placeholder="example"
-
mt="md"
-
{...form.getInputProps('custom_code')}
-
/>
-
-
{error && (
-
<Text color="red" size="sm" mt="sm">
-
{error}
-
</Text>
-
)}
+
<FormField
+
control={form.control}
+
name="custom_code"
+
render={({ field }) => (
+
<FormItem>
+
<FormLabel>Custom Code (optional)</FormLabel>
+
<FormControl>
+
<Input placeholder="example" {...field} />
+
</FormControl>
+
<FormMessage />
+
</FormItem>
+
)}
+
/>
-
<Group position="right" mt="md">
-
<Button type="submit" loading={loading}>
-
Create Short Link
-
</Button>
-
</Group>
-
</form>
-
</Box>
-
);
+
<div className="flex justify-end">
+
<Button type="submit" disabled={loading}>
+
{loading ? "Creating..." : "Create Short Link"}
+
</Button>
+
</div>
+
</form>
+
</Form>
+
</div>
+
)
}
+129 -53
frontend/src/components/LinkList.tsx
···
-
import { useEffect, useState } from 'react';
-
import { Table, Text, Box, CopyButton, Button } from '@mantine/core';
-
import { Link } from '../types/api';
-
import { getAllLinks } from '../api/client';
+
import { useEffect, useState } from 'react'
+
import { Link } from '../types/api'
+
import { getAllLinks, deleteLink } from '../api/client'
+
import {
+
Table,
+
TableBody,
+
TableCell,
+
TableHead,
+
TableHeader,
+
TableRow,
+
} from "@/components/ui/table"
+
import {
+
Dialog,
+
DialogContent,
+
DialogHeader,
+
DialogTitle,
+
DialogDescription,
+
DialogFooter,
+
} from "@/components/ui/dialog"
+
import { Button } from "@/components/ui/button"
+
import { useToast } from "@/hooks/use-toast"
-
export function LinkList() {
-
const [links, setLinks] = useState<Link[]>([]);
-
const [loading, setLoading] = useState(true);
-
const [error, setError] = useState<string | null>(null);
+
interface LinkListProps {
+
refresh: number
+
}
+
+
export function LinkList({ refresh }: LinkListProps) {
+
const [links, setLinks] = useState<Link[]>([])
+
const [loading, setLoading] = useState(true)
+
const [deleteModal, setDeleteModal] = useState<{ isOpen: boolean; linkId: number | null }>({
+
isOpen: false,
+
linkId: null,
+
})
+
const { toast } = useToast()
const fetchLinks = async () => {
try {
-
setLoading(true);
-
const data = await getAllLinks();
-
setLinks(data);
+
setLoading(true)
+
const data = await getAllLinks()
+
setLinks(data)
} catch (err) {
-
setError('Failed to load links');
+
toast({
+
title: "Error",
+
description: "Failed to load links",
+
variant: "destructive",
+
})
} finally {
-
setLoading(false);
+
setLoading(false)
}
-
};
+
}
useEffect(() => {
-
fetchLinks();
-
}, []);
+
fetchLinks()
+
}, [refresh])
+
+
const handleDelete = async () => {
+
if (!deleteModal.linkId) return
+
+
try {
+
await deleteLink(deleteModal.linkId)
+
await fetchLinks()
+
setDeleteModal({ isOpen: false, linkId: null })
+
toast({
+
title: "Link deleted",
+
description: "The link has been successfully deleted.",
+
})
+
} catch (err) {
+
toast({
+
title: "Error",
+
description: "Failed to delete link",
+
variant: "destructive",
+
})
+
}
+
}
-
if (loading) return <Text>Loading...</Text>;
-
if (error) return <Text color="red">{error}</Text>;
+
if (loading && !links.length) {
+
return <div className="text-center py-4">Loading...</div>
+
}
return (
-
<Box>
+
<div className="space-y-4">
+
<Dialog open={deleteModal.isOpen} onOpenChange={(open) => setDeleteModal({ isOpen: open, linkId: null })}>
+
<DialogContent>
+
<DialogHeader>
+
<DialogTitle>Delete Link</DialogTitle>
+
<DialogDescription>
+
Are you sure you want to delete this link? This action cannot be undone.
+
</DialogDescription>
+
</DialogHeader>
+
<DialogFooter>
+
<Button variant="outline" onClick={() => setDeleteModal({ isOpen: false, linkId: null })}>
+
Cancel
+
</Button>
+
<Button variant="destructive" onClick={handleDelete}>
+
Delete
+
</Button>
+
</DialogFooter>
+
</DialogContent>
+
</Dialog>
+
<Table>
-
<thead>
-
<tr>
-
<th>Short Code</th>
-
<th>Original URL</th>
-
<th>Clicks</th>
-
<th>Created</th>
-
<th>Actions</th>
-
</tr>
-
</thead>
-
<tbody>
+
<TableHeader>
+
<TableRow>
+
<TableHead>Short Code</TableHead>
+
<TableHead>Original URL</TableHead>
+
<TableHead>Clicks</TableHead>
+
<TableHead>Created</TableHead>
+
<TableHead>Actions</TableHead>
+
</TableRow>
+
</TableHeader>
+
<TableBody>
{links.map((link) => (
-
<tr key={link.id}>
-
<td>{link.short_code}</td>
-
<td>{link.original_url}</td>
-
<td>{link.clicks}</td>
-
<td>{new Date(link.created_at).toLocaleDateString()}</td>
-
<td>
-
<CopyButton value={`${window.location.origin}/${link.short_code}`}>
-
{({ copied, copy }) => (
-
<Button
-
color={copied ? 'teal' : 'blue'}
-
onClick={copy}
-
size="xs"
-
>
-
{copied ? 'Copied' : 'Copy'}
-
</Button>
-
)}
-
</CopyButton>
-
</td>
-
</tr>
+
<TableRow key={link.id}>
+
<TableCell>{link.short_code}</TableCell>
+
<TableCell className="max-w-[300px] truncate">{link.original_url}</TableCell>
+
<TableCell>{link.clicks}</TableCell>
+
<TableCell>{new Date(link.created_at).toLocaleDateString()}</TableCell>
+
<TableCell>
+
<div className="flex gap-2">
+
<Button
+
variant="secondary"
+
size="sm"
+
onClick={() => {
+
navigator.clipboard.writeText(`http://localhost:8080/${link.short_code}`)
+
toast({ description: "Link copied to clipboard" })
+
}}
+
>
+
Copy
+
</Button>
+
<Button
+
variant="destructive"
+
size="sm"
+
onClick={() => setDeleteModal({ isOpen: true, linkId: link.id })}
+
>
+
Delete
+
</Button>
+
</div>
+
</TableCell>
+
</TableRow>
))}
-
</tbody>
+
</TableBody>
</Table>
-
</Box>
-
);
-
}
-
+
</div>
+
)
+
}
+57
frontend/src/components/ui/button.tsx
···
+
import * as React from "react"
+
import { Slot } from "@radix-ui/react-slot"
+
import { cva, type VariantProps } from "class-variance-authority"
+
+
import { cn } from "@/lib/utils"
+
+
const buttonVariants = cva(
+
"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",
+
{
+
variants: {
+
variant: {
+
default:
+
"bg-primary text-primary-foreground shadow hover:bg-primary/90",
+
destructive:
+
"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
+
outline:
+
"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
+
secondary:
+
"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
+
ghost: "hover:bg-accent hover:text-accent-foreground",
+
link: "text-primary underline-offset-4 hover:underline",
+
},
+
size: {
+
default: "h-9 px-4 py-2",
+
sm: "h-8 rounded-md px-3 text-xs",
+
lg: "h-10 rounded-md px-8",
+
icon: "h-9 w-9",
+
},
+
},
+
defaultVariants: {
+
variant: "default",
+
size: "default",
+
},
+
}
+
)
+
+
export interface ButtonProps
+
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
+
VariantProps<typeof buttonVariants> {
+
asChild?: boolean
+
}
+
+
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
+
({ className, variant, size, asChild = false, ...props }, ref) => {
+
const Comp = asChild ? Slot : "button"
+
return (
+
<Comp
+
className={cn(buttonVariants({ variant, size, className }))}
+
ref={ref}
+
{...props}
+
/>
+
)
+
}
+
)
+
Button.displayName = "Button"
+
+
export { Button, buttonVariants }
+76
frontend/src/components/ui/card.tsx
···
+
import * as React from "react"
+
+
import { cn } from "@/lib/utils"
+
+
const Card = React.forwardRef<
+
HTMLDivElement,
+
React.HTMLAttributes<HTMLDivElement>
+
>(({ className, ...props }, ref) => (
+
<div
+
ref={ref}
+
className={cn(
+
"rounded-xl border bg-card text-card-foreground shadow",
+
className
+
)}
+
{...props}
+
/>
+
))
+
Card.displayName = "Card"
+
+
const CardHeader = React.forwardRef<
+
HTMLDivElement,
+
React.HTMLAttributes<HTMLDivElement>
+
>(({ className, ...props }, ref) => (
+
<div
+
ref={ref}
+
className={cn("flex flex-col space-y-1.5 p-6", className)}
+
{...props}
+
/>
+
))
+
CardHeader.displayName = "CardHeader"
+
+
const CardTitle = React.forwardRef<
+
HTMLDivElement,
+
React.HTMLAttributes<HTMLDivElement>
+
>(({ className, ...props }, ref) => (
+
<div
+
ref={ref}
+
className={cn("font-semibold leading-none tracking-tight", className)}
+
{...props}
+
/>
+
))
+
CardTitle.displayName = "CardTitle"
+
+
const CardDescription = React.forwardRef<
+
HTMLDivElement,
+
React.HTMLAttributes<HTMLDivElement>
+
>(({ className, ...props }, ref) => (
+
<div
+
ref={ref}
+
className={cn("text-sm text-muted-foreground", className)}
+
{...props}
+
/>
+
))
+
CardDescription.displayName = "CardDescription"
+
+
const CardContent = React.forwardRef<
+
HTMLDivElement,
+
React.HTMLAttributes<HTMLDivElement>
+
>(({ className, ...props }, ref) => (
+
<div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
+
))
+
CardContent.displayName = "CardContent"
+
+
const CardFooter = React.forwardRef<
+
HTMLDivElement,
+
React.HTMLAttributes<HTMLDivElement>
+
>(({ className, ...props }, ref) => (
+
<div
+
ref={ref}
+
className={cn("flex items-center p-6 pt-0", className)}
+
{...props}
+
/>
+
))
+
CardFooter.displayName = "CardFooter"
+
+
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
+13
frontend/src/components/ui/container.tsx
···
+
import { cn } from "@/lib/utils"
+
+
export function Container({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
+
return (
+
<div
+
className={cn(
+
"mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8",
+
className
+
)}
+
{...props}
+
/>
+
)
+
}
+120
frontend/src/components/ui/dialog.tsx
···
+
import * as React from "react"
+
import * as DialogPrimitive from "@radix-ui/react-dialog"
+
import { X } from "lucide-react"
+
+
import { cn } from "@/lib/utils"
+
+
const Dialog = DialogPrimitive.Root
+
+
const DialogTrigger = DialogPrimitive.Trigger
+
+
const DialogPortal = DialogPrimitive.Portal
+
+
const DialogClose = DialogPrimitive.Close
+
+
const DialogOverlay = React.forwardRef<
+
React.ElementRef<typeof DialogPrimitive.Overlay>,
+
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
+
>(({ className, ...props }, ref) => (
+
<DialogPrimitive.Overlay
+
ref={ref}
+
className={cn(
+
"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",
+
className
+
)}
+
{...props}
+
/>
+
))
+
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
+
+
const DialogContent = React.forwardRef<
+
React.ElementRef<typeof DialogPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>
+
>(({ className, children, ...props }, ref) => (
+
<DialogPortal>
+
<DialogOverlay />
+
<DialogPrimitive.Content
+
ref={ref}
+
className={cn(
+
"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",
+
className
+
)}
+
{...props}
+
>
+
{children}
+
<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">
+
<X className="h-4 w-4" />
+
<span className="sr-only">Close</span>
+
</DialogPrimitive.Close>
+
</DialogPrimitive.Content>
+
</DialogPortal>
+
))
+
DialogContent.displayName = DialogPrimitive.Content.displayName
+
+
const DialogHeader = ({
+
className,
+
...props
+
}: React.HTMLAttributes<HTMLDivElement>) => (
+
<div
+
className={cn(
+
"flex flex-col space-y-1.5 text-center sm:text-left",
+
className
+
)}
+
{...props}
+
/>
+
)
+
DialogHeader.displayName = "DialogHeader"
+
+
const DialogFooter = ({
+
className,
+
...props
+
}: React.HTMLAttributes<HTMLDivElement>) => (
+
<div
+
className={cn(
+
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
+
className
+
)}
+
{...props}
+
/>
+
)
+
DialogFooter.displayName = "DialogFooter"
+
+
const DialogTitle = React.forwardRef<
+
React.ElementRef<typeof DialogPrimitive.Title>,
+
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
+
>(({ className, ...props }, ref) => (
+
<DialogPrimitive.Title
+
ref={ref}
+
className={cn(
+
"text-lg font-semibold leading-none tracking-tight",
+
className
+
)}
+
{...props}
+
/>
+
))
+
DialogTitle.displayName = DialogPrimitive.Title.displayName
+
+
const DialogDescription = React.forwardRef<
+
React.ElementRef<typeof DialogPrimitive.Description>,
+
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
+
>(({ className, ...props }, ref) => (
+
<DialogPrimitive.Description
+
ref={ref}
+
className={cn("text-sm text-muted-foreground", className)}
+
{...props}
+
/>
+
))
+
DialogDescription.displayName = DialogPrimitive.Description.displayName
+
+
export {
+
Dialog,
+
DialogPortal,
+
DialogOverlay,
+
DialogTrigger,
+
DialogClose,
+
DialogContent,
+
DialogHeader,
+
DialogFooter,
+
DialogTitle,
+
DialogDescription,
+
}
+178
frontend/src/components/ui/form.tsx
···
+
"use client"
+
+
import * as React from "react"
+
import * as LabelPrimitive from "@radix-ui/react-label"
+
import { Slot } from "@radix-ui/react-slot"
+
import {
+
Controller,
+
ControllerProps,
+
FieldPath,
+
FieldValues,
+
FormProvider,
+
useFormContext,
+
} from "react-hook-form"
+
+
import { cn } from "@/lib/utils"
+
import { Label } from "@/components/ui/label"
+
+
const Form = FormProvider
+
+
type FormFieldContextValue<
+
TFieldValues extends FieldValues = FieldValues,
+
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
+
> = {
+
name: TName
+
}
+
+
const FormFieldContext = React.createContext<FormFieldContextValue>(
+
{} as FormFieldContextValue
+
)
+
+
const FormField = <
+
TFieldValues extends FieldValues = FieldValues,
+
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
+
>({
+
...props
+
}: ControllerProps<TFieldValues, TName>) => {
+
return (
+
<FormFieldContext.Provider value={{ name: props.name }}>
+
<Controller {...props} />
+
</FormFieldContext.Provider>
+
)
+
}
+
+
const useFormField = () => {
+
const fieldContext = React.useContext(FormFieldContext)
+
const itemContext = React.useContext(FormItemContext)
+
const { getFieldState, formState } = useFormContext()
+
+
const fieldState = getFieldState(fieldContext.name, formState)
+
+
if (!fieldContext) {
+
throw new Error("useFormField should be used within <FormField>")
+
}
+
+
const { id } = itemContext
+
+
return {
+
id,
+
name: fieldContext.name,
+
formItemId: `${id}-form-item`,
+
formDescriptionId: `${id}-form-item-description`,
+
formMessageId: `${id}-form-item-message`,
+
...fieldState,
+
}
+
}
+
+
type FormItemContextValue = {
+
id: string
+
}
+
+
const FormItemContext = React.createContext<FormItemContextValue>(
+
{} as FormItemContextValue
+
)
+
+
const FormItem = React.forwardRef<
+
HTMLDivElement,
+
React.HTMLAttributes<HTMLDivElement>
+
>(({ className, ...props }, ref) => {
+
const id = React.useId()
+
+
return (
+
<FormItemContext.Provider value={{ id }}>
+
<div ref={ref} className={cn("space-y-2", className)} {...props} />
+
</FormItemContext.Provider>
+
)
+
})
+
FormItem.displayName = "FormItem"
+
+
const FormLabel = React.forwardRef<
+
React.ElementRef<typeof LabelPrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>
+
>(({ className, ...props }, ref) => {
+
const { error, formItemId } = useFormField()
+
+
return (
+
<Label
+
ref={ref}
+
className={cn(error && "text-destructive", className)}
+
htmlFor={formItemId}
+
{...props}
+
/>
+
)
+
})
+
FormLabel.displayName = "FormLabel"
+
+
const FormControl = React.forwardRef<
+
React.ElementRef<typeof Slot>,
+
React.ComponentPropsWithoutRef<typeof Slot>
+
>(({ ...props }, ref) => {
+
const { error, formItemId, formDescriptionId, formMessageId } = useFormField()
+
+
return (
+
<Slot
+
ref={ref}
+
id={formItemId}
+
aria-describedby={
+
!error
+
? `${formDescriptionId}`
+
: `${formDescriptionId} ${formMessageId}`
+
}
+
aria-invalid={!!error}
+
{...props}
+
/>
+
)
+
})
+
FormControl.displayName = "FormControl"
+
+
const FormDescription = React.forwardRef<
+
HTMLParagraphElement,
+
React.HTMLAttributes<HTMLParagraphElement>
+
>(({ className, ...props }, ref) => {
+
const { formDescriptionId } = useFormField()
+
+
return (
+
<p
+
ref={ref}
+
id={formDescriptionId}
+
className={cn("text-[0.8rem] text-muted-foreground", className)}
+
{...props}
+
/>
+
)
+
})
+
FormDescription.displayName = "FormDescription"
+
+
const FormMessage = React.forwardRef<
+
HTMLParagraphElement,
+
React.HTMLAttributes<HTMLParagraphElement>
+
>(({ className, children, ...props }, ref) => {
+
const { error, formMessageId } = useFormField()
+
const body = error ? String(error?.message) : children
+
+
if (!body) {
+
return null
+
}
+
+
return (
+
<p
+
ref={ref}
+
id={formMessageId}
+
className={cn("text-[0.8rem] font-medium text-destructive", className)}
+
{...props}
+
>
+
{body}
+
</p>
+
)
+
})
+
FormMessage.displayName = "FormMessage"
+
+
export {
+
useFormField,
+
Form,
+
FormItem,
+
FormLabel,
+
FormControl,
+
FormDescription,
+
FormMessage,
+
FormField,
+
}
+22
frontend/src/components/ui/input.tsx
···
+
import * as React from "react"
+
+
import { cn } from "@/lib/utils"
+
+
const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>(
+
({ className, type, ...props }, ref) => {
+
return (
+
<input
+
type={type}
+
className={cn(
+
"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",
+
className
+
)}
+
ref={ref}
+
{...props}
+
/>
+
)
+
}
+
)
+
Input.displayName = "Input"
+
+
export { Input }
+24
frontend/src/components/ui/label.tsx
···
+
import * as React from "react"
+
import * as LabelPrimitive from "@radix-ui/react-label"
+
import { cva, type VariantProps } from "class-variance-authority"
+
+
import { cn } from "@/lib/utils"
+
+
const labelVariants = cva(
+
"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
+
)
+
+
const Label = React.forwardRef<
+
React.ElementRef<typeof LabelPrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &
+
VariantProps<typeof labelVariants>
+
>(({ className, ...props }, ref) => (
+
<LabelPrimitive.Root
+
ref={ref}
+
className={cn(labelVariants(), className)}
+
{...props}
+
/>
+
))
+
Label.displayName = LabelPrimitive.Root.displayName
+
+
export { Label }
+120
frontend/src/components/ui/table.tsx
···
+
import * as React from "react"
+
+
import { cn } from "@/lib/utils"
+
+
const Table = React.forwardRef<
+
HTMLTableElement,
+
React.HTMLAttributes<HTMLTableElement>
+
>(({ className, ...props }, ref) => (
+
<div className="relative w-full overflow-auto">
+
<table
+
ref={ref}
+
className={cn("w-full caption-bottom text-sm", className)}
+
{...props}
+
/>
+
</div>
+
))
+
Table.displayName = "Table"
+
+
const TableHeader = React.forwardRef<
+
HTMLTableSectionElement,
+
React.HTMLAttributes<HTMLTableSectionElement>
+
>(({ className, ...props }, ref) => (
+
<thead ref={ref} className={cn("[&_tr]:border-b", className)} {...props} />
+
))
+
TableHeader.displayName = "TableHeader"
+
+
const TableBody = React.forwardRef<
+
HTMLTableSectionElement,
+
React.HTMLAttributes<HTMLTableSectionElement>
+
>(({ className, ...props }, ref) => (
+
<tbody
+
ref={ref}
+
className={cn("[&_tr:last-child]:border-0", className)}
+
{...props}
+
/>
+
))
+
TableBody.displayName = "TableBody"
+
+
const TableFooter = React.forwardRef<
+
HTMLTableSectionElement,
+
React.HTMLAttributes<HTMLTableSectionElement>
+
>(({ className, ...props }, ref) => (
+
<tfoot
+
ref={ref}
+
className={cn(
+
"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",
+
className
+
)}
+
{...props}
+
/>
+
))
+
TableFooter.displayName = "TableFooter"
+
+
const TableRow = React.forwardRef<
+
HTMLTableRowElement,
+
React.HTMLAttributes<HTMLTableRowElement>
+
>(({ className, ...props }, ref) => (
+
<tr
+
ref={ref}
+
className={cn(
+
"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",
+
className
+
)}
+
{...props}
+
/>
+
))
+
TableRow.displayName = "TableRow"
+
+
const TableHead = React.forwardRef<
+
HTMLTableCellElement,
+
React.ThHTMLAttributes<HTMLTableCellElement>
+
>(({ className, ...props }, ref) => (
+
<th
+
ref={ref}
+
className={cn(
+
"h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
+
className
+
)}
+
{...props}
+
/>
+
))
+
TableHead.displayName = "TableHead"
+
+
const TableCell = React.forwardRef<
+
HTMLTableCellElement,
+
React.TdHTMLAttributes<HTMLTableCellElement>
+
>(({ className, ...props }, ref) => (
+
<td
+
ref={ref}
+
className={cn(
+
"p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
+
className
+
)}
+
{...props}
+
/>
+
))
+
TableCell.displayName = "TableCell"
+
+
const TableCaption = React.forwardRef<
+
HTMLTableCaptionElement,
+
React.HTMLAttributes<HTMLTableCaptionElement>
+
>(({ className, ...props }, ref) => (
+
<caption
+
ref={ref}
+
className={cn("mt-4 text-sm text-muted-foreground", className)}
+
{...props}
+
/>
+
))
+
TableCaption.displayName = "TableCaption"
+
+
export {
+
Table,
+
TableHeader,
+
TableBody,
+
TableFooter,
+
TableHead,
+
TableRow,
+
TableCell,
+
TableCaption,
+
}
+53
frontend/src/components/ui/tabs.tsx
···
+
import * as React from "react"
+
import * as TabsPrimitive from "@radix-ui/react-tabs"
+
+
import { cn } from "@/lib/utils"
+
+
const Tabs = TabsPrimitive.Root
+
+
const TabsList = React.forwardRef<
+
React.ElementRef<typeof TabsPrimitive.List>,
+
React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>
+
>(({ className, ...props }, ref) => (
+
<TabsPrimitive.List
+
ref={ref}
+
className={cn(
+
"inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground",
+
className
+
)}
+
{...props}
+
/>
+
))
+
TabsList.displayName = TabsPrimitive.List.displayName
+
+
const TabsTrigger = React.forwardRef<
+
React.ElementRef<typeof TabsPrimitive.Trigger>,
+
React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>
+
>(({ className, ...props }, ref) => (
+
<TabsPrimitive.Trigger
+
ref={ref}
+
className={cn(
+
"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",
+
className
+
)}
+
{...props}
+
/>
+
))
+
TabsTrigger.displayName = TabsPrimitive.Trigger.displayName
+
+
const TabsContent = React.forwardRef<
+
React.ElementRef<typeof TabsPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>
+
>(({ className, ...props }, ref) => (
+
<TabsPrimitive.Content
+
ref={ref}
+
className={cn(
+
"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
+
className
+
)}
+
{...props}
+
/>
+
))
+
TabsContent.displayName = TabsPrimitive.Content.displayName
+
+
export { Tabs, TabsList, TabsTrigger, TabsContent }
+129
frontend/src/components/ui/toast.tsx
···
+
"use client"
+
+
import * as React from "react"
+
import * as ToastPrimitives from "@radix-ui/react-toast"
+
import { cva, type VariantProps } from "class-variance-authority"
+
import { X } from "lucide-react"
+
+
import { cn } from "@/lib/utils"
+
+
const ToastProvider = ToastPrimitives.Provider
+
+
const ToastViewport = React.forwardRef<
+
React.ElementRef<typeof ToastPrimitives.Viewport>,
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>
+
>(({ className, ...props }, ref) => (
+
<ToastPrimitives.Viewport
+
ref={ref}
+
className={cn(
+
"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]",
+
className
+
)}
+
{...props}
+
/>
+
))
+
ToastViewport.displayName = ToastPrimitives.Viewport.displayName
+
+
const toastVariants = cva(
+
"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",
+
{
+
variants: {
+
variant: {
+
default: "border bg-background text-foreground",
+
destructive:
+
"destructive group border-destructive bg-destructive text-destructive-foreground",
+
},
+
},
+
defaultVariants: {
+
variant: "default",
+
},
+
}
+
)
+
+
const Toast = React.forwardRef<
+
React.ElementRef<typeof ToastPrimitives.Root>,
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &
+
VariantProps<typeof toastVariants>
+
>(({ className, variant, ...props }, ref) => {
+
return (
+
<ToastPrimitives.Root
+
ref={ref}
+
className={cn(toastVariants({ variant }), className)}
+
{...props}
+
/>
+
)
+
})
+
Toast.displayName = ToastPrimitives.Root.displayName
+
+
const ToastAction = React.forwardRef<
+
React.ElementRef<typeof ToastPrimitives.Action>,
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>
+
>(({ className, ...props }, ref) => (
+
<ToastPrimitives.Action
+
ref={ref}
+
className={cn(
+
"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",
+
className
+
)}
+
{...props}
+
/>
+
))
+
ToastAction.displayName = ToastPrimitives.Action.displayName
+
+
const ToastClose = React.forwardRef<
+
React.ElementRef<typeof ToastPrimitives.Close>,
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>
+
>(({ className, ...props }, ref) => (
+
<ToastPrimitives.Close
+
ref={ref}
+
className={cn(
+
"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",
+
className
+
)}
+
toast-close=""
+
{...props}
+
>
+
<X className="h-4 w-4" />
+
</ToastPrimitives.Close>
+
))
+
ToastClose.displayName = ToastPrimitives.Close.displayName
+
+
const ToastTitle = React.forwardRef<
+
React.ElementRef<typeof ToastPrimitives.Title>,
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>
+
>(({ className, ...props }, ref) => (
+
<ToastPrimitives.Title
+
ref={ref}
+
className={cn("text-sm font-semibold [&+div]:text-xs", className)}
+
{...props}
+
/>
+
))
+
ToastTitle.displayName = ToastPrimitives.Title.displayName
+
+
const ToastDescription = React.forwardRef<
+
React.ElementRef<typeof ToastPrimitives.Description>,
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>
+
>(({ className, ...props }, ref) => (
+
<ToastPrimitives.Description
+
ref={ref}
+
className={cn("text-sm opacity-90", className)}
+
{...props}
+
/>
+
))
+
ToastDescription.displayName = ToastPrimitives.Description.displayName
+
+
type ToastProps = React.ComponentPropsWithoutRef<typeof Toast>
+
+
type ToastActionElement = React.ReactElement<typeof ToastAction>
+
+
export {
+
type ToastProps,
+
type ToastActionElement,
+
ToastProvider,
+
ToastViewport,
+
Toast,
+
ToastTitle,
+
ToastDescription,
+
ToastClose,
+
ToastAction,
+
}
+35
frontend/src/components/ui/toaster.tsx
···
+
"use client"
+
+
import { useToast } from "@/hooks/use-toast"
+
import {
+
Toast,
+
ToastClose,
+
ToastDescription,
+
ToastProvider,
+
ToastTitle,
+
ToastViewport,
+
} from "@/components/ui/toast"
+
+
export function Toaster() {
+
const { toasts } = useToast()
+
+
return (
+
<ToastProvider>
+
{toasts.map(function ({ id, title, description, action, ...props }) {
+
return (
+
<Toast key={id} {...props}>
+
<div className="grid gap-1">
+
{title && <ToastTitle>{title}</ToastTitle>}
+
{description && (
+
<ToastDescription>{description}</ToastDescription>
+
)}
+
</div>
+
{action}
+
<ToastClose />
+
</Toast>
+
)
+
})}
+
<ToastViewport />
+
</ToastProvider>
+
)
+
}
+63
frontend/src/context/AuthContext.tsx
···
+
import { createContext, useContext, useEffect, useState } from 'react';
+
import { User } from '../types/api';
+
import * as api from '../api/client';
+
+
interface AuthContextType {
+
user: User | null;
+
login: (email: string, password: string) => Promise<void>;
+
register: (email: string, password: string) => Promise<void>;
+
logout: () => void;
+
isLoading: boolean;
+
}
+
+
const AuthContext = createContext<AuthContextType | undefined>(undefined);
+
+
export function AuthProvider({ children }: { children: React.ReactNode }) {
+
const [user, setUser] = useState<User | null>(null);
+
const [isLoading, setIsLoading] = useState(true);
+
+
useEffect(() => {
+
const token = localStorage.getItem('token');
+
if (token) {
+
const userData = JSON.parse(localStorage.getItem('user') || 'null');
+
setUser(userData);
+
}
+
setIsLoading(false);
+
}, []);
+
+
const login = async (email: string, password: string) => {
+
const response = await api.login(email, password);
+
const { token, user } = response;
+
localStorage.setItem('token', token);
+
localStorage.setItem('user', JSON.stringify(user));
+
setUser(user);
+
};
+
+
const register = async (email: string, password: string) => {
+
const response = await api.register(email, password);
+
const { token, user } = response;
+
localStorage.setItem('token', token);
+
localStorage.setItem('user', JSON.stringify(user));
+
setUser(user);
+
};
+
+
const logout = () => {
+
localStorage.removeItem('token');
+
localStorage.removeItem('user');
+
setUser(null);
+
};
+
+
return (
+
<AuthContext.Provider value={{ user, login, register, logout, isLoading }}>
+
{children}
+
</AuthContext.Provider>
+
);
+
}
+
+
export function useAuth() {
+
const context = useContext(AuthContext);
+
if (context === undefined) {
+
throw new Error('useAuth must be used within an AuthProvider');
+
}
+
return context;
+
}
+191
frontend/src/hooks/use-toast.ts
···
+
import * as React from "react"
+
+
import type {
+
ToastActionElement,
+
ToastProps,
+
} from "@/components/ui/toast"
+
+
const TOAST_LIMIT = 1
+
const TOAST_REMOVE_DELAY = 1000000
+
+
type ToasterToast = ToastProps & {
+
id: string
+
title?: React.ReactNode
+
description?: React.ReactNode
+
action?: ToastActionElement
+
}
+
+
const actionTypes = {
+
ADD_TOAST: "ADD_TOAST",
+
UPDATE_TOAST: "UPDATE_TOAST",
+
DISMISS_TOAST: "DISMISS_TOAST",
+
REMOVE_TOAST: "REMOVE_TOAST",
+
} as const
+
+
let count = 0
+
+
function genId() {
+
count = (count + 1) % Number.MAX_SAFE_INTEGER
+
return count.toString()
+
}
+
+
type ActionType = typeof actionTypes
+
+
type Action =
+
| {
+
type: ActionType["ADD_TOAST"]
+
toast: ToasterToast
+
}
+
| {
+
type: ActionType["UPDATE_TOAST"]
+
toast: Partial<ToasterToast>
+
}
+
| {
+
type: ActionType["DISMISS_TOAST"]
+
toastId?: ToasterToast["id"]
+
}
+
| {
+
type: ActionType["REMOVE_TOAST"]
+
toastId?: ToasterToast["id"]
+
}
+
+
interface State {
+
toasts: ToasterToast[]
+
}
+
+
const toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()
+
+
const addToRemoveQueue = (toastId: string) => {
+
if (toastTimeouts.has(toastId)) {
+
return
+
}
+
+
const timeout = setTimeout(() => {
+
toastTimeouts.delete(toastId)
+
dispatch({
+
type: "REMOVE_TOAST",
+
toastId: toastId,
+
})
+
}, TOAST_REMOVE_DELAY)
+
+
toastTimeouts.set(toastId, timeout)
+
}
+
+
export const reducer = (state: State, action: Action): State => {
+
switch (action.type) {
+
case "ADD_TOAST":
+
return {
+
...state,
+
toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
+
}
+
+
case "UPDATE_TOAST":
+
return {
+
...state,
+
toasts: state.toasts.map((t) =>
+
t.id === action.toast.id ? { ...t, ...action.toast } : t
+
),
+
}
+
+
case "DISMISS_TOAST": {
+
const { toastId } = action
+
+
// ! Side effects ! - This could be extracted into a dismissToast() action,
+
// but I'll keep it here for simplicity
+
if (toastId) {
+
addToRemoveQueue(toastId)
+
} else {
+
state.toasts.forEach((toast) => {
+
addToRemoveQueue(toast.id)
+
})
+
}
+
+
return {
+
...state,
+
toasts: state.toasts.map((t) =>
+
t.id === toastId || toastId === undefined
+
? {
+
...t,
+
open: false,
+
}
+
: t
+
),
+
}
+
}
+
case "REMOVE_TOAST":
+
if (action.toastId === undefined) {
+
return {
+
...state,
+
toasts: [],
+
}
+
}
+
return {
+
...state,
+
toasts: state.toasts.filter((t) => t.id !== action.toastId),
+
}
+
}
+
}
+
+
const listeners: Array<(state: State) => void> = []
+
+
let memoryState: State = { toasts: [] }
+
+
function dispatch(action: Action) {
+
memoryState = reducer(memoryState, action)
+
listeners.forEach((listener) => {
+
listener(memoryState)
+
})
+
}
+
+
type Toast = Omit<ToasterToast, "id">
+
+
function toast({ ...props }: Toast) {
+
const id = genId()
+
+
const update = (props: ToasterToast) =>
+
dispatch({
+
type: "UPDATE_TOAST",
+
toast: { ...props, id },
+
})
+
const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id })
+
+
dispatch({
+
type: "ADD_TOAST",
+
toast: {
+
...props,
+
id,
+
open: true,
+
onOpenChange: (open) => {
+
if (!open) dismiss()
+
},
+
},
+
})
+
+
return {
+
id: id,
+
dismiss,
+
update,
+
}
+
}
+
+
function useToast() {
+
const [state, setState] = React.useState<State>(memoryState)
+
+
React.useEffect(() => {
+
listeners.push(setState)
+
return () => {
+
const index = listeners.indexOf(setState)
+
if (index > -1) {
+
listeners.splice(index, 1)
+
}
+
}
+
}, [state])
+
+
return {
+
...state,
+
toast,
+
dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }),
+
}
+
}
+
+
export { useToast, toast }
+3 -68
frontend/src/index.css
···
-
:root {
-
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
-
line-height: 1.5;
-
font-weight: 400;
-
-
color-scheme: light dark;
-
color: rgba(255, 255, 255, 0.87);
-
background-color: #242424;
-
-
font-synthesis: none;
-
text-rendering: optimizeLegibility;
-
-webkit-font-smoothing: antialiased;
-
-moz-osx-font-smoothing: grayscale;
-
}
-
-
a {
-
font-weight: 500;
-
color: #646cff;
-
text-decoration: inherit;
-
}
-
a:hover {
-
color: #535bf2;
-
}
-
-
body {
-
margin: 0;
-
display: flex;
-
place-items: center;
-
min-width: 320px;
-
min-height: 100vh;
-
}
-
-
h1 {
-
font-size: 3.2em;
-
line-height: 1.1;
-
}
-
-
button {
-
border-radius: 8px;
-
border: 1px solid transparent;
-
padding: 0.6em 1.2em;
-
font-size: 1em;
-
font-weight: 500;
-
font-family: inherit;
-
background-color: #1a1a1a;
-
cursor: pointer;
-
transition: border-color 0.25s;
-
}
-
button:hover {
-
border-color: #646cff;
-
}
-
button:focus,
-
button:focus-visible {
-
outline: 4px auto -webkit-focus-ring-color;
-
}
-
-
@media (prefers-color-scheme: light) {
-
:root {
-
color: #213547;
-
background-color: #ffffff;
-
}
-
a:hover {
-
color: #747bff;
-
}
-
button {
-
background-color: #f9f9f9;
-
}
-
}
+
@tailwind base;
+
@tailwind components;
+
@tailwind utilities;
+6
frontend/src/lib/utils.ts
···
+
import { clsx, type ClassValue } from "clsx"
+
import { twMerge } from "tailwind-merge"
+
+
export function cn(...inputs: ClassValue[]) {
+
return twMerge(clsx(inputs))
+
}
+11 -2
frontend/src/types/api.ts
···
clicks: number;
}
-
export interface ApiError {
-
error: string;
+
export interface User {
+
id: number;
+
email: string;
+
}
+
+
export interface AuthResponse {
+
token: string;
+
user: User;
}
+
export interface ApiError {
+
error: string;
+
}
+16
frontend/tailwind.config.js
···
+
/** @type {import('tailwindcss').Config} */
+
export default {
+
content: [
+
"./index.html",
+
"./src/**/*.{js,ts,jsx,tsx}",
+
],
+
theme: {
+
extend: {
+
colors: {
+
border: "hsl(var(--border))",
+
},
+
},
+
},
+
plugins: [],
+
}
+
+16 -6
frontend/tsconfig.app.json
···
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"target": "ES2020",
"useDefineForClassFields": true,
-
"lib": ["ES2020", "DOM", "DOM.Iterable"],
+
"lib": [
+
"ES2020",
+
"DOM",
+
"DOM.Iterable"
+
],
"module": "ESNext",
"skipLibCheck": true,
-
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
···
"moduleDetection": "force",
"noEmit": true,
"jsx": "react-jsx",
-
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
-
"noUncheckedSideEffectImports": true
+
"noUncheckedSideEffectImports": true,
+
"baseUrl": ".",
+
"paths": {
+
"@/*": [
+
"./src/*"
+
]
+
}
},
-
"include": ["src"]
-
}
+
"include": [
+
"src"
+
]
+
}
+16 -4
frontend/tsconfig.json
···
{
"files": [],
"references": [
-
{ "path": "./tsconfig.app.json" },
-
{ "path": "./tsconfig.node.json" }
-
]
-
}
+
{
+
"path": "./tsconfig.app.json"
+
},
+
{
+
"path": "./tsconfig.node.json"
+
}
+
],
+
"compilerOptions": {
+
"baseUrl": ".",
+
"paths": {
+
"@/*": [
+
"./src/*"
+
]
+
}
+
}
+
}
+11 -1
frontend/vite.config.ts
···
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
+
import tailwindcss from '@tailwindcss/vite'
+
import path from "path"
export default defineConfig({
-
plugins: [react()],
+
plugins: [
+
react(),
+
tailwindcss(),
+
],
server: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
},
+
},
+
},
+
resolve: {
+
alias: {
+
"@": path.resolve(__dirname, "./src"),
},
},
})