From 45a359ec470c04f8c52658fbe1feb7087645c30f Mon Sep 17 00:00:00 2001 From: "robb.fladry" Date: Sun, 19 Jul 2026 18:10:52 -0400 Subject: [PATCH 1/8] chore(phase-0): remove 18 dead dependencies (auth, uploads, cloud storage) passport/session stack, uppy upload suite, and Google Cloud packages were imported nowhere in the codebase. Co-Authored-By: Claude Fable 5 --- package-lock.json | 1418 ++------------------------------------------- package.json | 17 - 2 files changed, 39 insertions(+), 1396 deletions(-) diff --git a/package-lock.json b/package-lock.json index 63165c2..c9ca541 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,17 +41,9 @@ "@radix-ui/react-toggle-group": "^1.1.3", "@radix-ui/react-tooltip": "^1.2.0", "@tanstack/react-query": "^5.60.5", - "@uppy/aws-s3": "^4.3.2", - "@uppy/core": "^4.5.2", - "@uppy/dashboard": "^4.4.3", - "@uppy/drag-drop": "^4.2.2", - "@uppy/file-input": "^4.2.2", - "@uppy/progress-bar": "^4.3.2", - "@uppy/react": "^4.5.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", - "connect-pg-simple": "^10.0.0", "date-fns": "^3.6.0", "dotenv": "^17.4.2", "drizzle-orm": "^0.45.2", @@ -59,15 +51,10 @@ "embla-carousel-react": "^8.6.0", "express": "^4.22.2", "express-rate-limit": "^8.6.0", - "express-session": "^1.18.1", "framer-motion": "^11.18.2", - "google-auth-library": "^10.2.1", "input-otp": "^1.4.2", "lucide-react": "^0.453.0", - "memorystore": "^1.6.7", "next-themes": "^0.4.6", - "passport": "^0.7.0", - "passport-local": "^1.0.0", "react": "^18.3.1", "react-day-picker": "^8.10.1", "react-dom": "^18.3.1", @@ -86,12 +73,8 @@ }, "devDependencies": { "@tailwindcss/typography": "^0.5.15", - "@types/connect-pg-simple": "^7.0.3", "@types/express": "4.17.21", - "@types/express-session": "^1.18.0", "@types/node": "^20.19.43", - "@types/passport": "^1.0.16", - "@types/passport-local": "^1.0.38", "@types/react": "^18.3.11", "@types/react-dom": "^18.3.1", "@types/ws": "^8.5.13", @@ -152,6 +135,7 @@ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -1426,6 +1410,7 @@ "resolved": "https://registry.npmjs.org/@neondatabase/serverless/-/serverless-0.10.4.tgz", "integrity": "sha512-2nZuh3VUO9voBauuh+IGYRhGU/MskWHt1IuZvHcJw6GLjDgtqj/KViKo7SIrLdGLdot7vFbiRRw+BgEy3wT9HA==", "license": "MIT", + "peer": true, "dependencies": { "@types/pg": "8.11.6" } @@ -3152,12 +3137,6 @@ "react": "^18 || ^19" } }, - "node_modules/@transloadit/prettier-bytes": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.3.5.tgz", - "integrity": "sha512-xF4A3d/ZyX2LJWeQZREZQw+qFX4TGQ8bGVP97OLRt6sPO6T0TNHBFTuRHOJh7RNmYOBmQ9MHxpolD9bXihpuVA==", - "license": "MIT" - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -3224,18 +3203,6 @@ "@types/node": "*" } }, - "node_modules/@types/connect-pg-simple": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/connect-pg-simple/-/connect-pg-simple-7.0.3.tgz", - "integrity": "sha512-NGCy9WBlW2bw+J/QlLnFZ9WjoGs6tMo3LAut6mY4kK+XHzue//lpNVpAvYRpIwM969vBRAM2Re0izUvV6kt+NA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/express-session": "*", - "@types/pg": "*" - } - }, "node_modules/@types/d3-array": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", @@ -3332,16 +3299,6 @@ "@types/send": "*" } }, - "node_modules/@types/express-session": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.18.0.tgz", - "integrity": "sha512-27JdDRgor6PoYlURY+Y5kCakqp5ulC0kmf7y+QwaY+hv9jEFuQOThgkjyA53RP3jmKuBsH5GR6qEfFmvb8mwOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", @@ -3365,39 +3322,6 @@ "undici-types": "~6.21.0" } }, - "node_modules/@types/passport": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", - "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/passport-local": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.38.tgz", - "integrity": "sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/passport": "*", - "@types/passport-strategy": "*" - } - }, - "node_modules/@types/passport-strategy": { - "version": "0.2.38", - "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", - "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/passport": "*" - } - }, "node_modules/@types/pg": { "version": "8.11.6", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz", @@ -3436,6 +3360,7 @@ "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -3447,16 +3372,11 @@ "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" } }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "license": "MIT" - }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -3496,530 +3416,6 @@ "@types/node": "*" } }, - "node_modules/@uppy/audio": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@uppy/audio/-/audio-2.2.2.tgz", - "integrity": "sha512-63pwCo+JbJyxB1V/YK59cMSMFi8+g9Mfew6awfJFeu4tAK0HHfZtUk5+fUdZJRdCf4eIwBAiwixBL8Q4BOes+Q==", - "license": "MIT", - "dependencies": { - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/aws-s3": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@uppy/aws-s3/-/aws-s3-4.3.2.tgz", - "integrity": "sha512-w3LrMUEI9pXVcn5LZ5oNL92hyocMu8mxfDSVVQIAQKxR+TPi57FfusDBqBB5T33UvxJH8EUGt9a04tuU/LpKqw==", - "license": "MIT", - "dependencies": { - "@uppy/companion-client": "^4.5.2", - "@uppy/utils": "^6.2.2" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/box": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@uppy/box/-/box-3.3.2.tgz", - "integrity": "sha512-4hRXPWy48Gpgyegd7lBPMYQTplfFEq1uaHe9ZltHu53LBeXasuGeZuprMbhIQ/7Sl/7UQwiAU0te9uv/ypoXGg==", - "license": "MIT", - "dependencies": { - "@uppy/companion-client": "^4.5.2", - "@uppy/provider-views": "^4.5.2", - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/companion-client": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-4.5.2.tgz", - "integrity": "sha512-hfUsReHM5COhn+5d7CdZgZaG8BtDvtwj7vjXzg8qmgKI901mYUm/Zh420iOKT7eHiofKVTNoa7oijeGrqUEnyg==", - "license": "MIT", - "dependencies": { - "@uppy/utils": "^6.2.2", - "namespace-emitter": "^2.0.1", - "p-retry": "^6.1.0" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/components": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@uppy/components/-/components-0.3.2.tgz", - "integrity": "sha512-RHEV2Ru/SU1J8EoLabUX8GXQ59Q5+/FhSL5vIpicaVj++Neei58WYKj4iNWsigE4xE45jtHfYTV9IlXc+fJXaQ==", - "license": "MIT", - "dependencies": { - "@uppy/audio": "^2.2.2", - "@uppy/core": "^4.5.2", - "@uppy/image-editor": "^3.4.2", - "@uppy/remote-sources": "^2.4.2", - "@uppy/screen-capture": "^4.4.2", - "@uppy/webcam": "^4.3.2", - "clsx": "^2.1.1", - "dequal": "^2.0.3", - "preact": "^10.5.13", - "pretty-bytes": "^6.1.1" - } - }, - "node_modules/@uppy/core": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@uppy/core/-/core-4.5.2.tgz", - "integrity": "sha512-5XoPJNcqEXtxtw+vg8EyqUFe11JSbG3/aln83Y7+CLbs7WOovYdfwwKEt1aTbfg1+ijsxudLchya5yh72jaLqw==", - "license": "MIT", - "dependencies": { - "@transloadit/prettier-bytes": "^0.3.4", - "@uppy/store-default": "^4.3.2", - "@uppy/utils": "^6.2.2", - "lodash": "^4.17.21", - "mime-match": "^1.0.2", - "namespace-emitter": "^2.0.1", - "nanoid": "^5.0.9", - "preact": "^10.5.13" - } - }, - "node_modules/@uppy/core/node_modules/nanoid": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", - "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/@uppy/dashboard": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@uppy/dashboard/-/dashboard-4.4.3.tgz", - "integrity": "sha512-IwgDDTbk9p4OoAJvvvx6sQSemKTIJq9IDSryNVgbbC6NiR9HSyRcu0+WdOZLiR9DOhDg2oYcoNgv7DMlrktI6g==", - "license": "MIT", - "dependencies": { - "@transloadit/prettier-bytes": "^0.3.4", - "@uppy/informer": "^4.3.2", - "@uppy/provider-views": "^4.5.2", - "@uppy/status-bar": "^4.2.3", - "@uppy/thumbnail-generator": "^4.2.2", - "@uppy/utils": "^6.2.2", - "classnames": "^2.2.6", - "lodash": "^4.17.21", - "nanoid": "^5.0.9", - "preact": "^10.5.13", - "shallow-equal": "^3.0.0" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/dashboard/node_modules/nanoid": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", - "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/@uppy/drag-drop": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@uppy/drag-drop/-/drag-drop-4.2.2.tgz", - "integrity": "sha512-SlVl+lHC8TvCKW4B9L4pdb0n8mEVgACHjKXGWcy7EUsTrRphv3ugmkbIFL57XpmFR+AFMuPblOsKq/9nkPkHOQ==", - "license": "MIT", - "dependencies": { - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/dropbox": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@uppy/dropbox/-/dropbox-4.3.2.tgz", - "integrity": "sha512-Kj/QX8KFomlbf5mUpoCwxZ8dGH9XiN3RMKqT6zJgUk2bW7JfV2eMV6F9XvrVhz1TCtHZNl81Cv5rhu9io3UQ0w==", - "license": "MIT", - "dependencies": { - "@uppy/companion-client": "^4.5.2", - "@uppy/provider-views": "^4.5.2", - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/facebook": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@uppy/facebook/-/facebook-4.3.2.tgz", - "integrity": "sha512-fHwFN8ZlRuNyxmuL7zwMLIegU+ARxegIlM3yJdY7RbRWgod/lUi5ouzTHjFgvLaFbuDtYWWRbZgF3GxCsXbmhA==", - "license": "MIT", - "dependencies": { - "@uppy/companion-client": "^4.5.2", - "@uppy/provider-views": "^4.5.2", - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/file-input": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@uppy/file-input/-/file-input-4.2.2.tgz", - "integrity": "sha512-tQklK5C1slZWQlMQYQPBJuhfs0e5w1sRb0VwYMt8P297rB1BUcyOjkVH79DAYHkkgXo9aQKUiZSuVoN89tlLjQ==", - "license": "MIT", - "dependencies": { - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/google-drive": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@uppy/google-drive/-/google-drive-4.4.2.tgz", - "integrity": "sha512-hIxnWZ7WMW1jrRecL+VnMVt9TwY+V3uEpy7KmNxASraQFwS2oYgYUfO5R8MVcmL654wymQgEsRY7Kzp9NQvZGw==", - "license": "MIT", - "dependencies": { - "@uppy/companion-client": "^4.5.2", - "@uppy/provider-views": "^4.5.2", - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/image-editor": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@uppy/image-editor/-/image-editor-3.4.2.tgz", - "integrity": "sha512-cQD/oDa/0xCuZAtdi4P2uLIxgrG/YR24KgKAxQYPzQHQtNB8KzCdl3TPV5ZWF9kjT4mSlUsoB4RfPQl34GbFhA==", - "license": "MIT", - "dependencies": { - "@uppy/utils": "^6.2.2", - "cropperjs": "^1.6.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/informer": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@uppy/informer/-/informer-4.3.2.tgz", - "integrity": "sha512-7A9X8BfxR/GPtG0MGbQlmj1+G1o9fqeF3qtRh37ZvmZpapnEGtbstQ6Ao2vFm0uxYxOolLOMzFs/xCD27NKAvg==", - "license": "MIT", - "dependencies": { - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/instagram": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@uppy/instagram/-/instagram-4.3.2.tgz", - "integrity": "sha512-LHGroKn8uRcRs94v6DM8SPXIMWubZb/aZr5B4FP7TvTzf3vnGaKE63oOen1yAoCEYbsJfSdo2p974qHbSdPEbw==", - "license": "MIT", - "dependencies": { - "@uppy/companion-client": "^4.5.2", - "@uppy/provider-views": "^4.5.2", - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/onedrive": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@uppy/onedrive/-/onedrive-4.3.2.tgz", - "integrity": "sha512-dfJAl9qsoQsL1LdIrDPKEKmAj82VNA63BInsJ80nF8bx3tf67AvlMz4O1I9fDW2zctfgOiFlGz47kamz01eSPQ==", - "license": "MIT", - "dependencies": { - "@uppy/companion-client": "^4.5.2", - "@uppy/provider-views": "^4.5.2", - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/progress-bar": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@uppy/progress-bar/-/progress-bar-4.3.2.tgz", - "integrity": "sha512-5BOhq49xPpBTlEVsEIRLkV+Hgb0qTuey8XKyrmrSetcgtolKLwtlDjrOWmUcxGYI3bkMbdeJulF9aiR8sSqQ6A==", - "license": "MIT", - "dependencies": { - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/provider-views": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@uppy/provider-views/-/provider-views-4.5.2.tgz", - "integrity": "sha512-ik54ZHwZNE8czcoWiH0WLzFc/5zHIWAesiqsjZ/MjDpK/6Oun/BhQpUXpXe6629IeIXY+gDo5Uktf6vXtXfosg==", - "license": "MIT", - "dependencies": { - "@uppy/utils": "^6.2.2", - "classnames": "^2.2.6", - "nanoid": "^5.0.9", - "p-queue": "^8.0.0", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/provider-views/node_modules/nanoid": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", - "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/@uppy/react": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@uppy/react/-/react-4.5.2.tgz", - "integrity": "sha512-M2RTC8APz0pbzvAwyBIQEw9pwxlR9gFXII4dU7yUJ/Jb0iLkGuvYrltb9ai4GyPsxOGfdWiFX8e5s8f6Z+Ao1g==", - "license": "MIT", - "dependencies": { - "@uppy/components": "^0.3.2", - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13", - "use-sync-external-store": "^1.2.2" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2", - "@uppy/dashboard": "^4.4.2", - "@uppy/drag-drop": "^4.2.2", - "@uppy/file-input": "^4.2.2", - "@uppy/progress-bar": "^4.3.2", - "@uppy/screen-capture": "^4.4.2", - "@uppy/status-bar": "^4.2.2", - "@uppy/webcam": "^4.3.2", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@uppy/dashboard": { - "optional": true - }, - "@uppy/drag-drop": { - "optional": true - }, - "@uppy/file-input": { - "optional": true - }, - "@uppy/progress-bar": { - "optional": true - }, - "@uppy/screen-capture": { - "optional": true - }, - "@uppy/status-bar": { - "optional": true - }, - "@uppy/webcam": { - "optional": true - } - } - }, - "node_modules/@uppy/remote-sources": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@uppy/remote-sources/-/remote-sources-2.4.2.tgz", - "integrity": "sha512-b8VVlriQWi/xU/LBuoLaQ3y2yMMLqXXJQpkG43tzBQG2R/sYz2qOm593BX9R4HjPQ891Vt4INjzfDTFziaA/4w==", - "license": "MIT", - "dependencies": { - "@uppy/box": "^3.3.2", - "@uppy/dashboard": "^4.4.2", - "@uppy/dropbox": "^4.3.2", - "@uppy/facebook": "^4.3.2", - "@uppy/google-drive": "^4.4.2", - "@uppy/instagram": "^4.3.2", - "@uppy/onedrive": "^4.3.2", - "@uppy/unsplash": "^4.4.2", - "@uppy/url": "^4.3.2", - "@uppy/zoom": "^3.3.2" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/screen-capture": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@uppy/screen-capture/-/screen-capture-4.4.2.tgz", - "integrity": "sha512-z2+Y34V8hs1lCeMB+culySW9WMBIL/19Z8OEkc0u6aHj3i6iCu0lwelPEaiUMdKHOXMyQTgn6Ubv+C3/OZlOpw==", - "license": "MIT", - "dependencies": { - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/status-bar": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@uppy/status-bar/-/status-bar-4.2.3.tgz", - "integrity": "sha512-0AtKdvNm3HHobuE4N0V8SrC3uWB9MQnjqMEL/gachW/1mi7iZ22V4veHd6Wub/tCBQAQbEklvz7d0hxcz/Fh9g==", - "license": "MIT", - "dependencies": { - "@transloadit/prettier-bytes": "^0.3.4", - "@uppy/utils": "^6.2.2", - "classnames": "^2.2.6", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/store-default": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-4.3.2.tgz", - "integrity": "sha512-dnY9R2o8fwmO1bF89D0b5jijD7DGED2qVST5hI/j18JreLWzLKH7u6HuNmOvzok8msrQ/qWzQd5Gx4LDQKhBbw==", - "license": "MIT" - }, - "node_modules/@uppy/thumbnail-generator": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@uppy/thumbnail-generator/-/thumbnail-generator-4.2.2.tgz", - "integrity": "sha512-cHVhrtqqy4j++UxtkwguKSSA/h9PR9UXSar0gr/uGHWsQbXNDzoT23EAFOsVr9ZFkIhtLU7M0x+iCq2hUlX5Tw==", - "license": "MIT", - "dependencies": { - "@uppy/utils": "^6.2.2", - "exifr": "^7.0.0" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/unsplash": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@uppy/unsplash/-/unsplash-4.4.2.tgz", - "integrity": "sha512-1hO7ND/ROrRgZ8urCX38Q/o5rYs2uFGS7djxlNj/cz9xvRdkBagAzj3qp5FUsnPnJzJrRpifXcelvn3tICQjZg==", - "license": "MIT", - "dependencies": { - "@uppy/companion-client": "^4.5.2", - "@uppy/provider-views": "^4.5.2", - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/url": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@uppy/url/-/url-4.3.2.tgz", - "integrity": "sha512-SREfvV9IJxOg2MuzSVQBr2e9LTle8N0dsyUpsHddaSbbPku9KhkoilOiKuDMhPmvw9pnkYWBZhbw9+4UWnrQtQ==", - "license": "MIT", - "dependencies": { - "@uppy/companion-client": "^4.5.2", - "@uppy/utils": "^6.2.2", - "nanoid": "^5.0.9", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/url/node_modules/nanoid": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", - "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/@uppy/utils": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-6.2.2.tgz", - "integrity": "sha512-9mYJtbcngv2HOJIECkyfmdXTI5dW/ObCyvWP1Iti3E5bKtsa4sMmbx5Yh/tGCj8k/lBNhfvWyZuYnvnjmzNLSQ==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.21", - "preact": "^10.5.13" - } - }, - "node_modules/@uppy/webcam": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@uppy/webcam/-/webcam-4.3.2.tgz", - "integrity": "sha512-x0qhTWb7AjkfS9Q12J2xhnTdccZ6sMuBh14LpXtXjaFe4Q1Uf191YmFwT7SCKn7lcasZYw3Tug0G5yQkqvg9uQ==", - "license": "MIT", - "dependencies": { - "@uppy/utils": "^6.2.2", - "is-mobile": "^4.0.0", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, - "node_modules/@uppy/zoom": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@uppy/zoom/-/zoom-3.3.2.tgz", - "integrity": "sha512-e/yP3itmWh2U/A8SBLymVngDSIzmbq08eX0QzBrI5wIA1r38lD5tGlO2V9D70ujY8hNX7HQUqF+nK4OEgdUxJA==", - "license": "MIT", - "dependencies": { - "@uppy/companion-client": "^4.5.2", - "@uppy/provider-views": "^4.5.2", - "@uppy/utils": "^6.2.2", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^4.5.2" - } - }, "node_modules/@vitejs/plugin-react": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", @@ -4054,15 +3450,6 @@ "node": ">= 0.6" } }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, "node_modules/ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", @@ -4174,35 +3561,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "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/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -4324,6 +3682,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001669", "electron-to-chromium": "^1.5.41", @@ -4337,12 +3696,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4350,20 +3703,6 @@ "dev": true, "license": "MIT" }, - "node_modules/bufferutil": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", - "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -4479,12 +3818,6 @@ "url": "https://polar.sh/cva" } }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT" - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -4535,18 +3868,6 @@ "node": ">= 6" } }, - "node_modules/connect-pg-simple": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/connect-pg-simple/-/connect-pg-simple-10.0.0.tgz", - "integrity": "sha512-pBGVazlqiMrackzCr0eKhn4LO5trJXsOX0nQoey9wCOayh80MYtThCbq8eoLsjpiWgiok/h+1/uti9/2/Una8A==", - "license": "MIT", - "dependencies": { - "pg": "^8.12.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=22.0.0" - } - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -4590,12 +3911,6 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, - "node_modules/cropperjs": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.6.2.tgz", - "integrity": "sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA==", - "license": "MIT" - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -4758,19 +4073,11 @@ "node": ">=12" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, "node_modules/date-fns": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" @@ -4808,15 +4115,6 @@ "node": ">= 0.8" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -5370,6 +4668,7 @@ "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.2.tgz", "integrity": "sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==", "license": "Apache-2.0", + "peer": true, "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", @@ -5520,15 +4819,6 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -5545,7 +4835,8 @@ "node_modules/embla-carousel": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", - "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==" + "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", + "peer": true }, "node_modules/embla-carousel-react": { "version": "8.6.0", @@ -5685,12 +4976,6 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, - "node_modules/exifr": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/exifr/-/exifr-7.1.3.tgz", - "integrity": "sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==", - "license": "MIT" - }, "node_modules/express": { "version": "4.22.2", "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", @@ -5756,59 +5041,6 @@ "express": ">= 4.11" } }, - "node_modules/express-session": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.19.0.tgz", - "integrity": "sha512-0csaMkGq+vaiZTmSMMGkfdCOabYv192VbytFypcvI0MANrp+4i/7yEkJ0sbAEhycQjntaKGzYfjfXQyVb7BHMA==", - "license": "MIT", - "dependencies": { - "cookie": "~0.7.2", - "cookie-signature": "~1.0.7", - "debug": "~2.6.9", - "depd": "~2.0.0", - "on-headers": "~1.1.0", - "parseurl": "~1.3.3", - "safe-buffer": "~5.2.1", - "uid-safe": "~2.1.5" - }, - "engines": { - "node": ">= 0.8.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-session/node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express-session/node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "license": "MIT" - }, - "node_modules/express-session/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express-session/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -5824,12 +5056,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, "node_modules/fast-equals": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", @@ -5875,29 +5101,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -5959,18 +5162,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "license": "MIT", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -6053,52 +5244,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gcp-metadata": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", - "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", - "license": "Apache-2.0", - "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/gcp-metadata/node_modules/gaxios": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.1.tgz", - "integrity": "sha512-Odju3uBUJyVCkW64nLD4wKLhbh93bh6vIg/ZIXkWiLPBrdgtc65+tls/qml+un3pr6JqYVFDZbbmLDQT68rTOQ==", - "license": "Apache-2.0", - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "node-fetch": "^3.3.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/gcp-metadata/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "license": "MIT", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6188,132 +5333,28 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/google-auth-library": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.2.1.tgz", - "integrity": "sha512-HMxFl2NfeHYnaL1HoRIN1XgorKS+6CDaM+z9LSSN+i/nKDDL4KFFEWogMXu7jV4HZQy2MsxpY+wA5XIf3w410A==", - "license": "Apache-2.0", - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^7.0.0", - "gcp-metadata": "^7.0.0", - "google-logging-utils": "^1.0.0", - "gtoken": "^8.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/google-auth-library/node_modules/gaxios": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.1.tgz", - "integrity": "sha512-Odju3uBUJyVCkW64nLD4wKLhbh93bh6vIg/ZIXkWiLPBrdgtc65+tls/qml+un3pr6JqYVFDZbbmLDQT68rTOQ==", - "license": "Apache-2.0", - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "node-fetch": "^3.3.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/google-auth-library/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "license": "MIT", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/google-logging-utils": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.1.tgz", - "integrity": "sha512-rcX58I7nqpu4mbKztFeOAObbomBbHU2oIb/d3tJfF3dizGSApqtSwYJigGCooHdnMyQBIw8BrWyK96w3YXgr6A==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gtoken": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", - "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", - "license": "MIT", - "dependencies": { - "gaxios": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/gtoken/node_modules/gaxios": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.1.tgz", - "integrity": "sha512-Odju3uBUJyVCkW64nLD4wKLhbh93bh6vIg/ZIXkWiLPBrdgtc65+tls/qml+un3pr6JqYVFDZbbmLDQT68rTOQ==", - "license": "Apache-2.0", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "node-fetch": "^3.3.2" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=18" + "node": ">=10.13.0" } }, - "node_modules/gtoken/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { @@ -6356,19 +5397,6 @@ "node": ">= 0.8" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6480,24 +5508,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-mobile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-4.0.0.tgz", - "integrity": "sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==", - "license": "MIT" - }, - "node_modules/is-network-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", - "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -6556,15 +5566,6 @@ "node": ">=6" } }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -6578,27 +5579,6 @@ "node": ">=6" } }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -6691,35 +5671,6 @@ "node": ">= 0.6" } }, - "node_modules/memorystore": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/memorystore/-/memorystore-1.6.7.tgz", - "integrity": "sha512-OZnmNY/NDrKohPQ+hxp0muBcBKrzKNtHr55DbqSx9hLsYVNnomSAMRAtI7R64t3gf3ID7tHQA7mG4oL3Hu9hdw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.0", - "lru-cache": "^4.0.3" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/memorystore/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/memorystore/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "license": "ISC" - }, "node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", @@ -6781,15 +5732,6 @@ "node": ">= 0.6" } }, - "node_modules/mime-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz", - "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==", - "license": "ISC", - "dependencies": { - "wildcard": "^1.1.0" - } - }, "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", @@ -6864,12 +5806,6 @@ "thenify-all": "^1.0.0" } }, - "node_modules/namespace-emitter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz", - "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==", - "license": "MIT" - }, "node_modules/nanoid": { "version": "3.3.16", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", @@ -6906,26 +5842,6 @@ "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-gyp-build": { "version": "4.8.3", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.3.tgz", @@ -7012,66 +5928,6 @@ "node": ">= 0.8" } }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/p-queue": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz", - "integrity": "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^6.1.2" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, - "node_modules/p-retry": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", - "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "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", @@ -7087,43 +5943,6 @@ "node": ">= 0.8" } }, - "node_modules/passport": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", - "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", - "license": "MIT", - "dependencies": { - "passport-strategy": "1.x.x", - "pause": "0.0.1", - "utils-merge": "^1.0.1" - }, - "engines": { - "node": ">= 0.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jaredhanson" - } - }, - "node_modules/passport-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", - "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==", - "dependencies": { - "passport-strategy": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -7167,38 +5986,6 @@ "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "license": "MIT" }, - "node_modules/pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" - }, - "node_modules/pg": { - "version": "8.13.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", - "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", - "license": "MIT", - "dependencies": { - "pg-connection-string": "^2.7.0", - "pg-pool": "^3.7.0", - "pg-protocol": "^1.7.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" - }, - "engines": { - "node": ">= 8.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.1.1" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, "node_modules/pg-cloudflare": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", @@ -7210,7 +5997,8 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==", - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/pg-int8": { "version": "1.0.1", @@ -7235,6 +6023,7 @@ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", "license": "MIT", + "optional": true, "peerDependencies": { "pg": ">=8.0" } @@ -7263,66 +6052,12 @@ "node": ">=10" } }, - "node_modules/pg/node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "license": "MIT", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pg/node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/pg/node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pg/node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pg/node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/pgpass": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", "license": "MIT", + "optional": true, "dependencies": { "split2": "^4.1.0" } @@ -7382,6 +6117,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", @@ -7551,36 +6287,6 @@ "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==", "license": "MIT" }, - "node_modules/preact": { - "version": "10.29.7", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.7.tgz", - "integrity": "sha512-DCHYrK/B10yUD3ZjLfhZ3WIE/9Vf9VFUODcRE2dRomTYDpJk6z6L9wecSfhfE6M9ZTHUdyQkoC46arIDhEV84Q==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - }, - "peerDependencies": { - "preact-render-to-string": ">=5" - }, - "peerDependenciesMeta": { - "preact-render-to-string": { - "optional": true - } - } - }, - "node_modules/pretty-bytes": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", - "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", - "license": "MIT", - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -7609,12 +6315,6 @@ "node": ">= 0.10" } }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "license": "ISC" - }, "node_modules/qs": { "version": "6.15.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", @@ -7657,15 +6357,6 @@ "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", "license": "MIT" }, - "node_modules/random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -7724,6 +6415,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -7749,6 +6441,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -7761,6 +6454,7 @@ "version": "7.55.0", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.55.0.tgz", "integrity": "sha512-XRnjsH3GVMQz1moZTW53MxfoWN7aDpUg/GpVNc4A3eXRVNdGXfbzJ4vM4aLQ8g6XCUh1nIbx70aaNCl7kxnjog==", + "peer": true, "engines": { "node": ">=18.0.0" }, @@ -7981,7 +6675,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/regenerator-runtime": { "version": "0.14.1", @@ -8024,15 +6719,6 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -8225,12 +6911,6 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, - "node_modules/shallow-equal": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-3.1.0.tgz", - "integrity": "sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg==", - "license": "MIT" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8371,6 +7051,7 @@ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "license": "ISC", + "optional": true, "engines": { "node": ">= 10.x" } @@ -8527,6 +7208,7 @@ "version": "3.4.17", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -8635,6 +7317,7 @@ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8721,18 +7404,6 @@ "node": ">=14.17" } }, - "node_modules/uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "license": "MIT", - "dependencies": { - "random-bytes": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -8893,6 +7564,7 @@ "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.27.0 || ^0.28.0", "fdir": "^6.5.0", @@ -8986,6 +7658,7 @@ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8993,15 +7666,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -9017,12 +7681,6 @@ "node": ">= 8" } }, - "node_modules/wildcard": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz", - "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==", - "license": "MIT" - }, "node_modules/wouter": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/wouter/-/wouter-3.3.5.tgz", @@ -9154,6 +7812,7 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "license": "MIT", + "optional": true, "engines": { "node": ">=0.4" } @@ -9184,6 +7843,7 @@ "version": "3.24.2", "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 16f7388..84a2c04 100644 --- a/package.json +++ b/package.json @@ -47,17 +47,9 @@ "@radix-ui/react-toggle-group": "^1.1.3", "@radix-ui/react-tooltip": "^1.2.0", "@tanstack/react-query": "^5.60.5", - "@uppy/aws-s3": "^4.3.2", - "@uppy/core": "^4.5.2", - "@uppy/dashboard": "^4.4.3", - "@uppy/drag-drop": "^4.2.2", - "@uppy/file-input": "^4.2.2", - "@uppy/progress-bar": "^4.3.2", - "@uppy/react": "^4.5.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", - "connect-pg-simple": "^10.0.0", "date-fns": "^3.6.0", "dotenv": "^17.4.2", "drizzle-orm": "^0.45.2", @@ -65,15 +57,10 @@ "embla-carousel-react": "^8.6.0", "express": "^4.22.2", "express-rate-limit": "^8.6.0", - "express-session": "^1.18.1", "framer-motion": "^11.18.2", - "google-auth-library": "^10.2.1", "input-otp": "^1.4.2", "lucide-react": "^0.453.0", - "memorystore": "^1.6.7", "next-themes": "^0.4.6", - "passport": "^0.7.0", - "passport-local": "^1.0.0", "react": "^18.3.1", "react-day-picker": "^8.10.1", "react-dom": "^18.3.1", @@ -92,12 +79,8 @@ }, "devDependencies": { "@tailwindcss/typography": "^0.5.15", - "@types/connect-pg-simple": "^7.0.3", "@types/express": "4.17.21", - "@types/express-session": "^1.18.0", "@types/node": "^20.19.43", - "@types/passport": "^1.0.16", - "@types/passport-local": "^1.0.38", "@types/react": "^18.3.11", "@types/react-dom": "^18.3.1", "@types/ws": "^8.5.13", From af22c1fb0eaf3e9a04807c2b0daecf1ade518014 Mon Sep 17 00:00:00 2001 From: "robb.fladry" Date: Sun, 19 Jul 2026 18:13:48 -0400 Subject: [PATCH 2/8] refactor(phase-0): remove database-as-cache layer and dead transcode/HLS pipeline Postgres/Drizzle existed only to back the in-memory search/metadata caches; the transcode, disk-cache, and HLS routes never ran on the Vercel deploy and had no live client consumers. Caches are now memory-only LRU with TTL. Co-Authored-By: Claude Fable 5 --- client/src/components/CommandPalette.tsx | 22 - client/src/components/VideoWarmingState.tsx | 155 - client/src/hooks/use-video-cache.tsx | 121 - client/src/lib/archive-api.ts | 104 - client/src/lib/connection-monitor.ts | 2 +- drizzle.config.ts | 14 - migrations/0000_warm_shinko_yamashiro.sql | 66 - migrations/meta/0000_snapshot.json | 501 --- migrations/meta/_journal.json | 13 - package-lock.json | 3803 ++++++------------- package.json | 10 +- server/cache-service.ts | 243 -- server/db.ts | 28 - server/metadata-service.ts | 124 +- server/routes.ts | 206 - server/search-cache-service.ts | 223 +- server/transcode-service.ts | 523 --- shared/schema.ts | 69 - 18 files changed, 1282 insertions(+), 4945 deletions(-) delete mode 100644 client/src/components/VideoWarmingState.tsx delete mode 100644 client/src/hooks/use-video-cache.tsx delete mode 100644 drizzle.config.ts delete mode 100644 migrations/0000_warm_shinko_yamashiro.sql delete mode 100644 migrations/meta/0000_snapshot.json delete mode 100644 migrations/meta/_journal.json delete mode 100644 server/cache-service.ts delete mode 100644 server/db.ts delete mode 100644 server/transcode-service.ts diff --git a/client/src/components/CommandPalette.tsx b/client/src/components/CommandPalette.tsx index acf5f0b..888b091 100644 --- a/client/src/components/CommandPalette.tsx +++ b/client/src/components/CommandPalette.tsx @@ -248,28 +248,6 @@ export function CommandPalette({ isOpen, onClose }: CommandPaletteProps) { group: 'Export', badge: queueItems.length > 0 ? `${queueItems.length} items` : 'Empty', }, - { - id: 'cache-stats', - title: 'View Cache Statistics', - description: 'Check performance and cache hit rates', - icon: , - keywords: ['cache', 'stats', 'performance', 'monitor'], - action: async () => { - try { - const response = await fetch('/api/cache-stats'); - const stats = await response.json(); - console.log('Cache Statistics:', stats); - toast({ - title: 'Cache Statistics', - description: `Search: ${stats.searchCache?.memoryEntries || 0} in memory, Transcode: ${stats.transcode?.totalFiles || 0} files` - }); - } catch (error) { - toast({ title: 'Failed to fetch cache stats', variant: 'destructive' }); - } - onClose(); - }, - group: 'Tools', - }, { id: 'emergency-mix', title: 'Generate Emergency Mix', diff --git a/client/src/components/VideoWarmingState.tsx b/client/src/components/VideoWarmingState.tsx deleted file mode 100644 index ddda591..0000000 --- a/client/src/components/VideoWarmingState.tsx +++ /dev/null @@ -1,155 +0,0 @@ -import { useState, useEffect } from 'react'; -import { Progress } from '@/components/ui/progress'; -import { Badge } from '@/components/ui/badge'; -import { Loader2, Download, Zap, CheckCircle } from 'lucide-react'; -import { pollJobStatus } from '@/lib/archive-api'; - -interface VideoWarmingStateProps { - identifier: string; - jobId: string; - initialProgress?: number; - initialStatus?: string; - onComplete?: () => void; - className?: string; -} - -export function VideoWarmingState({ - identifier, - jobId, - initialProgress = 0, - initialStatus = 'pending', - onComplete, - className = '' -}: VideoWarmingStateProps) { - const [progress, setProgress] = useState(initialProgress); - const [status, setStatus] = useState(initialStatus); - const [timeRemaining, setTimeRemaining] = useState(''); - const [startTime] = useState(Date.now()); - - useEffect(() => { - const handleProgress = (newProgress: number, newStatus: string) => { - setProgress(newProgress); - setStatus(newStatus); - - // Estimate time remaining - if (newProgress > 0 && newProgress < 100) { - const elapsed = Date.now() - startTime; - const totalEstimated = (elapsed / newProgress) * 100; - const remaining = totalEstimated - elapsed; - - if (remaining > 0) { - const minutes = Math.floor(remaining / 60000); - const seconds = Math.floor((remaining % 60000) / 1000); - setTimeRemaining(minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`); - } - } - }; - - // Start polling - pollJobStatus(jobId, handleProgress, 1500) - .then(() => { - setProgress(100); - setStatus('completed'); - if (onComplete) { - setTimeout(onComplete, 500); // Small delay to show completion - } - }) - .catch((error) => { - console.error('Transcoding failed:', error); - setStatus('failed'); - }); - }, [jobId, onComplete, startTime]); - - const getStatusInfo = () => { - switch (status) { - case 'pending': - return { - icon: , - label: 'Queued', - description: 'Waiting to start processing...', - color: 'bg-yellow-500' - }; - case 'downloading': - return { - icon: , - label: 'Downloading', - description: 'Fetching from Internet Archive...', - color: 'bg-blue-500' - }; - case 'transcoding': - return { - icon: , - label: 'Transcoding', - description: 'Converting to optimized format...', - color: 'bg-purple-500' - }; - case 'completed': - return { - icon: , - label: 'Complete', - description: 'Video ready for streaming!', - color: 'bg-green-500' - }; - case 'failed': - return { - icon:
, - label: 'Failed', - description: 'Processing failed. Using fallback.', - color: 'bg-red-500' - }; - default: - return { - icon: , - label: 'Processing', - description: 'Working on it...', - color: 'bg-gray-500' - }; - } - }; - - const statusInfo = getStatusInfo(); - - return ( -
-
-
- {statusInfo.icon} - - {statusInfo.label} - -
- - {timeRemaining && status !== 'completed' && status !== 'failed' && ( - - ~{timeRemaining} remaining - - )} -
- -
-
- {statusInfo.description} - {Math.round(progress)}% -
- - -
- -
- {identifier} - {status === 'completed' && ( - โ€ข Cached for instant playback - )} - {status === 'failed' && ( - โ€ข Streaming directly from archive - )} -
-
- ); -} \ No newline at end of file diff --git a/client/src/hooks/use-video-cache.tsx b/client/src/hooks/use-video-cache.tsx deleted file mode 100644 index f1584f9..0000000 --- a/client/src/hooks/use-video-cache.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import { useState, useEffect } from 'react'; -import { getVideoUrl, pollJobStatus } from '@/lib/archive-api'; - -export interface VideoCacheState { - url: string | null; - cached: boolean; - warming: boolean; - progress: number; - status: string; - jobId?: string; - error?: string; -} - -export function useVideoCache(identifier: string | null) { - const [state, setState] = useState({ - url: null, - cached: false, - warming: false, - progress: 0, - status: 'idle' - }); - - const [isLoading, setIsLoading] = useState(false); - - const loadVideo = async (id: string) => { - if (!id) return; - - setIsLoading(true); - setState(prev => ({ ...prev, error: undefined })); - - try { - console.log(`๐ŸŽฏ Loading video: ${id}`); - const result = await getVideoUrl(id); - - setState({ - url: result.url, - cached: result.cached, - warming: result.warming || false, - progress: result.progress || 0, - status: result.warming ? 'warming' : (result.cached ? 'cached' : 'direct'), - jobId: result.jobId, - error: undefined - }); - - // If warming, start polling for updates - if (result.warming && result.jobId) { - console.log(`โณ Video warming, polling job: ${result.jobId}`); - - pollJobStatus( - result.jobId, - (progress, status) => { - setState(prev => ({ - ...prev, - progress, - status: status === 'completed' ? 'cached' : 'warming' - })); - }, - 2000 - ) - .then(() => { - // When complete, get the new cached URL - console.log(`โœ… Transcoding complete for ${id}`); - return getVideoUrl(id); - }) - .then((updatedResult) => { - setState({ - url: updatedResult.url, - cached: true, - warming: false, - progress: 100, - status: 'cached', - error: undefined - }); - }) - .catch((error) => { - console.error('Polling failed:', error); - setState(prev => ({ - ...prev, - warming: false, - status: 'direct', - error: error.message - })); - }); - } - - } catch (error) { - console.error(`Failed to load video ${id}:`, error); - setState({ - url: null, - cached: false, - warming: false, - progress: 0, - status: 'error', - error: error instanceof Error ? error.message : 'Unknown error' - }); - } finally { - setIsLoading(false); - } - }; - - // Load video when identifier changes - useEffect(() => { - if (identifier) { - loadVideo(identifier); - } else { - setState({ - url: null, - cached: false, - warming: false, - progress: 0, - status: 'idle' - }); - } - }, [identifier]); - - return { - ...state, - isLoading, - reload: () => identifier && loadVideo(identifier) - }; -} \ No newline at end of file diff --git a/client/src/lib/archive-api.ts b/client/src/lib/archive-api.ts index 888ab50..0e25d4b 100644 --- a/client/src/lib/archive-api.ts +++ b/client/src/lib/archive-api.ts @@ -217,114 +217,10 @@ export async function getVideoMetadata(identifier: string) { return data; } -// Check video cache status and initiate warming if needed -export async function checkVideoCache(identifier: string) { - const response = await fetch(`/api/cache/${identifier}`); - - if (!response.ok) { - throw new Error(`Failed to check cache: ${response.statusText}`); - } - - return response.json(); -} - -// Get transcoding job status -export async function getJobStatus(jobId: string) { - const response = await fetch(`/api/jobs/${jobId}`); - - if (!response.ok) { - throw new Error(`Failed to get job status: ${response.statusText}`); - } - - return response.json(); -} - -// Get the best video URL (cached or fallback) -export async function getVideoUrl(identifier: string): Promise<{ - url: string; - cached: boolean; - warming?: boolean; - jobId?: string; - progress?: number; -}> { - try { - // Check cache first - const cacheStatus = await checkVideoCache(identifier); - - if (cacheStatus.cached) { - return { - url: `/api/cached-video/${identifier}`, - cached: true - }; - } - - if (cacheStatus.warming) { - // Return fallback URL while warming - const metadata = await getVideoMetadata(identifier); - - return { - url: metadata.streamUrl, // Fallback to direct IA streaming - cached: false, - warming: true, - jobId: cacheStatus.jobId, - progress: cacheStatus.progress - }; - } - - // Not cached and not warming - this shouldn't happen if checkVideoCache worked - const metadata = await getVideoMetadata(identifier); - return { - url: metadata.streamUrl, - cached: false - }; - - } catch (error) { - console.error('Failed to get video URL:', error); - // Fallback to metadata approach - const metadata = await getVideoMetadata(identifier); - return { - url: metadata.streamUrl, - cached: false - }; - } -} - export function generateThumbnailUrl(identifier: string): string { return `https://archive.org/services/img/${identifier}`; } -// Poll job status until completion -export async function pollJobStatus( - jobId: string, - onProgress?: (progress: number, status: string) => void, - intervalMs: number = 2000 -): Promise { - return new Promise((resolve, reject) => { - const poll = async () => { - try { - const job = await getJobStatus(jobId); - - if (onProgress) { - onProgress(job.progress, job.status); - } - - if (job.status === 'completed') { - resolve(job); - } else if (job.status === 'failed') { - reject(new Error(job.error || 'Transcoding failed')); - } else { - // Continue polling - setTimeout(poll, intervalMs); - } - } catch (error) { - reject(error); - } - }; - - poll(); - }); -} - // Preload thumbnail with retry logic export async function preloadThumbnail(identifier: string, signal?: AbortSignal): Promise { // Check if we should retry this thumbnail diff --git a/client/src/lib/connection-monitor.ts b/client/src/lib/connection-monitor.ts index b3f28d7..b82f8ff 100644 --- a/client/src/lib/connection-monitor.ts +++ b/client/src/lib/connection-monitor.ts @@ -92,7 +92,7 @@ class ConnectionMonitor { if ('PerformanceObserver' in window) { const observer = new PerformanceObserver((list) => { for (const entry of list.getEntries()) { - if (entry.name.includes('/api/video/') || entry.name.includes('/api/cached-video/')) { + if (entry.name.includes('/api/video/')) { const resourceEntry = entry as PerformanceResourceTiming; const loadTime = resourceEntry.responseEnd - resourceEntry.requestStart; loadTimes.push(loadTime); diff --git a/drizzle.config.ts b/drizzle.config.ts deleted file mode 100644 index 4cd7b4c..0000000 --- a/drizzle.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from "drizzle-kit"; - -if (!process.env.DATABASE_URL) { - throw new Error("DATABASE_URL, ensure the database is provisioned"); -} - -export default defineConfig({ - out: "./migrations", - schema: "./shared/schema.ts", - dialect: "postgresql", - dbCredentials: { - url: process.env.DATABASE_URL, - }, -}); diff --git a/migrations/0000_warm_shinko_yamashiro.sql b/migrations/0000_warm_shinko_yamashiro.sql deleted file mode 100644 index 8dcac88..0000000 --- a/migrations/0000_warm_shinko_yamashiro.sql +++ /dev/null @@ -1,66 +0,0 @@ -CREATE TABLE "edl_events" ( - "id" text PRIMARY KEY NOT NULL, - "session_id" text NOT NULL, - "timestamp" timestamp NOT NULL, - "event_type" text NOT NULL, - "clip_id" text NOT NULL, - "clip_title" text NOT NULL, - "timecode" text NOT NULL, - "trim_in" text NOT NULL, - "trim_out" text NOT NULL, - "parameters" json, - "notes" text, - "created_at" timestamp DEFAULT now() NOT NULL -); ---> statement-breakpoint -CREATE TABLE "edl_sessions" ( - "id" text PRIMARY KEY NOT NULL, - "name" text NOT NULL, - "start_time" timestamp NOT NULL, - "end_time" timestamp, - "total_duration" text, - "venue" text, - "description" text, - "metadata" json, - "created_at" timestamp DEFAULT now() NOT NULL, - "updated_at" timestamp DEFAULT now() NOT NULL -); ---> statement-breakpoint -CREATE TABLE "metadata_cache" ( - "id" text PRIMARY KEY NOT NULL, - "identifier" text NOT NULL, - "metadata" json NOT NULL, - "files" json NOT NULL, - "selected_file" json NOT NULL, - "stream_url" text NOT NULL, - "cached_at" timestamp DEFAULT now() NOT NULL, - "expires_at" timestamp NOT NULL, - "access_count" integer DEFAULT 0 NOT NULL, - "last_accessed" timestamp DEFAULT now(), - CONSTRAINT "metadata_cache_identifier_unique" UNIQUE("identifier") -); ---> statement-breakpoint -CREATE TABLE "search_cache" ( - "id" text PRIMARY KEY NOT NULL, - "query_hash" text NOT NULL, - "query" text NOT NULL, - "filters" json NOT NULL, - "results" json NOT NULL, - "total_results" integer NOT NULL, - "cached_at" timestamp DEFAULT now() NOT NULL, - "expires_at" timestamp NOT NULL, - "hit_count" integer DEFAULT 1 NOT NULL, - "last_accessed" timestamp DEFAULT now(), - CONSTRAINT "search_cache_query_hash_unique" UNIQUE("query_hash") -); ---> statement-breakpoint -ALTER TABLE "edl_events" ADD CONSTRAINT "edl_events_session_id_edl_sessions_id_fk" FOREIGN KEY ("session_id") REFERENCES "public"."edl_sessions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -CREATE INDEX "edl_events_session_id_idx" ON "edl_events" USING btree ("session_id");--> statement-breakpoint -CREATE INDEX "edl_events_timestamp_idx" ON "edl_events" USING btree ("timestamp");--> statement-breakpoint -CREATE INDEX "edl_events_event_type_idx" ON "edl_events" USING btree ("event_type");--> statement-breakpoint -CREATE INDEX "edl_sessions_name_idx" ON "edl_sessions" USING btree ("name");--> statement-breakpoint -CREATE INDEX "edl_sessions_start_time_idx" ON "edl_sessions" USING btree ("start_time");--> statement-breakpoint -CREATE INDEX "metadata_cache_identifier_idx" ON "metadata_cache" USING btree ("identifier");--> statement-breakpoint -CREATE INDEX "metadata_cache_expires_at_idx" ON "metadata_cache" USING btree ("expires_at");--> statement-breakpoint -CREATE INDEX "search_cache_query_hash_idx" ON "search_cache" USING btree ("query_hash");--> statement-breakpoint -CREATE INDEX "search_cache_expires_at_idx" ON "search_cache" USING btree ("expires_at"); \ No newline at end of file diff --git a/migrations/meta/0000_snapshot.json b/migrations/meta/0000_snapshot.json deleted file mode 100644 index ccae2e5..0000000 --- a/migrations/meta/0000_snapshot.json +++ /dev/null @@ -1,501 +0,0 @@ -{ - "id": "5ae93701-5108-45c1-b1bd-9d84ac6cf343", - "prevId": "00000000-0000-0000-0000-000000000000", - "version": "7", - "dialect": "postgresql", - "tables": { - "public.edl_events": { - "name": "edl_events", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "session_id": { - "name": "session_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "timestamp": { - "name": "timestamp", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "event_type": { - "name": "event_type", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "clip_id": { - "name": "clip_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "clip_title": { - "name": "clip_title", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "timecode": { - "name": "timecode", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "trim_in": { - "name": "trim_in", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "trim_out": { - "name": "trim_out", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "parameters": { - "name": "parameters", - "type": "json", - "primaryKey": false, - "notNull": false - }, - "notes": { - "name": "notes", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": { - "edl_events_session_id_idx": { - "name": "edl_events_session_id_idx", - "columns": [ - { - "expression": "session_id", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - }, - "edl_events_timestamp_idx": { - "name": "edl_events_timestamp_idx", - "columns": [ - { - "expression": "timestamp", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - }, - "edl_events_event_type_idx": { - "name": "edl_events_event_type_idx", - "columns": [ - { - "expression": "event_type", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": { - "edl_events_session_id_edl_sessions_id_fk": { - "name": "edl_events_session_id_edl_sessions_id_fk", - "tableFrom": "edl_events", - "tableTo": "edl_sessions", - "columnsFrom": [ - "session_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.edl_sessions": { - "name": "edl_sessions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "start_time": { - "name": "start_time", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "end_time": { - "name": "end_time", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "total_duration": { - "name": "total_duration", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "venue": { - "name": "venue", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "metadata": { - "name": "metadata", - "type": "json", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": { - "edl_sessions_name_idx": { - "name": "edl_sessions_name_idx", - "columns": [ - { - "expression": "name", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - }, - "edl_sessions_start_time_idx": { - "name": "edl_sessions_start_time_idx", - "columns": [ - { - "expression": "start_time", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.metadata_cache": { - "name": "metadata_cache", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "identifier": { - "name": "identifier", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "metadata": { - "name": "metadata", - "type": "json", - "primaryKey": false, - "notNull": true - }, - "files": { - "name": "files", - "type": "json", - "primaryKey": false, - "notNull": true - }, - "selected_file": { - "name": "selected_file", - "type": "json", - "primaryKey": false, - "notNull": true - }, - "stream_url": { - "name": "stream_url", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "cached_at": { - "name": "cached_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "access_count": { - "name": "access_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "last_accessed": { - "name": "last_accessed", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - } - }, - "indexes": { - "metadata_cache_identifier_idx": { - "name": "metadata_cache_identifier_idx", - "columns": [ - { - "expression": "identifier", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - }, - "metadata_cache_expires_at_idx": { - "name": "metadata_cache_expires_at_idx", - "columns": [ - { - "expression": "expires_at", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "metadata_cache_identifier_unique": { - "name": "metadata_cache_identifier_unique", - "nullsNotDistinct": false, - "columns": [ - "identifier" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.search_cache": { - "name": "search_cache", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "query_hash": { - "name": "query_hash", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "query": { - "name": "query", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "filters": { - "name": "filters", - "type": "json", - "primaryKey": false, - "notNull": true - }, - "results": { - "name": "results", - "type": "json", - "primaryKey": false, - "notNull": true - }, - "total_results": { - "name": "total_results", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "cached_at": { - "name": "cached_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "hit_count": { - "name": "hit_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 1 - }, - "last_accessed": { - "name": "last_accessed", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - } - }, - "indexes": { - "search_cache_query_hash_idx": { - "name": "search_cache_query_hash_idx", - "columns": [ - { - "expression": "query_hash", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - }, - "search_cache_expires_at_idx": { - "name": "search_cache_expires_at_idx", - "columns": [ - { - "expression": "expires_at", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "search_cache_query_hash_unique": { - "name": "search_cache_query_hash_unique", - "nullsNotDistinct": false, - "columns": [ - "query_hash" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - } - }, - "enums": {}, - "schemas": {}, - "sequences": {}, - "roles": {}, - "policies": {}, - "views": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } -} \ No newline at end of file diff --git a/migrations/meta/_journal.json b/migrations/meta/_journal.json deleted file mode 100644 index 5173533..0000000 --- a/migrations/meta/_journal.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "7", - "dialect": "postgresql", - "entries": [ - { - "idx": 0, - "version": "7", - "when": 1755152733397, - "tag": "0000_warm_shinko_yamashiro", - "breakpoints": true - } - ] -} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c9ca541..cbdaa48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,6 @@ "@hello-pangea/dnd": "^18.0.1", "@hookform/resolvers": "^3.10.0", "@jridgewell/trace-mapping": "^0.3.25", - "@neondatabase/serverless": "^0.10.4", "@radix-ui/react-accordion": "^1.2.4", "@radix-ui/react-alert-dialog": "^1.1.7", "@radix-ui/react-aspect-ratio": "^1.1.3", @@ -46,8 +45,6 @@ "cmdk": "^1.1.1", "date-fns": "^3.6.0", "dotenv": "^17.4.2", - "drizzle-orm": "^0.45.2", - "drizzle-zod": "^0.7.0", "embla-carousel-react": "^8.6.0", "express": "^4.22.2", "express-rate-limit": "^8.6.0", @@ -80,7 +77,6 @@ "@types/ws": "^8.5.13", "@vitejs/plugin-react": "^5.2.0", "autoprefixer": "^10.4.20", - "drizzle-kit": "^0.31.10", "esbuild": "^0.28.1", "postcss": "^8.5.20", "tailwindcss": "^3.4.17", @@ -398,29 +394,27 @@ "node": ">=6.9.0" } }, - "node_modules/@drizzle-team/brocli": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", - "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@esbuild-kit/core-utils": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", - "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", - "deprecated": "Merged into tsx: https://tsx.is", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "esbuild": "~0.18.20", - "source-map-support": "^0.5.21" + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "cpu": [ "arm" ], @@ -431,13 +425,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], @@ -448,13 +442,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "cpu": [ "x64" ], @@ -465,13 +459,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], @@ -482,13 +476,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], @@ -499,13 +493,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "cpu": [ "arm64" ], @@ -516,13 +510,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ "x64" ], @@ -533,13 +527,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ "arm" ], @@ -550,13 +544,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], @@ -567,13 +561,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ "ia32" ], @@ -584,13 +578,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ "loong64" ], @@ -601,13 +595,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ "mips64el" ], @@ -618,13 +612,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ "ppc64" ], @@ -635,13 +629,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], @@ -652,13 +646,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "cpu": [ "s390x" ], @@ -669,13 +663,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "cpu": [ "x64" ], @@ -686,15 +680,15 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", @@ -703,30 +697,13 @@ "netbsd" ], "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], @@ -734,16 +711,16 @@ "license": "MIT", "optional": true, "os": [ - "sunos" + "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", "cpu": [ "arm64" ], @@ -751,33 +728,16 @@ "license": "MIT", "optional": true, "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" + "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "cpu": [ "x64" ], @@ -785,100 +745,50 @@ "license": "MIT", "optional": true, "os": [ - "win32" + "openbsd" ], "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/@esbuild-kit/esm-loader": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", - "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", - "deprecated": "Merged into tsx: https://tsx.is", - "dev": true, - "license": "MIT", - "dependencies": { - "@esbuild-kit/core-utils": "^3.3.2", - "get-tsconfig": "^4.7.0" + "node": ">=18" } }, - "node_modules/@esbuild/aix-ppc64": { + "node_modules/@esbuild/openharmony-arm64": { "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "aix" + "openharmony" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm": { + "node_modules/@esbuild/sunos-x64": { "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "cpu": [ - "arm" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "sunos" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm64": { + "node_modules/@esbuild/win32-arm64": { "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "cpu": [ "arm64" ], @@ -886,574 +796,207 @@ "license": "MIT", "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-x64": { + "node_modules/@esbuild/win32-ia32": { "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "cpu": [ - "x64" + "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/darwin-arm64": { + "node_modules/@esbuild/win32-x64": { "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" + "node_modules/@floating-ui/core": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", + "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "dependencies": { + "@floating-ui/utils": "^0.2.9" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" + "node_modules/@floating-ui/dom": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", + "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.9" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "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", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==" + }, + "node_modules/@hello-pangea/dnd": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-18.0.1.tgz", + "integrity": "sha512-xojVWG8s/TGrKT1fC8K2tIWeejJYTAeJuj36zM//yEm/ZrnZUSFGS15BpO+jGZT1ybWvyXmeDJwPYb4dhWlbZQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.26.7", + "css-box-model": "^1.2.1", + "raf-schd": "^4.0.3", + "react-redux": "^9.2.0", + "redux": "^5.0.1" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "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==", + "peerDependencies": { + "react-hook-form": "^7.0.0" + } + }, + "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": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - "cpu": [ - "arm64" - ], + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", - "cpu": [ - "loong64" - ], - "dev": true, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", - "cpu": [ - "mips64el" - ], - "dev": true, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, "engines": { - "node": ">=18" + "node": ">= 8" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", - "cpu": [ - "ppc64" - ], - "dev": true, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">= 8" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", - "cpu": [ - "riscv64" - ], - "dev": true, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, "engines": { - "node": ">=18" + "node": ">= 8" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", - "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", - "dependencies": { - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", - "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", - "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", - "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", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==" - }, - "node_modules/@hello-pangea/dnd": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-18.0.1.tgz", - "integrity": "sha512-xojVWG8s/TGrKT1fC8K2tIWeejJYTAeJuj36zM//yEm/ZrnZUSFGS15BpO+jGZT1ybWvyXmeDJwPYb4dhWlbZQ==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.26.7", - "css-box-model": "^1.2.1", - "raf-schd": "^4.0.3", - "react-redux": "^9.2.0", - "redux": "^5.0.1" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "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==", - "peerDependencies": { - "react-hook-form": "^7.0.0" - } - }, - "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.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@neondatabase/serverless": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@neondatabase/serverless/-/serverless-0.10.4.tgz", - "integrity": "sha512-2nZuh3VUO9voBauuh+IGYRhGU/MskWHt1IuZvHcJw6GLjDgtqj/KViKo7SIrLdGLdot7vFbiRRw+BgEy3wT9HA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/pg": "8.11.6" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "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", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "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==", + "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": { @@ -2789,218 +2332,22 @@ }, "node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", - "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", - "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", - "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", - "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", - "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", - "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", - "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", - "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", - "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", - "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", - "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", - "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", - "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", - "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", - "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "freebsd" ] }, - "node_modules/@rollup/rollup-openbsd-x64": { + "node_modules/@rollup/rollup-freebsd-x64": { "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", - "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", "cpu": [ "x64" ], @@ -3008,1795 +2355,1338 @@ "license": "MIT", "optional": true, "os": [ - "openbsd" + "freebsd" ] }, - "node_modules/@rollup/rollup-openharmony-arm64": { + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", - "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", "cpu": [ - "arm64" + "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "openharmony" + "linux" ] }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { + "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", - "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", "cpu": [ - "arm64" + "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ] }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { + "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", - "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", "cpu": [ - "ia32" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ] }, - "node_modules/@rollup/rollup-win32-x64-gnu": { + "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", - "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ] }, - "node_modules/@rollup/rollup-win32-x64-msvc": { + "node_modules/@rollup/rollup-linux-loong64-gnu": { "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", - "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", "cpu": [ - "x64" + "loong64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ] }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.15.tgz", - "integrity": "sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "postcss-selector-parser": "6.0.10" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20" - } - }, - "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@tanstack/query-core": { - "version": "5.60.5", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.60.5.tgz", - "integrity": "sha512-jiS1aC3XI3BJp83ZiTuDLerTmn9P3U95r6p+6/SNauLJaYxfIC4dMuWygwnBHIZxjn2zJqEpj3nysmPieoxfPQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.60.5", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.60.5.tgz", - "integrity": "sha512-M77bOsPwj1wYE56gk7iJvxGAr4IC12NWdIDhT+Eo8ldkWRHMvIR8I/rufIvT1OXoV/bl7EECwuRuMlxxWtvW2Q==", - "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.60.5" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "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", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-shape": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", - "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/pg": { - "version": "8.11.6", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz", - "integrity": "sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^4.0.1" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.13", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", - "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", - "devOptional": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/qs": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", - "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/react": { - "version": "18.3.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", - "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", - "devOptional": true, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } + "optional": true, + "os": [ + "openbsd" + ] }, - "node_modules/@types/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", - "devOptional": true, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@types/react": "*" - } + "optional": true, + "os": [ + "openharmony" + ] }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", - "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", - "license": "MIT" + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@vitejs/plugin-react": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", - "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", + "node_modules/@tailwindcss/typography": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.15.tgz", + "integrity": "sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.29.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-rc.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.18.0" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/@tanstack/query-core": { + "version": "5.60.5", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.60.5.tgz", + "integrity": "sha512-jiS1aC3XI3BJp83ZiTuDLerTmn9P3U95r6p+6/SNauLJaYxfIC4dMuWygwnBHIZxjn2zJqEpj3nysmPieoxfPQ==", "license": "MIT", - "engines": { - "node": ">=12" - }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, - "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==", + "node_modules/@tanstack/react-query": { + "version": "5.60.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.60.5.tgz", + "integrity": "sha512-M77bOsPwj1wYE56gk7iJvxGAr4IC12NWdIDhT+Eo8ldkWRHMvIR8I/rufIvT1OXoV/bl7EECwuRuMlxxWtvW2Q==", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@tanstack/query-core": "5.60.5" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" } }, - "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", + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "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/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==", + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" + "@babel/types": "^7.0.0" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "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==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "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" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "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==", + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@babel/types": "^7.20.7" } }, - "node_modules/body-parser": { - "version": "1.20.6", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", - "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, "license": "MIT", "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.15.1", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@types/node": "*" } }, - "node_modules/body-parser/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "license": "MIT", "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "@types/d3-color": "*" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", "license": "MIT" }, - "node_modules/body-parser/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "@types/d3-time": "*" } }, - "node_modules/brace-expansion": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", - "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@types/d3-path": "*" } }, - "node_modules/braces": { + "node_modules/@types/d3-time": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "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", - "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true, "license": "MIT" }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" + "undici-types": "~6.21.0" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/@types/prop-types": { + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "devOptional": true, + "license": "MIT" }, - "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/@types/qs": { + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", + "dev": true, + "license": "MIT" }, - "node_modules/caniuse-lite": { - "version": "1.0.30001806", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", - "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "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" + "license": "MIT" }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/@types/react": { + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "devOptional": true, "license": "MIT", + "peer": true, "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" + "@types/prop-types": "*", + "csstype": "^3.0.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", + "node_modules/@types/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "@types/mime": "^1", + "@types/node": "*" } }, - "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==", + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "license": "MIT", "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" } }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "engines": { - "node": ">=6" + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "node_modules/cmdk": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", - "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", + "node_modules/@vitejs/plugin-react": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", + "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", + "dev": true, + "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "^1.1.1", - "@radix-ui/react-dialog": "^1.1.6", - "@radix-ui/react-id": "^1.1.0", - "@radix-ui/react-primitive": "^2.0.2" + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "react-dom": "^18 || ^19 || ^19.0.0-rc" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.6" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "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": ">= 6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "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", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", + "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": ">= 0.6" + "node": ">= 8" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, + "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/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "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": ">= 0.6" + "node": ">=10" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "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": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "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": ">= 8" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/css-box-model": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", - "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "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", - "dependencies": { - "tiny-invariant": "^1.0.6" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/body-parser": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", "dependencies": { - "internmap": "1 - 2" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { - "node": ">=12" + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "license": "ISC", - "engines": { - "node": ">=12" + "node_modules/brace-expansion": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", + "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { - "d3-color": "1 - 3" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", - "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "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", + "peer": true, "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=12" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { - "d3-array": "2 - 3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", "dependencies": { - "d3-time": "1 - 3" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "peer": true, + "node": ">= 0.4" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "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", - "dependencies": { - "ms": "^2.1.3" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 6" } }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", - "license": "MIT" + "node_modules/caniuse-lite": { + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "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/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "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": ">= 0.8" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", + "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": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 6" } }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" - }, - "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/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "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==", "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" } }, - "node_modules/dotenv": { - "version": "17.4.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", - "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", - "license": "BSD-2-Clause", + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" + "node": ">=6" } }, - "node_modules/drizzle-kit": { - "version": "0.31.10", - "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.10.tgz", - "integrity": "sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==", - "dev": true, - "license": "MIT", + "node_modules/cmdk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", + "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", "dependencies": { - "@drizzle-team/brocli": "^0.10.2", - "@esbuild-kit/esm-loader": "^2.5.5", - "esbuild": "^0.25.4", - "tsx": "^4.21.0" + "@radix-ui/react-compose-refs": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.2" }, - "bin": { - "drizzle-kit": "bin.cjs" + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=18" + "node": ">=7.0.0" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, - "node_modules/drizzle-kit/node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, + "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", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": ">= 6" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "safe-buffer": "5.2.1" + }, "engines": { - "node": ">=18" + "node": ">= 0.6" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=18" + "node": ">= 0.6" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/drizzle-kit/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=18" + "node": ">= 0.6" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, "engines": { - "node": ">=18" + "node": ">= 8" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "tiny-invariant": "^1.0.6" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "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": ">=18" + "node": ">=4" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=18" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/drizzle-kit/node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=18" + "node": ">= 0.8" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=18" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/drizzle-kit/node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "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/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" } }, - "node_modules/drizzle-kit/node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, + "node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "license": "BSD-2-Clause", "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/drizzle-orm": { - "version": "0.45.2", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.2.tgz", - "integrity": "sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "@aws-sdk/client-rds-data": ">=3", - "@cloudflare/workers-types": ">=4", - "@electric-sql/pglite": ">=0.2.0", - "@libsql/client": ">=0.10.0", - "@libsql/client-wasm": ">=0.10.0", - "@neondatabase/serverless": ">=0.10.0", - "@op-engineering/op-sqlite": ">=2", - "@opentelemetry/api": "^1.4.1", - "@planetscale/database": ">=1.13", - "@prisma/client": "*", - "@tidbcloud/serverless": "*", - "@types/better-sqlite3": "*", - "@types/pg": "*", - "@types/sql.js": "*", - "@upstash/redis": ">=1.34.7", - "@vercel/postgres": ">=0.8.0", - "@xata.io/client": "*", - "better-sqlite3": ">=7", - "bun-types": "*", - "expo-sqlite": ">=14.0.0", - "gel": ">=2", - "knex": "*", - "kysely": "*", - "mysql2": ">=2", - "pg": ">=8", - "postgres": ">=3", - "sql.js": ">=1", - "sqlite3": ">=5" + "node": ">=12" }, - "peerDependenciesMeta": { - "@aws-sdk/client-rds-data": { - "optional": true - }, - "@cloudflare/workers-types": { - "optional": true - }, - "@electric-sql/pglite": { - "optional": true - }, - "@libsql/client": { - "optional": true - }, - "@libsql/client-wasm": { - "optional": true - }, - "@neondatabase/serverless": { - "optional": true - }, - "@op-engineering/op-sqlite": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@prisma/client": { - "optional": true - }, - "@tidbcloud/serverless": { - "optional": true - }, - "@types/better-sqlite3": { - "optional": true - }, - "@types/pg": { - "optional": true - }, - "@types/sql.js": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/postgres": { - "optional": true - }, - "@xata.io/client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "bun-types": { - "optional": true - }, - "expo-sqlite": { - "optional": true - }, - "gel": { - "optional": true - }, - "knex": { - "optional": true - }, - "kysely": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "postgres": { - "optional": true - }, - "prisma": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - } - } - }, - "node_modules/drizzle-zod": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/drizzle-zod/-/drizzle-zod-0.7.0.tgz", - "integrity": "sha512-xgCRYYVEzRkeXTS33GSMgoowe3vKsMNBjSI+cwG1oLQVEhAWWbqtb/AAMlm7tkmV4fG/uJjEmWzdzlEmTgWOoQ==", - "license": "Apache-2.0", - "peerDependencies": { - "drizzle-orm": ">=0.36.0", - "zod": ">=3.0.0" + "funding": { + "url": "https://dotenvx.com" } }, "node_modules/dunder-proto": { @@ -5299,19 +4189,6 @@ "node": ">= 0.4" } }, - "node_modules/get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, "node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -5910,12 +4787,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT" - }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -5986,82 +4857,6 @@ "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "license": "MIT" }, - "node_modules/pg-cloudflare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", - "license": "MIT", - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", - "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==", - "license": "MIT", - "optional": true - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "license": "ISC", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-numeric": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", - "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/pg-pool": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", - "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", - "license": "MIT", - "optional": true, - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", - "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==", - "license": "MIT" - }, - "node_modules/pg-types": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.2.tgz", - "integrity": "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==", - "license": "MIT", - "dependencies": { - "pg-int8": "1.0.1", - "pg-numeric": "1.0.2", - "postgres-array": "~3.0.1", - "postgres-bytea": "~3.0.0", - "postgres-date": "~2.1.0", - "postgres-interval": "^3.0.0", - "postgres-range": "^1.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "license": "MIT", - "optional": true, - "dependencies": { - "split2": "^4.1.0" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6242,51 +5037,6 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "license": "MIT" }, - "node_modules/postgres-array": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", - "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/postgres-bytea": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", - "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", - "license": "MIT", - "dependencies": { - "obuf": "~1.1.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postgres-date": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", - "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/postgres-interval": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", - "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/postgres-range": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz", - "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==", - "license": "MIT" - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -6709,16 +5459,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -7016,16 +5756,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -7035,27 +5765,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "optional": true, - "engines": { - "node": ">= 10.x" - } - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -7364,6 +6073,7 @@ "integrity": "sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.28.0" }, @@ -7408,6 +6118,7 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, "license": "MIT" }, "node_modules/unpipe": { @@ -7807,16 +6518,6 @@ } } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", diff --git a/package.json b/package.json index 84a2c04..5cee450 100644 --- a/package.json +++ b/package.json @@ -8,17 +8,12 @@ "build": "vite build --minify esbuild && esbuild server/index.ts --platform=node --packages=external --bundle --format=esm --outdir=dist --minify", "build:vercel": "vite build", "start": "NODE_ENV=production node dist/index.js", - "check": "tsc", - "db:generate": "drizzle-kit generate", - "db:migrate": "drizzle-kit migrate", - "db:push": "drizzle-kit push", - "db:studio": "drizzle-kit studio" + "check": "tsc" }, "dependencies": { "@hello-pangea/dnd": "^18.0.1", "@hookform/resolvers": "^3.10.0", "@jridgewell/trace-mapping": "^0.3.25", - "@neondatabase/serverless": "^0.10.4", "@radix-ui/react-accordion": "^1.2.4", "@radix-ui/react-alert-dialog": "^1.1.7", "@radix-ui/react-aspect-ratio": "^1.1.3", @@ -52,8 +47,6 @@ "cmdk": "^1.1.1", "date-fns": "^3.6.0", "dotenv": "^17.4.2", - "drizzle-orm": "^0.45.2", - "drizzle-zod": "^0.7.0", "embla-carousel-react": "^8.6.0", "express": "^4.22.2", "express-rate-limit": "^8.6.0", @@ -86,7 +79,6 @@ "@types/ws": "^8.5.13", "@vitejs/plugin-react": "^5.2.0", "autoprefixer": "^10.4.20", - "drizzle-kit": "^0.31.10", "esbuild": "^0.28.1", "postcss": "^8.5.20", "tailwindcss": "^3.4.17", diff --git a/server/cache-service.ts b/server/cache-service.ts deleted file mode 100644 index a766fd3..0000000 --- a/server/cache-service.ts +++ /dev/null @@ -1,243 +0,0 @@ -interface CacheEntry { - data: T; - timestamp: number; - ttl: number; // Time to live in milliseconds - hits: number; -} - -class InMemoryCache { - private cache = new Map>(); - private maxSize = 1000; // Maximum number of entries - private cleanupInterval: NodeJS.Timeout; - - constructor() { - // Clean up expired entries every 5 minutes - this.cleanupInterval = setInterval(() => { - this.cleanup(); - }, 5 * 60 * 1000); - } - - public set(key: string, data: T, ttlMinutes: number = 60): void { - const now = Date.now(); - - // Remove oldest entries if cache is full - if (this.cache.size >= this.maxSize) { - this.evictLRU(); - } - - this.cache.set(key, { - data, - timestamp: now, - ttl: ttlMinutes * 60 * 1000, - hits: 0 - }); - } - - public get(key: string): T | null { - const entry = this.cache.get(key); - - if (!entry) { - return null; - } - - const now = Date.now(); - - // Check if expired - if (now - entry.timestamp > entry.ttl) { - this.cache.delete(key); - return null; - } - - // Update hit count for LRU - entry.hits++; - entry.timestamp = now; // Update access time - - return entry.data; - } - - public has(key: string): boolean { - const entry = this.cache.get(key); - if (!entry) return false; - - const now = Date.now(); - if (now - entry.timestamp > entry.ttl) { - this.cache.delete(key); - return false; - } - - return true; - } - - public delete(key: string): boolean { - return this.cache.delete(key); - } - - public clear(): void { - this.cache.clear(); - } - - private cleanup(): void { - const now = Date.now(); - const keysToDelete: string[] = []; - - for (const [key, entry] of Array.from(this.cache.entries())) { - if (now - entry.timestamp > entry.ttl) { - keysToDelete.push(key); - } - } - - keysToDelete.forEach(key => this.cache.delete(key)); - - console.log(`๐Ÿงน Cache cleanup: removed ${keysToDelete.length} expired entries`); - } - - private evictLRU(): void { - // Find least recently used entry (lowest hits + oldest timestamp) - let lruKey: string | null = null; - let lruScore = Infinity; - - for (const [key, entry] of Array.from(this.cache.entries())) { - // Score based on hits and age (lower is worse) - const score = entry.hits + (Date.now() - entry.timestamp) / 1000; - - if (score < lruScore) { - lruScore = score; - lruKey = key; - } - } - - if (lruKey) { - this.cache.delete(lruKey); - console.log(`๐Ÿ“ค Evicted LRU cache entry: ${lruKey}`); - } - } - - public getStats(): { size: number; maxSize: number; hitRate: number } { - let totalHits = 0; - let totalAccesses = 0; - - for (const entry of Array.from(this.cache.values())) { - totalHits += entry.hits; - totalAccesses += entry.hits + 1; // +1 for initial set - } - - return { - size: this.cache.size, - maxSize: this.maxSize, - hitRate: totalAccesses > 0 ? totalHits / totalAccesses : 0 - }; - } - - public destroy(): void { - if (this.cleanupInterval) { - clearInterval(this.cleanupInterval); - } - this.clear(); - } -} - -// Cache instances for different data types -export const searchCache = new InMemoryCache(); -export const metadataCache = new InMemoryCache(); -export const thumbnailCache = new InMemoryCache(); - -// Helper functions for specific cache operations -export class CacheService { - // Search result caching with smart key generation - static getSearchCacheKey(filters: any): string { - const normalized = { - query: filters.query?.toLowerCase().trim(), - license: filters.license, - sort: filters.sort, - sources: Array.isArray(filters.sources) ? filters.sources.sort() : filters.sources, - yearFrom: filters.yearFrom, - yearTo: filters.yearTo, - page: filters.page, - rows: filters.rows - }; - - return `search:${JSON.stringify(normalized)}`; - } - - static cacheSearchResults(filters: any, results: any, ttlMinutes: number = 30): void { - const key = this.getSearchCacheKey(filters); - searchCache.set(key, results, ttlMinutes); - console.log(`๐Ÿ’พ Cached search results for: ${key.substring(0, 100)}...`); - } - - static getCachedSearchResults(filters: any): any | null { - const key = this.getSearchCacheKey(filters); - const cached = searchCache.get(key); - - if (cached) { - console.log(`โšก Cache hit for search: ${key.substring(0, 100)}...`); - } - - return cached; - } - - // Metadata caching - static cacheMetadata(identifier: string, metadata: any, ttlMinutes: number = 120): void { - const key = `metadata:${identifier}`; - metadataCache.set(key, metadata, ttlMinutes); - } - - static getCachedMetadata(identifier: string): any | null { - const key = `metadata:${identifier}`; - return metadataCache.get(key); - } - - // Thumbnail caching - static cacheThumbnail(identifier: string, thumbnailData: any, ttlMinutes: number = 1440): void { // 24 hours - const key = `thumbnail:${identifier}`; - thumbnailCache.set(key, thumbnailData, ttlMinutes); - } - - static getCachedThumbnail(identifier: string): any | null { - const key = `thumbnail:${identifier}`; - return thumbnailCache.get(key); - } - - // Warm up cache with popular content - static async warmupCache(): Promise { - console.log('๐Ÿ”ฅ Starting cache warmup...'); - - // Warm up with popular searches - const popularQueries = [ - 'nature', - 'documentary', - 'vintage', - 'science', - 'history' - ]; - - // This would normally be done in background - // For now, just log the intent - console.log(`๐Ÿ”ฅ Would warm up cache with queries: ${popularQueries.join(', ')}`); - } - - // Get overall cache statistics - static getStats(): any { - return { - search: searchCache.getStats(), - metadata: metadataCache.getStats(), - thumbnail: thumbnailCache.getStats() - }; - } - - // Clear all caches - static clearAll(): void { - searchCache.clear(); - metadataCache.clear(); - thumbnailCache.clear(); - console.log('๐Ÿงน All caches cleared'); - } -} - -// Graceful shutdown -process.on('SIGINT', () => { - console.log('๐Ÿ›‘ Shutting down cache service...'); - searchCache.destroy(); - metadataCache.destroy(); - thumbnailCache.destroy(); -}); \ No newline at end of file diff --git a/server/db.ts b/server/db.ts deleted file mode 100644 index f52d0b5..0000000 --- a/server/db.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Pool, neonConfig } from '@neondatabase/serverless'; -import { drizzle } from 'drizzle-orm/neon-serverless'; -import ws from "ws"; -import * as schema from "../shared/schema.js"; - -neonConfig.webSocketConstructor = ws; - -// This driver is @neondatabase/serverless, which speaks Postgres over a -// WebSocket. Only a postgres:// URL is usable; anything else (e.g. the -// sqlite:./local.db placeholder that used to ship in .env) would make the -// driver try to open wss:// and throw ENOTFOUND. Treat those -// as "no database" and fall back to the in-memory caches. -const dbUrl = process.env.DATABASE_URL; -const isPostgresUrl = !!dbUrl && /^postgres(ql)?:\/\//.test(dbUrl); -const hasRealDatabase = isPostgresUrl && !dbUrl!.includes('temp:temp@localhost'); - -if (!dbUrl) { - console.warn('โš ๏ธ No DATABASE_URL provided - running without database features'); -} else if (!hasRealDatabase) { - console.warn('โš ๏ธ DATABASE_URL is not a postgres:// URL - running without database features'); -} - -// Only create database connection if we have a real database -export const pool = hasRealDatabase ? new Pool({ connectionString: process.env.DATABASE_URL }) : null; -export const db = hasRealDatabase ? drizzle({ client: pool!, schema }) : null; - -// Export a flag to check if database is available -export const isDatabaseAvailable = hasRealDatabase; diff --git a/server/metadata-service.ts b/server/metadata-service.ts index 7547a2d..58459c4 100644 --- a/server/metadata-service.ts +++ b/server/metadata-service.ts @@ -1,8 +1,5 @@ -import { db, isDatabaseAvailable } from './db.js'; -import { metadataCacheSchema, metadataCacheTable, type MetadataCache } from '../shared/schema.js'; -import { eq, lt } from 'drizzle-orm'; +import { type MetadataCache } from '../shared/schema.js'; import crypto from 'crypto'; -import { nanoid } from 'nanoid'; const CACHE_TTL_HOURS = 48; // 48 hours cache TTL @@ -146,120 +143,23 @@ export class MetadataService { } /** - * Get cached metadata from memory or database + * Get cached metadata from memory */ async getCachedMetadata(identifier: string): Promise { - // Check memory cache first const memCache = this.cacheStore.get(identifier); if (memCache && this.isCacheValid(memCache)) { console.log(`๐Ÿ“ฆ Memory cache hit for ${identifier}`); return memCache; } - - // Check database cache - if (!isDatabaseAvailable || !db) { - return null; - } - try { - const dbResult = await db - .select() - .from(metadataCacheTable) - .where(eq(metadataCacheTable.identifier, identifier)) - .limit(1); - - if (dbResult.length > 0) { - const cached = dbResult[0]; - - // Check if cache has expired - if (new Date(cached.expiresAt) > new Date()) { - console.log(`๐Ÿ—„๏ธ Database cache hit for ${identifier}`); - - // Update access statistics - await db - .update(metadataCacheTable) - .set({ - accessCount: cached.accessCount + 1, - lastAccessed: new Date() - }) - .where(eq(metadataCacheTable.id, cached.id)); - - // Convert to MetadataCache format - const cacheData: MetadataCache = { - id: cached.id, - identifier: cached.identifier, - metadata: cached.metadata as any, - files: cached.files as any, - selectedFile: cached.selectedFile as any, - streamUrl: cached.streamUrl, - cachedAt: cached.cachedAt.toISOString(), - expiresAt: cached.expiresAt.toISOString(), - }; - - // Add to memory cache for faster subsequent access - this.cacheStore.set(identifier, cacheData); - - return cacheData; - } else { - console.log(`โฐ Database cache expired for ${identifier}, removing`); - await db - .delete(metadataCacheTable) - .where(eq(metadataCacheTable.identifier, identifier)); - } - } - - console.log(`๐Ÿ“ฆ No database cache for ${identifier}`); - return null; - } catch (error) { - console.error('Error fetching from database cache:', error); - return null; - } + return null; } /** - * Save metadata to cache (memory and database) + * Save metadata to memory cache */ async saveToCache(identifier: string, cache: MetadataCache): Promise { - // Save to memory cache this.cacheStore.set(identifier, cache); console.log(`๐Ÿ’พ Saved ${identifier} to memory cache`); - - // Save to database - if (!isDatabaseAvailable || !db) { - return; - } - try { - const expiresAt = new Date(); - expiresAt.setHours(expiresAt.getHours() + CACHE_TTL_HOURS); - - await db - .insert(metadataCacheTable) - .values({ - id: nanoid(), - identifier: cache.identifier, - metadata: cache.metadata, - files: cache.files, - selectedFile: cache.selectedFile, - streamUrl: cache.streamUrl, - expiresAt: expiresAt, - accessCount: 1, - }) - .onConflictDoUpdate({ - target: metadataCacheTable.identifier, - set: { - metadata: cache.metadata, - files: cache.files, - selectedFile: cache.selectedFile, - streamUrl: cache.streamUrl, - expiresAt: expiresAt, - accessCount: 1, - lastAccessed: new Date(), - }, - }); - - console.log(`๐Ÿ’พ Saved ${identifier} to database cache`); - } catch (error) { - console.error('Error saving to database cache:', error); - } } /** @@ -383,10 +283,9 @@ export class MetadataService { } /** - * Clean up expired cache entries (memory and database) + * Clean up expired cache entries */ async cleanupExpiredCache(): Promise { - // Clean memory cache const entries = Array.from(this.cacheStore.entries()); for (const [identifier, cache] of entries) { if (!this.isCacheValid(cache)) { @@ -394,19 +293,6 @@ export class MetadataService { console.log(`๐Ÿ—‘๏ธ Removed expired cache for ${identifier}`); } } - - // Clean database cache - if (isDatabaseAvailable && db) { - try { - await db - .delete(metadataCacheTable) - .where(lt(metadataCacheTable.expiresAt, new Date())); - - console.log(`๐Ÿงน Cleaned up expired metadata cache entries from database`); - } catch (error) { - console.error('Error cleaning up expired metadata cache:', error); - } - } } } diff --git a/server/routes.ts b/server/routes.ts index 5ceb1da..89e7e8c 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -2,9 +2,7 @@ import type { Express } from "express"; import { searchFiltersSchema } from "../shared/schema.js"; import rateLimit from "express-rate-limit"; import { metadataService } from "./metadata-service.js"; -import { transcodeService } from "./transcode-service.js"; import { searchCacheService } from "./search-cache-service.js"; -import { promises as fs } from 'fs'; import path from 'path'; import express from 'express'; @@ -542,208 +540,4 @@ export async function registerRoutes(app: Express): Promise { } }); - // Check video cache and enqueue transcoding if needed - app.get("/api/cache/:identifier", apiLimiter, async (req, res) => { - try { - const { identifier } = req.params; - - // Check if video is already cached - const cacheStatus = await transcodeService.isCached(identifier); - - if (cacheStatus.cached) { - res.json({ - cached: true, - paths: { - mp4: cacheStatus.mp4Path, - hls: cacheStatus.hlsPath, - dash: cacheStatus.dashPath, - } - }); - return; - } - - // Not cached - check if job is already running - const existingJobs = transcodeService.getJobsByIdentifier(identifier); - const activeJob = existingJobs.find(job => - job.status === 'pending' || - job.status === 'downloading' || - job.status === 'transcoding' - ); - - if (activeJob) { - res.json({ - cached: false, - warming: true, - jobId: activeJob.id, - status: activeJob.status, - progress: activeJob.progress - }); - return; - } - - // Get metadata to find source URL - const metadata = await metadataService.fetchMetadata(identifier); - - if (!metadata.selectedFile) { - res.status(404).json({ error: "No suitable video file found" }); - return; - } - - // Enqueue transcoding job - const sourceUrl = `https://archive.org/download/${identifier}/${metadata.selectedFile.name}`; - const jobId = await transcodeService.enqueueJob(identifier, sourceUrl); - - res.json({ - cached: false, - warming: true, - jobId, - status: 'pending', - progress: 0 - }); - - } catch (error) { - console.error("Cache check error:", error); - res.status(500).json({ error: "Failed to check cache" }); - } - }); - - // Get transcoding job status - app.get("/api/jobs/:jobId", apiLimiter, async (req, res) => { - try { - const { jobId } = req.params; - const job = transcodeService.getJob(jobId); - - if (!job) { - res.status(404).json({ error: "Job not found" }); - return; - } - - res.json({ - id: job.id, - identifier: job.identifier, - status: job.status, - progress: job.progress, - createdAt: job.createdAt, - completedAt: job.completedAt, - error: job.error, - outputPaths: job.outputPaths - }); - - } catch (error) { - console.error("Job status error:", error); - res.status(500).json({ error: "Failed to get job status" }); - } - }); - - // Serve cached videos - app.get("/api/cached-video/:identifier", apiLimiter, async (req, res) => { - try { - const { identifier } = req.params; - const cacheStatus = await transcodeService.isCached(identifier); - - if (!cacheStatus.cached || !cacheStatus.mp4Path) { - res.status(404).json({ error: "Video not cached" }); - return; - } - - // Handle range requests for the cached file - const range = req.headers.range; - const videoPath = cacheStatus.mp4Path; - const stats = await fs.stat(videoPath); - const fileSize = stats.size; - - if (range) { - const parts = range.replace(/bytes=/, "").split("-"); - const start = parseInt(parts[0], 10); - const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1; - const chunksize = (end - start) + 1; - - const stream = (await fs.open(videoPath, 'r')).createReadStream({ start, end }); - - res.status(206).set({ - 'Content-Range': `bytes ${start}-${end}/${fileSize}`, - 'Accept-Ranges': 'bytes', - 'Content-Length': chunksize.toString(), - 'Content-Type': 'video/mp4', - 'Cache-Control': 'public, max-age=31536000', // 1 year cache - }); - - stream.pipe(res); - } else { - res.set({ - 'Content-Length': fileSize.toString(), - 'Content-Type': 'video/mp4', - 'Accept-Ranges': 'bytes', - 'Cache-Control': 'public, max-age=31536000', // 1 year cache - }); - - const stream = (await fs.open(videoPath, 'r')).createReadStream(); - stream.pipe(res); - } - - } catch (error) { - console.error("Cached video serve error:", error); - res.status(500).json({ error: "Failed to serve cached video" }); - } - }); - - // Serve HLS playlists and segments - app.get("/api/hls/:identifier/:file", apiLimiter, async (req, res) => { - try { - const { identifier, file } = req.params; - const hlsDir = path.join(process.env.VIDEO_CACHE_DIR || path.join(process.cwd(), 'video-cache'), 'hls', identifier); - const filePath = path.join(hlsDir, file); - - // Security check - ensure file is within HLS directory - if (!filePath.startsWith(hlsDir)) { - res.status(403).json({ error: "Forbidden" }); - return; - } - - // Check if file exists - try { - await fs.access(filePath); - } catch { - res.status(404).json({ error: "HLS file not found" }); - return; - } - - // Set appropriate content type - const contentType = file.endsWith('.m3u8') ? 'application/vnd.apple.mpegurl' : - file.endsWith('.ts') ? 'video/mp2t' : - 'application/octet-stream'; - - res.set({ - 'Content-Type': contentType, - 'Cache-Control': file.endsWith('.m3u8') ? 'no-cache' : 'public, max-age=31536000', - 'Access-Control-Allow-Origin': '*', - }); - - const stream = (await fs.open(filePath, 'r')).createReadStream(); - stream.pipe(res); - - } catch (error) { - console.error("HLS serve error:", error); - res.status(500).json({ error: "Failed to serve HLS file" }); - } - }); - - // Cache statistics - app.get("/api/cache-stats", async (req, res) => { - try { - const [transcodeStats, searchCacheStats] = await Promise.all([ - transcodeService.getCacheStats(), - searchCacheService.getCacheStats(), - ]); - - res.json({ - transcode: transcodeStats, - searchCache: searchCacheStats, - timestamp: new Date().toISOString() - }); - } catch (error) { - console.error("Cache stats error:", error); - res.status(500).json({ error: "Failed to get cache stats" }); - } - }); } diff --git a/server/search-cache-service.ts b/server/search-cache-service.ts index 7cbdbee..21a4a22 100644 --- a/server/search-cache-service.ts +++ b/server/search-cache-service.ts @@ -1,10 +1,7 @@ -import { db, isDatabaseAvailable } from './db.js'; -import { searchCacheTable, type SearchFilters } from '../shared/schema.js'; -import { eq, lt } from 'drizzle-orm'; +import { type SearchFilters } from '../shared/schema.js'; import crypto from 'crypto'; -import { nanoid } from 'nanoid'; -const SEARCH_CACHE_TTL_HOURS = 6; // 6 hours cache TTL for search results +const SEARCH_CACHE_TTL_HOURS = 6; export interface SearchResult { docs: any[]; @@ -12,25 +9,16 @@ export interface SearchResult { start: number; } -export interface CachedSearchResult { - id: string; +interface CachedSearchResult { queryHash: string; - query: string; - filters: SearchFilters; results: SearchResult; - totalResults: number; - cachedAt: string; expiresAt: string; - hitCount: number; } class SearchCacheService { private memoryCache = new Map(); - private readonly maxMemoryCache = 100; // Maximum entries in memory + private readonly maxMemoryCache = 100; - /** - * Generate a hash for the search query and filters - */ private generateQueryHash(filters: SearchFilters): string { const queryString = JSON.stringify({ query: filters.query.toLowerCase().trim(), @@ -42,217 +30,52 @@ class SearchCacheService { sort: filters.sort, page: filters.page, rows: filters.rows, - sources: filters.sources?.sort(), // Sort to ensure consistent ordering + sources: filters.sources?.sort(), allowRestrictedLicenses: filters.allowRestrictedLicenses, }); - + return crypto.createHash('sha256').update(queryString).digest('hex'); } - /** - * Get cached search results - */ async getCachedResults(filters: SearchFilters): Promise { const queryHash = this.generateQueryHash(filters); - - // Check memory cache first - const memoryResult = this.memoryCache.get(queryHash); - if (memoryResult && new Date(memoryResult.expiresAt) > new Date()) { - console.log(`๐ŸŽฏ Search memory cache hit for query: ${filters.query}`); - return memoryResult.results; - } - - // Check database cache (only if database is available) - if (isDatabaseAvailable && db) { - try { - const dbResult = await db - .select() - .from(searchCacheTable) - .where(eq(searchCacheTable.queryHash, queryHash)) - .limit(1); - - if (dbResult.length > 0) { - const cached = dbResult[0]; - - // Check if cache has expired - if (new Date(cached.expiresAt) > new Date()) { - console.log(`๐Ÿ—„๏ธ Search database cache hit for query: ${filters.query}`); - - // Update hit count and last accessed - await db - .update(searchCacheTable) - .set({ - hitCount: cached.hitCount + 1, - lastAccessed: new Date() - }) - .where(eq(searchCacheTable.id, cached.id)); - - // Convert to cached result format - const cacheData: CachedSearchResult = { - id: cached.id, - queryHash: cached.queryHash, - query: cached.query, - filters: cached.filters as SearchFilters, - results: cached.results as SearchResult, - totalResults: cached.totalResults, - cachedAt: cached.cachedAt.toISOString(), - expiresAt: cached.expiresAt.toISOString(), - hitCount: cached.hitCount, - }; - - // Add to memory cache for faster subsequent access - this.addToMemoryCache(queryHash, cacheData); - - return cacheData.results; - } else { - console.log(`โฐ Search cache expired for query: ${filters.query}, removing`); - await db - .delete(searchCacheTable) - .where(eq(searchCacheTable.queryHash, queryHash)); - } - } - - console.log(`๐Ÿ“ฆ No search cache for query: ${filters.query}`); - return null; - } catch (error) { - console.error('Error fetching from search cache:', error); - return null; - } + const cached = this.memoryCache.get(queryHash); + if (cached && new Date(cached.expiresAt) > new Date()) { + // Refresh LRU position + this.memoryCache.delete(queryHash); + this.memoryCache.set(queryHash, cached); + return cached.results; } - - // If database not available, just return null (cache miss) + if (cached) this.memoryCache.delete(queryHash); return null; } - /** - * Save search results to cache - */ async saveResults(filters: SearchFilters, results: SearchResult): Promise { const queryHash = this.generateQueryHash(filters); const expiresAt = new Date(); expiresAt.setHours(expiresAt.getHours() + SEARCH_CACHE_TTL_HOURS); - const cacheData: CachedSearchResult = { - id: nanoid(), - queryHash, - query: filters.query, - filters, - results, - totalResults: results.numFound, - cachedAt: new Date().toISOString(), - expiresAt: expiresAt.toISOString(), - hitCount: 1, - }; - - // Save to memory cache - this.addToMemoryCache(queryHash, cacheData); - - // Save to database (only if available) - if (isDatabaseAvailable && db) { - try { - await db - .insert(searchCacheTable) - .values({ - id: cacheData.id, - queryHash: queryHash, - query: filters.query, - filters: filters, - results: results, - totalResults: results.numFound, - expiresAt: expiresAt, - hitCount: 1, - }) - .onConflictDoUpdate({ - target: searchCacheTable.queryHash, - set: { - query: filters.query, - filters: filters, - results: results, - totalResults: results.numFound, - expiresAt: expiresAt, - hitCount: 1, - lastAccessed: new Date(), - }, - }); - - console.log(`๐Ÿ’พ Saved search results to cache for query: ${filters.query}`); - } catch (error) { - console.error('Error saving search results to cache:', error); - } - } else { - console.log(`๐Ÿ’พ Saved search results to memory cache for query: ${filters.query}`); - } - } - - /** - * Add to memory cache with LRU eviction - */ - private addToMemoryCache(queryHash: string, cacheData: CachedSearchResult): void { - // Remove oldest entries if cache is full if (this.memoryCache.size >= this.maxMemoryCache) { - // Simple LRU: remove first entry (oldest) const firstKey = this.memoryCache.keys().next().value; - if (firstKey) { - this.memoryCache.delete(firstKey); - } + if (firstKey) this.memoryCache.delete(firstKey); } - - this.memoryCache.set(queryHash, cacheData); + this.memoryCache.set(queryHash, { queryHash, results, expiresAt: expiresAt.toISOString() }); } - /** - * Clean up expired cache entries - */ async cleanupExpiredCache(): Promise { - try { - // Clean database cache (only if available) - if (isDatabaseAvailable && db) { - const result = await db - .delete(searchCacheTable) - .where(lt(searchCacheTable.expiresAt, new Date())); - - console.log(`๐Ÿงน Cleaned up expired search cache entries from database`); - } - - // Clean memory cache - for (const [key, value] of this.memoryCache.entries()) { - if (new Date(value.expiresAt) <= new Date()) { - this.memoryCache.delete(key); - } + const now = new Date(); + for (const [key, value] of this.memoryCache.entries()) { + if (new Date(value.expiresAt) <= now) { + this.memoryCache.delete(key); } - console.log(`๐Ÿงน Cleaned up expired search cache entries from memory`); - } catch (error) { - console.error('Error cleaning up expired search cache:', error); } } - /** - * Get cache statistics - */ async getCacheStats() { - try { - let databaseEntries = 0; - - if (isDatabaseAvailable && db) { - const totalEntries = await db - .select({ count: searchCacheTable.id }) - .from(searchCacheTable); - databaseEntries = totalEntries.length; - } - - return { - memoryEntries: this.memoryCache.size, - databaseEntries, - maxMemoryEntries: this.maxMemoryCache, - }; - } catch (error) { - console.error('Error getting cache stats:', error); - return { - memoryEntries: this.memoryCache.size, - databaseEntries: 0, - maxMemoryEntries: this.maxMemoryCache, - }; - } + return { + memoryEntries: this.memoryCache.size, + maxMemoryEntries: this.maxMemoryCache, + }; } } diff --git a/server/transcode-service.ts b/server/transcode-service.ts deleted file mode 100644 index eb3830d..0000000 --- a/server/transcode-service.ts +++ /dev/null @@ -1,523 +0,0 @@ -import { spawn } from 'child_process'; -import { promises as fs } from 'fs'; -import path from 'path'; -import crypto from 'crypto'; - -export interface TranscodeJob { - id: string; - identifier: string; - sourceUrl: string; - status: 'pending' | 'downloading' | 'transcoding' | 'completed' | 'failed'; - progress: number; - createdAt: Date; - completedAt?: Date; - error?: string; - outputPaths: { - mp4?: string; - hls?: string; - dash?: string; - }; -} - -export interface TranscodeOptions { - createHLS?: boolean; - createDASH?: boolean; - videoCodec?: string; - audioCodec?: string; - videoBitrate?: string; - audioBitrate?: string; - resolution?: string; -} - -class TranscodeService { - private jobs = new Map(); - private cacheDir: string; - private processingQueue: string[] = []; - private isProcessing = false; - - constructor() { - this.cacheDir = process.env.VIDEO_CACHE_DIR || path.join(process.cwd(), 'video-cache'); - this.ensureCacheDir(); - } - - private async ensureCacheDir() { - try { - await fs.mkdir(this.cacheDir, { recursive: true }); - await fs.mkdir(path.join(this.cacheDir, 'mp4'), { recursive: true }); - await fs.mkdir(path.join(this.cacheDir, 'hls'), { recursive: true }); - await fs.mkdir(path.join(this.cacheDir, 'dash'), { recursive: true }); - } catch (error) { - console.error('Failed to create cache directories:', error); - } - } - - /** - * Check if FFmpeg is available - */ - async checkFFmpeg(): Promise { - return new Promise((resolve) => { - const ffmpeg = spawn('ffmpeg', ['-version']); - ffmpeg.on('error', () => resolve(false)); - ffmpeg.on('close', (code) => resolve(code === 0)); - }); - } - - /** - * Generate unique job ID - */ - private generateJobId(identifier: string): string { - const timestamp = Date.now(); - const hash = crypto.createHash('md5').update(`${identifier}-${timestamp}`).digest('hex').substring(0, 8); - return `${identifier}-${hash}`; - } - - /** - * Check if video is already cached - */ - async isCached(identifier: string): Promise<{ - cached: boolean; - mp4Path?: string; - hlsPath?: string; - dashPath?: string; - }> { - const mp4Path = path.join(this.cacheDir, 'mp4', `${identifier}.mp4`); - const hlsPath = path.join(this.cacheDir, 'hls', identifier, 'playlist.m3u8'); - const dashPath = path.join(this.cacheDir, 'dash', identifier, 'manifest.mpd'); - - try { - const [mp4Exists, hlsExists, dashExists] = await Promise.all([ - fs.access(mp4Path).then(() => true).catch(() => false), - fs.access(hlsPath).then(() => true).catch(() => false), - fs.access(dashPath).then(() => true).catch(() => false), - ]); - - return { - cached: mp4Exists || hlsExists || dashExists, - mp4Path: mp4Exists ? mp4Path : undefined, - hlsPath: hlsExists ? hlsPath : undefined, - dashPath: dashExists ? dashPath : undefined, - }; - } catch (error) { - return { cached: false }; - } - } - - /** - * Enqueue a transcoding job - */ - async enqueueJob( - identifier: string, - sourceUrl: string, - options: TranscodeOptions = {} - ): Promise { - const jobId = this.generateJobId(identifier); - - const job: TranscodeJob = { - id: jobId, - identifier, - sourceUrl, - status: 'pending', - progress: 0, - createdAt: new Date(), - outputPaths: {}, - }; - - this.jobs.set(jobId, job); - this.processingQueue.push(jobId); - - console.log(`๐Ÿ“‹ Enqueued transcoding job: ${jobId} for ${identifier}`); - - // Start processing if not already running - if (!this.isProcessing) { - this.processQueue(); - } - - return jobId; - } - - /** - * Get job status - */ - getJob(jobId: string): TranscodeJob | undefined { - return this.jobs.get(jobId); - } - - /** - * Get jobs by identifier - */ - getJobsByIdentifier(identifier: string): TranscodeJob[] { - return Array.from(this.jobs.values()).filter(job => job.identifier === identifier); - } - - /** - * Process the job queue - */ - private async processQueue() { - if (this.isProcessing || this.processingQueue.length === 0) { - return; - } - - this.isProcessing = true; - - while (this.processingQueue.length > 0) { - const jobId = this.processingQueue.shift()!; - const job = this.jobs.get(jobId); - - if (!job) continue; - - try { - await this.processJob(job); - } catch (error) { - console.error(`โŒ Job ${jobId} failed:`, error); - job.status = 'failed'; - job.error = error instanceof Error ? error.message : 'Unknown error'; - } - } - - this.isProcessing = false; - } - - /** - * Process a single job - */ - private async processJob(job: TranscodeJob) { - console.log(`๐Ÿ”„ Processing job: ${job.id}`); - - // Update status to downloading - job.status = 'downloading'; - job.progress = 0; - - // Download the source file - const tempInputPath = path.join(this.cacheDir, `temp_${job.id}_input`); - - try { - await this.downloadFile(job.sourceUrl, tempInputPath, (progress) => { - job.progress = Math.floor(progress * 30); // 30% for download - }); - - // Update status to transcoding - job.status = 'transcoding'; - - // Transcode to MP4 - const mp4Path = path.join(this.cacheDir, 'mp4', `${job.identifier}.mp4`); - await this.transcodeToMP4(tempInputPath, mp4Path, (progress) => { - job.progress = 30 + Math.floor(progress * 50); // 50% for MP4 - }); - - job.outputPaths.mp4 = mp4Path; - - // Create HLS if requested (optional enhancement) - // This can be expanded based on ancient codec detection - const shouldCreateHLS = await this.shouldCreateHLS(tempInputPath); - if (shouldCreateHLS) { - const hlsDir = path.join(this.cacheDir, 'hls', job.identifier); - await fs.mkdir(hlsDir, { recursive: true }); - - await this.transcodeToHLS(tempInputPath, hlsDir, (progress) => { - job.progress = 80 + Math.floor(progress * 20); // 20% for HLS - }); - - job.outputPaths.hls = path.join(hlsDir, 'playlist.m3u8'); - } - - // Clean up temp file - await fs.unlink(tempInputPath); - - job.status = 'completed'; - job.progress = 100; - job.completedAt = new Date(); - - console.log(`โœ… Job completed: ${job.id}`); - - } catch (error) { - // Clean up temp file on error - try { - await fs.unlink(tempInputPath); - } catch {} - - throw error; - } - } - - /** - * Download file with progress - */ - private async downloadFile(url: string, outputPath: string, onProgress?: (progress: number) => void): Promise { - return new Promise((resolve, reject) => { - (async () => { - try { - const response = await fetch(url); - if (!response.ok) { - reject(new Error(`Download failed: ${response.status} ${response.statusText}`)); - return; - } - - const totalSize = parseInt(response.headers.get('content-length') || '0'); - let downloadedSize = 0; - - const fileStream = await fs.open(outputPath, 'w'); - const writer = fileStream.createWriteStream(); - - if (!response.body) { - reject(new Error('No response body')); - return; - } - - const reader = response.body.getReader(); - - const pump = async (): Promise => { - try { - const { done, value } = await reader.read(); - if (done) { - await writer.end(); - await fileStream.close(); - resolve(); - return; - } - - downloadedSize += value.length; - writer.write(Buffer.from(value)); - - if (onProgress && totalSize > 0) { - onProgress(downloadedSize / totalSize); - } - - return pump(); - } catch (error) { - await writer.destroy(); - await fileStream.close(); - reject(error); - } - }; - - return pump(); - } catch (error) { - reject(error); - } - })(); - }); - } - - /** - * Transcode to MP4 using FFmpeg - */ - private async transcodeToMP4(inputPath: string, outputPath: string, onProgress?: (progress: number) => void): Promise { - return new Promise((resolve, reject) => { - const args = [ - '-i', inputPath, - '-c:v', 'libx264', - '-preset', 'fast', - '-crf', '23', - '-c:a', 'aac', - '-b:a', '128k', - '-movflags', '+faststart', - '-y', // Overwrite output - outputPath - ]; - - const ffmpeg = spawn('ffmpeg', args); - - let duration = 0; - - ffmpeg.stderr.on('data', (data) => { - const output = data.toString(); - - // Parse duration - const durationMatch = output.match(/Duration: (\d+):(\d+):(\d+\.\d+)/); - if (durationMatch) { - const [, hours, minutes, seconds] = durationMatch; - duration = parseInt(hours) * 3600 + parseInt(minutes) * 60 + parseFloat(seconds); - } - - // Parse progress - const timeMatch = output.match(/time=(\d+):(\d+):(\d+\.\d+)/); - if (timeMatch && duration > 0) { - const [, hours, minutes, seconds] = timeMatch; - const currentTime = parseInt(hours) * 3600 + parseInt(minutes) * 60 + parseFloat(seconds); - const progress = Math.min(currentTime / duration, 1.0); - - if (onProgress) { - onProgress(progress); - } - } - }); - - ffmpeg.on('error', reject); - ffmpeg.on('close', (code) => { - if (code === 0) { - resolve(); - } else { - reject(new Error(`FFmpeg exited with code ${code}`)); - } - }); - }); - } - - /** - * Get cache statistics - */ - async getCacheStats(): Promise<{ - totalFiles: number; - totalSize: number; - jobsInQueue: number; - activeJobs: number; - }> { - try { - const mp4Dir = path.join(this.cacheDir, 'mp4'); - const files = await fs.readdir(mp4Dir); - - let totalSize = 0; - for (const file of files) { - try { - const stats = await fs.stat(path.join(mp4Dir, file)); - totalSize += stats.size; - } catch {} - } - - const activeJobs = Array.from(this.jobs.values()).filter( - job => job.status === 'downloading' || job.status === 'transcoding' - ).length; - - return { - totalFiles: files.length, - totalSize, - jobsInQueue: this.processingQueue.length, - activeJobs, - }; - } catch (error) { - return { - totalFiles: 0, - totalSize: 0, - jobsInQueue: this.processingQueue.length, - activeJobs: 0, - }; - } - } - - /** - * Check if we should create HLS for better compatibility - */ - private async shouldCreateHLS(inputPath: string): Promise { - return new Promise((resolve) => { - const ffprobe = spawn('ffprobe', [ - '-v', 'quiet', - '-print_format', 'json', - '-show_format', - '-show_streams', - inputPath - ]); - - let output = ''; - ffprobe.stdout.on('data', (data) => { - output += data.toString(); - }); - - ffprobe.on('close', (code) => { - if (code !== 0) { - resolve(false); - return; - } - - try { - const info = JSON.parse(output); - const videoStream = info.streams?.find((s: any) => s.codec_type === 'video'); - - // Create HLS for ancient codecs or very large files - const isAncientCodec = videoStream && ![ - 'h264', 'h.264', 'avc1', 'mp4v', 'libx264' - ].includes(videoStream.codec_name?.toLowerCase()); - - const isLargeFile = info.format?.size && parseInt(info.format.size) > 100 * 1024 * 1024; // 100MB - - resolve(isAncientCodec || isLargeFile || false); - } catch (error) { - resolve(false); - } - }); - - ffprobe.on('error', () => resolve(false)); - }); - } - - /** - * Transcode to HLS for better streaming - */ - private async transcodeToHLS(inputPath: string, outputDir: string, onProgress?: (progress: number) => void): Promise { - return new Promise((resolve, reject) => { - const playlistPath = path.join(outputDir, 'playlist.m3u8'); - - const args = [ - '-i', inputPath, - '-c:v', 'libx264', - '-preset', 'fast', - '-crf', '23', - '-c:a', 'aac', - '-b:a', '128k', - '-f', 'hls', - '-hls_time', '6', - '-hls_playlist_type', 'vod', - '-hls_segment_filename', path.join(outputDir, 'segment_%03d.ts'), - '-y', // Overwrite output - playlistPath - ]; - - const ffmpeg = spawn('ffmpeg', args); - let duration = 0; - - ffmpeg.stderr.on('data', (data) => { - const output = data.toString(); - - // Parse duration - const durationMatch = output.match(/Duration: (\d+):(\d+):(\d+\.\d+)/); - if (durationMatch) { - const [, hours, minutes, seconds] = durationMatch; - duration = parseInt(hours) * 3600 + parseInt(minutes) * 60 + parseFloat(seconds); - } - - // Parse progress - const timeMatch = output.match(/time=(\d+):(\d+):(\d+\.\d+)/); - if (timeMatch && duration > 0) { - const [, hours, minutes, seconds] = timeMatch; - const currentTime = parseInt(hours) * 3600 + parseInt(minutes) * 60 + parseFloat(seconds); - const progress = Math.min(currentTime / duration, 1.0); - - if (onProgress) { - onProgress(progress); - } - } - }); - - ffmpeg.on('error', reject); - ffmpeg.on('close', (code) => { - if (code === 0) { - resolve(); - } else { - reject(new Error(`HLS transcoding failed with code ${code}`)); - } - }); - }); - } - - clearOldJobs(hoursOld: number = 24) { - const cutoff = new Date(Date.now() - hoursOld * 60 * 60 * 1000); - const jobsToDelete: string[] = []; - - for (const [jobId, job] of Array.from(this.jobs.entries())) { - if (job.status === 'completed' && job.completedAt && job.completedAt < cutoff) { - jobsToDelete.push(jobId); - } - } - - for (const jobId of jobsToDelete) { - this.jobs.delete(jobId); - } - } -} - -// Export singleton instance -export const transcodeService = new TranscodeService(); - -// Periodic cleanup -setInterval(() => { - transcodeService.clearOldJobs(24); -}, 60 * 60 * 1000); // Every hour \ No newline at end of file diff --git a/shared/schema.ts b/shared/schema.ts index a5570ec..d5e6d01 100644 --- a/shared/schema.ts +++ b/shared/schema.ts @@ -1,5 +1,4 @@ import { z } from "zod"; -import { pgTable, text, timestamp, integer, json, boolean, index } from "drizzle-orm/pg-core"; // Archive.org video metadata schema export const videoSchema = z.object({ @@ -131,71 +130,3 @@ export const metadataCacheSchema = z.object({ }); export type MetadataCache = z.infer; - -// Database Tables -export const metadataCacheTable = pgTable('metadata_cache', { - id: text('id').primaryKey(), - identifier: text('identifier').notNull().unique(), - metadata: json('metadata').notNull(), - files: json('files').notNull(), - selectedFile: json('selected_file').notNull(), - streamUrl: text('stream_url').notNull(), - cachedAt: timestamp('cached_at').defaultNow().notNull(), - expiresAt: timestamp('expires_at').notNull(), - accessCount: integer('access_count').default(0).notNull(), - lastAccessed: timestamp('last_accessed').defaultNow(), -}, (table) => ({ - identifierIdx: index('metadata_cache_identifier_idx').on(table.identifier), - expiresAtIdx: index('metadata_cache_expires_at_idx').on(table.expiresAt), -})); - -export const searchCacheTable = pgTable('search_cache', { - id: text('id').primaryKey(), - queryHash: text('query_hash').notNull().unique(), - query: text('query').notNull(), - filters: json('filters').notNull(), - results: json('results').notNull(), - totalResults: integer('total_results').notNull(), - cachedAt: timestamp('cached_at').defaultNow().notNull(), - expiresAt: timestamp('expires_at').notNull(), - hitCount: integer('hit_count').default(1).notNull(), - lastAccessed: timestamp('last_accessed').defaultNow(), -}, (table) => ({ - queryHashIdx: index('search_cache_query_hash_idx').on(table.queryHash), - expiresAtIdx: index('search_cache_expires_at_idx').on(table.expiresAt), -})); - -export const edlSessionTable = pgTable('edl_sessions', { - id: text('id').primaryKey(), - name: text('name').notNull(), - startTime: timestamp('start_time').notNull(), - endTime: timestamp('end_time'), - totalDuration: text('total_duration'), - venue: text('venue'), - description: text('description'), - metadata: json('metadata'), - createdAt: timestamp('created_at').defaultNow().notNull(), - updatedAt: timestamp('updated_at').defaultNow().notNull(), -}, (table) => ({ - nameIdx: index('edl_sessions_name_idx').on(table.name), - startTimeIdx: index('edl_sessions_start_time_idx').on(table.startTime), -})); - -export const edlEventTable = pgTable('edl_events', { - id: text('id').primaryKey(), - sessionId: text('session_id').notNull().references(() => edlSessionTable.id, { onDelete: 'cascade' }), - timestamp: timestamp('timestamp').notNull(), - eventType: text('event_type').notNull(), - clipId: text('clip_id').notNull(), - clipTitle: text('clip_title').notNull(), - timecode: text('timecode').notNull(), - trimIn: text('trim_in').notNull(), - trimOut: text('trim_out').notNull(), - parameters: json('parameters'), - notes: text('notes'), - createdAt: timestamp('created_at').defaultNow().notNull(), -}, (table) => ({ - sessionIdIdx: index('edl_events_session_id_idx').on(table.sessionId), - timestampIdx: index('edl_events_timestamp_idx').on(table.timestamp), - eventTypeIdx: index('edl_events_event_type_idx').on(table.eventType), -})); From 5164ac4f7d1a5002fd44e4a7580ca5f4262b23d4 Mon Sep 17 00:00:00 2001 From: "robb.fladry" Date: Sun, 19 Jul 2026 18:14:57 -0400 Subject: [PATCH 3/8] refactor(phase-0): remove soundboards, easter eggs, and novelty modes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CoreSoundboards, EasterEgg + hook, AsciiModeIndicator, ASCII terminal mode, Blondie geometry mode, and Hulkster mode. Learning-era chrome per PRD ยง6. Co-Authored-By: Claude Fable 5 --- client/src/App.tsx | 6 - client/src/components/AsciiModeIndicator.tsx | 25 ---- client/src/components/CoreSoundboards.tsx | 144 ------------------- client/src/components/EasterEgg.tsx | 84 ----------- client/src/components/KeyboardShortcuts.tsx | 14 +- client/src/hooks/use-easter-egg.tsx | 56 -------- client/src/lib/store.ts | 11 -- client/src/lib/types.ts | 1 - client/src/pages/home.tsx | 13 +- 9 files changed, 4 insertions(+), 350 deletions(-) delete mode 100644 client/src/components/AsciiModeIndicator.tsx delete mode 100644 client/src/components/CoreSoundboards.tsx delete mode 100644 client/src/components/EasterEgg.tsx delete mode 100644 client/src/hooks/use-easter-egg.tsx diff --git a/client/src/App.tsx b/client/src/App.tsx index f61a7db..96416ef 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -3,11 +3,8 @@ import { queryClient } from "./lib/queryClient"; import { QueryClientProvider } from "@tanstack/react-query"; import { Toaster } from "@/components/ui/toaster"; import { TooltipProvider } from "@/components/ui/tooltip"; -import { EasterEgg } from "@/components/EasterEgg"; -import { useEasterEgg } from "@/hooks/use-easter-egg"; import { DragDropProvider } from "@/components/DragDropProvider"; import { KeyboardShortcuts } from "@/components/KeyboardShortcuts"; -import { AsciiModeIndicator } from "@/components/AsciiModeIndicator"; import { CommandPalette } from "@/components/CommandPalette"; import { useCommandPalette } from "@/hooks/use-command-palette"; import Home from "@/pages/home"; @@ -23,7 +20,6 @@ function Router() { } function App() { - const { isEasterEggActive, closeEasterEgg } = useEasterEgg(); const { isOpen: isCommandPaletteOpen, close: closeCommandPalette } = useCommandPalette(); return ( @@ -32,9 +28,7 @@ function App() { - - diff --git a/client/src/components/AsciiModeIndicator.tsx b/client/src/components/AsciiModeIndicator.tsx deleted file mode 100644 index 32eb0ac..0000000 --- a/client/src/components/AsciiModeIndicator.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { useStore } from '@/lib/store'; -import { Terminal, X } from 'lucide-react'; -import { Button } from '@/components/ui/button'; - -export function AsciiModeIndicator() { - const { isAsciiMode, setAsciiMode } = useStore(); - - if (!isAsciiMode) return null; - - return ( -
- - ASCII TERMINAL MODE - -
- ); -} \ No newline at end of file diff --git a/client/src/components/CoreSoundboards.tsx b/client/src/components/CoreSoundboards.tsx deleted file mode 100644 index df2c75e..0000000 --- a/client/src/components/CoreSoundboards.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import { useState } from 'react'; -import { Button } from '@/components/ui/button'; -import { Badge } from '@/components/ui/badge'; -import { Volume2 } from 'lucide-react'; -import { useStore } from '@/lib/store'; -// Simple TTS implementation -const speakText = (text: string, voiceConfig: any) => { - return new Promise((resolve) => { - if ('speechSynthesis' in window) { - const utterance = new SpeechSynthesisUtterance(text); - utterance.rate = voiceConfig.rate || 1.0; - utterance.pitch = voiceConfig.pitch || 1.0; - utterance.onend = () => resolve(); - speechSynthesis.speak(utterance); - } else { - resolve(); - } - }); -}; -import { useToast } from '@/hooks/use-toast'; - -// Consolidated soundboard data -const soundboards = { - waffle: { - name: 'Waffle House', - sounds: [ - { id: 'eggs', text: "I'll take my eggs scattered, smothered, and covered!", voice: { pitch: 1.2, rate: 0.9 } }, - { id: 'hash', text: "Hash browns all the way!", voice: { pitch: 1.1, rate: 1.0 } }, - { id: 'coffee', text: "Keep that coffee coming!", voice: { pitch: 0.9, rate: 1.1 } }, - { id: 'shift', text: "Third shift crew checking in", voice: { pitch: 1.0, rate: 0.8 } } - ] - }, - ozzy: { - name: 'Heavy Metal', - sounds: [ - { id: 'train', text: "All aboard! Crazy train!", voice: { pitch: 0.7, rate: 1.2 } }, - { id: 'darkness', text: "Hello darkness my old friend", voice: { pitch: 0.6, rate: 0.8 } }, - { id: 'metal', text: "Metal up your life!", voice: { pitch: 0.8, rate: 1.1 } }, - { id: 'rock', text: "Let's rock and roll!", voice: { pitch: 0.7, rate: 1.0 } } - ] - }, - mario: { - name: 'Mario World', - sounds: [ - { id: 'mario', text: "It's-a me, Mario!", voice: { pitch: 1.4, rate: 1.1 } }, - { id: 'jump', text: "Wahoo! Here we go!", voice: { pitch: 1.5, rate: 1.2 } }, - { id: 'power', text: "Power up! Let's-a-go!", voice: { pitch: 1.3, rate: 1.0 } }, - { id: 'coin', text: "Mamma mia! Thank you so much!", voice: { pitch: 1.4, rate: 0.9 } } - ] - }, - max: { - name: 'Max Headroom', - sounds: [ - { id: 'stutter', text: "Th-th-that's all folks!", voice: { pitch: 1.2, rate: 1.3 } }, - { id: 'digital', text: "Welcome to the digital frontier!", voice: { pitch: 1.1, rate: 1.2 } }, - { id: 'glitch', text: "System glitch detected!", voice: { pitch: 1.0, rate: 1.4 } }, - { id: 'future', text: "The future is now!", voice: { pitch: 1.3, rate: 1.1 } } - ] - } -}; - -export function CoreSoundboards() { - const { brandSkin } = useStore(); - const { toast } = useToast(); - const [activeSounds, setActiveSounds] = useState>(new Set()); - - const playSound = async (soundboard: string, sound: any) => { - const soundId = `${soundboard}-${sound.id}`; - - if (activeSounds.has(soundId)) return; - - setActiveSounds(prev => new Set([...Array.from(prev), soundId])); - - try { - await speakText(sound.text, sound.voice); - - toast({ - title: `${soundboards[soundboard as keyof typeof soundboards].name}`, - description: sound.text, - duration: 2000, - }); - } catch (error) { - console.error('TTS Error:', error); - } finally { - setTimeout(() => { - setActiveSounds(prev => { - const newSet = new Set(Array.from(prev)); - newSet.delete(soundId); - return newSet; - }); - }, 3000); - } - }; - - // Only show soundboard for current theme - const getCurrentSoundboard = () => { - switch (brandSkin) { - case 'waffle': return soundboards.waffle; - case 'ozzy': return soundboards.ozzy; - case 'mario': return soundboards.mario; - case 'maxheadroom': return soundboards.max; - default: return null; - } - }; - - const currentSoundboard = getCurrentSoundboard(); - - if (!currentSoundboard) return null; - - return ( -
-
-
- - - {currentSoundboard.name} - - Triple-click theme -
- -
- {currentSoundboard.sounds.map((sound) => { - const soundId = `${brandSkin}-${sound.id}`; - const isActive = activeSounds.has(soundId); - - return ( - - ); - })} -
-
-
- ); -} \ No newline at end of file diff --git a/client/src/components/EasterEgg.tsx b/client/src/components/EasterEgg.tsx deleted file mode 100644 index d61a960..0000000 --- a/client/src/components/EasterEgg.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import React from 'react'; -import { Button } from '@/components/ui/button'; -import { useStore } from '@/lib/store'; - -interface EasterEggProps { - isActive: boolean; - onClose: () => void; -} - -export function EasterEgg({ isActive, onClose }: EasterEggProps) { - const { setVideoEffects, videoEffects, addToQueue, queueItems } = useStore(); - - const activateAcidTrip = async () => { - // Add the Marilyn Manson video to the front of the queue - const easterEggVideo = { - identifier: 'TheVistaGroup-MarilynMansonGetYourGunnonBeavisandButthead', - title: 'Marilyn Manson - Get Your Gunn (Easter Egg)', - creator: 'Marilyn Manson', - duration: '4:20', - licenseurl: 'https://creativecommons.org/publicdomain/mark/1.0/', - }; - - const videoUrl = '/api/video/TheVistaGroup-MarilynMansonGetYourGunnonBeavisandButthead/Marilyn Manson - Get Your Gunn on Beavis and Butthead VHS โ€ข 60 FPS 1996.ia.mp4'; - - // Add to front of queue (will be at index 0) - addToQueue(easterEggVideo, videoUrl, true); - - // Enable intense video effects for acid trip mode - setVideoEffects({ - ...videoEffects, - intensity: 100, - brightness: 150, - contrast: 200, - saturation: 300, - hue: 180, - chromaticAberration: 100, - glitchIntensity: 80, - }); - - // Auto-close the easter egg after activating - setTimeout(onClose, 1000); - }; - - if (!isActive) return null; - - return ( -
-
-
๐ŸŒ€
-

- EASTER EGG UNLOCKED -

-

- You've discovered the secret Acid Trip effect!
- This will add the Marilyn Manson clip to your queue
- and activate maximum visual chaos mode. -

- -
- - - -
- -

- Press 'bb' again anytime to return here -

-
-
- ); -} \ No newline at end of file diff --git a/client/src/components/KeyboardShortcuts.tsx b/client/src/components/KeyboardShortcuts.tsx index 17fb1b1..bf89771 100644 --- a/client/src/components/KeyboardShortcuts.tsx +++ b/client/src/components/KeyboardShortcuts.tsx @@ -78,7 +78,7 @@ export function KeyboardShortcuts() { const [isOpen, setIsOpen] = useState(false); const [typingSequence, setTypingSequence] = useState(''); const [lastTypingTime, setLastTypingTime] = useState(0); - const { brandSkin, isAsciiMode, setAsciiMode, setFloatingPanelVisible } = useStore(); + const { brandSkin, setFloatingPanelVisible } = useStore(); useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { @@ -123,22 +123,12 @@ export function KeyboardShortcuts() { if (event.key === 'Escape') { setIsOpen(false); - // Also exit ASCII mode on Escape - if (isAsciiMode) { - setAsciiMode(false); - } - } - - // ASCII Terminal Mode: Ctrl+Shift+A (or Cmd+Shift+A on Mac) - if (event.key === 'a' && (event.ctrlKey || event.metaKey) && event.shiftKey) { - event.preventDefault(); - setAsciiMode(!isAsciiMode); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); - }, [typingSequence, lastTypingTime, isAsciiMode]); + }, [typingSequence, lastTypingTime]); // Global keyboard shortcut handler useEffect(() => { diff --git a/client/src/hooks/use-easter-egg.tsx b/client/src/hooks/use-easter-egg.tsx deleted file mode 100644 index 2ae06c2..0000000 --- a/client/src/hooks/use-easter-egg.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { useEffect, useState } from 'react'; - -export function useEasterEgg() { - const [isEasterEggActive, setIsEasterEggActive] = useState(false); - const [keySequence, setKeySequence] = useState([]); - const [lastKeyTime, setLastKeyTime] = useState(0); - - useEffect(() => { - const handleKeyDown = (event: KeyboardEvent) => { - const currentTime = Date.now(); - const timeDiff = currentTime - lastKeyTime; - - // Reset sequence if too much time has passed (2 seconds) - if (timeDiff > 2000) { - setKeySequence([]); - } - - setLastKeyTime(currentTime); - - if (event.key.toLowerCase() === 'b') { - setKeySequence(prev => { - const newSequence = [...prev, 'b'].slice(-2); // Keep only last 2 keys - - // Check if we have 'bb' - if (newSequence.length === 2 && newSequence.every(key => key === 'b')) { - setIsEasterEggActive(true); - return []; // Reset sequence - } - - return newSequence; - }); - } else if (event.key === 'Escape' && isEasterEggActive) { - setIsEasterEggActive(false); - } else { - // Reset sequence on any other key - setKeySequence([]); - } - }; - - window.addEventListener('keydown', handleKeyDown); - - return () => { - window.removeEventListener('keydown', handleKeyDown); - }; - }, [lastKeyTime, isEasterEggActive]); - - const closeEasterEgg = () => { - setIsEasterEggActive(false); - setKeySequence([]); - }; - - return { - isEasterEggActive, - closeEasterEgg - }; -} \ No newline at end of file diff --git a/client/src/lib/store.ts b/client/src/lib/store.ts index 6ad4604..4c21833 100644 --- a/client/src/lib/store.ts +++ b/client/src/lib/store.ts @@ -71,10 +71,6 @@ interface AppStore extends AppState { setPanelSizes: (sizes: number[]) => void; // Easter Egg actions - isAsciiMode: boolean; - setAsciiMode: (enabled: boolean) => void; - isBlondieGeometryMode: boolean; - setBlondieGeometryMode: (enabled: boolean) => void; // Live stream actions setLiveStream: (stream: MediaStream | null, isActive: boolean, selectedCameraId?: string) => void; @@ -84,9 +80,6 @@ interface AppStore extends AppState { export const useStore = create((set, get) => ({ // Initial state brandSkin: 'testcard', - isAsciiMode: false, - isBlondieGeometryMode: false, - isHulksterMode: false, isResizableMode: true, panelSizes: [30, 40, 30], @@ -591,7 +584,6 @@ export const useStore = create((set, get) => ({ setBrandSkin: (skin) => set({ brandSkin: skin }), // Easter Egg actions - setAsciiMode: (enabled) => set({ isAsciiMode: enabled }), // Search actions setSearchState: (updates) => set((state) => ({ @@ -770,9 +762,6 @@ export const useStore = create((set, get) => ({ setResizableMode: (mode: boolean) => set({ isResizableMode: mode }), setPanelSizes: (sizes: number[]) => set({ panelSizes: sizes }), - // Blondie Geometry Mode implementation - setBlondieGeometryMode: (enabled) => set({ isBlondieGeometryMode: enabled }), - // Floating panel actions setFloatingMode: (enabled) => set({ isFloatingMode: enabled }), diff --git a/client/src/lib/types.ts b/client/src/lib/types.ts index 9ffc6db..901a5ef 100644 --- a/client/src/lib/types.ts +++ b/client/src/lib/types.ts @@ -132,7 +132,6 @@ export interface LiveStreamState { export interface AppState { brandSkin: BrandSkin; - isHulksterMode: boolean; adaptiveColorsEnabled: boolean; adaptiveIntensity: number; currentVideoPalette: any | null; diff --git a/client/src/pages/home.tsx b/client/src/pages/home.tsx index 60060f7..135dc74 100644 --- a/client/src/pages/home.tsx +++ b/client/src/pages/home.tsx @@ -33,10 +33,6 @@ export default function Home() { setDetailDrawerOpen, queueItems, addToQueue, - - // Effects modes - isAsciiMode, - isBlondieGeometryMode } = useStore(); const [isDragging, setIsDragging] = useState(false); @@ -100,9 +96,7 @@ export default function Home() { return (

- {brandSkin === 'blondie' && isBlondieGeometryMode ? 'PARALLEL BUFFET' : - brandSkin === 'testcard' ? 'STATIC BUFFET' : + {brandSkin === 'testcard' ? 'STATIC BUFFET' : brandSkin === 'waffle' ? 'SYRUP BUFFET' : brandSkin === 'ebn' ? 'HIJACK BUFFET' : brandSkin === 'ozzy' ? 'METAL BUFFET' : From 060b97617e7ac042c874c3bb04924fc2e3816d27 Mon Sep 17 00:00:00 2001 From: "robb.fladry" Date: Sun, 19 Jul 2026 18:16:31 -0400 Subject: [PATCH 4/8] refactor(phase-0): remove layout theater, onboarding modals, and framer-motion Deletes LayoutDemonstrator, ResponsiveLayoutHints(+Simple), breakpoint indicator/manager, LayoutControls, LayoutAnimationWrapper, DockingGuides, and all three onboarding flows. AnimatedTransitions is now a CSS-only shim with the same API, dropping framer-motion from the bundle. Co-Authored-By: Claude Fable 5 --- client/src/components/AnimatedTransitions.tsx | 289 ++++-------- client/src/components/DockingGuides.tsx | 132 ------ client/src/components/FirstRunTour.tsx | 434 ------------------ .../src/components/LayoutAnimationWrapper.tsx | 60 --- client/src/components/LayoutControls.tsx | 123 ----- client/src/components/LayoutDemonstrator.tsx | 286 ------------ .../ResponsiveBreakpointIndicator.tsx | 178 ------- .../src/components/ResponsiveLayoutHints.tsx | 396 ---------------- .../ResponsiveLayoutHintsSimple.tsx | 260 ----------- .../components/ResponsiveLayoutManager.tsx | 34 -- client/src/components/StreamlinedWelcome.tsx | 98 ---- client/src/components/WelcomeModal.tsx | 265 ----------- client/src/hooks/use-responsive-layout.tsx | 167 ------- client/src/pages/home.tsx | 27 +- package-lock.json | 43 -- package.json | 1 - 16 files changed, 96 insertions(+), 2697 deletions(-) delete mode 100644 client/src/components/DockingGuides.tsx delete mode 100644 client/src/components/FirstRunTour.tsx delete mode 100644 client/src/components/LayoutAnimationWrapper.tsx delete mode 100644 client/src/components/LayoutControls.tsx delete mode 100644 client/src/components/LayoutDemonstrator.tsx delete mode 100644 client/src/components/ResponsiveBreakpointIndicator.tsx delete mode 100644 client/src/components/ResponsiveLayoutHints.tsx delete mode 100644 client/src/components/ResponsiveLayoutHintsSimple.tsx delete mode 100644 client/src/components/ResponsiveLayoutManager.tsx delete mode 100644 client/src/components/StreamlinedWelcome.tsx delete mode 100644 client/src/components/WelcomeModal.tsx delete mode 100644 client/src/hooks/use-responsive-layout.tsx diff --git a/client/src/components/AnimatedTransitions.tsx b/client/src/components/AnimatedTransitions.tsx index 3b2e2cb..09def14 100644 --- a/client/src/components/AnimatedTransitions.tsx +++ b/client/src/components/AnimatedTransitions.tsx @@ -1,254 +1,155 @@ -import React, { ReactNode } from 'react'; -import { motion, AnimatePresence } from 'framer-motion'; +import { ReactNode } from 'react'; -// Fade in/out transition -export const FadeTransition = ({ children, className = "", delay = 0 }: { - children: ReactNode; - className?: string; - delay?: number; +// CSS-only transition shims. Same API as the old framer-motion versions, +// but no animation-library dependency and no per-frame JS cost during playback. + +export const FadeTransition = ({ children, className = "", delay = 0 }: { + children: ReactNode; + className?: string; + delay?: number; }) => ( - {children} - +

); -// Slide in from direction -export const SlideTransition = ({ - children, - direction = 'up', - className = "", - delay = 0 -}: { - children: ReactNode; - direction?: 'up' | 'down' | 'left' | 'right'; - className?: string; - delay?: number; +export const SlideTransition = ({ + children, + direction = 'up', + className = "", + delay = 0 +}: { + children: ReactNode; + direction?: 'up' | 'down' | 'left' | 'right'; + className?: string; + delay?: number; }) => { - const getInitialPosition = () => { - switch (direction) { - case 'up': return { y: 20 }; - case 'down': return { y: -20 }; - case 'left': return { x: 20 }; - case 'right': return { x: -20 }; - default: return { y: 20 }; - } - }; + const slideClass = { + up: 'slide-in-from-bottom-4', + down: 'slide-in-from-top-4', + left: 'slide-in-from-right-4', + right: 'slide-in-from-left-4', + }[direction]; return ( - {children} - +
); }; -// Scale animation for buttons and interactive elements -export const ScaleTransition = ({ - children, +export const ScaleTransition = ({ + children, className = "", - hoverScale = 1.05, - tapScale = 0.95 -}: { - children: ReactNode; +}: { + children: ReactNode; className?: string; hoverScale?: number; tapScale?: number; }) => ( - +
{children} - +
); -// Panel collapse/expand animation -export const PanelTransition = ({ - children, - isCollapsed, - className = "" -}: { - children: ReactNode; - isCollapsed: boolean; - className?: string; +export const PanelTransition = ({ + children, + isCollapsed, + className = "" +}: { + children: ReactNode; + isCollapsed: boolean; + className?: string; }) => ( - - - {!isCollapsed && children} - - +
+ {!isCollapsed && children} +
); -// Stagger animation for lists/grids -export const StaggerContainer = ({ - children, +export const StaggerContainer = ({ + children, className = "", - staggerDelay = 0.05 -}: { - children: ReactNode; +}: { + children: ReactNode; className?: string; staggerDelay?: number; }) => ( - +
{children} - +
); -export const StaggerItem = ({ - children, - className = "" -}: { - children: ReactNode; - className?: string; +export const StaggerItem = ({ + children, + className = "" +}: { + children: ReactNode; + className?: string; }) => ( - +
{children} - +
); -// Floating panel animation -export const FloatingPanelTransition = ({ - children, +export const FloatingPanelTransition = ({ + children, className = "", - isDragging = false -}: { - children: ReactNode; + isDragging = false +}: { + children: ReactNode; className?: string; isDragging?: boolean; }) => ( - +
{children} - +
); -// Theme transition wrapper -export const ThemeTransition = ({ - children, +export const ThemeTransition = ({ + children, className = "", - brandSkin -}: { - children: ReactNode; + brandSkin +}: { + children: ReactNode; className?: string; brandSkin: string; }) => ( - +
{children} - +
); -// Pulse animation for active states -export const PulseTransition = ({ - children, +export const PulseTransition = ({ + children, className = "", - isActive = false -}: { - children: ReactNode; + isActive = false +}: { + children: ReactNode; className?: string; isActive?: boolean; }) => ( - +
{children} - +
); -// Loading skeleton animation -export const SkeletonTransition = ({ - width = "100%", - height = "1rem", - className = "" -}: { - width?: string; - height?: string; - className?: string; +export const SkeletonTransition = ({ + width = "100%", + height = "1rem", + className = "" +}: { + width?: string; + height?: string; + className?: string; }) => ( - -); \ No newline at end of file +); diff --git a/client/src/components/DockingGuides.tsx b/client/src/components/DockingGuides.tsx deleted file mode 100644 index 421e4bb..0000000 --- a/client/src/components/DockingGuides.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import { useState, useEffect } from 'react'; -import { useStore } from '@/lib/store'; - -interface DockingGuidesProps { - isDragging: boolean; - dragPosition: { x: number; y: number } | null; -} - -export function DockingGuides({ isDragging, dragPosition }: DockingGuidesProps) { - const { brandSkin } = useStore(); - const [snapZones, setSnapZones] = useState>([]); - - useEffect(() => { - if (isDragging) { - // Calculate snap zones based on current viewport - const viewportWidth = window.innerWidth; - const viewportHeight = window.innerHeight; - const headerHeight = 120; // Approximate header height - - const zones = [ - // Left third - { x: 0, y: headerHeight, width: viewportWidth * 0.33, height: viewportHeight - headerHeight, type: 'left' }, - // Center third - { x: viewportWidth * 0.33, y: headerHeight, width: viewportWidth * 0.34, height: viewportHeight - headerHeight, type: 'center' }, - // Right third - { x: viewportWidth * 0.67, y: headerHeight, width: viewportWidth * 0.33, height: viewportHeight - headerHeight, type: 'right' }, - // Top half of center - { x: viewportWidth * 0.25, y: headerHeight, width: viewportWidth * 0.5, height: (viewportHeight - headerHeight) * 0.5, type: 'top-center' }, - // Bottom half of center - { x: viewportWidth * 0.25, y: headerHeight + (viewportHeight - headerHeight) * 0.5, width: viewportWidth * 0.5, height: (viewportHeight - headerHeight) * 0.5, type: 'bottom-center' }, - ]; - - setSnapZones(zones); - } else { - setSnapZones([]); - } - }, [isDragging]); - - const getActiveZone = () => { - if (!dragPosition || !isDragging) return null; - - return snapZones.find(zone => - dragPosition.x >= zone.x && - dragPosition.x <= zone.x + zone.width && - dragPosition.y >= zone.y && - dragPosition.y <= zone.y + zone.height - ); - }; - - const activeZone = getActiveZone(); - - const guideColor = brandSkin === 'testcard' ? 'border-blue-400' : - brandSkin === 'waffle' ? 'border-amber-400' : - brandSkin === 'ebn' ? 'border-lime-400' : - brandSkin === 'ozzy' ? 'border-red-400' : - brandSkin === 'mario' ? 'border-red-400' : - 'border-yellow-400'; - - const activeFillColor = brandSkin === 'testcard' ? 'bg-blue-400/20' : - brandSkin === 'waffle' ? 'bg-amber-400/20' : - brandSkin === 'ebn' ? 'bg-lime-400/20' : - brandSkin === 'ozzy' ? 'bg-red-400/20' : - brandSkin === 'mario' ? 'bg-red-400/20' : - 'bg-yellow-400/20'; - - if (!isDragging) return null; - - return ( -
- {snapZones.map((zone, index) => ( -
- {/* Corner indicators */} -
-
-
-
- - {/* Center indicator */} -
-
-
- - {/* Zone type label */} -
- {zone.type.toUpperCase()} -
-
- ))} - - {/* Crosshair cursor indicator */} - {dragPosition && ( -
-
-
-
-
-
- )} -
- ); -} \ No newline at end of file diff --git a/client/src/components/FirstRunTour.tsx b/client/src/components/FirstRunTour.tsx deleted file mode 100644 index db04344..0000000 --- a/client/src/components/FirstRunTour.tsx +++ /dev/null @@ -1,434 +0,0 @@ -import { useState, useEffect } from 'react'; -import { Button } from '@/components/ui/button'; -import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; -import { Badge } from '@/components/ui/badge'; -import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; -import { Slider } from '@/components/ui/slider'; -import { - Search, - Play, - Scissors, - Plus, - Zap, - ArrowRight, - ArrowLeft, - CheckCircle, - X, - Target, - Timer, -} from 'lucide-react'; -import { useStore } from '@/lib/store'; -import { useToast } from '@/hooks/use-toast'; - -interface TourStep { - id: number; - title: string; - description: string; - icon: React.ReactNode; - target: string; - action?: string; - tip?: string; -} - -const tourSteps: TourStep[] = [ - { - id: 1, - title: "Search for Content", - description: "Start by searching for public domain video footage. Try searching for 'vintage cartoon' or click a Smart Query chip.", - icon: , - target: "search-section", - action: "search", - tip: "Use Smart Query chips for instant content discovery!" - }, - { - id: 2, - title: "Preview & Trim", - description: "Click any video to preview it. Use the trim controls to set your in/out points for the perfect clip length.", - icon: , - target: "player-section", - action: "preview", - tip: "Double-click the player to go fullscreen for better preview." - }, - { - id: 3, - title: "Add to Queue", - description: "Found the perfect clip? Click 'Add to Queue' to build your video timeline for mixing and playback.", - icon: , - target: "queue-section", - action: "queue", - tip: "Drag clips in the queue to reorder them for your set." - }, - { - id: 4, - title: "Emergency Mix", - description: "Need content fast? Hit Emergency Mix to instantly fill your queue with diverse, legally-safe clips ready for live mixing.", - icon: , - target: "emergency-mix", - action: "emergency", - tip: "Perfect for when you need backup content during live sets!" - } -]; - -interface FirstRunTourProps {} - -export function FirstRunTour({}: FirstRunTourProps) { - const { brandSkin } = useStore(); - const { toast } = useToast(); - - const [isOpen, setIsOpen] = useState(false); - const [currentStep, setCurrentStep] = useState(1); - const [completedSteps, setCompletedSteps] = useState([]); - const [hasShownTour, setHasShownTour] = useState(false); - - // Auto-start tour disabled - now only accessible through menu - // useEffect(() => { - // const hasSeenTour = localStorage.getItem('staticBuffetHasSeenTour'); - // if (!hasSeenTour && !hasShownTour) { - // // Small delay to let the interface load - // setTimeout(() => { - // setIsOpen(true); - // setHasShownTour(true); - // }, 1500); - // } - // }, [hasShownTour]); - - const getThemeClasses = () => { - switch (brandSkin) { - case 'testcard': - return { - accent: 'text-blue-400 border-blue-400 bg-blue-50', - button: 'bg-blue-600 hover:bg-blue-700', - progress: 'bg-blue-600' - }; - case 'waffle': - return { - accent: 'text-amber-800 border-amber-600 bg-yellow-50', - button: 'bg-amber-600 hover:bg-amber-700', - progress: 'bg-amber-600' - }; - case 'ebn': - return { - accent: 'text-lime-400 border-lime-400 bg-lime-50', - button: 'bg-lime-600 hover:bg-lime-700', - progress: 'bg-lime-600' - }; - case 'ozzy': - return { - accent: 'text-red-300 border-red-400 bg-red-50', - button: 'bg-red-600 hover:bg-red-700', - progress: 'bg-red-600' - }; - case 'hogan': - return { - accent: 'text-yellow-300 border-yellow-400 bg-yellow-50', - button: 'bg-yellow-600 hover:bg-yellow-700', - progress: 'bg-yellow-600' - }; - default: - return { - accent: 'text-blue-400 border-blue-400 bg-blue-50', - button: 'bg-blue-600 hover:bg-blue-700', - progress: 'bg-blue-600' - }; - } - }; - - const theme = getThemeClasses(); - const currentTourStep = tourSteps[currentStep - 1]; - const progress = (currentStep / tourSteps.length) * 100; - - const nextStep = () => { - if (currentStep < tourSteps.length) { - setCurrentStep(currentStep + 1); - } - }; - - const prevStep = () => { - if (currentStep > 1) { - setCurrentStep(currentStep - 1); - } - }; - - const markStepCompleted = (stepId: number) => { - if (!completedSteps.includes(stepId)) { - setCompletedSteps([...completedSteps, stepId]); - - toast({ - title: "Step Completed!", - description: `Step ${stepId}: ${tourSteps[stepId - 1].title}`, - }); - - // Auto-advance to next step - if (stepId === currentStep && stepId < tourSteps.length) { - setTimeout(nextStep, 1000); - } - } - }; - - const skipTour = () => { - localStorage.setItem('staticBuffetHasSeenTour', 'true'); - setIsOpen(false); - - toast({ - title: "Tour Skipped", - description: "You can restart the tour anytime from the help menu.", - }); - }; - - const completeTour = () => { - localStorage.setItem('staticBuffetHasSeenTour', 'true'); - setIsOpen(false); - - toast({ - title: "Welcome to Static Buffet!", - description: "You're ready to start mixing public domain video content like a pro.", - }); - }; - - const restartTour = () => { - setCurrentStep(1); - setCompletedSteps([]); - setIsOpen(true); - }; - - // Add spotlight effect for current target - const addSpotlight = (targetId: string) => { - // Remove existing spotlights - document.querySelectorAll('.tour-spotlight').forEach(el => { - el.classList.remove('tour-spotlight'); - }); - - // Add spotlight to current target - const target = document.querySelector(`[data-tour-target="${targetId}"]`); - if (target) { - target.classList.add('tour-spotlight'); - } - }; - - useEffect(() => { - if (isOpen && currentTourStep) { - addSpotlight(currentTourStep.target); - } - - return () => { - // Cleanup spotlights when component unmounts - document.querySelectorAll('.tour-spotlight').forEach(el => { - el.classList.remove('tour-spotlight'); - }); - }; - }, [isOpen, currentStep, currentTourStep]); - - // Public method to start tour (can be called from other components) - const startTour = () => { - restartTour(); - }; - - // Attach restart function to window for external access - useEffect(() => { - (window as any).startStaticBuffetTour = startTour; - return () => { - delete (window as any).startStaticBuffetTour; - }; - }, []); - - if (!isOpen) { - return null; - } - - return ( - <> - {/* Overlay with spotlight effect */} -
- - {/* Tour Dialog */} - {}}> - e.preventDefault()} - onEscapeKeyDown={(e) => e.preventDefault()} - > - - -
- - Static Buffet Tour -
- - {currentStep} of {tourSteps.length} - -
-
- -
- {/* Progress Bar */} -
-
- Progress - {Math.round(progress)}% -
-
-
-
-
- - {/* Current Step */} - - - -
- {currentTourStep.icon} -
-
-
{currentTourStep.title}
- - Step {currentStep} - -
-
-
- -

