From 4acfa6a2134ea8d635cf63621121d6ae4f3fe7e0 Mon Sep 17 00:00:00 2001 From: Alex Polo Date: Tue, 28 Oct 2025 23:22:33 +0100 Subject: [PATCH] Initial commit - Warme catering website --- ecosystem.config.js | 28 + eslint.config.js | 8 + next.config.mjs | 31 + next.config.ts | 7 - package-lock.json | 3674 +++++++++---------- package.json | 44 +- postcss.config.js | 6 + public/img/brunch.jpg | Bin 0 -> 14933 bytes public/img/fransk.jpg | Bin 0 -> 11940 bytes public/img/grill.jpg | Bin 0 -> 10887 bytes public/img/italiensk.jpg | Bin 0 -> 15139 bytes public/img/jul.jpg | Bin 0 -> 15271 bytes public/img/klassisk.jpg | Bin 0 -> 11151 bytes public/img/nordisk.jpg | Bin 0 -> 11646 bytes public/img/tapas.jpg | Bin 0 -> 14388 bytes public/img/veg.jpg | Bin 0 -> 10810 bytes public/next.svg | 1 - public/vercel.svg | 1 - scripts/build-and-test.sh | 73 + server.mjs | 29 + src/app/(admin)/admin/page.tsx | 154 + src/app/(marketing)/layout.tsx | 80 + src/app/(marketing)/page.tsx | 39 + src/app/betingelser/page.tsx | 31 + src/app/book/page.tsx | 147 + src/app/globals.css | 22 +- src/app/kontakt/page.tsx | 96 + src/app/layout.tsx | 63 +- src/app/menuer/page.tsx | 174 + src/app/not-found.tsx | 18 + src/app/page.tsx | 94 +- src/app/pakker/page.tsx | 83 + src/components/admin/bookings-view.tsx | 100 + src/components/admin/calendar-view.tsx | 46 + src/components/marketing/cta-section.tsx | 20 + src/components/marketing/featured-menus.tsx | 123 + src/components/marketing/hero.tsx | 76 + src/components/marketing/usp-list.tsx | 61 + src/components/ui/button.tsx | 61 + src/components/ui/date-picker.tsx | 67 + src/components/ui/image-placeholder.tsx | 21 + src/components/ui/input.tsx | 26 + src/components/ui/number-input.tsx | 67 + src/config/sample-data.ts | 457 +++ src/config/site.ts | 27 + src/lib/utils.ts | 6 + src/types/models.ts | 111 + tailwind.config.js | 41 + tsconfig.json | 16 +- 49 files changed, 4154 insertions(+), 2075 deletions(-) create mode 100644 ecosystem.config.js create mode 100644 eslint.config.js create mode 100644 next.config.mjs delete mode 100644 next.config.ts create mode 100644 postcss.config.js create mode 100644 public/img/brunch.jpg create mode 100644 public/img/fransk.jpg create mode 100644 public/img/grill.jpg create mode 100644 public/img/italiensk.jpg create mode 100644 public/img/jul.jpg create mode 100644 public/img/klassisk.jpg create mode 100644 public/img/nordisk.jpg create mode 100644 public/img/tapas.jpg create mode 100644 public/img/veg.jpg delete mode 100644 public/next.svg delete mode 100644 public/vercel.svg create mode 100755 scripts/build-and-test.sh create mode 100644 server.mjs create mode 100644 src/app/(admin)/admin/page.tsx create mode 100644 src/app/(marketing)/layout.tsx create mode 100644 src/app/(marketing)/page.tsx create mode 100644 src/app/betingelser/page.tsx create mode 100644 src/app/book/page.tsx create mode 100644 src/app/kontakt/page.tsx create mode 100644 src/app/menuer/page.tsx create mode 100644 src/app/not-found.tsx create mode 100644 src/app/pakker/page.tsx create mode 100644 src/components/admin/bookings-view.tsx create mode 100644 src/components/admin/calendar-view.tsx create mode 100644 src/components/marketing/cta-section.tsx create mode 100644 src/components/marketing/featured-menus.tsx create mode 100644 src/components/marketing/hero.tsx create mode 100644 src/components/marketing/usp-list.tsx create mode 100644 src/components/ui/button.tsx create mode 100644 src/components/ui/date-picker.tsx create mode 100644 src/components/ui/image-placeholder.tsx create mode 100644 src/components/ui/input.tsx create mode 100644 src/components/ui/number-input.tsx create mode 100644 src/config/sample-data.ts create mode 100644 src/config/site.ts create mode 100644 src/lib/utils.ts create mode 100644 src/types/models.ts create mode 100644 tailwind.config.js diff --git a/ecosystem.config.js b/ecosystem.config.js new file mode 100644 index 0000000..a9b436e --- /dev/null +++ b/ecosystem.config.js @@ -0,0 +1,28 @@ +module.exports = { + apps: [ + { + name: 'warme', + script: 'server.mjs', + instances: 1, + exec_mode: 'cluster', + env: { + NODE_ENV: 'production', + PORT: 3000 + }, + env_development: { + NODE_ENV: 'development', + PORT: 3000 + }, + node_args: [ + '--no-deprecation', + '--experimental-fetch' + ], + error_file: 'logs/err.log', + out_file: 'logs/out.log', + time: true, + wait_ready: true, + listen_timeout: 10000, + kill_timeout: 5000 + } + ] +} \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..43bb97a --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,8 @@ +module.exports = { + extends: [ + 'next/core-web-vitals', + ], + rules: { + '@next/next/no-img-element': 'off', + }, +} \ No newline at end of file diff --git a/next.config.mjs b/next.config.mjs new file mode 100644 index 0000000..72dc2cc --- /dev/null +++ b/next.config.mjs @@ -0,0 +1,31 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + images: { + remotePatterns: [ + { + protocol: 'https', + hostname: 'warme.dk', + }, + ], + }, + typescript: { + // Only run TypeScript checks in development + ignoreBuildErrors: process.env.NODE_ENV === 'production', + }, + async headers() { + return [ + { + source: '/:path*', + headers: [ + { + key: 'Cache-Control', + value: 'public, max-age=31536000, immutable', + }, + ], + }, + ] + }, + optimizeFonts: true, +}; + +export default nextConfig; diff --git a/next.config.ts b/next.config.ts deleted file mode 100644 index e9ffa30..0000000 --- a/next.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { NextConfig } from "next"; - -const nextConfig: NextConfig = { - /* config options here */ -}; - -export default nextConfig; diff --git a/package-lock.json b/package-lock.json index 91d48ed..b4a50bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,19 +8,31 @@ "name": "warme", "version": "0.1.0", "dependencies": { - "next": "16.0.1", - "react": "19.2.0", - "react-dom": "19.2.0" + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", + "date-fns": "^2.30.0", + "lucide-react": "^0.292.0", + "next": "^14.2.33", + "react": "18.2.0", + "react-day-picker": "^8.9.1", + "react-dom": "18.2.0", + "tailwind-merge": "^2.0.0" }, "devDependencies": { - "@tailwindcss/postcss": "^4", + "@eslint/config-array": "^0.21.1", + "@eslint/object-schema": "^2.1.7", "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "eslint": "^9", - "eslint-config-next": "16.0.1", - "tailwindcss": "^4", - "typescript": "^5" + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.4.16", + "eslint": "^8.57.1", + "eslint-config-next": "14.0.3", + "glob": "^11.0.3", + "lru-cache": "^11.2.2", + "postcss": "^8.4.31", + "rimraf": "^6.0.1", + "tailwindcss": "^3.3.5", + "typescript": "^5.2.2" } }, "node_modules/@alloc/quick-lru": { @@ -36,242 +48,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { + "node_modules/@babel/runtime": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", - "dev": true, + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, "engines": { "node": ">=6.9.0" } @@ -292,6 +73,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.6.0.tgz", "integrity": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -328,19 +110,6 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@eslint-community/regexpp": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", @@ -366,43 +135,17 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.1.tgz", - "integrity": "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.16.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", - "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -410,23 +153,20 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { - "version": "9.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", - "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@eslint/object-schema": { @@ -439,42 +179,20 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", - "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.16.0", - "levn": "^0.4.1" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" + "node": ">=10.10.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -491,446 +209,82 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } + "license": "BSD-3-Clause" }, - "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=18" + "node": "20 || >=22" } }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.4.tgz", - "integrity": "sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.3" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz", - "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.3" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz", - "integrity": "sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz", - "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz", - "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz", - "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz", - "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz", - "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz", - "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz", - "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz", - "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz", - "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.3" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz", - "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.3" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz", - "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.3" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz", - "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.3" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz", - "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.3" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz", - "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.3" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz", - "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.3" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz", - "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", "dependencies": { - "@emnapi/runtime": "^1.5.0" + "@isaacs/balanced-match": "^4.0.1" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node": "20 || >=22" } }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz", - "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.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==", + "dev": true, + "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" }, - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=12" } }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz", - "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz", - "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/@jridgewell/gen-mapping": { @@ -944,17 +298,6 @@ "@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", @@ -997,25 +340,47 @@ } }, "node_modules/@next/env": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.1.tgz", - "integrity": "sha512-LFvlK0TG2L3fEOX77OC35KowL8D7DlFF45C0OvKMC4hy8c/md1RC4UMNDlUGJqfCoCS2VWrZ4dSE6OjaX5+8mw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.33.tgz", + "integrity": "sha512-CgVHNZ1fRIlxkLhIX22flAZI/HmpDaZ8vwyJ/B0SDPTBuLZ1PJ+DWMjCHhqnExfmSQzA/PbZi8OAc7PAq2w9IA==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.1.tgz", - "integrity": "sha512-g4Cqmv/gyFEXNeVB2HkqDlYKfy+YrlM2k8AVIO/YQVEPfhVruH1VA99uT1zELLnPLIeOnx8IZ6Ddso0asfTIdw==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.3.tgz", + "integrity": "sha512-j4K0n+DcmQYCVnSAM+UByTVfIHnYQy2ODozfQP+4RdwtRDfobrIvKq1K4Exb2koJ79HSSa7s6B2SA8T/1YR3RA==", "dev": true, "license": "MIT", "dependencies": { - "fast-glob": "3.3.1" + "glob": "7.1.7" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.1.tgz", - "integrity": "sha512-R0YxRp6/4W7yG1nKbfu41bp3d96a0EalonQXiMe+1H9GTHfKxGNCGFNWUho18avRBPsO8T3RmdWuzmfurlQPbg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -1029,9 +394,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.1.tgz", - "integrity": "sha512-kETZBocRux3xITiZtOtVoVvXyQLB7VBxN7L6EPqgI5paZiUlnsgYv4q8diTNYeHmF9EiehydOBo20lTttCbHAg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -1045,9 +410,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.1.tgz", - "integrity": "sha512-hWg3BtsxQuSKhfe0LunJoqxjO4NEpBmKkE+P2Sroos7yB//OOX3jD5ISP2wv8QdUwtRehMdwYz6VB50mY6hqAg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -1061,9 +426,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.1.tgz", - "integrity": "sha512-UPnOvYg+fjAhP3b1iQStcYPWeBFRLrugEyK/lDKGk7kLNua8t5/DvDbAEFotfV1YfcOY6bru76qN9qnjLoyHCQ==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -1077,9 +442,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.1.tgz", - "integrity": "sha512-Et81SdWkcRqAJziIgFtsFyJizHoWne4fzJkvjd6V4wEkWTB4MX6J0uByUb0peiJQ4WeAt6GGmMszE5KrXK6WKg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -1093,9 +458,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.1.tgz", - "integrity": "sha512-qBbgYEBRrC1egcG03FZaVfVxrJm8wBl7vr8UFKplnxNRprctdP26xEv9nJ07Ggq4y1adwa0nz2mz83CELY7N6Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -1109,9 +474,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.1.tgz", - "integrity": "sha512-cPuBjYP6I699/RdbHJonb3BiRNEDm5CKEBuJ6SD8k3oLam2fDRMKAvmrli4QMDgT2ixyRJ0+DTkiODbIQhRkeQ==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -1124,10 +489,26 @@ "node": ">= 10" } }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.1.tgz", - "integrity": "sha512-XeEUJsE4JYtfrXe/LaJn3z1pD19fK0Q6Er8Qoufi+HqvdO4LEPyCxLUt4rxA+4RfYo6S9gMlmzCMU2F+AatFqQ==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -1188,6 +569,17 @@ "node": ">=12.4.0" } }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -1195,284 +587,27 @@ "dev": true, "license": "MIT" }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.14.1.tgz", + "integrity": "sha512-jGTk8UD/RdjsNZW8qq10r0RBvxL8OWtoT+kImlzPDFilmozzM+9QmIJsmze9UiSBrFU45ZxhTYBypn9q9z/VfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.16.tgz", - "integrity": "sha512-BX5iaSsloNuvKNHRN3k2RcCuTEgASTo77mofW0vmeHkfrDWaoFAFvNHpEgtu0eqyypcyiBkDWzSMxJhp3AUVcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "enhanced-resolve": "^5.18.3", - "jiti": "^2.6.1", - "lightningcss": "1.30.2", - "magic-string": "^0.30.19", - "source-map-js": "^1.2.1", - "tailwindcss": "4.1.16" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.16.tgz", - "integrity": "sha512-2OSv52FRuhdlgyOQqgtQHuCgXnS8nFSYRp2tJ+4WZXKgTxqPy7SMSls8c3mPT5pkZ17SBToGM5LHEJBO7miEdg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.16", - "@tailwindcss/oxide-darwin-arm64": "4.1.16", - "@tailwindcss/oxide-darwin-x64": "4.1.16", - "@tailwindcss/oxide-freebsd-x64": "4.1.16", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.16", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.16", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.16", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.16", - "@tailwindcss/oxide-linux-x64-musl": "4.1.16", - "@tailwindcss/oxide-wasm32-wasi": "4.1.16", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.16", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.16" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.16.tgz", - "integrity": "sha512-8+ctzkjHgwDJ5caq9IqRSgsP70xhdhJvm+oueS/yhD5ixLhqTw9fSL1OurzMUhBwE5zK26FXLCz2f/RtkISqHA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.16.tgz", - "integrity": "sha512-C3oZy5042v2FOALBZtY0JTDnGNdS6w7DxL/odvSny17ORUnaRKhyTse8xYi3yKGyfnTUOdavRCdmc8QqJYwFKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.16.tgz", - "integrity": "sha512-vjrl/1Ub9+JwU6BP0emgipGjowzYZMjbWCDqwA2Z4vCa+HBSpP4v6U2ddejcHsolsYxwL5r4bPNoamlV0xDdLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.16.tgz", - "integrity": "sha512-TSMpPYpQLm+aR1wW5rKuUuEruc/oOX3C7H0BTnPDn7W/eMw8W+MRMpiypKMkXZfwH8wqPIRKppuZoedTtNj2tg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.16.tgz", - "integrity": "sha512-p0GGfRg/w0sdsFKBjMYvvKIiKy/LNWLWgV/plR4lUgrsxFAoQBFrXkZ4C0w8IOXfslB9vHK/JGASWD2IefIpvw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.16.tgz", - "integrity": "sha512-DoixyMmTNO19rwRPdqviTrG1rYzpxgyYJl8RgQvdAQUzxC1ToLRqtNJpU/ATURSKgIg6uerPw2feW0aS8SNr/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.16.tgz", - "integrity": "sha512-H81UXMa9hJhWhaAUca6bU2wm5RRFpuHImrwXBUvPbYb+3jo32I9VIwpOX6hms0fPmA6f2pGVlybO6qU8pF4fzQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.16.tgz", - "integrity": "sha512-ZGHQxDtFC2/ruo7t99Qo2TTIvOERULPl5l0K1g0oK6b5PGqjYMga+FcY1wIUnrUxY56h28FxybtDEla+ICOyew==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.16.tgz", - "integrity": "sha512-Oi1tAaa0rcKf1Og9MzKeINZzMLPbhxvm7rno5/zuP1WYmpiG0bEHq4AcRUiG2165/WUzvxkW4XDYCscZWbTLZw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.16.tgz", - "integrity": "sha512-B01u/b8LteGRwucIBmCQ07FVXLzImWESAIMcUU6nvFt/tYsQ6IHz8DmZ5KtvmwxD+iTYBtM1xwoGXswnlu9v0Q==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.0.7", - "@tybys/wasm-util": "^0.10.1", + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.16.tgz", - "integrity": "sha512-zX+Q8sSkGj6HKRTMJXuPvOcP8XfYON24zJBRPlszcH1Np7xuHXhWn8qfFjIujVzvH3BHU+16jBXwgpl20i+v9A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.16.tgz", - "integrity": "sha512-m5dDFJUEejbFqP+UXVstd4W/wnxA4F61q8SoL+mqTypId2T2ZpuxosNSgowiCnLp2+Z+rivdU0AqpfgiD7yCBg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/postcss": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.16.tgz", - "integrity": "sha512-Qn3SFGPXYQMKR/UtqS+dqvPrzEeBZHrFA92maT4zijCVggdsXnDBMsPFJo1eArX3J+O+Gi+8pV4PkqjLCNBk3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.16", - "@tailwindcss/oxide": "4.1.16", - "postcss": "^8.4.41", - "tailwindcss": "4.1.16" } }, "node_modules/@tybys/wasm-util": { @@ -1486,20 +621,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -1517,181 +638,60 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/react": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", - "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", + "version": "18.3.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", + "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", "dev": true, "license": "MIT", "dependencies": { + "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.2.tgz", - "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==", + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, "license": "MIT", "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz", - "integrity": "sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/type-utils": "8.46.2", - "@typescript-eslint/utils": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.46.2", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz", - "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", - "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.2", - "@typescript-eslint/types": "^8.46.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "@types/react": "^18.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", - "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", - "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz", - "integrity": "sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/utils": "8.46.2", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/@typescript-eslint/types": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", - "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1699,32 +699,32 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", - "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/project-service": "8.46.2", - "@typescript-eslint/tsconfig-utils": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", - "fast-glob": "^3.3.2", + "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { @@ -1737,40 +737,10 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/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==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "license": "ISC", "dependencies": { @@ -1783,61 +753,31 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", - "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", - "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", @@ -2147,6 +1087,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -2163,6 +1113,34 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2220,6 +1198,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/array.prototype.findlast": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", @@ -2357,6 +1345,44 @@ "node": ">= 0.4" } }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "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.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -2410,6 +1436,19 @@ "baseline-browser-mapping": "dist/cli.js" } }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -2468,6 +1507,17 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -2528,6 +1578,16 @@ "node": ">=6" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001751", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", @@ -2565,12 +1625,71 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2591,6 +1710,16 @@ "dev": true, "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2598,13 +1727,6 @@ "dev": true, "license": "MIT" }, - "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" - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2620,6 +1742,19 @@ "node": ">= 8" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -2688,6 +1823,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -2749,27 +1900,44 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "devOptional": true, - "license": "Apache-2.0", + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, "engines": { "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, "node_modules/dunder-proto": { @@ -2787,6 +1955,13 @@ "node": ">= 0.4" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.241", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.241.tgz", @@ -2801,20 +1976,6 @@ "dev": true, "license": "MIT" }, - "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -3016,84 +2177,81 @@ } }, "node_modules/eslint": { - "version": "9.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", - "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.1", - "@eslint/core": "^0.16.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.38.0", - "@eslint/plugin-kit": "^0.4.0", - "@humanfs/node": "^0.16.6", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", + "cross-spawn": "^7.0.2", "debug": "^4.3.2", + "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-next": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.1.tgz", - "integrity": "sha512-wNuHw5gNOxwLUvpg0cu6IL0crrVC9hAwdS/7UwleNkwyaMiWIOAwf8yzXVqBBzL3c9A7jVRngJxjoSpPP1aEhg==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.0.3.tgz", + "integrity": "sha512-IKPhpLdpSUyKofmsXUfrvBC49JMUTdeaD8ZIH4v9Vk0sC1X6URTuTJCLtA0Vwuj7V/CQh0oISuSTvNn5//Buew==", "dev": true, "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "16.0.1", + "@next/eslint-plugin-next": "14.0.3", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jsx-a11y": "^6.10.0", - "eslint-plugin-react": "^7.37.0", - "eslint-plugin-react-hooks": "^7.0.0", - "globals": "16.4.0", - "typescript-eslint": "^8.46.0" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { - "eslint": ">=9.0.0", + "eslint": "^7.23.0 || ^8.0.0", "typescript": ">=3.3.1" }, "peerDependenciesMeta": { @@ -3102,17 +2260,46 @@ } } }, - "node_modules/eslint-config-next/node_modules/globals": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/eslint-plugin-react-hooks": { + "version": "5.0.0-canary-7118f5dd7-20230705", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz", + "integrity": "sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=10" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, "node_modules/eslint-import-resolver-node": { @@ -3244,6 +2431,29 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", @@ -3307,24 +2517,17 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", - "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "hermes-parser": "^0.25.1", - "zod": "^3.25.0 || ^4.0.0", - "zod-validation-error": "^3.5.0 || ^4.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + "node": ">=0.10.0" } }, "node_modules/eslint-plugin-react/node_modules/resolve": { @@ -3345,10 +2548,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3356,38 +2569,38 @@ "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -3447,9 +2660,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -3457,7 +2670,7 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -3501,16 +2714,16 @@ } }, "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=16.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/fill-range": { @@ -3544,17 +2757,57 @@ } }, "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.4" + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=16" + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/flatted": { @@ -3580,6 +2833,59 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -3631,16 +2937,6 @@ "node": ">= 0.4" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -3711,6 +3007,30 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "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", @@ -3724,14 +3044,33 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3754,6 +3093,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -3771,7 +3131,6 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, "license": "ISC" }, "node_modules/graphemer": { @@ -3875,23 +3234,6 @@ "node": ">= 0.4" } }, - "node_modules/hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "dev": true, - "license": "MIT" - }, - "node_modules/hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hermes-estree": "0.25.1" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3929,6 +3271,25 @@ "node": ">=0.8.19" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -3998,6 +3359,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", @@ -4025,19 +3399,6 @@ "semver": "^7.7.1" } }, - "node_modules/is-bun-module/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -4128,6 +3489,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", @@ -4214,6 +3585,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -4391,21 +3772,36 @@ "node": ">= 0.4" } }, + "node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", "bin": { - "jiti": "lib/jiti-cli.mjs" + "jiti": "bin/jiti.js" } }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -4421,19 +3817,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -4456,16 +3839,16 @@ "license": "MIT" }, "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, "bin": { "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" } }, "node_modules/jsx-ast-utils": { @@ -4528,266 +3911,25 @@ "node": ">= 0.8.0" } }, - "node_modules/lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, + "license": "MIT", "engines": { - "node": ">= 12.0.0" + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" + "url": "https://github.com/sponsors/antonk52" } }, - "node_modules/lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "cpu": [ - "arm64" - ], + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "license": "MIT" }, "node_modules/locate-path": { "version": "6.0.0", @@ -4816,7 +3958,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -4826,23 +3967,22 @@ } }, "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", "dev": true, "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" + "engines": { + "node": "20 || >=22" } }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "node_modules/lucide-react": { + "version": "0.292.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.292.0.tgz", + "integrity": "sha512-rRgUkpEHWpa5VCT66YscInCQmQuPCB1RFRzkkxMxg4b+jaL0V12E3riWWR2Sh5OIiUhCwGW/ZExuEO4Az32E6Q==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" } }, "node_modules/math-intrinsics": { @@ -4902,6 +4042,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4909,6 +4059,18 @@ "dev": true, "license": "MIT" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -4951,40 +4113,41 @@ "license": "MIT" }, "node_modules/next": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/next/-/next-16.0.1.tgz", - "integrity": "sha512-e9RLSssZwd35p7/vOa+hoDFggUZIUbZhIUSLZuETCwrCVvxOs87NamoUzT+vbcNAL8Ld9GobBnWOA6SbV/arOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.33.tgz", + "integrity": "sha512-GiKHLsD00t4ACm1p00VgrI0rUFAC9cRDGReKyERlM57aeEZkOQGcZTpIbsGn0b562FTPJWmYfKwplfO9EaT6ng==", "license": "MIT", "dependencies": { - "@next/env": "16.0.1", - "@swc/helpers": "0.5.15", + "@next/env": "14.2.33", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", "postcss": "8.4.31", - "styled-jsx": "5.1.6" + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=20.9.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.0.1", - "@next/swc-darwin-x64": "16.0.1", - "@next/swc-linux-arm64-gnu": "16.0.1", - "@next/swc-linux-arm64-musl": "16.0.1", - "@next/swc-linux-x64-gnu": "16.0.1", - "@next/swc-linux-x64-musl": "16.0.1", - "@next/swc-win32-arm64-msvc": "16.0.1", - "@next/swc-win32-x64-msvc": "16.0.1", - "sharp": "^0.34.4" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.51.1", - "babel-plugin-react-compiler": "*", - "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", "sass": "^1.3.0" }, "peerDependenciesMeta": { @@ -4994,9 +4157,6 @@ "@playwright/test": { "optional": true }, - "babel-plugin-react-compiler": { - "optional": true - }, "sass": { "optional": true } @@ -5037,6 +4197,26 @@ "dev": true, "license": "MIT" }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5047,6 +4227,16 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -5160,6 +4350,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5228,6 +4428,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5251,6 +4458,16 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -5268,6 +4485,33 @@ "dev": true, "license": "MIT" }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5287,6 +4531,26 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -5326,6 +4590,140 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5380,24 +4778,42 @@ "license": "MIT" }, "node_modules/react": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", - "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/react-dom": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", - "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", + "node_modules/react-day-picker": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz", + "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" }, "peerDependencies": { - "react": "^19.2.0" + "date-fns": "^2.28.0 || ^3.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" } }, "node_modules/react-is": { @@ -5407,6 +4823,29 @@ "dev": true, "license": "MIT" }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -5503,6 +4942,26 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5583,19 +5042,25 @@ } }, "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } }, "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/set-function-length": { @@ -5647,62 +5112,6 @@ "node": ">= 0.4" } }, - "node_modules/sharp": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz", - "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.0", - "semver": "^7.7.2" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.4", - "@img/sharp-darwin-x64": "0.34.4", - "@img/sharp-libvips-darwin-arm64": "1.2.3", - "@img/sharp-libvips-darwin-x64": "1.2.3", - "@img/sharp-libvips-linux-arm": "1.2.3", - "@img/sharp-libvips-linux-arm64": "1.2.3", - "@img/sharp-libvips-linux-ppc64": "1.2.3", - "@img/sharp-libvips-linux-s390x": "1.2.3", - "@img/sharp-libvips-linux-x64": "1.2.3", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.3", - "@img/sharp-libvips-linuxmusl-x64": "1.2.3", - "@img/sharp-linux-arm": "0.34.4", - "@img/sharp-linux-arm64": "0.34.4", - "@img/sharp-linux-ppc64": "0.34.4", - "@img/sharp-linux-s390x": "0.34.4", - "@img/sharp-linux-x64": "0.34.4", - "@img/sharp-linuxmusl-arm64": "0.34.4", - "@img/sharp-linuxmusl-x64": "0.34.4", - "@img/sharp-wasm32": "0.34.4", - "@img/sharp-win32-arm64": "0.34.4", - "@img/sharp-win32-ia32": "0.34.4", - "@img/sharp-win32-x64": "0.34.4" - } - }, - "node_modules/sharp/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5802,6 +5211,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -5832,6 +5264,84 @@ "node": ">= 0.4" } }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -5945,6 +5455,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -5969,9 +5506,9 @@ } }, "node_modules/styled-jsx": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", - "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", "license": "MIT", "dependencies": { "client-only": "0.0.1" @@ -5980,7 +5517,7 @@ "node": ">= 12.0.0" }, "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" }, "peerDependenciesMeta": { "@babel/core": { @@ -5991,6 +5528,116 @@ } } }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/sucrase/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6017,25 +5664,82 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tailwind-merge": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", + "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz", - "integrity": "sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==", + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", + "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, "license": "MIT" }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "engines": { + "node": ">=0.8" } }, "node_modules/tinyglobby": { @@ -6100,18 +5804,25 @@ } }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.12" + "node": ">=16" }, "peerDependencies": { - "typescript": ">=4.8.4" + "typescript": ">=4.2.0" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -6125,19 +5836,6 @@ "strip-bom": "^3.0.0" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -6157,6 +5855,19 @@ "node": ">= 0.8.0" } }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -6249,30 +5960,6 @@ "node": ">=14.17" } }, - "node_modules/typescript-eslint": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.2.tgz", - "integrity": "sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.46.2", - "@typescript-eslint/parser": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/utils": "8.46.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -6375,6 +6062,13 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6490,10 +6184,111 @@ "node": ">=0.10.0" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, "license": "ISC" }, @@ -6509,29 +6304,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", - "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-validation-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } } } } diff --git a/package.json b/package.json index f972145..964bfd8 100644 --- a/package.json +++ b/package.json @@ -5,22 +5,42 @@ "scripts": { "dev": "next dev", "build": "next build", - "start": "next start", - "lint": "eslint" + "start": "node server.mjs", + "lint": "next lint", + "clean": "rimraf .next node_modules logs && npm install", + "typecheck": "tsc --noEmit", + "build-and-test": "bash scripts/build-and-test.sh", + "pm2:start": "pm2 start ecosystem.config.js", + "pm2:stop": "pm2 stop warme", + "pm2:restart": "pm2 restart warme", + "pm2:logs": "pm2 logs warme --lines 100 --nostream", + "pm2:delete": "pm2 delete warme" }, "dependencies": { - "react": "19.2.0", - "react-dom": "19.2.0", - "next": "16.0.1" + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", + "date-fns": "^2.30.0", + "lucide-react": "^0.292.0", + "next": "^14.2.33", + "react": "18.2.0", + "react-day-picker": "^8.9.1", + "react-dom": "18.2.0", + "tailwind-merge": "^2.0.0" }, "devDependencies": { - "typescript": "^5", + "@eslint/config-array": "^0.21.1", + "@eslint/object-schema": "^2.1.7", "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "@tailwindcss/postcss": "^4", - "tailwindcss": "^4", - "eslint": "^9", - "eslint-config-next": "16.0.1" + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.4.16", + "eslint": "^8.57.1", + "eslint-config-next": "14.0.3", + "glob": "^11.0.3", + "lru-cache": "^11.2.2", + "postcss": "^8.4.31", + "rimraf": "^6.0.1", + "tailwindcss": "^3.3.5", + "typescript": "^5.2.2" } } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..d1e091e --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + 'tailwindcss': {}, + 'autoprefixer': {}, + } +} \ No newline at end of file diff --git a/public/img/brunch.jpg b/public/img/brunch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b607fb7d8d7d4bd169e36ff90a2cbeab4d9e71ec GIT binary patch literal 14933 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 Szz%^O0y_l$FA{($hW`iuqF~?v literal 0 HcmV?d00001 diff --git a/public/img/grill.jpg b/public/img/grill.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c4f614aa016bd6966bb43dc3ccfc62ce7e3b4c4 GIT binary patch literal 10887 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 literal 0 HcmV?d00001 diff --git a/public/img/jul.jpg b/public/img/jul.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7006fd5a3335321fdb1953de18bd0982e572e4a4 GIT binary patch literal 15271 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 literal 0 HcmV?d00001 diff --git a/public/img/klassisk.jpg b/public/img/klassisk.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f33d1e213973299b4a0373fe71e8fb6eeceae3a6 GIT binary patch literal 11151 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 literal 0 HcmV?d00001 diff --git a/public/img/nordisk.jpg b/public/img/nordisk.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb5291c3f27109c306011721d5c70f52c24b94be GIT binary patch literal 11646 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 Oa6sVy4gnSAhyMn5fu$4x literal 0 HcmV?d00001 diff --git a/public/img/tapas.jpg b/public/img/tapas.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b663c4be575d264d261df0fd4cd6e42d95ce6d0 GIT binary patch literal 14388 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 Q*dnk+;Qx-m{>{OE2W!vIBLDyZ literal 0 HcmV?d00001 diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/scripts/build-and-test.sh b/scripts/build-and-test.sh new file mode 100755 index 0000000..fdbb9f0 --- /dev/null +++ b/scripts/build-and-test.sh @@ -0,0 +1,73 @@ +#!/bin/bash + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo -e "${YELLOW}🚀 Starting build and test process...${NC}\n" + +# Kill any running Next.js processes +echo -e "📌 Cleaning up previous processes..." +pkill -f "next" || true + +# Remove build artifacts and dependencies +echo -e "🧹 Cleaning build artifacts..." +npx rimraf .next node_modules + +# Install dependencies +echo -e "\n📦 Installing dependencies..." +if npm install; then + echo -e "${GREEN}✓ Dependencies installed successfully${NC}" +else + echo -e "${RED}✗ Failed to install dependencies${NC}" + exit 1 +fi + +# Type checking +echo -e "\n📝 Running type check..." +if npm run typecheck; then + echo -e "${GREEN}✓ Type check passed${NC}" +else + echo -e "${RED}✗ Type check failed${NC}" + exit 1 +fi + +# Build the application +echo -e "\n🏗️ Building the application..." +if npm run build; then + echo -e "${GREEN}✓ Build successful${NC}" +else + echo -e "${RED}✗ Build failed${NC}" + exit 1 +fi + +# Start with PM2 +echo -e "\n🚀 Starting application with PM2..." +pm2 delete warme 2>/dev/null || true +if pm2 start npm --name "warme" -- start; then + echo -e "${GREEN}✓ Application started successfully${NC}" +else + echo -e "${RED}✗ Failed to start application${NC}" + exit 1 +fi + +# Show logs +echo -e "\n📋 Recent application logs:" +pm2 logs warme --lines 20 --nostream + +# Health check +echo -e "\n🏥 Performing health check..." +sleep 5 # Wait for app to fully start +if curl -s -o /dev/null -w "%{http_code}" http://localhost:3000 | grep -q "200"; then + echo -e "${GREEN}✓ Application is responding${NC}" +else + echo -e "${RED}✗ Application is not responding${NC}" + # Show error logs + echo -e "\n❌ Error logs:" + pm2 logs warme --err --lines 20 --nostream + exit 1 +fi + +echo -e "\n${GREEN}✅ Build and test process completed successfully!${NC}" \ No newline at end of file diff --git a/server.mjs b/server.mjs new file mode 100644 index 0000000..12db777 --- /dev/null +++ b/server.mjs @@ -0,0 +1,29 @@ +import { createServer } from 'http' +import { parse } from 'url' +import next from 'next' + +const dev = process.env.NODE_ENV !== 'production' +const hostname = 'localhost' +const port = 3000 +const app = next({ dev, hostname, port }) +const handle = app.getRequestHandler() + +app.prepare().then(() => { + createServer(async (req, res) => { + try { + const parsedUrl = parse(req.url, true) + await handle(req, res, parsedUrl) + } catch (err) { + console.error('Error occurred handling', req.url, err) + res.statusCode = 500 + res.end('Internal Server Error') + } + }) + .once('error', (err) => { + console.error(err) + process.exit(1) + }) + .listen(port, () => { + console.log(`> Ready on http://${hostname}:${port}`) + }) +}) \ No newline at end of file diff --git a/src/app/(admin)/admin/page.tsx b/src/app/(admin)/admin/page.tsx new file mode 100644 index 0000000..82eb066 --- /dev/null +++ b/src/app/(admin)/admin/page.tsx @@ -0,0 +1,154 @@ +'use client' + +import { useState } from 'react' +import { Calendar, Users, FileText, Settings, ChefHat } from 'lucide-react' +import { CalendarView } from '@/components/admin/calendar-view' +import { BookingsView } from '@/components/admin/bookings-view' +import { siteConfig } from '@/config/site' + +const sections = [ + { id: 'calendar', icon: Calendar, label: 'Kalender' }, + { id: 'bookings', icon: Users, label: 'Bookinger' }, + { id: 'quotes', icon: FileText, label: 'Tilbud' }, + { id: 'settings', icon: Settings, label: 'Indstillinger' } +] as const + +type Section = (typeof sections)[number]['id'] + +export default function AdminDashboard() { + const [activeSection, setActiveSection] = useState
('calendar') + + return ( +
+
+ {/* Sidebar */} +
+
+
+ +

{siteConfig.brand.displayName}

+
+
+ +
+ + {/* Main Content */} +
+
+ {activeSection === 'calendar' && } + {activeSection === 'bookings' && } + + {activeSection === 'quotes' && ( +
+
+

+ + Tilbud +

+
+ +
+
+

Aktive tilbud

+
+
+
+
+

Anders Andersen

+

Fødselsdag • 45 kuverter

+
+

22.950 kr.

+
+
+ + +
+
+
+
+
+
+ )} + + {activeSection === 'settings' && ( +
+
+

+ + Indstillinger +

+
+ +
+
+

Priser og satser

+
+
+ + +
+
+ + +
+
+
+ +
+

Integration

+
+
+ + +
+ +
+
+
+
+ )} +
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/app/(marketing)/layout.tsx b/src/app/(marketing)/layout.tsx new file mode 100644 index 0000000..c5ce362 --- /dev/null +++ b/src/app/(marketing)/layout.tsx @@ -0,0 +1,80 @@ +import Link from 'next/link' +import { siteConfig } from '@/config/site' +import { sampleData } from '@/config/sample-data' + +const navigation = [ + { name: 'Menuer', href: '/menuer' }, + { name: 'Pakker', href: '/pakker' }, + { name: 'Book', href: '/book' }, + { name: 'Kontakt', href: '/kontakt' }, +] + +export default function MarketingLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( +
+
+ +
+ +
+ {children} +
+ +
+
+
+
+

{siteConfig.brand.displayName}

+

{siteConfig.brand.tagline}

+
+
+

Navigation

+
    + {navigation.map((item) => ( +
  • + + {item.name} + +
  • + ))} +
+
+
+

Kontakt

+
    +
  • {sampleData.chef.contact.phone}
  • +
  • {sampleData.chef.contact.email}
  • +
+
+
+
+

© {new Date().getFullYear()} {siteConfig.brand.displayName}

+
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/app/(marketing)/page.tsx b/src/app/(marketing)/page.tsx new file mode 100644 index 0000000..aefd0b3 --- /dev/null +++ b/src/app/(marketing)/page.tsx @@ -0,0 +1,39 @@ +import { Metadata } from 'next' +import { siteConfig } from '@/config/site' +import { Hero } from '@/components/marketing/hero' +import { USPList } from '@/components/marketing/usp-list' +import { FeaturedMenus } from '@/components/marketing/featured-menus' +import { CTASection } from '@/components/marketing/cta-section' + +export const metadata: Metadata = { + title: siteConfig.brand.displayName + ' | Privat Kok i København', + description: 'Professionel privat kok til din næste fest. Højt service niveau og rustikke gourmét retter tilberedt i dit hjem. Perfekt til selskaber på 20–50 personer.', + openGraph: { + title: siteConfig.brand.displayName + ' | Privat Kok i København', + description: 'Professionel privat kok til din næste fest. Højt service niveau og rustikke gourmét retter tilberedt i dit hjem.', + url: siteConfig.domain, + siteName: siteConfig.brand.displayName, + locale: siteConfig.locale, + type: 'website', + }, +} + +export default function HomePage() { + return ( +
+
+ +
+
+

+ Hvorfor vælge {siteConfig.brand.displayName}? +

+ +
+
+ + +
+
+ ) +} \ No newline at end of file diff --git a/src/app/betingelser/page.tsx b/src/app/betingelser/page.tsx new file mode 100644 index 0000000..a58ab9b --- /dev/null +++ b/src/app/betingelser/page.tsx @@ -0,0 +1,31 @@ +export default function TermsPage() { + const terms = [ + "Kuvertpriser gælder ved min. 20 kuverter", + "Endeligt tilbud fremsendes på mail", + "Aflysning: senest 7 dage før (ellers 50% af tilbudssum)", + "Allergener og specialkost aftales senest 5 dage før" + ] + + return ( +
+
+

Betingelser

+
+
    + {terms.map((term, index) => ( +
  • + + {index + 1} + + {term} +
  • + ))} +
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/app/book/page.tsx b/src/app/book/page.tsx new file mode 100644 index 0000000..74f056e --- /dev/null +++ b/src/app/book/page.tsx @@ -0,0 +1,147 @@ +'use client' + +import { DatePicker } from '@/components/ui/date-picker' +import { NumberInput } from '@/components/ui/number-input' +import { Input } from '@/components/ui/input' +import { sampleData } from '@/config/sample-data' +import { Package, Menu } from '@/types/models' +import { useState } from 'react' + +export default function BookingPage() { + return ( +
+
+

Forespørg booking

+ +
+ {/* Step 1: Basic Details */} +
+

Vælg dato, sted, kuverter

+
+
+ + +
+
+ + +
+
+ + +
+
+
+ + {/* Step 2: Menu & Package Selection */} +
+

Vælg menu og pakke

+
+
+

Menu

+
+ {sampleData.menus.map((menu: Menu) => ( + + ))} +
+
+ +
+

Pakke

+
+ {sampleData.packages.map((pkg: Package) => ( + + ))} +
+
+
+
+ + {/* Step 3: Contact Information */} +
+

Kontaktoplysninger

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ ) +} \ No newline at end of file diff --git a/src/app/globals.css b/src/app/globals.css index a2dc41e..70b91da 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,26 +1,16 @@ -@import "tailwindcss"; +@tailwind base; +@tailwind components; +@tailwind utilities; :root { --background: #ffffff; --foreground: #171717; } -@theme inline { - --color-background: var(--background); - --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); - --font-mono: var(--font-geist-mono); -} - -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } -} - body { background: var(--background); color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } diff --git a/src/app/kontakt/page.tsx b/src/app/kontakt/page.tsx new file mode 100644 index 0000000..249eaf6 --- /dev/null +++ b/src/app/kontakt/page.tsx @@ -0,0 +1,96 @@ +import { sampleData } from '@/config/sample-data' +import { Input } from '@/components/ui/input' +import { Mail, Phone, Instagram, Facebook } from 'lucide-react' + +export default function ContactPage() { + const { contact } = sampleData.chef + + return ( +
+
+

Kontakt

+ +
+ {/* Contact Info */} + + + {/* Contact Form */} +
+

Send besked

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/app/layout.tsx b/src/app/layout.tsx index f7fa87e..10fe573 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,34 +1,51 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; +import { Metadata } from 'next' +import { siteConfig } from '@/config/site' +import './globals.css' +import { Inter } from 'next/font/google' +import { cn } from '@/lib/utils' -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); +const inter = Inter({ subsets: ['latin'] }) export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; + metadataBase: new URL(siteConfig.domain), + title: { + default: siteConfig.brand.displayName, + template: siteConfig.meta.title, + }, + description: siteConfig.meta.description, + robots: { + index: true, + follow: true, + }, + openGraph: { + type: 'website', + locale: siteConfig.locale, + url: siteConfig.domain, + title: siteConfig.brand.displayName, + description: siteConfig.meta.description, + siteName: siteConfig.brand.displayName, + }, + authors: [ + { + name: siteConfig.brand.displayName, + url: siteConfig.domain, + }, + ], +} export default function RootLayout({ children, -}: Readonly<{ - children: React.ReactNode; -}>) { +}: { + children: React.ReactNode +}) { return ( - - + + {children} - ); + ) } diff --git a/src/app/menuer/page.tsx b/src/app/menuer/page.tsx new file mode 100644 index 0000000..6e99b79 --- /dev/null +++ b/src/app/menuer/page.tsx @@ -0,0 +1,174 @@ +'use client' + +import { sampleData } from '@/config/sample-data' +import { ImagePlaceholder } from '@/components/ui/image-placeholder' +import { cn } from '@/lib/utils' +import { useState } from 'react' +import { siteConfig } from '@/config/site' +import { Menu } from '@/types/models' + +const priceRanges = [ + { label: 'Alle priser', min: 0, max: 1000 }, + { label: 'Under 400 kr', min: 0, max: 400 }, + { label: '400-500 kr', min: 400, max: 500 }, + { label: 'Over 500 kr', min: 500, max: 1000 } +] + +const menuTypes = [ + 'Alle typer', + 'Nordisk', + 'Vegetarisk', + 'Fransk', + 'Italiensk', + 'Spansk', + 'Grill', + 'Brunch' +] + +export default function MenusPage() { + const [selectedPriceRange, setSelectedPriceRange] = useState(priceRanges[0]) + const [selectedType, setSelectedType] = useState(menuTypes[0]) + const { menus } = sampleData + + const filteredMenus = menus.filter((menu: Menu) => { + const matchesPrice = menu.basePricePerCover >= selectedPriceRange.min && + menu.basePricePerCover <= selectedPriceRange.max + const matchesType = selectedType === 'Alle typer' || + menu.tags.includes(selectedType) + return matchesPrice && matchesType + }) + + return ( +
+
+
+
+

Vores menuer

+

+ Vælg mellem vores populære menuer eller lad os skræddersy en menu til jeres arrangement. + Alle menuer kan tilpasses efter jeres ønsker og behov. +

+
+ + {/* Filters */} +
+
+
+ + +
+
+ + +
+
+ +
+ Viser {filteredMenus.length} menuer + {selectedType !== 'Alle typer' && ` • ${selectedType}`} + {selectedPriceRange.label !== 'Alle priser' && ` • ${selectedPriceRange.label}`} +
+
+ + {/* Menu Grid */} +
+ {filteredMenus.map((menu) => ( +
+
+ +
+
+
+
+

{menu.title}

+

{menu.description}

+
+
+
+ {menu.basePricePerCover} kr +
+
pr. kuvert
+
+
+ +
+
+

Menuen indeholder

+
    + {menu.courses.map((course, index) => ( +
  • + + {index === 0 ? 'Forret' : index === menu.courses.length - 1 ? 'Dessert' : 'Hovedret'} + + {course} +
  • + ))} +
+
+ +
+ {menu.tags.map((tag) => ( + + {tag} + + ))} +
+ +
+
+ Min. {menu.minCovers} kuverter +
+ + Vælg menu + +
+
+
+
+ ))} +
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx new file mode 100644 index 0000000..d0d9e3d --- /dev/null +++ b/src/app/not-found.tsx @@ -0,0 +1,18 @@ +import Link from 'next/link' + +export default function NotFound() { + return ( +
+

404

+

+ Siden blev ikke fundet +

+ + Gå til forsiden + +
+ ) +} \ No newline at end of file diff --git a/src/app/page.tsx b/src/app/page.tsx index 295f8fd..04eca36 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,65 +1,39 @@ -import Image from "next/image"; +import { Hero } from '@/components/marketing/hero' +import { USPList } from '@/components/marketing/usp-list' +import { FeaturedMenus } from '@/components/marketing/featured-menus' +import { CTASection } from '@/components/marketing/cta-section' +import { Metadata } from 'next' +import { siteConfig } from '@/config/site' -export default function Home() { +export const metadata: Metadata = { + title: siteConfig.brand.displayName + ' | Privat Kok i København', + description: 'Professionel privat kok til din næste fest. Højt service niveau og rustikke gourmét retter tilberedt i dit hjem. Perfekt til selskaber på 20–50 personer.', + openGraph: { + title: siteConfig.brand.displayName + ' | Privat Kok i København', + description: 'Professionel privat kok til din næste fest. Højt service niveau og rustikke gourmét retter tilberedt i dit hjem.', + url: siteConfig.domain, + siteName: siteConfig.brand.displayName, + locale: siteConfig.locale, + type: 'website', + }, +} + +export default function HomePage() { return ( -
-
- Next.js logo -
-

- To get started, edit the page.tsx file. -

-

- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -

-
- +
+
+ +
+
+

+ Hvorfor vælge {siteConfig.brand.displayName}? +

+ +
+
+ +
- ); + ) } diff --git a/src/app/pakker/page.tsx b/src/app/pakker/page.tsx new file mode 100644 index 0000000..baef793 --- /dev/null +++ b/src/app/pakker/page.tsx @@ -0,0 +1,83 @@ +import { sampleData } from '@/config/sample-data' +import { Package } from '@/types/models' +import { CheckCircle } from 'lucide-react' + +function PackageCard({ pkg }: { pkg: Package }) { + return ( +
+
+

{pkg.name}

+
+ {pkg.pricePerCover} DKK + + pr. kuvert + +
+ +
+
+

Inkluderet

+
    + {pkg.includes.map((item, index) => ( +
  • + + {item} +
  • + ))} +
+
+ + {pkg.upsells.length > 0 && ( +
+

Tilvalg

+
    + {pkg.upsells.map((upsell) => ( +
  • + {upsell.label} + + {upsell.priceFlat ? `${upsell.priceFlat} DKK` : + upsell.pricePerCover ? `${upsell.pricePerCover} DKK pr. kuvert` : + upsell.pricePerHourPerServer ? `${upsell.pricePerHourPerServer} DKK/time` : ''} + +
  • + ))} +
+
+ )} + +
+

{pkg.notes}

+
+ + +
+
+
+ ) +} + +export default function PackagesPage() { + return ( +
+
+

Vælg pakke

+

+ Vælg pakke – fra enkel kokkeløsning til fuld bemanding. +

+ +
+ {sampleData.packages.map((pkg) => ( + + ))} +
+
+
+ ) +} \ No newline at end of file diff --git a/src/components/admin/bookings-view.tsx b/src/components/admin/bookings-view.tsx new file mode 100644 index 0000000..46d08fd --- /dev/null +++ b/src/components/admin/bookings-view.tsx @@ -0,0 +1,100 @@ +import { Users } from 'lucide-react' +import { sampleData } from '@/config/sample-data' +import { BookingRequest } from '@/types/models' + +const sampleBookings: BookingRequest[] = [ + { + id: 'booking-1', + customer: { + name: 'Anders Andersen', + email: 'anders@example.com', + phone: '+45 12 34 56 78' + }, + event: { + type: 'Fødselsdag', + notes: '50 års fødselsdag' + }, + covers: 45, + date: '2025-11-15', + location: 'København K', + menuId: 'klassisk-3-retter', + packageId: 'kok-plus', + notes: 'Vegetar-alternativer ønskes til 5 personer', + staffing: { + helpers: 1, + servers: 2 + }, + quote: { + subtotal: 19125, + ingredients: 2475, + labour: 14000, + helpersCost: 800, + serversCost: 1200, + travelCost: 450, + extras: [ + { id: 'serviceleje', amount: 1500 } + ], + margin: 3825, + total: 22950 + }, + status: 'pending' + } +] + +export function BookingsView() { + return ( +
+
+

+ + Bookinger +

+
+ +
+
+ + + + + + + + + + + + + + {sampleBookings.map((booking) => { + const menu = sampleData.menus.find(m => m.id === booking.menuId) + return ( + + + + + + + + + + ) + })} + +
DatoKundeEventMenuKuverterTotalStatus
{booking.date} +
+
{booking.customer.name}
+
{booking.location}
+
+
{booking.event.type}{menu?.title}{booking.covers} + {booking.quote.total.toLocaleString('da-DK')} kr. + + + Afventer + +
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/components/admin/calendar-view.tsx b/src/components/admin/calendar-view.tsx new file mode 100644 index 0000000..6557dbd --- /dev/null +++ b/src/components/admin/calendar-view.tsx @@ -0,0 +1,46 @@ +import { Calendar as CalendarIcon } from 'lucide-react' + +export function CalendarView() { + return ( +
+
+

+ + Kalender +

+
+ +
+
+

Kommende events

+
+
+
+

Fredag d. 15. november

+

Klassisk 3-retters • 45 kuverter

+

Anders Andersen • København K

+
+
+ + Afventer + +
+
+
+
+ +
+

Blackout perioder

+
+

+ Jul: 24-26. december 2025 +

+

+ Nytår: 31. december 2025 +

+
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/components/marketing/cta-section.tsx b/src/components/marketing/cta-section.tsx new file mode 100644 index 0000000..19b4a06 --- /dev/null +++ b/src/components/marketing/cta-section.tsx @@ -0,0 +1,20 @@ +import { Button } from '@/components/ui/button' + +export function CTASection() { + return ( +
+
+

+ Klar til at planlægge? +

+ +
+
+ ) +} \ No newline at end of file diff --git a/src/components/marketing/featured-menus.tsx b/src/components/marketing/featured-menus.tsx new file mode 100644 index 0000000..e6228f4 --- /dev/null +++ b/src/components/marketing/featured-menus.tsx @@ -0,0 +1,123 @@ +import { sampleData } from '@/config/sample-data' +import { Menu } from '@/types/models' +import { ImagePlaceholder } from '@/components/ui/image-placeholder' +import { cn } from '@/lib/utils' +import { ArrowRight } from 'lucide-react' + +export function FeaturedMenus() { + // Only show the first 4 menus on the marketing page + const { packages, menus } = sampleData + const featuredMenus = menus.slice(0, 4) + + return ( +
+
+
+

+ Skræddersyet Madoplevelse +

+

+ Vælg mellem vores populære menuer eller lad os sammensætte en menu der passer til jeres ønsker +

+
+
+ {featuredMenus.map((menu: Menu) => { + const basePackage = packages.find((p: { menuId: string }) => p.menuId === menu.id) + return ( + + ) + })} +
+ +
+
+ ) +} + +function MenuCard({ menu, basePrice }: { menu: Menu, basePrice?: number }) { + return ( + +
+ +
+
+
+
+

+ {menu.title} +

+

{menu.description}

+
+
+ {basePrice && ( + <> +
+ {basePrice} kr +
+
+ pr. kuvert +
+ + )} +
+
+ +
+
+

Menuen indeholder

+
    + {menu.courses.slice(0, 3).map((course, index) => ( +
  • + + {index === 0 ? 'Forret' : index === 2 ? 'Dessert' : 'Hovedret'} + + {course} +
  • + ))} + {menu.courses.length > 3 && ( +
  • + + {menu.courses.length - 3} flere retter +
  • + )} +
+
+ +
+ {menu.tags.map((tag) => ( + + {tag} + + ))} +
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/components/marketing/hero.tsx b/src/components/marketing/hero.tsx new file mode 100644 index 0000000..aa0f83a --- /dev/null +++ b/src/components/marketing/hero.tsx @@ -0,0 +1,76 @@ +'use client' + +import { Button } from '@/components/ui/button' +import { Input } from '@/components/ui/input' +import { DatePicker } from '@/components/ui/date-picker' +import { NumberInput } from '@/components/ui/number-input' + +export function Hero() { + return ( +
+
+
+

+ Lej Christian Warme som privat kok +

+

+ Forret • Hovedret • Dessert – bedst til 20–50 kuverter +

+
+ + +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/components/marketing/usp-list.tsx b/src/components/marketing/usp-list.tsx new file mode 100644 index 0000000..09b4733 --- /dev/null +++ b/src/components/marketing/usp-list.tsx @@ -0,0 +1,61 @@ +import { CheckCircle, Users, Clock, UtensilsCrossed, Sparkles, CreditCard } from 'lucide-react' +import { sampleData } from '@/config/sample-data' + +const usps = [ + { + title: 'Erfaren professionel kok', + description: 'Uddannet kok med fokus på klassisk madlavning og god service', + icon: UtensilsCrossed + }, + { + title: 'Perfekt til 20-50 personer', + description: 'Specialiseret i mellemstore selskaber med personligt præg', + icon: Users + }, + { + title: 'Faste, gennemsigtige priser', + description: 'Klare priser pr. kuvert - ingen skjulte gebyrer', + icon: CreditCard + }, + { + title: 'Alt er inkluderet', + description: 'Indkøb, tilberedning, anretning og oprydning', + icon: CheckCircle + }, + { + title: 'Fleksibel planlægning', + description: 'Book i god tid eller find ledige datoer med kort varsel', + icon: Clock + }, + { + title: 'Skræddersyet oplevelse', + description: 'Menuer tilpasset dine ønsker og behov', + icon: Sparkles + } +] + +export function USPList() { + return ( +
+
    + {usps.map((usp, index) => ( +
  • +
    +
    + +
    +

    {usp.title}

    +
    +

    {usp.description}

    +
  • + ))} +
+

+ {sampleData.chef.bio} +

+
+ ) +} \ No newline at end of file diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx new file mode 100644 index 0000000..fe76cd2 --- /dev/null +++ b/src/components/ui/button.tsx @@ -0,0 +1,61 @@ +import * as React from 'react' +import { VariantProps, cva } from 'class-variance-authority' +import { cn } from '@/lib/utils' + +const buttonVariants = cva( + 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none', + { + variants: { + variant: { + default: + 'bg-primary text-white hover:bg-primary-700', + accent: + 'bg-accent text-white hover:bg-accent-600', + outline: + 'border border-primary bg-transparent hover:bg-primary-50', + ghost: + 'bg-transparent hover:bg-primary-50', + }, + size: { + default: 'h-10 py-2 px-4', + sm: 'h-9 px-3', + lg: 'h-12 px-8 text-base', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + href?: string +} + +const Button = React.forwardRef( + ({ className, variant, size, href, ...props }, ref) => { + if (href) { + return ( + + {props.children} + + ) + } + return ( + + {isOpen && ( +
+ { + setSelectedDate(date) + onSelect?.(date) + setIsOpen(false) + }} + disabled={disabled} + initialFocus={initialFocus} + locale={da} + /> +
+ )} +
+ ) +} \ No newline at end of file diff --git a/src/components/ui/image-placeholder.tsx b/src/components/ui/image-placeholder.tsx new file mode 100644 index 0000000..28bbf1a --- /dev/null +++ b/src/components/ui/image-placeholder.tsx @@ -0,0 +1,21 @@ +import { cn } from '@/lib/utils' + +interface ImagePlaceholderProps { + label: string + className?: string +} + +export function ImagePlaceholder({ label, className }: ImagePlaceholderProps) { + return ( +
+ + {label} + +
+ ) +} \ No newline at end of file diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx new file mode 100644 index 0000000..0197be1 --- /dev/null +++ b/src/components/ui/input.tsx @@ -0,0 +1,26 @@ +import * as React from 'react' +import { cn } from '@/lib/utils' + +export interface InputProps + extends Omit, 'type'> { + type?: 'text' | 'email' | 'password' | 'number' | 'tel' +} + +const Input = React.forwardRef( + ({ className, type, ...props }, ref) => { + return ( + + ) + } +) +Input.displayName = 'Input' + +export { Input } \ No newline at end of file diff --git a/src/components/ui/number-input.tsx b/src/components/ui/number-input.tsx new file mode 100644 index 0000000..1ada23e --- /dev/null +++ b/src/components/ui/number-input.tsx @@ -0,0 +1,67 @@ +import * as React from 'react' +import { Input } from './input' +import { Button } from './button' +import { cn } from '@/lib/utils' + +export interface NumberInputProps { + min?: number + max?: number + step?: number + value?: number + onChange?: (value: number) => void + className?: string +} + +export const NumberInput = React.forwardRef( + ({ className, min, max, step = 1, value: propValue, onChange, ...props }, ref) => { + const [value, setValue] = React.useState(propValue ?? min ?? 0) + + React.useEffect(() => { + if (propValue !== undefined) { + setValue(propValue) + } + }, [propValue]) + + const handleChange = (newValue: number) => { + if ((min === undefined || newValue >= min) && + (max === undefined || newValue <= max)) { + setValue(newValue) + onChange?.(newValue) + } + } + + return ( +
+ + { + const newValue = parseInt(e.target.value) + if (!isNaN(newValue)) { + handleChange(newValue) + } + }} + {...props} + /> + +
+ ) + } +) +NumberInput.displayName = 'NumberInput' \ No newline at end of file diff --git a/src/config/sample-data.ts b/src/config/sample-data.ts new file mode 100644 index 0000000..991628a --- /dev/null +++ b/src/config/sample-data.ts @@ -0,0 +1,457 @@ +export const sampleData = { + rates: { + chefHourly: 350, + helperHourly: 200, + serverHourly: 150, + travelPerKm: 4.5, + minServerHours: 4 + }, + staffPool: { + helpers: [ + { id: 'h1', name: 'Ekstra køkkenhjælp', maxHours: 8 } + ], + servers: [ + { id: 's1', name: 'Servering 1' }, + { id: 's2', name: 'Servering 2' } + ], + minHours: 4, + autoAssignRules: { + serveringHoursFunction: 'ceil(covers / 25) * 4', + helpersThreshold: [ + { maxCovers: 35, helpers: 0 }, + { maxCovers: 60, helpers: 1 }, + { maxCovers: 80, helpers: 2 } + ] + } + }, + chef: { + id: 'christian-warme', + name: 'Christian Warme', + brand: 'warme.dk', + bio: 'Uddannet kok (3–4 år). Klassiske selskabsmenuer med ro i køkkenet og fokus på gæsternes oplevelse.', + skills: ['Klassisk dansk', 'Nordisk', 'Italiensk', 'Dessert'], + serviceAreaKm: 80, + baseCity: 'København', + photo: '/img/christian-warme.jpg', + contact: { + phone: '+45 12 34 56 78', + email: 'kontakt@warme.dk', + instagram: 'https://www.instagram.com/warme.dk', + facebook: 'https://www.facebook.com/warme.dk' + } + }, + menus: [ + { + id: 'klassisk-3-retter', + title: 'Klassisk Menu', + description: 'En traditionel dansk menu med et moderne twist. Populært valg til familiefester.', + courses: [ + 'Varmrøget laks med rygeostcreme, dild og radiser', + 'Rosastegt kalvefilet med sæsonens grøntsager og rødvinssauce', + 'Chokoladekage med bær og vaniljeis' + ], + tags: ['Nordisk', 'Klassisk', 'Populær'], + image: '/img/klassisk.jpg', + baseIngredientsPerCover: 65, + ingredientsCostIndex: 1.0, + baseLabourHours: 4, + incrementalLabourPerCover: 0.05, + minCovers: 15, + leadTimeDays: 7, + basePricePerCover: 295 + }, + { + id: 'gron-3-retter', + title: 'Grøn Menu', + description: 'Sæsonbaseret vegetarisk menu med fokus på smag og farver. Perfekt til både vegetarer og kødelskere.', + courses: [ + 'Grillet asparges med hollandaise og karse', + 'Svamperisotto med parmesan og urter', + 'Pocherede pærer med vaniljeis og hasselnødder' + ], + tags: ['Vegetarisk', 'Sæson', 'Populær'], + image: '/img/veg.jpg', + baseIngredientsPerCover: 55, + ingredientsCostIndex: 0.95, + baseLabourHours: 4, + incrementalLabourPerCover: 0.05, + minCovers: 15, + leadTimeDays: 7, + basePricePerCover: 275 + }, + { + id: 'italiensk-fest', + title: 'Italiensk Aften', + description: 'Det bedste fra det italienske køkken. Afslappet stemning med mad serveret "family style".', + courses: [ + 'Antipasti med charcuteri, oliven og bruschetta', + 'Hjemmelavet pasta med tomat og basilikum', + 'Tiramisu med mascarpone' + ], + tags: ['Italiensk', 'Pasta', 'Afslappet'], + image: '/img/italiensk.jpg', + baseIngredientsPerCover: 55, + ingredientsCostIndex: 0.9, + baseLabourHours: 4, + incrementalLabourPerCover: 0.05, + minCovers: 15, + leadTimeDays: 7, + basePricePerCover: 250 + }, + { + id: 'grill-menu', + title: 'Grill Menu', + description: 'Lækker grillmenu perfekt til sommeraftener og uformelle selskaber.', + courses: [ + 'Grillede peberfrugter med hvidløgsdip', + 'Marineret kylling og grillet flanksteak', + 'Grillede ferskner med vaniljeis' + ], + tags: ['Grill', 'Sommer', 'Afslappet'], + image: '/img/grill.jpg', + baseIngredientsPerCover: 60, + ingredientsCostIndex: 1.0, + baseLabourHours: 4, + incrementalLabourPerCover: 0.05, + minCovers: 20, + leadTimeDays: 7, + basePricePerCover: 275 + }, + { + id: 'nordisk-buffet', + title: 'Nordisk Buffet', + description: 'Moderne nordisk buffet med sæsonens bedste råvarer. God til større selskaber.', + courses: [ + 'Koldrøget laks og marinerede sild', + 'Frikadeller med nye kartofler', + 'Klassisk æblekage med flødeskum' + ], + tags: ['Nordisk', 'Buffet', 'Traditionel'], + image: '/img/nordisk.jpg', + baseIngredientsPerCover: 65, + ingredientsCostIndex: 1.0, + baseLabourHours: 5, + incrementalLabourPerCover: 0.04, + minCovers: 25, + leadTimeDays: 7, + basePricePerCover: 250 + }, + { + id: 'brunch-klassisk', + title: 'Brunch Menu', + description: 'Klassisk brunch buffet med alt det bedste til en god start på dagen.', + courses: [ + 'Røræg og bacon', + 'Croissanter og rundstykker', + 'Yoghurt med müsli og frisk frugt' + ], + tags: ['Brunch', 'Morgenmad', 'Buffet'], + image: '/img/brunch.jpg', + baseIngredientsPerCover: 45, + ingredientsCostIndex: 0.85, + baseLabourHours: 3, + incrementalLabourPerCover: 0.04, + minCovers: 15, + leadTimeDays: 5, + basePricePerCover: 225 + }, + { + id: 'tapas-menu', + title: 'Tapas Menu', + description: 'Spanske tapas og pinxtos. Perfekt til reception eller let aftensmad.', + courses: [ + 'Serrano skinke og manchego', + 'Tortilla og patatas bravas', + 'Churros med chokolade' + ], + tags: ['Spansk', 'Tapas', 'Reception'], + image: '/img/tapas.jpg', + baseIngredientsPerCover: 50, + ingredientsCostIndex: 0.95, + baseLabourHours: 4, + incrementalLabourPerCover: 0.05, + minCovers: 20, + leadTimeDays: 7, + basePricePerCover: 265 + }, + { + id: 'gourmet-upgrade', + title: 'Gourmet Menu', + description: 'En eksklusiv 4-retters menu til de særlige lejligheder.', + courses: [ + 'Carpaccio af oksefilet med trøffelolie', + 'Jordskokkesuppe med chips', + 'Lammeculotte med sæsonens grønt', + 'Chokoladefondant med is' + ], + tags: ['Gourmet', 'Special', 'Luksus'], + image: '/img/gourmet.jpg', + baseIngredientsPerCover: 95, + ingredientsCostIndex: 1.2, + baseLabourHours: 5, + incrementalLabourPerCover: 0.06, + minCovers: 10, + leadTimeDays: 7, + basePricePerCover: 495 + }, + { + id: 'nordisk-signatur', + title: 'Nordisk Signatur', + description: 'En gastronomisk rejse gennem Nordens skatte med 4 serveringer.', + courses: [ + 'Rimmet kammusling med æble og dild', + 'Jordskokkesuppe med trøffel og sprødt', + 'Grillet torsk med blomkål og brunet smør', + 'Brombærdessert med hvid chokolade' + ], + tags: ['Nordisk', 'Fisk', 'Sæson', 'Signatur'], + image: '/img/nordisk.jpg', + baseIngredientsPerCover: 95, + ingredientsCostIndex: 1.2, + baseLabourHours: 5, + incrementalLabourPerCover: 0.06, + minCovers: 10, + leadTimeDays: 7, + basePricePerCover: 745 + }, + { + id: 'italiensk-fest', + title: 'Italiensk Fest', + description: 'Det bedste fra det italienske køkken med 4 serveringer.', + courses: [ + 'Antipasti med charcuteri og lokale oste', + 'Hjemmelavet ravioli med ricotta og salvie', + 'Braiseret kalvekød med gremolata', + 'Tiramisu med mascarpone' + ], + tags: ['Italiensk', 'Pasta', 'Gourmet'], + image: '/img/italiensk.jpg', + baseIngredientsPerCover: 85, + ingredientsCostIndex: 1.1, + baseLabourHours: 5, + incrementalLabourPerCover: 0.05, + minCovers: 10, + leadTimeDays: 7, + basePricePerCover: 695 + }, + { + id: 'fransk-gourmet', + title: 'Fransk Gourmet', + description: 'Klassisk fransk kogekunst med moderne touch og 5 serveringer.', + courses: [ + 'Østers med vinaigrette og citron', + 'Foie gras med brioche og fignekompot', + 'Hummerbisque med cognac', + 'Confiteret andelår med pommes sarladaises', + 'Crème brûlée med bær' + ], + tags: ['Fransk', 'Gourmet', 'Luksus'], + image: '/img/fransk.jpg', + baseIngredientsPerCover: 125, + ingredientsCostIndex: 1.3, + baseLabourHours: 6, + incrementalLabourPerCover: 0.07, + minCovers: 10, + leadTimeDays: 10, + basePricePerCover: 895 + }, + { + id: 'tapas-deluxe', + title: 'Tapas Deluxe', + description: 'En luksuriøs aften med spanske specialiteter og 7 serveringer.', + courses: [ + 'Jamon Iberico de Bellota', + 'Grillede rejer med hvidløg', + 'Blæksprutteragout i egen blæk', + 'Patatas bravas med aioli', + 'Pimientos de padrón', + 'Albóndigas i tomatsauce', + 'Churros med chokolade' + ], + tags: ['Spansk', 'Tapas', 'Deleretter', 'Luksus'], + image: '/img/tapas.jpg', + baseIngredientsPerCover: 110, + ingredientsCostIndex: 1.2, + baseLabourHours: 5, + incrementalLabourPerCover: 0.06, + minCovers: 10, + leadTimeDays: 7, + basePricePerCover: 745 + }, + { + id: 'julemenu-luksus', + title: 'Julemenu de Luxe', + description: 'En luksuriøs fortolkning af traditionel julemad med 4 serveringer.', + courses: [ + 'Hjemmelavet gravad laks med sennepsdressing', + 'Julesuppe med and og urter', + 'Confiteret andelår med rødkål og brunede kartofler', + 'Ris a la mande med kirsebærsauce og sprød mandel' + ], + tags: ['Jul', 'Dansk', 'Traditionel', 'Luksus'], + image: '/img/jul.jpg', + baseIngredientsPerCover: 95, + ingredientsCostIndex: 1.15, + baseLabourHours: 5, + incrementalLabourPerCover: 0.06, + minCovers: 10, + leadTimeDays: 14, + basePricePerCover: 695 + }, + { + id: 'brunch-luksus', + title: 'Luksus Brunch', + description: 'Overdådig brunch med 8 serveringer og bobler.', + courses: [ + 'Velkomst med mousserende vin og snacks', + 'Røræg med trøffel og hjemmebagt brød', + 'Røget laks med ærtepuré', + 'Charcuteri og nordiske oste', + 'Sprøde croissanter og wienerbrød', + 'Yoghurt med granola og friske bær', + 'Pandekager med ahornsirup', + 'Mini-dessertanretning' + ], + tags: ['Brunch', 'Morgenmad', 'Luksus'], + image: '/img/brunch.jpg', + baseIngredientsPerCover: 85, + ingredientsCostIndex: 1.1, + baseLabourHours: 4, + incrementalLabourPerCover: 0.05, + minCovers: 10, + leadTimeDays: 5, + basePricePerCover: 545 + }, + { + id: 'grill-luksus', + title: 'Gourmet Grill Deluxe', + description: 'Eksklusiv grillmenu med 5 serveringer perfekt til sommeraftener.', + courses: [ + 'Grillede jomfruhummere med urtemayonnaise', + 'Wagyu sliders med trøffel', + 'Grillet lammecarré med rosmarin', + 'Grillede grøntsager med romesco', + 'Grillede ferskner med mascarpone og honning' + ], + tags: ['Grill', 'Sommer', 'Kød', 'Luksus'], + image: '/img/grill.jpg', + baseIngredientsPerCover: 120, + ingredientsCostIndex: 1.3, + baseLabourHours: 5, + incrementalLabourPerCover: 0.06, + minCovers: 10, + leadTimeDays: 7, + basePricePerCover: 845 + }, + { + id: 'sushi-signatur', + title: 'Signatur Sushi', + description: 'Eksklusiv omakase-inspireret sushimenu med 6 serveringer.', + courses: [ + 'Toro nigiri med trøffel', + 'Laks tataki med ponzu', + 'Kammusling nigiri med yuzu', + 'Tempura rejer med wasabi-mayo', + 'Udvalg af maki rolls', + 'Matcha is med hvid chokolade' + ], + tags: ['Japansk', 'Sushi', 'Fisk', 'Luksus'], + image: '/img/sushi.jpg', + baseIngredientsPerCover: 130, + ingredientsCostIndex: 1.4, + baseLabourHours: 6, + incrementalLabourPerCover: 0.07, + minCovers: 10, + leadTimeDays: 7, + basePricePerCover: 895 + }, + { + id: 'fusion-menu', + title: 'Asian Fusion', + description: 'Moderne asiatisk fusion menu med 5 serveringer.', + courses: [ + 'Tuna tartare med wasabi og sesam', + 'Dumplings med and og hoisin', + 'Thai inspireret suppe med kokos', + 'Korean BBQ short ribs', + 'Yuzu pannacotta med mango' + ], + tags: ['Asiatisk', 'Fusion', 'Modern'], + image: '/img/fusion.jpg', + baseIngredientsPerCover: 95, + ingredientsCostIndex: 1.2, + baseLabourHours: 5, + incrementalLabourPerCover: 0.06, + minCovers: 10, + leadTimeDays: 7, + basePricePerCover: 745 + } + ], + packages: [ + { + id: "basis", + name: "Basis Pakke", + menuId: "klassisk-3-retter", + pricePerCover: 295, + minCovers: 15, + maxCovers: 30, + includes: [ + "Menu planlægning", + "Indkøb af råvarer", + "Madlavning på lokation", + "Let oprydning i køkken" + ], + upsells: [ + { id: "anretning", label: "Tallerkenanretning", priceFlat: 500 }, + { id: "kaffe", label: "Kaffe/te", pricePerCover: 25 } + ], + notes: "God basis løsning til familiefester. Maden serveres på fade, hvor gæsterne selv tager." + }, + { + id: "service", + name: "Service Pakke", + menuId: "klassisk-3-retter", + pricePerCover: 395, + minCovers: 20, + maxCovers: 50, + includes: [ + "Menu planlægning", + "Indkøb af råvarer", + "Madlavning på lokation", + "Tallerkenanretning", + "Professionel servering", + "Fuld oprydning" + ], + upsells: [ + { id: "velkomst", label: "Velkomstdrink & snacks", pricePerCover: 45 }, + { id: "vinmenu", label: "Vinmenu (3 glas)", pricePerCover: 225 }, + { id: "kaffe", label: "Kaffe/te med sødt", pricePerCover: 35 } + ], + notes: "Komplet løsning med personlig service og professionel servering." + }, + { + id: "gourmet", + name: "Gourmet Pakke", + menuId: "gourmet-upgrade", + pricePerCover: 595, + minCovers: 10, + maxCovers: 30, + includes: [ + "Menu planlægning", + "Indkøb af kvalitetsråvarer", + "Madlavning på lokation", + "Tallerkenanretning", + "Professionel servering", + "Vinmenu (3 glas)", + "Kaffe med sødt", + "Fuld oprydning" + ], + upsells: [ + { id: "champagne", label: "Champagne velkomst", pricePerCover: 95 }, + { id: "ekstravin", label: "Ekstra glas vin", pricePerCover: 75 }, + { id: "natmad", label: "Let natmad", pricePerCover: 75 } + ], + notes: "Eksklusiv løsning til de særlige anledninger med gourmetmenu og vinmenu inkluderet." + } + ], +} as const \ No newline at end of file diff --git a/src/config/site.ts b/src/config/site.ts new file mode 100644 index 0000000..a841539 --- /dev/null +++ b/src/config/site.ts @@ -0,0 +1,27 @@ +export const siteConfig = { + name: "warme", + domain: "https://warme.dk", + locale: "da-DK", + currency: "DKK", + brand: { + displayName: "Christian Warme – Privat kok", + tagline: "God mad. Nærvær. Ingen stress.", + primaryColor: "#1f2937", + accentColor: "#f59e0b", + logoAlt: "warme.dk logo" + }, + meta: { + title: "%s | warme.dk", + description: "Lej Christian Warme som privat kok til fødselsdag, konfirmation og firmaevents. Gennemsigtige kuvertpriser og fleksibel bemanding i Storkøbenhavn.", + }, + analytics: { + pixels: ["Meta", "GA4"], + events: [ + "SearchPerformed", + "MenuViewed", + "PackageSelected", + "QuoteCalculated", + "BookingRequestSubmitted" + ] + } +} as const \ No newline at end of file diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..dad1910 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} \ No newline at end of file diff --git a/src/types/models.ts b/src/types/models.ts new file mode 100644 index 0000000..6942be1 --- /dev/null +++ b/src/types/models.ts @@ -0,0 +1,111 @@ +export interface Chef { + id: string + name: string + brand: string + bio: string + skills: string[] + serviceAreaKm: number + baseCity: string + photo: string + availabilityRules: { + leadTimeDays: number + maxCoversSolo: number + maxCoversWithHelper: number + absoluteMaxCovers: number + bufferHoursPre: number + bufferHoursPost: number + } + blackoutDates: string[] + workShiftsIntegration: { + type: 'ical_or_csv' + fields: string[] + blockingRule: string + } + contact: { + phone: string + email: string + instagram: string + facebook: string + } +} + +export interface Menu { + id: string + title: string + description: string + courses: readonly string[] + tags: readonly string[] + image: string + baseIngredientsPerCover: number + ingredientsCostIndex: number + baseLabourHours: number + incrementalLabourPerCover: number + minCovers: number + leadTimeDays: number + basePricePerCover: number +} + +export interface Package { + id: string + name: string + menuId: string + pricePerCover: number + minCovers: number + maxCovers: number + includes: readonly string[] + upsells: ReadonlyArray<{ + id: string + label: string + priceFlat?: number + pricePerCover?: number + pricePerHourPerServer?: number + minHours?: number + }> + notes: string +} + +export interface BookingRequest { + id: string + customer: { + name: string + email: string + phone: string + } + event: { + type: string + notes: string + } + covers: number + date: string + location: string + menuId: string + packageId: string + notes: string + staffing: { + helpers: number + servers: number + } + quote: { + subtotal: number + ingredients: number + labour: number + helpersCost: number + serversCost: number + travelCost: number + extras: Array<{ + id: string + amount: number + }> + margin: number + total: number + } + status: 'pending' | 'confirmed' | 'cancelled' +} + +export interface Rates { + chefHourly: number + helperHourly: number + serverHourly: number + travelPerKm: number + minServerHours: number +} \ No newline at end of file diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..ab3a26a --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,41 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + './src/pages/**/*.{js,ts,jsx,tsx,mdx}', + './src/components/**/*.{js,ts,jsx,tsx,mdx}', + './src/app/**/*.{js,ts,jsx,tsx,mdx}', + ], + theme: { + extend: { + colors: { + primary: { + DEFAULT: '#1f2937', + 50: '#f8fafc', + 100: '#f1f5f9', + 200: '#e2e8f0', + 300: '#cbd5e1', + 400: '#94a3b8', + 500: '#64748b', + 600: '#475569', + 700: '#334155', + 800: '#1e293b', + 900: '#0f172a', + }, + accent: { + DEFAULT: '#f59e0b', + 50: '#fffbeb', + 100: '#fef3c7', + 200: '#fde68a', + 300: '#fcd34d', + 400: '#fbbf24', + 500: '#f59e0b', + 600: '#d97706', + 700: '#b45309', + 800: '#92400e', + 900: '#78350f', + }, + }, + }, + }, + plugins: [], +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index cf9c65d..34939b2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { "target": "ES2017", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -11,7 +15,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "react-jsx", + "jsx": "preserve", "incremental": true, "plugins": [ { @@ -19,7 +23,9 @@ } ], "paths": { - "@/*": ["./src/*"] + "@/*": [ + "./src/*" + ] } }, "include": [ @@ -30,5 +36,7 @@ ".next/dev/types/**/*.ts", "**/*.mts" ], - "exclude": ["node_modules"] + "exclude": [ + "node_modules" + ] }