commit f485f346eb2e6e642498158408f4b6508ba1c1be Author: priyanshuvish Date: Thu Aug 28 14:02:49 2025 +0530 Initial commit: setup project diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9115011 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# Dependencies +node_modules/ + +# Build output +dist/ +build/ + +# Logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Environment variables +.env +.env.local +.env.*.local + +# IDE/editor settings +.vscode/ +.idea/ +.DS_Store +Thumbs.db diff --git a/README.md b/README.md new file mode 100644 index 0000000..e7075ee --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ + + # (Success) v 02 KLC Website with Learner's Learning 0.1 + + This is a code bundle for (Success) v 02 KLC Website with Learner's Learning 0.1. The original project is available at https://www.figma.com/design/EsJMRo8s3zDQtHwPpj5TVk/-Success--v-02-KLC-Website-with-Learner-s-Learning-0.1. + + ## Running the code + + Run `npm i` to install the dependencies. + + Run `npm run dev` to start the development server. + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..ec79b97 --- /dev/null +++ b/index.html @@ -0,0 +1,15 @@ + + + + + + + (Success) v 02 KLC Website with Learner's Learning 0.1 + + + +
+ + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..af0d479 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4094 @@ +{ + "name": "(Success) v 02 KLC Website with Learner's Learning 0.1", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "(Success) v 02 KLC Website with Learner's Learning 0.1", + "version": "0.1.0", + "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", + "@tailwindcss/postcss": "^4.1.12", + "class-variance-authority": "^0.7.1", + "clsx": "*", + "cmdk": "^1.1.1", + "embla-carousel-react": "^8.6.0", + "input-otp": "^1.4.2", + "lucide-react": "^0.487.0", + "motion": "*", + "next-themes": "^0.4.6", + "postcss": "^8.5.6", + "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": "*", + "tailwindcss": "^4.1.12", + "vaul": "^1.1.2" + }, + "devDependencies": { + "@types/node": "^20.10.0", + "@vitejs/plugin-react-swc": "^3.10.2", + "vite": "^5.4.19" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "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==", + "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==", + "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==", + "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==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "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", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", + "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz", + "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz", + "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", + "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", + "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", + "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menubar": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", + "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", + "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", + "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", + "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", + "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", + "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", + "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", + "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", + "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", + "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.49.0.tgz", + "integrity": "sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.49.0.tgz", + "integrity": "sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.49.0.tgz", + "integrity": "sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.49.0.tgz", + "integrity": "sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.49.0.tgz", + "integrity": "sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.49.0.tgz", + "integrity": "sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.49.0.tgz", + "integrity": "sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.49.0.tgz", + "integrity": "sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.49.0.tgz", + "integrity": "sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.49.0.tgz", + "integrity": "sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.49.0.tgz", + "integrity": "sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.49.0.tgz", + "integrity": "sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.49.0.tgz", + "integrity": "sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.49.0.tgz", + "integrity": "sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.49.0.tgz", + "integrity": "sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.49.0.tgz", + "integrity": "sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.49.0.tgz", + "integrity": "sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.49.0.tgz", + "integrity": "sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.49.0.tgz", + "integrity": "sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.49.0.tgz", + "integrity": "sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/core": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.13.5.tgz", + "integrity": "sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.24" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.13.5", + "@swc/core-darwin-x64": "1.13.5", + "@swc/core-linux-arm-gnueabihf": "1.13.5", + "@swc/core-linux-arm64-gnu": "1.13.5", + "@swc/core-linux-arm64-musl": "1.13.5", + "@swc/core-linux-x64-gnu": "1.13.5", + "@swc/core-linux-x64-musl": "1.13.5", + "@swc/core-win32-arm64-msvc": "1.13.5", + "@swc/core-win32-ia32-msvc": "1.13.5", + "@swc/core-win32-x64-msvc": "1.13.5" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.13.5.tgz", + "integrity": "sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.13.5.tgz", + "integrity": "sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.13.5.tgz", + "integrity": "sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.13.5.tgz", + "integrity": "sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.13.5.tgz", + "integrity": "sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.13.5.tgz", + "integrity": "sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.13.5.tgz", + "integrity": "sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.13.5.tgz", + "integrity": "sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.13.5.tgz", + "integrity": "sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.13.5.tgz", + "integrity": "sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.24.tgz", + "integrity": "sha512-tjTMh3V4vAORHtdTprLlfoMptu1WfTZG9Rsca6yOKyNYsRr+MUXutKmliB17orgSZk5DpnDxs8GUdd/qwYxOng==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.12.tgz", + "integrity": "sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.5.1", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.12" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.12.tgz", + "integrity": "sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-x64": "4.1.12", + "@tailwindcss/oxide-freebsd-x64": "4.1.12", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.12", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.12", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-x64-musl": "4.1.12", + "@tailwindcss/oxide-wasm32-wasi": "4.1.12", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.12", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.12" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.12.tgz", + "integrity": "sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.12.tgz", + "integrity": "sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.12.tgz", + "integrity": "sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.12.tgz", + "integrity": "sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.12.tgz", + "integrity": "sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.12.tgz", + "integrity": "sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.12.tgz", + "integrity": "sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.12.tgz", + "integrity": "sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.12.tgz", + "integrity": "sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.12.tgz", + "integrity": "sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==", + "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.4.5", + "@emnapi/runtime": "^1.4.5", + "@emnapi/wasi-threads": "^1.0.4", + "@napi-rs/wasm-runtime": "^0.2.12", + "@tybys/wasm-util": "^0.10.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.12.tgz", + "integrity": "sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.12.tgz", + "integrity": "sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.12.tgz", + "integrity": "sha512-5PpLYhCAwf9SJEeIsSmCDLgyVfdBhdBpzX1OJ87anT9IVR0Z9pjM0FNixCAUAHGnMBGB8K99SwAheXrT0Kh6QQ==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.12", + "@tailwindcss/oxide": "4.1.12", + "postcss": "^8.4.41", + "tailwindcss": "4.1.12" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.11.tgz", + "integrity": "sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.11.0.tgz", + "integrity": "sha512-YTJCGFdNMHCMfjODYtxRNVAYmTWQ1Lb8PulP/2/f/oEEtglw8oKxKIZmmRkyXrVrHfsKOaVkAc3NT9/dMutO5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.27", + "@swc/core": "^1.12.11" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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": ">=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", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", + "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.2" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "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/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/embla-carousel": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", + "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", + "license": "MIT" + }, + "node_modules/embla-carousel-react": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz", + "integrity": "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==", + "license": "MIT", + "dependencies": { + "embla-carousel": "8.6.0", + "embla-carousel-reactive-utils": "8.6.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/embla-carousel-reactive-utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz", + "integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "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/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/framer-motion": { + "version": "12.23.12", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.12.tgz", + "integrity": "sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.23.12", + "motion-utils": "^12.23.6", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "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==", + "license": "ISC" + }, + "node_modules/input-otp": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", + "integrity": "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/jiti": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", + "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.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/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lucide-react": { + "version": "0.487.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.487.0.tgz", + "integrity": "sha512-aKqhOQ+YmFnwq8dWgGjOuLc8V1R9/c/yOd+zDY4+ohsR2Jo05lSGc3WsstYPIzcTpeosN7LoCkLReUUITvaIvw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.18", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", + "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==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/motion": { + "version": "12.23.12", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.23.12.tgz", + "integrity": "sha512-8jCD8uW5GD1csOoqh1WhH1A6j5APHVE15nuBkFeRiMzYBdRwyAHmSP/oXSuW0WJPZRXTFdBoG4hY9TFWNhhwng==", + "license": "MIT", + "dependencies": { + "framer-motion": "^12.23.12", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "12.23.12", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.12.tgz", + "integrity": "sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.23.6" + } + }, + "node_modules/motion-utils": { + "version": "12.23.6", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", + "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-day-picker": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz", + "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", + "license": "MIT", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "date-fns": "^2.28.0 || ^3.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-hook-form": { + "version": "7.62.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.62.0.tgz", + "integrity": "sha512-7KWFejc98xqG/F4bAxpL41NB3o1nnvQO1RWZT3TqRZYL8RryQETGfEdVnJN2fy1crCiBLLjkRBVK05j24FxJGA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/react-remove-scroll": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", + "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-resizable-panels": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.9.tgz", + "integrity": "sha512-z77+X08YDIrgAes4jl8xhnUu1LNIRp4+E7cv4xHmLOxxUPO/ML7PSrE813b90vj7xvQ1lcf7g2uA9GeMZonjhQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/recharts": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz", + "integrity": "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/rollup": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.49.0.tgz", + "integrity": "sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.49.0", + "@rollup/rollup-android-arm64": "4.49.0", + "@rollup/rollup-darwin-arm64": "4.49.0", + "@rollup/rollup-darwin-x64": "4.49.0", + "@rollup/rollup-freebsd-arm64": "4.49.0", + "@rollup/rollup-freebsd-x64": "4.49.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.49.0", + "@rollup/rollup-linux-arm-musleabihf": "4.49.0", + "@rollup/rollup-linux-arm64-gnu": "4.49.0", + "@rollup/rollup-linux-arm64-musl": "4.49.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.49.0", + "@rollup/rollup-linux-ppc64-gnu": "4.49.0", + "@rollup/rollup-linux-riscv64-gnu": "4.49.0", + "@rollup/rollup-linux-riscv64-musl": "4.49.0", + "@rollup/rollup-linux-s390x-gnu": "4.49.0", + "@rollup/rollup-linux-x64-gnu": "4.49.0", + "@rollup/rollup-linux-x64-musl": "4.49.0", + "@rollup/rollup-win32-arm64-msvc": "4.49.0", + "@rollup/rollup-win32-ia32-msvc": "4.49.0", + "@rollup/rollup-win32-x64-msvc": "4.49.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/sonner": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", + "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/source-map-js": { + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwind-merge": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", + "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz", + "integrity": "sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "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", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/vaul": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", + "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-dialog": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "5.4.19", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", + "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "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" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f39dddf --- /dev/null +++ b/package.json @@ -0,0 +1,62 @@ +{ + "name": "(Success) v 02 KLC Website with Learner's Learning 0.1", + "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", + "@tailwindcss/postcss": "^4.1.12", + "class-variance-authority": "^0.7.1", + "clsx": "*", + "cmdk": "^1.1.1", + "embla-carousel-react": "^8.6.0", + "input-otp": "^1.4.2", + "lucide-react": "^0.487.0", + "motion": "*", + "next-themes": "^0.4.6", + "postcss": "^8.5.6", + "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": "*", + "tailwindcss": "^4.1.12", + "vaul": "^1.1.2" + }, + "devDependencies": { + "@types/node": "^20.10.0", + "@vitejs/plugin-react-swc": "^3.10.2", + "vite": "^5.4.19" + }, + "scripts": { + "dev": "vite", + "build": "vite build" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..b776c62 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,5 @@ +export default { + plugins: { + "@tailwindcss/postcss": {}, + } +} \ No newline at end of file diff --git a/src/.figma_internal/CurrentLearningHeaderIcon.tsx b/src/.figma_internal/CurrentLearningHeaderIcon.tsx new file mode 100644 index 0000000..f401546 --- /dev/null +++ b/src/.figma_internal/CurrentLearningHeaderIcon.tsx @@ -0,0 +1,13 @@ +import svgPaths from "./svg-50ykfce76w"; + +export default function CurrentLearningHeaderIcon() { + return ( +
+ + + + + +
+ ); +} \ No newline at end of file diff --git a/src/.figma_internal/svg-50ykfce76w.ts b/src/.figma_internal/svg-50ykfce76w.ts new file mode 100644 index 0000000..b9f4bcc --- /dev/null +++ b/src/.figma_internal/svg-50ykfce76w.ts @@ -0,0 +1,3 @@ +export default { +p3fb52080: "M12.4789 3.26119C12.1804 3.09839 11.8196 3.09839 11.5211 3.26119L2.61015 8.12174C1.91514 8.50083 1.91532 9.49885 2.61045 9.8777L4.47854 10.8958C4.79998 11.071 5 11.4078 5 11.7739V16.5865C5 16.9524 5.19981 17.289 5.52097 17.4643L11.521 20.7386C11.8195 20.9015 12.1805 20.9015 12.479 20.7386L18.479 17.4643C18.8002 17.289 19 16.9524 19 16.5865V11.7739C19 11.4078 19.2 11.071 19.5215 10.8958V10.8958C20.1878 10.5326 21 11.015 21 11.7739V16C21 16.5523 21.4477 17 22 17V17C22.5523 17 23 16.5523 23 16V9.59363C23 9.22769 22.8001 8.89097 22.4789 8.71574L12.4789 3.26119ZM17.2105 8.1221C17.9054 8.50112 17.9054 9.49888 17.2105 9.8779L12.4789 12.4588C12.1804 12.6216 11.8196 12.6216 11.5211 12.4588L6.78947 9.87789C6.09461 9.49888 6.09461 8.50112 6.78948 8.1221L11.5211 5.54119C11.8196 5.37839 12.1804 5.37839 12.4789 5.54119L17.2105 8.1221ZM17 15.4056C17 15.772 16.7997 16.109 16.4779 16.284L12.4779 18.46C12.1799 18.6221 11.8201 18.6221 11.5221 18.46L7.52213 16.284C7.20032 16.109 7 15.772 7 15.4056V13.9554C7 13.1961 7.81284 12.7138 8.47922 13.0777L11.5208 14.7383C11.8195 14.9014 12.1806 14.9014 12.4792 14.7383L15.5208 13.0777C16.1872 12.7138 17 13.1961 17 13.9553V15.4056Z", +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..fd7cad4 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,1187 @@ +import React, { useEffect, useState, useRef } from 'react'; +import { Router } from './components/Router'; +import { Navigation } from './components/Navigation'; +import { Footer } from './components/Footer'; + +import { AuthProvider } from './components/AuthContext'; +import { Button } from './components/ui/button'; +import { Card, CardContent, CardHeader, CardTitle } from './components/ui/card'; +import { Badge } from './components/ui/badge'; +import { ScrollArea } from './components/ui/scroll-area'; +import { Input } from './components/ui/input'; +import { + RefreshCw, + Home, + AlertTriangle, + CheckCircle, + MessageCircle, + X, + Send, + Bot, + User, + Minimize2, + Maximize2, + HelpCircle, + Navigation as NavigationIcon, + BookOpen, + Phone, + Settings, + Calendar, + Lightbulb, + Users, + Trophy, + Target, + TrendingUp, + Brain, + Award, + Zap +} from 'lucide-react'; +import { ImageWithFallback } from './components/figma/ImageWithFallback'; +import klcLogo from 'figma:asset/75c17cf51744205abe7b7042766b8dfdb7b2e8a4.png'; + +// Enhanced loading component with KLC branding +function AppLoader() { + const [loadingText, setLoadingText] = useState('Initializing...'); + const [progress, setProgress] = useState(0); + const [currentTip, setCurrentTip] = useState(0); + + // Leadership tips and platform features to display during loading + const loadingTips = [ + { + icon: Lightbulb, + title: "Leadership Insight", + content: "Great leaders inspire others to achieve what they never thought possible.", + color: "from-yellow-500 to-orange-500" + }, + { + icon: Users, + title: "Team Building", + content: "Effective leadership is about empowering your team to excel beyond expectations.", + color: "from-blue-500 to-purple-500" + }, + { + icon: Trophy, + title: "Achievement Focus", + content: "Success in leadership comes from consistent learning and continuous improvement.", + color: "from-green-500 to-teal-500" + }, + { + icon: Target, + title: "Strategic Vision", + content: "Leaders set clear goals and inspire their teams to achieve remarkable results.", + color: "from-red-500 to-pink-500" + }, + { + icon: TrendingUp, + title: "Growth Mindset", + content: "The best leaders embrace challenges as opportunities for development.", + color: "from-purple-500 to-indigo-500" + }, + { + icon: Brain, + title: "Smart Learning", + content: "Our AI-powered platform adapts to your learning style for maximum impact.", + color: "from-cyan-500 to-blue-500" + }, + { + icon: Award, + title: "Excellence", + content: "KLC has developed over 27,000+ leaders across 20+ countries worldwide.", + color: "from-amber-500 to-yellow-500" + }, + { + icon: Zap, + title: "Innovation", + content: "Experience cutting-edge leadership development with interactive tools and expert guidance.", + color: "from-emerald-500 to-green-500" + } + ]; + + useEffect(() => { + const steps = [ + { text: 'Initializing...', duration: 200 }, + { text: 'Loading your learning portal...', duration: 300 }, + { text: 'Preparing your experience...', duration: 200 }, + { text: 'Almost ready...', duration: 100 } + ]; + + let currentStep = 0; + let currentProgress = 0; + + const progressInterval = setInterval(() => { + currentProgress += 2; + setProgress(Math.min(currentProgress, 100)); + + if (currentProgress >= 100) { + clearInterval(progressInterval); + } + }, 16); + + const stepInterval = setInterval(() => { + if (currentStep < steps.length) { + setLoadingText(steps[currentStep].text); + currentStep++; + } else { + clearInterval(stepInterval); + } + }, 200); + + // Rotate tips every 2 seconds + const tipInterval = setInterval(() => { + setCurrentTip(prev => (prev + 1) % loadingTips.length); + }, 2000); + + return () => { + clearInterval(progressInterval); + clearInterval(stepInterval); + clearInterval(tipInterval); + }; + }, []); + + const currentTipData = loadingTips[currentTip]; + const TipIcon = currentTipData.icon; + + return ( +
+ {/* Background pattern */} +
+
+
+ +
+ {/* Logo container with enhanced styling */} +
+
+ +
+ + {/* Loading content */} +
+

+ Welcome to KLC Learning Portal +

+ +

+ Empowering leaders through innovative learning experiences +

+ + {/* Progress bar */} +
+
+
+
+

+ {loadingText} +

+
+ + {/* Enhanced content area with rotating tips */} +
+ {/* Leadership Tip Card */} +
+
+
+ +
+
+

+ {currentTipData.title} +

+

+ {currentTipData.content} +

+
+
+
+ + {/* Platform Features */} +
+
+
+ +
+

Expert-Led Courses

+
+
+
+ +
+

Achievement Tracking

+
+
+ + {/* Quick Stats */} +
+
+

27,000+

+

Leaders Developed

+
+
+
+

150+

+

Corporate Clients

+
+
+
+

20+

+

Countries Served

+
+
+ + {/* What's Coming Next */} +
+

+ + What's Next +

+

+ Access your personalized dashboard, explore courses, connect with peers, and begin your leadership transformation journey. +

+
+ + {/* Progress dots indicator */} +
+ {loadingTips.map((_, index) => ( +
+ ))} +
+
+
+
+
+ ); +} + +// Completely redesigned KLC Assistant with reliable layout and enhanced tab styling +interface Message { + id: string; + type: 'user' | 'assistant'; + content: string; + timestamp: Date; + suggestions?: string[]; +} + +function KLCAssistant() { + const [isVisible, setIsVisible] = useState(true); + const [isOpen, setIsOpen] = useState(false); + const [isMinimized, setIsMinimized] = useState(false); + const [activeTab, setActiveTab] = useState<'help' | 'navigation' | 'chat'>('help'); + const [messages, setMessages] = useState([ + { + id: '1', + type: 'assistant', + content: "Hi! I'm your KLC Assistant. I can help you navigate the learning portal, answer questions about our leadership programs, facilities, and more. What are you looking for today?", + timestamp: new Date(), + suggestions: [ + "Show me leadership programs", + "How do I access my courses?", + "Book a facility tour", + "Upcoming webinars" + ] + } + ]); + const [inputValue, setInputValue] = useState(''); + const [isTyping, setIsTyping] = useState(false); + const messagesEndRef = useRef(null); + const inactivityTimerRef = useRef(); + + // Quick actions for navigation with proper course linking + const quickActions = [ + { label: 'Go to Dashboard', action: () => window.location.href = '/dashboard?view=individual', icon: Home }, + { label: 'Browse Library', action: () => window.location.href = '/library?view=individual', icon: BookOpen }, + { label: 'View Surveys', action: () => window.location.href = '/surveys?view=individual', icon: HelpCircle }, + { label: 'Account Settings', action: () => window.location.href = '/settings?view=individual', icon: Settings }, + { label: 'Join Webinars', action: () => window.location.href = '/webinars?view=individual', icon: Calendar }, + { label: 'Contact Support', action: () => window.location.href = 'mailto:support@klc.edu', icon: Phone } + ]; + + // Help topics (reduced to ensure they fit) + const helpTopics = [ + 'How do I access my courses?', + 'Where can I find my learning progress?', + 'How do I take assessments?', + 'How to join live webinars?', + 'Where are my certificates?', + 'How to update my profile?' + ]; + + // Bot responses with KLC-specific content and course linking + const botResponses: Record = { + "programs": { + content: "Great! We offer various leadership development programs including Executive Leadership, Strategic Management, and Team Building workshops. You can browse all programs in our library or view specific program details.", + suggestions: ["Browse Library", "Executive programs", "Team building", "Custom corporate training"] + }, + "facilities": { + content: "Our state-of-the-art facilities include modern conference rooms, training halls, and collaboration spaces. You can take a virtual tour or book a facility for your event.", + suggestions: ["Virtual tour", "Book conference room", "Training halls", "Facility pricing"] + }, + "webinars": { + content: "We host regular webinars on leadership topics. You can view upcoming sessions, register for live events, or access our library of recorded sessions.", + suggestions: ["Upcoming webinars", "Recorded sessions", "Register for webinar", "Webinar schedule"] + }, + "contact": { + content: "You can reach us at support@klc.edu or call our support team. Our team is available Monday to Friday, 9 AM to 6 PM. You can also schedule a consultation.", + suggestions: ["Schedule consultation", "Email us", "Office locations", "Support hours"] + }, + "courses": { + content: "To access your courses, go to your Dashboard and click on 'Browse Library' or navigate directly to the Library section. Your enrolled courses will appear in the 'My Courses' section with detailed course timelines.", + suggestions: ["Go to Dashboard", "Browse Library", "View progress", "Course timeline"] + }, + "assessments": { + content: "Assessments can be found in the Surveys & Assessments section. You can complete self-assessments, view results, and track your leadership development progress.", + suggestions: ["Take assessment", "View results", "Progress tracking", "Feedback reports"] + }, + "default": { + content: "I can help you with information about our programs, facilities, webinars, course navigation, and more. What would you like to know?", + suggestions: ["Leadership programs", "Course access", "Facility booking", "Webinars", "Contact us"] + } + }; + + // Show assistant after inactivity + useEffect(() => { + const resetTimer = () => { + if (inactivityTimerRef.current) { + clearTimeout(inactivityTimerRef.current); + } + + inactivityTimerRef.current = setTimeout(() => { + if (!isOpen) { + setIsVisible(true); + } + }, 5000); + }; + + const events = ['mousedown', 'mousemove', 'keypress', 'scroll', 'touchstart']; + + const addEventListeners = () => { + events.forEach(event => { + document.addEventListener(event, resetTimer, true); + }); + }; + + const removeEventListeners = () => { + events.forEach(event => { + document.removeEventListener(event, resetTimer, true); + }); + }; + + addEventListeners(); + resetTimer(); + + return () => { + removeEventListeners(); + if (inactivityTimerRef.current) { + clearTimeout(inactivityTimerRef.current); + } + }; + }, [isOpen]); + + // Auto-scroll to bottom of messages + useEffect(() => { + messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + }, [messages]); + + const getBotResponse = (userMessage: string): { content: string; suggestions?: string[] } => { + const message = userMessage.toLowerCase(); + + if (message.includes('program') || message.includes('course') || message.includes('training')) { + return botResponses.programs; + } else if (message.includes('facility') || message.includes('book') || message.includes('room')) { + return botResponses.facilities; + } else if (message.includes('webinar') || message.includes('session') || message.includes('online')) { + return botResponses.webinars; + } else if (message.includes('contact') || message.includes('phone') || message.includes('email') || message.includes('support')) { + return botResponses.contact; + } else if (message.includes('access') || message.includes('find') || message.includes('navigate')) { + return botResponses.courses; + } else if (message.includes('assessment') || message.includes('survey') || message.includes('progress')) { + return botResponses.assessments; + } else { + return botResponses.default; + } + }; + + const handleSendMessage = async (content: string) => { + if (!content.trim()) return; + + // Add user message + const userMessage: Message = { + id: Date.now().toString(), + type: 'user', + content: content.trim(), + timestamp: new Date() + }; + + setMessages(prev => [...prev, userMessage]); + setInputValue(''); + setIsTyping(true); + + // Simulate typing delay + setTimeout(() => { + const response = getBotResponse(content); + const assistantMessage: Message = { + id: (Date.now() + 1).toString(), + type: 'assistant', + content: response.content, + timestamp: new Date(), + suggestions: response.suggestions + }; + + setMessages(prev => [...prev, assistantMessage]); + setIsTyping(false); + }, 1000 + Math.random() * 1000); + }; + + const handleSuggestionClick = (suggestion: string) => { + // Handle direct navigation for specific suggestions + if (suggestion === "Go to Dashboard") { + window.location.href = '/dashboard?view=individual'; + return; + } else if (suggestion === "Browse Library") { + window.location.href = '/library?view=individual'; + return; + } else if (suggestion === "Course timeline") { + window.location.href = '/course?view=individual'; + return; + } + + handleSendMessage(suggestion); + }; + + const formatTime = (date: Date) => { + return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); + }; + + if (!isVisible) return null; + + return ( + <> + {/* KLC Assistant Toggle Button - Scale animation removed */} + {!isOpen && ( + + )} + + {/* KLC Assistant Window - Updated with standard card radius */} + {isOpen && ( +
+ + {/* Header - Fixed with standard radius */} +
+
+
+
+ +
+
+

KLC Assistant

+
+
+ Online & Ready to Help +
+
+
+
+ + +
+
+
+ + {/* Content Area - Only visible when not minimized */} + {!isMinimized && ( + <> + {/* Enhanced Tab Navigation - Using CourseTimeline styling with increased width */} +
+
+
+ {[ + { id: 'help', label: 'Quick Help', icon: HelpCircle }, + { id: 'navigation', label: 'Navigation', icon: NavigationIcon }, + { id: 'chat', label: 'AI Chat', icon: MessageCircle } + ].map((tab) => { + const Icon = tab.icon; + return ( + + ); + })} +
+
+
+ + {/* Tab Content Area - Flexible height with proper scrolling */} +
+ {/* Quick Help Tab */} + {activeTab === 'help' && ( +
+
+

Frequently Asked Questions

+
+ {helpTopics.map((topic, index) => ( + + ))} +
+
+
+ )} + + {/* Navigation Tab */} + {activeTab === 'navigation' && ( +
+
+

Quick Actions

+
+ {quickActions.map((action, index) => { + const Icon = action.icon; + return ( + + ); + })} + + {/* Support Section */} +
+

Need more help?

+

+ Contact our support team at{' '} + + support@klc.edu + +

+
+
+
+
+ )} + + {/* AI Chat Tab */} + {activeTab === 'chat' && ( +
+ {/* Messages Area */} +
+
+ {messages.map((message) => ( +
+
+
+ {message.type === 'user' ? ( + + ) : ( + + )} +
+
+
+

{message.content}

+
+ {message.suggestions && ( +
+ {message.suggestions.map((suggestion, index) => ( + handleSuggestionClick(suggestion)} + > + {suggestion} + + ))} +
+ )} +

+ {formatTime(message.timestamp)} +

+
+
+
+ ))} + + {isTyping && ( +
+
+
+ +
+
+
+
+
+
+
+
+
+
+ )} +
+
+
+ + {/* Input Area - Fixed at bottom */} +
+
{ + e.preventDefault(); + handleSendMessage(inputValue); + }} + className="flex gap-2" + > + setInputValue(e.target.value)} + placeholder="Ask KLC Assistant..." + className="flex-1 text-[14px] min-h-[44px]" + disabled={isTyping} + /> + +
+

+ Press Enter to send • KLC Assistant is here to help +

+
+
+ )} +
+ + )} +
+ )} + + ); +} + +// Success notification component +function SuccessNotification({ message, onClose }: { message: string; onClose: () => void }) { + useEffect(() => { + const timer = setTimeout(onClose, 5000); + return () => clearTimeout(timer); + }, [onClose]); + + return ( +
+
+
+ +
+
+

