diff --git a/crop-x/components.json b/crop-x/components.json
new file mode 100644
index 0000000..566c7e3
--- /dev/null
+++ b/crop-x/components.json
@@ -0,0 +1,22 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "default",
+ "rsc": false,
+ "tsx": true,
+ "tailwind": {
+ "config": "tailwind.config.js",
+ "css": "src/styles/globals.css",
+ "baseColor": "neutral",
+ "cssVariables": true,
+ "prefix": ""
+ },
+ "iconLibrary": "lucide",
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils",
+ "ui": "@/components/ui",
+ "lib": "@/lib",
+ "hooks": "@/hooks"
+ },
+ "registries": {}
+}
diff --git a/crop-x/package-lock.json b/crop-x/package-lock.json
index add4c8e..94c7cdf 100644
--- a/crop-x/package-lock.json
+++ b/crop-x/package-lock.json
@@ -8,34 +8,35 @@
"name": "智慧农业生产管理系统",
"version": "0.1.0",
"dependencies": {
- "@radix-ui/react-accordion": "^1.2.3",
+ "@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.6",
"@radix-ui/react-aspect-ratio": "^1.1.2",
"@radix-ui/react-avatar": "^1.1.3",
"@radix-ui/react-checkbox": "^1.1.4",
- "@radix-ui/react-collapsible": "^1.1.3",
+ "@radix-ui/react-collapsible": "^1.1.12",
"@radix-ui/react-context-menu": "^2.2.6",
- "@radix-ui/react-dialog": "^1.1.6",
- "@radix-ui/react-dropdown-menu": "^2.1.6",
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
"@radix-ui/react-hover-card": "^1.1.6",
- "@radix-ui/react-label": "^2.1.2",
+ "@radix-ui/react-label": "^2.1.7",
"@radix-ui/react-menubar": "^1.1.6",
- "@radix-ui/react-navigation-menu": "^1.2.5",
+ "@radix-ui/react-navigation-menu": "^1.2.14",
"@radix-ui/react-popover": "^1.1.6",
"@radix-ui/react-progress": "^1.1.2",
"@radix-ui/react-radio-group": "^1.2.3",
"@radix-ui/react-scroll-area": "^1.2.3",
"@radix-ui/react-select": "^2.1.6",
- "@radix-ui/react-separator": "^1.1.2",
+ "@radix-ui/react-separator": "^1.1.7",
"@radix-ui/react-slider": "^1.2.3",
- "@radix-ui/react-slot": "^1.1.2",
+ "@radix-ui/react-slot": "^1.2.3",
"@radix-ui/react-switch": "^1.1.3",
"@radix-ui/react-tabs": "^1.1.3",
"@radix-ui/react-toggle": "^1.1.2",
"@radix-ui/react-toggle-group": "^1.1.2",
- "@radix-ui/react-tooltip": "^1.1.8",
+ "@radix-ui/react-tooltip": "^1.2.8",
+ "@tailwindcss/postcss": "^4.1.14",
"class-variance-authority": "^0.7.1",
- "clsx": "*",
+ "clsx": "^2.1.1",
"cmdk": "^1.1.1",
"date-fns": "*",
"embla-carousel-react": "^8.6.0",
@@ -50,10 +51,12 @@
"react-resizable-panels": "^2.1.7",
"recharts": "^2.15.2",
"sonner": "^2.0.3",
- "tailwind-merge": "*",
+ "tailwind-merge": "^3.3.1",
+ "tailwindcss-animate": "^1.0.7",
"vaul": "^1.1.2"
},
"devDependencies": {
+ "@tailwindcss/vite": "^4.1.14",
"@types/node": "^20.10.0",
"@types/react": "^18.3.11",
"@types/react-dom": "^18.3.1",
@@ -65,10 +68,12 @@
"eslint-plugin-react-hooks": "^5.1.0-rc.0",
"eslint-plugin-react-refresh": "^0.4.12",
"husky": "^9.1.6",
+ "install": "^0.13.0",
"lint-staged": "^15.2.10",
+ "npm": "^11.6.2",
"postcss": "^8.4.47",
"prettier": "^3.3.3",
- "tailwindcss": "^3.4.13",
+ "tailwindcss": "^4.1.14",
"typescript": "^5.6.2",
"vite": "6.3.5"
}
@@ -77,7 +82,6 @@
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
@@ -816,96 +820,42 @@
"url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@isaacs/cliui": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
- "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
- "dev": true,
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
"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"
+ "minipass": "^7.0.4"
},
"engines": {
- "node": ">=12"
- }
- },
- "node_modules/@isaacs/cliui/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/@isaacs/cliui/node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@isaacs/cliui/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/@isaacs/cliui/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": ">=18.0.0"
}
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
@@ -915,14 +865,12 @@
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
- "dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.31",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
@@ -967,17 +915,6 @@
"node": ">= 8"
}
},
- "node_modules/@pkgjs/parseargs": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=14"
- }
- },
"node_modules/@radix-ui/number": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz",
@@ -2839,6 +2776,282 @@
"@swc/counter": "^0.1.3"
}
},
+ "node_modules/@tailwindcss/node": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz",
+ "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.4",
+ "enhanced-resolve": "^5.18.3",
+ "jiti": "^2.6.0",
+ "lightningcss": "1.30.1",
+ "magic-string": "^0.30.19",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.1.14"
+ }
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz",
+ "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^2.0.4",
+ "tar": "^7.5.1"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.1.14",
+ "@tailwindcss/oxide-darwin-arm64": "4.1.14",
+ "@tailwindcss/oxide-darwin-x64": "4.1.14",
+ "@tailwindcss/oxide-freebsd-x64": "4.1.14",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.1.14",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.1.14",
+ "@tailwindcss/oxide-linux-x64-musl": "4.1.14",
+ "@tailwindcss/oxide-wasm32-wasi": "4.1.14",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.1.14"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz",
+ "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz",
+ "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz",
+ "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz",
+ "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz",
+ "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz",
+ "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz",
+ "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz",
+ "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz",
+ "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz",
+ "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==",
+ "bundleDependencies": [
+ "@napi-rs/wasm-runtime",
+ "@emnapi/core",
+ "@emnapi/runtime",
+ "@tybys/wasm-util",
+ "@emnapi/wasi-threads",
+ "tslib"
+ ],
+ "cpu": [
+ "wasm32"
+ ],
+ "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.5",
+ "@tybys/wasm-util": "^0.10.1",
+ "tslib": "^2.4.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz",
+ "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz",
+ "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/postcss": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.14.tgz",
+ "integrity": "sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg==",
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "@tailwindcss/node": "4.1.14",
+ "@tailwindcss/oxide": "4.1.14",
+ "postcss": "^8.4.41",
+ "tailwindcss": "4.1.14"
+ }
+ },
+ "node_modules/@tailwindcss/vite": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.14.tgz",
+ "integrity": "sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tailwindcss/node": "4.1.14",
+ "@tailwindcss/oxide": "4.1.14",
+ "tailwindcss": "4.1.14"
+ },
+ "peerDependencies": {
+ "vite": "^5.2.0 || ^6 || ^7"
+ }
+ },
"node_modules/@types/d3-array": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",
@@ -2922,6 +3135,7 @@
"integrity": "sha512-hRnu+5qggKDSyWHlnmThnUqg62l29Aj/6vcYgUaSFL9oc7DVjeWEQN3PRgdSc6F8d9QRMWkf36CLMch1Do/+RQ==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"undici-types": "~6.21.0"
}
@@ -2939,6 +3153,7 @@
"integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==",
"devOptional": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/prop-types": "*",
"csstype": "^3.0.2"
@@ -2950,6 +3165,7 @@
"integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
"devOptional": true,
"license": "MIT",
+ "peer": true,
"peerDependencies": {
"@types/react": "^18.0.0"
}
@@ -2990,6 +3206,7 @@
"integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.46.1",
"@typescript-eslint/types": "8.46.1",
@@ -3209,6 +3426,7 @@
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
"license": "MIT",
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -3287,34 +3505,6 @@
"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",
@@ -3389,19 +3579,6 @@
"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": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
@@ -3445,6 +3622,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.8.9",
"caniuse-lite": "^1.0.30001746",
@@ -3478,16 +3656,6 @@
"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",
@@ -3526,42 +3694,13 @@
"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"
- },
+ "node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "license": "BlueOak-1.0.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": ">=18"
}
},
"node_modules/class-variance-authority": {
@@ -3766,19 +3905,6 @@
"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",
@@ -3911,6 +4037,7 @@
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
"integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==",
"license": "MIT",
+ "peer": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/kossnocorp"
@@ -3956,32 +4083,27 @@
"dev": true,
"license": "MIT"
},
+ "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==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/detect-node-es": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
"integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
"license": "MIT"
},
- "node_modules/didyoumean": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
- "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
- "dev": true,
- "license": "Apache-2.0"
- },
"node_modules/dijkstrajs": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
"integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==",
"license": "MIT"
},
- "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/dom-helpers": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
@@ -3992,13 +4114,6 @@
"csstype": "^3.0.2"
}
},
- "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.237",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz",
@@ -4010,7 +4125,8 @@
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz",
"integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/embla-carousel-react": {
"version": "8.6.0",
@@ -4041,6 +4157,19 @@
"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==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
"node_modules/environment": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
@@ -4125,6 +4254,7 @@
"integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -4522,23 +4652,6 @@
"dev": true,
"license": "ISC"
},
- "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",
@@ -4568,16 +4681,6 @@
"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",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@@ -4622,27 +4725,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "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/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
@@ -4669,6 +4751,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
"node_modules/graphemer": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
@@ -4686,19 +4774,6 @@
"node": ">=8"
}
},
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/human-signals": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
@@ -4772,6 +4847,16 @@
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc"
}
},
+ "node_modules/install": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz",
+ "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/internmap": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
@@ -4781,35 +4866,6 @@
"node": ">=12"
}
},
- "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-core-module": {
- "version": "2.16.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
- "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -4876,30 +4932,13 @@
"dev": true,
"license": "ISC"
},
- "node_modules/jackspeak": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
- "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
- "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/jiti": {
- "version": "1.21.7",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
- "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
- "dev": true,
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
"license": "MIT",
"bin": {
- "jiti": "bin/jiti.js"
+ "jiti": "lib/jiti-cli.mjs"
}
},
"node_modules/js-tokens": {
@@ -4966,6 +5005,234 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/lightningcss": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz",
+ "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==",
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-darwin-arm64": "1.30.1",
+ "lightningcss-darwin-x64": "1.30.1",
+ "lightningcss-freebsd-x64": "1.30.1",
+ "lightningcss-linux-arm-gnueabihf": "1.30.1",
+ "lightningcss-linux-arm64-gnu": "1.30.1",
+ "lightningcss-linux-arm64-musl": "1.30.1",
+ "lightningcss-linux-x64-gnu": "1.30.1",
+ "lightningcss-linux-x64-musl": "1.30.1",
+ "lightningcss-win32-arm64-msvc": "1.30.1",
+ "lightningcss-win32-x64-msvc": "1.30.1"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz",
+ "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz",
+ "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz",
+ "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz",
+ "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz",
+ "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz",
+ "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz",
+ "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz",
+ "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz",
+ "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz",
+ "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
"node_modules/lilconfig": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
@@ -4979,13 +5246,6 @@
"url": "https://github.com/sponsors/antonk52"
}
},
- "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": "MIT"
- },
"node_modules/lint-staged": {
"version": "15.5.2",
"resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz",
@@ -5152,13 +5412,6 @@
"loose-envify": "cli.js"
}
},
- "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/lucide-react": {
"version": "0.487.0",
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.487.0.tgz",
@@ -5168,6 +5421,15 @@
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
+ "node_modules/magic-string": {
+ "version": "0.30.19",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz",
+ "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -5245,12 +5507,23 @@
"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/minizlib": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
+ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -5258,23 +5531,10 @@
"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",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
- "dev": true,
"funding": [
{
"type": "github",
@@ -5313,16 +5573,6 @@
"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",
@@ -5333,6 +5583,161 @@
"node": ">=0.10.0"
}
},
+ "node_modules/npm": {
+ "version": "11.6.2",
+ "resolved": "https://registry.npmjs.org/npm/-/npm-11.6.2.tgz",
+ "integrity": "sha512-7iKzNfy8lWYs3zq4oFPa8EXZz5xt9gQNKJZau3B1ErLBb6bF7sBJ00x09485DOvRT2l5Gerbl3VlZNT57MxJVA==",
+ "bundleDependencies": [
+ "@isaacs/string-locale-compare",
+ "@npmcli/arborist",
+ "@npmcli/config",
+ "@npmcli/fs",
+ "@npmcli/map-workspaces",
+ "@npmcli/package-json",
+ "@npmcli/promise-spawn",
+ "@npmcli/redact",
+ "@npmcli/run-script",
+ "@sigstore/tuf",
+ "abbrev",
+ "archy",
+ "cacache",
+ "chalk",
+ "ci-info",
+ "cli-columns",
+ "fastest-levenshtein",
+ "fs-minipass",
+ "glob",
+ "graceful-fs",
+ "hosted-git-info",
+ "ini",
+ "init-package-json",
+ "is-cidr",
+ "json-parse-even-better-errors",
+ "libnpmaccess",
+ "libnpmdiff",
+ "libnpmexec",
+ "libnpmfund",
+ "libnpmorg",
+ "libnpmpack",
+ "libnpmpublish",
+ "libnpmsearch",
+ "libnpmteam",
+ "libnpmversion",
+ "make-fetch-happen",
+ "minimatch",
+ "minipass",
+ "minipass-pipeline",
+ "ms",
+ "node-gyp",
+ "nopt",
+ "npm-audit-report",
+ "npm-install-checks",
+ "npm-package-arg",
+ "npm-pick-manifest",
+ "npm-profile",
+ "npm-registry-fetch",
+ "npm-user-validate",
+ "p-map",
+ "pacote",
+ "parse-conflict-json",
+ "proc-log",
+ "qrcode-terminal",
+ "read",
+ "semver",
+ "spdx-expression-parse",
+ "ssri",
+ "supports-color",
+ "tar",
+ "text-table",
+ "tiny-relative-date",
+ "treeverse",
+ "validate-npm-package-name",
+ "which"
+ ],
+ "dev": true,
+ "license": "Artistic-2.0",
+ "workspaces": [
+ "docs",
+ "smoke-tests",
+ "mock-globals",
+ "mock-registry",
+ "workspaces/*"
+ ],
+ "dependencies": {
+ "@isaacs/string-locale-compare": "^1.1.0",
+ "@npmcli/arborist": "^9.1.6",
+ "@npmcli/config": "^10.4.2",
+ "@npmcli/fs": "^4.0.0",
+ "@npmcli/map-workspaces": "^5.0.0",
+ "@npmcli/package-json": "^7.0.1",
+ "@npmcli/promise-spawn": "^8.0.3",
+ "@npmcli/redact": "^3.2.2",
+ "@npmcli/run-script": "^10.0.0",
+ "@sigstore/tuf": "^4.0.0",
+ "abbrev": "^3.0.1",
+ "archy": "~1.0.0",
+ "cacache": "^20.0.1",
+ "chalk": "^5.6.2",
+ "ci-info": "^4.3.1",
+ "cli-columns": "^4.0.0",
+ "fastest-levenshtein": "^1.0.16",
+ "fs-minipass": "^3.0.3",
+ "glob": "^11.0.3",
+ "graceful-fs": "^4.2.11",
+ "hosted-git-info": "^9.0.2",
+ "ini": "^5.0.0",
+ "init-package-json": "^8.2.2",
+ "is-cidr": "^6.0.1",
+ "json-parse-even-better-errors": "^4.0.0",
+ "libnpmaccess": "^10.0.3",
+ "libnpmdiff": "^8.0.9",
+ "libnpmexec": "^10.1.8",
+ "libnpmfund": "^7.0.9",
+ "libnpmorg": "^8.0.1",
+ "libnpmpack": "^9.0.9",
+ "libnpmpublish": "^11.1.2",
+ "libnpmsearch": "^9.0.1",
+ "libnpmteam": "^8.0.2",
+ "libnpmversion": "^8.0.2",
+ "make-fetch-happen": "^15.0.2",
+ "minimatch": "^10.0.3",
+ "minipass": "^7.1.1",
+ "minipass-pipeline": "^1.2.4",
+ "ms": "^2.1.2",
+ "node-gyp": "^11.4.2",
+ "nopt": "^8.1.0",
+ "npm-audit-report": "^6.0.0",
+ "npm-install-checks": "^7.1.2",
+ "npm-package-arg": "^13.0.1",
+ "npm-pick-manifest": "^11.0.1",
+ "npm-profile": "^12.0.0",
+ "npm-registry-fetch": "^19.0.0",
+ "npm-user-validate": "^3.0.0",
+ "p-map": "^7.0.3",
+ "pacote": "^21.0.3",
+ "parse-conflict-json": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "qrcode-terminal": "^0.12.0",
+ "read": "^4.1.0",
+ "semver": "^7.7.3",
+ "spdx-expression-parse": "^4.0.0",
+ "ssri": "^12.0.0",
+ "supports-color": "^10.2.2",
+ "tar": "^7.5.1",
+ "text-table": "~0.2.0",
+ "tiny-relative-date": "^2.0.2",
+ "treeverse": "^3.0.0",
+ "validate-npm-package-name": "^6.0.2",
+ "which": "^5.0.0"
+ },
+ "bin": {
+ "npm": "bin/npm-cli.js",
+ "npx": "bin/npx-cli.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
"node_modules/npm-run-path": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
@@ -5362,6 +5767,2461 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/npm/node_modules/@isaacs/balanced-match": {
+ "version": "4.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/brace-expansion": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "@isaacs/balanced-match": "^4.0.1"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "dev": true,
+ "inBundle": 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"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "dev": true,
+ "inBundle": 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/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/string-locale-compare": {
+ "version": "1.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/@npmcli/agent": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.1",
+ "lru-cache": "^11.2.1",
+ "socks-proxy-agent": "^8.0.3"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/arborist": {
+ "version": "9.1.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/string-locale-compare": "^1.1.0",
+ "@npmcli/fs": "^4.0.0",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "@npmcli/map-workspaces": "^5.0.0",
+ "@npmcli/metavuln-calculator": "^9.0.2",
+ "@npmcli/name-from-folder": "^3.0.0",
+ "@npmcli/node-gyp": "^4.0.0",
+ "@npmcli/package-json": "^7.0.0",
+ "@npmcli/query": "^4.0.0",
+ "@npmcli/redact": "^3.0.0",
+ "@npmcli/run-script": "^10.0.0",
+ "bin-links": "^5.0.0",
+ "cacache": "^20.0.1",
+ "common-ancestor-path": "^1.0.1",
+ "hosted-git-info": "^9.0.0",
+ "json-stringify-nice": "^1.1.4",
+ "lru-cache": "^11.2.1",
+ "minimatch": "^10.0.3",
+ "nopt": "^8.0.0",
+ "npm-install-checks": "^7.1.0",
+ "npm-package-arg": "^13.0.0",
+ "npm-pick-manifest": "^11.0.1",
+ "npm-registry-fetch": "^19.0.0",
+ "pacote": "^21.0.2",
+ "parse-conflict-json": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "proggy": "^3.0.0",
+ "promise-all-reject-late": "^1.0.0",
+ "promise-call-limit": "^3.0.1",
+ "semver": "^7.3.7",
+ "ssri": "^12.0.0",
+ "treeverse": "^3.0.0",
+ "walk-up-path": "^4.0.0"
+ },
+ "bin": {
+ "arborist": "bin/index.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/config": {
+ "version": "10.4.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/map-workspaces": "^5.0.0",
+ "@npmcli/package-json": "^7.0.0",
+ "ci-info": "^4.0.0",
+ "ini": "^5.0.0",
+ "nopt": "^8.1.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "walk-up-path": "^4.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/fs": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/git": {
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/promise-spawn": "^8.0.0",
+ "ini": "^5.0.0",
+ "lru-cache": "^11.2.1",
+ "npm-pick-manifest": "^11.0.1",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "semver": "^7.3.5",
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/installed-package-contents": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-bundled": "^4.0.0",
+ "npm-normalize-package-bin": "^4.0.0"
+ },
+ "bin": {
+ "installed-package-contents": "bin/index.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/map-workspaces": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/name-from-folder": "^3.0.0",
+ "@npmcli/package-json": "^7.0.0",
+ "glob": "^11.0.3",
+ "minimatch": "^10.0.3"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/metavuln-calculator": {
+ "version": "9.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "cacache": "^20.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
+ "pacote": "^21.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/name-from-folder": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/node-gyp": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/package-json": {
+ "version": "7.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/git": "^7.0.0",
+ "glob": "^11.0.3",
+ "hosted-git-info": "^9.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.5.3",
+ "validate-npm-package-license": "^3.0.4"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/promise-spawn": {
+ "version": "8.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/query": {
+ "version": "4.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/redact": {
+ "version": "3.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/run-script": {
+ "version": "10.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/node-gyp": "^4.0.0",
+ "@npmcli/package-json": "^7.0.0",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "node-gyp": "^11.0.0",
+ "proc-log": "^5.0.0",
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/bundle": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/protobuf-specs": "^0.5.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/core": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/protobuf-specs": {
+ "version": "0.5.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/sign": {
+ "version": "4.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^4.0.0",
+ "@sigstore/core": "^3.0.0",
+ "@sigstore/protobuf-specs": "^0.5.0",
+ "make-fetch-happen": "^15.0.2",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/tuf": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/protobuf-specs": "^0.5.0",
+ "tuf-js": "^4.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/verify": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^4.0.0",
+ "@sigstore/core": "^3.0.0",
+ "@sigstore/protobuf-specs": "^0.5.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@tufjs/canonical-json": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@tufjs/models": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tufjs/canonical-json": "2.0.0",
+ "minimatch": "^9.0.5"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@tufjs/models/node_modules/minimatch": {
+ "version": "9.0.5",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/abbrev": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/agent-base": {
+ "version": "7.1.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/npm/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/aproba": {
+ "version": "2.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/archy": {
+ "version": "1.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/bin-links": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "cmd-shim": "^7.0.0",
+ "npm-normalize-package-bin": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "read-cmd-shim": "^5.0.0",
+ "write-file-atomic": "^6.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/binary-extensions": {
+ "version": "3.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/cacache": {
+ "version": "20.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/fs": "^4.0.0",
+ "fs-minipass": "^3.0.0",
+ "glob": "^11.0.3",
+ "lru-cache": "^11.1.0",
+ "minipass": "^7.0.3",
+ "minipass-collect": "^2.0.1",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "p-map": "^7.0.2",
+ "ssri": "^12.0.0",
+ "unique-filename": "^4.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/chalk": {
+ "version": "5.6.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/chownr": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/ci-info": {
+ "version": "4.3.1",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/cidr-regex": {
+ "version": "5.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "ip-regex": "5.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/npm/node_modules/cli-columns": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/npm/node_modules/cmd-shim": {
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/color-convert": {
+ "version": "2.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/color-name": {
+ "version": "1.1.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/common-ancestor-path": {
+ "version": "1.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/cross-spawn/node_modules/isexe": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/cssesc": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/npm/node_modules/debug": {
+ "version": "4.4.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/npm/node_modules/diff": {
+ "version": "8.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/npm/node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/encoding": {
+ "version": "0.1.13",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
+ }
+ },
+ "node_modules/npm/node_modules/env-paths": {
+ "version": "2.2.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/npm/node_modules/err-code": {
+ "version": "2.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/exponential-backoff": {
+ "version": "3.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/npm/node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/npm/node_modules/foreground-child": {
+ "version": "3.3.1",
+ "dev": true,
+ "inBundle": 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/npm/node_modules/fs-minipass": {
+ "version": "3.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/glob": {
+ "version": "11.0.3",
+ "dev": true,
+ "inBundle": 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/npm/node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/hosted-git-info": {
+ "version": "9.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^11.1.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/http-cache-semantics": {
+ "version": "4.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/npm/node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/npm/node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/npm/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm/node_modules/ignore-walk": {
+ "version": "8.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minimatch": "^10.0.3"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/npm/node_modules/ini": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/init-package-json": {
+ "version": "8.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/package-json": "^7.0.0",
+ "npm-package-arg": "^13.0.0",
+ "promzard": "^2.0.0",
+ "read": "^4.0.0",
+ "semver": "^7.7.2",
+ "validate-npm-package-license": "^3.0.4",
+ "validate-npm-package-name": "^6.0.2"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/ip-address": {
+ "version": "10.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/npm/node_modules/ip-regex": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/is-cidr": {
+ "version": "6.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "cidr-regex": "5.0.1"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/npm/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/isexe": {
+ "version": "3.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/npm/node_modules/jackspeak": {
+ "version": "4.1.1",
+ "dev": true,
+ "inBundle": 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/npm/node_modules/json-parse-even-better-errors": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/json-stringify-nice": {
+ "version": "1.1.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/jsonparse": {
+ "version": "1.3.1",
+ "dev": true,
+ "engines": [
+ "node >= 0.2.0"
+ ],
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/just-diff": {
+ "version": "6.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/just-diff-apply": {
+ "version": "5.5.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/libnpmaccess": {
+ "version": "10.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-package-arg": "^13.0.0",
+ "npm-registry-fetch": "^19.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmdiff": {
+ "version": "8.0.9",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/arborist": "^9.1.6",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "binary-extensions": "^3.0.0",
+ "diff": "^8.0.2",
+ "minimatch": "^10.0.3",
+ "npm-package-arg": "^13.0.0",
+ "pacote": "^21.0.2",
+ "tar": "^7.5.1"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmexec": {
+ "version": "10.1.8",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/arborist": "^9.1.6",
+ "@npmcli/package-json": "^7.0.0",
+ "@npmcli/run-script": "^10.0.0",
+ "ci-info": "^4.0.0",
+ "npm-package-arg": "^13.0.0",
+ "pacote": "^21.0.2",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "read": "^4.0.0",
+ "semver": "^7.3.7",
+ "signal-exit": "^4.1.0",
+ "walk-up-path": "^4.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmfund": {
+ "version": "7.0.9",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/arborist": "^9.1.6"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmorg": {
+ "version": "8.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^2.0.0",
+ "npm-registry-fetch": "^19.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmpack": {
+ "version": "9.0.9",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/arborist": "^9.1.6",
+ "@npmcli/run-script": "^10.0.0",
+ "npm-package-arg": "^13.0.0",
+ "pacote": "^21.0.2"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmpublish": {
+ "version": "11.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/package-json": "^7.0.0",
+ "ci-info": "^4.0.0",
+ "npm-package-arg": "^13.0.0",
+ "npm-registry-fetch": "^19.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.7",
+ "sigstore": "^4.0.0",
+ "ssri": "^12.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmsearch": {
+ "version": "9.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-registry-fetch": "^19.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmteam": {
+ "version": "8.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^2.0.0",
+ "npm-registry-fetch": "^19.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmversion": {
+ "version": "8.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/git": "^7.0.0",
+ "@npmcli/run-script": "^10.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/lru-cache": {
+ "version": "11.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/npm/node_modules/make-fetch-happen": {
+ "version": "15.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/agent": "^4.0.0",
+ "cacache": "^20.0.1",
+ "http-cache-semantics": "^4.1.1",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^1.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "ssri": "^12.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/minimatch": {
+ "version": "10.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/brace-expansion": "^5.0.0"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/minipass": {
+ "version": "7.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-collect": {
+ "version": "2.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-fetch": {
+ "version": "4.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^3.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-flush": {
+ "version": "1.0.5",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": {
+ "version": "3.3.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-pipeline": {
+ "version": "1.2.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": {
+ "version": "3.3.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-sized": {
+ "version": "1.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": {
+ "version": "3.3.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minizlib": {
+ "version": "3.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/npm/node_modules/ms": {
+ "version": "2.1.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/mute-stream": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/negotiator": {
+ "version": "1.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp": {
+ "version": "11.4.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
+ "graceful-fs": "^4.2.6",
+ "make-fetch-happen": "^14.0.3",
+ "nopt": "^8.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "tar": "^7.4.3",
+ "tinyglobby": "^0.2.12",
+ "which": "^5.0.0"
+ },
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/agent": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.1",
+ "lru-cache": "^10.0.1",
+ "socks-proxy-agent": "^8.0.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/cacache": {
+ "version": "19.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/fs": "^4.0.0",
+ "fs-minipass": "^3.0.0",
+ "glob": "^10.2.2",
+ "lru-cache": "^10.0.1",
+ "minipass": "^7.0.3",
+ "minipass-collect": "^2.0.1",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "p-map": "^7.0.2",
+ "ssri": "^12.0.0",
+ "tar": "^7.4.3",
+ "unique-filename": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/glob": {
+ "version": "10.4.5",
+ "dev": true,
+ "inBundle": 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/npm/node_modules/node-gyp/node_modules/jackspeak": {
+ "version": "3.4.3",
+ "dev": true,
+ "inBundle": 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/npm/node_modules/node-gyp/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": {
+ "version": "14.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/agent": "^3.0.0",
+ "cacache": "^19.0.1",
+ "http-cache-semantics": "^4.1.1",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^1.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "ssri": "^12.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": {
+ "version": "9.0.5",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/path-scurry": {
+ "version": "1.11.1",
+ "dev": true,
+ "inBundle": 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/npm/node_modules/nopt": {
+ "version": "8.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^3.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-audit-report": {
+ "version": "6.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-bundled": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-normalize-package-bin": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-install-checks": {
+ "version": "7.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "semver": "^7.1.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-normalize-package-bin": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-package-arg": {
+ "version": "13.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "hosted-git-info": "^9.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-name": "^6.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-packlist": {
+ "version": "10.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "ignore-walk": "^8.0.0",
+ "proc-log": "^5.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-pick-manifest": {
+ "version": "11.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-install-checks": "^7.1.0",
+ "npm-normalize-package-bin": "^4.0.0",
+ "npm-package-arg": "^13.0.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-profile": {
+ "version": "12.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-registry-fetch": "^19.0.0",
+ "proc-log": "^5.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-registry-fetch": {
+ "version": "19.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/redact": "^3.0.0",
+ "jsonparse": "^1.3.1",
+ "make-fetch-happen": "^15.0.0",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minizlib": "^3.0.1",
+ "npm-package-arg": "^13.0.0",
+ "proc-log": "^5.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-user-validate": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/p-map": {
+ "version": "7.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/npm/node_modules/pacote": {
+ "version": "21.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/git": "^7.0.0",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "@npmcli/package-json": "^7.0.0",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "@npmcli/run-script": "^10.0.0",
+ "cacache": "^20.0.0",
+ "fs-minipass": "^3.0.0",
+ "minipass": "^7.0.2",
+ "npm-package-arg": "^13.0.0",
+ "npm-packlist": "^10.0.1",
+ "npm-pick-manifest": "^11.0.1",
+ "npm-registry-fetch": "^19.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "sigstore": "^4.0.0",
+ "ssri": "^12.0.0",
+ "tar": "^7.4.3"
+ },
+ "bin": {
+ "pacote": "bin/index.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/parse-conflict-json": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "json-parse-even-better-errors": "^4.0.0",
+ "just-diff": "^6.0.0",
+ "just-diff-apply": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/path-key": {
+ "version": "3.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/path-scurry": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": 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/npm/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/npm/node_modules/proc-log": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/proggy": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/promise-all-reject-late": {
+ "version": "1.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/promise-call-limit": {
+ "version": "3.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/promise-retry": {
+ "version": "2.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm/node_modules/promzard": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "read": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/qrcode-terminal": {
+ "version": "0.12.0",
+ "dev": true,
+ "inBundle": true,
+ "bin": {
+ "qrcode-terminal": "bin/qrcode-terminal.js"
+ }
+ },
+ "node_modules/npm/node_modules/read": {
+ "version": "4.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "mute-stream": "^2.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/read-cmd-shim": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/retry": {
+ "version": "0.12.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/npm/node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/npm/node_modules/semver": {
+ "version": "7.7.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/sigstore": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^4.0.0",
+ "@sigstore/core": "^3.0.0",
+ "@sigstore/protobuf-specs": "^0.5.0",
+ "@sigstore/sign": "^4.0.0",
+ "@sigstore/tuf": "^4.0.0",
+ "@sigstore/verify": "^3.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/socks": {
+ "version": "2.8.7",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ip-address": "^10.0.1",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/socks-proxy-agent": {
+ "version": "8.0.5",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/npm/node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "CC-BY-3.0"
+ },
+ "node_modules/npm/node_modules/spdx-expression-parse": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/spdx-license-ids": {
+ "version": "3.0.22",
+ "dev": true,
+ "inBundle": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/npm/node_modules/ssri": {
+ "version": "12.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/string-width": {
+ "version": "4.2.3",
+ "dev": true,
+ "inBundle": 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/npm/node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "dev": true,
+ "inBundle": 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/npm/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/supports-color": {
+ "version": "10.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/tar": {
+ "version": "7.5.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.1.0",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/tar/node_modules/yallist": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/text-table": {
+ "version": "0.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/tiny-relative-date": {
+ "version": "2.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/npm/node_modules/treeverse": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/tuf-js": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tufjs/models": "4.0.0",
+ "debug": "^4.4.1",
+ "make-fetch-happen": "^15.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/unique-filename": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "unique-slug": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/unique-slug": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/validate-npm-package-name": {
+ "version": "6.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/walk-up-path": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/npm/node_modules/which": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "dev": true,
+ "inBundle": 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/npm/node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": 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/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "5.1.2",
+ "dev": true,
+ "inBundle": 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/npm/node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/write-file-atomic": {
+ "version": "6.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/yallist": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -5371,16 +8231,6 @@
"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/onetime": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
@@ -5456,13 +8306,6 @@
"node": ">=6"
}
},
- "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",
@@ -5495,35 +8338,10 @@
"node": ">=8"
}
},
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/path-scurry": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
- "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
- "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/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "dev": true,
"license": "ISC"
},
"node_modules/picomatch": {
@@ -5552,26 +8370,6 @@
"node": ">=0.10"
}
},
- "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/pngjs": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
@@ -5585,7 +8383,6 @@
"version": "8.5.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
- "dev": true,
"funding": [
{
"type": "opencollective",
@@ -5601,6 +8398,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
@@ -5610,133 +8408,6 @@
"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",
@@ -5840,6 +8511,7 @@
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"loose-envify": "^1.1.0"
},
@@ -5866,6 +8538,7 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.2"
@@ -6006,29 +8679,6 @@
"react-dom": ">=16.6.0"
}
},
- "node_modules/read-cache": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
- "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
- "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/recharts": {
"version": "2.15.4",
"resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz",
@@ -6082,27 +8732,6 @@
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"license": "ISC"
},
- "node_modules/resolve": {
- "version": "1.22.10",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
- "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-core-module": "^2.16.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -6338,7 +8967,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
- "dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
@@ -6372,62 +9000,6 @@
"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/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/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-cjs/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/string-width-cjs/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/strip-ansi": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
@@ -6444,30 +9016,6 @@
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/strip-ansi-cjs": {
- "name": "strip-ansi",
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/strip-final-newline": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
@@ -6494,39 +9042,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "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/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/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -6540,19 +9055,6 @@
"node": ">=8"
}
},
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/tailwind-merge": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz",
@@ -6564,64 +9066,48 @@
}
},
"node_modules/tailwindcss": {
- "version": "3.4.18",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz",
- "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==",
- "dev": true,
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz",
+ "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==",
"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"
+ "peer": true
+ },
+ "node_modules/tailwindcss-animate": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz",
+ "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || insiders"
}
},
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "dev": true,
+ "node_modules/tapable": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
+ "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
"license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0"
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
}
},
- "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",
+ "node_modules/tar": {
+ "version": "7.5.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz",
+ "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==",
+ "license": "ISC",
"dependencies": {
- "thenify": ">= 3.1.0 < 4"
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.1.0",
+ "yallist": "^5.0.0"
},
"engines": {
- "node": ">=0.8"
+ "node": ">=18"
}
},
"node_modules/tiny-invariant": {
@@ -6671,6 +9157,7 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=12"
},
@@ -6704,13 +9191,6 @@
"typescript": ">=4.8.4"
}
},
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
- "dev": true,
- "license": "Apache-2.0"
- },
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
@@ -6736,6 +9216,7 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
+ "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -6844,13 +9325,6 @@
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.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/vaul": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz",
@@ -6892,6 +9366,7 @@
"integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"esbuild": "^0.25.0",
"fdir": "^6.4.4",
@@ -6985,6 +9460,7 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=12"
},
@@ -7042,80 +9518,6 @@
"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/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/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/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/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-cjs/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
"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",
@@ -7135,6 +9537,15 @@
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
"license": "ISC"
},
+ "node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/yaml": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
diff --git a/crop-x/package.json b/crop-x/package.json
index 78701e9..f0e735c 100644
--- a/crop-x/package.json
+++ b/crop-x/package.json
@@ -17,34 +17,35 @@
"scripts:disable": "node scripts/setup-dev-tools.js --disable"
},
"dependencies": {
- "@radix-ui/react-accordion": "^1.2.3",
+ "@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.6",
"@radix-ui/react-aspect-ratio": "^1.1.2",
"@radix-ui/react-avatar": "^1.1.3",
"@radix-ui/react-checkbox": "^1.1.4",
- "@radix-ui/react-collapsible": "^1.1.3",
+ "@radix-ui/react-collapsible": "^1.1.12",
"@radix-ui/react-context-menu": "^2.2.6",
- "@radix-ui/react-dialog": "^1.1.6",
- "@radix-ui/react-dropdown-menu": "^2.1.6",
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
"@radix-ui/react-hover-card": "^1.1.6",
- "@radix-ui/react-label": "^2.1.2",
+ "@radix-ui/react-label": "^2.1.7",
"@radix-ui/react-menubar": "^1.1.6",
- "@radix-ui/react-navigation-menu": "^1.2.5",
+ "@radix-ui/react-navigation-menu": "^1.2.14",
"@radix-ui/react-popover": "^1.1.6",
"@radix-ui/react-progress": "^1.1.2",
"@radix-ui/react-radio-group": "^1.2.3",
"@radix-ui/react-scroll-area": "^1.2.3",
"@radix-ui/react-select": "^2.1.6",
- "@radix-ui/react-separator": "^1.1.2",
+ "@radix-ui/react-separator": "^1.1.7",
"@radix-ui/react-slider": "^1.2.3",
- "@radix-ui/react-slot": "^1.1.2",
+ "@radix-ui/react-slot": "^1.2.3",
"@radix-ui/react-switch": "^1.1.3",
"@radix-ui/react-tabs": "^1.1.3",
"@radix-ui/react-toggle": "^1.1.2",
"@radix-ui/react-toggle-group": "^1.1.2",
- "@radix-ui/react-tooltip": "^1.1.8",
+ "@radix-ui/react-tooltip": "^1.2.8",
+ "@tailwindcss/postcss": "^4.1.14",
"class-variance-authority": "^0.7.1",
- "clsx": "*",
+ "clsx": "^2.1.1",
"cmdk": "^1.1.1",
"date-fns": "*",
"embla-carousel-react": "^8.6.0",
@@ -59,10 +60,12 @@
"react-resizable-panels": "^2.1.7",
"recharts": "^2.15.2",
"sonner": "^2.0.3",
- "tailwind-merge": "*",
+ "tailwind-merge": "^3.3.1",
+ "tailwindcss-animate": "^1.0.7",
"vaul": "^1.1.2"
},
"devDependencies": {
+ "@tailwindcss/vite": "^4.1.14",
"@types/node": "^20.10.0",
"@types/react": "^18.3.11",
"@types/react-dom": "^18.3.1",
@@ -74,11 +77,13 @@
"eslint-plugin-react-hooks": "^5.1.0-rc.0",
"eslint-plugin-react-refresh": "^0.4.12",
"husky": "^9.1.6",
+ "install": "^0.13.0",
"lint-staged": "^15.2.10",
+ "npm": "^11.6.2",
"postcss": "^8.4.47",
"prettier": "^3.3.3",
- "tailwindcss": "^3.4.13",
+ "tailwindcss": "^4.1.14",
"typescript": "^5.6.2",
"vite": "6.3.5"
}
-}
\ No newline at end of file
+}
diff --git a/crop-x/postcss.config.js b/crop-x/postcss.config.js
index e99ebc2..af9d8dc 100644
--- a/crop-x/postcss.config.js
+++ b/crop-x/postcss.config.js
@@ -1,6 +1,6 @@
export default {
plugins: {
- tailwindcss: {},
+ '@tailwindcss/postcss': {},
autoprefixer: {},
},
}
\ No newline at end of file
diff --git a/crop-x/src/App.tsx b/crop-x/src/App.tsx
index 8ce5bb8..04db09e 100644
--- a/crop-x/src/App.tsx
+++ b/crop-x/src/App.tsx
@@ -1,243 +1,11 @@
import React from 'react'
import { useTheme } from '@/hooks/useTheme'
-
+import Main from '@/components/layouts/Main.tsx'
function App() {
- const { theme, setTheme } = useTheme()
-
return (
-
- {/* 头部导航 */}
-
-
-
-
-
- 🌾 智慧农业生产管理系统
-
-
-
-
- {/* 主题切换按钮 */}
-
-
-
-
-
-
- {/* 主要内容区域 */}
-
- {/* 欢迎页面 */}
-
-
- 欢迎使用智慧农业生产管理系统
-
-
- 基于 React 18 + Vite 6 + TypeScript + shadcn/ui 构建的现代化农业管理平台
-
-
-
- {/* 系统状态卡片 */}
-
-
-
-
-
- 档案管理
- ✅ 已配置
-
-
- 运行监控
- ✅ 已配置
-
-
- 调度管理
- ✅ 已配置
-
-
-
-
-
-
-
-
- 地块档案
- ✅ 已配置
-
-
- 作物管理
- ✅ 已配置
-
-
- 种植计划
- ✅ 已配置
-
-
-
-
-
-
-
-
- 农机总数
- 0 台
-
-
- 地块面积
- 0 亩
-
-
- 今日作业
- 0 项
-
-
-
-
-
-
-
-
- 用户管理
- ✅ 已配置
-
-
- 权限设置
- ✅ 已配置
-
-
- 系统配置
- ✅ 已配置
-
-
-
-
-
- {/* 技术栈展示 */}
-
-
🛠️ 技术栈
-
-
-
⚛️
-
React 18
-
现代化UI框架
-
-
-
-
📘
-
TypeScript
-
类型安全
-
-
-
🎨
-
Tailwind CSS
-
原子化CSS
-
-
-
-
-
-
-
-
- {/* 快速操作按钮 */}
-
-
-
-
-
-
-
- {/* 开发工具状态 */}
-
-
🔧 开发工具状态
-
-
✅ 项目依赖已安装
-
✅ 开发服务器可正常启动
-
✅ 热重载功能已配置
-
✅ TypeScript类型检查已配置
-
⚙️ ESLint/Prettier可通过开关控制
-
-
-
-
- {/* 页脚 */}
-
-
+
+
+
)
}
diff --git a/crop-x/src/components/app-sidebar.tsx b/crop-x/src/components/app-sidebar.tsx
new file mode 100644
index 0000000..2aee537
--- /dev/null
+++ b/crop-x/src/components/app-sidebar.tsx
@@ -0,0 +1,215 @@
+import * as React from "react"
+import { ChevronRight } from "lucide-react"
+
+import { SearchForm } from "@/components/search-form"
+import { VersionSwitcher } from "@/components/version-switcher"
+import {
+ Collapsible,
+ CollapsibleContent,
+ CollapsibleTrigger,
+} from "@/components/ui/collapsible"
+import {
+ Sidebar,
+ SidebarContent,
+ SidebarGroup,
+ SidebarGroupContent,
+ SidebarGroupLabel,
+ SidebarHeader,
+ SidebarMenu,
+ SidebarMenuButton,
+ SidebarMenuItem,
+ SidebarRail,
+} from "@/components/ui/sidebar"
+
+// This is sample data.
+const data = {
+ versions: ["1.0.1", "1.1.0-alpha", "2.0.0-beta1"],
+ navMain: [
+ {
+ title: "Getting Started",
+ url: "#",
+ items: [
+ {
+ title: "Installation",
+ url: "#",
+ },
+ {
+ title: "Project Structure",
+ url: "#",
+ },
+ ],
+ },
+ {
+ title: "Building Your Application",
+ url: "#",
+ items: [
+ {
+ title: "Routing",
+ url: "#",
+ },
+ {
+ title: "Data Fetching",
+ url: "#",
+ isActive: true,
+ },
+ {
+ title: "Rendering",
+ url: "#",
+ },
+ {
+ title: "Caching",
+ url: "#",
+ },
+ {
+ title: "Styling",
+ url: "#",
+ },
+ {
+ title: "Optimizing",
+ url: "#",
+ },
+ {
+ title: "Configuring",
+ url: "#",
+ },
+ {
+ title: "Testing",
+ url: "#",
+ },
+ {
+ title: "Authentication",
+ url: "#",
+ },
+ {
+ title: "Deploying",
+ url: "#",
+ },
+ {
+ title: "Upgrading",
+ url: "#",
+ },
+ {
+ title: "Examples",
+ url: "#",
+ },
+ ],
+ },
+ {
+ title: "API Reference",
+ url: "#",
+ items: [
+ {
+ title: "Components",
+ url: "#",
+ },
+ {
+ title: "File Conventions",
+ url: "#",
+ },
+ {
+ title: "Functions",
+ url: "#",
+ },
+ {
+ title: "next.config.js Options",
+ url: "#",
+ },
+ {
+ title: "CLI",
+ url: "#",
+ },
+ {
+ title: "Edge Runtime",
+ url: "#",
+ },
+ ],
+ },
+ {
+ title: "Architecture",
+ url: "#",
+ items: [
+ {
+ title: "Accessibility",
+ url: "#",
+ },
+ {
+ title: "Fast Refresh",
+ url: "#",
+ },
+ {
+ title: "Next.js Compiler",
+ url: "#",
+ },
+ {
+ title: "Supported Browsers",
+ url: "#",
+ },
+ {
+ title: "Turbopack",
+ url: "#",
+ },
+ ],
+ },
+ {
+ title: "Community",
+ url: "#",
+ items: [
+ {
+ title: "Contribution Guide",
+ url: "#",
+ },
+ ],
+ },
+ ],
+}
+
+export function AppSidebar({ ...props }: React.ComponentProps) {
+ return (
+
+
+
+
+
+
+ {/* We create a collapsible SidebarGroup for each parent. */}
+ {data.navMain.map((item) => (
+
+
+
+
+ {item.title}{" "}
+
+
+
+
+
+
+ {item.items.map((item) => (
+
+
+ {item.title}
+
+
+ ))}
+
+
+
+
+
+ ))}
+
+
+
+ )
+}
diff --git a/crop-x/src/components/layouts/Main.tsx b/crop-x/src/components/layouts/Main.tsx
new file mode 100644
index 0000000..3a8eb48
--- /dev/null
+++ b/crop-x/src/components/layouts/Main.tsx
@@ -0,0 +1,17 @@
+import React from 'react'
+import { useTheme } from '@/hooks/useTheme'
+import {Navbar1} from '@/components/layouts/Navbar.tsx'
+import Page from './SideBar/SideBar'
+import './index.css'
+function Main() {
+ return (
+
+ )
+}
+
+export default Main
\ No newline at end of file
diff --git a/crop-x/src/components/layouts/Navbar.tsx b/crop-x/src/components/layouts/Navbar.tsx
new file mode 100644
index 0000000..5f41782
--- /dev/null
+++ b/crop-x/src/components/layouts/Navbar.tsx
@@ -0,0 +1,299 @@
+import { Book, Menu, Sunset, Trees, Zap } from "lucide-react";
+
+import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+} from "@/components/ui/accordion";
+import { Button } from "@/components/ui/button";
+import {
+ NavigationMenu,
+ NavigationMenuContent,
+ NavigationMenuItem,
+ NavigationMenuLink,
+ NavigationMenuList,
+ NavigationMenuTrigger,
+} from "@/components/ui/navigation-menu";
+import {
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+ SheetTrigger,
+} from "@/components/ui/sheet";
+
+interface MenuItem {
+ title: string;
+ url: string;
+ description?: string;
+ icon?: React.ReactNode;
+ items?: MenuItem[];
+}
+
+interface Navbar1Props {
+ logo?: {
+ url: string;
+ src: string;
+ alt: string;
+ title: string;
+ };
+ menu?: MenuItem[];
+ auth?: {
+ login: {
+ title: string;
+ url: string;
+ };
+ signup: {
+ title: string;
+ url: string;
+ };
+ };
+}
+
+const Navbar1 = ({
+ logo = {
+ url: "https://www.shadcnblocks.com",
+ src: "https://deifkwefumgah.cloudfront.net/shadcnblocks/block/logos/shadcnblockscom-icon.svg",
+ alt: "logo",
+ title: "Shadcnblocks.com",
+ },
+ menu = [
+ { title: "Home", url: "#" },
+ {
+ title: "Products",
+ url: "#",
+ items: [
+ {
+ title: "Blog",
+ description: "The latest industry news, updates, and info",
+ icon: ,
+ url: "#",
+ },
+ {
+ title: "Company",
+ description: "Our mission is to innovate and empower the world",
+ icon: ,
+ url: "#",
+ },
+ {
+ title: "Careers",
+ description: "Browse job listing and discover our workspace",
+ icon: ,
+ url: "#",
+ },
+ {
+ title: "Support",
+ description:
+ "Get in touch with our support team or visit our community forums",
+ icon: ,
+ url: "#",
+ },
+ ],
+ },
+ {
+ title: "Resources",
+ url: "#",
+ items: [
+ {
+ title: "Help Center",
+ description: "Get all the answers you need right here",
+ icon: ,
+ url: "#",
+ },
+ {
+ title: "Contact Us",
+ description: "We are here to help you with any questions you have",
+ icon: ,
+ url: "#",
+ },
+ {
+ title: "Status",
+ description: "Check the current status of our services and APIs",
+ icon: ,
+ url: "#",
+ },
+ {
+ title: "Terms of Service",
+ description: "Our terms and conditions for using our services",
+ icon: ,
+ url: "#",
+ },
+ ],
+ },
+ {
+ title: "Pricing",
+ url: "#",
+ },
+ {
+ title: "Blog",
+ url: "#",
+ },
+ ],
+ auth = {
+ login: { title: "Login", url: "#" },
+ signup: { title: "Sign up", url: "#" },
+ },
+}: Navbar1Props) => {
+ return (
+
+
+ {/* Desktop Menu */}
+
+
+ {/* Mobile Menu */}
+
+
+ {/* Logo */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {menu.map((item) => renderMobileMenuItem(item))}
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const renderMenuItem = (item: MenuItem) => {
+ if (item.items) {
+ return (
+
+ {item.title}
+
+ {item.items.map((subItem) => (
+
+
+
+ ))}
+
+
+ );
+ }
+
+ return (
+
+
+ {item.title}
+
+
+ );
+};
+
+const renderMobileMenuItem = (item: MenuItem) => {
+ if (item.items) {
+ return (
+
+
+ {item.title}
+
+
+ {item.items.map((subItem) => (
+
+ ))}
+
+
+ );
+ }
+
+ return (
+
+ {item.title}
+
+ );
+};
+
+const SubMenuLink = ({ item }: { item: MenuItem }) => {
+ return (
+
+ {item.icon}
+
+
{item.title}
+ {item.description && (
+
+ {item.description}
+
+ )}
+
+
+ );
+};
+
+export {Navbar1} ;
diff --git a/crop-x/src/components/layouts/SideBar/SideBar.tsx b/crop-x/src/components/layouts/SideBar/SideBar.tsx
new file mode 100644
index 0000000..fbd049d
--- /dev/null
+++ b/crop-x/src/components/layouts/SideBar/SideBar.tsx
@@ -0,0 +1,50 @@
+import { AppSidebar } from "@/components/app-sidebar"
+import {
+ Breadcrumb,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbList,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+} from "@/components/ui/breadcrumb"
+import { Separator } from "@/components/ui/separator"
+import {
+ SidebarInset,
+ SidebarProvider,
+ SidebarTrigger,
+} from "@/components/ui/sidebar"
+
+export default function Page() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ Building Your Application
+
+
+
+
+ Data Fetching
+
+
+
+
+
+ {Array.from({ length: 24 }).map((_, index) => (
+
+ ))}
+
+
+
+ )
+}
diff --git a/crop-x/src/components/layouts/index.css b/crop-x/src/components/layouts/index.css
new file mode 100644
index 0000000..56b8e24
--- /dev/null
+++ b/crop-x/src/components/layouts/index.css
@@ -0,0 +1,6 @@
+.parent-flex {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem; /* 控制子元素间距 */
+ width: 100%; /* 默认宽度 */
+}
\ No newline at end of file
diff --git a/crop-x/src/components/search-form.tsx b/crop-x/src/components/search-form.tsx
new file mode 100644
index 0000000..bda415b
--- /dev/null
+++ b/crop-x/src/components/search-form.tsx
@@ -0,0 +1,28 @@
+import { Search } from "lucide-react"
+
+import { Label } from "@/components/ui/label"
+import {
+ SidebarGroup,
+ SidebarGroupContent,
+ SidebarInput,
+} from "@/components/ui/sidebar"
+
+export function SearchForm({ ...props }: React.ComponentProps<"form">) {
+ return (
+
+ )
+}
diff --git a/crop-x/src/components/ui/accordion.tsx b/crop-x/src/components/ui/accordion.tsx
new file mode 100644
index 0000000..e6a723d
--- /dev/null
+++ b/crop-x/src/components/ui/accordion.tsx
@@ -0,0 +1,56 @@
+import * as React from "react"
+import * as AccordionPrimitive from "@radix-ui/react-accordion"
+import { ChevronDown } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Accordion = AccordionPrimitive.Root
+
+const AccordionItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AccordionItem.displayName = "AccordionItem"
+
+const AccordionTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ svg]:rotate-180",
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+))
+AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
+
+const AccordionContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}
+
+))
+
+AccordionContent.displayName = AccordionPrimitive.Content.displayName
+
+export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
diff --git a/crop-x/src/components/ui/breadcrumb.tsx b/crop-x/src/components/ui/breadcrumb.tsx
new file mode 100644
index 0000000..eb88f32
--- /dev/null
+++ b/crop-x/src/components/ui/breadcrumb.tsx
@@ -0,0 +1,109 @@
+import * as React from "react"
+import { Slot } from "@radix-ui/react-slot"
+import { ChevronRight, MoreHorizontal } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+function Breadcrumb({ ...props }: React.ComponentProps<"nav">) {
+ return
+}
+
+function BreadcrumbList({ className, ...props }: React.ComponentProps<"ol">) {
+ return (
+
+ )
+}
+
+function BreadcrumbItem({ className, ...props }: React.ComponentProps<"li">) {
+ return (
+
+ )
+}
+
+function BreadcrumbLink({
+ asChild,
+ className,
+ ...props
+}: React.ComponentProps<"a"> & {
+ asChild?: boolean
+}) {
+ const Comp = asChild ? Slot : "a"
+
+ return (
+
+ )
+}
+
+function BreadcrumbPage({ className, ...props }: React.ComponentProps<"span">) {
+ return (
+
+ )
+}
+
+function BreadcrumbSeparator({
+ children,
+ className,
+ ...props
+}: React.ComponentProps<"li">) {
+ return (
+ svg]:size-3.5", className)}
+ {...props}
+ >
+ {children ?? }
+
+ )
+}
+
+function BreadcrumbEllipsis({
+ className,
+ ...props
+}: React.ComponentProps<"span">) {
+ return (
+
+
+ More
+
+ )
+}
+
+export {
+ Breadcrumb,
+ BreadcrumbList,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+ BreadcrumbEllipsis,
+}
diff --git a/crop-x/src/components/ui/button.tsx b/crop-x/src/components/ui/button.tsx
new file mode 100644
index 0000000..21409a0
--- /dev/null
+++ b/crop-x/src/components/ui/button.tsx
@@ -0,0 +1,60 @@
+import * as React from "react"
+import { Slot } from "@radix-ui/react-slot"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const buttonVariants = cva(
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
+ {
+ variants: {
+ variant: {
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
+ destructive:
+ "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
+ outline:
+ "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
+ secondary:
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80",
+ ghost:
+ "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
+ icon: "size-9",
+ "icon-sm": "size-8",
+ "icon-lg": "size-10",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ }
+)
+
+function Button({
+ className,
+ variant,
+ size,
+ asChild = false,
+ ...props
+}: React.ComponentProps<"button"> &
+ VariantProps & {
+ asChild?: boolean
+ }) {
+ const Comp = asChild ? Slot : "button"
+
+ return (
+
+ )
+}
+
+export { Button, buttonVariants }
diff --git a/crop-x/src/components/ui/collapsible.tsx b/crop-x/src/components/ui/collapsible.tsx
new file mode 100644
index 0000000..a23e7a2
--- /dev/null
+++ b/crop-x/src/components/ui/collapsible.tsx
@@ -0,0 +1,9 @@
+import * as CollapsiblePrimitive from "@radix-ui/react-collapsible"
+
+const Collapsible = CollapsiblePrimitive.Root
+
+const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger
+
+const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent
+
+export { Collapsible, CollapsibleTrigger, CollapsibleContent }
diff --git a/crop-x/src/components/ui/dropdown-menu.tsx b/crop-x/src/components/ui/dropdown-menu.tsx
new file mode 100644
index 0000000..eaed9ba
--- /dev/null
+++ b/crop-x/src/components/ui/dropdown-menu.tsx
@@ -0,0 +1,255 @@
+import * as React from "react"
+import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
+import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+function DropdownMenu({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function DropdownMenuPortal({
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function DropdownMenuTrigger({
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function DropdownMenuContent({
+ className,
+ sideOffset = 4,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+ )
+}
+
+function DropdownMenuGroup({
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function DropdownMenuItem({
+ className,
+ inset,
+ variant = "default",
+ ...props
+}: React.ComponentProps & {
+ inset?: boolean
+ variant?: "default" | "destructive"
+}) {
+ return (
+
+ )
+}
+
+function DropdownMenuCheckboxItem({
+ className,
+ children,
+ checked,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+
+
+
+ {children}
+
+ )
+}
+
+function DropdownMenuRadioGroup({
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function DropdownMenuRadioItem({
+ className,
+ children,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+
+
+
+ {children}
+
+ )
+}
+
+function DropdownMenuLabel({
+ className,
+ inset,
+ ...props
+}: React.ComponentProps & {
+ inset?: boolean
+}) {
+ return (
+
+ )
+}
+
+function DropdownMenuSeparator({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function DropdownMenuShortcut({
+ className,
+ ...props
+}: React.ComponentProps<"span">) {
+ return (
+
+ )
+}
+
+function DropdownMenuSub({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function DropdownMenuSubTrigger({
+ className,
+ inset,
+ children,
+ ...props
+}: React.ComponentProps & {
+ inset?: boolean
+}) {
+ return (
+
+ {children}
+
+
+ )
+}
+
+function DropdownMenuSubContent({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export {
+ DropdownMenu,
+ DropdownMenuPortal,
+ DropdownMenuTrigger,
+ DropdownMenuContent,
+ DropdownMenuGroup,
+ DropdownMenuLabel,
+ DropdownMenuItem,
+ DropdownMenuCheckboxItem,
+ DropdownMenuRadioGroup,
+ DropdownMenuRadioItem,
+ DropdownMenuSeparator,
+ DropdownMenuShortcut,
+ DropdownMenuSub,
+ DropdownMenuSubTrigger,
+ DropdownMenuSubContent,
+}
diff --git a/crop-x/src/components/ui/input.tsx b/crop-x/src/components/ui/input.tsx
new file mode 100644
index 0000000..8916905
--- /dev/null
+++ b/crop-x/src/components/ui/input.tsx
@@ -0,0 +1,21 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+function Input({ className, type, ...props }: React.ComponentProps<"input">) {
+ return (
+
+ )
+}
+
+export { Input }
diff --git a/crop-x/src/components/ui/label.tsx b/crop-x/src/components/ui/label.tsx
new file mode 100644
index 0000000..fb5fbc3
--- /dev/null
+++ b/crop-x/src/components/ui/label.tsx
@@ -0,0 +1,24 @@
+"use client"
+
+import * as React from "react"
+import * as LabelPrimitive from "@radix-ui/react-label"
+
+import { cn } from "@/lib/utils"
+
+function Label({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export { Label }
diff --git a/crop-x/src/components/ui/navigation-menu.tsx b/crop-x/src/components/ui/navigation-menu.tsx
new file mode 100644
index 0000000..411f519
--- /dev/null
+++ b/crop-x/src/components/ui/navigation-menu.tsx
@@ -0,0 +1,128 @@
+import * as React from "react"
+import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu"
+import { cva } from "class-variance-authority"
+import { ChevronDown } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const NavigationMenu = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}
+
+
+))
+NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName
+
+const NavigationMenuList = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName
+
+const NavigationMenuItem = NavigationMenuPrimitive.Item
+
+const navigationMenuTriggerStyle = cva(
+ "group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[state=open]:text-accent-foreground data-[state=open]:bg-accent/50 data-[state=open]:hover:bg-accent data-[state=open]:focus:bg-accent"
+)
+
+const NavigationMenuTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}{" "}
+
+
+))
+NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName
+
+const NavigationMenuContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName
+
+const NavigationMenuLink = NavigationMenuPrimitive.Link
+
+const NavigationMenuViewport = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+NavigationMenuViewport.displayName =
+ NavigationMenuPrimitive.Viewport.displayName
+
+const NavigationMenuIndicator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+NavigationMenuIndicator.displayName =
+ NavigationMenuPrimitive.Indicator.displayName
+
+export {
+ navigationMenuTriggerStyle,
+ NavigationMenu,
+ NavigationMenuList,
+ NavigationMenuItem,
+ NavigationMenuContent,
+ NavigationMenuTrigger,
+ NavigationMenuLink,
+ NavigationMenuIndicator,
+ NavigationMenuViewport,
+}
diff --git a/crop-x/src/components/ui/separator.tsx b/crop-x/src/components/ui/separator.tsx
new file mode 100644
index 0000000..bb3ad74
--- /dev/null
+++ b/crop-x/src/components/ui/separator.tsx
@@ -0,0 +1,26 @@
+import * as React from "react"
+import * as SeparatorPrimitive from "@radix-ui/react-separator"
+
+import { cn } from "@/lib/utils"
+
+function Separator({
+ className,
+ orientation = "horizontal",
+ decorative = true,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export { Separator }
diff --git a/crop-x/src/components/ui/sheet.tsx b/crop-x/src/components/ui/sheet.tsx
new file mode 100644
index 0000000..84649ad
--- /dev/null
+++ b/crop-x/src/components/ui/sheet.tsx
@@ -0,0 +1,139 @@
+"use client"
+
+import * as React from "react"
+import * as SheetPrimitive from "@radix-ui/react-dialog"
+import { XIcon } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+function Sheet({ ...props }: React.ComponentProps) {
+ return
+}
+
+function SheetTrigger({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function SheetClose({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function SheetPortal({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function SheetOverlay({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function SheetContent({
+ className,
+ children,
+ side = "right",
+ ...props
+}: React.ComponentProps & {
+ side?: "top" | "right" | "bottom" | "left"
+}) {
+ return (
+
+
+
+ {children}
+
+
+ Close
+
+
+
+ )
+}
+
+function SheetHeader({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function SheetFooter({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function SheetTitle({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function SheetDescription({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export {
+ Sheet,
+ SheetTrigger,
+ SheetClose,
+ SheetContent,
+ SheetHeader,
+ SheetFooter,
+ SheetTitle,
+ SheetDescription,
+}
diff --git a/crop-x/src/components/ui/sidebar.tsx b/crop-x/src/components/ui/sidebar.tsx
new file mode 100644
index 0000000..ce48c45
--- /dev/null
+++ b/crop-x/src/components/ui/sidebar.tsx
@@ -0,0 +1,726 @@
+"use client"
+
+import * as React from "react"
+import { Slot } from "@radix-ui/react-slot"
+import { cva, type VariantProps } from "class-variance-authority"
+import { PanelLeftIcon } from "lucide-react"
+
+import { useIsMobile } from "@/hooks/use-mobile"
+import { cn } from "@/lib/utils"
+import { Button } from "@/components/ui/button"
+import { Input } from "@/components/ui/input"
+import { Separator } from "@/components/ui/separator"
+import {
+ Sheet,
+ SheetContent,
+ SheetDescription,
+ SheetHeader,
+ SheetTitle,
+} from "@/components/ui/sheet"
+import { Skeleton } from "@/components/ui/skeleton"
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from "@/components/ui/tooltip"
+
+const SIDEBAR_COOKIE_NAME = "sidebar_state"
+const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7
+const SIDEBAR_WIDTH = "16rem"
+const SIDEBAR_WIDTH_MOBILE = "18rem"
+const SIDEBAR_WIDTH_ICON = "3rem"
+const SIDEBAR_KEYBOARD_SHORTCUT = "b"
+
+type SidebarContextProps = {
+ state: "expanded" | "collapsed"
+ open: boolean
+ setOpen: (open: boolean) => void
+ openMobile: boolean
+ setOpenMobile: (open: boolean) => void
+ isMobile: boolean
+ toggleSidebar: () => void
+}
+
+const SidebarContext = React.createContext(null)
+
+function useSidebar() {
+ const context = React.useContext(SidebarContext)
+ if (!context) {
+ throw new Error("useSidebar must be used within a SidebarProvider.")
+ }
+
+ return context
+}
+
+function SidebarProvider({
+ defaultOpen = true,
+ open: openProp,
+ onOpenChange: setOpenProp,
+ className,
+ style,
+ children,
+ ...props
+}: React.ComponentProps<"div"> & {
+ defaultOpen?: boolean
+ open?: boolean
+ onOpenChange?: (open: boolean) => void
+}) {
+ const isMobile = useIsMobile()
+ const [openMobile, setOpenMobile] = React.useState(false)
+
+ // This is the internal state of the sidebar.
+ // We use openProp and setOpenProp for control from outside the component.
+ const [_open, _setOpen] = React.useState(defaultOpen)
+ const open = openProp ?? _open
+ const setOpen = React.useCallback(
+ (value: boolean | ((value: boolean) => boolean)) => {
+ const openState = typeof value === "function" ? value(open) : value
+ if (setOpenProp) {
+ setOpenProp(openState)
+ } else {
+ _setOpen(openState)
+ }
+
+ // This sets the cookie to keep the sidebar state.
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`
+ },
+ [setOpenProp, open]
+ )
+
+ // Helper to toggle the sidebar.
+ const toggleSidebar = React.useCallback(() => {
+ return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)
+ }, [isMobile, setOpen, setOpenMobile])
+
+ // Adds a keyboard shortcut to toggle the sidebar.
+ React.useEffect(() => {
+ const handleKeyDown = (event: KeyboardEvent) => {
+ if (
+ event.key === SIDEBAR_KEYBOARD_SHORTCUT &&
+ (event.metaKey || event.ctrlKey)
+ ) {
+ event.preventDefault()
+ toggleSidebar()
+ }
+ }
+
+ window.addEventListener("keydown", handleKeyDown)
+ return () => window.removeEventListener("keydown", handleKeyDown)
+ }, [toggleSidebar])
+
+ // We add a state so that we can do data-state="expanded" or "collapsed".
+ // This makes it easier to style the sidebar with Tailwind classes.
+ const state = open ? "expanded" : "collapsed"
+
+ const contextValue = React.useMemo(
+ () => ({
+ state,
+ open,
+ setOpen,
+ isMobile,
+ openMobile,
+ setOpenMobile,
+ toggleSidebar,
+ }),
+ [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
+ )
+
+ return (
+
+
+
+ {children}
+
+
+
+ )
+}
+
+function Sidebar({
+ side = "left",
+ variant = "sidebar",
+ collapsible = "offcanvas",
+ className,
+ children,
+ ...props
+}: React.ComponentProps<"div"> & {
+ side?: "left" | "right"
+ variant?: "sidebar" | "floating" | "inset"
+ collapsible?: "offcanvas" | "icon" | "none"
+}) {
+ const { isMobile, state, openMobile, setOpenMobile } = useSidebar()
+
+ if (collapsible === "none") {
+ return (
+
+ {children}
+
+ )
+ }
+
+ if (isMobile) {
+ return (
+
+
+
+ Sidebar
+ Displays the mobile sidebar.
+
+ {children}
+
+
+ )
+ }
+
+ return (
+
+ {/* This is what handles the sidebar gap on desktop */}
+
+
+
+ )
+}
+
+function SidebarTrigger({
+ className,
+ onClick,
+ ...props
+}: React.ComponentProps) {
+ const { toggleSidebar } = useSidebar()
+
+ return (
+
+ )
+}
+
+function SidebarRail({ className, ...props }: React.ComponentProps<"button">) {
+ const { toggleSidebar } = useSidebar()
+
+ return (
+
+ )
+}
+
+function SidebarInset({ className, ...props }: React.ComponentProps<"main">) {
+ return (
+
+ )
+}
+
+function SidebarInput({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function SidebarHeader({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function SidebarFooter({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function SidebarSeparator({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function SidebarContent({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function SidebarGroup({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function SidebarGroupLabel({
+ className,
+ asChild = false,
+ ...props
+}: React.ComponentProps<"div"> & { asChild?: boolean }) {
+ const Comp = asChild ? Slot : "div"
+
+ return (
+ svg]:size-4 [&>svg]:shrink-0",
+ "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
+ className
+ )}
+ {...props}
+ />
+ )
+}
+
+function SidebarGroupAction({
+ className,
+ asChild = false,
+ ...props
+}: React.ComponentProps<"button"> & { asChild?: boolean }) {
+ const Comp = asChild ? Slot : "button"
+
+ return (
+ svg]:size-4 [&>svg]:shrink-0",
+ // Increases the hit area of the button on mobile.
+ "after:absolute after:-inset-2 md:after:hidden",
+ "group-data-[collapsible=icon]:hidden",
+ className
+ )}
+ {...props}
+ />
+ )
+}
+
+function SidebarGroupContent({
+ className,
+ ...props
+}: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function SidebarMenu({ className, ...props }: React.ComponentProps<"ul">) {
+ return (
+
+ )
+}
+
+function SidebarMenuItem({ className, ...props }: React.ComponentProps<"li">) {
+ return (
+
+ )
+}
+
+const sidebarMenuButtonVariants = cva(
+ "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
+ {
+ variants: {
+ variant: {
+ default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
+ outline:
+ "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]",
+ },
+ size: {
+ default: "h-8 text-sm",
+ sm: "h-7 text-xs",
+ lg: "h-12 text-sm group-data-[collapsible=icon]:p-0!",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ }
+)
+
+function SidebarMenuButton({
+ asChild = false,
+ isActive = false,
+ variant = "default",
+ size = "default",
+ tooltip,
+ className,
+ ...props
+}: React.ComponentProps<"button"> & {
+ asChild?: boolean
+ isActive?: boolean
+ tooltip?: string | React.ComponentProps
+} & VariantProps) {
+ const Comp = asChild ? Slot : "button"
+ const { isMobile, state } = useSidebar()
+
+ const button = (
+
+ )
+
+ if (!tooltip) {
+ return button
+ }
+
+ if (typeof tooltip === "string") {
+ tooltip = {
+ children: tooltip,
+ }
+ }
+
+ return (
+
+ {button}
+
+
+ )
+}
+
+function SidebarMenuAction({
+ className,
+ asChild = false,
+ showOnHover = false,
+ ...props
+}: React.ComponentProps<"button"> & {
+ asChild?: boolean
+ showOnHover?: boolean
+}) {
+ const Comp = asChild ? Slot : "button"
+
+ return (
+ svg]:size-4 [&>svg]:shrink-0",
+ // Increases the hit area of the button on mobile.
+ "after:absolute after:-inset-2 md:after:hidden",
+ "peer-data-[size=sm]/menu-button:top-1",
+ "peer-data-[size=default]/menu-button:top-1.5",
+ "peer-data-[size=lg]/menu-button:top-2.5",
+ "group-data-[collapsible=icon]:hidden",
+ showOnHover &&
+ "peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0",
+ className
+ )}
+ {...props}
+ />
+ )
+}
+
+function SidebarMenuBadge({
+ className,
+ ...props
+}: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function SidebarMenuSkeleton({
+ className,
+ showIcon = false,
+ ...props
+}: React.ComponentProps<"div"> & {
+ showIcon?: boolean
+}) {
+ // Random width between 50 to 90%.
+ const width = React.useMemo(() => {
+ return `${Math.floor(Math.random() * 40) + 50}%`
+ }, [])
+
+ return (
+
+ {showIcon && (
+
+ )}
+
+
+ )
+}
+
+function SidebarMenuSub({ className, ...props }: React.ComponentProps<"ul">) {
+ return (
+
+ )
+}
+
+function SidebarMenuSubItem({
+ className,
+ ...props
+}: React.ComponentProps<"li">) {
+ return (
+
+ )
+}
+
+function SidebarMenuSubButton({
+ asChild = false,
+ size = "md",
+ isActive = false,
+ className,
+ ...props
+}: React.ComponentProps<"a"> & {
+ asChild?: boolean
+ size?: "sm" | "md"
+ isActive?: boolean
+}) {
+ const Comp = asChild ? Slot : "a"
+
+ return (
+ svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
+ "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
+ size === "sm" && "text-xs",
+ size === "md" && "text-sm",
+ "group-data-[collapsible=icon]:hidden",
+ className
+ )}
+ {...props}
+ />
+ )
+}
+
+export {
+ Sidebar,
+ SidebarContent,
+ SidebarFooter,
+ SidebarGroup,
+ SidebarGroupAction,
+ SidebarGroupContent,
+ SidebarGroupLabel,
+ SidebarHeader,
+ SidebarInput,
+ SidebarInset,
+ SidebarMenu,
+ SidebarMenuAction,
+ SidebarMenuBadge,
+ SidebarMenuButton,
+ SidebarMenuItem,
+ SidebarMenuSkeleton,
+ SidebarMenuSub,
+ SidebarMenuSubButton,
+ SidebarMenuSubItem,
+ SidebarProvider,
+ SidebarRail,
+ SidebarSeparator,
+ SidebarTrigger,
+ useSidebar,
+}
diff --git a/crop-x/src/components/ui/skeleton.tsx b/crop-x/src/components/ui/skeleton.tsx
new file mode 100644
index 0000000..32ea0ef
--- /dev/null
+++ b/crop-x/src/components/ui/skeleton.tsx
@@ -0,0 +1,13 @@
+import { cn } from "@/lib/utils"
+
+function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+export { Skeleton }
diff --git a/crop-x/src/components/ui/tooltip.tsx b/crop-x/src/components/ui/tooltip.tsx
new file mode 100644
index 0000000..715bf76
--- /dev/null
+++ b/crop-x/src/components/ui/tooltip.tsx
@@ -0,0 +1,59 @@
+import * as React from "react"
+import * as TooltipPrimitive from "@radix-ui/react-tooltip"
+
+import { cn } from "@/lib/utils"
+
+function TooltipProvider({
+ delayDuration = 0,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function Tooltip({
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+ )
+}
+
+function TooltipTrigger({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function TooltipContent({
+ className,
+ sideOffset = 0,
+ children,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+ {children}
+
+
+
+ )
+}
+
+export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
diff --git a/crop-x/src/components/version-switcher.tsx b/crop-x/src/components/version-switcher.tsx
new file mode 100644
index 0000000..c424844
--- /dev/null
+++ b/crop-x/src/components/version-switcher.tsx
@@ -0,0 +1,62 @@
+import * as React from "react"
+import { Check, ChevronsUpDown, GalleryVerticalEnd } from "lucide-react"
+
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "@/components/ui/dropdown-menu"
+import {
+ SidebarMenu,
+ SidebarMenuButton,
+ SidebarMenuItem,
+} from "@/components/ui/sidebar"
+
+export function VersionSwitcher({
+ versions,
+ defaultVersion,
+}: {
+ versions: string[]
+ defaultVersion: string
+}) {
+ const [selectedVersion, setSelectedVersion] = React.useState(defaultVersion)
+
+ return (
+
+
+
+
+
+
+
+
+
+ Documentation
+ v{selectedVersion}
+
+
+
+
+
+ {versions.map((version) => (
+ setSelectedVersion(version)}
+ >
+ v{version}{" "}
+ {version === selectedVersion && }
+
+ ))}
+
+
+
+
+ )
+}
diff --git a/crop-x/src/hooks/use-mobile.ts b/crop-x/src/hooks/use-mobile.ts
new file mode 100644
index 0000000..2b0fe1d
--- /dev/null
+++ b/crop-x/src/hooks/use-mobile.ts
@@ -0,0 +1,19 @@
+import * as React from "react"
+
+const MOBILE_BREAKPOINT = 768
+
+export function useIsMobile() {
+ const [isMobile, setIsMobile] = React.useState(undefined)
+
+ React.useEffect(() => {
+ const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
+ const onChange = () => {
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
+ }
+ mql.addEventListener("change", onChange)
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
+ return () => mql.removeEventListener("change", onChange)
+ }, [])
+
+ return !!isMobile
+}
diff --git a/crop-x/src/lib/utils.ts b/crop-x/src/lib/utils.ts
index 8be400a..bd0c391 100644
--- a/crop-x/src/lib/utils.ts
+++ b/crop-x/src/lib/utils.ts
@@ -1,218 +1,6 @@
-import { type ClassValue, clsx } from "clsx"
+import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"
-// 合并 Tailwind CSS 类名的工具函数
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}
-
-// 格式化日期
-export function formatDate(date: Date | string | number): string {
- const d = new Date(date)
- return d.toLocaleDateString('zh-CN', {
- year: 'numeric',
- month: '2-digit',
- day: '2-digit',
- })
-}
-
-// 格式化时间
-export function formatTime(date: Date | string | number): string {
- const d = new Date(date)
- return d.toLocaleTimeString('zh-CN', {
- hour: '2-digit',
- minute: '2-digit',
- second: '2-digit',
- })
-}
-
-// 格式化日期时间
-export function formatDateTime(date: Date | string | number): string {
- return `${formatDate(date)} ${formatTime(date)}`
-}
-
-// 相对时间格式化
-export function formatRelativeTime(date: Date | string | number): string {
- const now = new Date()
- const target = new Date(date)
- const diffMs = now.getTime() - target.getTime()
- const diffSecs = Math.floor(diffMs / 1000)
- const diffMins = Math.floor(diffSecs / 60)
- const diffHours = Math.floor(diffMins / 60)
- const diffDays = Math.floor(diffHours / 24)
-
- if (diffSecs < 60) {
- return '刚刚'
- } else if (diffMins < 60) {
- return `${diffMins}分钟前`
- } else if (diffHours < 24) {
- return `${diffHours}小时前`
- } else if (diffDays < 7) {
- return `${diffDays}天前`
- } else {
- return formatDate(date)
- }
-}
-
-// 数字格式化
-export function formatNumber(num: number, precision = 2): string {
- return num.toLocaleString('zh-CN', {
- minimumFractionDigits: precision,
- maximumFractionDigits: precision,
- })
-}
-
-// 货币格式化
-export function formatCurrency(amount: number): string {
- return new Intl.NumberFormat('zh-CN', {
- style: 'currency',
- currency: 'CNY',
- }).format(amount)
-}
-
-// 百分比格式化
-export function formatPercentage(value: number, precision = 1): string {
- return `${(value * 100).toFixed(precision)}%`
-}
-
-// 文件大小格式化
-export function formatFileSize(bytes: number): string {
- const units = ['B', 'KB', 'MB', 'GB', 'TB']
- let size = bytes
- let unitIndex = 0
-
- while (size >= 1024 && unitIndex < units.length - 1) {
- size /= 1024
- unitIndex++
- }
-
- return `${formatNumber(size, unitIndex === 0 ? 0 : 2)} ${units[unitIndex]}`
-}
-
-// 农机状态映射
-export const machineryStatusMap = {
- running: { label: '运行中', color: 'status-running' },
- idle: { label: '空闲中', color: 'status-idle' },
- maintenance: { label: '维护中', color: 'status-maintenance' },
- error: { label: '故障中', color: 'status-error' },
- offline: { label: '离线', color: 'status-offline' },
-} as const
-
-// 获取农机状态信息
-export function getMachineryStatus(status: keyof typeof machineryStatusMap) {
- return machineryStatusMap[status] || { label: '未知', color: 'status-idle' }
-}
-
-// 农作物类型映射
-export const cropTypeMap = {
- rice: { label: '水稻', icon: '🌾' },
- wheat: { label: '小麦', icon: '🌾' },
- corn: { label: '玉米', icon: '🌽' },
- soybean: { label: '大豆', icon: '🫘' },
- vegetable: { label: '蔬菜', icon: '🥬' },
- fruit: { label: '水果', icon: '🍎' },
-} as const
-
-// 获取农作物信息
-export function getCropInfo(type: keyof typeof cropTypeMap) {
- return cropTypeMap[type] || { label: '未知', icon: '🌱' }
-}
-
-// 防抖函数
-export function debounce any>(
- func: T,
- wait: number
-): (...args: Parameters) => void {
- let timeout: NodeJS.Timeout | null = null
-
- return (...args: Parameters) => {
- if (timeout !== null) {
- clearTimeout(timeout)
- }
- timeout = setTimeout(() => func(...args), wait)
- }
-}
-
-// 节流函数
-export function throttle any>(
- func: T,
- limit: number
-): (...args: Parameters) => void {
- let inThrottle: boolean = false
-
- return (...args: Parameters) => {
- if (!inThrottle) {
- func(...args)
- inThrottle = true
- setTimeout(() => (inThrottle = false), limit)
- }
- }
-}
-
-// 深拷贝
-export function deepClone(obj: T): T {
- if (obj === null || typeof obj !== 'object') {
- return obj
- }
-
- if (obj instanceof Date) {
- return new Date(obj.getTime()) as T
- }
-
- if (obj instanceof Array) {
- return obj.map(item => deepClone(item)) as T
- }
-
- if (typeof obj === 'object') {
- const clonedObj = {} as T
- for (const key in obj) {
- if (obj.hasOwnProperty(key)) {
- clonedObj[key] = deepClone(obj[key])
- }
- }
- return clonedObj
- }
-
- return obj
-}
-
-// 生成随机ID
-export function generateId(length = 8): string {
- const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
- let result = ''
- for (let i = 0; i < length; i++) {
- result += chars.charAt(Math.floor(Math.random() * chars.length))
- }
- return result
-}
-
-// 验证邮箱
-export function isValidEmail(email: string): boolean {
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
- return emailRegex.test(email)
-}
-
-// 验证手机号
-export function isValidPhone(phone: string): boolean {
- const phoneRegex = /^1[3-9]\d{9}$/
- return phoneRegex.test(phone)
-}
-
-// 计算两个日期之间的天数差
-export function daysBetween(date1: Date | string, date2: Date | string): number {
- const d1 = new Date(date1)
- const d2 = new Date(date2)
- const diffTime = Math.abs(d2.getTime() - d1.getTime())
- return Math.ceil(diffTime / (1000 * 60 * 60 * 24))
-}
-
-// 获取季节
-export function getSeason(date: Date | string = new Date()): string {
- const d = new Date(date)
- const month = d.getMonth() + 1
-
- if (month >= 3 && month <= 5) return '春季'
- if (month >= 6 && month <= 8) return '夏季'
- if (month >= 9 && month <= 11) return '秋季'
- return '冬季'
-}
\ No newline at end of file
diff --git a/crop-x/src/styles/globals.css b/crop-x/src/styles/globals.css
index b11dffd..03660b7 100644
--- a/crop-x/src/styles/globals.css
+++ b/crop-x/src/styles/globals.css
@@ -1,6 +1,8 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
+
+@import "tailwindcss";
+
+@custom-variant dark (&:is(.dark *));
+@config "../../tailwind.config.js";
/* CSS变量定义 - 农业管理系统主题 */
:root {
@@ -59,6 +61,14 @@
--radius-md: 6px;
--radius-lg: 8px;
--radius-xl: 12px;
+ --sidebar: hsl(0 0% 98%);
+ --sidebar-foreground: hsl(240 5.3% 26.1%);
+ --sidebar-primary: hsl(240 5.9% 10%);
+ --sidebar-primary-foreground: hsl(0 0% 98%);
+ --sidebar-accent: hsl(240 4.8% 95.9%);
+ --sidebar-accent-foreground: hsl(240 5.9% 10%);
+ --sidebar-border: hsl(220 13% 91%);
+ --sidebar-ring: hsl(217.2 91.2% 59.8%);
}
.dark {
@@ -81,6 +91,14 @@
--border: 240 3% 15%;
--input: 240 3% 15%;
--ring: 142 70% 45%;
+ --sidebar: hsl(240 5.9% 10%);
+ --sidebar-foreground: hsl(240 4.8% 95.9%);
+ --sidebar-primary: hsl(224.3 76.3% 48%);
+ --sidebar-primary-foreground: hsl(0 0% 100%);
+ --sidebar-accent: hsl(240 3.7% 15.9%);
+ --sidebar-accent-foreground: hsl(240 4.8% 95.9%);
+ --sidebar-border: hsl(240 3.7% 15.9%);
+ --sidebar-ring: hsl(217.2 91.2% 59.8%);
}
/* 基础样式 */
@@ -92,6 +110,59 @@
@apply bg-background text-foreground;
font-feature-settings: "rlig" 1, "calt" 1;
}
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 0 0% 3.9%;
+ --card: 0 0% 100%;
+ --card-foreground: 0 0% 3.9%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 0 0% 3.9%;
+ --primary: 0 0% 9%;
+ --primary-foreground: 0 0% 98%;
+ --secondary: 0 0% 96.1%;
+ --secondary-foreground: 0 0% 9%;
+ --muted: 0 0% 96.1%;
+ --muted-foreground: 0 0% 45.1%;
+ --accent: 0 0% 96.1%;
+ --accent-foreground: 0 0% 9%;
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 0 0% 89.8%;
+ --input: 0 0% 89.8%;
+ --ring: 0 0% 3.9%;
+ --chart-1: 12 76% 61%;
+ --chart-2: 173 58% 39%;
+ --chart-3: 197 37% 24%;
+ --chart-4: 43 74% 66%;
+ --chart-5: 27 87% 67%;
+ --radius: 0.5rem;
+ }
+ .dark {
+ --background: 0 0% 3.9%;
+ --foreground: 0 0% 98%;
+ --card: 0 0% 3.9%;
+ --card-foreground: 0 0% 98%;
+ --popover: 0 0% 3.9%;
+ --popover-foreground: 0 0% 98%;
+ --primary: 0 0% 98%;
+ --primary-foreground: 0 0% 9%;
+ --secondary: 0 0% 14.9%;
+ --secondary-foreground: 0 0% 98%;
+ --muted: 0 0% 14.9%;
+ --muted-foreground: 0 0% 63.9%;
+ --accent: 0 0% 14.9%;
+ --accent-foreground: 0 0% 98%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 0 0% 14.9%;
+ --input: 0 0% 14.9%;
+ --ring: 0 0% 83.1%;
+ --chart-1: 220 70% 50%;
+ --chart-2: 160 60% 45%;
+ --chart-3: 30 80% 55%;
+ --chart-4: 280 65% 60%;
+ --chart-5: 340 75% 55%;
+ }
}
/* 组件样式 */
@@ -207,4 +278,24 @@
.card-agriculture {
@apply shadow-none border border-gray-300;
}
+}
+
+@theme inline {
+ --color-sidebar: var(--sidebar);
+ --color-sidebar-foreground: var(--sidebar-foreground);
+ --color-sidebar-primary: var(--sidebar-primary);
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
+ --color-sidebar-accent: var(--sidebar-accent);
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
+ --color-sidebar-border: var(--sidebar-border);
+ --color-sidebar-ring: var(--sidebar-ring);
+}
+
+@layer base {
+ * {
+ @apply border-border outline-ring/50;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
}
\ No newline at end of file
diff --git a/crop-x/tailwind.config.js b/crop-x/tailwind.config.js
index 47bc159..51a8f31 100644
--- a/crop-x/tailwind.config.js
+++ b/crop-x/tailwind.config.js
@@ -9,69 +9,102 @@ export default {
],
prefix: "",
theme: {
- container: {
- center: true,
- padding: "2rem",
- screens: {
- "2xl": "1400px",
- },
- },
- extend: {
- colors: {
- border: "hsl(var(--border))",
- input: "hsl(var(--input))",
- ring: "hsl(var(--ring))",
- background: "hsl(var(--background))",
- foreground: "hsl(var(--foreground))",
- primary: {
- DEFAULT: "hsl(var(--primary))",
- foreground: "hsl(var(--primary-foreground))",
- },
- secondary: {
- DEFAULT: "hsl(var(--secondary))",
- foreground: "hsl(var(--secondary-foreground))",
- },
- destructive: {
- DEFAULT: "hsl(var(--destructive))",
- foreground: "hsl(var(--destructive-foreground))",
- },
- muted: {
- DEFAULT: "hsl(var(--muted))",
- foreground: "hsl(var(--muted-foreground))",
- },
- accent: {
- DEFAULT: "hsl(var(--accent))",
- foreground: "hsl(var(--accent-foreground))",
- },
- popover: {
- DEFAULT: "hsl(var(--popover))",
- foreground: "hsl(var(--popover-foreground))",
- },
- card: {
- DEFAULT: "hsl(var(--card))",
- foreground: "hsl(var(--card-foreground))",
- },
- },
- borderRadius: {
- lg: "var(--radius)",
- md: "calc(var(--radius) - 2px)",
- sm: "calc(var(--radius) - 4px)",
- },
- keyframes: {
- "accordion-down": {
- from: { height: "0" },
- to: { height: "var(--radix-accordion-content-height)" },
- },
- "accordion-up": {
- from: { height: "var(--radix-accordion-content-height)" },
- to: { height: "0" },
- },
- },
- animation: {
- "accordion-down": "accordion-down 0.2s ease-out",
- "accordion-up": "accordion-up 0.2s ease-out",
- },
- },
+ container: {
+ center: true,
+ padding: '2rem',
+ screens: {
+ '2xl': '1400px'
+ }
+ },
+ extend: {
+ colors: {
+ border: 'hsl(var(--border))',
+ input: 'hsl(var(--input))',
+ ring: 'hsl(var(--ring))',
+ background: 'hsl(var(--background))',
+ foreground: 'hsl(var(--foreground))',
+ primary: {
+ DEFAULT: 'hsl(var(--primary))',
+ foreground: 'hsl(var(--primary-foreground))'
+ },
+ secondary: {
+ DEFAULT: 'hsl(var(--secondary))',
+ foreground: 'hsl(var(--secondary-foreground))'
+ },
+ destructive: {
+ DEFAULT: 'hsl(var(--destructive))',
+ foreground: 'hsl(var(--destructive-foreground))'
+ },
+ muted: {
+ DEFAULT: 'hsl(var(--muted))',
+ foreground: 'hsl(var(--muted-foreground))'
+ },
+ accent: {
+ DEFAULT: 'hsl(var(--accent))',
+ foreground: 'hsl(var(--accent-foreground))'
+ },
+ popover: {
+ DEFAULT: 'hsl(var(--popover))',
+ foreground: 'hsl(var(--popover-foreground))'
+ },
+ card: {
+ DEFAULT: 'hsl(var(--card))',
+ foreground: 'hsl(var(--card-foreground))'
+ },
+ chart: {
+ '1': 'hsl(var(--chart-1))',
+ '2': 'hsl(var(--chart-2))',
+ '3': 'hsl(var(--chart-3))',
+ '4': 'hsl(var(--chart-4))',
+ '5': 'hsl(var(--chart-5))'
+ }
+ },
+ borderRadius: {
+ lg: 'var(--radius)',
+ md: 'calc(var(--radius) - 2px)',
+ sm: 'calc(var(--radius) - 4px)'
+ },
+ keyframes: {
+ 'accordion-down': {
+ from: {
+ height: '0'
+ },
+ to: {
+ height: 'var(--radix-accordion-content-height)'
+ }
+ },
+ 'accordion-up': {
+ from: {
+ height: 'var(--radix-accordion-content-height)'
+ },
+ to: {
+ height: '0'
+ }
+ },
+ 'accordion-down': {
+ from: {
+ height: '0'
+ },
+ to: {
+ height: 'var(--radix-accordion-content-height)'
+ }
+ },
+ 'accordion-up': {
+ from: {
+ height: 'var(--radix-accordion-content-height)'
+ },
+ to: {
+ height: '0'
+ }
+ }
+ },
+ animation: {
+ 'accordion-down': 'accordion-down 0.2s ease-out',
+ 'accordion-up': 'accordion-up 0.2s ease-out',
+ 'accordion-down': 'accordion-down 0.2s ease-out',
+ 'accordion-up': 'accordion-up 0.2s ease-out'
+ }
+ }
},
- plugins: [],
+ plugins: [require("tailwindcss-animate")],
}
\ No newline at end of file
diff --git a/crop-x/tsconfig.json b/crop-x/tsconfig.json
index 35ee6b1..b35a22e 100644
--- a/crop-x/tsconfig.json
+++ b/crop-x/tsconfig.json
@@ -36,5 +36,10 @@
}
},
"include": ["src"],
- "references": [{ "path": "./tsconfig.node.json" }]
+ "references": [{ "path": "./tsconfig.node.json" }],
+ "paths": {
+ "@/*": [
+ "./src/*"
+ ]
+ }
}
\ No newline at end of file
diff --git a/crop-x/vite.config.ts b/crop-x/vite.config.ts
index 16d3387..c2fd01c 100644
--- a/crop-x/vite.config.ts
+++ b/crop-x/vite.config.ts
@@ -1,10 +1,10 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'
import path from 'path'
-
+import tailwindcss from "@tailwindcss/vite"
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [react()],
+ plugins: [react(), tailwindcss()],
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
diff --git a/docs/Pages目录结构与开发规范.md b/docs/Pages目录结构与开发规范.md
index 5f31f95..d904479 100644
--- a/docs/Pages目录结构与开发规范.md
+++ b/docs/Pages目录结构与开发规范.md
@@ -1,35 +1,82 @@
-# Pages目录结构与开发规范
+# Next.js App Router 开发规范
## 1. 目录结构规范
-### 1.1 页面目录标准结构
+### 1.1 Next.js App Router 标准结构
-每个页面目录采用以下标准结构:
+基于 Next.js 14 App Router 的文件系统路由,每个页面目录采用以下标准结构:
```
-pages/ModuleName/SubModuleName/
-├── 📄 index.jsx # 页面主组件
-├── 📂 components/ # 页面子组件目录
-│ ├── 📂 Component1/ # 子组件1(拆分的大组件)
-│ │ ├── 📄 index.jsx # 子组件主文件
-│ │ ├── 📄 Component1.jsx # 子组件实现
-│ │ ├── 📄 index.css # 子组件样式
-│ │ └── 📄 types.ts # 子组件类型定义
-│ ├── 📂 Component2/ # 子组件2
-│ │ └── ...
-│ └── 📂 common/ # 页面通用组件
-│ ├── 📄 Header.jsx
-│ ├── 📄 Footer.jsx
-│ └── ...
-├── 📄 index.css # 页面主样式文件
-├── 📄 index.types.ts # 页面类型定义
-├── 📄 hooks/ # 页面专用Hooks
-│ ├── 📄 usePageData.tsx
-│ └── 📄 usePageActions.tsx
-├── 📄 utils/ # 页面专用工具函数
-│ ├── 📄 pageHelpers.tsx
-│ └── 📄 formatters.tsx
-└── 📄 constants.tsx # 页面常量定义
+src/app/ModuleName/
+├── 📄 page.tsx # 页面主组件(服务端组件)
+├── 📄 layout.tsx # 模块专属布局
+├── 📄 loading.tsx # 加载状态组件
+├── 📄 error.tsx # 错误边界组件
+├── 📄 not-found.tsx # 404页面组件
+├── 📂 SubModuleName/ # 子模块目录
+│ ├── 📄 page.tsx # 子模块页面
+│ └── 📂 [id]/ # 动态路由
+│ └── 📄 page.tsx # 动态参数页面
+├── 📂 components/ # 页面专用组件
+│ ├── 📂 Component1/ # 子组件1
+│ │ ├── 📄 index.tsx # 子组件实现
+│ │ ├── 📄 index.module.css # 组件样式(CSS Modules)
+│ │ └── 📄 types.ts # 类型定义
+│ └── 📂 common/ # 通用组件
+│ ├── 📄 PageHeader.tsx
+│ └── 📄 LoadingSpinner.tsx
+├── 📂 lib/ # 页面专用工具和逻辑
+│ ├── 📄 actions.ts # 服务端操作
+│ ├── 📄 hooks/ # 客户端Hooks
+│ │ ├── 📄 usePageData.tsx
+│ │ └── 📄 usePageActions.tsx
+│ ├── 📄 utils.tsx # 工具函数
+│ └── 📄 constants.tsx # 常量定义
+└── 📄 types.ts # 页面类型定义
+```
+
+### 1.2 动态路由结构
+
+#### 1.2.1 基础动态路由
+```
+src/app/machinery/archive/[id]/
+├── 📄 page.tsx # 详情页面 /machinery/archive/[id]
+├── 📄 loading.tsx # 加载状态
+├── 📄 error.tsx # 错误处理
+└── 📂 components/
+ ├── 📄 MachineryDetail.tsx
+ └── 📄 RelatedInfo.tsx
+```
+
+#### 1.2.2 嵌套动态路由
+```
+src/app/config/tenant/[enterpriseId]/
+├── 📄 page.tsx # 企业详情页
+├── 📂 edit/ # 编辑功能
+│ └── 📄 page.tsx # /config/tenant/[enterpriseId]/edit
+├── 📂 users/ # 用户管理
+│ ├── 📄 page.tsx # 用户列表
+│ └── 📂 [userId]/ # 用户详情
+│ └── 📄 page.tsx # /config/tenant/[enterpriseId]/users/[userId]
+```
+
+#### 1.2.3 路由组结构
+```
+src/app/
+├── 📂 (auth)/ # 认证路由组(不显示在URL中)
+│ ├── 📄 layout.tsx # 认证布局
+│ ├── 📂 login/
+│ │ └── 📄 page.tsx # /login
+│ └── 📂 register/
+│ └── 📄 page.tsx # /register
+├── 📂 (dashboard)/ # 仪表板路由组
+│ ├── 📄 layout.tsx # 仪表板布局
+│ ├── 📂 machinery/ # 农机管理
+│ ├── 📂 field/ # 地块管理
+│ └── 📂 config/ # 配置管理
+└── 📂 api/ # API路由
+ └── 📂 machinery/
+ └── 📄 route.ts # /api/machinery
```
### 1.2 组件拆分原则
@@ -45,152 +92,800 @@ pages/ModuleName/SubModuleName/
- 子组件:基于功能命名(如:MachineryList、MachineryForm、MachineryFilter)
- 通用组件:基于用途命名(如:TableHeader、FormActions)
-## 2. 开发规范
+## 2. Next.js 开发规范
-### 2.1 组件开发规范
+### 2.1 页面组件开发规范
-#### 2.1.1 主组件规范
+#### 2.1.1 服务端组件规范(推荐)
-```jsx
-// pages/AgriculturalMachinery/Archive/MachineryEntry/index.jsx
-import { useState, useEffect, useCallback } from 'react';
-import { MachineryList } from './components/MachineryList';
-import { MachineryForm } from './components/MachineryForm';
-import { MachineryFilter } from './components/MachineryFilter';
-import { useMachineryData } from './hooks/usePageData';
-import { useMachineryActions } from './hooks/usePageActions';
-import './index.css';
+```typescript
+// src/app/machinery/archive/entry/page.tsx
+import { Suspense } from 'react';
+import { getMachineryList } from '@/lib/services/api/machineryApi';
+import { MachineryListClient } from './components/MachineryListClient';
+import { MachineryPageHeader } from '@/components/layout/MachineryPageHeader';
+import { MachineryFilters } from './components/MachineryFilters';
+import { LoadingSkeleton } from '@/components/ui/loading-skeleton';
+
+export default async function MachineryArchivePage({
+ searchParams,
+}: {
+ searchParams?: { [key: string]: string | string[] | undefined };
+}) {
+ // 服务端数据获取
+ const initialData = await getMachineryList(searchParams);
+
+ return (
+
+
+
+
+
+ }>
+
+
+
+ );
+}
+
+// 元数据配置
+export async function generateMetadata() {
+ return {
+ title: '农机档案管理 - 智慧农业系统',
+ description: '管理农机档案信息,包括录入、编辑、删除等功能',
+ };
+}
+
+// 静态生成参数(可选)
+export async function generateStaticParams() {
+ return [
+ { category: 'tractor' },
+ { category: 'harvester' },
+ { category: 'seeder' },
+ ];
+}
+```
+
+#### 2.1.2 客户端组件规范
+
+```typescript
+// src/app/machinery/archive/entry/components/MachineryListClient.tsx
+'use client';
+
+import { useState, useCallback } from 'react';
+import { useMachineryStore } from '@/lib/stores/machineryStore';
+import { MachineryGrid } from '@/components/business/machinery/MachineryGrid';
+import { MachineryTable } from '@/components/business/machinery/MachineryTable';
+import { CreateMachineryModal } from '@/components/business/machinery/CreateMachineryModal';
+
+interface Props {
+ initialData: MachineryResponse;
+}
+
+export function MachineryListClient({ initialData }: Props) {
+ const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);
+ const [viewMode, setViewMode] = useState<'grid' | 'table'>('grid');
-export function MachineryEntry() {
const {
machinery,
loading,
- error,
filters,
- pagination,
- handleFilterChange,
- handlePageChange,
- refreshData
- } = useMachineryData();
+ updateMachinery,
+ deleteMachinery,
+ refetch,
+ } = useMachineryStore();
- const {
- handleCreate,
- handleEdit,
- handleDelete,
- handleBatchDelete,
- handleExport
- } = useMachineryActions(refreshData);
+ const handleCreate = useCallback(async (data: CreateMachineryDto) => {
+ await updateMachinery(data);
+ setIsCreateModalOpen(false);
+ refetch();
+ }, [updateMachinery, refetch]);
+
+ const handleEdit = useCallback(async (id: string, data: UpdateMachineryDto) => {
+ await updateMachinery({ ...data, id });
+ refetch();
+ }, [updateMachinery, refetch]);
+
+ const handleDelete = useCallback(async (id: string) => {
+ await deleteMachinery(id);
+ refetch();
+ }, [deleteMachinery, refetch]);
return (
-
-
-
农机档案管理
-
-
-
+
+
+
+
+
+
+
-
+ {loading ? (
+
+ ) : viewMode === 'grid' ? (
+
+ ) : (
+
+ )}
-
setIsCreateModalOpen(false)}
+ onSave={handleCreate}
/>
+
+ );
+}
+### 2.2 动态路由开发规范
-
+#### 2.2.1 动态参数处理
+
+```typescript
+// src/app/machinery/archive/[id]/page.tsx
+import { notFound } from 'next/navigation';
+import { Metadata } from 'next';
+import { getMachineryById } from '@/lib/services/api/machineryApi';
+import { MachineryDetailPage } from '@/components/pages/machinery/MachineryDetailPage';
+
+interface Props {
+ params: { id: string };
+ searchParams: { [key: string]: string | string[] | undefined };
+}
+
+// 生成页面元数据
+export async function generateMetadata({ params }: Props): Promise
{
+ try {
+ const machinery = await getMachineryById(params.id);
+ return {
+ title: `${machinery.name} - 农机详情`,
+ description: `查看农机 ${machinery.name} 的详细信息`,
+ };
+ } catch {
+ return {
+ title: '农机详情 - 未找到',
+ };
+ }
+}
+
+// 服务端组件 - 获取数据并渲染
+export default async function MachineryDetail({ params }: Props) {
+ const machinery = await getMachineryById(params.id);
+
+ if (!machinery) {
+ notFound();
+ }
+
+ return (
+
+
+
+ );
+}
+
+// 静态生成常用农机详情页(提升性能)
+export async function generateStaticParams() {
+ // 这里可以预生成一些常用的农机详情页
+ // 实际项目中可以从数据库获取
+ return [
+ { id: 'machinery-001' },
+ { id: 'machinery-002' },
+ { id: 'machinery-003' },
+ ];
+}
+```
+
+#### 2.2.2 布局组件规范
+
+```typescript
+// src/app/machinery/layout.tsx
+import { ReactNode } from 'react';
+import { MachinerySidebar } from '@/components/layout/MachinerySidebar';
+import { MachineryBreadcrumb } from '@/components/navigation/MachineryBreadcrumb';
+
+export default function MachineryLayout({
+ children,
+}: {
+ children: ReactNode;
+}) {
+ return (
+
+ {/* 农机模块侧边栏 */}
+
+
+
+
+ {/* 主内容区域 */}
+
+ {/* 面包屑导航 */}
+
+
+
+
+ {/* 页面内容 */}
+
+ {children}
+
+
);
}
```
-#### 2.1.2 子组件规范
+#### 2.2.3 加载和错误状态
-```jsx
-// pages/AgriculturalMachinery/Archive/MachineryEntry/components/MachineryList/index.jsx
-import { memo } from 'react';
-import { MachineryTable } from './MachineryTable';
-import { TableActions } from './TableActions';
-import { useMachineryList } from '../hooks/usePageData';
-import { MachineryRecord } from '../types';
-import './index.css';
-
-interface MachineryListProps {
- machinery: MachineryRecord[];
- loading: boolean;
- error: string | null;
- pagination: {
- current: number;
- pageSize: number;
- total: number;
- };
- onPageChange: (page: number) => void;
- onEdit: (record: MachineryRecord) => void;
- onDelete: (id: string) => void;
- onBatchDelete: (ids: string[]) => void;
-}
-
-export const MachineryList = memo(({
- machinery,
- loading,
- error,
- pagination,
- onPageChange,
- onEdit,
- onDelete,
- onBatchDelete
-}) => {
- const {
- selectedRows,
- handleRowSelection,
- handleSelectAll,
- handleBatchActions
- } = useMachineryList(machinery);
-
- if (error) {
- return (
-
-
加载失败:{error}
-
-
- );
- }
+```typescript
+// src/app/machinery/loading.tsx
+import { LoadingSkeleton } from '@/components/ui/loading-skeleton';
+export default function MachineryLoading() {
return (
-
-
onPageChange(pagination.current)}
- />
-
-
+
+
+
+
+ {[...Array(6)].map((_, i) => (
+
+ ))}
+
+
);
+}
+
+// src/app/machinery/error.tsx
+'use client';
+
+import { useEffect } from 'react';
+import { Button } from '@/components/ui/button';
+import { AlertTriangle } from 'lucide-react';
+
+export default function Error({
+ error,
+ reset,
+}: {
+ error: Error;
+ reset: () => void;
+}) {
+ useEffect(() => {
+ console.error('农机模块错误:', error);
+ }, [error]);
+
+ return (
+
+
+
+
页面加载失败
+
+ {error.message || '加载农机模块时发生了错误,请稍后重试。'}
+
+
+
+
+ );
+}
+```
+
+### 2.3 服务端操作规范
+
+#### 2.3.1 Server Actions
+
+```typescript
+// src/lib/actions/machinery.ts
+'use server';
+
+import { revalidatePath } from 'next/cache';
+import { redirect } from 'next/navigation';
+import { z } from 'zod';
+import { createMachinery, updateMachinery, deleteMachinery } from '@/lib/services/api/machineryApi';
+
+// 表单验证Schema
+const createMachinerySchema = z.object({
+ name: z.string().min(1, '农机名称不能为空'),
+ model: z.string().min(1, '型号不能为空'),
+ category: z.enum(['拖拉机', '收割机', '播种机', '植保机械']),
+ manufacturer: z.string().min(1, '制造商不能为空'),
});
-MachineryList.displayName = 'MachineryList';
+export async function createMachineryAction(formData: FormData) {
+ try {
+ // 验证表单数据
+ const validatedData = createMachinerySchema.parse({
+ name: formData.get('name'),
+ model: formData.get('model'),
+ category: formData.get('category'),
+ manufacturer: formData.get('manufacturer'),
+ });
+
+ // 创建农机
+ await createMachinery(validatedData);
+
+ // 重新验证缓存
+ revalidatePath('/machinery/archive');
+ revalidatePath('/machinery');
+
+ return { success: true, message: '农机创建成功' };
+ } catch (error) {
+ if (error instanceof z.ZodError) {
+ return { success: false, message: error.errors[0].message };
+ }
+ return { success: false, message: '创建失败,请重试' };
+ }
+}
+
+export async function updateMachineryAction(id: string, formData: FormData) {
+ try {
+ const validatedData = createMachinerySchema.parse({
+ name: formData.get('name'),
+ model: formData.get('model'),
+ category: formData.get('category'),
+ manufacturer: formData.get('manufacturer'),
+ });
+
+ await updateMachinery(id, validatedData);
+ revalidatePath('/machinery/archive');
+ revalidatePath(`/machinery/archive/${id}`);
+
+ return { success: true, message: '农机更新成功' };
+ } catch (error) {
+ if (error instanceof z.ZodError) {
+ return { success: false, message: error.errors[0].message };
+ }
+ return { success: false, message: '更新失败,请重试' };
+ }
+}
+
+export async function deleteMachineryAction(id: string) {
+ try {
+ await deleteMachinery(id);
+ revalidatePath('/machinery/archive');
+ redirect('/machinery/archive');
+ } catch (error) {
+ throw new Error('删除农机失败');
+ }
+}
+### 2.4 Next.js API 路由规范
+
+#### 2.4.1 API 路由结构
+
+```typescript
+// src/app/api/machinery/route.ts - 农机API路由
+import { NextRequest, NextResponse } from 'next/server';
+import { getMachineryList, createMachinery } from '@/lib/services/machineryService';
+import { machinerySchema } from '@/lib/validations/machinery';
+
+// GET - 获取农机列表
+export async function GET(request: NextRequest) {
+ try {
+ const { searchParams } = new URL(request.url);
+
+ // 解析查询参数
+ const filters = {
+ page: parseInt(searchParams.get('page') || '1'),
+ limit: parseInt(searchParams.get('limit') || '10'),
+ category: searchParams.get('category'),
+ status: searchParams.get('status'),
+ };
+
+ const data = await getMachineryList(filters);
+
+ return NextResponse.json({
+ success: true,
+ data,
+ message: '获取农机列表成功'
+ });
+ } catch (error) {
+ console.error('获取农机列表失败:', error);
+ return NextResponse.json(
+ {
+ success: false,
+ message: '获取农机列表失败'
+ },
+ { status: 500 }
+ );
+ }
+}
+
+// POST - 创建农机
+export async function POST(request: NextRequest) {
+ try {
+ const body = await request.json();
+
+ // 验证数据
+ const validatedData = machinerySchema.parse(body);
+
+ const machinery = await createMachinery(validatedData);
+
+ return NextResponse.json({
+ success: true,
+ data: machinery,
+ message: '创建农机成功'
+ }, { status: 201 });
+ } catch (error) {
+ if (error.name === 'ZodError') {
+ return NextResponse.json({
+ success: false,
+ message: '数据验证失败',
+ errors: error.errors
+ }, { status: 400 });
+ }
+
+ console.error('创建农机失败:', error);
+ return NextResponse.json({
+ success: false,
+ message: '创建农机失败'
+ }, { status: 500 });
+ }
+}
+```
+
+#### 2.4.2 动态API路由
+
+```typescript
+// src/app/api/machinery/[id]/route.ts - 农机详情API
+import { NextRequest, NextResponse } from 'next/server';
+import { getMachineryById, updateMachinery, deleteMachinery } from '@/lib/services/machineryService';
+
+interface Context {
+ params: { id: string };
+}
+
+// GET - 获取农机详情
+export async function GET(request: NextRequest, context: Context) {
+ try {
+ const { id } = context.params;
+ const machinery = await getMachineryById(id);
+
+ if (!machinery) {
+ return NextResponse.json({
+ success: false,
+ message: '农机不存在'
+ }, { status: 404 });
+ }
+
+ return NextResponse.json({
+ success: true,
+ data: machinery
+ });
+ } catch (error) {
+ console.error('获取农机详情失败:', error);
+ return NextResponse.json({
+ success: false,
+ message: '获取农机详情失败'
+ }, { status: 500 });
+ }
+}
+
+// PUT - 更新农机
+export async function PUT(request: NextRequest, context: Context) {
+ try {
+ const { id } = context.params;
+ const body = await request.json();
+
+ const validatedData = machinerySchema.partial().parse(body);
+ const machinery = await updateMachinery(id, validatedData);
+
+ return NextResponse.json({
+ success: true,
+ data: machinery,
+ message: '更新农机成功'
+ });
+ } catch (error) {
+ if (error.name === 'ZodError') {
+ return NextResponse.json({
+ success: false,
+ message: '数据验证失败',
+ errors: error.errors
+ }, { status: 400 });
+ }
+
+ console.error('更新农机失败:', error);
+ return NextResponse.json({
+ success: false,
+ message: '更新农机失败'
+ }, { status: 500 });
+ }
+}
+
+// DELETE - 删除农机
+export async function DELETE(request: NextRequest, context: Context) {
+ try {
+ const { id } = context.params;
+ await deleteMachinery(id);
+
+ return NextResponse.json({
+ success: true,
+ message: '删除农机成功'
+ });
+ } catch (error) {
+ console.error('删除农机失败:', error);
+ return NextResponse.json({
+ success: false,
+ message: '删除农机失败'
+ }, { status: 500 });
+ }
+}
+```
+
+### 2.5 路由中间件规范
+
+#### 2.5.1 认证中间件
+
+```typescript
+// middleware.ts
+import { NextResponse } from 'next/server';
+import type { NextRequest } from 'next/server';
+import { getToken } from 'next-auth/jwt';
+
+// 需要认证的路由
+const protectedRoutes = [
+ '/machinery',
+ '/field',
+ '/operation',
+ '/asset',
+ '/ai-model',
+ '/irrigation',
+ '/config'
+];
+
+// 公开路由
+const publicRoutes = [
+ '/',
+ '/login',
+ '/register',
+ '/api/auth'
+];
+
+export async function middleware(request: NextRequest) {
+ const { pathname } = request.nextUrl;
+ const token = await getToken({
+ req: request,
+ secret: process.env.NEXTAUTH_SECRET
+ });
+
+ // 检查是否访问需要认证的路由
+ const isProtectedRoute = protectedRoutes.some(route =>
+ pathname.startsWith(route)
+ );
+
+ // 检查是否访问公开路由
+ const isPublicRoute = publicRoutes.some(route =>
+ pathname.startsWith(route)
+ );
+
+ // API路由处理
+ if (pathname.startsWith('/api/')) {
+ // 认证相关API允许访问
+ if (pathname.startsWith('/api/auth/')) {
+ return NextResponse.next();
+ }
+
+ // 其他API需要认证
+ if (!token) {
+ return NextResponse.json(
+ { error: '未授权访问' },
+ { status: 401 }
+ );
+ }
+
+ // 添加用户信息到请求头
+ const requestHeaders = new Headers(request.headers);
+ requestHeaders.set('user-id', token.sub as string);
+
+ return NextResponse.next({
+ request: {
+ headers: requestHeaders,
+ },
+ });
+ }
+
+ // 未登录用户访问受保护路由
+ if (isProtectedRoute && !token) {
+ const loginUrl = new URL('/login', request.url);
+ loginUrl.searchParams.set('callbackUrl', pathname);
+ return NextResponse.redirect(loginUrl);
+ }
+
+ // 已登录用户访问登录页
+ if (token && (pathname === '/login' || pathname === '/register')) {
+ return NextResponse.redirect(new URL('/machinery', request.url));
+ }
+
+ return NextResponse.next();
+}
+
+// 中间件匹配配置
+export const config = {
+ matcher: [
+ /*
+ * 匹配所有路径除了:
+ * - _next/static (静态文件)
+ * - _next/image (图片优化)
+ * - favicon.ico (favicon文件)
+ * - public文件夹中的文件
+ */
+ '/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)',
+ ],
+};
+```
+
+### 2.6 路由性能优化规范
+
+#### 2.6.1 数据获取优化
+
+```typescript
+// src/lib/services/api/machineryApi.ts
+import { cache } from 'react';
+
+// 使用cache缓存数据获取
+export const getMachineryById = cache(async (id: string) => {
+ const res = await fetch(`${process.env.API_BASE_URL}/machinery/${id}`, {
+ next: {
+ tags: [`machinery-${id}`], // 缓存标签
+ revalidate: 300, // 5分钟重新验证
+ },
+ });
+
+ if (!res.ok) {
+ throw new Error('Failed to fetch machinery');
+ }
+
+ return res.json();
+});
+
+export const getMachineryList = cache(async (params?: any) => {
+ const searchParams = new URLSearchParams(params);
+ const res = await fetch(`${process.env.API_BASE_URL}/machinery?${searchParams}`, {
+ next: {
+ tags: ['machinery-list'], // 缓存标签
+ revalidate: 60, // 1分钟重新验证
+ },
+ });
+
+ if (!res.ok) {
+ throw new Error('Failed to fetch machinery list');
+ }
+
+ return res.json();
+});
+
+// 数据重新验证
+export async function revalidateMachineryCache(id?: string) {
+ const { revalidateTag } = await import('next/cache');
+
+ if (id) {
+ revalidateTag(`machinery-${id}`);
+ } else {
+ revalidateTag('machinery-list');
+ }
+}
+```
+
+#### 2.6.2 静态生成和增量静态生成
+
+```typescript
+// src/app/machinery/archive/page.tsx
+import { getMachineryCategories } from '@/lib/services/api/machineryApi';
+
+// 增量静态生成(ISR)
+export async function generateStaticParams() {
+ try {
+ const categories = await getMachineryCategories();
+
+ return categories.map((category) => ({
+ category: category.name,
+ }));
+ } catch {
+ // 如果获取失败,返回空数组
+ return [];
+ }
+}
+
+// 设置页面为静态生成
+export const dynamic = 'force-static';
+export const revalidate = 3600; // 1小时重新生成
+```
+
+### 2.7 类型定义规范
+
+#### 2.7.1 Next.js 路由类型
+
+```typescript
+// src/types/nextjs.ts
+import { Metadata, ResolvingMetadata } from 'next';
+
+// 页面Props类型
+export interface PageProps {
+ params: Record;
+ searchParams: Record;
+}
+
+// 动态路由Props类型
+export interface DynamicPageProps = Record> {
+ params: T;
+ searchParams: Record;
+}
+
+// 布局Props类型
+export interface LayoutProps {
+ children: React.ReactNode;
+ params?: Record;
+}
+
+// 元数据生成函数类型
+export type MetadataGenerator = (props: PageProps) => Promise;
+
+// 服务端组件类型
+export type ServerComponent = (props: P) => Promise;
+
+// 客户端组件类型
+export type ClientComponent = (props: P) => React.ReactElement;
+```
+
+#### 2.7.2 API 响应类型
+
+```typescript
+// src/types/api.ts
+export interface ApiResponse {
+ success: boolean;
+ data?: T;
+ message: string;
+ errors?: any[];
+}
+
+export interface PaginatedResponse {
+ items: T[];
+ total: number;
+ page: number;
+ pageSize: number;
+ totalPages: number;
+}
+
+export interface ApiError {
+ success: false;
+ message: string;
+ code?: string;
+ details?: any;
+}
```
### 2.2 类型定义规范
diff --git a/docs/stories/story-1-9-三级菜单实现.md b/docs/stories/story-1-9-三级菜单实现.md
new file mode 100644
index 0000000..1cf2bf7
--- /dev/null
+++ b/docs/stories/story-1-9-三级菜单实现.md
@@ -0,0 +1,135 @@
+# 用户故事:多级菜单布局系统重构
+
+## 故事标题
+**多级菜单布局系统重构 - Brownfield Addition**
+
+## 用户故事
+作为系统用户,
+我需要一个新的多级菜单布局系统,
+以便更好地组织和访问系统的各个功能模块。
+
+## 故事上下文
+
+### 现有系统集成
+- **集成与**: 现有 `Navigation.tsx` 和 `Sidebar.tsx` 组件
+- **技术**: React + TypeScript + Tailwind CSS
+- **遵循模式**: 现有 shadcn/ui 组件库和项目架构
+- **接触点**: `src/App.tsx`, 路由系统, 菜单配置
+
+## 验收标准
+
+### 功能需求
+
+#### 1. 顶部菜单栏 (占15%视口高度)
+- **左侧**: Logo + "智慧农业生产管理系统"标题
+ - 显示绿色拖拉机图标和系统名称
+ - 包含英文副标题 "Smart Agriculture Management System"
+- **中间**: 7大子系统菜单项与图标
+ - 智能农机管理系统 (Tractor图标)
+ - 地块信息管理系统 (Map图标)
+ - 农事操作管理系统 (Clipboard图标)
+ - 农业资产管理系统 (Package图标)
+ - AI作物模型精准决策系统 (Brain图标)
+ - 水肥一体化控制系统 (Droplets图标)
+ - 中心配置管理系统 (Settings图标)
+- **右侧**: 用户功能区域
+ - 消息铃铛图标(显示未读消息数量)
+ - 系统管理员用户信息(头像+用户名)
+ - 用户下拉菜单(个人中心、退出登录等选项)
+
+#### 2. 左侧二级菜单
+- 根据选中的一级菜单动态显示对应的二级菜单项
+- 支持多级展开/折叠功能
+- 当前选中页面高亮显示(绿色背景)
+- 菜单项层次清晰,缩进合理
+
+#### 3. 右侧内容区域
+- 根据路由对应显示具体页面内容
+- 无路由对应时显示空页面状态
+- 内容区域自适应高度和宽度
+- 保持现有页面组件的功能不变
+
+### 集成需求
+4. **现有导航功能继续正常工作**: 保持与 `src/App.tsx` 中现有路由逻辑的兼容性
+5. **新布局遵循现有的设计模式和样式**: 使用 shadcn/ui 组件库,保持绿色主题
+6. **与现有认证系统和路由系统无缝集成**: 保持 `AuthContext` 和路径状态管理
+
+### 质量需求
+7. **响应式设计**: 适配不同屏幕尺寸(桌面、平板、移动端)
+8. **保持现有功能不回退**: 所有现有页面和功能必须正常工作
+9. **代码符合现有项目规范**: 遵循 TypeScript 严格模式,使用现有工具函数
+
+## 技术说明
+
+### 集成方法
+- **目录结构**: 在 `src/components/layouts/` 目录创建新的布局组件系统
+- **文件组织**:
+ - `MainLayout.tsx` - 主布局容器
+ - `TopNavigation.tsx` - 顶部导航栏
+ - `SideNavigation.tsx` - 侧边栏导航
+ - `ContentArea.tsx` - 内容区域组件
+
+### 现有模式参考
+- **组件样式**: 参考现有的 `Navigation.tsx` 实现模式
+- **菜单数据处理**: 保持与 `types/navigation.ts` 中菜单结构的一致性
+- **状态管理**: 使用现有的 `useState` 和路径状态管理模式
+- **UI组件**: 使用现有的 shadcn/ui 组件(Button, Popover, Badge等)
+
+### 关键约束
+- **保持现有菜单结构**: 7个子系统的菜单配置和层级结构不能改变
+- **保持路由逻辑**: 现有的路径导航和页面渲染逻辑必须保持兼容
+- **保持认证集成**: 用户认证状态和权限控制逻辑保持不变
+- **保持主题风格**: 绿色主题和整体视觉风格保持一致
+
+## 风险和兼容性检查
+
+### 最小风险评估
+- **主要风险**: 布局重构可能影响现有页面的显示和交互
+- **缓解措施**: 渐进式重构,保持现有组件接口不变
+- **回滚方案**: 可快速回退到现有的 Navigation + Sidebar 布局
+
+### 兼容性验证
+- [x] 无对现有API的破坏性更改
+- [x] 无数据库变更(纯前端重构)
+- [x] UI更改遵循现有设计模式
+- [x] 对性能的影响可忽略不计
+
+## 验证清单
+
+### 范围验证
+- [x] 故事可在一次开发会话内完成(预计2-4小时)
+- [x] 集成方法直接明了
+- [x] 完全遵循现有模式
+- [x] 无需设计或架构工作
+
+### 清晰度检查
+- [x] 故事要求明确无误
+- [x] 集成点明确指定
+- [x] 成功标准可测试
+- [x] 回滚计划简单
+
+## 完成标准
+
+- [ ] 顶部菜单栏正确显示,占15%视口高度
+- [ ] 7大子系统菜单项正确显示并可点击
+- [ ] 消息铃铛和用户下拉菜单功能正常
+- [ ] 左侧二级菜单根据一级菜单选择动态更新
+- [ ] 右侧内容区域正确显示对应页面内容
+- [ ] 响应式设计在不同屏幕尺寸下正常工作
+- [ ] 现有功能回归测试通过
+- [ ] 代码遵循现有模式和标准
+- [ ] 与现有认证系统正常集成
+- [ ] 无浏览器控制台错误或警告
+
+## 重要的注意事项
+
+- 这个故事主要涉及UI结构调整,不需要复杂的后端集成
+- 重构过程中应保持所有现有页面的功能和数据流
+- 重点关注用户体验的一致性和导航的流畅性
+- 如果复杂度超出预期,考虑拆分为多个较小的故事
+- 预计开发时间:2-4小时的专注开发工作
+
+---
+**故事创建时间**: 2025-10-17
+**创建人**: PM Agent (John)
+**预计工作量**: 0.5 story points (小型重构任务)
\ No newline at end of file
diff --git a/docs/项目架构设计文档.md b/docs/项目架构设计文档.md
index 4d01e02..08125a4 100644
--- a/docs/项目架构设计文档.md
+++ b/docs/项目架构设计文档.md
@@ -218,7 +218,9 @@ interface User {
- ✅ React Hook Form + Zod
#### 新增核心技术
-- 🆕 **React Router v6**: 专业路由管理
+- 🆕 **Next.js 14**: 现代化 React 全栈框架,支持动态路由和SSR
+- 🆕 **Next.js App Router**: 基于文件系统的动态路由
+- 🆕 **React Server Components**: 服务端组件渲染优化
- 🆕 **Zustand**: 轻量级状态管理
- 🆕 **TanStack Query**: 服务端状态管理
- 🆕 **MSW**: Mock Service Worker
@@ -231,8 +233,48 @@ interface User {
crop-x/
├── public/ # 静态资源
│ ├── favicon.ico
-│ └── index.html
+│ └── next-env.d.ts # Next.js 类型声明
├── src/
+│ ├── app/ # Next.js App Router 目录
+│ │ ├── layout.tsx # 根布局
+│ │ ├── page.tsx # 首页
+│ │ ├── globals.css # 全局样式
+│ │ ├── (auth)/ # 认证相关路由组
+│ │ │ ├── login/
+│ │ │ │ └── page.tsx
+│ │ │ └── register/
+│ │ │ └── page.tsx
+│ │ ├── machinery/ # 农机管理动态路由
+│ │ │ ├── layout.tsx # 农机模块布局
+│ │ │ ├── page.tsx # 农机默认页面
+│ │ │ ├── archive/
+│ │ │ │ ├── entry/
+│ │ │ │ │ └── page.tsx
+│ │ │ │ └── [id]/
+│ │ │ │ └── page.tsx # 动态路由详情页
+│ │ │ ├── driver/
+│ │ │ │ └── page.tsx
+│ │ │ └── monitoring/
+│ │ │ └── realtime/
+│ │ │ └── page.tsx
+│ │ ├── field/ # 地块管理动态路由
+│ │ │ ├── layout.tsx
+│ │ │ ├── page.tsx
+│ │ │ └── [category]/
+│ │ │ └── page.tsx
+│ │ ├── operation/ # 农事操作动态路由
+│ │ ├── asset/ # 资产管理动态路由
+│ │ ├── ai-model/ # AI模型动态路由
+│ │ ├── irrigation/ # 灌溉控制动态路由
+│ │ ├── config/ # 配置管理动态路由
+│ │ │ ├── layout.tsx
+│ │ │ ├── page.tsx
+│ │ │ └── tenant/
+│ │ │ ├── enterprise-audit/
+│ │ │ │ └── page.tsx
+│ │ │ └── [enterpriseId]/
+│ │ │ └── page.tsx # 企业详情动态路由
+│ │ └── loading.tsx # 全局加载组件
│ ├── components/ # 可复用组件
│ │ ├── ui/ # shadcn/ui 基础组件
│ │ │ ├── button/
@@ -247,178 +289,307 @@ crop-x/
│ │ ├── Header/
│ │ ├── Sidebar/
│ │ └── Layout/
-│ ├── pages/ # 页面组件(按业务模块)
-│ │ ├── auth/ # 认证相关页面
-│ │ │ ├── LoginPage.tsx
-│ │ │ └── RegisterPage.tsx
-│ │ ├── machinery/ # 农机管理页面
-│ │ │ ├── MachineryListPage.tsx
-│ │ │ ├── MachineryDetailPage.tsx
-│ │ │ ├── DriverListPage.tsx
+│ ├── lib/ # Next.js 库目录
+│ │ ├── stores/ # Zustand 状态管理
+│ │ │ ├── authStore.ts
+│ │ │ ├── machineryStore.ts
│ │ │ └── ...
-│ │ ├── field/ # 地块管理页面
-│ │ ├── operation/ # 农事操作页面
-│ │ ├── asset/ # 资产管理页面
-│ │ ├── ai-model/ # AI模型页面
-│ │ ├── irrigation/ # 灌溉控制页面
-│ │ └── config/ # 配置管理页面
-│ ├── stores/ # Zustand 状态管理
-│ │ ├── authStore.ts # 认证状态
-│ │ ├── machineryStore.ts # 农机状态
-│ │ ├── fieldStore.ts # 地块状态
-│ │ ├── operationStore.ts # 农事状态
-│ │ ├── assetStore.ts # 资产状态
-│ │ ├── aiModelStore.ts # AI模型状态
-│ │ ├── irrigationStore.ts # 灌溉状态
-│ │ └── configStore.ts # 配置状态
-│ ├── services/ # API 服务层
-│ │ ├── api/ # API 配置和请求
-│ │ │ ├── client.ts # Axios 配置
-│ │ │ ├── machineryApi.ts
-│ │ │ ├── fieldApi.ts
-│ │ │ └── ...
-│ │ ├── mock/ # Mock 数据管理
-│ │ │ ├── handlers/ # MSW 处理器
-│ │ │ ├── data/ # Mock 数据
-│ │ │ └── browser.ts # MSW 配置
-│ │ └── types/ # API 类型定义
-│ │ ├── machinery.ts
-│ │ ├── field.ts
-│ │ └── ...
-│ ├── hooks/ # 自定义 Hooks
-│ │ ├── useAuth.ts
-│ │ ├── useMachinery.ts
-│ │ └── ...
-│ ├── utils/ # 工具函数
-│ │ ├── date.ts
-│ │ ├── format.ts
-│ │ └── ...
-│ ├── constants/ # 常量定义
-│ │ ├── routes.ts
-│ │ ├── permissions.ts
-│ │ └── ...
-│ ├── router/ # 路由配置
-│ │ ├── index.ts # 路由器配置
-│ │ ├── authRoutes.ts # 认证路由
-│ │ ├── machineryRoutes.ts # 农机路由
-│ │ └── ...
-│ ├── styles/ # 样式文件
-│ │ ├── globals.css
-│ │ └── components.css
+│ │ ├── services/ # API 服务层
+│ │ │ ├── api/ # API 配置和请求
+│ │ │ │ ├── client.ts
+│ │ │ │ ├── machineryApi.ts
+│ │ │ │ └── ...
+│ │ │ ├── mock/ # Mock 数据管理
+│ │ │ │ ├── handlers/
+│ │ │ │ ├── data/
+│ │ │ │ └── browser.ts
+│ │ │ └── types/
+│ │ │ ├── machinery.ts
+│ │ │ └── ...
+│ │ ├── hooks/ # 自定义 Hooks
+│ │ │ ├── useAuth.ts
+│ │ │ └── useMachinery.ts
+│ │ ├── utils/ # 工具函数
+│ │ │ ├── date.ts
+│ │ │ └── format.ts
+│ │ └── constants/ # 常量定义
+│ │ ├── routes.ts
+│ │ └── permissions.ts
│ ├── types/ # 全局类型定义
│ │ ├── auth.ts
│ │ ├── machinery.ts
-│ │ ├── navigation.ts
-│ │ └── ...
-│ ├── App.tsx # 根组件
-│ └── main.tsx # 应用入口
+│ │ └── navigation.ts
+│ └── styles/ # 样式文件
+│ └── globals.css
├── tests/ # 测试文件
-│ ├── __mocks__/ # 全局 Mock
-│ ├── fixtures/ # 测试数据
-│ ├── unit/ # 单元测试
-│ ├── integration/ # 集成测试
-│ └── setup.ts # 测试配置
+│ ├── __mocks__/
+│ ├── fixtures/
+│ ├── unit/
+│ ├── integration/
+│ └── setup.ts
├── docs/ # 项目文档
├── .eslintrc.js # ESLint 配置
├── .prettierrc # Prettier 配置
+├── next.config.js # Next.js 配置
├── package.json
-├── vite.config.ts
├── tsconfig.json
├── tailwind.config.js
└── README.md
```
-### 路由系统重设计
+### Next.js 动态路由系统设计
+
+#### App Router 架构
+Next.js App Router 提供了基于文件系统的路由,支持动态路由、嵌套路由和路由组。
-#### 路由架构
```typescript
-// router/index.ts
-import { createBrowserRouter, RouterProvider } from 'react-router-dom'
-import { ProtectedRoute } from '../components/ProtectedRoute'
-import { Layout } from '../components/layout/Layout'
-import { authRoutes } from './authRoutes'
-import { machineryRoutes } from './machineryRoutes'
-// ... 其他路由
+// src/app/layout.tsx - 根布局
+import { AuthProvider } from '@/lib/providers/AuthProvider'
+import { ThemeProvider } from '@/lib/providers/ThemeProvider'
+import './globals.css'
-export const router = createBrowserRouter([
- // 公开路由
- ...authRoutes,
-
- // 受保护的主路由
- {
- path: '/',
- element: (
-
-
-
- ),
- children: [
- // 7大业务系统路由
- ...machineryRoutes,
- ...fieldRoutes,
- ...operationRoutes,
- ...assetRoutes,
- ...aiModelRoutes,
- ...irrigationRoutes,
- ...configRoutes,
-
- // 默认路由
- {
- index: true,
- element:
- }
- ]
- },
-
- // 404页面
- { path: '*', element: }
-])
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+
+
+
+ {children}
+
+
+
+
+ )
+}
```
-#### 业务路由示例
+#### 动态路由示例
+
+##### 1. 农机管理模块路由结构
+```
+src/app/machinery/
+├── layout.tsx # 农机模块专属布局
+├── page.tsx # /machinery - 农机管理首页
+├── archive/
+│ ├── page.tsx # /machinery/archive - 档案管理
+│ ├── entry/
+│ │ └── page.tsx # /machinery/archive/entry - 档案录入
+│ └── [id]/
+│ └── page.tsx # /machinery/archive/[id] - 动态详情页
+├── driver/
+│ ├── page.tsx # /machinery/driver - 驾驶员管理
+│ └── [driverId]/
+│ └── page.tsx # /machinery/driver/[driverId] - 驾驶员详情
+└── monitoring/
+ └── realtime/
+ └── page.tsx # /machinery/monitoring/realtime - 实时监控
+```
+
+##### 2. 动态路由组件实现
```typescript
-// router/machineryRoutes.ts
-import { lazy } from 'react'
+// src/app/machinery/archive/[id]/page.tsx
+import { notFound } from 'next/navigation'
+import { MachineryDetailPage } from '@/components/pages/machinery/MachineryDetailPage'
+import { getMachineryById } from '@/lib/services/api/machineryApi'
-// 懒加载页面组件
-const MachineryListPage = lazy(() => import('../pages/machinery/MachineryListPage'))
-const MachineryDetailPage = lazy(() => import('../pages/machinery/MachineryDetailPage'))
-const DriverListPage = lazy(() => import('../pages/machinery/DriverListPage'))
+interface Props {
+ params: { id: string }
+}
-export const machineryRoutes = [
- {
- path: 'machinery/*',
- children: [
- // 农机档案管理
- {
- path: 'archive/entry',
- element:
- },
- {
- path: 'archive/detail/:id',
- element:
- },
+export default async function MachineryDetail({ params }: Props) {
+ const machinery = await getMachineryById(params.id)
- // 驾驶员管理
- {
- path: 'driver/list',
- element:
- },
-
- // 实时监控
- {
- path: 'monitoring/realtime',
- element: lazy(() => import('../pages/machinery/MonitoringPage'))
- },
-
- // 任务调度
- {
- path: 'scheduling/task',
- element: lazy(() => import('../pages/machinery/SchedulingPage'))
- }
- ]
+ if (!machinery) {
+ notFound()
}
-]
+
+ return (
+
+
+
+ )
+}
+
+// 生成静态路径(可选,用于SSG)
+export async function generateStaticParams() {
+ // 预生成一些常见的农机详情页
+ return [
+ { id: 'machinery-001' },
+ { id: 'machinery-002' },
+ { id: 'machinery-003' },
+ ]
+}
+```
+
+##### 3. 路由组的使用
+```
+src/app/
+├── (auth)/ # 路由组:不影响URL路径
+│ ├── layout.tsx # 认证页面专属布局
+│ ├── login/
+│ │ └── page.tsx # /login
+│ └── register/
+│ └── page.tsx # /register
+├── (dashboard)/ # 路由组:受保护的管理区域
+│ ├── layout.tsx # 仪表板布局
+│ ├── machinery/
+│ ├── field/
+│ └── config/
+```
+
+##### 4. 路由布局系统
+```typescript
+// src/app/(dashboard)/layout.tsx
+import { SidebarProvider } from '@/lib/providers/SidebarProvider'
+import { MainLayout } from '@/components/layout/MainLayout'
+import { auth } from '@/lib/auth'
+
+export default async function DashboardLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ // 服务端认证检查
+ const session = await auth()
+
+ if (!session) {
+ redirect('/login')
+ }
+
+ return (
+
+
+ {children}
+
+
+ )
+}
+```
+
+#### 动态路由特性
+
+##### 1. 路由参数处理
+```typescript
+// src/app/config/tenant/[enterpriseId]/page.tsx
+interface PageProps {
+ params: { enterpriseId: string }
+ searchParams: { [key: string]: string | string[] | undefined }
+}
+
+export default async function EnterpriseDetail({
+ params,
+ searchParams,
+}: PageProps) {
+ const enterpriseId = params.enterpriseId
+ const tab = searchParams.tab as string || 'basic'
+
+ // 根据查询参数显示不同tab
+ return (
+
+
企业详情:{enterpriseId}
+
+
+ )
+}
+```
+
+##### 2. 平行路由和插槽
+```typescript
+// src/app/machinery/layout.tsx
+export default function MachineryLayout({
+ children,
+ analytics,
+ monitoring, // 插槽
+}: {
+ children: React.ReactNode
+ analytics?: React.ReactNode
+ monitoring?: React.ReactNode
+}) {
+ return (
+
+
{children}
+ {analytics && (
+
{analytics}
+ )}
+ {monitoring && (
+
{monitoring}
+ )}
+
+ )
+}
+```
+
+##### 3. 路由中间件
+```typescript
+// middleware.ts
+import { NextResponse } from 'next/server'
+import type { NextRequest } from 'next/server'
+import { auth } from './lib/auth'
+
+export async function middleware(request: NextRequest) {
+ const session = await auth()
+ const { pathname } = request.nextUrl
+
+ // 未登录用户重定向到登录页
+ if (!session && pathname.startsWith('/dashboard')) {
+ return NextResponse.redirect(new URL('/login', request.url))
+ }
+
+ // 已登录用户访问登录页重定向到仪表板
+ if (session && pathname === '/login') {
+ return NextResponse.redirect(new URL('/dashboard', request.url))
+ }
+
+ return NextResponse.next()
+}
+
+export const config = {
+ matcher: ['/dashboard/:path*', '/login', '/register']
+}
+```
+
+#### 服务端组件优势
+
+##### 1. 数据获取
+```typescript
+// src/app/machinery/page.tsx - 服务端组件
+import { getMachineryList } from '@/lib/services/api/machineryApi'
+import { MachineryGrid } from '@/components/business/machinery/MachineryGrid'
+
+export default async function MachineryPage() {
+ // 服务端直接获取数据
+ const machineryData = await getMachineryList()
+
+ return (
+
+
农机管理系统
+
+
+ )
+}
+```
+
+##### 2. 缓存和重新验证
+```typescript
+// src/lib/services/api/machineryApi.ts
+export async function getMachineryList() {
+ const res = await fetch('/api/machinery', {
+ next: {
+ tags: ['machinery'], // 缓存标签
+ revalidate: 60, // 60秒重新验证
+ }
+ })
+
+ if (!res.ok) {
+ throw new Error('Failed to fetch machinery data')
+ }
+
+ return res.json()
+}
```
### 状态管理架构
diff --git a/package-lock.json b/package-lock.json
index 059d2f2..0af6da0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -54,11 +54,29 @@
"vaul": "^1.1.2"
},
"devDependencies": {
+ "@tailwindcss/postcss": "^4.0.0",
+ "@tailwindcss/vite": "^4.0.0",
"@types/node": "^20.10.0",
"@vitejs/plugin-react-swc": "^3.10.2",
+ "autoprefixer": "^10.4.21",
+ "postcss": "^8.5.6",
+ "tailwindcss": "^4.0.0",
"vite": "6.3.5"
}
},
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@babel/runtime": {
"version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
@@ -548,6 +566,69 @@
"integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
"license": "MIT"
},
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
"node_modules/@radix-ui/number": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz",
@@ -2409,6 +2490,545 @@
"@swc/counter": "^0.1.3"
}
},
+ "node_modules/@tailwindcss/node": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz",
+ "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.4",
+ "enhanced-resolve": "^5.18.3",
+ "jiti": "^2.6.0",
+ "lightningcss": "1.30.1",
+ "magic-string": "^0.30.19",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.1.14"
+ }
+ },
+ "node_modules/@tailwindcss/node/node_modules/lightningcss": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz",
+ "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-darwin-arm64": "1.30.1",
+ "lightningcss-darwin-x64": "1.30.1",
+ "lightningcss-freebsd-x64": "1.30.1",
+ "lightningcss-linux-arm-gnueabihf": "1.30.1",
+ "lightningcss-linux-arm64-gnu": "1.30.1",
+ "lightningcss-linux-arm64-musl": "1.30.1",
+ "lightningcss-linux-x64-gnu": "1.30.1",
+ "lightningcss-linux-x64-musl": "1.30.1",
+ "lightningcss-win32-arm64-msvc": "1.30.1",
+ "lightningcss-win32-x64-msvc": "1.30.1"
+ }
+ },
+ "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-arm64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz",
+ "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==",
+ "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/@tailwindcss/node/node_modules/lightningcss-darwin-x64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz",
+ "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==",
+ "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/@tailwindcss/node/node_modules/lightningcss-freebsd-x64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz",
+ "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==",
+ "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/@tailwindcss/node/node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz",
+ "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==",
+ "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/@tailwindcss/node/node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz",
+ "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==",
+ "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/@tailwindcss/node/node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz",
+ "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==",
+ "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/@tailwindcss/node/node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz",
+ "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==",
+ "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/@tailwindcss/node/node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz",
+ "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==",
+ "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/@tailwindcss/node/node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz",
+ "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==",
+ "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/@tailwindcss/node/node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz",
+ "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==",
+ "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"
+ }
+ },
+ "node_modules/@tailwindcss/node/node_modules/tailwindcss": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz",
+ "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz",
+ "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^2.0.4",
+ "tar": "^7.5.1"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.1.14",
+ "@tailwindcss/oxide-darwin-arm64": "4.1.14",
+ "@tailwindcss/oxide-darwin-x64": "4.1.14",
+ "@tailwindcss/oxide-freebsd-x64": "4.1.14",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.1.14",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.1.14",
+ "@tailwindcss/oxide-linux-x64-musl": "4.1.14",
+ "@tailwindcss/oxide-wasm32-wasi": "4.1.14",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.1.14"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz",
+ "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz",
+ "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz",
+ "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz",
+ "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz",
+ "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz",
+ "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz",
+ "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz",
+ "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz",
+ "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz",
+ "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==",
+ "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.5",
+ "@tybys/wasm-util": "^0.10.1",
+ "tslib": "^2.4.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz",
+ "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz",
+ "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/postcss": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.0.0.tgz",
+ "integrity": "sha512-lI2bPk4TvwavHdehjr5WiC6HnZ59hacM6ySEo4RM/H7tsjWd8JpqiNW9ThH7rO/yKtrn4mGBoXshpvn8clXjPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "@tailwindcss/node": "^4.0.0",
+ "@tailwindcss/oxide": "^4.0.0",
+ "lightningcss": "^1.29.1",
+ "postcss": "^8.4.41",
+ "tailwindcss": "4.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/vite": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.0.tgz",
+ "integrity": "sha512-4uukMiU9gHui8KMPMdWic5SP1O/tmQ1NFSRNrQWmcop5evAVl/LZ6/LuWL3quEiecp2RBcRWwqJrG+mFXlRlew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tailwindcss/node": "^4.0.0",
+ "@tailwindcss/oxide": "^4.0.0",
+ "lightningcss": "^1.29.1",
+ "tailwindcss": "4.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.2.0 || ^6"
+ }
+ },
"node_modules/@types/d3-array": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",
@@ -2539,6 +3159,88 @@
"node": ">=10"
}
},
+ "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/baseline-browser-mapping": {
+ "version": "2.8.18",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.18.tgz",
+ "integrity": "sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.26.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz",
+ "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.8.9",
+ "caniuse-lite": "^1.0.30001746",
+ "electron-to-chromium": "^1.5.227",
+ "node-releases": "^2.0.21",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
"node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@@ -2548,6 +3250,37 @@
"node": ">=6"
}
},
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001751",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz",
+ "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/class-variance-authority": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
@@ -2766,6 +3499,16 @@
"integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
"license": "MIT"
},
+ "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==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/detect-node-es": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
@@ -2788,6 +3531,13 @@
"csstype": "^3.0.2"
}
},
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.237",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz",
+ "integrity": "sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/embla-carousel": {
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz",
@@ -2822,6 +3572,20 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"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/esbuild": {
"version": "0.25.11",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz",
@@ -2864,6 +3628,16 @@
"@esbuild/win32-x64": "0.25.11"
}
},
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
@@ -2910,6 +3684,20 @@
"node": ">=8"
}
},
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -2943,6 +3731,13 @@
"node": ">=6"
}
},
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/input-otp": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz",
@@ -2971,12 +3766,283 @@
"node": ">=8"
}
},
+ "node_modules/jiti": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
"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==",
"license": "MIT"
},
+ "node_modules/lightningcss": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz",
+ "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "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"
+ }
+ },
+ "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"
+ ],
+ "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"
+ }
+ },
"node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -3016,6 +4082,39 @@
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
+ "node_modules/magic-string": {
+ "version": "0.30.19",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz",
+ "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "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/minizlib": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
+ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
"node_modules/nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
@@ -3045,6 +4144,23 @@
"react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
}
},
+ "node_modules/node-releases": {
+ "version": "2.0.25",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.25.tgz",
+ "integrity": "sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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",
@@ -3157,6 +4273,13 @@
"node": "^10 || ^12 || >=14"
}
},
+ "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/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -3522,6 +4645,44 @@
"url": "https://github.com/sponsors/dcastil"
}
},
+ "node_modules/tailwindcss": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.0.tgz",
+ "integrity": "sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ==",
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tar": {
+ "version": "7.5.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz",
+ "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.1.0",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/tiny-invariant": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
@@ -3558,6 +4719,37 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
"node_modules/use-callback-ref": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
@@ -3746,6 +4938,16 @@
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
"license": "ISC"
},
+ "node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/yargs": {
"version": "15.4.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
diff --git a/package.json b/package.json
index da20f61..f00afc2 100644
--- a/package.json
+++ b/package.json
@@ -1,61 +1,60 @@
-
- {
+{
"name": "智慧农业生产管理系统",
"version": "0.1.0",
"private": true,
"dependencies": {
- "@radix-ui/react-accordion": "^1.2.3",
- "@radix-ui/react-alert-dialog": "^1.1.6",
- "@radix-ui/react-aspect-ratio": "^1.1.2",
- "@radix-ui/react-avatar": "^1.1.3",
- "@radix-ui/react-checkbox": "^1.1.4",
- "@radix-ui/react-collapsible": "^1.1.3",
- "@radix-ui/react-context-menu": "^2.2.6",
- "@radix-ui/react-dialog": "^1.1.6",
- "@radix-ui/react-dropdown-menu": "^2.1.6",
- "@radix-ui/react-hover-card": "^1.1.6",
- "@radix-ui/react-label": "^2.1.2",
- "@radix-ui/react-menubar": "^1.1.6",
- "@radix-ui/react-navigation-menu": "^1.2.5",
- "@radix-ui/react-popover": "^1.1.6",
- "@radix-ui/react-progress": "^1.1.2",
- "@radix-ui/react-radio-group": "^1.2.3",
- "@radix-ui/react-scroll-area": "^1.2.3",
- "@radix-ui/react-select": "^2.1.6",
- "@radix-ui/react-separator": "^1.1.2",
- "@radix-ui/react-slider": "^1.2.3",
- "@radix-ui/react-slot": "^1.1.2",
- "@radix-ui/react-switch": "^1.1.3",
- "@radix-ui/react-tabs": "^1.1.3",
- "@radix-ui/react-toggle": "^1.1.2",
- "@radix-ui/react-toggle-group": "^1.1.2",
- "@radix-ui/react-tooltip": "^1.1.8",
- "class-variance-authority": "^0.7.1",
- "clsx": "*",
- "cmdk": "^1.1.1",
- "date-fns": "*",
- "embla-carousel-react": "^8.6.0",
- "input-otp": "^1.4.2",
- "lucide-react": "^0.487.0",
- "next-themes": "^0.4.6",
- "qrcode": "*",
- "react": "^18.3.1",
- "react-day-picker": "^8.10.1",
- "react-dom": "^18.3.1",
- "react-hook-form": "^7.55.0",
- "react-resizable-panels": "^2.1.7",
- "recharts": "^2.15.2",
- "sonner": "^2.0.3",
- "tailwind-merge": "*",
- "vaul": "^1.1.2"
+ "@radix-ui/react-accordion": "^1.2.3",
+ "@radix-ui/react-alert-dialog": "^1.1.6",
+ "@radix-ui/react-aspect-ratio": "^1.1.2",
+ "@radix-ui/react-avatar": "^1.1.3",
+ "@radix-ui/react-checkbox": "^1.1.4",
+ "@radix-ui/react-collapsible": "^1.1.3",
+ "@radix-ui/react-context-menu": "^2tw.2.6",
+ "@radix-ui/react-dialog": "^1.1.6",
+ "@radix-ui/react-dropdown-menu": "^2.1.6",
+ "@radix-ui/react-hover-card": "^1.1.6",
+ "@radix-ui/react-label": "^2.1.2",
+ "@radix-ui/react-menubar": "^1.1.6",
+ "@radix-ui/react-navigation-menu": "^1.2.5",
+ "@radix-ui/react-popover": "^1.1.6",
+ "@radix-ui/react-progress": "^1.1.2",
+ "@radix-ui/react-radio-group": "^1.2.3",
+ "@radix-ui/react-scroll-area": "^1.2.3",
+ "@radix-ui/react-select": "^2.1.6",
+ "@radix-ui/react-separator": "^1.1.2",
+ "@radix-ui/react-slider": "^1.2.3",
+ "@radix-ui/react-slot": "^1.1.2",
+ "@radix-ui/react-switch": "^1.1.3",
+ "@radix-ui/react-tabs": "^1.1.3",
+ "@radix-ui/react-toggle": "^1.1.2",
+ "@radix-ui/react-toggle-group": "^1.1.2",
+ "@radix-ui/react-tooltip": "^1.1.8",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "*",
+ "cmdk": "^1.1.1",
+ "date-fns": "*",
+ "embla-carousel-react": "^8.6.0",
+ "input-otp": "^1.4.2",
+ "lucide-react": "^0.487.0",
+ "next-themes": "^0.4.6",
+ "qrcode": "*",
+ "react": "^18.3.1",
+ "react-day-picker": "^8.10.1",
+ "react-dom": "^18.3.1",
+ "react-hook-form": "^7.55.0",
+ "react-resizable-panels": "^2.1.7",
+ "recharts": "^2.15.2",
+ "sonner": "^2.0.3",
+ "tailwind-merge": "*",
+ "vaul": "^1.1.2"
},
"devDependencies": {
- "@types/node": "^20.10.0",
- "@vitejs/plugin-react-swc": "^3.10.2",
- "vite": "6.3.5"
+ "@types/node": "^20.10.0",
+ "@vitejs/plugin-react-swc": "^3.10.2",
+ "vite": "6.3.5"
},
"scripts": {
- "dev": "vite",
- "build": "vite build"
+ "dev": "vite",
+ "build": "vite build"
}
- }
\ No newline at end of file
+}
diff --git a/src/index.css b/src/index.css
index 46a3e6e..a461c50 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,4919 +1 @@
-/*! tailwindcss v4.1.3 | MIT License | https://tailwindcss.com */
-@layer properties {
- @supports (((-webkit-hyphens: none)) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color: rgb(from red r g b)))) {
- *, :before, :after, ::backdrop {
- --tw-translate-x: 0;
- --tw-translate-y: 0;
- --tw-translate-z: 0;
- --tw-rotate-x: rotateX(0);
- --tw-rotate-y: rotateY(0);
- --tw-rotate-z: rotateZ(0);
- --tw-skew-x: skewX(0);
- --tw-skew-y: skewY(0);
- --tw-space-y-reverse: 0;
- --tw-space-x-reverse: 0;
- --tw-divide-y-reverse: 0;
- --tw-border-style: solid;
- --tw-gradient-position: initial;
- --tw-gradient-from: #0000;
- --tw-gradient-via: #0000;
- --tw-gradient-to: #0000;
- --tw-gradient-stops: initial;
- --tw-gradient-via-stops: initial;
- --tw-gradient-from-position: 0%;
- --tw-gradient-via-position: 50%;
- --tw-gradient-to-position: 100%;
- --tw-leading: initial;
- --tw-font-weight: initial;
- --tw-tracking: initial;
- --tw-shadow: 0 0 #0000;
- --tw-shadow-color: initial;
- --tw-shadow-alpha: 100%;
- --tw-inset-shadow: 0 0 #0000;
- --tw-inset-shadow-color: initial;
- --tw-inset-shadow-alpha: 100%;
- --tw-ring-color: initial;
- --tw-ring-shadow: 0 0 #0000;
- --tw-inset-ring-color: initial;
- --tw-inset-ring-shadow: 0 0 #0000;
- --tw-ring-inset: initial;
- --tw-ring-offset-width: 0px;
- --tw-ring-offset-color: #fff;
- --tw-ring-offset-shadow: 0 0 #0000;
- --tw-outline-style: solid;
- --tw-blur: initial;
- --tw-brightness: initial;
- --tw-contrast: initial;
- --tw-grayscale: initial;
- --tw-hue-rotate: initial;
- --tw-invert: initial;
- --tw-opacity: initial;
- --tw-saturate: initial;
- --tw-sepia: initial;
- --tw-drop-shadow: initial;
- --tw-drop-shadow-color: initial;
- --tw-drop-shadow-alpha: 100%;
- --tw-drop-shadow-size: initial;
- --tw-backdrop-blur: initial;
- --tw-backdrop-brightness: initial;
- --tw-backdrop-contrast: initial;
- --tw-backdrop-grayscale: initial;
- --tw-backdrop-hue-rotate: initial;
- --tw-backdrop-invert: initial;
- --tw-backdrop-opacity: initial;
- --tw-backdrop-saturate: initial;
- --tw-backdrop-sepia: initial;
- --tw-duration: initial;
- --tw-scale-x: 1;
- --tw-scale-y: 1;
- --tw-scale-z: 1;
- }
- }
-}
-
-@layer theme {
- :root, :host {
- --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
- --color-red-50: oklch(.971 .013 17.38);
- --color-red-100: oklch(.936 .032 17.717);
- --color-red-200: oklch(.885 .062 18.334);
- --color-red-300: oklch(.808 .114 19.571);
- --color-red-400: oklch(.704 .191 22.216);
- --color-red-500: oklch(.637 .237 25.331);
- --color-red-600: oklch(.577 .245 27.325);
- --color-red-700: oklch(.505 .213 27.518);
- --color-red-800: oklch(.444 .177 26.899);
- --color-red-900: oklch(.396 .141 25.723);
- --color-orange-50: oklch(.98 .016 73.684);
- --color-orange-100: oklch(.954 .038 75.164);
- --color-orange-200: oklch(.901 .076 70.697);
- --color-orange-300: oklch(.837 .128 66.29);
- --color-orange-400: oklch(.75 .183 55.934);
- --color-orange-500: oklch(.705 .213 47.604);
- --color-orange-600: oklch(.646 .222 41.116);
- --color-orange-700: oklch(.553 .195 38.402);
- --color-orange-800: oklch(.47 .157 37.304);
- --color-orange-900: oklch(.408 .123 38.172);
- --color-amber-50: oklch(.987 .022 95.277);
- --color-amber-100: oklch(.962 .059 95.617);
- --color-amber-800: oklch(.473 .137 46.201);
- --color-yellow-50: oklch(.987 .026 102.212);
- --color-yellow-100: oklch(.973 .071 103.193);
- --color-yellow-200: oklch(.945 .129 101.54);
- --color-yellow-300: oklch(.905 .182 98.111);
- --color-yellow-400: oklch(.852 .199 91.936);
- --color-yellow-500: oklch(.795 .184 86.047);
- --color-yellow-600: oklch(.681 .162 75.834);
- --color-yellow-700: oklch(.554 .135 66.442);
- --color-yellow-800: oklch(.476 .114 61.907);
- --color-yellow-900: oklch(.421 .095 57.708);
- --color-lime-100: oklch(.967 .067 122.328);
- --color-lime-800: oklch(.453 .124 130.933);
- --color-green-50: oklch(.982 .018 155.826);
- --color-green-100: oklch(.962 .044 156.743);
- --color-green-200: oklch(.925 .084 155.995);
- --color-green-300: oklch(.871 .15 154.449);
- --color-green-400: oklch(.792 .209 151.711);
- --color-green-500: oklch(.723 .219 149.579);
- --color-green-600: oklch(.627 .194 149.214);
- --color-green-700: oklch(.527 .154 150.069);
- --color-green-800: oklch(.448 .119 151.328);
- --color-green-900: oklch(.393 .095 152.535);
- --color-emerald-100: oklch(.95 .052 163.051);
- --color-emerald-800: oklch(.432 .095 166.913);
- --color-teal-50: oklch(.984 .014 180.72);
- --color-teal-100: oklch(.953 .051 180.801);
- --color-teal-600: oklch(.6 .118 184.704);
- --color-teal-700: oklch(.511 .096 186.391);
- --color-teal-800: oklch(.437 .078 188.216);
- --color-cyan-50: oklch(.984 .019 200.873);
- --color-cyan-100: oklch(.956 .045 203.388);
- --color-cyan-200: oklch(.917 .08 205.041);
- --color-cyan-600: oklch(.609 .126 221.723);
- --color-cyan-700: oklch(.52 .105 223.128);
- --color-cyan-800: oklch(.45 .085 224.283);
- --color-cyan-900: oklch(.398 .07 227.392);
- --color-blue-50: oklch(.97 .014 254.604);
- --color-blue-100: oklch(.932 .032 255.585);
- --color-blue-200: oklch(.882 .059 254.128);
- --color-blue-300: oklch(.809 .105 251.813);
- --color-blue-400: oklch(.707 .165 254.624);
- --color-blue-500: oklch(.623 .214 259.815);
- --color-blue-600: oklch(.546 .245 262.881);
- --color-blue-700: oklch(.488 .243 264.376);
- --color-blue-800: oklch(.424 .199 265.638);
- --color-blue-900: oklch(.379 .146 265.522);
- --color-indigo-50: oklch(.962 .018 272.314);
- --color-indigo-100: oklch(.93 .034 272.788);
- --color-indigo-500: oklch(.585 .233 277.117);
- --color-indigo-600: oklch(.511 .262 276.966);
- --color-indigo-700: oklch(.457 .24 277.023);
- --color-indigo-800: oklch(.398 .195 277.366);
- --color-purple-50: oklch(.977 .014 308.299);
- --color-purple-100: oklch(.946 .033 307.174);
- --color-purple-200: oklch(.902 .063 306.703);
- --color-purple-500: oklch(.627 .265 303.9);
- --color-purple-600: oklch(.558 .288 302.321);
- --color-purple-700: oklch(.496 .265 301.924);
- --color-purple-800: oklch(.438 .218 303.724);
- --color-purple-900: oklch(.381 .176 304.987);
- --color-pink-50: oklch(.971 .014 343.198);
- --color-pink-100: oklch(.948 .028 342.258);
- --color-pink-600: oklch(.592 .249 .584);
- --color-pink-700: oklch(.525 .223 3.958);
- --color-pink-800: oklch(.459 .187 3.815);
- --color-gray-50: oklch(.985 .002 247.839);
- --color-gray-100: oklch(.967 .003 264.542);
- --color-gray-200: oklch(.928 .006 264.531);
- --color-gray-300: oklch(.872 .01 258.338);
- --color-gray-400: oklch(.707 .022 261.325);
- --color-gray-500: oklch(.551 .027 264.364);
- --color-gray-600: oklch(.446 .03 256.802);
- --color-gray-700: oklch(.373 .034 259.733);
- --color-gray-800: oklch(.278 .033 256.848);
- --color-gray-900: oklch(.21 .034 264.665);
- --color-black: #000;
- --color-white: #fff;
- --spacing: .25rem;
- --container-xs: 20rem;
- --container-md: 28rem;
- --container-2xl: 42rem;
- --container-3xl: 48rem;
- --container-4xl: 56rem;
- --container-5xl: 64rem;
- --text-xs: .75rem;
- --text-xs--line-height: calc(1 / .75);
- --text-sm: .875rem;
- --text-sm--line-height: calc(1.25 / .875);
- --text-base: 1rem;
- --text-base--line-height: calc(1.5 / 1);
- --text-lg: 1.125rem;
- --text-lg--line-height: calc(1.75 / 1.125);
- --text-xl: 1.25rem;
- --text-xl--line-height: calc(1.75 / 1.25);
- --text-2xl: 1.5rem;
- --text-2xl--line-height: calc(2 / 1.5);
- --text-3xl: 1.875rem;
- --text-3xl--line-height: calc(2.25 / 1.875);
- --text-4xl: 2.25rem;
- --text-4xl--line-height: calc(2.5 / 2.25);
- --text-5xl: 3rem;
- --text-5xl--line-height: 1;
- --font-weight-normal: 400;
- --font-weight-medium: 500;
- --font-weight-semibold: 600;
- --font-weight-bold: 700;
- --tracking-tight: -.025em;
- --leading-relaxed: 1.625;
- --radius-xs: .125rem;
- --radius-2xl: 1rem;
- --drop-shadow-lg: 0 4px 4px #00000026;
- --animate-spin: spin 1s linear infinite;
- --animate-pulse: pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;
- --aspect-video: 16 / 9;
- --default-transition-duration: .15s;
- --default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);
- --default-font-family: var(--font-sans);
- --default-font-feature-settings: var(--font-sans--font-feature-settings);
- --default-font-variation-settings: var(--font-sans--font-variation-settings);
- --default-mono-font-family: var(--font-mono);
- --default-mono-font-feature-settings: var(--font-mono--font-feature-settings);
- --default-mono-font-variation-settings: var(--font-mono--font-variation-settings);
- }
-}
-
-@layer base {
- *, :after, :before, ::backdrop {
- box-sizing: border-box;
- border: 0 solid;
- margin: 0;
- padding: 0;
- }
-
- ::file-selector-button {
- box-sizing: border-box;
- border: 0 solid;
- margin: 0;
- padding: 0;
- }
-
- html, :host {
- -webkit-text-size-adjust: 100%;
- tab-size: 4;
- line-height: 1.5;
- font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");
- font-feature-settings: var(--default-font-feature-settings, normal);
- font-variation-settings: var(--default-font-variation-settings, normal);
- -webkit-tap-highlight-color: transparent;
- }
-
- body {
- line-height: inherit;
- }
-
- hr {
- height: 0;
- color: inherit;
- border-top-width: 1px;
- }
-
- abbr:where([title]) {
- -webkit-text-decoration: underline dotted;
- text-decoration: underline dotted;
- }
-
- h1, h2, h3, h4, h5, h6 {
- font-size: inherit;
- font-weight: inherit;
- }
-
- a {
- color: inherit;
- -webkit-text-decoration: inherit;
- -webkit-text-decoration: inherit;
- text-decoration: inherit;
- }
-
- b, strong {
- font-weight: bolder;
- }
-
- code, kbd, samp, pre {
- font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
- font-feature-settings: var(--default-mono-font-feature-settings, normal);
- font-variation-settings: var(--default-mono-font-variation-settings, normal);
- font-size: 1em;
- }
-
- small {
- font-size: 80%;
- }
-
- sub, sup {
- vertical-align: baseline;
- font-size: 75%;
- line-height: 0;
- position: relative;
- }
-
- sub {
- bottom: -.25em;
- }
-
- sup {
- top: -.5em;
- }
-
- table {
- text-indent: 0;
- border-color: inherit;
- border-collapse: collapse;
- }
-
- :-moz-focusring {
- outline: auto;
- }
-
- progress {
- vertical-align: baseline;
- }
-
- summary {
- display: list-item;
- }
-
- ol, ul, menu {
- list-style: none;
- }
-
- img, svg, video, canvas, audio, iframe, embed, object {
- vertical-align: middle;
- display: block;
- }
-
- img, video {
- max-width: 100%;
- height: auto;
- }
-
- button, input, select, optgroup, textarea {
- font: inherit;
- font-feature-settings: inherit;
- font-variation-settings: inherit;
- letter-spacing: inherit;
- color: inherit;
- opacity: 1;
- background-color: #0000;
- border-radius: 0;
- }
-
- ::file-selector-button {
- font: inherit;
- font-feature-settings: inherit;
- font-variation-settings: inherit;
- letter-spacing: inherit;
- color: inherit;
- opacity: 1;
- background-color: #0000;
- border-radius: 0;
- }
-
- :where(select:is([multiple], [size])) optgroup {
- font-weight: bolder;
- }
-
- :where(select:is([multiple], [size])) optgroup option {
- padding-inline-start: 20px;
- }
-
- ::file-selector-button {
- margin-inline-end: 4px;
- }
-
- ::placeholder {
- opacity: 1;
- color: currentColor;
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- ::placeholder {
- color: color-mix(in oklab, currentColor 50%, transparent);
- }
- }
-
- textarea {
- resize: vertical;
- }
-
- ::-webkit-search-decoration {
- -webkit-appearance: none;
- }
-
- ::-webkit-date-and-time-value {
- min-height: 1lh;
- text-align: inherit;
- }
-
- ::-webkit-datetime-edit {
- display: inline-flex;
- }
-
- ::-webkit-datetime-edit-fields-wrapper {
- padding: 0;
- }
-
- ::-webkit-datetime-edit {
- padding-block: 0;
- }
-
- ::-webkit-datetime-edit-year-field {
- padding-block: 0;
- }
-
- ::-webkit-datetime-edit-month-field {
- padding-block: 0;
- }
-
- ::-webkit-datetime-edit-day-field {
- padding-block: 0;
- }
-
- ::-webkit-datetime-edit-hour-field {
- padding-block: 0;
- }
-
- ::-webkit-datetime-edit-minute-field {
- padding-block: 0;
- }
-
- ::-webkit-datetime-edit-second-field {
- padding-block: 0;
- }
-
- ::-webkit-datetime-edit-millisecond-field {
- padding-block: 0;
- }
-
- ::-webkit-datetime-edit-meridiem-field {
- padding-block: 0;
- }
-
- :-moz-ui-invalid {
- box-shadow: none;
- }
-
- button, input:where([type="button"], [type="reset"], [type="submit"]) {
- appearance: button;
- }
-
- ::file-selector-button {
- appearance: button;
- }
-
- ::-webkit-inner-spin-button {
- height: auto;
- }
-
- ::-webkit-outer-spin-button {
- height: auto;
- }
-
- [hidden]:where(:not([hidden="until-found"])) {
- display: none !important;
- }
-
- * {
- border-color: var(--border);
- outline-color: var(--ring);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- * {
- outline-color: color-mix(in oklab, var(--ring) 50%, transparent);
- }
- }
-
- * {
- border-color: var(--border);
- outline-color: var(--ring);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- * {
- outline-color: color-mix(in oklab, var(--ring) 50%, transparent);
- }
- }
-
- body {
- background-color: var(--background);
- color: var(--foreground);
- }
-
- :where(:not(:has([class*=" text-"]), :not(:has([class^="text-"])))) h1 {
- font-size: var(--text-2xl);
- font-weight: var(--font-weight-medium);
- line-height: 1.5;
- }
-
- :where(:not(:has([class*=" text-"]), :not(:has([class^="text-"])))) h2 {
- font-size: var(--text-xl);
- font-weight: var(--font-weight-medium);
- line-height: 1.5;
- }
-
- :where(:not(:has([class*=" text-"]), :not(:has([class^="text-"])))) h3 {
- font-size: var(--text-lg);
- font-weight: var(--font-weight-medium);
- line-height: 1.5;
- }
-
- :where(:not(:has([class*=" text-"]), :not(:has([class^="text-"])))) h4 {
- font-size: var(--text-base);
- color: var(--foreground);
- font-weight: 600;
- line-height: 1.5;
- }
-
- :where(:not(:has([class*=" text-"]), :not(:has([class^="text-"])))) p {
- font-size: var(--text-base);
- font-weight: var(--font-weight-normal);
- line-height: 1.5;
- }
-
- :where(:not(:has([class*=" text-"]), :not(:has([class^="text-"])))) label {
- font-size: var(--text-sm);
- color: var(--muted-foreground);
- text-transform: uppercase;
- letter-spacing: .025em;
- font-weight: 600;
- line-height: 1.5;
- }
-
- :where(:not(:has([class*=" text-"]), :not(:has([class^="text-"])))) button {
- font-size: var(--text-base);
- font-weight: var(--font-weight-medium);
- line-height: 1.5;
- }
-
- :where(:not(:has([class*=" text-"]), :not(:has([class^="text-"])))) input {
- font-size: var(--text-base);
- font-weight: var(--font-weight-normal);
- line-height: 1.5;
- }
-}
-
-@layer utilities {
- .\@container\/card-header {
- container: card-header / inline-size;
- }
-
- .pointer-events-none {
- pointer-events: none;
- }
-
- .invisible {
- visibility: hidden;
- }
-
- .visible {
- visibility: visible;
- }
-
- .sr-only {
- clip: rect(0, 0, 0, 0);
- white-space: nowrap;
- border-width: 0;
- width: 1px;
- height: 1px;
- margin: -1px;
- padding: 0;
- position: absolute;
- overflow: hidden;
- }
-
- .absolute {
- position: absolute;
- }
-
- .fixed {
- position: fixed;
- }
-
- .relative {
- position: relative;
- }
-
- .inset-0 {
- inset: calc(var(--spacing) * 0);
- }
-
- .-top-1 {
- top: calc(var(--spacing) * -1);
- }
-
- .-top-3 {
- top: calc(var(--spacing) * -3);
- }
-
- .-top-6 {
- top: calc(var(--spacing) * -6);
- }
-
- .-top-8 {
- top: calc(var(--spacing) * -8);
- }
-
- .top-0 {
- top: calc(var(--spacing) * 0);
- }
-
- .top-1\/2 {
- top: 50%;
- }
-
- .top-1\/4 {
- top: 25%;
- }
-
- .top-2 {
- top: calc(var(--spacing) * 2);
- }
-
- .top-4 {
- top: calc(var(--spacing) * 4);
- }
-
- .top-6 {
- top: calc(var(--spacing) * 6);
- }
-
- .top-20 {
- top: calc(var(--spacing) * 20);
- }
-
- .top-28 {
- top: calc(var(--spacing) * 28);
- }
-
- .top-40 {
- top: calc(var(--spacing) * 40);
- }
-
- .top-\[50\%\] {
- top: 50%;
- }
-
- .top-full {
- top: 100%;
- }
-
- .-right-1 {
- right: calc(var(--spacing) * -1);
- }
-
- .right-0 {
- right: calc(var(--spacing) * 0);
- }
-
- .right-1 {
- right: calc(var(--spacing) * 1);
- }
-
- .right-2 {
- right: calc(var(--spacing) * 2);
- }
-
- .right-3 {
- right: calc(var(--spacing) * 3);
- }
-
- .right-4 {
- right: calc(var(--spacing) * 4);
- }
-
- .right-40 {
- right: calc(var(--spacing) * 40);
- }
-
- .-bottom-8 {
- bottom: calc(var(--spacing) * -8);
- }
-
- .bottom-0 {
- bottom: calc(var(--spacing) * 0);
- }
-
- .bottom-4 {
- bottom: calc(var(--spacing) * 4);
- }
-
- .-left-20 {
- left: calc(var(--spacing) * -20);
- }
-
- .left-0 {
- left: calc(var(--spacing) * 0);
- }
-
- .left-1 {
- left: calc(var(--spacing) * 1);
- }
-
- .left-1\/2 {
- left: 50%;
- }
-
- .left-1\/4 {
- left: 25%;
- }
-
- .left-3 {
- left: calc(var(--spacing) * 3);
- }
-
- .left-4 {
- left: calc(var(--spacing) * 4);
- }
-
- .left-32 {
- left: calc(var(--spacing) * 32);
- }
-
- .left-56 {
- left: calc(var(--spacing) * 56);
- }
-
- .left-\[-1\.25rem\] {
- left: -1.25rem;
- }
-
- .left-\[-1\.75rem\] {
- left: -1.75rem;
- }
-
- .left-\[-23px\] {
- left: -23px;
- }
-
- .left-\[15px\] {
- left: 15px;
- }
-
- .left-\[50\%\] {
- left: 50%;
- }
-
- .z-10 {
- z-index: 10;
- }
-
- .z-50 {
- z-index: 50;
- }
-
- .order-1 {
- order: 1;
- }
-
- .order-2 {
- order: 2;
- }
-
- .order-3 {
- order: 3;
- }
-
- .col-span-2 {
- grid-column: span 2 / span 2;
- }
-
- .col-span-3 {
- grid-column: span 3 / span 3;
- }
-
- .col-start-2 {
- grid-column-start: 2;
- }
-
- .row-span-2 {
- grid-row: span 2 / span 2;
- }
-
- .row-start-1 {
- grid-row-start: 1;
- }
-
- .-mx-1 {
- margin-inline: calc(var(--spacing) * -1);
- }
-
- .mx-2 {
- margin-inline: calc(var(--spacing) * 2);
- }
-
- .mx-auto {
- margin-inline: auto;
- }
-
- .my-1 {
- margin-block: calc(var(--spacing) * 1);
- }
-
- .my-2 {
- margin-block: calc(var(--spacing) * 2);
- }
-
- .mt-0\.5 {
- margin-top: calc(var(--spacing) * .5);
- }
-
- .mt-1 {
- margin-top: calc(var(--spacing) * 1);
- }
-
- .mt-1\.5 {
- margin-top: calc(var(--spacing) * 1.5);
- }
-
- .mt-2 {
- margin-top: calc(var(--spacing) * 2);
- }
-
- .mt-3 {
- margin-top: calc(var(--spacing) * 3);
- }
-
- .mt-4 {
- margin-top: calc(var(--spacing) * 4);
- }
-
- .mt-6 {
- margin-top: calc(var(--spacing) * 6);
- }
-
- .mr-1 {
- margin-right: calc(var(--spacing) * 1);
- }
-
- .mr-2 {
- margin-right: calc(var(--spacing) * 2);
- }
-
- .mr-3 {
- margin-right: calc(var(--spacing) * 3);
- }
-
- .mb-1 {
- margin-bottom: calc(var(--spacing) * 1);
- }
-
- .mb-2 {
- margin-bottom: calc(var(--spacing) * 2);
- }
-
- .mb-3 {
- margin-bottom: calc(var(--spacing) * 3);
- }
-
- .mb-4 {
- margin-bottom: calc(var(--spacing) * 4);
- }
-
- .mb-6 {
- margin-bottom: calc(var(--spacing) * 6);
- }
-
- .mb-8 {
- margin-bottom: calc(var(--spacing) * 8);
- }
-
- .ml-1 {
- margin-left: calc(var(--spacing) * 1);
- }
-
- .ml-2 {
- margin-left: calc(var(--spacing) * 2);
- }
-
- .ml-4 {
- margin-left: calc(var(--spacing) * 4);
- }
-
- .ml-5 {
- margin-left: calc(var(--spacing) * 5);
- }
-
- .ml-6 {
- margin-left: calc(var(--spacing) * 6);
- }
-
- .ml-11 {
- margin-left: calc(var(--spacing) * 11);
- }
-
- .ml-auto {
- margin-left: auto;
- }
-
- .line-clamp-1 {
- -webkit-line-clamp: 1;
- -webkit-box-orient: vertical;
- display: -webkit-box;
- overflow: hidden;
- }
-
- .line-clamp-2 {
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- display: -webkit-box;
- overflow: hidden;
- }
-
- .block {
- display: block;
- }
-
- .flex {
- display: flex;
- }
-
- .grid {
- display: grid;
- }
-
- .hidden {
- display: none;
- }
-
- .inline {
- display: inline;
- }
-
- .inline-block {
- display: inline-block;
- }
-
- .inline-flex {
- display: inline-flex;
- }
-
- .table {
- display: table;
- }
-
- .table-caption {
- display: table-caption;
- }
-
- .table-cell {
- display: table-cell;
- }
-
- .table-row {
- display: table-row;
- }
-
- .field-sizing-content {
- field-sizing: content;
- }
-
- .aspect-square {
- aspect-ratio: 1;
- }
-
- .aspect-video {
- aspect-ratio: var(--aspect-video);
- }
-
- .size-3\.5 {
- width: calc(var(--spacing) * 3.5);
- height: calc(var(--spacing) * 3.5);
- }
-
- .size-4 {
- width: calc(var(--spacing) * 4);
- height: calc(var(--spacing) * 4);
- }
-
- .size-7 {
- width: calc(var(--spacing) * 7);
- height: calc(var(--spacing) * 7);
- }
-
- .size-8 {
- width: calc(var(--spacing) * 8);
- height: calc(var(--spacing) * 8);
- }
-
- .size-9 {
- width: calc(var(--spacing) * 9);
- height: calc(var(--spacing) * 9);
- }
-
- .size-10 {
- width: calc(var(--spacing) * 10);
- height: calc(var(--spacing) * 10);
- }
-
- .size-full {
- width: 100%;
- height: 100%;
- }
-
- .h-0\.5 {
- height: calc(var(--spacing) * .5);
- }
-
- .h-1 {
- height: calc(var(--spacing) * 1);
- }
-
- .h-1\/3 {
- height: 33.3333%;
- }
-
- .h-2 {
- height: calc(var(--spacing) * 2);
- }
-
- .h-2\.5 {
- height: calc(var(--spacing) * 2.5);
- }
-
- .h-3 {
- height: calc(var(--spacing) * 3);
- }
-
- .h-4 {
- height: calc(var(--spacing) * 4);
- }
-
- .h-5 {
- height: calc(var(--spacing) * 5);
- }
-
- .h-6 {
- height: calc(var(--spacing) * 6);
- }
-
- .h-7 {
- height: calc(var(--spacing) * 7);
- }
-
- .h-8 {
- height: calc(var(--spacing) * 8);
- }
-
- .h-9 {
- height: calc(var(--spacing) * 9);
- }
-
- .h-10 {
- height: calc(var(--spacing) * 10);
- }
-
- .h-12 {
- height: calc(var(--spacing) * 12);
- }
-
- .h-16 {
- height: calc(var(--spacing) * 16);
- }
-
- .h-20 {
- height: calc(var(--spacing) * 20);
- }
-
- .h-24 {
- height: calc(var(--spacing) * 24);
- }
-
- .h-32 {
- height: calc(var(--spacing) * 32);
- }
-
- .h-40 {
- height: calc(var(--spacing) * 40);
- }
-
- .h-48 {
- height: calc(var(--spacing) * 48);
- }
-
- .h-64 {
- height: calc(var(--spacing) * 64);
- }
-
- .h-72 {
- height: calc(var(--spacing) * 72);
- }
-
- .h-80 {
- height: calc(var(--spacing) * 80);
- }
-
- .h-96 {
- height: calc(var(--spacing) * 96);
- }
-
- .h-\[1\.15rem\] {
- height: 1.15rem;
- }
-
- .h-\[400px\] {
- height: 400px;
- }
-
- .h-\[500px\] {
- height: 500px;
- }
-
- .h-\[600px\] {
- height: 600px;
- }
-
- .h-\[700px\] {
- height: 700px;
- }
-
- .h-\[calc\(100\%-1px\)\] {
- height: calc(100% - 1px);
- }
-
- .h-\[var\(--radix-select-trigger-height\)\] {
- height: var(--radix-select-trigger-height);
- }
-
- .h-auto {
- height: auto;
- }
-
- .h-full {
- height: 100%;
- }
-
- .h-px {
- height: 1px;
- }
-
- .h-screen {
- height: 100vh;
- }
-
- .max-h-\(--radix-select-content-available-height\) {
- max-height: var(--radix-select-content-available-height);
- }
-
- .max-h-40 {
- max-height: calc(var(--spacing) * 40);
- }
-
- .max-h-48 {
- max-height: calc(var(--spacing) * 48);
- }
-
- .max-h-64 {
- max-height: calc(var(--spacing) * 64);
- }
-
- .max-h-96 {
- max-height: calc(var(--spacing) * 96);
- }
-
- .max-h-\[80vh\] {
- max-height: 80vh;
- }
-
- .max-h-\[90vh\] {
- max-height: 90vh;
- }
-
- .max-h-\[300px\] {
- max-height: 300px;
- }
-
- .max-h-\[calc\(90vh-120px\)\] {
- max-height: calc(90vh - 120px);
- }
-
- .max-h-\[calc\(90vh-180px\)\] {
- max-height: calc(90vh - 180px);
- }
-
- .max-h-\[calc\(90vh-200px\)\] {
- max-height: calc(90vh - 200px);
- }
-
- .min-h-4 {
- min-height: calc(var(--spacing) * 4);
- }
-
- .min-h-16 {
- min-height: calc(var(--spacing) * 16);
- }
-
- .min-h-\[120px\] {
- min-height: 120px;
- }
-
- .min-h-\[400px\] {
- min-height: 400px;
- }
-
- .min-h-screen {
- min-height: 100vh;
- }
-
- .w-0\.5 {
- width: calc(var(--spacing) * .5);
- }
-
- .w-1 {
- width: calc(var(--spacing) * 1);
- }
-
- .w-1\/3 {
- width: 33.3333%;
- }
-
- .w-2 {
- width: calc(var(--spacing) * 2);
- }
-
- .w-2\.5 {
- width: calc(var(--spacing) * 2.5);
- }
-
- .w-3 {
- width: calc(var(--spacing) * 3);
- }
-
- .w-4 {
- width: calc(var(--spacing) * 4);
- }
-
- .w-5 {
- width: calc(var(--spacing) * 5);
- }
-
- .w-6 {
- width: calc(var(--spacing) * 6);
- }
-
- .w-8 {
- width: calc(var(--spacing) * 8);
- }
-
- .w-10 {
- width: calc(var(--spacing) * 10);
- }
-
- .w-12 {
- width: calc(var(--spacing) * 12);
- }
-
- .w-16 {
- width: calc(var(--spacing) * 16);
- }
-
- .w-20 {
- width: calc(var(--spacing) * 20);
- }
-
- .w-24 {
- width: calc(var(--spacing) * 24);
- }
-
- .w-32 {
- width: calc(var(--spacing) * 32);
- }
-
- .w-40 {
- width: calc(var(--spacing) * 40);
- }
-
- .w-48 {
- width: calc(var(--spacing) * 48);
- }
-
- .w-64 {
- width: calc(var(--spacing) * 64);
- }
-
- .w-72 {
- width: calc(var(--spacing) * 72);
- }
-
- .w-80 {
- width: calc(var(--spacing) * 80);
- }
-
- .w-96 {
- width: calc(var(--spacing) * 96);
- }
-
- .w-\[120px\] {
- width: 120px;
- }
-
- .w-\[200px\] {
- width: 200px;
- }
-
- .w-\[300px\] {
- width: 300px;
- }
-
- .w-auto {
- width: auto;
- }
-
- .w-fit {
- width: fit-content;
- }
-
- .w-full {
- width: 100%;
- }
-
- .max-w-2xl {
- max-width: var(--container-2xl);
- }
-
- .max-w-3xl {
- max-width: var(--container-3xl);
- }
-
- .max-w-4xl {
- max-width: var(--container-4xl);
- }
-
- .max-w-5xl {
- max-width: var(--container-5xl);
- }
-
- .max-w-\[140px\] {
- max-width: 140px;
- }
-
- .max-w-\[calc\(100\%-2rem\)\] {
- max-width: calc(100% - 2rem);
- }
-
- .max-w-md {
- max-width: var(--container-md);
- }
-
- .max-w-xs {
- max-width: var(--container-xs);
- }
-
- .min-w-0 {
- min-width: calc(var(--spacing) * 0);
- }
-
- .min-w-\[8rem\] {
- min-width: 8rem;
- }
-
- .min-w-\[120px\] {
- min-width: 120px;
- }
-
- .min-w-\[150px\] {
- min-width: 150px;
- }
-
- .min-w-\[var\(--radix-select-trigger-width\)\] {
- min-width: var(--radix-select-trigger-width);
- }
-
- .flex-1 {
- flex: 1;
- }
-
- .flex-shrink-0, .shrink-0 {
- flex-shrink: 0;
- }
-
- .grow {
- flex-grow: 1;
- }
-
- .caption-bottom {
- caption-side: bottom;
- }
-
- .border-collapse {
- border-collapse: collapse;
- }
-
- .origin-\(--radix-popover-content-transform-origin\) {
- transform-origin: var(--radix-popover-content-transform-origin);
- }
-
- .origin-\(--radix-select-content-transform-origin\) {
- transform-origin: var(--radix-select-content-transform-origin);
- }
-
- .-translate-x-1\/2 {
- --tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
-
- .translate-x-\[-50\%\] {
- --tw-translate-x: -50%;
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
-
- .-translate-y-1\/2 {
- --tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
-
- .translate-y-\[-50\%\] {
- --tw-translate-y: -50%;
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
-
- .-rotate-90 {
- rotate: -90deg;
- }
-
- .rotate-180 {
- rotate: 180deg;
- }
-
- .transform {
- transform: var(--tw-rotate-x) var(--tw-rotate-y) var(--tw-rotate-z) var(--tw-skew-x) var(--tw-skew-y);
- }
-
- .animate-pulse {
- animation: var(--animate-pulse);
- }
-
- .animate-spin {
- animation: var(--animate-spin);
- }
-
- .cursor-crosshair {
- cursor: crosshair;
- }
-
- .cursor-default {
- cursor: default;
- }
-
- .cursor-move {
- cursor: move;
- }
-
- .cursor-pointer {
- cursor: pointer;
- }
-
- .touch-none {
- touch-action: none;
- }
-
- .resize-none {
- resize: none;
- }
-
- .scroll-my-1 {
- scroll-margin-block: calc(var(--spacing) * 1);
- }
-
- .list-inside {
- list-style-position: inside;
- }
-
- .list-disc {
- list-style-type: disc;
- }
-
- .auto-rows-min {
- grid-auto-rows: min-content;
- }
-
- .grid-cols-1 {
- grid-template-columns: repeat(1, minmax(0, 1fr));
- }
-
- .grid-cols-2 {
- grid-template-columns: repeat(2, minmax(0, 1fr));
- }
-
- .grid-cols-3 {
- grid-template-columns: repeat(3, minmax(0, 1fr));
- }
-
- .grid-cols-4 {
- grid-template-columns: repeat(4, minmax(0, 1fr));
- }
-
- .grid-cols-5 {
- grid-template-columns: repeat(5, minmax(0, 1fr));
- }
-
- .grid-cols-6 {
- grid-template-columns: repeat(6, minmax(0, 1fr));
- }
-
- .grid-cols-7 {
- grid-template-columns: repeat(7, minmax(0, 1fr));
- }
-
- .grid-cols-8 {
- grid-template-columns: repeat(8, minmax(0, 1fr));
- }
-
- .grid-cols-\[0_1fr\] {
- grid-template-columns: 0 1fr;
- }
-
- .grid-rows-2 {
- grid-template-rows: repeat(2, minmax(0, 1fr));
- }
-
- .grid-rows-5 {
- grid-template-rows: repeat(5, minmax(0, 1fr));
- }
-
- .grid-rows-8 {
- grid-template-rows: repeat(8, minmax(0, 1fr));
- }
-
- .grid-rows-\[auto_auto\] {
- grid-template-rows: auto auto;
- }
-
- .flex-col {
- flex-direction: column;
- }
-
- .flex-col-reverse {
- flex-direction: column-reverse;
- }
-
- .flex-wrap {
- flex-wrap: wrap;
- }
-
- .items-baseline {
- align-items: baseline;
- }
-
- .items-center {
- align-items: center;
- }
-
- .items-end {
- align-items: flex-end;
- }
-
- .items-start {
- align-items: flex-start;
- }
-
- .justify-around {
- justify-content: space-around;
- }
-
- .justify-between {
- justify-content: space-between;
- }
-
- .justify-center {
- justify-content: center;
- }
-
- .justify-end {
- justify-content: flex-end;
- }
-
- .justify-start {
- justify-content: flex-start;
- }
-
- .justify-items-start {
- justify-items: start;
- }
-
- .gap-1 {
- gap: calc(var(--spacing) * 1);
- }
-
- .gap-1\.5 {
- gap: calc(var(--spacing) * 1.5);
- }
-
- .gap-2 {
- gap: calc(var(--spacing) * 2);
- }
-
- .gap-3 {
- gap: calc(var(--spacing) * 3);
- }
-
- .gap-4 {
- gap: calc(var(--spacing) * 4);
- }
-
- .gap-6 {
- gap: calc(var(--spacing) * 6);
- }
-
- :where(.space-y-0\.5 > :not(:last-child)) {
- --tw-space-y-reverse: 0;
- margin-block-start: calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));
- margin-block-end: calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)));
- }
-
- :where(.space-y-1 > :not(:last-child)) {
- --tw-space-y-reverse: 0;
- margin-block-start: calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));
- margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)));
- }
-
- :where(.space-y-2 > :not(:last-child)) {
- --tw-space-y-reverse: 0;
- margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));
- margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));
- }
-
- :where(.space-y-3 > :not(:last-child)) {
- --tw-space-y-reverse: 0;
- margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));
- margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)));
- }
-
- :where(.space-y-4 > :not(:last-child)) {
- --tw-space-y-reverse: 0;
- margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));
- margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));
- }
-
- :where(.space-y-6 > :not(:last-child)) {
- --tw-space-y-reverse: 0;
- margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));
- margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));
- }
-
- .gap-x-8 {
- column-gap: calc(var(--spacing) * 8);
- }
-
- :where(.space-x-1 > :not(:last-child)) {
- --tw-space-x-reverse: 0;
- margin-inline-start: calc(calc(var(--spacing) * 1) * var(--tw-space-x-reverse));
- margin-inline-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-x-reverse)));
- }
-
- :where(.space-x-2 > :not(:last-child)) {
- --tw-space-x-reverse: 0;
- margin-inline-start: calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));
- margin-inline-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)));
- }
-
- .gap-y-0\.5 {
- row-gap: calc(var(--spacing) * .5);
- }
-
- .gap-y-4 {
- row-gap: calc(var(--spacing) * 4);
- }
-
- :where(.divide-y > :not(:last-child)) {
- --tw-divide-y-reverse: 0;
- border-bottom-style: var(--tw-border-style);
- border-top-style: var(--tw-border-style);
- border-top-width: calc(1px * var(--tw-divide-y-reverse));
- border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
- }
-
- .self-start {
- align-self: flex-start;
- }
-
- .justify-self-end {
- justify-self: flex-end;
- }
-
- .truncate {
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
- }
-
- .overflow-auto {
- overflow: auto;
- }
-
- .overflow-hidden {
- overflow: hidden;
- }
-
- .overflow-x-auto {
- overflow-x: auto;
- }
-
- .overflow-x-hidden {
- overflow-x: hidden;
- }
-
- .overflow-y-auto {
- overflow-y: auto;
- }
-
- .rounded {
- border-radius: .25rem;
- }
-
- .rounded-2xl {
- border-radius: var(--radius-2xl);
- }
-
- .rounded-\[4px\] {
- border-radius: 4px;
- }
-
- .rounded-\[inherit\] {
- border-radius: inherit;
- }
-
- .rounded-full {
- border-radius: 3.40282e38px;
- }
-
- .rounded-lg {
- border-radius: var(--radius);
- }
-
- .rounded-md {
- border-radius: calc(var(--radius) - 2px);
- }
-
- .rounded-sm {
- border-radius: calc(var(--radius) - 4px);
- }
-
- .rounded-xl {
- border-radius: calc(var(--radius) + 4px);
- }
-
- .rounded-xs {
- border-radius: var(--radius-xs);
- }
-
- .rounded-t {
- border-top-left-radius: .25rem;
- border-top-right-radius: .25rem;
- }
-
- .rounded-r-lg {
- border-top-right-radius: var(--radius);
- border-bottom-right-radius: var(--radius);
- }
-
- .border {
- border-style: var(--tw-border-style);
- border-width: 1px;
- }
-
- .border-0 {
- border-style: var(--tw-border-style);
- border-width: 0;
- }
-
- .border-2 {
- border-style: var(--tw-border-style);
- border-width: 2px;
- }
-
- .border-4 {
- border-style: var(--tw-border-style);
- border-width: 4px;
- }
-
- .border-t {
- border-top-style: var(--tw-border-style);
- border-top-width: 1px;
- }
-
- .border-t-2 {
- border-top-style: var(--tw-border-style);
- border-top-width: 2px;
- }
-
- .border-t-4 {
- border-top-style: var(--tw-border-style);
- border-top-width: 4px;
- }
-
- .border-r {
- border-right-style: var(--tw-border-style);
- border-right-width: 1px;
- }
-
- .border-b {
- border-bottom-style: var(--tw-border-style);
- border-bottom-width: 1px;
- }
-
- .border-l {
- border-left-style: var(--tw-border-style);
- border-left-width: 1px;
- }
-
- .border-l-2 {
- border-left-style: var(--tw-border-style);
- border-left-width: 2px;
- }
-
- .border-l-4 {
- border-left-style: var(--tw-border-style);
- border-left-width: 4px;
- }
-
- .border-dashed {
- --tw-border-style: dashed;
- border-style: dashed;
- }
-
- .border-blue-200 {
- border-color: var(--color-blue-200);
- }
-
- .border-blue-300 {
- border-color: var(--color-blue-300);
- }
-
- .border-blue-500 {
- border-color: var(--color-blue-500);
- }
-
- .border-blue-600 {
- border-color: var(--color-blue-600);
- }
-
- .border-border {
- border-color: var(--border);
- }
-
- .border-current {
- border-color: currentColor;
- }
-
- .border-cyan-200 {
- border-color: var(--color-cyan-200);
- }
-
- .border-gray-200 {
- border-color: var(--color-gray-200);
- }
-
- .border-gray-300 {
- border-color: var(--color-gray-300);
- }
-
- .border-green-100 {
- border-color: var(--color-green-100);
- }
-
- .border-green-200 {
- border-color: var(--color-green-200);
- }
-
- .border-green-300 {
- border-color: var(--color-green-300);
- }
-
- .border-green-500 {
- border-color: var(--color-green-500);
- }
-
- .border-green-600 {
- border-color: var(--color-green-600);
- }
-
- .border-input {
- border-color: var(--input);
- }
-
- .border-orange-200 {
- border-color: var(--color-orange-200);
- }
-
- .border-orange-300 {
- border-color: var(--color-orange-300);
- }
-
- .border-orange-500 {
- border-color: var(--color-orange-500);
- }
-
- .border-primary {
- border-color: var(--primary);
- }
-
- .border-purple-200 {
- border-color: var(--color-purple-200);
- }
-
- .border-purple-500 {
- border-color: var(--color-purple-500);
- }
-
- .border-red-200 {
- border-color: var(--color-red-200);
- }
-
- .border-red-300 {
- border-color: var(--color-red-300);
- }
-
- .border-red-500 {
- border-color: var(--color-red-500);
- }
-
- .border-transparent {
- border-color: #0000;
- }
-
- .border-white {
- border-color: var(--color-white);
- }
-
- .border-white\/30 {
- border-color: #ffffff4d;
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .border-white\/30 {
- border-color: color-mix(in oklab, var(--color-white) 30%, transparent);
- }
- }
-
- .border-yellow-200 {
- border-color: var(--color-yellow-200);
- }
-
- .border-yellow-300 {
- border-color: var(--color-yellow-300);
- }
-
- .border-yellow-400 {
- border-color: var(--color-yellow-400);
- }
-
- .border-t-transparent {
- border-top-color: #0000;
- }
-
- .border-l-blue-500 {
- border-left-color: var(--color-blue-500);
- }
-
- .border-l-gray-500 {
- border-left-color: var(--color-gray-500);
- }
-
- .border-l-green-500 {
- border-left-color: var(--color-green-500);
- }
-
- .border-l-orange-500 {
- border-left-color: var(--color-orange-500);
- }
-
- .border-l-red-500 {
- border-left-color: var(--color-red-500);
- }
-
- .border-l-transparent {
- border-left-color: #0000;
- }
-
- .border-l-yellow-500 {
- border-left-color: var(--color-yellow-500);
- }
-
- .bg-accent {
- background-color: var(--accent);
- }
-
- .bg-amber-100 {
- background-color: var(--color-amber-100);
- }
-
- .bg-background {
- background-color: var(--background);
- }
-
- .bg-black {
- background-color: var(--color-black);
- }
-
- .bg-black\/30 {
- background-color: #0000004d;
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .bg-black\/30 {
- background-color: color-mix(in oklab, var(--color-black) 30%, transparent);
- }
- }
-
- .bg-black\/50 {
- background-color: #00000080;
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .bg-black\/50 {
- background-color: color-mix(in oklab, var(--color-black) 50%, transparent);
- }
- }
-
- .bg-blue-50 {
- background-color: var(--color-blue-50);
- }
-
- .bg-blue-50\/50 {
- background-color: color-mix(in srgb, oklch(.97 .014 254.604) 50%, transparent);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .bg-blue-50\/50 {
- background-color: color-mix(in oklab, var(--color-blue-50) 50%, transparent);
- }
- }
-
- .bg-blue-100 {
- background-color: var(--color-blue-100);
- }
-
- .bg-blue-200 {
- background-color: var(--color-blue-200);
- }
-
- .bg-blue-400 {
- background-color: var(--color-blue-400);
- }
-
- .bg-blue-500 {
- background-color: var(--color-blue-500);
- }
-
- .bg-blue-600 {
- background-color: var(--color-blue-600);
- }
-
- .bg-border {
- background-color: var(--border);
- }
-
- .bg-card {
- background-color: var(--card);
- }
-
- .bg-cyan-50 {
- background-color: var(--color-cyan-50);
- }
-
- .bg-cyan-100 {
- background-color: var(--color-cyan-100);
- }
-
- .bg-destructive {
- background-color: var(--destructive);
- }
-
- .bg-emerald-100 {
- background-color: var(--color-emerald-100);
- }
-
- .bg-gray-50 {
- background-color: var(--color-gray-50);
- }
-
- .bg-gray-50\/50 {
- background-color: color-mix(in srgb, oklch(.985 .002 247.839) 50%, transparent);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .bg-gray-50\/50 {
- background-color: color-mix(in oklab, var(--color-gray-50) 50%, transparent);
- }
- }
-
- .bg-gray-100 {
- background-color: var(--color-gray-100);
- }
-
- .bg-gray-200 {
- background-color: var(--color-gray-200);
- }
-
- .bg-gray-300 {
- background-color: var(--color-gray-300);
- }
-
- .bg-gray-400 {
- background-color: var(--color-gray-400);
- }
-
- .bg-gray-500 {
- background-color: var(--color-gray-500);
- }
-
- .bg-gray-600 {
- background-color: var(--color-gray-600);
- }
-
- .bg-gray-900 {
- background-color: var(--color-gray-900);
- }
-
- .bg-green-50 {
- background-color: var(--color-green-50);
- }
-
- .bg-green-100 {
- background-color: var(--color-green-100);
- }
-
- .bg-green-200 {
- background-color: var(--color-green-200);
- }
-
- .bg-green-400 {
- background-color: var(--color-green-400);
- }
-
- .bg-green-500 {
- background-color: var(--color-green-500);
- }
-
- .bg-green-600 {
- background-color: var(--color-green-600);
- }
-
- .bg-indigo-100 {
- background-color: var(--color-indigo-100);
- }
-
- .bg-indigo-500 {
- background-color: var(--color-indigo-500);
- }
-
- .bg-input-background {
- background-color: var(--input-background);
- }
-
- .bg-lime-100 {
- background-color: var(--color-lime-100);
- }
-
- .bg-muted {
- background-color: var(--muted);
- }
-
- .bg-muted\/50 {
- background-color: var(--muted);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .bg-muted\/50 {
- background-color: color-mix(in oklab, var(--muted) 50%, transparent);
- }
- }
-
- .bg-orange-50 {
- background-color: var(--color-orange-50);
- }
-
- .bg-orange-50\/50 {
- background-color: color-mix(in srgb, oklch(.98 .016 73.684) 50%, transparent);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .bg-orange-50\/50 {
- background-color: color-mix(in oklab, var(--color-orange-50) 50%, transparent);
- }
- }
-
- .bg-orange-100 {
- background-color: var(--color-orange-100);
- }
-
- .bg-orange-400 {
- background-color: var(--color-orange-400);
- }
-
- .bg-orange-500 {
- background-color: var(--color-orange-500);
- }
-
- .bg-orange-600 {
- background-color: var(--color-orange-600);
- }
-
- .bg-pink-100 {
- background-color: var(--color-pink-100);
- }
-
- .bg-popover {
- background-color: var(--popover);
- }
-
- .bg-primary {
- background-color: var(--primary);
- }
-
- .bg-primary\/20 {
- background-color: var(--primary);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .bg-primary\/20 {
- background-color: color-mix(in oklab, var(--primary) 20%, transparent);
- }
- }
-
- .bg-purple-50 {
- background-color: var(--color-purple-50);
- }
-
- .bg-purple-100 {
- background-color: var(--color-purple-100);
- }
-
- .bg-purple-200 {
- background-color: var(--color-purple-200);
- }
-
- .bg-purple-500 {
- background-color: var(--color-purple-500);
- }
-
- .bg-purple-600 {
- background-color: var(--color-purple-600);
- }
-
- .bg-red-50 {
- background-color: var(--color-red-50);
- }
-
- .bg-red-50\/50 {
- background-color: color-mix(in srgb, oklch(.971 .013 17.38) 50%, transparent);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .bg-red-50\/50 {
- background-color: color-mix(in oklab, var(--color-red-50) 50%, transparent);
- }
- }
-
- .bg-red-100 {
- background-color: var(--color-red-100);
- }
-
- .bg-red-400 {
- background-color: var(--color-red-400);
- }
-
- .bg-red-500 {
- background-color: var(--color-red-500);
- }
-
- .bg-red-600 {
- background-color: var(--color-red-600);
- }
-
- .bg-secondary {
- background-color: var(--secondary);
- }
-
- .bg-teal-50 {
- background-color: var(--color-teal-50);
- }
-
- .bg-teal-100 {
- background-color: var(--color-teal-100);
- }
-
- .bg-transparent {
- background-color: #0000;
- }
-
- .bg-white {
- background-color: var(--color-white);
- }
-
- .bg-white\/90 {
- background-color: #ffffffe6;
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .bg-white\/90 {
- background-color: color-mix(in oklab, var(--color-white) 90%, transparent);
- }
- }
-
- .bg-white\/95 {
- background-color: #fffffff2;
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .bg-white\/95 {
- background-color: color-mix(in oklab, var(--color-white) 95%, transparent);
- }
- }
-
- .bg-yellow-50 {
- background-color: var(--color-yellow-50);
- }
-
- .bg-yellow-100 {
- background-color: var(--color-yellow-100);
- }
-
- .bg-yellow-400 {
- background-color: var(--color-yellow-400);
- }
-
- .bg-yellow-500 {
- background-color: var(--color-yellow-500);
- }
-
- .bg-yellow-600 {
- background-color: var(--color-yellow-600);
- }
-
- .bg-gradient-to-b {
- --tw-gradient-position: to bottom in oklab;
- background-image: linear-gradient(var(--tw-gradient-stops));
- }
-
- .bg-gradient-to-br {
- --tw-gradient-position: to bottom right in oklab;
- background-image: linear-gradient(var(--tw-gradient-stops));
- }
-
- .bg-gradient-to-r {
- --tw-gradient-position: to right in oklab;
- background-image: linear-gradient(var(--tw-gradient-stops));
- }
-
- .bg-gradient-to-t {
- --tw-gradient-position: to top in oklab;
- background-image: linear-gradient(var(--tw-gradient-stops));
- }
-
- .from-blue-50 {
- --tw-gradient-from: var(--color-blue-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .from-blue-500 {
- --tw-gradient-from: var(--color-blue-500);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .from-blue-600 {
- --tw-gradient-from: var(--color-blue-600);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .from-cyan-50 {
- --tw-gradient-from: var(--color-cyan-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .from-gray-50 {
- --tw-gradient-from: var(--color-gray-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .from-gray-100 {
- --tw-gradient-from: var(--color-gray-100);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .from-green-50 {
- --tw-gradient-from: var(--color-green-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .from-green-100 {
- --tw-gradient-from: var(--color-green-100);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .from-green-900 {
- --tw-gradient-from: var(--color-green-900);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .from-indigo-50 {
- --tw-gradient-from: var(--color-indigo-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .from-orange-50 {
- --tw-gradient-from: var(--color-orange-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .from-purple-50 {
- --tw-gradient-from: var(--color-purple-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .from-red-50 {
- --tw-gradient-from: var(--color-red-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .from-yellow-50 {
- --tw-gradient-from: var(--color-yellow-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .via-blue-50 {
- --tw-gradient-via: var(--color-blue-50);
- --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);
- --tw-gradient-stops: var(--tw-gradient-via-stops);
- }
-
- .via-green-50 {
- --tw-gradient-via: var(--color-green-50);
- --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);
- --tw-gradient-stops: var(--tw-gradient-via-stops);
- }
-
- .via-green-700 {
- --tw-gradient-via: var(--color-green-700);
- --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);
- --tw-gradient-stops: var(--tw-gradient-via-stops);
- }
-
- .to-amber-50 {
- --tw-gradient-to: var(--color-amber-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-blue-50 {
- --tw-gradient-to: var(--color-blue-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-blue-100 {
- --tw-gradient-to: var(--color-blue-100);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-blue-300 {
- --tw-gradient-to: var(--color-blue-300);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-blue-400 {
- --tw-gradient-to: var(--color-blue-400);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-cyan-50 {
- --tw-gradient-to: var(--color-cyan-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-cyan-100 {
- --tw-gradient-to: var(--color-cyan-100);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-gray-50 {
- --tw-gradient-to: var(--color-gray-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-gray-100 {
- --tw-gradient-to: var(--color-gray-100);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-green-50 {
- --tw-gradient-to: var(--color-green-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-green-100 {
- --tw-gradient-to: var(--color-green-100);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-green-200 {
- --tw-gradient-to: var(--color-green-200);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-green-500 {
- --tw-gradient-to: var(--color-green-500);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-indigo-100 {
- --tw-gradient-to: var(--color-indigo-100);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-orange-50 {
- --tw-gradient-to: var(--color-orange-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-orange-100 {
- --tw-gradient-to: var(--color-orange-100);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-pink-50 {
- --tw-gradient-to: var(--color-pink-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-purple-50 {
- --tw-gradient-to: var(--color-purple-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-purple-100 {
- --tw-gradient-to: var(--color-purple-100);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-red-100 {
- --tw-gradient-to: var(--color-red-100);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-teal-50 {
- --tw-gradient-to: var(--color-teal-50);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-transparent {
- --tw-gradient-to: transparent;
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .to-yellow-100 {
- --tw-gradient-to: var(--color-yellow-100);
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- }
-
- .fill-current {
- fill: currentColor;
- }
-
- .fill-orange-400 {
- fill: var(--color-orange-400);
- }
-
- .fill-yellow-400 {
- fill: var(--color-yellow-400);
- }
-
- .p-0 {
- padding: calc(var(--spacing) * 0);
- }
-
- .p-0\.5 {
- padding: calc(var(--spacing) * .5);
- }
-
- .p-1 {
- padding: calc(var(--spacing) * 1);
- }
-
- .p-2 {
- padding: calc(var(--spacing) * 2);
- }
-
- .p-3 {
- padding: calc(var(--spacing) * 3);
- }
-
- .p-4 {
- padding: calc(var(--spacing) * 4);
- }
-
- .p-6 {
- padding: calc(var(--spacing) * 6);
- }
-
- .p-8 {
- padding: calc(var(--spacing) * 8);
- }
-
- .p-12 {
- padding: calc(var(--spacing) * 12);
- }
-
- .p-\[3px\] {
- padding: 3px;
- }
-
- .p-px {
- padding: 1px;
- }
-
- .px-1 {
- padding-inline: calc(var(--spacing) * 1);
- }
-
- .px-2 {
- padding-inline: calc(var(--spacing) * 2);
- }
-
- .px-3 {
- padding-inline: calc(var(--spacing) * 3);
- }
-
- .px-4 {
- padding-inline: calc(var(--spacing) * 4);
- }
-
- .px-6 {
- padding-inline: calc(var(--spacing) * 6);
- }
-
- .py-0\.5 {
- padding-block: calc(var(--spacing) * .5);
- }
-
- .py-1 {
- padding-block: calc(var(--spacing) * 1);
- }
-
- .py-1\.5 {
- padding-block: calc(var(--spacing) * 1.5);
- }
-
- .py-2 {
- padding-block: calc(var(--spacing) * 2);
- }
-
- .py-3 {
- padding-block: calc(var(--spacing) * 3);
- }
-
- .py-4 {
- padding-block: calc(var(--spacing) * 4);
- }
-
- .py-8 {
- padding-block: calc(var(--spacing) * 8);
- }
-
- .py-12 {
- padding-block: calc(var(--spacing) * 12);
- }
-
- .pt-1 {
- padding-top: calc(var(--spacing) * 1);
- }
-
- .pt-2 {
- padding-top: calc(var(--spacing) * 2);
- }
-
- .pt-3 {
- padding-top: calc(var(--spacing) * 3);
- }
-
- .pt-4 {
- padding-top: calc(var(--spacing) * 4);
- }
-
- .pt-6 {
- padding-top: calc(var(--spacing) * 6);
- }
-
- .pr-4 {
- padding-right: calc(var(--spacing) * 4);
- }
-
- .pr-6 {
- padding-right: calc(var(--spacing) * 6);
- }
-
- .pr-8 {
- padding-right: calc(var(--spacing) * 8);
- }
-
- .pr-10 {
- padding-right: calc(var(--spacing) * 10);
- }
-
- .pb-2 {
- padding-bottom: calc(var(--spacing) * 2);
- }
-
- .pb-4 {
- padding-bottom: calc(var(--spacing) * 4);
- }
-
- .pb-6 {
- padding-bottom: calc(var(--spacing) * 6);
- }
-
- .pl-2 {
- padding-left: calc(var(--spacing) * 2);
- }
-
- .pl-4 {
- padding-left: calc(var(--spacing) * 4);
- }
-
- .pl-8 {
- padding-left: calc(var(--spacing) * 8);
- }
-
- .pl-9 {
- padding-left: calc(var(--spacing) * 9);
- }
-
- .pl-10 {
- padding-left: calc(var(--spacing) * 10);
- }
-
- .text-center {
- text-align: center;
- }
-
- .text-left {
- text-align: left;
- }
-
- .text-right {
- text-align: right;
- }
-
- .align-middle {
- vertical-align: middle;
- }
-
- .font-mono {
- font-family: var(--font-mono);
- }
-
- .text-2xl {
- font-size: var(--text-2xl);
- line-height: var(--tw-leading, var(--text-2xl--line-height));
- }
-
- .text-3xl {
- font-size: var(--text-3xl);
- line-height: var(--tw-leading, var(--text-3xl--line-height));
- }
-
- .text-4xl {
- font-size: var(--text-4xl);
- line-height: var(--tw-leading, var(--text-4xl--line-height));
- }
-
- .text-5xl {
- font-size: var(--text-5xl);
- line-height: var(--tw-leading, var(--text-5xl--line-height));
- }
-
- .text-base {
- font-size: var(--text-base);
- line-height: var(--tw-leading, var(--text-base--line-height));
- }
-
- .text-lg {
- font-size: var(--text-lg);
- line-height: var(--tw-leading, var(--text-lg--line-height));
- }
-
- .text-sm {
- font-size: var(--text-sm);
- line-height: var(--tw-leading, var(--text-sm--line-height));
- }
-
- .text-xl {
- font-size: var(--text-xl);
- line-height: var(--tw-leading, var(--text-xl--line-height));
- }
-
- .text-xs {
- font-size: var(--text-xs);
- line-height: var(--tw-leading, var(--text-xs--line-height));
- }
-
- .text-\[0\.8rem\] {
- font-size: .8rem;
- }
-
- .leading-none {
- --tw-leading: 1;
- line-height: 1;
- }
-
- .leading-relaxed {
- --tw-leading: var(--leading-relaxed);
- line-height: var(--leading-relaxed);
- }
-
- .font-bold {
- --tw-font-weight: var(--font-weight-bold);
- font-weight: var(--font-weight-bold);
- }
-
- .font-medium {
- --tw-font-weight: var(--font-weight-medium);
- font-weight: var(--font-weight-medium);
- }
-
- .font-normal {
- --tw-font-weight: var(--font-weight-normal);
- font-weight: var(--font-weight-normal);
- }
-
- .font-semibold {
- --tw-font-weight: var(--font-weight-semibold);
- font-weight: var(--font-weight-semibold);
- }
-
- .tracking-tight {
- --tw-tracking: var(--tracking-tight);
- letter-spacing: var(--tracking-tight);
- }
-
- .whitespace-nowrap {
- white-space: nowrap;
- }
-
- .whitespace-pre-line {
- white-space: pre-line;
- }
-
- .whitespace-pre-wrap {
- white-space: pre-wrap;
- }
-
- .text-accent-foreground {
- color: var(--accent-foreground);
- }
-
- .text-amber-800 {
- color: var(--color-amber-800);
- }
-
- .text-blue-400 {
- color: var(--color-blue-400);
- }
-
- .text-blue-600 {
- color: var(--color-blue-600);
- }
-
- .text-blue-700 {
- color: var(--color-blue-700);
- }
-
- .text-blue-800 {
- color: var(--color-blue-800);
- }
-
- .text-blue-900 {
- color: var(--color-blue-900);
- }
-
- .text-card-foreground {
- color: var(--card-foreground);
- }
-
- .text-current {
- color: currentColor;
- }
-
- .text-cyan-600 {
- color: var(--color-cyan-600);
- }
-
- .text-cyan-700 {
- color: var(--color-cyan-700);
- }
-
- .text-cyan-800 {
- color: var(--color-cyan-800);
- }
-
- .text-cyan-900 {
- color: var(--color-cyan-900);
- }
-
- .text-destructive {
- color: var(--destructive);
- }
-
- .text-emerald-800 {
- color: var(--color-emerald-800);
- }
-
- .text-foreground {
- color: var(--foreground);
- }
-
- .text-gray-300 {
- color: var(--color-gray-300);
- }
-
- .text-gray-400 {
- color: var(--color-gray-400);
- }
-
- .text-gray-500 {
- color: var(--color-gray-500);
- }
-
- .text-gray-600 {
- color: var(--color-gray-600);
- }
-
- .text-gray-700 {
- color: var(--color-gray-700);
- }
-
- .text-gray-800 {
- color: var(--color-gray-800);
- }
-
- .text-green-400 {
- color: var(--color-green-400);
- }
-
- .text-green-500 {
- color: var(--color-green-500);
- }
-
- .text-green-600 {
- color: var(--color-green-600);
- }
-
- .text-green-700 {
- color: var(--color-green-700);
- }
-
- .text-green-800 {
- color: var(--color-green-800);
- }
-
- .text-green-900 {
- color: var(--color-green-900);
- }
-
- .text-indigo-600 {
- color: var(--color-indigo-600);
- }
-
- .text-indigo-700 {
- color: var(--color-indigo-700);
- }
-
- .text-indigo-800 {
- color: var(--color-indigo-800);
- }
-
- .text-lime-800 {
- color: var(--color-lime-800);
- }
-
- .text-muted-foreground {
- color: var(--muted-foreground);
- }
-
- .text-orange-400 {
- color: var(--color-orange-400);
- }
-
- .text-orange-500 {
- color: var(--color-orange-500);
- }
-
- .text-orange-600 {
- color: var(--color-orange-600);
- }
-
- .text-orange-700 {
- color: var(--color-orange-700);
- }
-
- .text-orange-800 {
- color: var(--color-orange-800);
- }
-
- .text-orange-900 {
- color: var(--color-orange-900);
- }
-
- .text-pink-600 {
- color: var(--color-pink-600);
- }
-
- .text-pink-700 {
- color: var(--color-pink-700);
- }
-
- .text-pink-800 {
- color: var(--color-pink-800);
- }
-
- .text-popover-foreground {
- color: var(--popover-foreground);
- }
-
- .text-primary {
- color: var(--primary);
- }
-
- .text-primary-foreground {
- color: var(--primary-foreground);
- }
-
- .text-purple-600 {
- color: var(--color-purple-600);
- }
-
- .text-purple-700 {
- color: var(--color-purple-700);
- }
-
- .text-purple-800 {
- color: var(--color-purple-800);
- }
-
- .text-purple-900 {
- color: var(--color-purple-900);
- }
-
- .text-red-500 {
- color: var(--color-red-500);
- }
-
- .text-red-600 {
- color: var(--color-red-600);
- }
-
- .text-red-700 {
- color: var(--color-red-700);
- }
-
- .text-red-800 {
- color: var(--color-red-800);
- }
-
- .text-red-900 {
- color: var(--color-red-900);
- }
-
- .text-secondary-foreground {
- color: var(--secondary-foreground);
- }
-
- .text-teal-600 {
- color: var(--color-teal-600);
- }
-
- .text-teal-700 {
- color: var(--color-teal-700);
- }
-
- .text-teal-800 {
- color: var(--color-teal-800);
- }
-
- .text-white {
- color: var(--color-white);
- }
-
- .text-yellow-400 {
- color: var(--color-yellow-400);
- }
-
- .text-yellow-500 {
- color: var(--color-yellow-500);
- }
-
- .text-yellow-600 {
- color: var(--color-yellow-600);
- }
-
- .text-yellow-700 {
- color: var(--color-yellow-700);
- }
-
- .text-yellow-800 {
- color: var(--color-yellow-800);
- }
-
- .text-yellow-900 {
- color: var(--color-yellow-900);
- }
-
- .uppercase {
- text-transform: uppercase;
- }
-
- .line-through {
- text-decoration-line: line-through;
- }
-
- .underline-offset-4 {
- text-underline-offset: 4px;
- }
-
- .opacity-0 {
- opacity: 0;
- }
-
- .opacity-20 {
- opacity: .2;
- }
-
- .opacity-50 {
- opacity: .5;
- }
-
- .opacity-60 {
- opacity: .6;
- }
-
- .opacity-70 {
- opacity: .7;
- }
-
- .shadow {
- --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, #0000001a), 0 1px 2px -1px var(--tw-shadow-color, #0000001a);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
-
- .shadow-lg {
- --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, #0000001a), 0 4px 6px -4px var(--tw-shadow-color, #0000001a);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
-
- .shadow-md {
- --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, #0000001a), 0 2px 4px -2px var(--tw-shadow-color, #0000001a);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
-
- .shadow-sm {
- --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, #0000001a), 0 1px 2px -1px var(--tw-shadow-color, #0000001a);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
-
- .shadow-xl {
- --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, #0000001a), 0 8px 10px -6px var(--tw-shadow-color, #0000001a);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
-
- .shadow-xs {
- --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, #0000000d);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
-
- .ring-0 {
- --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
-
- .ring-2 {
- --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
-
- .ring-green-500 {
- --tw-ring-color: var(--color-green-500);
- }
-
- .ring-ring\/50 {
- --tw-ring-color: var(--ring);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .ring-ring\/50 {
- --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);
- }
- }
-
- .ring-offset-background {
- --tw-ring-offset-color: var(--background);
- }
-
- .outline-hidden {
- --tw-outline-style: none;
- outline-style: none;
- }
-
- @media (forced-colors: active) {
- .outline-hidden {
- outline-offset: 2px;
- outline: 2px solid #0000;
- }
- }
-
- .outline {
- outline-style: var(--tw-outline-style);
- outline-width: 1px;
- }
-
- .drop-shadow {
- --tw-drop-shadow-size: drop-shadow(0 1px 2px var(--tw-drop-shadow-color, #0000001a)) drop-shadow(0 1px 1px var(--tw-drop-shadow-color, #0000000f));
- --tw-drop-shadow: drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f);
- filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );
- }
-
- .drop-shadow-lg {
- --tw-drop-shadow-size: drop-shadow(0 4px 4px var(--tw-drop-shadow-color, #00000026));
- --tw-drop-shadow: drop-shadow(var(--drop-shadow-lg));
- filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );
- }
-
- .\!filter {
- filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, ) !important;
- }
-
- .filter {
- filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );
- }
-
- .backdrop-blur {
- --tw-backdrop-blur: blur(8px);
- -webkit-backdrop-filter: var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, );
- backdrop-filter: var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, );
- }
-
- .transition {
- transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter;
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
- transition-duration: var(--tw-duration, var(--default-transition-duration));
- }
-
- .transition-\[color\,box-shadow\] {
- transition-property: color, box-shadow;
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
- transition-duration: var(--tw-duration, var(--default-transition-duration));
- }
-
- .transition-all {
- transition-property: all;
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
- transition-duration: var(--tw-duration, var(--default-transition-duration));
- }
-
- .transition-colors {
- transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
- transition-duration: var(--tw-duration, var(--default-transition-duration));
- }
-
- .transition-opacity {
- transition-property: opacity;
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
- transition-duration: var(--tw-duration, var(--default-transition-duration));
- }
-
- .transition-shadow {
- transition-property: box-shadow;
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
- transition-duration: var(--tw-duration, var(--default-transition-duration));
- }
-
- .transition-transform {
- transition-property: transform, translate, scale, rotate;
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
- transition-duration: var(--tw-duration, var(--default-transition-duration));
- }
-
- .transition-none {
- transition-property: none;
- }
-
- .duration-200 {
- --tw-duration: .2s;
- transition-duration: .2s;
- }
-
- .duration-300 {
- --tw-duration: .3s;
- transition-duration: .3s;
- }
-
- .duration-500 {
- --tw-duration: .5s;
- transition-duration: .5s;
- }
-
- .outline-none {
- --tw-outline-style: none;
- outline-style: none;
- }
-
- .select-none {
- -webkit-user-select: none;
- user-select: none;
- }
-
- .running {
- animation-play-state: running;
- }
-
- @media (hover: hover) {
- .group-hover\:opacity-100:is(:where(.group):hover *) {
- opacity: 1;
- }
- }
-
- .group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled="true"] *) {
- pointer-events: none;
- }
-
- .group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled="true"] *) {
- opacity: .5;
- }
-
- .peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled ~ *) {
- cursor: not-allowed;
- }
-
- .peer-disabled\:opacity-50:is(:where(.peer):disabled ~ *) {
- opacity: .5;
- }
-
- .selection\:bg-primary ::selection, .selection\:bg-primary::selection {
- background-color: var(--primary);
- }
-
- .selection\:text-primary-foreground ::selection, .selection\:text-primary-foreground::selection {
- color: var(--primary-foreground);
- }
-
- .file\:inline-flex::file-selector-button {
- display: inline-flex;
- }
-
- .file\:h-7::file-selector-button {
- height: calc(var(--spacing) * 7);
- }
-
- .file\:border-0::file-selector-button {
- border-style: var(--tw-border-style);
- border-width: 0;
- }
-
- .file\:bg-transparent::file-selector-button {
- background-color: #0000;
- }
-
- .file\:text-sm::file-selector-button {
- font-size: var(--text-sm);
- line-height: var(--tw-leading, var(--text-sm--line-height));
- }
-
- .file\:font-medium::file-selector-button {
- --tw-font-weight: var(--font-weight-medium);
- font-weight: var(--font-weight-medium);
- }
-
- .file\:text-foreground::file-selector-button {
- color: var(--foreground);
- }
-
- .placeholder\:text-muted-foreground::placeholder {
- color: var(--muted-foreground);
- }
-
- .last\:mb-0:last-child {
- margin-bottom: calc(var(--spacing) * 0);
- }
-
- .last\:border-r-0:last-child {
- border-right-style: var(--tw-border-style);
- border-right-width: 0;
- }
-
- .last\:border-b-0:last-child {
- border-bottom-style: var(--tw-border-style);
- border-bottom-width: 0;
- }
-
- .last\:pb-0:last-child {
- padding-bottom: calc(var(--spacing) * 0);
- }
-
- .focus-within\:relative:focus-within {
- position: relative;
- }
-
- .focus-within\:z-20:focus-within {
- z-index: 20;
- }
-
- @media (hover: hover) {
- .hover\:scale-110:hover {
- --tw-scale-x: 110%;
- --tw-scale-y: 110%;
- --tw-scale-z: 110%;
- scale: var(--tw-scale-x) var(--tw-scale-y);
- }
- }
-
- @media (hover: hover) {
- .hover\:border-blue-500:hover {
- border-color: var(--color-blue-500);
- }
- }
-
- @media (hover: hover) {
- .hover\:border-green-300:hover {
- border-color: var(--color-green-300);
- }
- }
-
- @media (hover: hover) {
- .hover\:border-green-500:hover {
- border-color: var(--color-green-500);
- }
- }
-
- @media (hover: hover) {
- .hover\:border-orange-500:hover {
- border-color: var(--color-orange-500);
- }
- }
-
- @media (hover: hover) {
- .hover\:border-purple-500:hover {
- border-color: var(--color-purple-500);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-accent:hover {
- background-color: var(--accent);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-blue-50:hover {
- background-color: var(--color-blue-50);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-blue-700:hover {
- background-color: var(--color-blue-700);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-destructive\/90:hover {
- background-color: var(--destructive);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .hover\:bg-destructive\/90:hover {
- background-color: color-mix(in oklab, var(--destructive) 90%, transparent);
- }
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-gray-50:hover {
- background-color: var(--color-gray-50);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-gray-100:hover {
- background-color: var(--color-gray-100);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-gray-200:hover {
- background-color: var(--color-gray-200);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-green-50\/50:hover {
- background-color: color-mix(in srgb, oklch(.982 .018 155.826) 50%, transparent);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .hover\:bg-green-50\/50:hover {
- background-color: color-mix(in oklab, var(--color-green-50) 50%, transparent);
- }
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-green-200:hover {
- background-color: var(--color-green-200);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-green-700:hover {
- background-color: var(--color-green-700);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-muted\/50:hover {
- background-color: var(--muted);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .hover\:bg-muted\/50:hover {
- background-color: color-mix(in oklab, var(--muted) 50%, transparent);
- }
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-orange-50:hover {
- background-color: var(--color-orange-50);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-orange-700:hover {
- background-color: var(--color-orange-700);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-primary:hover {
- background-color: var(--primary);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-primary\/90:hover {
- background-color: var(--primary);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .hover\:bg-primary\/90:hover {
- background-color: color-mix(in oklab, var(--primary) 90%, transparent);
- }
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-purple-50:hover {
- background-color: var(--color-purple-50);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-purple-700:hover {
- background-color: var(--color-purple-700);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-red-50:hover {
- background-color: var(--color-red-50);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-red-700:hover {
- background-color: var(--color-red-700);
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-secondary\/80:hover {
- background-color: var(--secondary);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .hover\:bg-secondary\/80:hover {
- background-color: color-mix(in oklab, var(--secondary) 80%, transparent);
- }
- }
- }
-
- @media (hover: hover) {
- .hover\:bg-yellow-700:hover {
- background-color: var(--color-yellow-700);
- }
- }
-
- @media (hover: hover) {
- .hover\:text-accent-foreground:hover {
- color: var(--accent-foreground);
- }
- }
-
- @media (hover: hover) {
- .hover\:text-blue-600:hover {
- color: var(--color-blue-600);
- }
- }
-
- @media (hover: hover) {
- .hover\:text-destructive:hover {
- color: var(--destructive);
- }
- }
-
- @media (hover: hover) {
- .hover\:text-foreground:hover {
- color: var(--foreground);
- }
- }
-
- @media (hover: hover) {
- .hover\:text-green-700:hover {
- color: var(--color-green-700);
- }
- }
-
- @media (hover: hover) {
- .hover\:text-primary-foreground:hover {
- color: var(--primary-foreground);
- }
- }
-
- @media (hover: hover) {
- .hover\:text-red-700:hover {
- color: var(--color-red-700);
- }
- }
-
- @media (hover: hover) {
- .hover\:underline:hover {
- text-decoration-line: underline;
- }
- }
-
- @media (hover: hover) {
- .hover\:opacity-80:hover {
- opacity: .8;
- }
- }
-
- @media (hover: hover) {
- .hover\:opacity-100:hover {
- opacity: 1;
- }
- }
-
- @media (hover: hover) {
- .hover\:shadow-lg:hover {
- --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, #0000001a), 0 4px 6px -4px var(--tw-shadow-color, #0000001a);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
- }
-
- @media (hover: hover) {
- .hover\:shadow-md:hover {
- --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, #0000001a), 0 2px 4px -2px var(--tw-shadow-color, #0000001a);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
- }
-
- @media (hover: hover) {
- .hover\:ring-4:hover {
- --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
- }
-
- .focus\:bg-accent:focus {
- background-color: var(--accent);
- }
-
- .focus\:bg-primary:focus {
- background-color: var(--primary);
- }
-
- .focus\:text-accent-foreground:focus {
- color: var(--accent-foreground);
- }
-
- .focus\:text-primary-foreground:focus {
- color: var(--primary-foreground);
- }
-
- .focus\:ring-2:focus {
- --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
-
- .focus\:ring-ring:focus {
- --tw-ring-color: var(--ring);
- }
-
- .focus\:ring-offset-2:focus {
- --tw-ring-offset-width: 2px;
- --tw-ring-offset-shadow: var(--tw-ring-inset, ) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
- }
-
- .focus\:outline-hidden:focus {
- --tw-outline-style: none;
- outline-style: none;
- }
-
- @media (forced-colors: active) {
- .focus\:outline-hidden:focus {
- outline-offset: 2px;
- outline: 2px solid #0000;
- }
- }
-
- .focus-visible\:border-ring:focus-visible {
- border-color: var(--ring);
- }
-
- .focus-visible\:ring-4:focus-visible {
- --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
-
- .focus-visible\:ring-\[3px\]:focus-visible {
- --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
-
- .focus-visible\:ring-destructive\/20:focus-visible {
- --tw-ring-color: var(--destructive);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .focus-visible\:ring-destructive\/20:focus-visible {
- --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);
- }
- }
-
- .focus-visible\:ring-ring\/50:focus-visible {
- --tw-ring-color: var(--ring);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .focus-visible\:ring-ring\/50:focus-visible {
- --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);
- }
- }
-
- .focus-visible\:outline-hidden:focus-visible {
- --tw-outline-style: none;
- outline-style: none;
- }
-
- @media (forced-colors: active) {
- .focus-visible\:outline-hidden:focus-visible {
- outline-offset: 2px;
- outline: 2px solid #0000;
- }
- }
-
- .focus-visible\:outline-1:focus-visible {
- outline-style: var(--tw-outline-style);
- outline-width: 1px;
- }
-
- .focus-visible\:outline-ring:focus-visible {
- outline-color: var(--ring);
- }
-
- .disabled\:pointer-events-none:disabled {
- pointer-events: none;
- }
-
- .disabled\:cursor-not-allowed:disabled {
- cursor: not-allowed;
- }
-
- .disabled\:opacity-50:disabled {
- opacity: .5;
- }
-
- .has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot="card-action"]) {
- grid-template-columns: 1fr auto;
- }
-
- .has-\[\>svg\]\:grid-cols-\[calc\(var\(--spacing\)\*4\)_1fr\]:has( > svg) {
- grid-template-columns: calc(var(--spacing) * 4) 1fr;
- }
-
- .has-\[\>svg\]\:gap-x-3:has( > svg) {
- column-gap: calc(var(--spacing) * 3);
- }
-
- .has-\[\>svg\]\:px-2\.5:has( > svg) {
- padding-inline: calc(var(--spacing) * 2.5);
- }
-
- .has-\[\>svg\]\:px-3:has( > svg) {
- padding-inline: calc(var(--spacing) * 3);
- }
-
- .has-\[\>svg\]\:px-4:has( > svg) {
- padding-inline: calc(var(--spacing) * 4);
- }
-
- .aria-invalid\:border-destructive[aria-invalid="true"] {
- border-color: var(--destructive);
- }
-
- .aria-invalid\:ring-destructive\/20[aria-invalid="true"] {
- --tw-ring-color: var(--destructive);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .aria-invalid\:ring-destructive\/20[aria-invalid="true"] {
- --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);
- }
- }
-
- .aria-selected\:bg-accent[aria-selected="true"] {
- background-color: var(--accent);
- }
-
- .aria-selected\:bg-primary[aria-selected="true"] {
- background-color: var(--primary);
- }
-
- .aria-selected\:text-accent-foreground[aria-selected="true"] {
- color: var(--accent-foreground);
- }
-
- .aria-selected\:text-muted-foreground[aria-selected="true"] {
- color: var(--muted-foreground);
- }
-
- .aria-selected\:text-primary-foreground[aria-selected="true"] {
- color: var(--primary-foreground);
- }
-
- .aria-selected\:opacity-100[aria-selected="true"] {
- opacity: 1;
- }
-
- .data-\[disabled\]\:pointer-events-none[data-disabled] {
- pointer-events: none;
- }
-
- .data-\[disabled\]\:opacity-50[data-disabled] {
- opacity: .5;
- }
-
- .data-\[orientation\=horizontal\]\:h-4[data-orientation="horizontal"] {
- height: calc(var(--spacing) * 4);
- }
-
- .data-\[orientation\=horizontal\]\:h-full[data-orientation="horizontal"] {
- height: 100%;
- }
-
- .data-\[orientation\=horizontal\]\:w-full[data-orientation="horizontal"] {
- width: 100%;
- }
-
- .data-\[orientation\=vertical\]\:h-full[data-orientation="vertical"] {
- height: 100%;
- }
-
- .data-\[orientation\=vertical\]\:min-h-44[data-orientation="vertical"] {
- min-height: calc(var(--spacing) * 44);
- }
-
- .data-\[orientation\=vertical\]\:w-1\.5[data-orientation="vertical"] {
- width: calc(var(--spacing) * 1.5);
- }
-
- .data-\[orientation\=vertical\]\:w-auto[data-orientation="vertical"] {
- width: auto;
- }
-
- .data-\[orientation\=vertical\]\:w-full[data-orientation="vertical"] {
- width: 100%;
- }
-
- .data-\[orientation\=vertical\]\:flex-col[data-orientation="vertical"] {
- flex-direction: column;
- }
-
- .data-\[placeholder\]\:text-muted-foreground[data-placeholder] {
- color: var(--muted-foreground);
- }
-
- .data-\[side\=bottom\]\:translate-y-1[data-side="bottom"] {
- --tw-translate-y: calc(var(--spacing) * 1);
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
-
- .data-\[side\=bottom\]\:slide-in-from-top-2[data-side="bottom"] {
- --tw-enter-translate-y: calc(2 * var(--spacing) * -1);
- }
-
- .data-\[side\=left\]\:-translate-x-1[data-side="left"] {
- --tw-translate-x: calc(var(--spacing) * -1);
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
-
- .data-\[side\=left\]\:slide-in-from-right-2[data-side="left"] {
- --tw-enter-translate-x: calc(2 * var(--spacing));
- }
-
- .data-\[side\=right\]\:translate-x-1[data-side="right"] {
- --tw-translate-x: calc(var(--spacing) * 1);
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
-
- .data-\[side\=right\]\:slide-in-from-left-2[data-side="right"] {
- --tw-enter-translate-x: calc(2 * var(--spacing) * -1);
- }
-
- .data-\[side\=top\]\:-translate-y-1[data-side="top"] {
- --tw-translate-y: calc(var(--spacing) * -1);
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
-
- .data-\[side\=top\]\:slide-in-from-bottom-2[data-side="top"] {
- --tw-enter-translate-y: calc(2 * var(--spacing));
- }
-
- .data-\[size\=default\]\:h-9[data-size="default"] {
- height: calc(var(--spacing) * 9);
- }
-
- .data-\[size\=sm\]\:h-8[data-size="sm"] {
- height: calc(var(--spacing) * 8);
- }
-
- :is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90 > *)[data-slot="alert-description"] {
- color: var(--destructive);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- :is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90 > *)[data-slot="alert-description"] {
- color: color-mix(in oklab, var(--destructive) 90%, transparent);
- }
- }
-
- :is(.\*\:data-\[slot\=select-value\]\:line-clamp-1 > *)[data-slot="select-value"] {
- -webkit-line-clamp: 1;
- -webkit-box-orient: vertical;
- display: -webkit-box;
- overflow: hidden;
- }
-
- :is(.\*\:data-\[slot\=select-value\]\:flex > *)[data-slot="select-value"] {
- display: flex;
- }
-
- :is(.\*\:data-\[slot\=select-value\]\:items-center > *)[data-slot="select-value"] {
- align-items: center;
- }
-
- :is(.\*\:data-\[slot\=select-value\]\:gap-2 > *)[data-slot="select-value"] {
- gap: calc(var(--spacing) * 2);
- }
-
- .data-\[state\=active\]\:bg-card[data-state="active"] {
- background-color: var(--card);
- }
-
- .data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state="checked"] {
- --tw-translate-x: calc(100% - 2px);
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
-
- .data-\[state\=checked\]\:border-primary[data-state="checked"] {
- border-color: var(--primary);
- }
-
- .data-\[state\=checked\]\:bg-primary[data-state="checked"] {
- background-color: var(--primary);
- }
-
- .data-\[state\=checked\]\:text-primary-foreground[data-state="checked"] {
- color: var(--primary-foreground);
- }
-
- .data-\[state\=closed\]\:animate-out[data-state="closed"] {
- animation: exit var(--tw-duration, .15s) var(--tw-ease, ease);
- }
-
- .data-\[state\=closed\]\:fade-out-0[data-state="closed"] {
- --tw-exit-opacity: 0;
- }
-
- .data-\[state\=closed\]\:zoom-out-95[data-state="closed"] {
- --tw-exit-scale: .95;
- }
-
- .data-\[state\=open\]\:animate-in[data-state="open"] {
- animation: enter var(--tw-duration, .15s) var(--tw-ease, ease);
- }
-
- .data-\[state\=open\]\:bg-accent[data-state="open"] {
- background-color: var(--accent);
- }
-
- .data-\[state\=open\]\:text-muted-foreground[data-state="open"] {
- color: var(--muted-foreground);
- }
-
- .data-\[state\=open\]\:fade-in-0[data-state="open"] {
- --tw-enter-opacity: 0;
- }
-
- .data-\[state\=open\]\:zoom-in-95[data-state="open"] {
- --tw-enter-scale: .95;
- }
-
- .data-\[state\=selected\]\:bg-muted[data-state="selected"] {
- background-color: var(--muted);
- }
-
- .data-\[state\=unchecked\]\:translate-x-0[data-state="unchecked"] {
- --tw-translate-x: calc(var(--spacing) * 0);
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
-
- .data-\[state\=unchecked\]\:bg-switch-background[data-state="unchecked"] {
- background-color: var(--switch-background);
- }
-
- @media (width >= 40rem) {
- .sm\:max-w-4xl {
- max-width: var(--container-4xl);
- }
- }
-
- @media (width >= 40rem) {
- .sm\:max-w-md {
- max-width: var(--container-md);
- }
- }
-
- @media (width >= 40rem) {
- .sm\:flex-row {
- flex-direction: row;
- }
- }
-
- @media (width >= 40rem) {
- .sm\:justify-end {
- justify-content: flex-end;
- }
- }
-
- @media (width >= 40rem) {
- .sm\:text-left {
- text-align: left;
- }
- }
-
- @media (width >= 48rem) {
- .md\:col-span-2 {
- grid-column: span 2 / span 2;
- }
- }
-
- @media (width >= 48rem) {
- .md\:inline {
- display: inline;
- }
- }
-
- @media (width >= 48rem) {
- .md\:grid-cols-2 {
- grid-template-columns: repeat(2, minmax(0, 1fr));
- }
- }
-
- @media (width >= 48rem) {
- .md\:grid-cols-3 {
- grid-template-columns: repeat(3, minmax(0, 1fr));
- }
- }
-
- @media (width >= 48rem) {
- .md\:grid-cols-4 {
- grid-template-columns: repeat(4, minmax(0, 1fr));
- }
- }
-
- @media (width >= 48rem) {
- .md\:grid-cols-5 {
- grid-template-columns: repeat(5, minmax(0, 1fr));
- }
- }
-
- @media (width >= 48rem) {
- .md\:text-sm {
- font-size: var(--text-sm);
- line-height: var(--tw-leading, var(--text-sm--line-height));
- }
- }
-
- @media (width >= 64rem) {
- .lg\:col-span-2 {
- grid-column: span 2 / span 2;
- }
- }
-
- @media (width >= 64rem) {
- .lg\:grid-cols-2 {
- grid-template-columns: repeat(2, minmax(0, 1fr));
- }
- }
-
- @media (width >= 64rem) {
- .lg\:grid-cols-3 {
- grid-template-columns: repeat(3, minmax(0, 1fr));
- }
- }
-
- @media (width >= 64rem) {
- .lg\:grid-cols-4 {
- grid-template-columns: repeat(4, minmax(0, 1fr));
- }
- }
-
- @media (width >= 64rem) {
- .lg\:grid-cols-7 {
- grid-template-columns: repeat(7, minmax(0, 1fr));
- }
- }
-
- .dark\:border-input:is(.dark *) {
- border-color: var(--input);
- }
-
- .dark\:bg-destructive\/60:is(.dark *) {
- background-color: var(--destructive);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .dark\:bg-destructive\/60:is(.dark *) {
- background-color: color-mix(in oklab, var(--destructive) 60%, transparent);
- }
- }
-
- .dark\:bg-input\/30:is(.dark *) {
- background-color: var(--input);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .dark\:bg-input\/30:is(.dark *) {
- background-color: color-mix(in oklab, var(--input) 30%, transparent);
- }
- }
-
- .dark\:text-muted-foreground:is(.dark *) {
- color: var(--muted-foreground);
- }
-
- @media (hover: hover) {
- .dark\:hover\:bg-accent\/50:is(.dark *):hover {
- background-color: var(--accent);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .dark\:hover\:bg-accent\/50:is(.dark *):hover {
- background-color: color-mix(in oklab, var(--accent) 50%, transparent);
- }
- }
- }
-
- @media (hover: hover) {
- .dark\:hover\:bg-input\/50:is(.dark *):hover {
- background-color: var(--input);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .dark\:hover\:bg-input\/50:is(.dark *):hover {
- background-color: color-mix(in oklab, var(--input) 50%, transparent);
- }
- }
- }
-
- .dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible {
- --tw-ring-color: var(--destructive);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible {
- --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);
- }
- }
-
- .dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid="true"] {
- --tw-ring-color: var(--destructive);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid="true"] {
- --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);
- }
- }
-
- .dark\:data-\[state\=active\]\:border-input:is(.dark *)[data-state="active"] {
- border-color: var(--input);
- }
-
- .dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state="active"] {
- background-color: var(--input);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state="active"] {
- background-color: color-mix(in oklab, var(--input) 30%, transparent);
- }
- }
-
- .dark\:data-\[state\=active\]\:text-foreground:is(.dark *)[data-state="active"] {
- color: var(--foreground);
- }
-
- .dark\:data-\[state\=checked\]\:bg-primary:is(.dark *)[data-state="checked"] {
- background-color: var(--primary);
- }
-
- .dark\:data-\[state\=checked\]\:bg-primary-foreground:is(.dark *)[data-state="checked"] {
- background-color: var(--primary-foreground);
- }
-
- .dark\:data-\[state\=unchecked\]\:bg-card-foreground:is(.dark *)[data-state="unchecked"] {
- background-color: var(--card-foreground);
- }
-
- .dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state="unchecked"] {
- background-color: var(--input);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- .dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state="unchecked"] {
- background-color: color-mix(in oklab, var(--input) 80%, transparent);
- }
- }
-
- .\[\&_p\]\:leading-relaxed p {
- --tw-leading: var(--leading-relaxed);
- line-height: var(--leading-relaxed);
- }
-
- .\[\&_svg\]\:pointer-events-none svg {
- pointer-events: none;
- }
-
- .\[\&_svg\]\:shrink-0 svg {
- flex-shrink: 0;
- }
-
- .\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*="size-"]) {
- width: calc(var(--spacing) * 4);
- height: calc(var(--spacing) * 4);
- }
-
- .\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*="text-"]) {
- color: var(--muted-foreground);
- }
-
- .\[\&_tr\]\:border-b tr {
- border-bottom-style: var(--tw-border-style);
- border-bottom-width: 1px;
- }
-
- .\[\&_tr\:last-child\]\:border-0 tr:last-child {
- border-style: var(--tw-border-style);
- border-width: 0;
- }
-
- .\[\&\:has\(\>\.day-range-end\)\]\:rounded-r-md:has( > .day-range-end) {
- border-top-right-radius: calc(var(--radius) - 2px);
- border-bottom-right-radius: calc(var(--radius) - 2px);
- }
-
- .\[\&\:has\(\>\.day-range-start\)\]\:rounded-l-md:has( > .day-range-start) {
- border-top-left-radius: calc(var(--radius) - 2px);
- border-bottom-left-radius: calc(var(--radius) - 2px);
- }
-
- .\[\&\:has\(\[aria-selected\]\)\]\:rounded-md:has([aria-selected]) {
- border-radius: calc(var(--radius) - 2px);
- }
-
- .\[\&\:has\(\[aria-selected\]\)\]\:bg-accent:has([aria-selected]) {
- background-color: var(--accent);
- }
-
- .first\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-l-md:first-child:has([aria-selected]) {
- border-top-left-radius: calc(var(--radius) - 2px);
- border-bottom-left-radius: calc(var(--radius) - 2px);
- }
-
- .last\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-r-md:last-child:has([aria-selected]) {
- border-top-right-radius: calc(var(--radius) - 2px);
- border-bottom-right-radius: calc(var(--radius) - 2px);
- }
-
- .\[\&\:has\(\[aria-selected\]\.day-range-end\)\]\:rounded-r-md:has([aria-selected].day-range-end) {
- border-top-right-radius: calc(var(--radius) - 2px);
- border-bottom-right-radius: calc(var(--radius) - 2px);
- }
-
- .\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role="checkbox"]) {
- padding-right: calc(var(--spacing) * 0);
- }
-
- .\[\.border-b\]\:pb-6.border-b {
- padding-bottom: calc(var(--spacing) * 6);
- }
-
- .\[\.border-t\]\:pt-6.border-t {
- padding-top: calc(var(--spacing) * 6);
- }
-
- :is(.\*\:\[span\]\:last\:flex > *):is(span):last-child {
- display: flex;
- }
-
- :is(.\*\:\[span\]\:last\:items-center > *):is(span):last-child {
- align-items: center;
- }
-
- :is(.\*\:\[span\]\:last\:gap-2 > *):is(span):last-child {
- gap: calc(var(--spacing) * 2);
- }
-
- .\[\&\:last-child\]\:pb-6:last-child {
- padding-bottom: calc(var(--spacing) * 6);
- }
-
- .\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\] > [role="checkbox"] {
- --tw-translate-y: 2px;
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
-
- .\[\&\>svg\]\:pointer-events-none > svg {
- pointer-events: none;
- }
-
- .\[\&\>svg\]\:size-3 > svg {
- width: calc(var(--spacing) * 3);
- height: calc(var(--spacing) * 3);
- }
-
- .\[\&\>svg\]\:size-4 > svg {
- width: calc(var(--spacing) * 4);
- height: calc(var(--spacing) * 4);
- }
-
- .\[\&\>svg\]\:translate-y-0\.5 > svg {
- --tw-translate-y: calc(var(--spacing) * .5);
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
-
- .\[\&\>svg\]\:text-current > svg {
- color: currentColor;
- }
-
- .\[\&\>tr\]\:last\:border-b-0 > tr:last-child {
- border-bottom-style: var(--tw-border-style);
- border-bottom-width: 0;
- }
-
- @media (hover: hover) {
- a.\[a\&\]\:hover\:bg-accent:hover {
- background-color: var(--accent);
- }
- }
-
- @media (hover: hover) {
- a.\[a\&\]\:hover\:bg-destructive\/90:hover {
- background-color: var(--destructive);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- a.\[a\&\]\:hover\:bg-destructive\/90:hover {
- background-color: color-mix(in oklab, var(--destructive) 90%, transparent);
- }
- }
- }
-
- @media (hover: hover) {
- a.\[a\&\]\:hover\:bg-primary\/90:hover {
- background-color: var(--primary);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- a.\[a\&\]\:hover\:bg-primary\/90:hover {
- background-color: color-mix(in oklab, var(--primary) 90%, transparent);
- }
- }
- }
-
- @media (hover: hover) {
- a.\[a\&\]\:hover\:bg-secondary\/90:hover {
- background-color: var(--secondary);
- }
-
- @supports (color: color-mix(in lab, red, red)) {
- a.\[a\&\]\:hover\:bg-secondary\/90:hover {
- background-color: color-mix(in oklab, var(--secondary) 90%, transparent);
- }
- }
- }
-
- @media (hover: hover) {
- a.\[a\&\]\:hover\:text-accent-foreground:hover {
- color: var(--accent-foreground);
- }
- }
-}
-
-:root {
- --font-size: 16px;
- --background: #fff;
- --foreground: oklch(.145 0 0);
- --card: #fff;
- --card-foreground: oklch(.145 0 0);
- --popover: oklch(1 0 0);
- --popover-foreground: oklch(.145 0 0);
- --primary: #030213;
- --primary-foreground: oklch(1 0 0);
- --secondary: oklch(.95 .0058 264.53);
- --secondary-foreground: #030213;
- --muted: #ececf0;
- --muted-foreground: #717182;
- --accent: #e9ebef;
- --accent-foreground: #030213;
- --destructive: #d4183d;
- --destructive-foreground: #fff;
- --border: #0000001a;
- --input: transparent;
- --input-background: #f3f3f5;
- --switch-background: #cbced4;
- --font-weight-medium: 500;
- --font-weight-normal: 400;
- --ring: oklch(.708 0 0);
- --chart-1: oklch(.646 .222 41.116);
- --chart-2: oklch(.6 .118 184.704);
- --chart-3: oklch(.398 .07 227.392);
- --chart-4: oklch(.828 .189 84.429);
- --chart-5: oklch(.769 .188 70.08);
- --radius: .625rem;
- --sidebar: oklch(.985 0 0);
- --sidebar-foreground: oklch(.145 0 0);
- --sidebar-primary: #030213;
- --sidebar-primary-foreground: oklch(.985 0 0);
- --sidebar-accent: oklch(.97 0 0);
- --sidebar-accent-foreground: oklch(.205 0 0);
- --sidebar-border: oklch(.922 0 0);
- --sidebar-ring: oklch(.708 0 0);
-}
-
-.dark {
- --background: oklch(.145 0 0);
- --foreground: oklch(.985 0 0);
- --card: oklch(.145 0 0);
- --card-foreground: oklch(.985 0 0);
- --popover: oklch(.145 0 0);
- --popover-foreground: oklch(.985 0 0);
- --primary: oklch(.985 0 0);
- --primary-foreground: oklch(.205 0 0);
- --secondary: oklch(.269 0 0);
- --secondary-foreground: oklch(.985 0 0);
- --muted: oklch(.269 0 0);
- --muted-foreground: oklch(.708 0 0);
- --accent: oklch(.269 0 0);
- --accent-foreground: oklch(.985 0 0);
- --destructive: oklch(.396 .141 25.723);
- --destructive-foreground: oklch(.637 .237 25.331);
- --border: oklch(.269 0 0);
- --input: oklch(.269 0 0);
- --ring: oklch(.439 0 0);
- --font-weight-medium: 500;
- --font-weight-normal: 400;
- --chart-1: oklch(.488 .243 264.376);
- --chart-2: oklch(.696 .17 162.48);
- --chart-3: oklch(.769 .188 70.08);
- --chart-4: oklch(.627 .265 303.9);
- --chart-5: oklch(.645 .246 16.439);
- --sidebar: oklch(.205 0 0);
- --sidebar-foreground: oklch(.985 0 0);
- --sidebar-primary: oklch(.488 .243 264.376);
- --sidebar-primary-foreground: oklch(.985 0 0);
- --sidebar-accent: oklch(.269 0 0);
- --sidebar-accent-foreground: oklch(.985 0 0);
- --sidebar-border: oklch(.269 0 0);
- --sidebar-ring: oklch(.439 0 0);
-}
-
-html {
- font-size: var(--font-size);
-}
-
-@layer components {
- .field-value {
- margin-top: calc(var(--spacing) * 2);
- border-radius: calc(var(--radius) - 2px);
- background-color: var(--color-gray-50);
- min-height: 2.5rem;
- padding-inline: calc(var(--spacing) * 3);
- padding-block: calc(var(--spacing) * 2);
- font-size: var(--text-base);
- line-height: var(--tw-leading, var(--text-base--line-height));
- color: var(--foreground);
- align-items: center;
- display: flex;
- }
-
- .field-value-inline {
- margin-top: calc(var(--spacing) * 2);
- font-size: var(--text-base);
- line-height: var(--tw-leading, var(--text-base--line-height));
- color: var(--foreground);
- }
-}
-
-@property --tw-translate-x {
- syntax: "*";
- inherits: false;
- initial-value: 0;
-}
-
-@property --tw-translate-y {
- syntax: "*";
- inherits: false;
- initial-value: 0;
-}
-
-@property --tw-translate-z {
- syntax: "*";
- inherits: false;
- initial-value: 0;
-}
-
-@property --tw-rotate-x {
- syntax: "*";
- inherits: false;
- initial-value: rotateX(0);
-}
-
-@property --tw-rotate-y {
- syntax: "*";
- inherits: false;
- initial-value: rotateY(0);
-}
-
-@property --tw-rotate-z {
- syntax: "*";
- inherits: false;
- initial-value: rotateZ(0);
-}
-
-@property --tw-skew-x {
- syntax: "*";
- inherits: false;
- initial-value: skewX(0);
-}
-
-@property --tw-skew-y {
- syntax: "*";
- inherits: false;
- initial-value: skewY(0);
-}
-
-@property --tw-space-y-reverse {
- syntax: "*";
- inherits: false;
- initial-value: 0;
-}
-
-@property --tw-space-x-reverse {
- syntax: "*";
- inherits: false;
- initial-value: 0;
-}
-
-@property --tw-divide-y-reverse {
- syntax: "*";
- inherits: false;
- initial-value: 0;
-}
-
-@property --tw-border-style {
- syntax: "*";
- inherits: false;
- initial-value: solid;
-}
-
-@property --tw-gradient-position {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-gradient-from {
- syntax: "";
- inherits: false;
- initial-value: #0000;
-}
-
-@property --tw-gradient-via {
- syntax: "";
- inherits: false;
- initial-value: #0000;
-}
-
-@property --tw-gradient-to {
- syntax: "";
- inherits: false;
- initial-value: #0000;
-}
-
-@property --tw-gradient-stops {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-gradient-via-stops {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-gradient-from-position {
- syntax: "";
- inherits: false;
- initial-value: 0%;
-}
-
-@property --tw-gradient-via-position {
- syntax: "";
- inherits: false;
- initial-value: 50%;
-}
-
-@property --tw-gradient-to-position {
- syntax: "";
- inherits: false;
- initial-value: 100%;
-}
-
-@property --tw-leading {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-font-weight {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-tracking {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-shadow {
- syntax: "*";
- inherits: false;
- initial-value: 0 0 #0000;
-}
-
-@property --tw-shadow-color {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-shadow-alpha {
- syntax: "";
- inherits: false;
- initial-value: 100%;
-}
-
-@property --tw-inset-shadow {
- syntax: "*";
- inherits: false;
- initial-value: 0 0 #0000;
-}
-
-@property --tw-inset-shadow-color {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-inset-shadow-alpha {
- syntax: "";
- inherits: false;
- initial-value: 100%;
-}
-
-@property --tw-ring-color {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-ring-shadow {
- syntax: "*";
- inherits: false;
- initial-value: 0 0 #0000;
-}
-
-@property --tw-inset-ring-color {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-inset-ring-shadow {
- syntax: "*";
- inherits: false;
- initial-value: 0 0 #0000;
-}
-
-@property --tw-ring-inset {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-ring-offset-width {
- syntax: "";
- inherits: false;
- initial-value: 0;
-}
-
-@property --tw-ring-offset-color {
- syntax: "*";
- inherits: false;
- initial-value: #fff;
-}
-
-@property --tw-ring-offset-shadow {
- syntax: "*";
- inherits: false;
- initial-value: 0 0 #0000;
-}
-
-@property --tw-outline-style {
- syntax: "*";
- inherits: false;
- initial-value: solid;
-}
-
-@property --tw-blur {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-brightness {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-contrast {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-grayscale {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-hue-rotate {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-invert {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-opacity {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-saturate {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-sepia {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-drop-shadow {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-drop-shadow-color {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-drop-shadow-alpha {
- syntax: "";
- inherits: false;
- initial-value: 100%;
-}
-
-@property --tw-drop-shadow-size {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-backdrop-blur {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-backdrop-brightness {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-backdrop-contrast {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-backdrop-grayscale {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-backdrop-hue-rotate {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-backdrop-invert {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-backdrop-opacity {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-backdrop-saturate {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-backdrop-sepia {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-duration {
- syntax: "*";
- inherits: false
-}
-
-@property --tw-scale-x {
- syntax: "*";
- inherits: false;
- initial-value: 1;
-}
-
-@property --tw-scale-y {
- syntax: "*";
- inherits: false;
- initial-value: 1;
-}
-
-@property --tw-scale-z {
- syntax: "*";
- inherits: false;
- initial-value: 1;
-}
-
-@keyframes spin {
- to {
- transform: rotate(360deg);
- }
-}
-
-@keyframes pulse {
- 50% {
- opacity: .5;
- }
-}
-
-@keyframes enter {
- from {
- opacity: var(--tw-enter-opacity, 1);
- transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));
- }
-}
-
-@keyframes exit {
- to {
- opacity: var(--tw-exit-opacity, 1);
- transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));
- }
-}
+@import "tailwindcss";
\ No newline at end of file
diff --git a/src/main.tsx b/src/main.tsx
index d96f8d8..132b145 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -1,7 +1,7 @@
import { createRoot } from "react-dom/client";
import App from "./App.tsx";
- import "./index.css";
+ import "./styles/globals.css";
createRoot(document.getElementById("root")!).render();
\ No newline at end of file
diff --git a/src/styles/globals.css b/src/styles/globals.css
index 21e7a1b..b478e24 100644
--- a/src/styles/globals.css
+++ b/src/styles/globals.css
@@ -1,4 +1,175 @@
-@custom-variant dark (&:is(.dark *));
+@import 'tailwindcss';
+
+/* 自定义变量和农业主题色彩 */
+:root {
+ /* 基础字体大小 */
+ --font-size: 16px;
+
+ /* 绿色农业主题色系 */
+ --color-green-50: #f0fdf4;
+ --color-green-100: #dcfce7;
+ --color-green-200: #bbf7d0;
+ --color-green-300: #86efac;
+ --color-green-400: #4ade80;
+ --color-green-500: #22c55e;
+ --color-green-600: #16a34a;
+ --color-green-700: #15803d;
+ --color-green-800: #166534;
+ --color-green-900: #14532d;
+ --color-green-950: #052e16;
+
+ /* 农业相关色彩 */
+ --color-earth-50: #fef7ee;
+ --color-earth-100: #fdecd1;
+ --color-earth-200: #fad7bc;
+ --color-earth-300: #f6c4a0;
+ --color-earth-400: #f0aa7c;
+ --color-earth-500: #ea8e5e;
+ --color-earth-600: #d4734d;
+ --color-earth-700: #b35a3b;
+ --color-earth-800: #8e4332;
+ --color-earth-900: #723528;
+
+ --color-water-50: #ecfeff;
+ --color-water-100: #cffafe;
+ --color-water-200: #a5f3fc;
+ --color-water-300: #67e8f9;
+ --color-water-400: #22d3ee;
+ --color-water-500: #06b6d4;
+ --color-water-600: #0891b2;
+ --color-water-700: #0e7490;
+ --color-water-800: #155e75;
+ --color-water-900: #164e63;
+
+ --color-crop-wheat: #fbbf24;
+ --color-crop-rice: #34d399;
+ --color-crop-corn: #f59e0b;
+ --color-crop-soy: #8b5cf6;
+ --color-crop-vegetable: #10b981;
+ --color-crop-fruit: #ef4444;
+
+ /* 现有的基础色彩系统 */
+ --background: #ffffff;
+ --foreground: oklch(0.145 0 0);
+ --card: #ffffff;
+ --card-foreground: oklch(0.145 0 0);
+ --popover: oklch(1 0 0);
+ --popover-foreground: oklch(0.145 0 0);
+ --primary: #16a34a; /* 使用绿色作为主色 */
+ --primary-foreground: oklch(1 0 0);
+ --secondary: oklch(0.95 0.0058 264.53);
+ --secondary-foreground: #030213;
+ --muted: #ececf0;
+ --muted-foreground: #717182;
+ --accent: #e9ebef;
+ --accent-foreground: #030213;
+ --destructive: #d4183d;
+ --destructive-foreground: #ffffff;
+ --border: rgba(0, 0, 0, 0.1);
+ --input: transparent;
+ --input-background: #f3f3f5;
+ --switch-background: #cbced4;
+ --font-weight-medium: 500;
+ --font-weight-normal: 400;
+ --ring: oklch(0.708 0 0);
+ --chart-1: var(--color-green-600);
+ --chart-2: var(--color-water-600);
+ --chart-3: var(--color-earth-600);
+ --chart-4: oklch(0.828 0.189 84.429);
+ --chart-5: oklch(0.769 0.188 70.08);
+ --radius: 0.625rem;
+ --sidebar: oklch(0.985 0 0);
+ --sidebar-foreground: oklch(0.145 0 0);
+ --sidebar-primary: var(--color-green-600);
+ --sidebar-primary-foreground: oklch(0.985 0 0);
+ --sidebar-accent: oklch(0.97 0 0);
+ --sidebar-accent-foreground: oklch(0.205 0 0);
+ --sidebar-border: oklch(0.922 0 0);
+ --sidebar-ring: oklch(0.708 0 0);
+
+ /* 动画缓动 */
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
+}
+
+.dark {
+ --background: oklch(0.145 0 0);
+ --foreground: oklch(0.985 0 0);
+ --card: oklch(0.145 0 0);
+ --card-foreground: oklch(0.985 0 0);
+ --popover: oklch(0.145 0 0);
+ --popover-foreground: oklch(0.985 0 0);
+ --primary: var(--color-green-500);
+ --primary-foreground: oklch(0.145 0 0);
+ --secondary: oklch(0.269 0 0);
+ --secondary-foreground: oklch(0.985 0 0);
+ --muted: oklch(0.269 0 0);
+ --muted-foreground: oklch(0.708 0 0);
+ --accent: oklch(0.269 0 0);
+ --accent-foreground: oklch(0.985 0 0);
+ --destructive: oklch(0.396 0.141 25.723);
+ --destructive-foreground: oklch(0.637 0.237 25.331);
+ --border: oklch(0.269 0 0);
+ --input: oklch(0.269 0 0);
+ --ring: oklch(0.439 0 0);
+ --font-weight-medium: 500;
+ --font-weight-normal: 400;
+ --chart-1: var(--color-green-400);
+ --chart-2: var(--color-water-400);
+ --chart-3: var(--color-earth-400);
+ --chart-4: oklch(0.627 0.265 303.9);
+ --chart-5: oklch(0.645 0.246 16.439);
+ --sidebar: oklch(0.205 0 0);
+ --sidebar-foreground: oklch(0.985 0 0);
+ --sidebar-primary: var(--color-green-400);
+ --sidebar-primary-foreground: oklch(0.985 0 0);
+ --sidebar-accent: oklch(0.269 0 0);
+ --sidebar-accent-foreground: oklch(0.985 0 0);
+ --sidebar-border: oklch(0.269 0 0);
+ --sidebar-ring: oklch(0.439 0 0);
+}
+
+@theme inline {
+ --color-background: var(--background);
+ --color-foreground: var(--foreground);
+ --color-card: var(--card);
+ --color-card-foreground: var(--card-foreground);
+ --color-popover: var(--popover);
+ --color-popover-foreground: var(--popover-foreground);
+ --color-primary: var(--primary);
+ --color-primary-foreground: var(--primary-foreground);
+ --color-secondary: var(--secondary);
+ --color-secondary-foreground: var(--secondary-foreground);
+ --color-muted: var(--muted);
+ --color-muted-foreground: var(--muted-foreground);
+ --color-accent: var(--accent);
+ --color-accent-foreground: var(--accent-foreground);
+ --color-destructive: var(--destructive);
+ --color-destructive-foreground: var(--destructive-foreground);
+ --color-border: var(--border);
+ --color-input: var(--input);
+ --color-input-background: var(--input-background);
+ --color-switch-background: var(--switch-background);
+ --color-ring: var(--ring);
+ --color-chart-1: var(--chart-1);
+ --color-chart-2: var(--chart-2);
+ --color-chart-3: var(--chart-3);
+ --color-chart-4: var(--chart-4);
+ --color-chart-5: var(--chart-5);
+ --radius-sm: calc(var(--radius) - 4px);
+ --radius-md: calc(var(--radius) - 2px);
+ --radius-lg: var(--radius);
+ --radius-xl: calc(var(--radius) + 4px);
+ --color-sidebar: var(--sidebar);
+ --color-sidebar-foreground: var(--sidebar-foreground);
+ --color-sidebar-primary: var(--sidebar-primary);
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
+ --color-sidebar-accent: var(--sidebar-accent);
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
+ --color-sidebar-border: var(--sidebar-border);
+ --color-sidebar-ring: var(--sidebar-ring);
+}
:root {
--font-size: 16px;
@@ -192,13 +363,543 @@ html {
font-size: var(--font-size);
}
-/* Field value styling for forms and detail views */
-@layer components {
- .field-value {
- @apply mt-2 text-base text-foreground px-3 py-2 bg-gray-50 rounded-md min-h-[2.5rem] flex items-center;
+/* 自定义基础样式 */
+@layer base {
+ /* 自定义滚动条 */
+ ::-webkit-scrollbar {
+ width: 6px;
+ height: 6px;
}
-
+
+ ::-webkit-scrollbar-track {
+ @apply bg-gray-100;
+ }
+
+ ::-webkit-scrollbar-thumb {
+ @apply bg-gray-300 rounded-full;
+ }
+
+ ::-webkit-scrollbar-thumb:hover {
+ @apply bg-gray-400;
+ }
+
+ /* Firefox 滚动条 */
+ * {
+ scrollbar-width: thin;
+ scrollbar-color: rgb(209 213 219) rgb(243 244 246);
+ }
+
+ * {
+ @apply border-border outline-ring/50;
+ }
+
+ body {
+ @apply bg-background text-foreground;
+ }
+}
+
+/* 自定义组件样式 - 农业主题 */
+@layer components {
+ /* 农业状态指示器 */
+ .status-running {
+ @apply bg-green-100 text-green-800 px-3 py-1 rounded-full text-xs font-medium;
+ }
+
+ .status-idle {
+ @apply bg-gray-100 text-gray-800 px-3 py-1 rounded-full text-xs font-medium;
+ }
+
+ .status-maintenance {
+ @apply bg-yellow-100 text-yellow-800 px-3 py-1 rounded-full text-xs font-medium;
+ }
+
+ .status-scrapped {
+ @apply bg-red-100 text-red-800 px-3 py-1 rounded-full text-xs font-medium;
+ }
+
+ /* 农作物类型徽章 */
+ .crop-wheat {
+ @apply bg-yellow-100 text-yellow-800 px-2 py-1 rounded text-xs font-medium;
+ }
+
+ .crop-rice {
+ @apply bg-emerald-100 text-emerald-800 px-2 py-1 rounded text-xs font-medium;
+ }
+
+ .crop-corn {
+ @apply bg-orange-100 text-orange-800 px-2 py-1 rounded text-xs font-medium;
+ }
+
+ .crop-soy {
+ @apply bg-purple-100 text-purple-800 px-2 py-1 rounded text-xs font-medium;
+ }
+
+ .crop-vegetable {
+ @apply bg-green-100 text-green-800 px-2 py-1 rounded text-xs font-medium;
+ }
+
+ .crop-fruit {
+ @apply bg-red-100 text-red-800 px-2 py-1 rounded text-xs font-medium;
+ }
+
+ /* 表格边框样式 */
+ .table-row-border {
+ border-bottom: 1px solid theme('colors.border');
+ }
+
+ /* 卡片阴影效果 */
+ .card-shadow {
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
+ }
+
+ /* 输入框聚焦效果 */
+ .input-focus {
+ @apply focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent;
+ }
+
+ /* 按钮过渡效果 */
+ .btn-transition {
+ @apply transition-all duration-200 ease-in-out;
+ }
+
+ /* 文字省略 */
+ .text-ellipsis-2 {
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ }
+
+ .text-ellipsis-3 {
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ }
+
+ /* 按钮组件 */
+ .btn {
+ @apply inline-flex items-center justify-center px-4 py-2 text-sm font-medium rounded-md btn-transition focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed;
+ }
+
+ .btn-primary {
+ @apply bg-primary text-primary-foreground hover:bg-primary/90 focus:ring-primary-500;
+ }
+
+ .btn-secondary {
+ @apply bg-secondary text-secondary-foreground hover:bg-secondary/80 focus:ring-secondary-500;
+ }
+
+ .btn-outline {
+ @apply border border-border bg-background text-foreground hover:bg-accent hover:text-accent-foreground focus:ring-primary-500;
+ }
+
+ .btn-ghost {
+ @apply text-muted-foreground hover:bg-accent hover:text-accent-foreground focus:ring-accent-foreground;
+ }
+
+ .btn-sm {
+ @apply px-3 py-1.5 text-xs;
+ }
+
+ .btn-lg {
+ @apply px-6 py-3 text-base;
+ }
+
+ /* 输入框组件 */
+ .input {
+ @apply block w-full px-3 py-2 border border-input bg-background rounded-md placeholder:text-muted-foreground input-focus;
+ }
+
+ .input-error {
+ @apply border-destructive focus:ring-destructive;
+ }
+
+ /* 卡片组件 */
+ .card {
+ @apply bg-card rounded-lg shadow-sm border border-border p-6;
+ }
+
+ .card-header {
+ @apply border-b border-border pb-4 mb-4;
+ }
+
+ .card-title {
+ @apply text-lg font-semibold text-card-foreground;
+ }
+
+ .card-description {
+ @apply text-sm text-muted-foreground mt-1;
+ }
+
+ /* 徽章组件 */
+ .badge {
+ @apply inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium;
+ }
+
+ .badge-primary {
+ @apply bg-primary/10 text-primary border border-primary/20;
+ }
+
+ .badge-secondary {
+ @apply bg-secondary text-secondary-foreground;
+ }
+
+ .badge-success {
+ @apply bg-green-100 text-green-800 border border-green-200;
+ }
+
+ .badge-warning {
+ @apply bg-yellow-100 text-yellow-800 border border-yellow-200;
+ }
+
+ .badge-error {
+ @apply bg-destructive text-destructive-foreground;
+ }
+
+ /* 加载状态 */
+ .loading-spinner {
+ @apply inline-block w-4 h-4 border-2 border-current border-t-transparent rounded-full animate-spin;
+ }
+
+ /* 表格样式 */
+ .table {
+ @apply w-full border-collapse;
+ }
+
+ .table th {
+ @apply px-4 py-3 text-left text-xs font-medium text-muted-foreground uppercase tracking-wider bg-muted/50;
+ }
+
+ .table td {
+ @apply px-4 py-3 text-sm table-row-border;
+ }
+
+ /* 页面布局 */
+ .page-container {
+ @apply container mx-auto px-4 py-6 max-w-7xl;
+ }
+
+ .page-header {
+ @apply mb-6;
+ }
+
+ .page-title {
+ @apply text-2xl font-bold text-foreground mb-2;
+ }
+
+ .page-description {
+ @apply text-muted-foreground;
+ }
+
+ /* 表单样式 */
+ .form-group {
+ @apply space-y-2;
+ }
+
+ .form-label {
+ @apply block text-sm font-medium text-foreground;
+ }
+
+ .form-error {
+ @apply text-sm text-destructive mt-1;
+ }
+
+ .form-help {
+ @apply text-sm text-muted-foreground mt-1;
+ }
+
+ /* 导航样式 */
+ .nav-item {
+ @apply flex items-center px-3 py-2 text-sm font-medium rounded-md btn-transition;
+ }
+
+ .nav-item-active {
+ @apply bg-primary/10 text-primary border border-primary/20;
+ }
+
+ .nav-item-inactive {
+ @apply text-muted-foreground hover:text-foreground hover:bg-accent;
+ }
+
+ /* 工具提示 */
+ .tooltip {
+ @apply absolute z-50 px-3 py-2 text-sm text-popover-foreground bg-popover rounded-md shadow-lg opacity-0 pointer-events-none transition-opacity duration-200;
+ }
+
+ .tooltip-visible {
+ @apply opacity-100 pointer-events-auto;
+ }
+
+ /* 模态框样式 */
+ .modal-overlay {
+ @apply fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4;
+ }
+
+ .modal-content {
+ @apply bg-card rounded-lg shadow-xl max-w-lg w-full max-h-screen overflow-y-auto;
+ }
+
+ .modal-header {
+ @apply px-6 py-4 border-b border-border;
+ }
+
+ .modal-title {
+ @apply text-lg font-semibold text-card-foreground;
+ }
+
+ .modal-body {
+ @apply px-6 py-4;
+ }
+
+ .modal-footer {
+ @apply px-6 py-4 border-t border-border flex justify-end space-x-3;
+ }
+
+ /* Field value styling for forms and detail views */
+ .field-value {
+ @apply mt-2 text-base text-foreground px-3 py-2 bg-muted/50 rounded-md min-h-[2.5rem] flex items-center;
+ }
+
.field-value-inline {
@apply mt-2 text-base text-foreground;
}
}
+
+/* 自定义工具类 */
+@layer utilities {
+ /* 安全区域 */
+ .safe-top {
+ padding-top: env(safe-area-inset-top);
+ }
+
+ .safe-bottom {
+ padding-bottom: env(safe-area-inset-bottom);
+ }
+
+ .safe-left {
+ padding-left: env(safe-area-inset-left);
+ }
+
+ .safe-right {
+ padding-right: env(safe-area-inset-right);
+ }
+
+ /* 隐藏滚动条 */
+ .scrollbar-hide {
+ -ms-overflow-style: none;
+ scrollbar-width: none;
+ }
+
+ .scrollbar-hide::-webkit-scrollbar {
+ display: none;
+ }
+
+ /* 文本选择 */
+ .select-none {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ }
+
+ /* 玻璃效果 */
+ .glass {
+ background: rgba(255, 255, 255, 0.8);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ }
+
+ .glass-dark {
+ background: rgba(0, 0, 0, 0.8);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ }
+
+ /* 渐变背景 */
+ .gradient-primary {
+ background: linear-gradient(135deg, var(--primary) 0%, color-mix(in srgb, var(--primary) 85%) 100%);
+ }
+
+ .gradient-success {
+ background: linear-gradient(135deg, var(--color-green-500) 0%, color-mix(in srgb, var(--color-green-500) 85%) 100%);
+ }
+
+ /* 网格布局 */
+ .grid-auto-fit {
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
+ }
+
+ .grid-auto-fill {
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
+ }
+
+ /* 响应式网格 */
+ .grid-responsive {
+ @apply grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4;
+ }
+
+ /* 响应式文本 */
+ .text-responsive {
+ @apply text-sm sm:text-base lg:text-lg;
+ }
+
+ .text-responsive-xl {
+ @apply text-base sm:text-lg lg:text-xl xl:text-2xl;
+ }
+
+ /* 动画延迟 */
+ .animate-delay-100 {
+ animation-delay: 100ms;
+ }
+
+ .animate-delay-200 {
+ animation-delay: 200ms;
+ }
+
+ .animate-delay-300 {
+ animation-delay: 300ms;
+ }
+
+ .animate-delay-500 {
+ animation-delay: 500ms;
+ }
+
+ /* 悬停提升效果 */
+ .hover-lift {
+ @apply transition-transform duration-200 hover:scale-105 hover:-translate-y-1;
+ }
+
+ /* 渐入动画 */
+ .fade-in-up {
+ animation: fadeInUp 0.6s ease-out;
+ }
+
+ .fade-in-down {
+ animation: fadeInDown 0.6s ease-out;
+ }
+
+ .fade-in-left {
+ animation: fadeInLeft 0.6s ease-out;
+ }
+
+ .fade-in-right {
+ animation: fadeInRight 0.6s ease-out;
+ }
+
+ /* 自定义动画关键帧 */
+ @keyframes fadeInUp {
+ from {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ }
+
+ @keyframes fadeInDown {
+ from {
+ opacity: 0;
+ transform: translateY(-10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ }
+
+ @keyframes fadeInLeft {
+ from {
+ opacity: 0;
+ transform: translateX(-10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateX(0);
+ }
+ }
+
+ @keyframes fadeInRight {
+ from {
+ opacity: 0;
+ transform: translateX(10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateX(0);
+ }
+ }
+
+ @keyframes slideIn {
+ from {
+ transform: translateX(-100%);
+ opacity: 0;
+ }
+ to {
+ transform: translateX(0);
+ opacity: 1;
+ }
+ }
+
+ @keyframes slideUp {
+ from {
+ transform: translateY(20px);
+ opacity: 0;
+ }
+ to {
+ transform: translateY(0);
+ opacity: 1;
+ }
+ }
+
+ @keyframes bounce {
+ 0%, 20%, 53%, 80%, 100% {
+ transform: translateY(0);
+ }
+ 40%, 43% {
+ transform: translateY(-8px);
+ }
+ 70% {
+ transform: translateY(-4px);
+ }
+ 90% {
+ transform: translateY(-2px);
+ }
+ }
+}
+
+/* 响应式断点样式 */
+@media (max-width: 640px) {
+ .mobile-hidden {
+ @apply hidden;
+ }
+
+ .mobile-full {
+ @apply w-full;
+ }
+
+ .mobile-center {
+ @apply text-center;
+ }
+
+ .mobile-stack {
+ @apply flex-col space-y-4;
+ }
+}
+
+/* 打印样式 */
+@media print {
+ .print-hidden {
+ @apply hidden;
+ }
+
+ .print-only {
+ @apply block;
+ }
+
+ * {
+ @apply text-foreground bg-background;
+ }
+}