- {currentTourStep.description} -

- - {currentTourStep.tip && ( -
-
- -

- Pro Tip: {currentTourStep.tip} -

-
-
- )} - - {/* Step completion indicator */} - {completedSteps.includes(currentStep) && ( -
- - Step completed! -
- )} -
-
- - {/* Navigation */} -
-
- - - {currentStep < tourSteps.length ? ( - - ) : ( - - )} -
- - -
- - {/* Step indicators */} -
- {tourSteps.map((step) => ( -
-
- -
- - {/* CSS for spotlight effect */} - - - ); -} - -// Export the start tour function for external use -export const startTour = () => { - if ((window as any).startStaticBuffetTour) { - (window as any).startStaticBuffetTour(); - } -}; \ No newline at end of file diff --git a/client/src/components/LayoutAnimationWrapper.tsx b/client/src/components/LayoutAnimationWrapper.tsx deleted file mode 100644 index 2be008c..0000000 --- a/client/src/components/LayoutAnimationWrapper.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { useEffect, useState } from 'react'; -import { useResponsiveLayout } from '@/hooks/use-responsive-layout'; -import { useStore } from '@/lib/store'; - -interface LayoutAnimationWrapperProps { - children: React.ReactNode; - panelType?: 'search' | 'preview' | 'queue' | 'effects'; -} - -export function LayoutAnimationWrapper({ children, panelType }: LayoutAnimationWrapperProps) { - const { currentLayout, isTransitioning } = useResponsiveLayout(); - const { brandSkin } = useStore(); - const [animationKey, setAnimationKey] = useState(0); - - // Trigger re-animation when layout changes - useEffect(() => { - if (isTransitioning) { - setAnimationKey(prev => prev + 1); - } - }, [isTransitioning, currentLayout]); - - const getAnimationClass = () => { - if (!isTransitioning) return ''; - - switch (currentLayout) { - case 'mobile': - return 'animate-fade-in'; - case 'tablet': - return 'animate-slide-in-left'; - case 'desktop': - default: - return 'animate-scale-in'; - } - }; - - const getLayoutSpecificClass = () => { - const base = 'transition-all duration-300'; - - switch (currentLayout) { - case 'mobile': - return `${base} w-full mb-2`; - case 'tablet': - return `${base} ${panelType === 'search' ? 'w-1/3' : panelType === 'preview' ? 'flex-1' : 'w-1/4'}`; - case 'desktop': - default: - return base; - } - }; - - return ( -
- {children} -
- ); -} \ No newline at end of file diff --git a/client/src/components/LayoutControls.tsx b/client/src/components/LayoutControls.tsx deleted file mode 100644 index 61ed864..0000000 --- a/client/src/components/LayoutControls.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import { useState } from 'react'; -import { Button } from '@/components/ui/button'; -import { Badge } from '@/components/ui/badge'; -import { Card } from '@/components/ui/card'; -import { Smartphone, Tablet, Monitor, Layout, Info, Settings } from 'lucide-react'; -import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; -import { useResponsiveLayout } from '@/hooks/use-responsive-layout'; -import { useToast } from '@/hooks/use-toast'; - -export function LayoutControls() { - const [showInfo, setShowInfo] = useState(false); - const { currentLayout, setManualLayout } = useResponsiveLayout(); - const { toast } = useToast(); - - const layouts = [ - { id: 'mobile', icon: Smartphone, label: 'Mobile', width: '< 768px' }, - { id: 'tablet', icon: Tablet, label: 'Tablet', width: '768-1024px' }, - { id: 'desktop', icon: Monitor, label: 'Desktop', width: '> 1024px' } - ] as const; - - const switchLayout = (layoutId: typeof layouts[number]['id']) => { - setManualLayout(layoutId); - toast({ - title: `Switched to ${layoutId} layout`, - description: `Interface adapted for ${layoutId} view`, - duration: 2000, - }); - }; - - const resetToAuto = () => { - const width = window.innerWidth; - const autoLayout = width < 768 ? 'mobile' : width < 1024 ? 'tablet' : 'desktop'; - setManualLayout(autoLayout); - - toast({ - title: "Layout reset to automatic", - description: "Now responding to actual screen size", - duration: 2000, - }); - }; - - return ( - <> -
- -
- - - {currentLayout} - - -
- -
- {layouts.map(({ id, icon: Icon }) => ( - - ))} - -
-
-
- - - - - Responsive Layout - - -
-

- The interface automatically adapts to your screen size. Use these controls to test different layouts. -

- -
- {layouts.map(({ id, icon: Icon, label, width }) => ( -
- -
-
{label}
-
{width}
-
- {currentLayout === id && ( - Current - )} -
- ))} -
- -
-
โ€ข Layout changes auto-revert after 8 seconds
-
โ€ข Use Settings button to return to auto-detection
-
-
-
-
- - ); -} \ No newline at end of file diff --git a/client/src/components/LayoutDemonstrator.tsx b/client/src/components/LayoutDemonstrator.tsx deleted file mode 100644 index dfe992d..0000000 --- a/client/src/components/LayoutDemonstrator.tsx +++ /dev/null @@ -1,286 +0,0 @@ -import { useState } from 'react'; -import { Button } from '@/components/ui/button'; -import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; -import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; -import { Badge } from '@/components/ui/badge'; -import { Smartphone, Tablet, Monitor, Play, X, RotateCcw } from 'lucide-react'; -import { useResponsiveLayout } from '@/hooks/use-responsive-layout'; -import { useStore } from '@/lib/store'; -import { useToast } from '@/hooks/use-toast'; - -export function LayoutDemonstrator() { - const [isOpen, setIsOpen] = useState(false); - const [demoLayout, setDemoLayout] = useState<'mobile' | 'tablet' | 'desktop'>('desktop'); - const [isAnimating, setIsAnimating] = useState(false); - const { setManualLayout, currentLayout } = useResponsiveLayout(); - const { brandSkin } = useStore(); - const { toast } = useToast(); - - const layouts = { - mobile: { - icon: Smartphone, - title: 'Mobile Layout', - description: 'Single column, stacked interface', - width: '375px', - features: ['Touch optimized', 'Vertical stack', 'Full width panels'], - demoClass: 'w-[300px] h-[500px] bg-gradient-to-b from-blue-100 to-blue-200 rounded-lg p-4' - }, - tablet: { - icon: Tablet, - title: 'Tablet Layout', - description: 'Dual column adaptive interface', - width: '768px', - features: ['Side navigation', '2-column grid', 'Medium density'], - demoClass: 'w-[400px] h-[300px] bg-gradient-to-b from-orange-100 to-orange-200 rounded-lg p-4' - }, - desktop: { - icon: Monitor, - title: 'Desktop Layout', - description: 'Full multi-panel workspace', - width: '1024px+', - features: ['Resizable panels', '3+ columns', 'High density'], - demoClass: 'w-[500px] h-[350px] bg-gradient-to-b from-green-100 to-green-200 rounded-lg p-4' - } - }; - - const runLayoutDemo = async () => { - setIsAnimating(true); - - const sequence: ('mobile' | 'tablet' | 'desktop')[] = ['mobile', 'tablet', 'desktop']; - - for (const layout of sequence) { - setDemoLayout(layout); - setManualLayout(layout); - - toast({ - title: `Demonstrating ${layout} layout`, - description: `Interface adapting to ${layout} breakpoint`, - duration: 1500, - }); - - // Wait 2 seconds before next layout - await new Promise(resolve => setTimeout(resolve, 2000)); - } - - // Reset to actual layout - const actualWidth = window.innerWidth; - const autoLayout = actualWidth < 768 ? 'mobile' : actualWidth < 1024 ? 'tablet' : 'desktop'; - setManualLayout(autoLayout); - setDemoLayout(autoLayout); - setIsAnimating(false); - - toast({ - title: "Layout demo complete", - description: "Returned to automatic detection", - duration: 2000, - }); - }; - - const resetDemo = () => { - const actualWidth = window.innerWidth; - const autoLayout = actualWidth < 768 ? 'mobile' : actualWidth < 1024 ? 'tablet' : 'desktop'; - setManualLayout(autoLayout); - setDemoLayout(autoLayout); - setIsAnimating(false); - }; - - const getThemeClasses = () => { - switch (brandSkin) { - case 'testcard': - return 'bg-slate-900/95 border-blue-400/60 text-blue-100'; - case 'waffle': - return 'bg-amber-50/95 border-amber-500/60 text-amber-900'; - case 'ebn': - return 'bg-gray-900/95 border-lime-400/60 text-lime-100'; - case 'ozzy': - return 'bg-red-950/95 border-red-400/60 text-red-100'; - case 'hogan': - return 'bg-yellow-950/95 border-yellow-400/60 text-yellow-100'; - case 'dx': - return 'bg-pink-950/95 border-pink-400/60 text-pink-100'; - case 'maxheadroom': - return 'bg-green-950/95 border-green-400/60 text-green-100'; - case 'mario': - return 'bg-red-950/95 border-yellow-400/60 text-yellow-100'; - case 'dakota': - return 'bg-gray-900/95 border-gray-400/60 text-gray-100'; - case 'blondie': - return 'bg-amber-950/95 border-amber-400/60 text-amber-100'; - default: - return 'bg-slate-900/95 border-blue-400/60 text-blue-100'; - } - }; - - return ( - <> - - - - - -
- Interactive Layout Demonstration - -
-
- -
- {/* Demo Controls */} - - - Layout Demo Controls - - -
- - - -
- -
- Current Layout: {demoLayout} - {isAnimating && โ€ข Demo Running} -
- - {/* Individual Layout Buttons */} -
- {(Object.keys(layouts) as Array).map((layout) => { - const config = layouts[layout]; - const Icon = config.icon; - const isActive = demoLayout === layout; - - return ( - - ); - })} -
-
-
- - {/* Current Layout Preview */} - - - - Current Preview: {layouts[demoLayout].title} - - - -
- {/* Layout Mockup */} -
-
-
- {(() => { - const IconComponent = layouts[demoLayout].icon; - return ; - })()} -
{layouts[demoLayout].title}
-
{layouts[demoLayout].width}
-
-
-
- - {/* Layout Details */} -
-
-

Description

-

{layouts[demoLayout].description}

-
- -
-

Key Features

-
- {layouts[demoLayout].features.map((feature, index) => ( - - {feature} - - ))} -
-
- -
-

Breakpoint Range

-
- {demoLayout === 'mobile' && '< 768px'} - {demoLayout === 'tablet' && '768px - 1024px'} - {demoLayout === 'desktop' && '> 1024px'} -
-
-
-
-
-
- - {/* Instructions */} - - - How to Use - - -
-
โ€ข Run Full Demo: Automatically cycles through all layouts
-
โ€ข Individual Buttons: Switch to specific layout immediately
-
โ€ข Reset: Return to automatic screen-size detection
-
โ€ข Live Preview: See how the interface adapts in real-time
-
-
-
-
-
-
- - ); -} \ No newline at end of file diff --git a/client/src/components/ResponsiveBreakpointIndicator.tsx b/client/src/components/ResponsiveBreakpointIndicator.tsx deleted file mode 100644 index 64cec3c..0000000 --- a/client/src/components/ResponsiveBreakpointIndicator.tsx +++ /dev/null @@ -1,178 +0,0 @@ -import { useEffect, useState } from 'react'; -import { useIsMobile } from '@/hooks/use-mobile'; -import { useResponsiveLayout } from '@/hooks/use-responsive-layout'; -import { useStore } from '@/lib/store'; -import { Smartphone, Tablet, Monitor, Settings, Eye } from 'lucide-react'; -import { Badge } from '@/components/ui/badge'; -import { Button } from '@/components/ui/button'; -import { useToast } from '@/hooks/use-toast'; - -export function ResponsiveBreakpointIndicator() { - const { brandSkin } = useStore(); - const { toast } = useToast(); - const isMobile = useIsMobile(); - const { - currentLayout, - setManualLayout, - triggerLayoutAnimation, - canResize, - breakpoints - } = useResponsiveLayout(); - const [currentBreakpoint, setCurrentBreakpoint] = useState<'mobile' | 'tablet' | 'desktop'>('desktop'); - const [showIndicator, setShowIndicator] = useState(false); - const [isManualMode, setIsManualMode] = useState(false); - - // Sync with responsive layout hook - useEffect(() => { - if (currentLayout !== currentBreakpoint) { - setCurrentBreakpoint(currentLayout); - setShowIndicator(true); - - // Hide indicator after 3 seconds - setTimeout(() => setShowIndicator(false), 3000); - } - }, [currentLayout, currentBreakpoint]); - - // Manual layout switching functions - const switchToLayout = (layout: 'mobile' | 'tablet' | 'desktop') => { - setManualLayout(layout); - setIsManualMode(true); - - toast({ - title: `Switched to ${layout} layout`, - description: `Interface adapted for ${layout} view`, - duration: 2000, - }); - - // Auto-revert after 8 seconds - setTimeout(() => { - setIsManualMode(false); - const actualWidth = window.innerWidth; - const autoLayout = actualWidth < 768 ? 'mobile' : actualWidth < 1024 ? 'tablet' : 'desktop'; - setManualLayout(autoLayout); - }, 8000); - }; - - const resetToAuto = () => { - const width = window.innerWidth; - const autoLayout = width < 768 ? 'mobile' : width < 1024 ? 'tablet' : 'desktop'; - setManualLayout(autoLayout); - setIsManualMode(false); - - toast({ - title: "Layout reset to automatic", - description: "Now responding to actual screen size", - duration: 2000, - }); - }; - - const getThemeClasses = () => { - switch (brandSkin) { - case 'testcard': - return 'bg-blue-900/90 border-blue-400/50 text-blue-300'; - case 'waffle': - return 'bg-amber-100/90 border-amber-400/50 text-amber-800'; - case 'ebn': - return 'bg-lime-900/90 border-lime-400/50 text-lime-300'; - case 'ozzy': - return 'bg-red-900/90 border-red-400/50 text-red-300'; - case 'hogan': - return 'bg-yellow-900/90 border-yellow-400/50 text-yellow-300'; - case 'dx': - return 'bg-pink-900/90 border-pink-400/50 text-pink-300'; - case 'maxheadroom': - return 'bg-green-900/90 border-green-400/50 text-green-300'; - case 'mario': - return 'bg-red-900/90 border-yellow-400/50 text-yellow-300'; - case 'dakota': - return 'bg-gray-800/90 border-gray-400/50 text-gray-300'; - case 'blondie': - return 'bg-amber-900/90 border-amber-400/50 text-amber-300'; - default: - return 'bg-blue-900/90 border-blue-400/50 text-blue-300'; - } - }; - - const breakpointConfig = { - mobile: { - icon: Smartphone, - label: 'Mobile', - width: '< 768px' - }, - tablet: { - icon: Tablet, - label: 'Tablet', - width: '768px - 1024px' - }, - desktop: { - icon: Monitor, - label: 'Desktop', - width: '> 1024px' - } - }; - - const config = breakpointConfig[currentBreakpoint]; - const IconComponent = config.icon; - - // Enhanced indicator display logic - if (!showIndicator && !isManualMode) return null; - - return ( -
-
-
- - {config.label} Layout - {isManualMode && ( - - Manual - - )} -
-
- - {window.innerWidth}px - - {isManualMode && ( - - )} -
-
- - {/* Quick Layout Switcher */} -
- {(Object.keys(breakpointConfig) as Array).map((layout) => { - const layoutConfig = breakpointConfig[layout]; - const LayoutIcon = layoutConfig.icon; - const isActive = currentBreakpoint === layout; - return ( - - ); - })} -
-
- ); -} \ No newline at end of file diff --git a/client/src/components/ResponsiveLayoutHints.tsx b/client/src/components/ResponsiveLayoutHints.tsx deleted file mode 100644 index d83f433..0000000 --- a/client/src/components/ResponsiveLayoutHints.tsx +++ /dev/null @@ -1,396 +0,0 @@ -import { useState, useEffect } from 'react'; -import { Monitor, Tablet, Smartphone, RotateCcw, Play, Pause, Eye, EyeOff } from 'lucide-react'; -import { Button } from '@/components/ui/button'; -import { useStore } from '@/lib/store'; -import { useIsMobile } from '@/hooks/use-mobile'; - -interface LayoutBreakpoint { - name: string; - width: number; - icon: React.ComponentType<{ className?: string; style?: React.CSSProperties }>; - description: string; -} - -const breakpoints: LayoutBreakpoint[] = [ - { - name: 'Desktop', - width: 1024, - icon: Monitor, - description: 'Full VJ workspace - Search, Preview, Queue, Effects all visible' - }, - { - name: 'Tablet', - width: 768, - icon: Tablet, - description: 'Streamlined layout - Search + Preview with collapsible queue' - }, - { - name: 'Mobile', - width: 375, - icon: Smartphone, - description: 'Touch-first stacked panels with swipe navigation' - } -]; - -export function ResponsiveLayoutHints() { - const { brandSkin } = useStore(); - const isMobile = useIsMobile(); - const [isAnimating, setIsAnimating] = useState(false); - const [currentBreakpoint, setCurrentBreakpoint] = useState(0); - const [isVisible, setIsVisible] = useState(false); - const [showRealTime, setShowRealTime] = useState(false); - - // Auto-cycle through breakpoints when animating - useEffect(() => { - if (!isAnimating) return; - - const interval = setInterval(() => { - setCurrentBreakpoint((prev) => (prev + 1) % breakpoints.length); - }, 2500); // Slightly slower for better visibility - - return () => clearInterval(interval); - }, [isAnimating]); - - // Add a pulsing effect during animation - const [isPulsing, setIsPulsing] = useState(false); - - useEffect(() => { - if (isAnimating) { - setIsPulsing(true); - const pulse = setInterval(() => { - setIsPulsing(prev => !prev); - }, 1000); - return () => clearInterval(pulse); - } else { - setIsPulsing(false); - } - }, [isAnimating]); - - const toggleAnimation = () => { - setIsAnimating(!isAnimating); - }; - - const resetToDesktop = () => { - setCurrentBreakpoint(0); - setIsAnimating(false); - }; - - const toggleVisibility = () => { - setIsVisible(!isVisible); - }; - - // Real-time breakpoint detection for demonstration - const getCurrentBreakpointIndex = () => { - if (typeof window === 'undefined') return 0; - const width = window.innerWidth; - if (width < 768) return 2; // Mobile - if (width < 1024) return 1; // Tablet - return 0; // Desktop - }; - - if (!isVisible) { - return ( - - ); - } - - const currentBreakpointData = breakpoints[currentBreakpoint]; - const IconComponent = currentBreakpointData.icon; - - return ( -
- {/* Header */} -
-
- -

Layout Hints

-
- -
- - {/* Breakpoint Visualization */} -
-
- {currentBreakpointData.name} - {currentBreakpointData.width}px -
- - {/* Animated viewport representation */} -
- {/* Simulated VJ interface elements */} -
- {/* Header with search controls */} -
-
-
-
-
-
-
- - {/* Main workspace panels */} -
- {/* Search & Results panel */} -
- {/* Video thumbnails simulation */} -
-
-
- {currentBreakpoint !== 2 &&
} -
-
- - {/* Video Player (hidden on mobile) */} - {currentBreakpoint !== 2 && ( -
- {/* Play button simulation */} -
- {/* Timeline */} -
-
- )} - - {/* Queue/Timeline panel (desktop only) */} - {currentBreakpoint === 0 && ( -
- {/* Queue items simulation */} -
-
-
-
-
-
- )} -
- - {/* Effects panel (bottom row - mobile gets stacked) */} - {currentBreakpoint === 2 ? ( -
- ) : ( -
-
- {currentBreakpoint === 0 && ( -
- )} -
- )} -
-
- -

- {currentBreakpointData.description} -

-
- - {/* Breakpoint indicators */} -
- {breakpoints.map((bp, index) => { - const BpIcon = bp.icon; - return ( - - ); - })} -
- - {/* Enhanced Controls */} -
- - - - - -
- - {/* Additional info with enhanced status */} -
-
-

- {isAnimating - ? `Auto-cycling every 2.5s (${currentBreakpoint + 1}/${breakpoints.length})` - : 'Manual control - Click icons or animate' - } -

- {isAnimating && ( -
- {breakpoints.map((_, index) => ( -
- ))} -
- )} -
- - {/* Real-time indicator or Pro tip */} - {showRealTime ? ( -
-
- Current Screen: -
-
- {typeof window !== 'undefined' ? window.innerWidth : 1024}px -
-
- {(() => { - const realBreakpoint = getCurrentBreakpointIndex(); - const RealIcon = breakpoints[realBreakpoint].icon; - return ( - <> - - - {breakpoints[realBreakpoint].name} - - - ); - })()} -
-
-
-
- ) : ( -

- ๐Ÿ’ก VJ interface automatically adapts to your screen size -

- )} -
-
- ); -} \ No newline at end of file diff --git a/client/src/components/ResponsiveLayoutHintsSimple.tsx b/client/src/components/ResponsiveLayoutHintsSimple.tsx deleted file mode 100644 index d44d675..0000000 --- a/client/src/components/ResponsiveLayoutHintsSimple.tsx +++ /dev/null @@ -1,260 +0,0 @@ -import { useState, useEffect } from 'react'; -import { useIsMobile } from '@/hooks/use-mobile'; -import { useStore } from '@/lib/store'; -import { useResponsiveLayout } from '@/hooks/use-responsive-layout'; -import { Smartphone, Tablet, Monitor, X, RotateCcw, Eye, Settings } from 'lucide-react'; -import { Button } from '@/components/ui/button'; -import { Badge } from '@/components/ui/badge'; -import { useToast } from '@/hooks/use-toast'; - -export function ResponsiveLayoutHintsSimple() { - const { brandSkin } = useStore(); - const { toast } = useToast(); - const isMobile = useIsMobile(); - const { - currentLayout: actualLayout, - setManualLayout, - triggerLayoutAnimation, - canResize, - breakpoints - } = useResponsiveLayout(); - const [currentLayout, setCurrentLayout] = useState<'mobile' | 'tablet' | 'desktop'>('desktop'); - const [showHints, setShowHints] = useState(false); - const [isVisible, setIsVisible] = useState(false); - const [previewMode, setPreviewMode] = useState(false); - - // Sync with actual layout changes - useEffect(() => { - if (actualLayout !== currentLayout) { - setCurrentLayout(actualLayout); - setIsVisible(true); - // Auto-hide after 4 seconds - setTimeout(() => setIsVisible(false), 4000); - } - }, [actualLayout, currentLayout]); - - // Manual layout switching functionality - const switchToLayout = (layout: 'mobile' | 'tablet' | 'desktop') => { - setManualLayout(layout); - setCurrentLayout(layout); - setPreviewMode(true); - - toast({ - title: `Switched to ${layout} layout`, - description: `Interface adapted for ${layout} view`, - duration: 2000, - }); - - // Auto-revert after 10 seconds - setTimeout(() => { - setPreviewMode(false); - const actualWidth = window.innerWidth; - const autoLayout = actualWidth < 768 ? 'mobile' : actualWidth < 1024 ? 'tablet' : 'desktop'; - setManualLayout(autoLayout); - }, 10000); - }; - - // Reset to automatic detection - const resetToAuto = () => { - const width = window.innerWidth; - const autoLayout = width < 768 ? 'mobile' : width < 1024 ? 'tablet' : 'desktop'; - setManualLayout(autoLayout); - setCurrentLayout(autoLayout); - setPreviewMode(false); - - toast({ - title: "Layout reset to automatic", - description: "Responding to actual screen size", - duration: 2000, - }); - }; - - const layoutConfig = { - mobile: { - icon: Smartphone, - title: 'Mobile View', - description: 'Single column, touch-optimized', - features: ['Touch controls', 'Stacked panels', 'Full-width layout'], - breakpoint: '< 768px' - }, - tablet: { - icon: Tablet, - title: 'Tablet View', - description: 'Adaptive dual-column layout', - features: ['Side navigation', 'Responsive panels', 'Medium density'], - breakpoint: '768px - 1024px' - }, - desktop: { - icon: Monitor, - title: 'Desktop View', - description: 'Full workspace with resizable panels', - features: ['Drag to resize', 'Multi-column', 'High density'], - breakpoint: '> 1024px' - } - }; - - const currentConfig = layoutConfig[currentLayout]; - const IconComponent = currentConfig.icon; - - // Show button when not visible - if (!showHints && !isVisible) { - return ( - - ); - } - - // Show layout info when visible or manually opened - if (showHints || isVisible) { - return ( -
- {/* Header */} -
-
- -
-

- {currentConfig.title} -

- {previewMode && ( - - Preview Mode - - )} -
-
- {showHints && ( - - )} -
- - {/* Description */} -

- {currentConfig.description} -

- - {/* Features */} -
-
FEATURES:
-
- {currentConfig.features.map((feature, index) => ( - - {feature} - - ))} -
-
- - {/* Interactive Layout Switcher */} -
-
TRY OTHER LAYOUTS:
-
- {(['mobile', 'tablet', 'desktop'] as const).map((layout) => { - const config = layoutConfig[layout]; - const Icon = config.icon; - const isActive = currentLayout === layout; - - return ( - - ); - })} -
-
- - {/* Preview Mode Controls */} - {previewMode && ( -
-
-
- - Previewing {currentLayout} layout -
- -
-
- Auto-resets in 10 seconds -
-
- )} - - {/* Screen size info */} -
-
- Screen: {window.innerWidth}px - Breakpoint: {currentConfig.breakpoint} -
-
- - {/* Layout specific hints */} - {currentLayout === 'desktop' && ( -
- - Drag panel edges to resize workspace -
- )} - - {currentLayout === 'tablet' && ( -
- - Panels adapt to available space -
- )} - - {currentLayout === 'mobile' && ( -
- - Touch-optimized controls active -
- )} - - {/* Auto-hide timer for automatic display */} - {isVisible && !showHints && ( -
- Auto-hiding in a few seconds... -
- )} -
- ); - } - - return null; -} \ No newline at end of file diff --git a/client/src/components/ResponsiveLayoutManager.tsx b/client/src/components/ResponsiveLayoutManager.tsx deleted file mode 100644 index d031043..0000000 --- a/client/src/components/ResponsiveLayoutManager.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { useEffect } from 'react'; -import { useResponsiveLayout, type LayoutMode } from '@/hooks/use-responsive-layout'; -import { useStore } from '@/lib/store'; - -interface ResponsiveLayoutManagerProps { - children: React.ReactNode; -} - -export function ResponsiveLayoutManager({ children }: ResponsiveLayoutManagerProps) { - const { currentLayout, panelConfig, isTransitioning } = useResponsiveLayout(); - const { setResizableMode } = useStore(); - - // Automatically adjust resizable mode based on layout - useEffect(() => { - if (currentLayout === 'mobile') { - setResizableMode(false); - } else if (currentLayout === 'tablet') { - setResizableMode(false); - } else { - // Desktop - enable full resizable mode - setResizableMode(true); - } - }, [currentLayout, setResizableMode]); - - return ( -
- {children} -
- ); -} \ No newline at end of file diff --git a/client/src/components/StreamlinedWelcome.tsx b/client/src/components/StreamlinedWelcome.tsx deleted file mode 100644 index 60bc594..0000000 --- a/client/src/components/StreamlinedWelcome.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import { useState, useEffect } from 'react'; -import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; -import { Button } from '@/components/ui/button'; -import { Search, Play, List, Zap, Tv } from 'lucide-react'; -import { useStore } from '@/lib/store'; -import { getThemeClasses } from '@/lib/theme-utils'; - -export function StreamlinedWelcome() { - const [isOpen, setIsOpen] = useState(false); - const { brandSkin } = useStore(); - const themeClasses = getThemeClasses(brandSkin); - - // Public method to show welcome (can be called from other components) - const showWelcome = () => setIsOpen(true); - - // Attach function to window for external access - useEffect(() => { - (window as any).showStaticBuffetWelcome = showWelcome; - return () => { - delete (window as any).showStaticBuffetWelcome; - }; - }, []); - - // Auto-start welcome disabled - now only accessible through menu - // useEffect(() => { - // const hasSeenWelcome = localStorage.getItem('staticBuffetWelcomeSeen'); - // if (!hasSeenWelcome) { - // setIsOpen(true); - // } - // }, []); - - const handleClose = () => { - localStorage.setItem('staticBuffetWelcomeSeen', 'true'); - setIsOpen(false); - }; - - const features = [ - { icon: Search, title: 'Content Discovery', desc: 'Search thousands of public domain videos' }, - { icon: Play, title: 'Preview & Queue', desc: 'Test and trim clips before performance' }, - { icon: List, title: 'Live Mixing', desc: 'Real-time video playback and transitions' }, - { icon: Zap, title: 'Professional Effects', desc: 'Video and audio processing pipeline' } - ]; - - return ( - - - - -
- - STATIC BUFFET -
-
- Professional VJ Tool -
-
-
- -
-

- Professional VJ tool for discovering, previewing, and mixing public domain video content for live performances. -

- -
- {features.map(({ icon: Icon, title, desc }) => ( -
- -
-
{title}
-
{desc}
-
-
- ))} -
- -
- - -
-
-
-
- ); -} \ No newline at end of file diff --git a/client/src/components/WelcomeModal.tsx b/client/src/components/WelcomeModal.tsx deleted file mode 100644 index 163f354..0000000 --- a/client/src/components/WelcomeModal.tsx +++ /dev/null @@ -1,265 +0,0 @@ -import { useState, useEffect } from 'react'; -import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; -import { Button } from '@/components/ui/button'; -import { Badge } from '@/components/ui/badge'; -import { Separator } from '@/components/ui/separator'; -import { Volume2, Play, Search, Zap, Tv, MousePointer, Headphones, Sparkles } from 'lucide-react'; -import { useStore } from '@/lib/store'; - -export function WelcomeModal() { - const [isOpen, setIsOpen] = useState(false); - const { brandSkin } = useStore(); - - useEffect(() => { - // Check if user has seen the welcome modal before - const hasSeenWelcome = localStorage.getItem('staticBuffetWelcomeSeen'); - if (!hasSeenWelcome) { - setIsOpen(true); - } - }, []); - - const handleClose = () => { - localStorage.setItem('staticBuffetWelcomeSeen', 'true'); - setIsOpen(false); - }; - - const handleGetStarted = () => { - localStorage.setItem('staticBuffetWelcomeSeen', 'true'); - setIsOpen(false); - // Optionally trigger a demo search or feature tour - }; - - return ( - - - - -
- - STATIC BUFFET - -
-
- Trash Team ร— Nulltone.TV -
-
-
- -
- {/* Main Description */} -
-

- All-You-Can-Eat Video Chaos -

-

- The ultimate VJ buffet for mixing free public domain and Creative Commons video content from Archive.org. - Turn discarded culture into something new with real-time audio-reactive mixing. -

-
- - {/* Volume Alert */} -
-
- - TURN UP THE VOLUME! - -
-

- Static Buffet includes audio-reactive features and live mixing capabilities. -

-
- - - - {/* Quick Start Guide */} -
-

- Quick Start Guide -

- -
- {/* Search & Queue */} -
-
- - 1. Search & Queue -
-
    -
  • โ€ข Search Archive.org for videos
  • -
  • โ€ข Filter by license (Public Domain, CC)
  • -
  • โ€ข Click videos to preview
  • -
  • โ€ข Add to timeline queue
  • -
-
- - {/* Mix & Effects */} -
-
- - 2. Mix & Effects -
-
    -
  • โ€ข Apply video/audio effects
  • -
  • โ€ข Enable audio-reactive mode
  • -
  • โ€ข Use Emergency Mix generator
  • -
  • โ€ข Export playlists with licensing
  • -
-
- - {/* Themes & Features */} -
-
- - 3. Special Features -
-
    -
  • โ€ข 8 visual themes with easter eggs
  • -
  • โ€ข Triple-click theme buttons for surprises
  • -
  • โ€ข Resizable panel workspace
  • -
  • โ€ข Save custom layouts
  • -
-
- - {/* Pro Tips */} -
-
- - 4. Pro Tips -
-
    -
  • โ€ข Use keyboard shortcuts for live VJ
  • -
  • โ€ข Try "Waffle House" theme ๐Ÿง‡
  • -
  • โ€ข Enable webcam for live mixing
  • -
  • โ€ข Check out the long timeline!
  • -
-
-
-
- - - - {/* Themes Preview */} -
-

- Choose Your Vibe -

-
- Test Card - Waffle House ๐Ÿง‡ - EBN Hijack - Heavy Metal ๐Ÿค˜ - NWO Hollywood - D-Generation X - Max Headroom - Sexy Mario ๐Ÿ„ - Dodge Dakota ๐Ÿšš - Blondie ๐ŸŽต -
-

- Each theme has unique easter eggs and visual effects! -

-
- - {/* Action Buttons */} -
- - -
- - {/* Footer Note */} -
-

- All content sourced from Archive.org โ€ข Respecting Creative Commons & Public Domain licensing -

-

- Built for VJs, by VJs โ€ข Open source alternative programming -

-
-
-
-
- ); -} \ No newline at end of file diff --git a/client/src/hooks/use-responsive-layout.tsx b/client/src/hooks/use-responsive-layout.tsx deleted file mode 100644 index f122beb..0000000 --- a/client/src/hooks/use-responsive-layout.tsx +++ /dev/null @@ -1,167 +0,0 @@ -import { useState, useEffect, useCallback } from 'react'; -import { useIsMobile } from './use-mobile'; - -export type LayoutMode = 'mobile' | 'tablet' | 'desktop'; -export type PanelConfiguration = 'stacked' | 'sidebar' | 'multi-column'; - -interface LayoutBreakpoints { - mobile: number; - tablet: number; - desktop: number; -} - -interface ResponsiveLayoutHook { - currentLayout: LayoutMode; - panelConfig: PanelConfiguration; - isTransitioning: boolean; - canResize: boolean; - breakpoints: LayoutBreakpoints; - triggerLayoutAnimation: () => void; - setManualLayout: (layout: LayoutMode) => void; -} - -const DEFAULT_BREAKPOINTS: LayoutBreakpoints = { - mobile: 768, - tablet: 1024, - desktop: 1200 -}; - -export function useResponsiveLayout(): ResponsiveLayoutHook { - const isMobile = useIsMobile(); - const [currentLayout, setCurrentLayout] = useState('desktop'); - const [isTransitioning, setIsTransitioning] = useState(false); - const [manualOverride, setManualOverride] = useState(null); - - // Determine layout based on screen size - const detectLayout = useCallback((): LayoutMode => { - if (typeof window === 'undefined') return 'desktop'; - - const width = window.innerWidth; - if (width < DEFAULT_BREAKPOINTS.mobile) return 'mobile'; - if (width < DEFAULT_BREAKPOINTS.tablet) return 'tablet'; - return 'desktop'; - }, []); - - // Get panel configuration based on layout - const getPanelConfiguration = (layout: LayoutMode): PanelConfiguration => { - switch (layout) { - case 'mobile': - return 'stacked'; - case 'tablet': - return 'sidebar'; - case 'desktop': - default: - return 'multi-column'; - } - }; - - // Trigger layout transition animation - const triggerLayoutAnimation = useCallback(() => { - setIsTransitioning(true); - setTimeout(() => setIsTransitioning(false), 600); - }, []); - - // Handle layout changes - useEffect(() => { - const handleResize = () => { - const newLayout = detectLayout(); - if (newLayout !== currentLayout && !manualOverride) { - setCurrentLayout(newLayout); - triggerLayoutAnimation(); - } - }; - - // Initial layout detection - handleResize(); - - // Listen for resize events - window.addEventListener('resize', handleResize); - return () => window.removeEventListener('resize', handleResize); - }, [currentLayout, detectLayout, triggerLayoutAnimation, manualOverride]); - - // Clear manual override on significant screen size changes - useEffect(() => { - if (manualOverride) { - const timer = setTimeout(() => { - setManualOverride(null); - }, 5000); // Clear override after 5 seconds - return () => clearTimeout(timer); - } - }, [manualOverride]); - - const setManualLayout = useCallback((layout: LayoutMode) => { - setManualOverride(layout); - setCurrentLayout(layout); - triggerLayoutAnimation(); - }, [triggerLayoutAnimation]); - - return { - currentLayout: manualOverride || currentLayout, - panelConfig: getPanelConfiguration(manualOverride || currentLayout), - isTransitioning, - canResize: currentLayout === 'desktop', - breakpoints: DEFAULT_BREAKPOINTS, - triggerLayoutAnimation, - setManualLayout - }; -} - -// Animation variants for different layout transitions -export const layoutAnimations = { - mobile: { - initial: { opacity: 0, y: 20 }, - animate: { opacity: 1, y: 0 }, - exit: { opacity: 0, y: -20 }, - transition: { duration: 0.3 } - }, - tablet: { - initial: { opacity: 0, x: -20 }, - animate: { opacity: 1, x: 0 }, - exit: { opacity: 0, x: 20 }, - transition: { duration: 0.4 } - }, - desktop: { - initial: { opacity: 0, scale: 0.95 }, - animate: { opacity: 1, scale: 1 }, - exit: { opacity: 0, scale: 1.05 }, - transition: { duration: 0.5 } - } -}; - -// Helper hook for layout-specific styles -export function useLayoutStyles() { - const { currentLayout, panelConfig } = useResponsiveLayout(); - - const getContainerClasses = () => { - switch (panelConfig) { - case 'stacked': - return 'flex flex-col space-y-2'; - case 'sidebar': - return 'flex flex-row space-x-2 lg:space-x-4'; - case 'multi-column': - default: - return 'grid grid-cols-1 lg:grid-cols-3 gap-2 lg:gap-4'; - } - }; - - const getPanelClasses = (panelType: 'search' | 'preview' | 'queue') => { - const base = 'transition-all duration-300'; - - switch (panelConfig) { - case 'stacked': - return `${base} w-full ${panelType === 'preview' ? 'order-1' : panelType === 'search' ? 'order-2' : 'order-3'}`; - case 'sidebar': - return `${base} ${panelType === 'search' ? 'w-1/3' : panelType === 'preview' ? 'flex-1' : 'w-1/4'}`; - case 'multi-column': - default: - return `${base} ${panelType === 'preview' ? 'col-span-1 lg:col-span-1' : ''}`; - } - }; - - return { - currentLayout, - panelConfig, - getContainerClasses, - getPanelClasses - }; -} \ No newline at end of file diff --git a/client/src/pages/home.tsx b/client/src/pages/home.tsx index 135dc74..1d32282 100644 --- a/client/src/pages/home.tsx +++ b/client/src/pages/home.tsx @@ -1,5 +1,5 @@ import { useCallback, useEffect, useState } from 'react'; -import { Tv, Info, Move, HelpCircle } from 'lucide-react'; +import { Tv, Move, HelpCircle } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { SearchBar } from '@/components/SearchBar'; import { Filters } from '@/components/Filters'; @@ -8,7 +8,6 @@ import { ServiceStatus } from '@/components/ServiceStatus'; import { EffectPresetNotification } from '@/components/EffectPresetNotification'; import { BottomHUD } from '@/components/BottomHUD'; import { StatusBar } from '@/components/StatusBar'; -import { StreamlinedWelcome } from '@/components/StreamlinedWelcome'; import { ThemeSelector } from '@/components/ThemeSelector'; import { FloatingPanelsManager } from '@/components/FloatingPanelsManager'; import { DevicePrompt } from '@/components/DevicePrompt'; @@ -19,11 +18,6 @@ import { useStore } from '@/lib/store'; import { getTextClasses, getThemeClasses } from '@/lib/theme-utils'; import { useVideoSearch } from '@/hooks/use-video-search'; import { type VideoResult } from '@/lib/types'; -import { FirstRunTour } from '@/components/FirstRunTour'; -import { ResponsiveLayoutManager } from '@/components/ResponsiveLayoutManager'; - -import { useResponsiveLayout } from '@/hooks/use-responsive-layout'; -import { FadeTransition, SlideTransition, ThemeTransition } from '@/components/AnimatedTransitions'; export default function Home() { const { @@ -94,7 +88,6 @@ export default function Home() { return ( -
-
- {/* Streamlined Modals - consolidated */} - - - - {/* Mario Pipe Effect */}
- ); } diff --git a/package-lock.json b/package-lock.json index cbdaa48..8871c23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,7 +48,6 @@ "embla-carousel-react": "^8.6.0", "express": "^4.22.2", "express-rate-limit": "^8.6.0", - "framer-motion": "^11.18.2", "input-otp": "^1.4.2", "lucide-react": "^0.453.0", "next-themes": "^0.4.6", @@ -4075,33 +4074,6 @@ "url": "https://github.com/sponsors/rawify" } }, - "node_modules/framer-motion": { - "version": "11.18.2", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz", - "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", - "license": "MIT", - "dependencies": { - "motion-dom": "^11.18.1", - "motion-utils": "^11.18.1", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -4651,21 +4623,6 @@ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "license": "MIT" }, - "node_modules/motion-dom": { - "version": "11.18.1", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", - "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==", - "license": "MIT", - "dependencies": { - "motion-utils": "^11.18.1" - } - }, - "node_modules/motion-utils": { - "version": "11.18.1", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz", - "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==", - "license": "MIT" - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", diff --git a/package.json b/package.json index 5cee450..e52fd5f 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,6 @@ "embla-carousel-react": "^8.6.0", "express": "^4.22.2", "express-rate-limit": "^8.6.0", - "framer-motion": "^11.18.2", "input-otp": "^1.4.2", "lucide-react": "^0.453.0", "next-themes": "^0.4.6", From d72d0388068414c82853097e56382f4d34cbe63d Mon Sep 17 00:00:00 2001 From: "robb.fladry" Date: Sun, 19 Jul 2026 18:17:20 -0400 Subject: [PATCH 5/8] chore(phase-0): delete 27 unused shadcn/ui wrappers and orphan UI deps Only 22 of 48 ui primitives were reachable from app code. Removes recharts, embla-carousel, input-otp, react-day-picker, vaul, react-resizable-panels, react-hook-form, and 13 unused radix packages. Co-Authored-By: Claude Fable 5 --- client/src/components/ResizablePanels.tsx | 217 ----- client/src/components/ui/alert-dialog.tsx | 139 --- client/src/components/ui/aspect-ratio.tsx | 5 - client/src/components/ui/avatar.tsx | 50 -- client/src/components/ui/breadcrumb.tsx | 115 --- client/src/components/ui/calendar.tsx | 68 -- client/src/components/ui/carousel.tsx | 260 ------ client/src/components/ui/chart.tsx | 365 -------- client/src/components/ui/context-menu.tsx | 198 ----- client/src/components/ui/drawer.tsx | 118 --- client/src/components/ui/form.tsx | 178 ---- client/src/components/ui/hover-card.tsx | 29 - client/src/components/ui/input-otp.tsx | 69 -- client/src/components/ui/menubar.tsx | 256 ------ client/src/components/ui/navigation-menu.tsx | 128 --- client/src/components/ui/pagination.tsx | 117 --- client/src/components/ui/popover.tsx | 29 - client/src/components/ui/progress.tsx | 28 - client/src/components/ui/radio-group.tsx | 42 - client/src/components/ui/resizable.tsx | 45 - client/src/components/ui/sheet.tsx | 140 --- client/src/components/ui/sidebar.tsx | 771 ---------------- client/src/components/ui/skeleton.tsx | 15 - client/src/components/ui/table.tsx | 117 --- client/src/components/ui/tabs.tsx | 53 -- client/src/components/ui/toggle-group.tsx | 61 -- client/src/components/ui/toggle.tsx | 43 - package-lock.json | 874 +------------------ package.json | 21 - 29 files changed, 30 insertions(+), 4521 deletions(-) delete mode 100644 client/src/components/ResizablePanels.tsx delete mode 100644 client/src/components/ui/alert-dialog.tsx delete mode 100644 client/src/components/ui/aspect-ratio.tsx delete mode 100644 client/src/components/ui/avatar.tsx delete mode 100644 client/src/components/ui/breadcrumb.tsx delete mode 100644 client/src/components/ui/calendar.tsx delete mode 100644 client/src/components/ui/carousel.tsx delete mode 100644 client/src/components/ui/chart.tsx delete mode 100644 client/src/components/ui/context-menu.tsx delete mode 100644 client/src/components/ui/drawer.tsx delete mode 100644 client/src/components/ui/form.tsx delete mode 100644 client/src/components/ui/hover-card.tsx delete mode 100644 client/src/components/ui/input-otp.tsx delete mode 100644 client/src/components/ui/menubar.tsx delete mode 100644 client/src/components/ui/navigation-menu.tsx delete mode 100644 client/src/components/ui/pagination.tsx delete mode 100644 client/src/components/ui/popover.tsx delete mode 100644 client/src/components/ui/progress.tsx delete mode 100644 client/src/components/ui/radio-group.tsx delete mode 100644 client/src/components/ui/resizable.tsx delete mode 100644 client/src/components/ui/sheet.tsx delete mode 100644 client/src/components/ui/sidebar.tsx delete mode 100644 client/src/components/ui/skeleton.tsx delete mode 100644 client/src/components/ui/table.tsx delete mode 100644 client/src/components/ui/tabs.tsx delete mode 100644 client/src/components/ui/toggle-group.tsx delete mode 100644 client/src/components/ui/toggle.tsx diff --git a/client/src/components/ResizablePanels.tsx b/client/src/components/ResizablePanels.tsx deleted file mode 100644 index 06045e8..0000000 --- a/client/src/components/ResizablePanels.tsx +++ /dev/null @@ -1,217 +0,0 @@ -import { useState, useCallback } from 'react'; -import { Panel, PanelGroup, PanelResizeHandle, ImperativePanelHandle } from 'react-resizable-panels'; -import { GripVertical, GripHorizontal } from 'lucide-react'; - -import { Filters } from '@/components/Filters'; -import { ResultsGrid } from '@/components/ResultsGrid'; -import { Player } from '@/components/Player'; -import { QueuePanel } from '@/components/QueuePanel'; -import { EffectsPanel } from '@/components/EffectsPanel'; -import { PanelHeader } from '@/components/PanelHeader'; -import { useStore } from '@/lib/store'; -import { type VideoResult } from '@/lib/types'; - -interface ResizablePanelsProps { - searchResults: VideoResult[]; - totalResults: number; - isLoading: boolean; - onSearch: (query: string) => void; - onVideoSelect: (video: VideoResult) => void; -} - -export function ResizablePanels({ - searchResults, - totalResults, - isLoading, - onSearch, - onVideoSelect -}: ResizablePanelsProps) { - const { brandSkin, queueItems, panelSizes, setPanelSizes } = useStore(); - - const handleLayoutChange = useCallback((sizes: number[]) => { - setPanelSizes(sizes); - }, [setPanelSizes]); - - const panelHeaderClass = `sticky top-0 z-10 ${ - brandSkin === 'testcard' - ? 'glass-testcard border-slate-400/20' - : brandSkin === 'waffle' - ? 'glass border-yellow-400/30' - : brandSkin === 'ebn' - ? 'glass-dark border-lime-500/20' - : brandSkin === 'ozzy' - ? 'glass-ozzy border-red-500/30' - : brandSkin === 'mario' - ? 'glass-mario border-yellow-400/30' - : 'glass-hogan border-yellow-400/30' - }`; - - const resizeHandleClass = `${ - brandSkin === 'testcard' - ? 'bg-slate-600/20 hover:bg-blue-400/30 border-slate-400/30' - : brandSkin === 'waffle' - ? 'bg-amber-600/20 hover:bg-amber-400/30 border-yellow-400/30' - : brandSkin === 'ebn' - ? 'bg-lime-600/20 hover:bg-lime-400/30 border-lime-500/30' - : brandSkin === 'ozzy' - ? 'bg-red-600/20 hover:bg-red-400/30 border-red-500/30' - : brandSkin === 'mario' - ? 'bg-red-600/20 hover:bg-red-400/30 border-red-500/30' - : 'bg-yellow-600/20 hover:bg-yellow-400/30 border-yellow-400/30' - }`; - - return ( -
- {/* Top Row - Search, Preview, Effects */} -
- - {/* Search & Results Panel */} - -
- {}} - /> -
- -
-
- {}} /> -
- -
- -
-
-
- - {/* Vertical Resize Handle */} - -
- -
- - {/* Snap Guide Indicators */} -
-
-
- - - {/* Preview Panel */} - -
- {}} - /> -
- -
- -
-
- - {/* Vertical Resize Handle */} - -
- -
-
- - {/* Effects Panel */} - -
- {}} - /> -
- -
- -
-
- -
- - {/* Bottom Timeline Panel - Full Width */} -
- {}} - /> - -
- -
-
-
- ); -} \ No newline at end of file diff --git a/client/src/components/ui/alert-dialog.tsx b/client/src/components/ui/alert-dialog.tsx deleted file mode 100644 index 8722561..0000000 --- a/client/src/components/ui/alert-dialog.tsx +++ /dev/null @@ -1,139 +0,0 @@ -import * as React from "react" -import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog" - -import { cn } from "@/lib/utils" -import { buttonVariants } from "@/components/ui/button" - -const AlertDialog = AlertDialogPrimitive.Root - -const AlertDialogTrigger = AlertDialogPrimitive.Trigger - -const AlertDialogPortal = AlertDialogPrimitive.Portal - -const AlertDialogOverlay = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName - -const AlertDialogContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - - -)) -AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName - -const AlertDialogHeader = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-) -AlertDialogHeader.displayName = "AlertDialogHeader" - -const AlertDialogFooter = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-) -AlertDialogFooter.displayName = "AlertDialogFooter" - -const AlertDialogTitle = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName - -const AlertDialogDescription = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AlertDialogDescription.displayName = - AlertDialogPrimitive.Description.displayName - -const AlertDialogAction = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName - -const AlertDialogCancel = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName - -export { - AlertDialog, - AlertDialogPortal, - AlertDialogOverlay, - AlertDialogTrigger, - AlertDialogContent, - AlertDialogHeader, - AlertDialogFooter, - AlertDialogTitle, - AlertDialogDescription, - AlertDialogAction, - AlertDialogCancel, -} diff --git a/client/src/components/ui/aspect-ratio.tsx b/client/src/components/ui/aspect-ratio.tsx deleted file mode 100644 index c4abbf3..0000000 --- a/client/src/components/ui/aspect-ratio.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" - -const AspectRatio = AspectRatioPrimitive.Root - -export { AspectRatio } diff --git a/client/src/components/ui/avatar.tsx b/client/src/components/ui/avatar.tsx deleted file mode 100644 index 51e507b..0000000 --- a/client/src/components/ui/avatar.tsx +++ /dev/null @@ -1,50 +0,0 @@ -"use client" - -import * as React from "react" -import * as AvatarPrimitive from "@radix-ui/react-avatar" - -import { cn } from "@/lib/utils" - -const Avatar = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -Avatar.displayName = AvatarPrimitive.Root.displayName - -const AvatarImage = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AvatarImage.displayName = AvatarPrimitive.Image.displayName - -const AvatarFallback = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName - -export { Avatar, AvatarImage, AvatarFallback } diff --git a/client/src/components/ui/breadcrumb.tsx b/client/src/components/ui/breadcrumb.tsx deleted file mode 100644 index 60e6c96..0000000 --- a/client/src/components/ui/breadcrumb.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import * as React from "react" -import { Slot } from "@radix-ui/react-slot" -import { ChevronRight, MoreHorizontal } from "lucide-react" - -import { cn } from "@/lib/utils" - -const Breadcrumb = React.forwardRef< - HTMLElement, - React.ComponentPropsWithoutRef<"nav"> & { - separator?: React.ReactNode - } ->(({ ...props }, ref) =>