{message}

+
+ +
+
+ ); +} + +// Main app layout component with enhanced features +function AppLayout({ children }: { children: React.ReactNode }) { + const [currentPath, setCurrentPath] = useState(() => window.location.pathname); + const [notification, setNotification] = useState(null); + + useEffect(() => { + const handleLocationChange = () => { + const newPath = window.location.pathname; + if (newPath !== currentPath) { + setCurrentPath(newPath); + + // Smooth scroll to top on page change + window.scrollTo({ + top: 0, + behavior: 'smooth' + }); + + // Clear any existing notifications + setNotification(null); + + // Announce page change to screen readers + const pageTitle = document.title; + const announcement = `Navigated to ${pageTitle}`; + + // Create temporary announcement element + const announcer = document.createElement('div'); + announcer.setAttribute('aria-live', 'polite'); + announcer.setAttribute('aria-atomic', 'true'); + announcer.className = 'sr-only'; + announcer.textContent = announcement; + + document.body.appendChild(announcer); + setTimeout(() => { + document.body.removeChild(announcer); + }, 1000); + } + }; + + // Listen for navigation changes + window.addEventListener('popstate', handleLocationChange); + + // Listen for pushState/replaceState (for programmatic navigation) + const originalPushState = window.history.pushState; + const originalReplaceState = window.history.replaceState; + + window.history.pushState = function(...args) { + originalPushState.apply(window.history, args); + handleLocationChange(); + }; + + window.history.replaceState = function(...args) { + originalReplaceState.apply(window.history, args); + handleLocationChange(); + }; + + return () => { + window.removeEventListener('popstate', handleLocationChange); + window.history.pushState = originalPushState; + window.history.replaceState = originalReplaceState; + }; + }, [currentPath]); + + // Enhanced document title and meta description management + useEffect(() => { + const getQueryParam = (param: string) => { + const urlParams = new URLSearchParams(window.location.search); + return urlParams.get(param); + }; + + const isCorporateView = getQueryParam('view') === 'corporate'; + const viewSuffix = isCorporateView ? ' - Corporate Learning Portal' : ' - KLC Learning Portal'; + + const titles: Record = { + '/': 'Home - Kautilya Leadership Centre | Developing Exceptional Leaders', + '/dashboard': `Dashboard${viewSuffix}`, + '/library': `Learning Library${viewSuffix}`, + '/course': `Course Timeline${viewSuffix}`, + '/settings': `Account Settings${viewSuffix}`, + '/surveys': `Surveys & Assessments${viewSuffix}`, + '/webinars': `Live Webinars${viewSuffix}`, + '/individual-webinars': 'Professional Development Webinars - KLC Learning Portal', + '/leaderboard': `Progress Leaderboard${viewSuffix}`, + // Legacy routes for backward compatibility + '/corporate/dashboard': 'Corporate Dashboard - KLC Corporate Learning Portal', + '/corporate/library': 'Corporate Library - KLC Corporate Learning Portal', + '/corporate/course': 'Corporate Course Timeline - KLC Corporate Learning Portal', + '/corporate/settings': 'Corporate Settings - KLC Corporate Learning Portal', + '/corporate/surveys': 'Corporate Surveys - KLC Corporate Learning Portal', + '/corporate/webinars': 'Corporate Webinars - KLC Corporate Learning Portal', + '/corporate/leaderboard': 'Corporate Leaderboard - KLC Corporate Learning Portal' + }; + + const title = titles[currentPath] || 'Kautilya Leadership Centre - Premier Leadership Development Programs'; + document.title = title; + + // Enhanced meta description based on page and view type + const getDescription = (path: string, isCorporate: boolean) => { + const descriptions: Record = { + '/': { + individual: 'Transform your leadership potential with Kautilya Leadership Centre. Access personalized learning, expert guidance, and proven methodologies for exceptional leadership development.', + corporate: 'Empower your organization with KLC\'s corporate leadership development programs. Build high-performing teams and drive organizational excellence through proven leadership methodologies.' + }, + '/dashboard': { + individual: 'Your personalized learning dashboard featuring progress tracking, course recommendations, achievements, and interactive learning analytics tailored to your leadership journey.', + corporate: 'Corporate learning dashboard with comprehensive team progress analytics, assignment management, organizational insights, and performance tracking for enterprise-wide leadership development.' + }, + '/library': { + individual: 'Access your complete learning library with courses, resources, assessments, and expert content designed to accelerate your leadership development and professional growth.', + corporate: 'Corporate learning library featuring assigned courses, organizational resources, team collaboration tools, and curated content for comprehensive leadership development programs.' + }, + '/course': { + individual: 'Interactive course timeline with structured lessons, progress tracking, expert instruction, and peer collaboration to maximize your leadership learning experience.', + corporate: 'Corporate course timeline featuring team collaboration, company-specific content, group assignments, and organizational learning objectives aligned with business goals.' + }, + '/settings': { + individual: 'Manage your learning profile, notification preferences, privacy settings, and account configuration to optimize your personalized leadership development experience.', + corporate: 'Configure corporate learning preferences, team management settings, organizational integrations, and administrative controls for seamless enterprise learning management.' + }, + '/surveys': { + individual: 'Complete comprehensive leadership assessments, provide learning feedback, and access detailed insights to guide your professional development and growth strategy.', + corporate: 'Access corporate assessments, organizational feedback surveys, team evaluations, and comprehensive analytics to measure and improve leadership effectiveness across your organization.' + }, + '/webinars': { + individual: 'Join live and recorded webinars featuring industry experts, interactive Q&A sessions, and cutting-edge leadership insights to enhance your professional development.', + corporate: 'Access exclusive corporate webinars, company-specific learning sessions, team workshops, and organizational development programs designed for enterprise leadership growth.' + }, + '/leaderboard': { + individual: 'Track your learning progress, compare achievements with peer learners, and celebrate milestones in your leadership development journey through gamified learning analytics.', + corporate: 'Monitor team and organizational learning progress, track collective achievements, analyze performance metrics, and drive engagement through corporate learning leaderboards.' + }, + '/individual-webinars': { + individual: 'Explore webinars specifically designed for individual professional development, featuring expert speakers, interactive sessions, and actionable leadership strategies.', + corporate: 'Discover individual-focused webinars perfect for personal development within corporate programs, offering flexible learning opportunities for busy professionals.' + } + }; + + const pathDescriptions = descriptions[path]; + if (pathDescriptions) { + return isCorporate ? pathDescriptions.corporate : pathDescriptions.individual; + } + return 'Kautilya Leadership Centre - Premier leadership development programs combining innovative methodologies, expert guidance, and proven results for modern organizations and professionals.'; + }; + + const description = getDescription(currentPath, isCorporateView); + + let metaDescription = document.querySelector('meta[name="description"]'); + if (!metaDescription) { + metaDescription = document.createElement('meta'); + metaDescription.setAttribute('name', 'description'); + document.head.appendChild(metaDescription); + } + metaDescription.setAttribute('content', description); + + // Add structured data for better SEO + const structuredData = { + "@context": "https://schema.org", + "@type": "EducationalOrganization", + "name": "Kautilya Leadership Centre", + "url": "https://klc.edu", + "description": description, + "educationalCredentialAwarded": "Leadership Development Certification" + }; + + let structuredDataScript = document.querySelector('#structured-data'); + if (!structuredDataScript) { + structuredDataScript = document.createElement('script'); + structuredDataScript.id = 'structured-data'; + structuredDataScript.type = 'application/ld+json'; + document.head.appendChild(structuredDataScript); + } + structuredDataScript.textContent = JSON.stringify(structuredData); + }, [currentPath]); + + // Determine if current path should show certain components + const shouldShowFooter = () => currentPath === '/'; + + return ( +
+ {/* Enhanced skip to main content link */} + + Skip to main content + + + {/* Navigation */} + + + {/* Main Content Area */} +
+
+ {children} +
+
+ + {/* Footer - Only on home page */} + {shouldShowFooter() &&
} + + {/* KLC Assistant */} + + + {/* Global Notifications Area */} +
+ {notification && ( + setNotification(null)} + /> + )} +
+ + {/* Live region for screen readers */} +
+
+ ); +} + +// Enhanced Error Boundary with KLC branding +class ErrorBoundary extends React.Component< + { children: React.ReactNode }, + { hasError: boolean; error?: Error; errorInfo?: React.ErrorInfo } +> { + constructor(props: { children: React.ReactNode }) { + super(props); + this.state = { hasError: false }; + } + + static getDerivedStateFromError(error: Error) { + return { hasError: true, error }; + } + + componentDidCatch(error: Error, errorInfo: React.ErrorInfo) { + console.error('KLC App Error Boundary caught an error:', error, errorInfo); + this.setState({ errorInfo }); + + // Log error to monitoring service in production + if (process.env.NODE_ENV === 'production') { + // Add error tracking service integration here + console.log('Error logged to monitoring service'); + } + } + + render() { + if (this.state.hasError) { + return ( +
+
+ {/* Error icon with KLC branding */} +
+ +
+ +

+ Oops! Something went wrong +

+ +

+ We apologize for the inconvenience. Our technical team has been notified and is working to resolve this issue. + Please try refreshing the page or return to the home page. +

+ +
+ + + +
+ + {/* Contact support */} +
+

+ Need immediate assistance? +

+

+ Contact our support team for help +

+
+ + {/* Error details for development */} + {process.env.NODE_ENV === 'development' && this.state.error && ( +
+ + Technical Details (Development Mode) + +
+
+

Error Message:

+

+ {this.state.error.message} +

+
+
+

Stack Trace:

+
+                      {this.state.error.stack}
+                    
+
+ {this.state.errorInfo && ( +
+

Component Stack:

+
+                        {this.state.errorInfo.componentStack}
+                      
+
+ )} +
+
+ )} +
+
+ ); + } + + return this.props.children; + } +} + +// Main App Component with enhanced initialization +export default function App() { + const [isLoading, setIsLoading] = useState(true); + const [initializationError, setInitializationError] = useState(null); + + useEffect(() => { + const initializeApp = async () => { + try { + // Simulate app initialization with proper loading states + await new Promise(resolve => setTimeout(resolve, 800)); + + // Check for critical dependencies + if (!window.location || !document.body) { + throw new Error('Critical browser APIs unavailable'); + } + + // Initialize app successfully + setIsLoading(false); + + // Announce app ready to screen readers + const announcement = 'Kautilya Leadership Centre learning portal is ready'; + const announcer = document.createElement('div'); + announcer.setAttribute('aria-live', 'polite'); + announcer.className = 'sr-only'; + announcer.textContent = announcement; + document.body.appendChild(announcer); + setTimeout(() => { + if (announcer.parentNode) { + document.body.removeChild(announcer); + } + }, 1000); + + } catch (error) { + console.error('App initialization failed:', error); + setInitializationError(error instanceof Error ? error.message : 'Unknown initialization error'); + setIsLoading(false); + } + }; + + initializeApp(); + }, []); + + // Show loading screen during app initialization + if (isLoading) { + return ; + } + + // Show initialization error if it occurred + if (initializationError) { + return ( +
+
+
+ +
+

+ Initialization Failed +

+

+ The application failed to start properly. Please refresh the page or try again later. +

+ +
+
+ ); + } + + return ( + + + + + + + + ); +} \ No newline at end of file diff --git a/src/Attributions.md b/src/Attributions.md new file mode 100644 index 0000000..9b7cd4e --- /dev/null +++ b/src/Attributions.md @@ -0,0 +1,3 @@ +This Figma Make file includes components from [shadcn/ui](https://ui.shadcn.com/) used under [MIT license](https://github.com/shadcn-ui/ui/blob/main/LICENSE.md). + +This Figma Make file includes photos from [Unsplash](https://unsplash.com) used under [license](https://unsplash.com/license). \ No newline at end of file diff --git a/src/Guidelines.md b/src/Guidelines.md new file mode 100644 index 0000000..23e491f --- /dev/null +++ b/src/Guidelines.md @@ -0,0 +1,140 @@ +# KLC Website Guidelines + +## Query Parameter Dashboard System + +### Unified Dashboard Routing +* **Primary Route**: `/dashboard` - Auto-detects user type or defaults to individual +* **Explicit Routes**: + - `/dashboard?view=individual` - Forces individual learner view + - `/dashboard?view=corporate` - Forces corporate learner view +* **All Learner Portal Pages** now support query parameters: + - `/library?view=individual` or `/library?view=corporate` + - `/settings?view=individual` or `/settings?view=corporate` + - `/surveys?view=individual` or `/surveys?view=corporate` + - `/webinars?view=individual` or `/webinars?view=corporate` + - `/leaderboard?view=individual` or `/leaderboard?view=corporate` + +### Legacy Route Handling +* **Automatic Redirects**: Old `/corporate/*` routes redirect to query parameter equivalents +* **Backward Compatibility**: Legacy routes still work but redirect users to new URLs +* **URL Updates**: Browser history automatically updates to new query parameter format + +## Page Header & Navigation Standards + +### Universal Back Button Requirements +* **All internal pages must include a back button** in the header for consistent navigation +* **Header structure**: Use `pt-24 pb-8` to account for fixed navbar (70px + padding) +* **Back button placement**: Position in top-left of header with proper spacing and alignment +* **Navigation logic**: Back button should return users to their expected previous page: + - Individual learner pages → Individual dashboard (`/dashboard?view=individual`) + - Corporate learner pages → Corporate dashboard (`/dashboard?view=corporate`) + - Service pages → Services overview (`/services`) [Deprecated - redirects to home] + - About pages → About overview (`/about-us/our-vision`) [Deprecated - redirects to home] + - Learning pages → Learning hub (`/learning/articles`) [Deprecated - redirects to home] + - General pages → Home page (`/`) + +### Header Component Pattern +```tsx +// Standard header pattern for all pages +
+
+
{/* Adjust max-width based on content */} +
+ +
+

[Page Title]

+

+ [Page description] +

+
+
+
+
+
+``` + +### Required Imports for Back Navigation +```tsx +import { ArrowLeft } from 'lucide-react'; +import { navigateTo } from '../components/Router'; +``` + +### Standard Navigation Handler +```tsx +const handleBackNavigation = () => { + // Choose appropriate navigation based on page context + navigateTo('/dashboard?view=individual'); // or /dashboard?view=corporate for corporate learners +}; +``` + +## Typography & Font Sizing + +### Minimum Font Size Requirements +* **Absolute minimum font size**: 14px (0.875rem at 14px base) +* **Preferred minimum font size**: 16px (1rem at 14px base) +* **Never use font sizes smaller than 14px** for any text content +* Use 16px (1rem) for all body text, labels, buttons, and form inputs +* Use 14px (0.875rem) only for small text elements like captions, metadata, or legal text + +### Typography Hierarchy +* **H1**: 36px (2.25rem) - Page titles +* **H2**: 30px (1.875rem) - Section headings +* **H3**: 24px (1.5rem) - Subsection headings +* **H4**: 20px (1.25rem) - Component titles +* **H5**: 18px (1.125rem) - Card titles +* **H6**: 16px (1rem) - Small headings +* **Body text**: 16px (1rem) - All paragraph text +* **Labels/Buttons**: 16px (1rem) - Form labels, button text +* **Small text**: 14px (0.875rem) - Captions, metadata, fine print + +### Font Implementation Rules +* Always use explicit font sizes in Tailwind classes when overriding defaults +* Use `text-base` (16px) as the default for most text content +* Use `text-sm` (14px) sparingly for secondary information +* Never use `text-xs` (12px) - override with `text-sm` minimum +* Ensure good contrast ratios (minimum 4.5:1) with all font sizes + +## Layout & Spacing + +### Horizontal Padding +* Apply consistent horizontal padding to all page sections using the same values as the navigation bar +* Use `px-4 lg:px-8` pattern for consistent horizontal spacing +* Container sections should use `container mx-auto px-4 lg:px-8` + +### Accessibility +* Minimum 44×44px touch targets for buttons and interactive elements +* Respect `prefers-reduced-motion` for animations +* Maintain WCAG 2.1 AA compliance +* Test all font sizes for readability across devices + +## Component Guidelines + +### Text Elements +* Override default component font sizes if they fall below 14px +* Explicitly set typography classes on all text elements +* Use semantic HTML elements with appropriate font sizes +* Ensure form inputs and labels are minimum 16px for mobile usability + +### Responsive Design +* Test font sizes across all breakpoints +* Ensure readability on mobile devices (minimum 16px for body text) +* Use responsive typography classes where appropriate + +## Quality Checks + +Before finalizing any page or component: +1. ✅ Verify no text is smaller than 14px +2. ✅ Confirm body text and interactive elements are 16px +3. ✅ Test readability across different screen sizes +4. ✅ Check contrast ratios meet accessibility standards +5. ✅ Ensure consistent horizontal padding with navigation + +Some of the base components you are using may have styling (eg. gap/typography) baked in as defaults. Make sure you explicitly set any styling information from the guidelines in the generated React to override the defaults. \ No newline at end of file diff --git a/src/assets/037c4659b7b0bf15b1dfdcd4868cb42e8257e838.png b/src/assets/037c4659b7b0bf15b1dfdcd4868cb42e8257e838.png new file mode 100644 index 0000000..2f28f66 Binary files /dev/null and b/src/assets/037c4659b7b0bf15b1dfdcd4868cb42e8257e838.png differ diff --git a/src/assets/1b56e6afe31d5744d2e7a38d3e2f8c3ce78a90af.png b/src/assets/1b56e6afe31d5744d2e7a38d3e2f8c3ce78a90af.png new file mode 100644 index 0000000..f816613 Binary files /dev/null and b/src/assets/1b56e6afe31d5744d2e7a38d3e2f8c3ce78a90af.png differ diff --git a/src/assets/1bb9c22c86c0892d4716564b7135835f04869298.png b/src/assets/1bb9c22c86c0892d4716564b7135835f04869298.png new file mode 100644 index 0000000..89ce7f3 Binary files /dev/null and b/src/assets/1bb9c22c86c0892d4716564b7135835f04869298.png differ diff --git a/src/assets/209958db0c439ec78be82ab4f3e335a6aed5de89.png b/src/assets/209958db0c439ec78be82ab4f3e335a6aed5de89.png new file mode 100644 index 0000000..b9b48a8 Binary files /dev/null and b/src/assets/209958db0c439ec78be82ab4f3e335a6aed5de89.png differ diff --git a/src/assets/2824e18f6ed39b8e82cf8a9fc215648cde48d2f4.png b/src/assets/2824e18f6ed39b8e82cf8a9fc215648cde48d2f4.png new file mode 100644 index 0000000..baf8777 Binary files /dev/null and b/src/assets/2824e18f6ed39b8e82cf8a9fc215648cde48d2f4.png differ diff --git a/src/assets/3a97bc3c43824d72250953bd1d41ece20112a45a.png b/src/assets/3a97bc3c43824d72250953bd1d41ece20112a45a.png new file mode 100644 index 0000000..2f7a207 Binary files /dev/null and b/src/assets/3a97bc3c43824d72250953bd1d41ece20112a45a.png differ diff --git a/src/assets/468d85c60825612022ad15f5afa770440bd885e1.png b/src/assets/468d85c60825612022ad15f5afa770440bd885e1.png new file mode 100644 index 0000000..fa17e8b Binary files /dev/null and b/src/assets/468d85c60825612022ad15f5afa770440bd885e1.png differ diff --git a/src/assets/4833274f0a593cd31fdefe553b70bb016de281af.png b/src/assets/4833274f0a593cd31fdefe553b70bb016de281af.png new file mode 100644 index 0000000..7840c2b Binary files /dev/null and b/src/assets/4833274f0a593cd31fdefe553b70bb016de281af.png differ diff --git a/src/assets/50c9ddeeb90128ebffbfbfe2dea36d09c03b5335.png b/src/assets/50c9ddeeb90128ebffbfbfe2dea36d09c03b5335.png new file mode 100644 index 0000000..a707dcc Binary files /dev/null and b/src/assets/50c9ddeeb90128ebffbfbfe2dea36d09c03b5335.png differ diff --git a/src/assets/5fddc261d2e35ee810113f2537c5a59a97fd7fbd.png b/src/assets/5fddc261d2e35ee810113f2537c5a59a97fd7fbd.png new file mode 100644 index 0000000..67daf04 Binary files /dev/null and b/src/assets/5fddc261d2e35ee810113f2537c5a59a97fd7fbd.png differ diff --git a/src/assets/624ce058c9c961b32643853cf5c692afe9d3ed60.png b/src/assets/624ce058c9c961b32643853cf5c692afe9d3ed60.png new file mode 100644 index 0000000..306ac0d Binary files /dev/null and b/src/assets/624ce058c9c961b32643853cf5c692afe9d3ed60.png differ diff --git a/src/assets/6bdf8056f51bbdc6dd9dab9044a6579a254bd02c.png b/src/assets/6bdf8056f51bbdc6dd9dab9044a6579a254bd02c.png new file mode 100644 index 0000000..e8179a1 Binary files /dev/null and b/src/assets/6bdf8056f51bbdc6dd9dab9044a6579a254bd02c.png differ diff --git a/src/assets/6cae567b6bf6a44cb03b767e4308c4c705340d08.png b/src/assets/6cae567b6bf6a44cb03b767e4308c4c705340d08.png new file mode 100644 index 0000000..1aa6694 Binary files /dev/null and b/src/assets/6cae567b6bf6a44cb03b767e4308c4c705340d08.png differ diff --git a/src/assets/75c17cf51744205abe7b7042766b8dfdb7b2e8a4.png b/src/assets/75c17cf51744205abe7b7042766b8dfdb7b2e8a4.png new file mode 100644 index 0000000..bc93f8b Binary files /dev/null and b/src/assets/75c17cf51744205abe7b7042766b8dfdb7b2e8a4.png differ diff --git a/src/assets/9852710543a90e291ecb85d77ea02234139264c5.png b/src/assets/9852710543a90e291ecb85d77ea02234139264c5.png new file mode 100644 index 0000000..f63a105 Binary files /dev/null and b/src/assets/9852710543a90e291ecb85d77ea02234139264c5.png differ diff --git a/src/assets/9ebc01e8eb24f9d71683b2ee63d224583a979590.png b/src/assets/9ebc01e8eb24f9d71683b2ee63d224583a979590.png new file mode 100644 index 0000000..e64680f Binary files /dev/null and b/src/assets/9ebc01e8eb24f9d71683b2ee63d224583a979590.png differ diff --git a/src/assets/a224fb6efc954992c535e482fe88d93f1f4178d8.png b/src/assets/a224fb6efc954992c535e482fe88d93f1f4178d8.png new file mode 100644 index 0000000..2ffbc35 Binary files /dev/null and b/src/assets/a224fb6efc954992c535e482fe88d93f1f4178d8.png differ diff --git a/src/assets/ae07aac2d7927002260d7261da0eee0c09a8352f.png b/src/assets/ae07aac2d7927002260d7261da0eee0c09a8352f.png new file mode 100644 index 0000000..46f9018 Binary files /dev/null and b/src/assets/ae07aac2d7927002260d7261da0eee0c09a8352f.png differ diff --git a/src/assets/c2d0a01da274cef655bbdfb1b11ff3e9993ea278.png b/src/assets/c2d0a01da274cef655bbdfb1b11ff3e9993ea278.png new file mode 100644 index 0000000..22f6c26 Binary files /dev/null and b/src/assets/c2d0a01da274cef655bbdfb1b11ff3e9993ea278.png differ diff --git a/src/assets/c501c3d3f3a828828d4cb2dadb9558b43986718f.png b/src/assets/c501c3d3f3a828828d4cb2dadb9558b43986718f.png new file mode 100644 index 0000000..5459038 Binary files /dev/null and b/src/assets/c501c3d3f3a828828d4cb2dadb9558b43986718f.png differ diff --git a/src/assets/c57ec1f4466f68e607139a3cd6d52f7e2f372408.png b/src/assets/c57ec1f4466f68e607139a3cd6d52f7e2f372408.png new file mode 100644 index 0000000..7c12ba6 Binary files /dev/null and b/src/assets/c57ec1f4466f68e607139a3cd6d52f7e2f372408.png differ diff --git a/src/assets/d5bab6ea4f3d8cef3b0425c45cfee7faea19fdbc.png b/src/assets/d5bab6ea4f3d8cef3b0425c45cfee7faea19fdbc.png new file mode 100644 index 0000000..af42a55 Binary files /dev/null and b/src/assets/d5bab6ea4f3d8cef3b0425c45cfee7faea19fdbc.png differ diff --git a/src/assets/e8fad960112d5eba554c3969d08891ebe4d4b9c7.png b/src/assets/e8fad960112d5eba554c3969d08891ebe4d4b9c7.png new file mode 100644 index 0000000..178eec3 Binary files /dev/null and b/src/assets/e8fad960112d5eba554c3969d08891ebe4d4b9c7.png differ diff --git a/src/assets/f7fa2dab6765df7645e62459459afe9a6ff4959b.png b/src/assets/f7fa2dab6765df7645e62459459afe9a6ff4959b.png new file mode 100644 index 0000000..7d8e14f Binary files /dev/null and b/src/assets/f7fa2dab6765df7645e62459459afe9a6ff4959b.png differ diff --git a/src/assets/fc9194a6dac9bc6614c0646ed0b66177408ca5e6.png b/src/assets/fc9194a6dac9bc6614c0646ed0b66177408ca5e6.png new file mode 100644 index 0000000..e5d3cc3 Binary files /dev/null and b/src/assets/fc9194a6dac9bc6614c0646ed0b66177408ca5e6.png differ diff --git a/src/components/AIChatbot.tsx b/src/components/AIChatbot.tsx new file mode 100644 index 0000000..884d67a --- /dev/null +++ b/src/components/AIChatbot.tsx @@ -0,0 +1,337 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { Button } from './ui/button'; +import { Card, CardContent, CardHeader, CardTitle } from './ui/card'; +import { Badge } from './ui/badge'; +import { + MessageCircle, + X, + Send, + Bot, + User, + Minimize2, + Maximize2 +} from 'lucide-react'; +import { Input } from './ui/input'; +import { ScrollArea } from './ui/scroll-area'; + +interface Message { + id: string; + type: 'user' | 'bot'; + content: string; + timestamp: Date; + suggestions?: string[]; +} + +const initialMessage: Message = { + id: '1', + type: 'bot', + content: "Hi! I'm here to help you explore KLC's leadership programs and facilities. What are you looking for today?", + timestamp: new Date(), + suggestions: [ + "Show me leadership programs", + "Book a facility tour", + "Upcoming webinars", + "Contact information" + ] +}; + +const botResponses: Record = { + "programs": { + content: "Great! We offer various leadership development programs including Executive Leadership, Strategic Management, and Team Building workshops. Would you like to explore specific programs or see our full catalog?", + suggestions: ["View all programs", "Executive programs", "Team building", "Custom corporate training"] + }, + "facilities": { + content: "Our state-of-the-art facilities include modern conference rooms, training halls, and collaboration spaces. You can take a virtual tour or book a facility for your event.", + suggestions: ["Virtual tour", "Book conference room", "Training halls", "Facility pricing"] + }, + "webinars": { + content: "We host regular webinars on leadership topics. You can view upcoming sessions, register for live events, or access our library of recorded sessions.", + suggestions: ["Upcoming webinars", "Recorded sessions", "Register for webinar", "Webinar schedule"] + }, + "contact": { + content: "You can reach us at info@klc.edu.in or call +91 11 4567 8900. Our team is available Monday to Friday, 9 AM to 6 PM IST. You can also schedule a consultation.", + suggestions: ["Schedule consultation", "Email us", "Office locations", "Support hours"] + }, + "default": { + content: "I can help you with information about our programs, facilities, webinars, and more. What would you like to know?", + suggestions: ["Leadership programs", "Facility booking", "Webinars", "Contact us"] + } +}; + +export function AIChatbot() { + const [isVisible, setIsVisible] = useState(true); // Show immediately for testing + const [isOpen, setIsOpen] = useState(false); + const [isMinimized, setIsMinimized] = useState(false); + const [messages, setMessages] = useState([initialMessage]); + const [inputValue, setInputValue] = useState(''); + const [isTyping, setIsTyping] = useState(false); + const messagesEndRef = useRef(null); + const inactivityTimerRef = useRef(); + + // Show chatbot after shorter delay for better UX + useEffect(() => { + const resetTimer = () => { + if (inactivityTimerRef.current) { + clearTimeout(inactivityTimerRef.current); + } + + inactivityTimerRef.current = setTimeout(() => { + if (!isOpen) { + setIsVisible(true); + } + }, 5000); // Reduced to 5 seconds for better visibility + }; + + const events = ['mousedown', 'mousemove', 'keypress', 'scroll', 'touchstart']; + + const addEventListeners = () => { + events.forEach(event => { + document.addEventListener(event, resetTimer, true); + }); + }; + + const removeEventListeners = () => { + events.forEach(event => { + document.removeEventListener(event, resetTimer, true); + }); + }; + + addEventListeners(); + resetTimer(); + + return () => { + removeEventListeners(); + if (inactivityTimerRef.current) { + clearTimeout(inactivityTimerRef.current); + } + }; + }, [isOpen]); + + // Auto-scroll to bottom of messages + useEffect(() => { + messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + }, [messages]); + + const getBotResponse = (userMessage: string): { content: string; suggestions?: string[] } => { + const message = userMessage.toLowerCase(); + + if (message.includes('program') || message.includes('course') || message.includes('training')) { + return botResponses.programs; + } else if (message.includes('facility') || message.includes('book') || message.includes('room')) { + return botResponses.facilities; + } else if (message.includes('webinar') || message.includes('session') || message.includes('online')) { + return botResponses.webinars; + } else if (message.includes('contact') || message.includes('phone') || message.includes('email')) { + return botResponses.contact; + } else { + return botResponses.default; + } + }; + + const handleSendMessage = async (content: string) => { + if (!content.trim()) return; + + // Add user message + const userMessage: Message = { + id: Date.now().toString(), + type: 'user', + content: content.trim(), + timestamp: new Date() + }; + + setMessages(prev => [...prev, userMessage]); + setInputValue(''); + setIsTyping(true); + + // Simulate typing delay + setTimeout(() => { + const response = getBotResponse(content); + const botMessage: Message = { + id: (Date.now() + 1).toString(), + type: 'bot', + content: response.content, + timestamp: new Date(), + suggestions: response.suggestions + }; + + setMessages(prev => [...prev, botMessage]); + setIsTyping(false); + }, 1000 + Math.random() * 1000); // 1-2 second delay + }; + + const handleSuggestionClick = (suggestion: string) => { + handleSendMessage(suggestion); + }; + + const formatTime = (date: Date) => { + return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); + }; + + if (!isVisible) return null; + + return ( + <> + {/* Chatbot Toggle Button */} + {!isOpen && ( + + )} + + {/* Chat Window */} + {isOpen && ( + + {/* Header */} + +
+
+ +
+
+ KLC Assistant +
+
+ Online & Ready to Help +
+
+
+
+ + +
+
+ + {/* Chat Content */} + {!isMinimized && ( + + {/* Messages */} + +
+ {messages.map((message) => ( +
+
+
+ {message.type === 'user' ? ( + + ) : ( + + )} +
+
+
+

{message.content}

+
+ {message.suggestions && ( +
+ {message.suggestions.map((suggestion, index) => ( + handleSuggestionClick(suggestion)} + > + {suggestion} + + ))} +
+ )} +

+ {formatTime(message.timestamp)} +

+
+
+
+ ))} + + {isTyping && ( +
+
+
+ +
+
+
+
+
+
+
+
+
+
+ )} +
+
+ + + {/* Input */} +
+
{ + e.preventDefault(); + handleSendMessage(inputValue); + }} + className="flex gap-2" + role="form" + aria-label="Chat message form" + > + setInputValue(e.target.value)} + placeholder="Type your message..." + className="flex-1 text-base min-h-[44px]" + disabled={isTyping} + aria-label="Chat message input" + /> + +
+
+ + )} + + )} + + ); +} \ No newline at end of file diff --git a/src/components/AuthContext.tsx b/src/components/AuthContext.tsx new file mode 100644 index 0000000..b05d6db --- /dev/null +++ b/src/components/AuthContext.tsx @@ -0,0 +1,92 @@ +import React, { createContext, useContext, useState, useEffect } from 'react'; + +interface User { + id: string; + name: string; + email: string; + role: string; + corporateName: string; + avatar?: string; +} + +interface AuthContextType { + user: User | null; + isAuthenticated: boolean; + signIn: (userData: User) => void; + signOut: () => void; + login: (email: string, password: string) => Promise; +} + +const AuthContext = createContext(undefined); + +export function AuthProvider({ children }: { children: React.ReactNode }) { + const [user, setUser] = useState(null); + + // Check for existing session on app load + useEffect(() => { + const savedUser = localStorage.getItem('klc_user'); + if (savedUser) { + try { + setUser(JSON.parse(savedUser)); + } catch (error) { + localStorage.removeItem('klc_user'); + } + } + }, []); + + const signIn = (userData: User) => { + setUser(userData); + localStorage.setItem('klc_user', JSON.stringify(userData)); + }; + + const signOut = () => { + setUser(null); + localStorage.removeItem('klc_user'); + }; + + // Mock login function that simulates authentication + const login = async (email: string, password: string): Promise => { + // Simulate API call delay + await new Promise(resolve => setTimeout(resolve, 500)); + + // Create mock user data based on email to determine user type + const isCorporateUser = email.includes('corporate') || email.includes('@company') || email.includes('@corp'); + + const mockUser: User = { + id: Date.now().toString(), + name: isCorporateUser + ? 'Priya Sharma' + : 'Priya Sharma', + email: email || 'demo@klc.edu', + role: isCorporateUser ? 'corporate' : 'individual', + corporateName: isCorporateUser ? 'Demo Corporation' : '', + avatar: undefined + }; + + // Set user data + setUser(mockUser); + localStorage.setItem('klc_user', JSON.stringify(mockUser)); + }; + + const value = { + user, + isAuthenticated: !!user, + signIn, + signOut, + login + }; + + return ( + + {children} + + ); +} + +export function useAuth() { + const context = useContext(AuthContext); + if (context === undefined) { + throw new Error('useAuth must be used within an AuthProvider'); + } + return context; +} \ No newline at end of file diff --git a/src/components/CTABanner.tsx b/src/components/CTABanner.tsx new file mode 100644 index 0000000..8fb5892 --- /dev/null +++ b/src/components/CTABanner.tsx @@ -0,0 +1,2 @@ +// CTABanner component has been removed +// This file is left empty to prevent import errors \ No newline at end of file diff --git a/src/components/CartConfirmationModal.tsx b/src/components/CartConfirmationModal.tsx new file mode 100644 index 0000000..a09ef5e --- /dev/null +++ b/src/components/CartConfirmationModal.tsx @@ -0,0 +1,358 @@ +import React, { useEffect, useState } from 'react'; +import { Button } from './ui/button'; +import { ImageWithFallback } from './figma/ImageWithFallback'; +import { X, ShoppingCart, CheckCircle, Trash2 } from 'lucide-react'; + +interface CartItem { + id: string; + title: string; + price: string; + originalPrice?: string; + image: string; + type: string; +} + +interface CartConfirmationModalProps { + isOpen: boolean; + onClose: () => void; + item: CartItem | null; + onGoToCart: () => void; +} + +export function CartConfirmationModal({ + isOpen, + onClose, + item, + onGoToCart +}: CartConfirmationModalProps) { + const [isVisible, setIsVisible] = useState(false); + const [cartItems, setCartItems] = useState([]); + + useEffect(() => { + if (isOpen) { + setIsVisible(true); + // Load all cart items + const existingCart = JSON.parse(localStorage.getItem('cart') || '[]'); + setCartItems(existingCart); + // Prevent body scroll when modal is open + document.body.style.overflow = 'hidden'; + } else { + setIsVisible(false); + document.body.style.overflow = 'unset'; + } + + // Cleanup on unmount + return () => { + document.body.style.overflow = 'unset'; + }; + }, [isOpen]); + + const handleClose = () => { + setIsVisible(false); + setTimeout(() => { + onClose(); + }, 300); // Wait for animation to complete + }; + + const handleBackdropClick = (e: React.MouseEvent) => { + if (e.target === e.currentTarget) { + handleClose(); + } + }; + + const handleGoToCart = () => { + handleClose(); + // Direct navigation to cart page + window.location.href = '/cart'; + }; + + const handleRemoveItem = (itemId: string) => { + const updatedCart = cartItems.filter(item => item.id !== itemId); + setCartItems(updatedCart); + localStorage.setItem('cart', JSON.stringify(updatedCart)); + }; + + const calculateSubtotal = () => { + return cartItems.reduce((total, cartItem) => { + const price = parseInt(cartItem.price.replace(/[₹,]/g, '')); + return total + price; + }, 0); + }; + + const formatPrice = (price: string) => { + const numericPrice = parseInt(price.replace(/[₹,]/g, '')); + return `₹${numericPrice.toLocaleString()}`; + }; + + if (!isOpen || !item) return null; + + const subtotal = calculateSubtotal(); + + return ( +
+ {/* Backdrop */} + + ); +} \ No newline at end of file diff --git a/src/components/FacilityShowcaseCard.tsx b/src/components/FacilityShowcaseCard.tsx new file mode 100644 index 0000000..7b35ed0 --- /dev/null +++ b/src/components/FacilityShowcaseCard.tsx @@ -0,0 +1,212 @@ +import React from 'react'; +import { Card, CardContent, CardHeader, CardTitle } from './ui/card'; +import { Badge } from './ui/badge'; +import { Button } from './ui/button'; +import { ImageWithFallback } from './figma/ImageWithFallback'; +import { navigateTo } from './Router'; +import { + Star, + Users, + MapPin, + Calendar, + Clock, + ArrowRight, + TrendingUp +} from 'lucide-react'; + +interface FacilityShowcaseCardProps { + facility: { + id: string; + name: string; + description: string; + capacity: string; + area: string; + hourlyPrice: number; + dayPrice: number; + rating: number; + bookings: number; + availability: 'available' | 'limited' | 'unavailable'; + category: string; + features: string[]; + image: string; + analyticsData?: { + occupancy: string; + satisfaction: string; + rebookRate: string; + }; + }; +} + +export function FacilityShowcaseCard({ facility }: FacilityShowcaseCardProps) { + const formatPrice = (price: number) => { + return new Intl.NumberFormat('en-IN', { + style: 'currency', + currency: 'INR', + maximumFractionDigits: 0 + }).format(price); + }; + + const getAvailabilityColor = (availability: string) => { + switch (availability) { + case 'available': return 'text-success'; + case 'limited': return 'text-yellow-600'; + case 'unavailable': return 'text-destructive'; + default: return 'text-muted-foreground'; + } + }; + + const getAvailabilityText = (availability: string) => { + switch (availability) { + case 'available': return 'Available'; + case 'limited': return 'Limited'; + case 'unavailable': return 'Fully Booked'; + default: return 'Unknown'; + } + }; + + const analyticsData = facility.analyticsData || { + occupancy: '17.8K', + satisfaction: '1.3%', + rebookRate: '25.4' + }; + + return ( + + {/* Header with badges and rating */} +
+
+
+ + {facility.category} + + + {getAvailabilityText(facility.availability)} + +
+
+ + {facility.rating} +
+
+ + {/* Analytics Chart Placeholder */} +
+
+
+
Total Book
+
223
+
+
+
This Month
+
{analyticsData.occupancy}
+
+
+
Analytics
+
{analyticsData.satisfaction}
+
+
+
Client Sat
+
{analyticsData.rebookRate}
+
+
+ + {/* Chart visualization */} +
+ + + + +
Jan 23
+
Dec 24
+
+
+
+ + {/* Facility Information */} + + + {facility.name} + +

+ {facility.description} +

+
+ + + {/* Stats Grid */} +
+
+ + {facility.capacity} +
+
+ + {facility.area} +
+
+ + {facility.bookings} bookings +
+
+ + Hourly/Daily +
+
+ + {/* Key Features */} +
+

Key Features

+
+ {facility.features.slice(0, 3).map((feature, idx) => ( + + {feature} + + ))} + {facility.features.length > 3 && ( + + +{facility.features.length - 3} more + + )} +
+
+ + {/* Pricing */} +
+
+
Starting from
+
+ {formatPrice(facility.hourlyPrice)}/hour +
+
+ {formatPrice(facility.dayPrice)}/day +
+
+ + +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx new file mode 100644 index 0000000..d0259b1 --- /dev/null +++ b/src/components/Footer.tsx @@ -0,0 +1,190 @@ +import React from 'react'; +import { Button } from './ui/button'; +import klcLogo from 'figma:asset/c2d0a01da274cef655bbdfb1b11ff3e9993ea278.png'; +import { navigateTo } from './Router'; +import { + Mail, + Phone, + MapPin, + Linkedin, + Instagram +} from 'lucide-react'; + +// Custom X (formerly Twitter) icon component +const XIcon = ({ className }: { className?: string }) => ( + +); + +const footerSections = [ + { + title: 'Services', + links: [ + { name: 'All Services', href: '/services' }, + { name: 'Leadership Development', href: '/services/leadership-development' }, + { name: 'Management Development', href: '/services/management-development' }, + { name: 'Executive Coaching', href: '/services/executive-coaching' } + ] + }, + { + title: 'Learning', + links: [ + { name: 'Articles', href: '/learning/articles' }, + { name: 'Blogs', href: '/learning/blogs' }, + { name: 'Webcasts', href: '/learning/webcasts' } + ] + }, + { + title: 'Facilities', + links: [ + { name: 'Virtual Tour', href: '/facility-tour' }, + { name: 'Learning Facility', href: '/services/learning-facility' }, + { name: 'Boarding & Lodging Facility', href: '/facility/boarding-lodging' }, + { name: 'Recreation Facility', href: '/facility/recreation' } + ] + }, + { + title: 'Support', + links: [ + { name: 'Contact Us', href: '/contact' }, + { name: 'Login', href: '/login' }, + { name: 'Sign Up', href: '/signup' } + ] + } +]; + +const socialLinks = [ + { name: 'LinkedIn', href: '#', icon: Linkedin }, + { name: 'X', href: '#', icon: XIcon }, + { name: 'Instagram', href: '#', icon: Instagram } +]; + +export function Footer() { + return ( +
+ {/* Main Footer Content */} +
+
+ {/* Brand Section */} +
+
+ Kautilya Leadership Centre +
+ +

+ Empowering leaders and organizations worldwide through innovative leadership + development programs, cutting-edge research, and transformational learning experiences. +

+ + {/* Contact Info */} +
+
+ + 123 Leadership Avenue, New Delhi, India 110001 +
+
+ + +91 11 4567 8900 +
+
+ + info@klc.edu.in +
+
+ + {/* Social Links */} +
+ {socialLinks.map((social) => { + const Icon = social.icon; + return ( + + ); + })} +
+
+ + {/* Footer Links */} + {footerSections.map((section) => ( +
+

{section.title}

+
    + {section.links.map((link) => ( +
  • + +
  • + ))} +
+
+ ))} +
+
+ + {/* Bottom Section */} +
+
+
+
+ © 2025 Kautilya Leadership Centre. All rights reserved. +
+ + +
+
+ +
+ Accredited by: +
+
+ ISO +
+
+ NAAC +
+
+
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/HeroBanner.tsx b/src/components/HeroBanner.tsx new file mode 100644 index 0000000..0c9a2df --- /dev/null +++ b/src/components/HeroBanner.tsx @@ -0,0 +1,152 @@ +import React from 'react'; +import { Button } from './ui/button'; +import { ArrowRight, ChevronLeft, ChevronRight } from 'lucide-react'; +import { ImageWithFallback } from './figma/ImageWithFallback'; +import heroBannerImage from 'figma:asset/1bb9c22c86c0892d4716564b7135835f04869298.png'; + +export function HeroBanner() { + const handleEnrollNow = () => { + // Navigate to webinars page + window.location.href = '/webinars?view=individual'; + }; + + const handleBuildPipeline = () => { + // Navigate to programs catalogue or individual dashboard + window.location.href = '/dashboard?view=individual'; + }; + + return ( +
+ {/* Top Announcement Bar */} +
+
+
+ + Join Our Upcoming Leadership Webinars - Transform Your Leadership Journey + + +
+
+
+ + {/* Main Hero Section */} +
+ {/* Background Image */} +
+ + {/* Overlay for better text readability */} +
+
+ + {/* Hero Content */} +
+
+
+ {/* Main Heading */} +

+ Empowering Future-Ready Leaders +

+ + {/* Subtext */} +

+ Build confidence, agility, and clarity for today's complex challenges. +

+ + {/* CTA Button */} +
+ +
+
+
+
+ + {/* Bottom Feature Navigation */} +
+
+
+ {/* Feature 01 */} +
+
+
01
+
+
+
+

Leadership Is Learning. We Teach It Right.

+

+ Master proven methodologies and frameworks that transform managers into exceptional leaders. +

+
+
+ + {/* Feature 02 */} +
+
+
02
+
+
+
+

Turn Managers Into Impactful Leaders

+

+ Develop strategic thinking, emotional intelligence, and decision-making capabilities. +

+
+
+ + {/* Feature 03 */} +
+
+
03
+
+
+
+

Struggling with Managerial Gaps?

+

+ Bridge the gap between individual contribution and effective team leadership. +

+
+
+
+
+ + {/* Navigation Controls */} +
+ + +
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/HeroSection.tsx b/src/components/HeroSection.tsx new file mode 100644 index 0000000..5974eb4 --- /dev/null +++ b/src/components/HeroSection.tsx @@ -0,0 +1,185 @@ +import React from 'react'; +import { Button } from './ui/button'; +import { ArrowRight, ChevronLeft, ChevronRight } from 'lucide-react'; +import { ImageWithFallback } from './figma/ImageWithFallback'; +import heroBannerImage from 'figma:asset/1bb9c22c86c0892d4716564b7135835f04869298.png'; + +interface HeroSectionProps { + showAnnouncementBar?: boolean; + announcementText?: string; + announcementCTA?: string; + title?: string; + subtitle?: string; + ctaText?: string; + onAnnouncementClick?: () => void; + onCTAClick?: () => void; + showFeatures?: boolean; +} + +export function HeroSection({ + showAnnouncementBar = true, + announcementText = "Join Our Upcoming Leadership Webinars - Transform Your Leadership Journey", + announcementCTA = "Enroll Now", + title = "Empowering Future-Ready Leaders", + subtitle = "Build confidence, agility, and clarity for today's complex challenges.", + ctaText = "Build Your Leadership Pipeline", + onAnnouncementClick, + onCTAClick, + showFeatures = true +}: HeroSectionProps) { + + const handleAnnouncementClick = () => { + if (onAnnouncementClick) { + onAnnouncementClick(); + } else { + window.location.href = '/webinars?view=individual'; + } + }; + + const handleCTAClick = () => { + if (onCTAClick) { + onCTAClick(); + } else { + window.location.href = '/dashboard?view=individual'; + } + }; + + return ( +
+ {/* Top Announcement Bar */} + {showAnnouncementBar && ( +
+
+
+ + {announcementText} + + +
+
+
+ )} + + {/* Main Hero Section */} +
+ {/* Background Image */} +
+ + {/* Overlay for better text readability */} +
+
+ + {/* Hero Content */} +
+
+
+ {/* Main Heading */} +

+ {title} +

+ + {/* Subtext */} +

+ {subtitle} +

+ + {/* CTA Button */} +
+ +
+
+
+
+ + {/* Bottom Feature Navigation */} + {showFeatures && ( +
+
+
+ {/* Feature 01 */} +
+
+
01
+
+
+
+

Leadership Is Learning. We Teach It Right.

+

+ Master proven methodologies and frameworks that transform managers into exceptional leaders. +

+
+
+ + {/* Feature 02 */} +
+
+
02
+
+
+
+

Turn Managers Into Impactful Leaders

+

+ Develop strategic thinking, emotional intelligence, and decision-making capabilities. +

+
+
+ + {/* Feature 03 */} +
+
+
03
+
+
+
+

Struggling with Managerial Gaps?

+

+ Bridge the gap between individual contribution and effective team leadership. +

+
+
+
+
+ + {/* Navigation Controls */} +
+ + +
+
+ )} +
+
+ ); +} \ No newline at end of file diff --git a/src/components/Navigation.tsx b/src/components/Navigation.tsx new file mode 100644 index 0000000..89bbc37 --- /dev/null +++ b/src/components/Navigation.tsx @@ -0,0 +1,709 @@ +import React, { useState, useEffect } from 'react'; +import { Button } from './ui/button'; +import { Input } from './ui/input'; +import { Avatar, AvatarFallback, AvatarImage } from './ui/avatar'; +import { Badge } from './ui/badge'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, + DropdownMenuSeparator, + DropdownMenuLabel, +} from './ui/dropdown-menu'; +import { + Sheet, + SheetContent, + SheetHeader, + SheetTitle, + SheetTrigger, +} from './ui/sheet'; +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible'; +import { navigateTo } from './Router'; +import { useAuth } from './AuthContext'; +import klcLogo from 'figma:asset/209958db0c439ec78be82ab4f3e335a6aed5de89.png'; +import exampleImage from 'figma:asset/6cae567b6bf6a44cb03b767e4308c4c705340d08.png'; +import { + Menu, + ChevronDown, + ChevronRight, + ShoppingCart, + Search, + Building2, + User, + Settings, + LogOut, + LayoutDashboard, + Users, + Target, + Award, + Lightbulb, + GraduationCap, + BookOpen, + Video, + FileText, + Eye, + Heart, + MapPin, + Calendar, + Play, + Home, + Check, + ArrowRight +} from 'lucide-react'; + +interface NavigationProps { + currentPage?: string; +} + +export function Navigation({ currentPage }: NavigationProps) { + const [isScrolled, setIsScrolled] = useState(false); + const [activeDropdown, setActiveDropdown] = useState(null); + const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); + const [expandedMobileSection, setExpandedMobileSection] = useState(null); + + const { user, login, signOut, isAuthenticated } = useAuth(); + + // Determine user type from URL or user data + const getQueryParam = (param: string) => { + const urlParams = new URLSearchParams(window.location.search); + return urlParams.get(param); + }; + + const isIndividualUser = getQueryParam('view') === 'individual' || + (!getQueryParam('view') && currentPage?.includes('/dashboard')) || + (!getQueryParam('view') && currentPage?.includes('/library')) || + (!getQueryParam('view') && currentPage?.includes('/course')) || + (!getQueryParam('view') && currentPage?.includes('/settings')) || + (!getQueryParam('view') && currentPage?.includes('/surveys')) || + (!getQueryParam('view') && currentPage?.includes('/webinars')) || + (!getQueryParam('view') && currentPage?.includes('/leaderboard')); + + const isCorporateUser = getQueryParam('view') === 'corporate'; + + useEffect(() => { + const handleScroll = () => { + setIsScrolled(window.scrollY > 10); + }; + + window.addEventListener('scroll', handleScroll); + return () => window.removeEventListener('scroll', handleScroll); + }, []); + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + const target = event.target as Element; + if (!target.closest('[data-dropdown]')) { + setActiveDropdown(null); + } + }; + + document.addEventListener('click', handleClickOutside); + return () => document.removeEventListener('click', handleClickOutside); + }, []); + + const handleDropdownToggle = (dropdown: string) => { + setActiveDropdown(activeDropdown === dropdown ? null : dropdown); + }; + + const handleMobileToggle = (section: string) => { + setExpandedMobileSection(expandedMobileSection === section ? null : section); + }; + + const handleLogin = () => { + navigateTo('/auth'); // Route to login selection page + setIsMobileMenuOpen(false); + }; + + const handleSignup = () => { + navigateTo('/signup'); + setIsMobileMenuOpen(false); + }; + + const handleLogout = () => { + signOut(); + navigateTo('/'); + setActiveDropdown(null); + setIsMobileMenuOpen(false); + }; + + const handleAccountSignIn = (accountType: 'individual' | 'corporate') => { + // Navigate to appropriate sign-in page for the account type + if (accountType === 'individual') { + navigateTo('/login'); + } else { + navigateTo('/corporate/login'); + } + setActiveDropdown(null); + setIsMobileMenuOpen(false); + }; + + const navigationItems = [ + { + title: 'About Us', + href: '/about-us/our-vision', + items: [ + { title: 'Our Vision', href: '/about-us/our-vision', icon: Eye }, + { title: 'Our Team', href: '/about-us/our-team', icon: Users }, + { title: 'Our Impact', href: '/about-us/our-impact', icon: Target }, + { title: 'Our Expertise', href: '/about-us/our-expertise', icon: Award } + ] + }, + { + title: 'Programmes', + href: '/programmes', + items: [ + { title: 'Programme Catalogue', href: '/programmes', icon: BookOpen }, + { title: 'Executive Leadership', href: '/programmes/executive-leadership', icon: Award }, + { title: 'Team Leadership', href: '/programmes/team-leadership', icon: Users }, + { title: 'Innovation Leadership', href: '/programmes/innovation-leadership', icon: Lightbulb }, + { title: 'Leadership Online', href: '/programmes/leadership-online', icon: Play } + ] + }, + { + title: 'Services', + href: '/services/leadership-development', + items: [ + { title: 'Leadership Development', href: '/services/leadership-development', icon: Target }, + { title: 'Management Development', href: '/services/management-development', icon: Users }, + { title: 'Executive Coaching', href: '/services/executive-coaching', icon: Award }, + { title: 'Culture & Competence', href: '/services/culture-competence', icon: Heart }, + { title: 'Consulting', href: '/services/consulting', icon: Lightbulb }, + { title: 'Learning Facility', href: '/services/learning-facility', icon: MapPin } + ] + }, + { + title: 'Learning', + href: '/learning/articles', + items: [ + { title: 'Articles', href: '/learning/articles', icon: FileText }, + { title: 'Blog', href: '/learning/blog', icon: BookOpen }, + { title: 'Resources', href: '/learning/resources', icon: BookOpen }, + { title: 'Webinars', href: '/individual-webinars', icon: Video } + ] + } + ]; + + const learnerMenuItems = [ + { + title: 'Dashboard', + href: isIndividualUser ? '/dashboard?view=individual' : '/dashboard?view=corporate', + icon: LayoutDashboard, + description: isIndividualUser ? 'Your learning overview' : 'Team management hub' + }, + { + title: 'Library', + href: isIndividualUser ? '/library?view=individual' : '/library?view=corporate', + icon: BookOpen, + description: isIndividualUser ? 'Browse courses' : 'Assigned courses' + }, + { + title: 'Course Timeline', + href: isIndividualUser ? '/course?view=individual' : '/course?view=corporate', + icon: Calendar, + description: isIndividualUser ? 'Your learning path' : 'Team progress' + }, + { + title: 'Surveys & Assessments', + href: isIndividualUser ? '/surveys?view=individual' : '/surveys?view=corporate', + icon: FileText, + description: isIndividualUser ? 'Complete assessments' : 'Team evaluations' + }, + { + title: 'Live Webinars', + href: isIndividualUser ? '/webinars?view=individual' : '/webinars?view=corporate', + icon: Video, + description: isIndividualUser ? 'Join sessions' : 'Corporate events' + }, + { + title: 'Leaderboard', + href: isIndividualUser ? '/leaderboard?view=individual' : '/leaderboard?view=corporate', + icon: Award, + description: isIndividualUser ? 'Your achievements' : 'Team rankings' + }, + { + title: 'Settings', + href: isIndividualUser ? '/settings?view=individual' : '/settings?view=corporate', + icon: Settings, + description: isIndividualUser ? 'Account preferences' : 'Admin settings' + } + ]; + + // Mock data for demonstration - replace with actual user data + const currentUser = { + name: 'Priya Sharma', + email: 'priya.sharma@example.com', + avatar: "https://images.unsplash.com/photo-1494790108755-2616b612b786?w=150&h=150&fit=crop&crop=face", + organization: 'TechCorp Inc.', + role: 'Marketing Team Member' + }; + + const availableAccounts = [ + { + type: 'individual', + isActive: isIndividualUser, + title: 'Personal Learning', + subtitle: 'Access your individual learning portal', + icon: User, + user: currentUser + }, + { + type: 'corporate', + isActive: isCorporateUser, + title: 'Corporate Learning', + subtitle: 'Enterprise team development portal', + icon: Building2, + user: currentUser, + organization: 'TechCorp Inc.' + } + ]; + + return ( + + ); +} \ No newline at end of file diff --git a/src/components/ProgrammeWizard.tsx b/src/components/ProgrammeWizard.tsx new file mode 100644 index 0000000..6eddd86 --- /dev/null +++ b/src/components/ProgrammeWizard.tsx @@ -0,0 +1,173 @@ +import { useState } from "react"; +import { Card, CardContent, CardHeader, CardTitle } from "./ui/card"; +import { Button } from "./ui/button"; +import { Badge } from "./ui/badge"; +import { ChevronRight, RotateCcw, Wand2 } from "lucide-react"; +import { navigateTo } from './Router'; + +const wizardSteps = [ + { + id: 1, + question: "What's your current role?", + options: ["Individual Contributor", "Team Lead", "Manager", "Senior Manager", "Director", "VP/C-Level"] + }, + { + id: 2, + question: "Which industry describes your organization?", + options: ["Technology", "Financial Services", "Healthcare", "Manufacturing", "Consulting", "Other"] + }, + { + id: 3, + question: "What's your primary development goal?", + options: ["Strategic Thinking", "Team Leadership", "Communication", "Digital Transformation", "Innovation", "Change Management"] + }, + { + id: 4, + question: "How much leadership experience do you have?", + options: ["0-2 years", "3-5 years", "6-10 years", "10+ years"] + } +]; + +export function ProgrammeWizard() { + const [currentStep, setCurrentStep] = useState(0); + const [answers, setAnswers] = useState([]); + const [isCompleted, setIsCompleted] = useState(false); + + const handleAnswer = (answer: string) => { + const newAnswers = [...answers, answer]; + setAnswers(newAnswers); + + if (currentStep < wizardSteps.length - 1) { + setCurrentStep(currentStep + 1); + } else { + setIsCompleted(true); + } + }; + + const reset = () => { + setCurrentStep(0); + setAnswers([]); + setIsCompleted(false); + }; + + const getRecommendation = () => { + // Simple recommendation logic based on answers + const [role, industry, goal, experience] = answers; + if (goal === "Strategic Thinking" && experience === "10+ years") { + return { + title: "Strategic Leadership Mastery", + reason: "Perfect for senior leaders focused on strategic thinking", + slug: "strategic-leadership" + }; + } else if (goal === "Communication") { + return { + title: "Executive Leadership Program", + reason: "Ideal for developing communication and executive presence", + slug: "exec-leadership-program" + }; + } else if (role === "Individual Contributor" || role === "Team Lead") { + return { + title: "Emerging Leaders Program", + reason: "Great foundation for emerging leaders", + slug: "emerging-leaders" + }; + } else if (goal === "Innovation" || goal === "Digital Transformation") { + return { + title: "Innovation Leadership", + reason: "Perfect for driving innovation and digital transformation", + slug: "innovation-leadership" + }; + } else { + return { + title: "Team Leadership Intensive", + reason: "Comprehensive programme for effective team leadership", + slug: "team-leadership-intensive" + }; + } + }; + + if (isCompleted) { + const recommendation = getRecommendation(); + return ( + + + + + Your Recommended Programme + + + +
+

{recommendation.title}

+

{recommendation.reason}

+
+ + +
+
+
+
+ ); + } + + return ( + + + + + Need Help Choosing? + +
+ {wizardSteps.map((_, index) => ( +
+ ))} +
+ + +
+

+ {wizardSteps[currentStep].question} +

+
+ {wizardSteps[currentStep].options.map((option) => ( + + ))} +
+
+ {answers.length > 0 && ( +
+

Your answers:

+
+ {answers.map((answer, index) => ( + + {answer} + + ))} +
+
+ )} +
+ + ); +} \ No newline at end of file diff --git a/src/components/Router.tsx b/src/components/Router.tsx new file mode 100644 index 0000000..e2fea2f --- /dev/null +++ b/src/components/Router.tsx @@ -0,0 +1,306 @@ +import React from 'react'; + +// Import all page components +import { HomePage } from '../pages/HomePage'; +import Dashboard from '../pages/learner/Dashboard'; +import { CorporateDashboard } from '../pages/learner/CorporateDashboard'; +import { Library } from '../pages/learner/Library'; +import { CourseTimeline } from '../pages/learner/CourseTimeline'; +import { Settings } from '../pages/Settings'; +import { Surveys } from '../pages/Surveys'; +import { CorporateWebinars } from '../pages/CorporateWebinars'; +import { IndividualWebinars } from '../pages/IndividualWebinars'; +import { Leaderboard } from '../pages/Leaderboard'; +import { CorporateLeaderboard } from '../pages/CorporateLeaderboard'; +import { LoginSelection } from '../pages/LoginSelection'; +import { Login } from '../pages/Login'; +import { Signup } from '../pages/Signup'; +import { CorporateAuth } from '../pages/CorporateAuth'; +import { CorporateLogin } from '../pages/CorporateLogin'; +import { CorporateSignup } from '../pages/CorporateSignup'; +import { ForgotPassword } from '../pages/ForgotPassword'; +import { EmailVerification } from '../pages/EmailVerification'; +import { Contact } from '../pages/Contact'; +import { AboutKLC } from '../pages/AboutKLC'; +import { OurVision } from '../pages/OurVision'; +import { OurTeam } from '../pages/OurTeam'; +import { OurImpact } from '../pages/OurImpact'; +import { OurExpertise } from '../pages/OurExpertise'; +import { ProgrammeCatalogue } from '../pages/ProgrammeCatalogue'; +import { ProgrammeDetail } from '../pages/ProgrammeDetail'; +import { ExecutiveLeadership } from '../pages/ExecutiveLeadership'; +import { TeamLeadership } from '../pages/TeamLeadership'; +import { InnovationLeadership } from '../pages/InnovationLeadership'; +import { LeadershipOnline } from '../pages/LeadershipOnline'; +import { LeadershipDevelopment } from '../pages/services/LeadershipDevelopment'; +import { ManagementDevelopment } from '../pages/services/ManagementDevelopment'; +import { ExecutiveCoaching } from '../pages/services/ExecutiveCoaching'; +import { CultureCompetence } from '../pages/services/CultureCompetence'; +import { Consulting } from '../pages/services/Consulting'; +import { LearningFacility } from '../pages/services/LearningFacility'; +import { Articles } from '../pages/Articles'; +import { BlogListing } from '../pages/BlogListing'; +import { BlogDetail } from '../pages/BlogDetail'; +import { Resources } from '../pages/Resources'; +import { WebinarListing } from '../pages/WebinarListing'; +import { WebinarDetail } from '../pages/WebinarDetail'; +import { FacilityDetail } from '../pages/FacilityDetail'; +import { FacilityBooking } from '../pages/FacilityBooking'; +import { FacilityTour } from '../pages/FacilityTour'; +import { Cart } from '../pages/Cart'; +import { Checkout } from '../pages/Checkout'; +import { OrderConfirmation } from '../pages/OrderConfirmation'; +import { OrderFailed } from '../pages/OrderFailed'; +import { MyCohort } from '../pages/MyCohort'; +import { FAQ } from '../pages/FAQ'; +import { Privacy } from '../pages/Privacy'; +import { Terms } from '../pages/Terms'; +import { NotFound } from '../pages/NotFound'; + +// Router function to navigate programmatically +export function navigateTo(path: string) { + window.history.pushState({}, '', path); + window.dispatchEvent(new PopStateEvent('popstate')); +} + +// Get query parameter helper +function getQueryParam(param: string): string | null { + const urlParams = new URLSearchParams(window.location.search); + return urlParams.get(param); +} + +// Router component +export function Router() { + const [currentPath, setCurrentPath] = React.useState(window.location.pathname); + + React.useEffect(() => { + const handlePopState = () => { + setCurrentPath(window.location.pathname); + }; + + window.addEventListener('popstate', handlePopState); + return () => window.removeEventListener('popstate', handlePopState); + }, []); + + // Handle legacy route redirects + React.useEffect(() => { + // Redirect old corporate routes to new query parameter format + const legacyRedirects: Record = { + '/corporate/dashboard': '/dashboard?view=corporate', + '/corporate/library': '/library?view=corporate', + '/corporate/course': '/course?view=corporate', + '/corporate/settings': '/settings?view=corporate', + '/corporate/surveys': '/surveys?view=corporate', + '/corporate/webinars': '/webinars?view=corporate', + '/corporate/leaderboard': '/leaderboard?view=corporate' + }; + + if (legacyRedirects[currentPath]) { + navigateTo(legacyRedirects[currentPath]); + return; + } + + // Redirect deprecated service pages to home + const deprecatedServiceRoutes = [ + '/services', + '/services/leadership-development', + '/services/management-development', + '/services/executive-coaching', + '/services/culture-competence', + '/services/consulting', + '/services/learning-facility' + ]; + + if (deprecatedServiceRoutes.includes(currentPath)) { + navigateTo('/'); + return; + } + + // Redirect deprecated about pages to home + const deprecatedAboutRoutes = [ + '/about-us/our-vision', + '/about-us/our-team', + '/about-us/our-impact', + '/about-us/our-expertise' + ]; + + if (deprecatedAboutRoutes.includes(currentPath)) { + navigateTo('/'); + return; + } + + // Redirect deprecated learning pages to home + const deprecatedLearningRoutes = [ + '/learning/articles', + '/learning/blog', + '/learning/resources' + ]; + + if (deprecatedLearningRoutes.includes(currentPath)) { + navigateTo('/'); + return; + } + }, [currentPath]); + + // Route matching logic + const renderRoute = () => { + const path = currentPath; + const viewParam = getQueryParam('view'); + + switch (path) { + case '/': + return ; + + // Authentication routes + case '/auth': + case '/login-selection': + return ; + case '/login': + return ; + case '/signup': + return ; + case '/corporate/auth': + return ; + case '/corporate/login': + return ; + case '/corporate/signup': + return ; + case '/forgot-password': + return ; + case '/email-verification': + return ; + + // Learner portal routes with query parameter support + case '/dashboard': + // Route to appropriate dashboard based on view parameter + if (viewParam === 'corporate') { + return ; + } + return ; + case '/library': + return ; + case '/course': + return ; + case '/settings': + return ; + case '/surveys': + return ; + case '/webinars': + // Route to appropriate webinar page based on view parameter + if (viewParam === 'corporate') { + return ; + } + return ; + case '/leaderboard': + // Route to appropriate leaderboard based on view parameter + if (viewParam === 'corporate') { + return ; + } + return ; + + // Individual webinars (accessible without authentication) + case '/individual-webinars': + return ; + + // Contact and support + case '/contact': + return ; + + // About pages (deprecated - redirect to home) + case '/about-klc': + return ; + case '/about-us/our-vision': + return ; + case '/about-us/our-team': + return ; + case '/about-us/our-impact': + return ; + case '/about-us/our-expertise': + return ; + + // Programme pages (deprecated - redirect to home) + case '/programmes': + return ; + case '/programmes/detail': + return ; + case '/programmes/executive-leadership': + return ; + case '/programmes/team-leadership': + return ; + case '/programmes/innovation-leadership': + return ; + case '/programmes/leadership-online': + return ; + + // Service pages (deprecated - redirect to home) + case '/services/leadership-development': + return ; + case '/services/management-development': + return ; + case '/services/executive-coaching': + return ; + case '/services/culture-competence': + return ; + case '/services/consulting': + return ; + case '/services/learning-facility': + return ; + + // Learning pages (deprecated - redirect to home) + case '/learning/articles': + return ; + case '/learning/blog': + return ; + case '/learning/blog/detail': + return ; + case '/learning/resources': + return ; + + // Webinar pages (deprecated - redirect to home) + case '/webinars/listing': + return ; + case '/webinars/detail': + return ; + + // Facility pages (deprecated - redirect to home) + case '/facilities/detail': + return ; + case '/facilities/booking': + return ; + case '/facilities/tour': + return ; + + // E-commerce pages (deprecated - redirect to home) + case '/cart': + return ; + case '/checkout': + return ; + case '/order-confirmation': + return ; + case '/order-failed': + return ; + + // Additional learner features (deprecated - redirect to home) + case '/my-cohort': + return ; + + // Legal and support pages + case '/faq': + return ; + case '/privacy': + return ; + case '/terms': + return ; + + // 404 page + default: + return ; + } + }; + + return ( +
+ {renderRoute()} +
+ ); +} \ No newline at end of file diff --git a/src/components/figma/ImageWithFallback.tsx b/src/components/figma/ImageWithFallback.tsx new file mode 100644 index 0000000..0e26139 --- /dev/null +++ b/src/components/figma/ImageWithFallback.tsx @@ -0,0 +1,27 @@ +import React, { useState } from 'react' + +const ERROR_IMG_SRC = + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODgiIGhlaWdodD0iODgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBvcGFjaXR5PSIuMyIgZmlsbD0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIzLjciPjxyZWN0IHg9IjE2IiB5PSIxNiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiByeD0iNiIvPjxwYXRoIGQ9Im0xNiA1OCAxNi0xOCAzMiAzMiIvPjxjaXJjbGUgY3g9IjUzIiBjeT0iMzUiIHI9IjciLz48L3N2Zz4KCg==' + +export function ImageWithFallback(props: React.ImgHTMLAttributes) { + const [didError, setDidError] = useState(false) + + const handleError = () => { + setDidError(true) + } + + const { src, alt, style, className, ...rest } = props + + return didError ? ( +
+
+ Error loading image +
+
+ ) : ( + {alt} + ) +} diff --git a/src/components/learner/CourseCard.tsx b/src/components/learner/CourseCard.tsx new file mode 100644 index 0000000..072e206 --- /dev/null +++ b/src/components/learner/CourseCard.tsx @@ -0,0 +1,331 @@ +import React from 'react'; +import { Card, CardContent, CardHeader } from '../ui/card'; +import { Button } from '../ui/button'; +import { Badge } from '../ui/badge'; +import { Progress } from '../ui/progress'; +import { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'; +import { + Star, + Clock, + Users, + Play, + CheckCircle, + Calendar, + Award, + Eye, + Heart, + Share2, + Video, + FileText, + Headphones, + Monitor, + AlertCircle +} from 'lucide-react'; +import { Course } from '../../pages/learner/data/libraryData'; +import { navigateTo } from '../Router'; + +interface CourseCardProps { + course: Course; + userType: 'individual' | 'corporate'; + onEnroll?: (courseId: string) => void; + onContinue?: (courseId: string) => void; + onBookmark?: (courseId: string) => void; +} + +const getTypeIcon = (type: string) => { + switch (type) { + case 'video': return Video; + case 'article': return FileText; + case 'audio': return Headphones; + case 'interactive': return Monitor; + default: return Video; + } +}; + +const getPriorityColor = (priority?: string) => { + switch (priority) { + case 'high': return 'text-destructive bg-destructive/10'; + case 'medium': return 'text-orange-600 bg-orange-100'; + case 'low': return 'text-success bg-success/10'; + default: return ''; + } +}; + +const getLevelColor = (level: string) => { + switch (level) { + case 'Beginner': return 'text-success bg-success/10'; + case 'Intermediate': return 'text-primary bg-primary/10'; + case 'Advanced': return 'text-destructive bg-destructive/10'; + default: return 'text-muted-foreground bg-muted'; + } +}; + +export function CourseCard({ course, userType, onEnroll, onContinue, onBookmark }: CourseCardProps) { + const TypeIcon = getTypeIcon(course.type); + const isOverdue = course.deadline && new Date(course.deadline) < new Date(); + + // Navigate to course details page with proper query parameters + const handleCourseNavigation = () => { + navigateTo(`/course?view=${userType}&courseId=${course.id}`); + }; + + return ( + + {/* Course Thumbnail */} +
+ {course.title} + + {/* Overlay Badges */} +
+ {course.isFeatured && ( + + Featured + + )} + {course.isPremium && ( + + Premium + + )} + {course.organizationAssigned && userType === 'corporate' && ( + + Assigned + + )} +
+ + {/* Priority Badge for Corporate */} + {userType === 'corporate' && course.priority && ( +
+ + {course.priority.toUpperCase()} + +
+ )} + + {/* Type Icon */} +
+
+ +
+
+ + {/* Course Status */} +
+ {course.status === 'completed' && ( +
+ +
+ )} + {course.status === 'bookmarked' && ( +
+ +
+ )} +
+
+ + +
+
+

+ {course.title} +

+

+ {course.description} +

+
+
+ + {/* Instructor Info */} +
+ + + + {course.instructor.name.split(' ').map(n => n[0]).join('')} + + +
+

{course.instructor.name}

+

{course.instructor.title}

+
+
+ + {/* Course Metadata */} +
+
+ + {course.duration} +
+
+ + {course.lessonsCount} lessons +
+
+ + {course.enrolledCount.toLocaleString()} +
+
+ + {/* Rating */} +
+
+ {[...Array(5)].map((_, i) => ( + + ))} +
+ {course.rating} + + ({course.completionRate}% completion rate) + +
+ + {/* Level and Category */} +
+ + {course.level} + + + {course.category} + +
+ + {/* Tags */} +
+ {course.tags.slice(0, 3).map((tag) => ( + + {tag} + + ))} + {course.tags.length > 3 && ( + + +{course.tags.length - 3} more + + )} +
+
+ + + {/* Progress Bar for In-Progress Courses */} + {course.status === 'in-progress' && course.progress !== undefined && ( +
+
+ Progress + {course.progress}% +
+ + {course.lastAccessed && ( +

+ Last accessed: {course.lastAccessed} +

+ )} +
+ )} + + {/* Deadline Warning for Corporate */} + {userType === 'corporate' && course.deadline && ( +
+
+ + + {isOverdue ? 'Overdue' : 'Due'}: {new Date(course.deadline).toLocaleDateString()} + +
+
+ )} + + {/* Action Buttons */} +
+ {course.status === 'not-started' && ( + + )} + + {course.status === 'in-progress' && ( + + )} + + {course.status === 'completed' && ( + + )} + + {course.status === 'bookmarked' && ( + + )} + + {/* Secondary Actions */} + + + + + {course.certificate && course.status === 'completed' && ( + + )} +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/learner/CourseListItem.tsx b/src/components/learner/CourseListItem.tsx new file mode 100644 index 0000000..98e29aa --- /dev/null +++ b/src/components/learner/CourseListItem.tsx @@ -0,0 +1,268 @@ +import React from 'react'; +import { Button } from '../ui/button'; +import { Badge } from '../ui/badge'; +import { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'; +import { + Star, + Clock, + Users, + Play, + CheckCircle, + Heart, + MoreHorizontal, + Award, + BookOpen, + Eye, + Calendar, + Target +} from 'lucide-react'; +import { Course } from '../../pages/learner/data/libraryData'; +import { navigateTo } from '../Router'; + +interface CourseListItemProps { + course: Course; + userType: 'individual' | 'corporate'; + onEnroll?: (courseId: string) => void; + onContinue?: (courseId: string) => void; + onBookmark?: (courseId: string) => void; +} + +const getStatusColor = (status: string) => { + switch (status) { + case 'completed': return 'text-success bg-success/10'; + case 'in-progress': return 'text-primary bg-primary/10'; + case 'bookmarked': return 'text-orange-600 bg-orange-100'; + case 'not-started': return 'text-muted-foreground bg-muted/50'; + default: return 'text-muted-foreground bg-muted/50'; + } +}; + +const getCourseIcon = (category: string) => { + switch (category) { + case 'Leadership': return '👑'; + case 'Personal Development': return '🧠'; + case 'Team Management': return '👥'; + case 'Digital Leadership': return '💻'; + case 'Communication': return '💬'; + case 'Crisis Management': return '⚡'; + default: return '📚'; + } +}; + +const getCourseGradient = (category: string) => { + switch (category) { + case 'Leadership': return 'bg-gradient-to-br from-blue-500 via-purple-500 to-pink-500'; + case 'Personal Development': return 'bg-gradient-to-br from-green-400 via-blue-500 to-purple-600'; + case 'Team Management': return 'bg-gradient-to-br from-orange-400 via-pink-500 to-red-500'; + case 'Digital Leadership': return 'bg-gradient-to-br from-cyan-400 via-blue-500 to-indigo-600'; + case 'Communication': return 'bg-gradient-to-br from-yellow-400 via-orange-500 to-red-500'; + case 'Crisis Management': return 'bg-gradient-to-br from-red-400 via-pink-500 to-purple-600'; + default: return 'bg-gradient-to-br from-gray-400 via-gray-500 to-gray-600'; + } +}; + +export function CourseListItem({ course, userType, onEnroll, onContinue, onBookmark }: CourseListItemProps) { + const isOverdue = course.deadline && new Date(course.deadline) < new Date(); + + // Navigate to course details page with proper query parameters + const handleCourseNavigation = () => { + navigateTo(`/course?view=${userType}&courseId=${course.id}`); + }; + + return ( +
+ {/* Course Thumbnail */} +
+
+ {getCourseIcon(course.category)} +
+
+
+ + {/* Course Content */} +
+ {/* Title and Badges */} +
+
+

+ {course.title} +

+
+
+ {course.isPremium && ( + + Premium + + )} + {course.isFeatured && ( + + Featured + + )} + + {course.status === 'not-started' ? 'Available' : course.status.replace('-', ' ').toUpperCase()} + +
+
+ + {/* Description */} +

+ {course.description} +

+ + {/* Course Metadata */} +
+
+ + {course.duration} +
+
+ + {course.lessonsCount} lessons +
+
+ + {course.enrolledCount.toLocaleString()} +
+ + {course.level} + +
+ + {/* Progress Bar for In-Progress Courses */} + {course.status === 'in-progress' && course.progress !== undefined && ( +
+
+ Progress + {course.progress}% +
+
+
+
+
+ )} + + {/* Deadline Warning for Corporate */} + {userType === 'corporate' && course.deadline && ( +
+ + + {isOverdue ? 'Overdue' : 'Due'}: {new Date(course.deadline).toLocaleDateString()} + +
+ )} + + {/* Instructor and Rating Row */} +
+
+ Created by: + + + + {course.instructor.name.split(' ').map(n => n[0]).join('')} + + + {course.instructor.name} +
+ +
+ {/* Rating */} +
+ {[...Array(5)].map((_, i) => ( + + ))} + {course.rating} + + ({course.completionRate}%) + +
+ + {/* Action Buttons */} +
+ {course.status === 'not-started' && ( + + )} + + {course.status === 'in-progress' && ( + + )} + + {course.status === 'completed' && ( + + )} + + {course.status === 'bookmarked' && ( + + )} + + + + +
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/learner/HorizontalCourseCard.tsx b/src/components/learner/HorizontalCourseCard.tsx new file mode 100644 index 0000000..6c951cc --- /dev/null +++ b/src/components/learner/HorizontalCourseCard.tsx @@ -0,0 +1,297 @@ +import React from 'react'; +import { Button } from '../ui/button'; +import { Badge } from '../ui/badge'; +import { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'; +import { + Star, + Clock, + Users, + Play, + CheckCircle, + Heart, + BookOpen, + ChevronRight, + MoreHorizontal +} from 'lucide-react'; +import { Course } from '../../pages/learner/data/libraryData'; +import { navigateTo } from '../Router'; +import { ImageWithFallback } from '../figma/ImageWithFallback'; + +interface HorizontalCourseCardProps { + course: Course; + userType: 'individual' | 'corporate'; + onEnroll?: (courseId: string) => void; + onContinue?: (courseId: string) => void; + onBookmark?: (courseId: string) => void; +} + +// Course images based on course category +const getCourseImage = (category: string) => { + const patterns = { + 'Leadership': ( +
+
+ +
+
+ ), + 'Personal Development': ( +
+
+ +
+
+ ), + 'Team Management': ( +
+
+ +
+
+ ), + 'Digital Leadership': ( +
+
+ +
+
+ ), + 'Communication': ( +
+
+ +
+
+ ) + }; + + return patterns[category as keyof typeof patterns] || patterns.Leadership; +}; + +export function HorizontalCourseCard({ course, userType, onEnroll, onContinue, onBookmark }: HorizontalCourseCardProps) { + const courseImage = getCourseImage(course.category); + + // Navigate to course details page with proper query parameters + const handleCourseNavigation = () => { + navigateTo(`/course?view=${userType}&courseId=${course.id}`); + }; + + return ( +
+
+ {/* Left Image Section - 50% width, full height */} +
+ {/* Course image overlay */} + {courseImage} + + {/* Status indicators - Positioned better for larger image area */} +
+ {course.isFeatured && ( + + Featured + + )} + {course.isPremium && ( + + Premium + + )} +
+ + {/* Course status indicator */} +
+ {course.status === 'completed' && ( +
+ +
+ )} + {course.status === 'bookmarked' && ( +
+ +
+ )} +
+
+ + {/* Right Content Section - 50% width with increased spacing */} +
+ {/* Top Content - Title and Description stay with original spacing */} +
+ {/* Course Title - Increased to text-xl (20px) as requested */} +

+ {course.title} +

+ + {/* Description with 8px spacing from title as requested */} +

+ {course.description} +

+ + {/* Elements after description - Increased vertical spacing to 12px (space-y-3) */} +
+ {/* Created by section - Updated font size for Avatar text */} +
+ + + + {course.instructor.name.split(' ').map(n => n[0]).join('')} + + + Created by: + {course.instructor.name} +
+ + {/* Badges below created by - Updated to text-sm (14px minimum) with brand colors */} +
+ + {course.level} + + + {course.category} + +
+ + {/* Combined lessons, duration, and rating section - All in one container */} +
+ {/* Left side: Duration and Lessons */} +
+
+ + {course.duration} +
+
+ + {course.lessonsCount} lessons +
+
+ + {/* Right side: Rating stars */} +
+ {[...Array(5)].map((_, i) => ( + + ))} + {course.rating} +
+
+
+
+ + {/* Bottom Section - CTA buttons only with reduced spacing */} +
+ {/* CTA buttons below everything else - wider for consistency */} +
+ {course.status === 'not-started' && ( + + )} + + {course.status === 'in-progress' && ( + + )} + + {course.status === 'completed' && ( + + )} + + {course.status === 'bookmarked' && ( + + )} + + {/* Secondary action buttons - optimized sizing */} + + + +
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/learner/LearnerLayout.tsx b/src/components/learner/LearnerLayout.tsx new file mode 100644 index 0000000..9439337 --- /dev/null +++ b/src/components/learner/LearnerLayout.tsx @@ -0,0 +1,541 @@ +import React, { useState, useEffect } from 'react'; +import { Button } from '../ui/button'; +import { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'; +import { Badge } from '../ui/badge'; +import { Sheet, SheetContent, SheetTrigger } from '../ui/sheet'; +import { ScrollArea } from '../ui/scroll-area'; +import { Separator } from '../ui/separator'; +import { + Menu, + Search, + Bell, + ChevronDown, + Home, + BookOpen, + User, + BarChart3, + MessageSquare, + Calendar, + Trophy, + Building2, + Users, + X, + Settings +} from 'lucide-react'; +import { navigateTo } from '../Router'; + +interface LearnerLayoutProps { + children: React.ReactNode; + currentPage?: string; + userType?: 'individual' | 'corporate'; + user?: { + name: string; + email: string; + avatar?: string; + organization?: string; + orgLogo?: string; + role?: string; + cohort?: string; + }; +} + +interface NotificationPanelProps { + isOpen: boolean; + onClose: () => void; + notifications: Array<{ + id: string; + type: 'info' | 'warning' | 'success' | 'error'; + title: string; + message: string; + time: string; + read: boolean; + }>; +} + +function NotificationPanel({ isOpen, onClose, notifications }: NotificationPanelProps) { + const unreadCount = notifications.filter(n => !n.read).length; + + if (!isOpen) return null; + + return ( +
+ {/* Mobile overlay */} +
+ + {/* Panel */} +
+
+

+ Notifications {unreadCount > 0 && {unreadCount}} +

+ +
+ + +
+ {notifications.length === 0 ? ( +
+ +

No notifications

+
+ ) : ( + notifications.map((notification) => ( +
+
+
+
+

{notification.title}

+

{notification.message}

+

{notification.time}

+
+
+
+ )) + )} +
+ + + {notifications.length > 0 && ( +
+ +
+ )} +
+
+ ); +} + + + +export function LearnerLayout({ children, currentPage, userType = 'individual', user }: LearnerLayoutProps) { + // Get current path if not provided + const currentPath = currentPage || window.location.pathname; + const [sidebarOpen, setSidebarOpen] = useState(false); + const [notificationsOpen, setNotificationsOpen] = useState(false); + const [searchValue, setSearchValue] = useState(''); + + // Get current view parameter directly from URL + const getCurrentView = () => { + const searchParams = new URLSearchParams(window.location.search); + return searchParams.get('view'); + }; + + const [currentView, setCurrentView] = useState(getCurrentView); + + // Update URL params when location changes + useEffect(() => { + const handleLocationChange = () => { + setCurrentView(getCurrentView()); + }; + + window.addEventListener('popstate', handleLocationChange); + + // Listen for programmatic navigation changes + const originalPushState = window.history.pushState; + const originalReplaceState = window.history.replaceState; + + window.history.pushState = function(...args) { + originalPushState.apply(window.history, args); + setTimeout(handleLocationChange, 0); + }; + + window.history.replaceState = function(...args) { + originalReplaceState.apply(window.history, args); + setTimeout(handleLocationChange, 0); + }; + + return () => { + window.removeEventListener('popstate', handleLocationChange); + window.history.pushState = originalPushState; + window.history.replaceState = originalReplaceState; + }; + }, []); + + // Mock notifications + const notifications = [ + { + id: '1', + type: 'info' as const, + title: 'New Course Available', + message: 'Strategic Leadership Foundations is now available in your library', + time: '2 hours ago', + read: false + }, + { + id: '2', + type: 'warning' as const, + title: 'Assignment Due Soon', + message: 'Leadership Assessment due in 3 days', + time: '1 day ago', + read: false + }, + { + id: '3', + type: 'success' as const, + title: 'Certificate Earned', + message: 'Congratulations! You completed Management Essentials', + time: '3 days ago', + read: true + } + ]; + + const unreadCount = notifications.filter(n => !n.read).length; + + // Navigation items with simplified active state logic + const navigationItems = [ + { + name: 'Dashboard', + icon: Home, + href: `/dashboard?view=${userType}`, + active: currentPath === '/dashboard' && (currentView === userType || (!currentView && userType === 'individual')) + }, + { + name: 'Library', + icon: BookOpen, + href: `/library?view=${userType}`, + active: currentPath === '/library' && (currentView === userType || (!currentView && userType === 'individual')) + }, + { + name: 'Surveys', + icon: MessageSquare, + href: `/surveys?view=${userType}`, + active: currentPath === '/surveys' && (currentView === userType || (!currentView && userType === 'individual')) + }, + { + name: 'Webinars', + icon: Calendar, + href: `/webinars?view=${userType}`, + active: (currentPath === '/webinars' || currentPath === '/individual-webinars') && (currentView === userType || (!currentView && userType === 'individual')) + }, + { + name: 'Leaderboard', + icon: Trophy, + href: `/leaderboard?view=${userType}`, + active: currentPath === '/leaderboard' && (currentView === userType || (!currentView && userType === 'individual')) + }, + { + name: 'Settings', + icon: Settings, + href: `/settings?view=${userType}`, + active: currentPath?.startsWith('/settings') && (currentView === userType || (!currentView && userType === 'individual')) + } + ]; + + + + const Sidebar = ({ className = "" }: { className?: string }) => ( +
+ {/* Logo */} +
+
+
+ KLC +
+ Learning Portal +
+
+ + {/* Navigation */} + + + + + +
+ ); + + return ( +
+ {/* Mobile Header */} +
+
+ + + + + + + + + +
+ {/* Corporate org badge */} + {userType === 'corporate' && user?.organization && ( +
+ {user.orgLogo && ( + {user.organization} + )} + {user.organization} +
+ )} + + {/* Notifications */} +
+ + setNotificationsOpen(false)} + notifications={notifications} + /> +
+ + {/* User menu */} + + + + {user?.name?.split(' ').map(n => n[0]).join('') || 'U'} + + +
+
+
+ +
+ {/* Desktop Sidebar - Reduced width from 256px to 240px */} +
+
+ +
+
+ + {/* Main Content Area - Optimized for wider content */} +
+ {/* Desktop Header */} +
+
+ {/* Search - Reduced max width for more space */} +
+
+ + setSearchValue(e.target.value)} + className="w-full pl-10 pr-4 py-2 text-lg border border-border rounded-lg bg-background focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent" + /> +
+
+ +
+ {/* Corporate features */} + {userType === 'corporate' && ( + <> + {/* Organization badge */} + {user?.organization && ( +
+ {user.orgLogo && ( + {user.organization} + )} + {user.organization} +
+ )} + + {/* Cohort reminder */} + {user?.cohort && ( + + + {user.cohort} + + )} + + )} + + {/* Notifications */} +
+ + setNotificationsOpen(false)} + notifications={notifications} + /> +
+ + {/* User menu */} +
+ + + + {user?.name?.split(' ').map(n => n[0]).join('') || 'U'} + + +
+

{user?.name || 'Priya Sharma'}

+

{user?.email || 'priya.sharma@example.com'}

+
+ +
+
+
+
+ + {/* Page Content - Remove default padding, let pages control their own spacing */} +
+ {/* Content wrapper with consistent spacing and accessibility */} +
+ {/* Skip to main content anchor for screen readers */} + + Skip to learner content + + + {/* Main learner content area */} +
+ {/* Content with proper spacing and structure */} +
+ {/* Background pattern for visual enhancement */} +
+
+
+ + {/* Main content with proper spacing */} +
+ {children} +
+
+
+ + {/* Live region for dynamic content announcements */} +
+ + {/* Status region for form validation and success messages */} +
+
+ + {/* Back to top functionality for long content */} +
+ +
+ + {/* Progress indicator for course content */} + +
+
+
+ +
+ ); +} \ No newline at end of file diff --git a/src/components/learner/LibraryFilters.tsx b/src/components/learner/LibraryFilters.tsx new file mode 100644 index 0000000..e167c8d --- /dev/null +++ b/src/components/learner/LibraryFilters.tsx @@ -0,0 +1,346 @@ +import React from 'react'; +import { Card, CardContent } from '../ui/card'; +import { Button } from '../ui/button'; +import { Input } from '../ui/input'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'; +import { Badge } from '../ui/badge'; +import { + Search, + Filter, + X, + Globe, + Video, + FileText, + Headphones, + Monitor +} from 'lucide-react'; +import { categories, levels, courseTypes, sortOptions } from '../../pages/learner/data/libraryData'; + +interface LibraryFiltersProps { + searchQuery: string; + setSearchQuery: (query: string) => void; + selectedCategory: string; + setSelectedCategory: (category: string) => void; + selectedLevel: string; + setSelectedLevel: (level: string) => void; + selectedType: string; + setSelectedType: (type: string) => void; + sortBy: string; + setSortBy: (sort: string) => void; + showBookmarkedOnly: boolean; + setShowBookmarkedOnly: (show: boolean) => void; + showInProgressOnly: boolean; + setShowInProgressOnly: (show: boolean) => void; + userType: 'individual' | 'corporate'; + totalCourses: number; + filteredCount: number; +} + +const getTypeIcon = (iconName: string) => { + switch (iconName) { + case 'Globe': return Globe; + case 'Video': return Video; + case 'FileText': return FileText; + case 'Headphones': return Headphones; + case 'Monitor': return Monitor; + default: return Globe; + } +}; + +export function LibraryFilters({ + searchQuery, + setSearchQuery, + selectedCategory, + setSelectedCategory, + selectedLevel, + setSelectedLevel, + selectedType, + setSelectedType, + sortBy, + setSortBy, + showBookmarkedOnly, + setShowBookmarkedOnly, + showInProgressOnly, + setShowInProgressOnly, + userType, + totalCourses, + filteredCount +}: LibraryFiltersProps) { + const hasActiveFilters = + selectedCategory !== 'All Categories' || + selectedLevel !== 'All Levels' || + selectedType !== 'all' || + showBookmarkedOnly || + showInProgressOnly || + searchQuery.length > 0; + + const clearAllFilters = () => { + setSearchQuery(''); + setSelectedCategory('All Categories'); + setSelectedLevel('All Levels'); + setSelectedType('all'); + setShowBookmarkedOnly(false); + setShowInProgressOnly(false); + setSortBy('featured'); + }; + + return ( + + + {/* Search Bar */} +
+ + setSearchQuery(e.target.value)} + className="pl-10 text-base min-h-[44px]" + /> + {searchQuery && ( + + )} +
+ + {/* Filter Controls */} +
+ {/* Category Filter */} +
+ + +
+ + {/* Level Filter */} +
+ + +
+ + {/* Type Filter */} +
+ + +
+ + {/* Sort Options */} +
+ + +
+
+ + {/* Quick Filter Buttons */} +
+ + + + + {userType === 'corporate' && ( + + )} +
+ + {/* Active Filters Display */} + {hasActiveFilters && ( +
+
+
+ Active Filters: + +
+
+ +
+ {searchQuery && ( + + Search: "{searchQuery}" + + + )} + + {selectedCategory !== 'All Categories' && ( + + {selectedCategory} + + + )} + + {selectedLevel !== 'All Levels' && ( + + {selectedLevel} + + + )} + + {selectedType !== 'all' && ( + + {courseTypes.find(t => t.value === selectedType)?.label} + + + )} + + {showBookmarkedOnly && ( + + Bookmarked Only + + + )} + + {showInProgressOnly && ( + + In Progress Only + + + )} +
+
+ )} + + {/* Results Summary */} +
+

+ Showing {filteredCount} of {totalCourses} courses + {hasActiveFilters && filteredCount !== totalCourses && ( + + ({totalCourses - filteredCount} filtered out) + + )} +

+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/learner/LibraryStats.tsx b/src/components/learner/LibraryStats.tsx new file mode 100644 index 0000000..2b044b6 --- /dev/null +++ b/src/components/learner/LibraryStats.tsx @@ -0,0 +1,595 @@ +import React, { useState, useEffect } from 'react'; +import { Card, CardContent, CardHeader, CardTitle } from '../ui/card'; +import { Progress } from '../ui/progress'; +import { Badge } from '../ui/badge'; +import { Button } from '../ui/button'; +import { + BookOpen, + Clock, + Trophy, + Target, + TrendingUp, + Award, + CheckCircle, + Calendar, + Users, + Star, + Play, + Bookmark, + Search, + Zap, + ArrowRight, + BarChart3, + Brain, + Sparkles, + Flame, + ChevronRight, + Gauge, + Activity, + ChevronLeft, + ChevronDown, + MoreHorizontal +} from 'lucide-react'; +import { + BarChart, + Bar, + XAxis, + YAxis, + CartesianGrid, + ResponsiveContainer, + Tooltip, + PieChart, + Pie, + Cell, + Legend +} from 'recharts'; +import { Course } from '../../pages/learner/data/libraryData'; + +interface LibraryStatsProps { + courses: Course[]; + userType: 'individual' | 'corporate'; +} + + + +export function LibraryStats({ courses, userType }: LibraryStatsProps) { + const [isVisible, setIsVisible] = useState(false); + const [selectedTimeRange, setSelectedTimeRange] = useState('December'); + + // Calculate statistics + const stats = { + totalCourses: courses.length, + completedCourses: courses.filter(c => c.status === 'completed').length, + inProgressCourses: courses.filter(c => c.status === 'in-progress').length, + bookmarkedCourses: courses.filter(c => c.status === 'bookmarked').length, + assignedCourses: userType === 'corporate' ? courses.filter(c => c.organizationAssigned).length : 0, + overdueCourses: userType === 'corporate' ? courses.filter(c => c.status === 'not-started').length : undefined, + completionRate: courses.length > 0 ? (courses.filter(c => c.status === 'completed').length / courses.length) * 100 : 0, + averageRating: courses.length > 0 ? courses.reduce((sum, c) => sum + c.rating, 0) / courses.length : 0, + totalHours: courses.reduce((sum, c) => sum + parseFloat(c.duration.replace(/[^\d.]/g, '')), 0), + certificatesEarned: courses.filter(c => c.status === 'completed').length + }; + + useEffect(() => { + const timer = setTimeout(() => setIsVisible(true), 100); + return () => clearTimeout(timer); + }, []); + + // Performance chart data (bar chart showing progress over time) + const performanceData = [ + { name: 'Jan', value: 1, color: '#04045B' }, + { name: 'Feb', value: 2, color: '#04045B' }, + { name: 'Mar', value: 4, color: '#04045B' }, + { name: 'Apr', value: 6, color: '#04045B' }, + { name: 'May', value: 7, color: '#04045B' }, + { name: 'Jun', value: 8, color: '#04045B' } + ]; + + + + // Time learning data (stacked bar chart) + const timeLearningData = [ + { date: 'Apr 18', performance: 2, consistency: 1, unknown: 0.5 }, + { date: 'Apr 19', performance: 3, consistency: 2, unknown: 1 }, + { date: 'Apr 20', performance: 1.5, consistency: 2.5, unknown: 0.5 }, + { date: 'Apr 21', performance: 4, consistency: 1, unknown: 1 }, + { date: 'Apr 22', performance: 2, consistency: 3, unknown: 0.5 }, + { date: 'Apr 23', performance: 3.5, consistency: 1.5, unknown: 1 }, + { date: 'Apr 24', performance: 2.5, consistency: 2, unknown: 1.5 } + ]; + + // Course list with progress + const courseList = [ + { name: 'Introduction to Strategic Leadership', lessons: '24/30 Lessons', progress: 80, color: '#04045B' }, + { name: 'English for Effective Communication', lessons: '18/25 Lessons', progress: 72, color: '#10B981' }, + { name: 'Introduction to Team Management', lessons: '14/20 Lessons', progress: 70, color: '#F8C301' }, + { name: 'Introduction to Digital Leadership', lessons: '8/15 Lessons', progress: 53, color: '#6366F1' } + ]; + + // Daily activity timeline + const dailyActivities = [ + { time: '07:00', course: 'Introduction to Strategic Leadership', type: 'Google Meeting', color: '#F8C301', instructor: 'A' }, + { time: '08:00', course: '', type: '', color: '', instructor: '' }, + { time: '09:00', course: 'English for Effective Communication', type: 'Google Meeting', color: '#3B82F6', instructor: 'E' }, + { time: '10:00', course: '', type: '', color: '', instructor: '' }, + { time: '11:00', course: '', type: '', color: '', instructor: '' }, + { time: '12:00', course: 'Introduction to Digital Leadership', type: 'Google Meeting', color: '#6366F1', instructor: 'I' }, + { time: '01:00', course: '', type: '', color: '', instructor: '' } + ]; + + // Month navigation functionality + const months = [ + 'January', 'February', 'March', 'April', 'May', 'June', + 'July', 'August', 'September', 'October', 'November', 'December' + ]; + + const navigateMonth = (direction: 'prev' | 'next') => { + const currentIndex = months.findIndex(month => month === selectedTimeRange); + let newIndex; + + if (direction === 'prev') { + newIndex = currentIndex <= 0 ? months.length - 1 : currentIndex - 1; + } else { + newIndex = currentIndex >= months.length - 1 ? 0 : currentIndex + 1; + } + + setSelectedTimeRange(months[newIndex]); + }; + + const handleWheel = (e: React.WheelEvent) => { + e.preventDefault(); + + // Throttle wheel events to prevent rapid scrolling + const now = Date.now(); + const lastWheelTime = (e.currentTarget as any)._lastWheelTime || 0; + + if (now - lastWheelTime < 200) return; // 200ms throttle + + (e.currentTarget as any)._lastWheelTime = now; + + if (e.deltaY > 0) { + navigateMonth('next'); + } else { + navigateMonth('prev'); + } + }; + + return ( +
+ {/* Dashboard Grid Layout - Matching Reference Image */} +
+ + {/* Top Row */} + + {/* Simplified Performance Chart */} +
+ + +
+ + Performance + + +
+
+ {stats.completedCourses} Course Completed +
+
+ + + + + + + + + + + + + + [`${value} courses`, 'Completed']} + labelStyle={{ color: '#111827', fontWeight: 600, marginBottom: '4px' }} + /> + + + +
+
+ + {/* Simplified Time Learning Chart */} +
+ + +
+
+ + Time spend on learning + +
+ 4 Course Completed +
+
+
+
+ + + {selectedTimeRange} + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + +
+ + {/* Enhanced Legend */} +
+
+
+ Performance +
+
+
+ Consistency +
+
+
+ Other +
+
+
+
+
+ + {/* Bottom Row */} + + {/* Enhanced Your Courses (7 columns) */} +
+ + +
+
+ + Your Courses + +
+ {courseList.length} Course{courseList.length !== 1 ? 's' : ''} • {courseList.filter(c => c.progress === 100).length} Completed +
+
+ +
+
+ + +
+ {courseList.map((course, index) => { + const isCompleted = course.progress === 100; + const isInProgress = course.progress > 0 && course.progress < 100; + const isNotStarted = course.progress === 0; + + return ( +
window.location.href = '/course?view=individual'} + > + {/* Enhanced Course Avatar */} +
+
+ {course.name.charAt(0)} +
+ {/* Status Indicator */} + {isCompleted && ( +
+ +
+ )} + {isInProgress && ( +
+ )} +
+ + {/* Course Information */} +
+
+

+ {course.name} +

+
+ + {course.progress}% + + {isCompleted && ( + + Complete + + )} +
+
+ +
+ + {course.lessons} + + + • {isCompleted ? 'Completed' : isInProgress ? 'In Progress' : 'Not Started'} + + {isInProgress && ( + + • Continue Learning + + )} +
+ + {/* Enhanced Progress Bar */} +
+
+
+ {/* Progress bar shine effect */} +
+
+
+ + {/* Action Button */} +
+ {isCompleted ? ( + + ) : isInProgress ? ( + + ) : ( + + )} +
+
+
+ + {/* Hover Arrow */} +
+ +
+
+ ); + })} + + {/* Quick Action Footer */} +
+
+
+
+
+ Completed +
+
+
+ In Progress +
+
+
+ Not Started +
+
+ +
+
+
+
+
+
+ + {/* Daily Activity (5 columns) */} +
+ + +
+
+ + Daily activity + +
+ Today Apr 24 +
+
+
+
+ + +
+ {dailyActivities.map((activity, index) => ( +
+
+ {activity.time} +
+
+ {activity.course && ( +
+ )} +
+
+ {activity.course ? ( +
+
+
+ {activity.course} +
+
+ {activity.type} +
+
+
+ {activity.instructor} +
+
+ ) : ( +
+ )} +
+
+ ))} +
+
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/learner/UpcomingEvents.tsx b/src/components/learner/UpcomingEvents.tsx new file mode 100644 index 0000000..fcffb78 --- /dev/null +++ b/src/components/learner/UpcomingEvents.tsx @@ -0,0 +1,417 @@ +import React, { useState } from 'react'; +import { Card, CardContent, CardHeader, CardTitle } from '../ui/card'; +import { Button } from '../ui/button'; +import { Badge } from '../ui/badge'; +import { + Calendar, + Clock, + Users, + Video, + ChevronLeft, + ChevronRight, + CalendarDays, + MapPin, + Globe, + ExternalLink +} from 'lucide-react'; +import { navigateTo } from '../Router'; + +interface UpcomingEventsProps { + userType: 'individual' | 'corporate'; +} + +interface Event { + id: string; + title: string; + date: string; + time: string; + duration: string; + type: 'webinar' | 'workshop' | 'assessment' | 'meeting'; + status: 'upcoming' | 'today' | 'live'; + instructor: string; + category: string; + location: string; + attendees?: number; + maxAttendees?: number; +} + +export function UpcomingEvents({ userType }: UpcomingEventsProps) { + const [currentMonth, setCurrentMonth] = useState(new Date()); + + // Sample events data + const events: Event[] = [ + { + id: '1', + title: 'Strategic Leadership in Digital Transformation', + date: '2024-12-28', + time: '2:00 PM', + duration: '90 min', + type: 'webinar', + status: 'live', + instructor: 'Dr. Rajesh Kumar', + category: 'Leadership', + location: 'online', + attendees: 145, + maxAttendees: 200 + }, + { + id: '2', + title: 'Team Management Best Practices', + date: '2024-12-28', + time: '4:00 PM', + duration: '60 min', + type: 'workshop', + status: 'today', + instructor: 'Sarah Mitchell', + category: 'Team Management', + location: 'online', + attendees: 89, + maxAttendees: 150 + }, + { + id: '3', + title: 'Leadership Assessment Review', + date: '2024-12-30', + time: '10:00 AM', + duration: '45 min', + type: 'assessment', + status: 'upcoming', + instructor: 'Prof. Michael Chen', + category: 'Assessment', + location: 'Conference Room A', + attendees: 12, + maxAttendees: 15 + }, + { + id: '4', + title: 'Digital Leadership Fundamentals', + date: '2025-01-02', + time: '11:00 AM', + duration: '2 hours', + type: 'webinar', + status: 'upcoming', + instructor: 'Dr. Lisa Anderson', + category: 'Digital Leadership', + location: 'online', + attendees: 78, + maxAttendees: 200 + } + ]; + + const monthNames = [ + 'January', 'February', 'March', 'April', 'May', 'June', + 'July', 'August', 'September', 'October', 'November', 'December' + ]; + + const navigateMonth = (direction: 'prev' | 'next') => { + setCurrentMonth(prevDate => { + const newDate = new Date(prevDate); + if (direction === 'prev') { + newDate.setMonth(newDate.getMonth() - 1); + } else { + newDate.setMonth(newDate.getMonth() + 1); + } + return newDate; + }); + }; + + const getDaysInMonth = (date: Date) => { + return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate(); + }; + + const getFirstDayOfMonth = (date: Date) => { + return new Date(date.getFullYear(), date.getMonth(), 1).getDay(); + }; + + const isToday = (date: Date, day: number) => { + const today = new Date(); + return date.getFullYear() === today.getFullYear() && + date.getMonth() === today.getMonth() && + day === today.getDate(); + }; + + const hasEvent = (date: Date, day: number) => { + const dateStr = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`; + return events.some(event => event.date === dateStr); + }; + + const renderCalendar = () => { + const daysInMonth = getDaysInMonth(currentMonth); + const firstDay = getFirstDayOfMonth(currentMonth); + const days = []; + + // Empty cells for days before the first day of the month + for (let i = 0; i < firstDay; i++) { + days.push( +
+ ); + } + + // Days of the month + for (let day = 1; day <= daysInMonth; day++) { + const today = isToday(currentMonth, day); + const eventDay = hasEvent(currentMonth, day); + + days.push( +
+ {day} +
+ ); + } + + return days; + }; + + // Filter events for current month + const currentMonthEvents = events.filter(event => { + const eventDate = new Date(event.date); + return eventDate.getMonth() === currentMonth.getMonth() && + eventDate.getFullYear() === currentMonth.getFullYear(); + }).slice(0, 3); // Show only first 3 events + + const getEventIcon = (type: string) => { + switch (type) { + case 'webinar': + return Video; + case 'workshop': + return Users; + case 'assessment': + return CalendarDays; + case 'meeting': + return Calendar; + default: + return Calendar; + } + }; + + const getEventColor = (status: string) => { + switch (status) { + case 'live': + return 'bg-red-50 border-red-200 hover:bg-red-100'; + case 'today': + return 'bg-amber-50 border-amber-200 hover:bg-amber-100'; + default: + return 'bg-gray-50 border-gray-200 hover:bg-gray-100'; + } + }; + + return ( +
+ {/* Mini Calendar - Distinct White Card */} + + +
+ + {monthNames[currentMonth.getMonth()]} {currentMonth.getFullYear()} + +
+ + +
+
+
+ +
+ {['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].map(day => ( +
+ {day} +
+ ))} +
+
+ {renderCalendar()} +
+
+
+ + {/* Upcoming Events - Distinct White Card */} + + +
+ +
+ +
+ Upcoming Events +
+ +
+
+ + {currentMonthEvents.length === 0 ? ( +
+
+ +
+

No events scheduled for this month

+
+ ) : ( + currentMonthEvents.map((event) => { + const Icon = getEventIcon(event.type); + const eventDate = new Date(event.date); + const isToday = eventDate.toDateString() === new Date().toDateString(); + + return ( +
+
+
+ +
+ +
+
+

{event.title}

+ {event.status === 'live' && ( + + LIVE + + )} + {isToday && event.status !== 'live' && ( + + Today + + )} +
+ +
+
+ + {event.time} • {event.duration} +
+ +
+ {event.location === 'online' ? ( + <> + + Online + + ) : ( + <> + + {event.location} + + )} +
+ + {event.attendees && event.maxAttendees && ( +
+ + {event.attendees}/{event.maxAttendees} attending +
+ )} + +
+ {event.instructor} +
+
+ +
+ + {event.category} + + + +
+
+
+
+ ); + }) + )} +
+
+ + {/* Quick Actions - Distinct White Card */} + + + Quick Actions + + + + + {userType === 'corporate' && ( + + )} + + +
+ ); +} \ No newline at end of file diff --git a/src/components/services/EnhancedServiceSections.tsx b/src/components/services/EnhancedServiceSections.tsx new file mode 100644 index 0000000..e986e50 --- /dev/null +++ b/src/components/services/EnhancedServiceSections.tsx @@ -0,0 +1,362 @@ +import React from 'react'; +import { Card, CardContent } from '../ui/card'; +import { TrendingUp, Target, Users, Brain, CheckCircle } from 'lucide-react'; + +// Icon mapping for dynamic rendering +const iconMap = { + Target, Users, CheckCircle, Brain, TrendingUp +} as const; + +// What We Offer Section - Card-based Layout +interface OfferingItem { + title: string; + description: string; + icon: keyof typeof iconMap; + features: string[]; + highlighted?: boolean; +} + +interface EnhancedOfferingsProps { + title: string; + subtitle: string; + offerings: OfferingItem[]; +} + +export function EnhancedOfferings({ title, subtitle, offerings }: EnhancedOfferingsProps) { + return ( +
+
+ {/* Header Section */} +
+
+ SERVICES +
+ +

+ {title} +

+ +

+ {subtitle} +

+
+ + {/* Card Grid Layout */} +
+ {offerings.map((offering, index) => { + const Icon = iconMap[offering.icon]; + + return ( + + + {/* Icon */} +
+ +
+ + {/* Title */} +

+ {offering.title} +

+ + {/* Description */} +

+ {offering.description} +

+ + {/* Features List */} +
+ {offering.features.slice(0, 3).map((feature, featureIndex) => ( +
+ + + {feature} + +
+ ))} +
+
+
+ ); + })} +
+
+
+ ); +} + +// Who It's For Section - Card-based Layout +interface AudienceItem { + title: string; + description: string; + icon: keyof typeof iconMap; + characteristics: string[]; + highlight?: string; +} + +interface EnhancedAudienceProps { + title: string; + subtitle: string; + audiences: AudienceItem[]; +} + +export function EnhancedAudience({ title, subtitle, audiences }: EnhancedAudienceProps) { + return ( +
+
+ {/* Header Section */} +
+
+ TARGET AUDIENCE +
+ +

+ {title} +

+ +

+ {subtitle} +

+
+ + {/* Card Grid Layout */} +
+ {audiences.map((audience, index) => { + const Icon = iconMap[audience.icon]; + + return ( + + + {/* Icon */} +
+ +
+ + {/* Title */} +

+ {audience.title} +

+ + {/* Description */} +

+ {audience.description} +

+ + {/* Highlight */} + {audience.highlight && ( +
+

+ {audience.highlight} +

+
+ )} + + {/* Characteristics */} +
+ {audience.characteristics.map((characteristic, charIndex) => ( +
+ + + {characteristic} + +
+ ))} +
+
+
+ ); + })} +
+
+
+ ); +} + +// Expected Outcomes Section - Card-based Layout +interface OutcomeItem { + title: string; + description: string; + icon: keyof typeof iconMap; + metrics: string; + percentage?: number; +} + +interface EnhancedOutcomesProps { + title: string; + subtitle: string; + outcomes: OutcomeItem[]; +} + +export function EnhancedOutcomes({ title, subtitle, outcomes }: EnhancedOutcomesProps) { + return ( +
+
+ {/* Header Section */} +
+
+ EXPECTED RESULTS +
+ +

+ {title} +

+ +

+ {subtitle} +

+
+ + {/* Card Grid Layout */} +
+ {outcomes.map((outcome, index) => { + const Icon = iconMap[outcome.icon]; + + return ( + + + {/* Header with Icon and Percentage */} +
+
+ +
+ + {outcome.percentage && ( +
+
+ {outcome.percentage}% +
+
Success Rate
+
+ )} +
+ + {/* Title */} +

+ {outcome.title} +

+ + {/* Description */} +

+ {outcome.description} +

+ + {/* Key Metric */} +
+
+ + Key Metric +
+

+ {outcome.metrics} +

+
+
+
+ ); + })} +
+
+
+ ); +} + +// Our Approach Section - Card-based Layout +interface ApproachStep { + step: string; + title: string; + description: string; + details: string[]; + icon: keyof typeof iconMap; +} + +interface EnhancedApproachProps { + title: string; + subtitle: string; + methodologyNote: string; + methodologyIcon: keyof typeof iconMap; + steps: ApproachStep[]; +} + +export function EnhancedApproach({ title, subtitle, methodologyNote, methodologyIcon, steps }: EnhancedApproachProps) { + return ( +
+
+ {/* Header Section */} +
+
+ METHODOLOGY +
+ +

+ {title} +

+ +

+ {subtitle} +

+ + {/* Methodology Note */} +
+ {methodologyNote} +
+
+ + {/* Card Grid Layout */} +
+ {steps.map((step, index) => { + const Icon = iconMap[step.icon]; + + return ( + + + {/* Icon */} +
+ +
+ + {/* Title */} +

+ {step.title} +

+ + {/* Description */} +

+ {step.description} +

+ + {/* Details List */} +
+ {step.details.map((detail, detailIndex) => ( +
+ + + {detail} + +
+ ))} +
+
+
+ ); + })} +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/ui/accordion.tsx b/src/components/ui/accordion.tsx new file mode 100644 index 0000000..aa2c37b --- /dev/null +++ b/src/components/ui/accordion.tsx @@ -0,0 +1,66 @@ +"use client"; + +import * as React from "react"; +import * as AccordionPrimitive from "@radix-ui/react-accordion@1.2.3"; +import { ChevronDownIcon } from "lucide-react@0.487.0"; + +import { cn } from "./utils"; + +function Accordion({ + ...props +}: React.ComponentProps) { + return ; +} + +function AccordionItem({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AccordionTrigger({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + svg]:rotate-180", + className, + )} + {...props} + > + {children} + + + + ); +} + +function AccordionContent({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + +
{children}
+
+ ); +} + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; diff --git a/src/components/ui/alert-dialog.tsx b/src/components/ui/alert-dialog.tsx new file mode 100644 index 0000000..68f3605 --- /dev/null +++ b/src/components/ui/alert-dialog.tsx @@ -0,0 +1,157 @@ +"use client"; + +import * as React from "react"; +import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog@1.1.6"; + +import { cn } from "./utils"; +import { buttonVariants } from "./button"; + +function AlertDialog({ + ...props +}: React.ComponentProps) { + return ; +} + +function AlertDialogTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogPortal({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + + ); +} + +function AlertDialogHeader({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function AlertDialogFooter({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function AlertDialogTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogAction({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogCancel({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +}; diff --git a/src/components/ui/alert.tsx b/src/components/ui/alert.tsx new file mode 100644 index 0000000..856b94d --- /dev/null +++ b/src/components/ui/alert.tsx @@ -0,0 +1,66 @@ +import * as React from "react"; +import { cva, type VariantProps } from "class-variance-authority@0.7.1"; + +import { cn } from "./utils"; + +const alertVariants = cva( + "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", + { + variants: { + variant: { + default: "bg-card text-card-foreground", + destructive: + "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +); + +function Alert({ + className, + variant, + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
+ ); +} + +function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function AlertDescription({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ); +} + +export { Alert, AlertTitle, AlertDescription }; diff --git a/src/components/ui/aspect-ratio.tsx b/src/components/ui/aspect-ratio.tsx new file mode 100644 index 0000000..2a2f462 --- /dev/null +++ b/src/components/ui/aspect-ratio.tsx @@ -0,0 +1,11 @@ +"use client"; + +import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio@1.1.2"; + +function AspectRatio({ + ...props +}: React.ComponentProps) { + return ; +} + +export { AspectRatio }; diff --git a/src/components/ui/avatar.tsx b/src/components/ui/avatar.tsx new file mode 100644 index 0000000..589b166 --- /dev/null +++ b/src/components/ui/avatar.tsx @@ -0,0 +1,53 @@ +"use client"; + +import * as React from "react"; +import * as AvatarPrimitive from "@radix-ui/react-avatar@1.1.3"; + +import { cn } from "./utils"; + +function Avatar({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AvatarImage({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AvatarFallback({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +export { Avatar, AvatarImage, AvatarFallback }; diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx new file mode 100644 index 0000000..3f8eff8 --- /dev/null +++ b/src/components/ui/badge.tsx @@ -0,0 +1,46 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot@1.1.2"; +import { cva, type VariantProps } from "class-variance-authority@0.7.1"; + +import { cn } from "./utils"; + +const badgeVariants = cva( + "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-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 transition-[color,box-shadow] overflow-hidden", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + secondary: + "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + destructive: + "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +); + +function Badge({ + className, + variant, + asChild = false, + ...props +}: React.ComponentProps<"span"> & + VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot : "span"; + + return ( + + ); +} + +export { Badge, badgeVariants }; diff --git a/src/components/ui/breadcrumb.tsx b/src/components/ui/breadcrumb.tsx new file mode 100644 index 0000000..d2adf98 --- /dev/null +++ b/src/components/ui/breadcrumb.tsx @@ -0,0 +1,109 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot@1.1.2"; +import { ChevronRight, MoreHorizontal } from "lucide-react@0.487.0"; + +import { cn } from "./utils"; + +function Breadcrumb({ ...props }: React.ComponentProps<"nav">) { + return