commit 97969c079b189a0439715da599a0e2a6e9c62be4 Author: priyanshuvish Date: Thu Oct 9 19:03:24 2025 +0530 new src added diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6b892d6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# Node modules +node_modules/ + +# Logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# Environment files +.env +.env.local +.env.*.local + +# Build output +dist/ +build/ +.next/ +out/ + +# IDE files +.vscode/ +.idea/ +*.swp + +# Mac / Linux / Windows system files +.DS_Store +Thumbs.db + +# Temporary +*.tmp diff --git a/README.md b/README.md new file mode 100644 index 0000000..9ae3e87 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ + + # CityCards Travel 22-8-2025 + + This is a code bundle for CityCards Travel 22-8-2025. The original project is available at https://www.figma.com/design/faSWipJ4DA1dnh88olOVuH/CityCards-Travel-22-8-2025. + + ## 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..000821d --- /dev/null +++ b/index.html @@ -0,0 +1,15 @@ + + + + + + + CityCards Travel 22-8-2025 + + + +
+ + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..af7afbd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4248 @@ +{ + "name": "CityCards Travel 22-8-2025", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "CityCards Travel 22-8-2025", + "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.13", + "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.13", + "vaul": "^1.1.2" + }, + "devDependencies": { + "@types/node": "^20.10.0", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react-swc": "^3.10.2", + "vite": "6.3.5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "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.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@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.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz", + "integrity": "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz", + "integrity": "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz", + "integrity": "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz", + "integrity": "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz", + "integrity": "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz", + "integrity": "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz", + "integrity": "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz", + "integrity": "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz", + "integrity": "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz", + "integrity": "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz", + "integrity": "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz", + "integrity": "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz", + "integrity": "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz", + "integrity": "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz", + "integrity": "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz", + "integrity": "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz", + "integrity": "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz", + "integrity": "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz", + "integrity": "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz", + "integrity": "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz", + "integrity": "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==", + "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.25", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", + "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.13.tgz", + "integrity": "sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==", + "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.18", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.13" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.13.tgz", + "integrity": "sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.13", + "@tailwindcss/oxide-darwin-arm64": "4.1.13", + "@tailwindcss/oxide-darwin-x64": "4.1.13", + "@tailwindcss/oxide-freebsd-x64": "4.1.13", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.13", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.13", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.13", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.13", + "@tailwindcss/oxide-linux-x64-musl": "4.1.13", + "@tailwindcss/oxide-wasm32-wasi": "4.1.13", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.13", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.13" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.13.tgz", + "integrity": "sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.13.tgz", + "integrity": "sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.13.tgz", + "integrity": "sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.13.tgz", + "integrity": "sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.13.tgz", + "integrity": "sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.13.tgz", + "integrity": "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.13.tgz", + "integrity": "sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.13.tgz", + "integrity": "sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.13.tgz", + "integrity": "sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.13.tgz", + "integrity": "sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==", + "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.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.13.tgz", + "integrity": "sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.13.tgz", + "integrity": "sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.13.tgz", + "integrity": "sha512-HLgx6YSFKJT7rJqh9oJs/TkBFhxuMOfUKSBEPYwV+t78POOBsdQ7crhZLzwcH3T0UyUuOzU/GK5pk5eKr3wCiQ==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.13", + "@tailwindcss/oxide": "4.1.13", + "postcss": "^8.4.41", + "tailwindcss": "4.1.13" + } + }, + "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.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.13.tgz", + "integrity": "sha512-yCAeZl7a0DxgNVteXFHt9+uyFbqXGy/ShC4BlcHkoE0AfGXYv/BUiplV72DjMYXHDBXFjhvr6DD1NiRVfB4j8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", + "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.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.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "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/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "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.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/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/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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.50.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz", + "integrity": "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==", + "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.50.1", + "@rollup/rollup-android-arm64": "4.50.1", + "@rollup/rollup-darwin-arm64": "4.50.1", + "@rollup/rollup-darwin-x64": "4.50.1", + "@rollup/rollup-freebsd-arm64": "4.50.1", + "@rollup/rollup-freebsd-x64": "4.50.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", + "@rollup/rollup-linux-arm-musleabihf": "4.50.1", + "@rollup/rollup-linux-arm64-gnu": "4.50.1", + "@rollup/rollup-linux-arm64-musl": "4.50.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", + "@rollup/rollup-linux-ppc64-gnu": "4.50.1", + "@rollup/rollup-linux-riscv64-gnu": "4.50.1", + "@rollup/rollup-linux-riscv64-musl": "4.50.1", + "@rollup/rollup-linux-s390x-gnu": "4.50.1", + "@rollup/rollup-linux-x64-gnu": "4.50.1", + "@rollup/rollup-linux-x64-musl": "4.50.1", + "@rollup/rollup-openharmony-arm64": "4.50.1", + "@rollup/rollup-win32-arm64-msvc": "4.50.1", + "@rollup/rollup-win32-ia32-msvc": "4.50.1", + "@rollup/rollup-win32-x64-msvc": "4.50.1", + "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.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz", + "integrity": "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==", + "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/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/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": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/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..e9d93e0 --- /dev/null +++ b/package.json @@ -0,0 +1,64 @@ +{ + "name": "CityCards Travel 22-8-2025", + "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.13", + "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.13", + "vaul": "^1.1.2" + }, + "devDependencies": { + "@types/node": "^20.10.0", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react-swc": "^3.10.2", + "vite": "6.3.5" + }, + "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/App.tsx b/src/App.tsx new file mode 100644 index 0000000..e5a673b --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,1209 @@ +import { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'motion/react'; +import { QrCode, X, Smartphone, CreditCard, Ticket } from 'lucide-react'; +import cityCardsLogo from './assets/cit-logo.png'; +import imgRectangle18609 from "./assets/84c8cfb942f3c96e9f5fbb29459a9861138f61d8.png"; + +import { LoginModal } from './components/LoginModal'; +import { CTAButton } from './components/CTAButton'; +import { HomePage } from './components/HomePage'; +import { PassesPage } from './components/PassesPage'; +import { MelbournePage } from './components/MelbournePage'; +import { AttractionsPage } from './components/AttractionsPage'; +import { AttractionDetailsPage } from './components/AttractionDetailsPage'; +import { CheckoutPage } from './components/CheckoutPage'; +import { SecureCheckoutPage } from './components/SecureCheckoutPage'; +import { BlogsPage } from './components/BlogsPage'; +import { BlogDetailsPage } from './components/BlogDetailsPage'; +import { HowItWorksPage } from './components/HowItWorksPage'; +import { FAQPage } from './components/FAQPage'; +import { PrivacyPolicyPage } from './components/PrivacyPolicyPage'; +import { AboutUsPage } from './components/AboutUsPage'; +import { ProfilePage } from './components/ProfilePage'; +import { CreateMagicItineraryPage } from './components/CreateMagicItineraryPage'; +import { ItineraryViewPage } from './components/ItineraryViewPage'; +import { OffersPage } from './components/OffersPage'; +import { CityCardsPage } from './components/CityCardsPage'; +import { MagicItineraryPage } from './components/MagicItineraryPage'; +import { PostCardsPage } from './components/PostCardsPage'; +import { DownloadAppPage } from './components/DownloadAppPage'; +import { EsimsPage } from './components/EsimsPage'; +import { HotelDiscountsPage } from './components/HotelDiscountsPage'; +import { ContactUsPage } from './components/ContactUsPage'; + +import { + heroVariants, + sectionVariants, + cardVariants, + staggerContainer, + fastStaggerContainer, + headingVariants, + textVariants, + ctaVariants, + iconVariants, + buttonHoverVariants, + cardHoverVariants, + pageTransition, + easeOutQuart, + easeOutExpo, + easeOutCubic +} from './utils/animations'; + +// User type definition +interface User { + email: string; + name: string; +} + +function App() { + const [selectedCity, setSelectedCity] = useState(''); + const [currentPage, setCurrentPage] = useState<'home' | 'melbourne' | 'passes' | 'attractions' | 'attraction-details' | 'checkout' | 'secure-checkout' | 'blogs' | 'blog-details' | 'how-it-works' | 'faq' | 'privacy-policy' | 'about-us' | 'profile' | 'create-itinerary' | 'itinerary-view' | 'offers' | 'citycards' | 'magic-itinerary' | 'postcards' | 'download-app' | 'esims' | 'hotel-discounts' | 'contact-us'>('home'); + const [selectedAttractionId, setSelectedAttractionId] = useState(''); + const [selectedBlogId, setSelectedBlogId] = useState(''); + const [isMobile, setIsMobile] = useState(false); + const [showQRCard, setShowQRCard] = useState(false); + const [offersSource, setOffersSource] = useState<'products' | 'passes'>('products'); + const [stickyCardType, setStickyCardType] = useState<'unlimited' | 'selective'>('unlimited'); + + // Login state management + const [user, setUser] = useState(null); + const [showLoginModal, setShowLoginModal] = useState(false); + + // Login handlers + const handleLoginSuccess = (userData: User) => { + setUser(userData); + setShowLoginModal(false); + }; + + const handleSignOut = () => { + setUser(null); + setCurrentPage('home'); + }; + + const handleCTAClick = () => { + if (user) { + // If logged in, navigate to profile or passes + setCurrentPage('profile'); + } else { + // If not logged in, show login modal + setShowLoginModal(true); + } + }; + + // Detect mobile for optimized animations + useEffect(() => { + const checkMobile = () => { + setIsMobile(window.innerWidth < 768); + }; + + checkMobile(); + window.addEventListener('resize', checkMobile); + return () => window.removeEventListener('resize', checkMobile); + }, []); + + // Generate a realistic QR code pattern + const generateQRPattern = () => { + const size = 27; // Even larger QR code size for the bigger widget + const pattern = []; + + for (let i = 0; i < size * size; i++) { + const row = Math.floor(i / size); + const col = i % size; + + // Corner squares (7x7 for larger QR) + const isCornerSquare = + (row < 7 && col < 7) || // Top-left + (row < 7 && col >= 20) || // Top-right + (row >= 20 && col < 7); // Bottom-left + + // Finder patterns within corner squares + const isFinderPattern = isCornerSquare && ( + (row === 0 || row === 6 || col === 0 || col === 6) || + (row >= 2 && row <= 4 && col >= 2 && col <= 4) + ); + + // Timing patterns + const isTimingPattern = (row === 6 && col >= 8 && col <= 18) || (col === 6 && row >= 8 && row <= 18); + + // Random data pattern for other areas + const isDataPattern = !isCornerSquare && !isTimingPattern && Math.random() > 0.38; + + pattern.push(isFinderPattern || isTimingPattern || isDataPattern); + } + + return pattern; + }; + + const qrPattern = generateQRPattern(); + + const renderPage = () => { + switch (currentPage) { + case 'home': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onAttractionsClick={() => setCurrentPage('attractions')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'passes': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('passes'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'melbourne': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onAttractionsClick={() => setCurrentPage('attractions')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'attractions': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + onAttractionClick={(attractionId: string) => { + setSelectedAttractionId(attractionId); + setCurrentPage('attraction-details'); + }} + currentPage={currentPage} + user={user} + /> + + ); + case 'attraction-details': + return ( + + setCurrentPage('attractions')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'checkout': + return ( + + setCurrentPage('passes')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + onSecureCheckoutClick={() => setCurrentPage('secure-checkout')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'secure-checkout': + return ( + + setCurrentPage('passes')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'blogs': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + onBlogClick={(blogId: string) => { + setSelectedBlogId(blogId); + setCurrentPage('blog-details'); + }} + currentPage={currentPage} + user={user} + /> + + ); + + case 'blog-details': + return ( + + setCurrentPage('blogs')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'how-it-works': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'faq': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'privacy-policy': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'about-us': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'profile': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('passes'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + onCreateItineraryClick={() => setCurrentPage('create-itinerary')} + onViewItineraryClick={() => setCurrentPage('itinerary-view')} + onDownloadAppClick={() => setCurrentPage('download-app')} + currentPage={currentPage} + /> + + ); + + case 'create-itinerary': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('home')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'itinerary-view': + return ( + + setCurrentPage('magic-itinerary')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + onCreateItineraryClick={() => setCurrentPage('create-itinerary')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'offers': + return ( + + setCurrentPage('profile')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => setCurrentPage('offers')} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + fromSource={offersSource} + currentPage={currentPage} + user={user} + /> + + ); + + case 'citycards': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'magic-itinerary': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + onCreateItineraryClick={() => setCurrentPage('create-itinerary')} + onViewItineraryClick={() => setCurrentPage('itinerary-view')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'postcards': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'download-app': + return ( + + setCurrentPage('profile')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'esims': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'hotel-discounts': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onMelbourneClick={() => setCurrentPage('melbourne')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + + case 'contact-us': + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onAttractionsClick={() => setCurrentPage('attractions')} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + currentPage={currentPage} + user={user} + /> + + ); + + default: + return ( + + setCurrentPage('home')} + onHomeClick={() => setCurrentPage('home')} + onAttractionsClick={() => setCurrentPage('attractions')} + onPassesClick={() => setCurrentPage('passes')} + onCheckoutClick={() => setCurrentPage('checkout')} + onSignInClick={() => setShowLoginModal(true)} + onSignOutClick={handleSignOut} + onBlogsClick={() => setCurrentPage('blogs')} + onHowItWorksClick={() => setCurrentPage('how-it-works')} + onFAQClick={() => setCurrentPage('faq')} + onPrivacyPolicyClick={() => setCurrentPage('privacy-policy')} + onAboutUsClick={() => setCurrentPage('about-us')} + onProfileClick={() => setCurrentPage('profile')} + onCityCardsClick={() => setCurrentPage('citycards')} + onMagicItineraryClick={() => setCurrentPage('magic-itinerary')} + onPostCardsClick={() => setCurrentPage('postcards')} + onOffersClick={() => { + setOffersSource('products'); + setCurrentPage('offers'); + }} + onEsimsClick={() => setCurrentPage('esims')} + onHotelDiscountsClick={() => setCurrentPage('hotel-discounts')} + onContactUsClick={() => setCurrentPage('contact-us')} + currentPage={currentPage} + user={user} + /> + + ); + } + }; + + return ( +
+ + + {/* Global Animation Context Provider */} + + + {renderPage()} + + + + {/* Login Modal */} + setShowLoginModal(false)} + onLoginSuccess={handleLoginSuccess} + /> + + {/* Sticky Widget - Dynamic based on page */} +
+ + {!showQRCard && ( + { + if (currentPage === 'attractions') { + setCurrentPage('checkout'); + } else { + setShowQRCard(true); + } + }} + className={`relative shadow-2xl flex items-center justify-center rounded-2xl transition-all duration-300 overflow-hidden group ${ + currentPage === 'attractions' + ? 'w-[244px] h-36' + : 'w-36 h-36 bg-black text-white' + }`} + aria-label={currentPage === 'attractions' ? 'Get CityCard' : 'Show QR Code'} + > + {currentPage === 'attractions' ? ( +
+
+ {/* Header Image */} +
+ + + {/* GET NOW Text */} +

GET NOW

+ + {/* Dashed Line Separator */} +
+
+ + + +
+
+ + {/* Card Title in Orange */} +

+ {stickyCardType === 'unlimited' ? ( + <>Melbourne Unlimited Card + ) : ( + <>Get Selective Card + )} +

+
+ + {/* Orange Border */} + + ) : ( +
+ {/* QR Icon */} + + + {/* Text */} +
+
+ Scan QR +
+
+ Download App +
+
+
+ )} + + {/* Subtle Hover Effect */} +
+ + )} + + + + {showQRCard && currentPage !== 'attractions' && ( + + {/* Close Button */} + + + {/* QR Code - Much Larger */} +
+
+ {/* QR Code Pattern */} +
+ {qrPattern.map((filled, index) => ( + + ))} +
+ + {/* Center Logo - Much Larger */} +
+
+ CityCards +
+
+
+
+ + {/* Text Content - Larger */} +
+

Scan QR for app

+

+ Scan to get the Melbourne CityCards mobile app +

+
+ + {/* Static Border */} +
+
+ )} +
+
+ + {/* Preload animation optimization */} + { + // Remove from DOM after animation + const element = document.querySelector('[data-preload]'); + element?.remove(); + }} + data-preload + /> +
+ ); +} + +// Export animation variants for use in components +export { + heroVariants, + sectionVariants, + cardVariants, + staggerContainer, + fastStaggerContainer, + headingVariants, + textVariants, + ctaVariants, + iconVariants, + buttonHoverVariants, + cardHoverVariants, + easeOutQuart, + easeOutExpo, + easeOutCubic +}; + +export default App; \ 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/assets/01db7df74b38a6ea709f973ff1a3ce03c9a5a75d.png b/src/assets/01db7df74b38a6ea709f973ff1a3ce03c9a5a75d.png new file mode 100644 index 0000000..8741a60 Binary files /dev/null and b/src/assets/01db7df74b38a6ea709f973ff1a3ce03c9a5a75d.png differ diff --git a/src/assets/0920e544195a4f6cffeb43277fdbb28bbf0e88b6.png b/src/assets/0920e544195a4f6cffeb43277fdbb28bbf0e88b6.png new file mode 100644 index 0000000..0612bf7 Binary files /dev/null and b/src/assets/0920e544195a4f6cffeb43277fdbb28bbf0e88b6.png differ diff --git a/src/assets/129015504c88093e4b54dc6e8c91b3997d9ccc5b.png b/src/assets/129015504c88093e4b54dc6e8c91b3997d9ccc5b.png new file mode 100644 index 0000000..bde60c7 Binary files /dev/null and b/src/assets/129015504c88093e4b54dc6e8c91b3997d9ccc5b.png differ diff --git a/src/assets/1512fbc49cf628796adeccca6752a29d1e61ecf4.png b/src/assets/1512fbc49cf628796adeccca6752a29d1e61ecf4.png new file mode 100644 index 0000000..2f3b2b2 Binary files /dev/null and b/src/assets/1512fbc49cf628796adeccca6752a29d1e61ecf4.png differ diff --git a/src/assets/183ba346669a0a079762ab3f9535b7d1469ed4d9.png b/src/assets/183ba346669a0a079762ab3f9535b7d1469ed4d9.png new file mode 100644 index 0000000..65787f4 Binary files /dev/null and b/src/assets/183ba346669a0a079762ab3f9535b7d1469ed4d9.png differ diff --git a/src/assets/1d756a3ad6ee9098afb373e07e18ddd36571954c.png b/src/assets/1d756a3ad6ee9098afb373e07e18ddd36571954c.png new file mode 100644 index 0000000..d57e152 Binary files /dev/null and b/src/assets/1d756a3ad6ee9098afb373e07e18ddd36571954c.png differ diff --git a/src/assets/26f0daececd90e6473f4b370af7b26b7fb2a67ad.png b/src/assets/26f0daececd90e6473f4b370af7b26b7fb2a67ad.png new file mode 100644 index 0000000..f7825cf Binary files /dev/null and b/src/assets/26f0daececd90e6473f4b370af7b26b7fb2a67ad.png differ diff --git a/src/assets/2a32b13e0ed94d79c4867062010cb1a848d72dc1.png b/src/assets/2a32b13e0ed94d79c4867062010cb1a848d72dc1.png new file mode 100644 index 0000000..9fb6c05 Binary files /dev/null and b/src/assets/2a32b13e0ed94d79c4867062010cb1a848d72dc1.png differ diff --git a/src/assets/3c5d5a12a7b44ab1b1ac2db7faa54270de100d86.png b/src/assets/3c5d5a12a7b44ab1b1ac2db7faa54270de100d86.png new file mode 100644 index 0000000..6518c9b Binary files /dev/null and b/src/assets/3c5d5a12a7b44ab1b1ac2db7faa54270de100d86.png differ diff --git a/src/assets/43f3bc1f9c8cc5b8f60f3f6be0bc1ad29eded0d7.png b/src/assets/43f3bc1f9c8cc5b8f60f3f6be0bc1ad29eded0d7.png new file mode 100644 index 0000000..8271161 Binary files /dev/null and b/src/assets/43f3bc1f9c8cc5b8f60f3f6be0bc1ad29eded0d7.png differ diff --git a/src/assets/4af0d5b295cf8650b4caa23233d3dcf539032a73.png b/src/assets/4af0d5b295cf8650b4caa23233d3dcf539032a73.png new file mode 100644 index 0000000..1bff437 Binary files /dev/null and b/src/assets/4af0d5b295cf8650b4caa23233d3dcf539032a73.png differ diff --git a/src/assets/5da1b0444c0d21bc7ee776c49e36e2a8ea4d3e12.png b/src/assets/5da1b0444c0d21bc7ee776c49e36e2a8ea4d3e12.png new file mode 100644 index 0000000..ee2ff09 Binary files /dev/null and b/src/assets/5da1b0444c0d21bc7ee776c49e36e2a8ea4d3e12.png differ diff --git a/src/assets/66c6d4d2fa6c02d9f60e12fcde70c13d4a78d0b7.png b/src/assets/66c6d4d2fa6c02d9f60e12fcde70c13d4a78d0b7.png new file mode 100644 index 0000000..8a96ea0 Binary files /dev/null and b/src/assets/66c6d4d2fa6c02d9f60e12fcde70c13d4a78d0b7.png differ diff --git a/src/assets/6c1d7aa4854f71023510e35ac1f4eb623441cb4a.png b/src/assets/6c1d7aa4854f71023510e35ac1f4eb623441cb4a.png new file mode 100644 index 0000000..5ccae11 Binary files /dev/null and b/src/assets/6c1d7aa4854f71023510e35ac1f4eb623441cb4a.png differ diff --git a/src/assets/84c8cfb942f3c96e9f5fbb29459a9861138f61d8.png b/src/assets/84c8cfb942f3c96e9f5fbb29459a9861138f61d8.png new file mode 100644 index 0000000..bb4b987 Binary files /dev/null and b/src/assets/84c8cfb942f3c96e9f5fbb29459a9861138f61d8.png differ diff --git a/src/assets/84f4f124e1476f3bb1eee24bc4c0fa75f1fed2a8.png b/src/assets/84f4f124e1476f3bb1eee24bc4c0fa75f1fed2a8.png new file mode 100644 index 0000000..c191362 Binary files /dev/null and b/src/assets/84f4f124e1476f3bb1eee24bc4c0fa75f1fed2a8.png differ diff --git a/src/assets/916a2ac02159f19d4e05b6fbbad76f315c8dfb66.png b/src/assets/916a2ac02159f19d4e05b6fbbad76f315c8dfb66.png new file mode 100644 index 0000000..15d3b7f Binary files /dev/null and b/src/assets/916a2ac02159f19d4e05b6fbbad76f315c8dfb66.png differ diff --git a/src/assets/a384e2e7712b48e54fadc7594244c40162ad4152.png b/src/assets/a384e2e7712b48e54fadc7594244c40162ad4152.png new file mode 100644 index 0000000..9172d25 Binary files /dev/null and b/src/assets/a384e2e7712b48e54fadc7594244c40162ad4152.png differ diff --git a/src/assets/a3956d2491d1e44ca71fc856b229d3e22523f828.png b/src/assets/a3956d2491d1e44ca71fc856b229d3e22523f828.png new file mode 100644 index 0000000..e7f9f10 Binary files /dev/null and b/src/assets/a3956d2491d1e44ca71fc856b229d3e22523f828.png differ diff --git a/src/assets/a812c79b0d125e4946b33446eae0353f518627e2.png b/src/assets/a812c79b0d125e4946b33446eae0353f518627e2.png new file mode 100644 index 0000000..ac576dd Binary files /dev/null and b/src/assets/a812c79b0d125e4946b33446eae0353f518627e2.png differ diff --git a/src/assets/ad526a204d3f66901399ea0452aaf33e105b0f32.png b/src/assets/ad526a204d3f66901399ea0452aaf33e105b0f32.png new file mode 100644 index 0000000..8e3af1f Binary files /dev/null and b/src/assets/ad526a204d3f66901399ea0452aaf33e105b0f32.png differ diff --git a/src/assets/bc70aef6686e5f4d059b5ef3380fd4f44bb9f4c6.png b/src/assets/bc70aef6686e5f4d059b5ef3380fd4f44bb9f4c6.png new file mode 100644 index 0000000..838ae90 Binary files /dev/null and b/src/assets/bc70aef6686e5f4d059b5ef3380fd4f44bb9f4c6.png differ diff --git a/src/assets/cc387e616b2e6552715d051e5c9a41e1a1637857.png b/src/assets/cc387e616b2e6552715d051e5c9a41e1a1637857.png new file mode 100644 index 0000000..f14543e Binary files /dev/null and b/src/assets/cc387e616b2e6552715d051e5c9a41e1a1637857.png differ diff --git a/src/assets/cit-logo.png b/src/assets/cit-logo.png new file mode 100644 index 0000000..0b36969 Binary files /dev/null and b/src/assets/cit-logo.png differ diff --git a/src/assets/d37e3e3f9d3f32fcf86dddd187aa6fd48832406a.png b/src/assets/d37e3e3f9d3f32fcf86dddd187aa6fd48832406a.png new file mode 100644 index 0000000..c935f7e Binary files /dev/null and b/src/assets/d37e3e3f9d3f32fcf86dddd187aa6fd48832406a.png differ diff --git a/src/assets/dda914a03c57961a1affac724d29681004341456.png b/src/assets/dda914a03c57961a1affac724d29681004341456.png new file mode 100644 index 0000000..a474821 Binary files /dev/null and b/src/assets/dda914a03c57961a1affac724d29681004341456.png differ diff --git a/src/assets/e8091276ed2c976b5c975f21687b0d1702bd9c90.png b/src/assets/e8091276ed2c976b5c975f21687b0d1702bd9c90.png new file mode 100644 index 0000000..975dd14 Binary files /dev/null and b/src/assets/e8091276ed2c976b5c975f21687b0d1702bd9c90.png differ diff --git a/src/assets/e96a0ba8c1e8ee053e3eb462a3b4552a8657e7b6.png b/src/assets/e96a0ba8c1e8ee053e3eb462a3b4552a8657e7b6.png new file mode 100644 index 0000000..b741036 Binary files /dev/null and b/src/assets/e96a0ba8c1e8ee053e3eb462a3b4552a8657e7b6.png differ diff --git a/src/assets/eaf15191e9a315d2d4b384ffcb22910687c3d328.png b/src/assets/eaf15191e9a315d2d4b384ffcb22910687c3d328.png new file mode 100644 index 0000000..c7bd31f Binary files /dev/null and b/src/assets/eaf15191e9a315d2d4b384ffcb22910687c3d328.png differ diff --git a/src/assets/eb1420e4d74097842eb197fc60970d29fa0afd1f.png b/src/assets/eb1420e4d74097842eb197fc60970d29fa0afd1f.png new file mode 100644 index 0000000..6d934b1 Binary files /dev/null and b/src/assets/eb1420e4d74097842eb197fc60970d29fa0afd1f.png differ diff --git a/src/assets/ef6f48b2b60d04fc8723d03a71f9dca2b6067704.png b/src/assets/ef6f48b2b60d04fc8723d03a71f9dca2b6067704.png new file mode 100644 index 0000000..4caa44c Binary files /dev/null and b/src/assets/ef6f48b2b60d04fc8723d03a71f9dca2b6067704.png differ diff --git a/src/assets/f32abfc6ad0bc41084ce6dd6d98890502970dda7.png b/src/assets/f32abfc6ad0bc41084ce6dd6d98890502970dda7.png new file mode 100644 index 0000000..642797b Binary files /dev/null and b/src/assets/f32abfc6ad0bc41084ce6dd6d98890502970dda7.png differ diff --git a/src/assets/f6c7124d0a9ca2463b53b6a370a48c4c0bbba57d.png b/src/assets/f6c7124d0a9ca2463b53b6a370a48c4c0bbba57d.png new file mode 100644 index 0000000..e9caa78 Binary files /dev/null and b/src/assets/f6c7124d0a9ca2463b53b6a370a48c4c0bbba57d.png differ diff --git a/src/assets/f9d75a20370022ef4bcdb5f3d08841527703cee6.png b/src/assets/f9d75a20370022ef4bcdb5f3d08841527703cee6.png new file mode 100644 index 0000000..d53016c Binary files /dev/null and b/src/assets/f9d75a20370022ef4bcdb5f3d08841527703cee6.png differ diff --git a/src/batch_replace_fonts.py b/src/batch_replace_fonts.py new file mode 100644 index 0000000..13e9d1a --- /dev/null +++ b/src/batch_replace_fonts.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +import os +import re + +# List of files to update +files_to_update = [ + "components/BlogsPage.tsx", + "components/HowItWorksPage.tsx", + "components/ProfilePage.tsx", + "components/EsimsPage.tsx", + "components/AttractionsPage.tsx", + "components/FAQPage.tsx", + "components/MelbourneBlogs.tsx", + "components/CityAttractionsPage.tsx", + "components/BlogDetailsPage.tsx", + "components/VarietyOfAdventures.tsx", + "components/MelbourneFAQ.tsx", + "components/MelbournePage.tsx", + "components/MelbourneCardComparison.tsx", + "components/BookAttractionSection.tsx", + "components/PassesPage.tsx", + "components/CheckoutPage.tsx", + "components/DownloadAppPage.tsx", + "components/WhyChooseUsSection.tsx", + "components/PrivacyPolicyPage.tsx", + "components/MobileAppPromotion.tsx", + "components/OffersPage.tsx", + "components/ContactUsPage.tsx", + "components/WhyChooseCityCards.tsx", + "components/HotelDiscountsPage.tsx", + "components/MagicItinerary.tsx", + "components/NewsletterSection.tsx", + "components/PostCardsPage.tsx", + "components/HeroSection.tsx", + "components/MelbourneTourOverview.tsx", + "components/ItineraryViewPage.tsx", + "components/CityCardsPage.tsx", + "components/MagicItineraryPage.tsx", + "components/CreateMagicItineraryPage.tsx", + "components/SecureCheckoutPage.tsx", + "components/AttractionDetailsPage.tsx", + "components/AboutUsPage.tsx" +] + +def replace_in_file(filepath): + """Replace font-merchant with font-poppins in a file.""" + try: + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + # Count replacements + count = content.count('font-merchant') + if count == 0: + print(f"✓ {filepath} - already updated") + return 0 + + # Replace all instances + new_content = content.replace('font-merchant', 'font-poppins') + + # Write back + with open(filepath, 'w', encoding='utf-8') as f: + f.write(new_content) + + print(f"✓ {filepath} - replaced {count} instances") + return count + + except FileNotFoundError: + print(f"✗ {filepath} - file not found") + return 0 + except Exception as e: + print(f"✗ {filepath} - error: {e}") + return 0 + +def main(): + print("Starting batch font replacement...") + print("=" * 50) + + total_replacements = 0 + files_updated = 0 + + for filepath in files_to_update: + count = replace_in_file(filepath) + if count > 0: + files_updated += 1 + total_replacements += count + + print("=" * 50) + print(f"\nCompleted!") + print(f"Files updated: {files_updated}") + print(f"Total replacements: {total_replacements}") + +if __name__ == "__main__": + main() diff --git a/src/components/AboutUsPage.tsx b/src/components/AboutUsPage.tsx new file mode 100644 index 0000000..558ffdb --- /dev/null +++ b/src/components/AboutUsPage.tsx @@ -0,0 +1,539 @@ +import React from 'react'; +import { motion } from 'motion/react'; +import { ArrowLeft, Heart, MapPin, Zap, Globe, Users, Camera, Coffee } from 'lucide-react'; +import { Button } from './ui/button'; +import { ImageWithFallback } from './figma/ImageWithFallback'; +import Navbar from './Navbar'; +import { Footer } from './Footer'; +import { MobileAppSection } from './MobileAppSection'; +import { EnhancedTestimonials } from './EnhancedTestimonials'; +import { ReviewsSection } from './ReviewsSection'; + +interface User { + email: string; + name: string; +} + +interface AboutUsPageProps { + onBackClick: () => void; + onHomeClick: () => void; + onMelbourneClick: () => void; + onPassesClick: () => void; + onCheckoutClick: () => void; + onSignInClick: () => void; + onSignOutClick: () => void; + onAttractionsClick: () => void; + onBlogsClick: () => void; + onHowItWorksClick: () => void; + onFAQClick: () => void; + onPrivacyPolicyClick: () => void; + onAboutUsClick: () => void; + onProfileClick: () => void; + onCityCardsClick: () => void; + onMagicItineraryClick: () => void; + onPostCardsClick: () => void; + onOffersClick: () => void; + onContactUsClick?: () => void; + onEsimsClick?: () => void; + onHotelDiscountsClick?: () => void; + currentPage: string; + user: User | null; +} + +export function AboutUsPage({ + onBackClick, + onHomeClick, + onMelbourneClick, + onPassesClick, + onCheckoutClick, + onSignInClick, + onSignOutClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onProfileClick, + onCityCardsClick, + onMagicItineraryClick, + onPostCardsClick, + onOffersClick, + onContactUsClick, + onEsimsClick, + onHotelDiscountsClick, + currentPage, + user +}: AboutUsPageProps) { + return ( +
+ {/* Navbar */} + {}} + onHomeClick={onHomeClick} + onMelbourneClick={onMelbourneClick} + onPassesClick={onPassesClick} + onCheckoutClick={onCheckoutClick} + onSignInClick={onSignInClick} + onAttractionsClick={onAttractionsClick} + onBlogsClick={onBlogsClick} + onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} + onPrivacyPolicyClick={onPrivacyPolicyClick} + onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} + onCityCardsClick={onCityCardsClick} + onMagicItineraryClick={onMagicItineraryClick} + onPostCardsClick={onPostCardsClick} + onOffersClick={onOffersClick} + currentPage={currentPage} + isUserSignedIn={!!user} + user={user} + /> + + {/* Header Section with Floating Elements */} +
+ {/* Floating Travel Icons */} + + + + + + + + + + + + +
+ {/* Back Button */} + + + Back + + + {/* Page Title with Fun Typography */} + + + Meet the{' '} + + Dream Team + {' '} + ✈️ + + + We're a bunch of travel-obsessed humans who got tired of vacation planning stress + and decided to fix it for everyone! 🌍✨ + + +
+
+ + {/* Our Story Section */} +
+
+
+ + {/* Story Introduction */} + +
+ + + Our Story + + +

+ From{' '} + Travel Stress{' '} + to{' '} + + Travel Bliss + +

+ +

+ Picture this: You're on your dream vacation, but instead of exploring that amazing museum, + you're standing in a 2-hour line holding a crumpled paper ticket. Sound familiar? 😅 +

+ +

+ That's exactly what happened to our founder during a trip to Melbourne. After missing + three attractions because of queues and ticket confusion, they had an idea: + "What if we could put all city attractions in one magical card?" +

+
+ + +
+ + + {/* Floating emoji reactions */} + + 💡 + + + + ✨ + + + + + {/* Our Mission Cards */} + + {[ + { + icon: , + title: "Skip the Lines", + description: "Because life's too short to waste on queues! Fast-track entry to all the coolest spots.", + color: "from-yellow-400 to-orange-500", + emoji: "⚡" + }, + { + icon: , + title: "Discover Hidden Gems", + description: "We'll show you secret local spots that even your guidebook doesn't know about!", + color: "from-green-400 to-blue-500", + emoji: "🗺️" + }, + { + icon: , + title: "Create Epic Memories", + description: "More time exploring, less time planning. That's what vacation should feel like!", + color: "from-pink-400 to-red-500", + emoji: "💖" + } + ].map((card, index) => ( + +
+ {/* Background gradient */} +
+ + {/* Floating emoji */} + + {card.emoji} + + +
+ {card.icon} +
+ +

+ {card.title} +

+ +

+ {card.description} +

+
+ + ))} + + + {/* Team Stats Section */} + +

+ We're a Small Team with Big Dreams 🚀 +

+ +
+ {[ + { number: "15+", label: "Cities Covered", emoji: "🌍" }, + { number: "500K+", label: "Happy Travelers", emoji: "😊" }, + { number: "1M+", label: "Lines Skipped", emoji: "⚡" }, + { number: "∞", label: "Adventures Created", emoji: "🗺️" } + ].map((stat, index) => ( + + + {stat.emoji} + +
+ {stat.number} +
+
+ {stat.label} +
+
+ ))} +
+
+
+
+
+ + {/* Values Section */} +
+
+
+ + What Makes Us{' '} + Tick{' '} + ⚡ + + + These aren't just buzzwords for us - they're our daily mantras! + +
+ +
+ {[ + { + title: "Travel Should Be Fun", + description: "Not stressful, not complicated, just pure joy and discovery!", + icon: , + emoji: "🎉" + }, + { + title: "Everyone Deserves Adventure", + description: "From budget backpackers to luxury travelers - adventure is for all!", + icon: , + emoji: "🌟" + }, + { + title: "Local is Everything", + description: "The best experiences come from locals who know their city inside out.", + icon: , + emoji: "🏠" + }, + { + title: "Innovation Over Tradition", + description: "Why stick to 'how it's always been' when we can make it better?", + icon: , + emoji: "💡" + }, + { + title: "Sustainability Matters", + description: "Protecting the places we love to visit for future generations.", + icon: , + emoji: "🌱" + }, + { + title: "Memories Over Things", + description: "The best souvenirs are the stories you'll tell forever.", + icon: , + emoji: "📸" + } + ].map((value, index) => ( + + + {value.emoji} + + +
+ {value.icon} +
+ +

+ {value.title} +

+ +

+ {value.description} +

+
+ ))} +
+
+
+ + {/* What Our Travelers Say Section */} + + + {/* Access All Your City Cards Section */} +
+ +
+ + {/* Customer Review Section */} +
+ +
+ + {/* Footer */} +
+
+ ); +} \ No newline at end of file diff --git a/src/components/ArticlesSection.tsx b/src/components/ArticlesSection.tsx new file mode 100644 index 0000000..f7cd16e --- /dev/null +++ b/src/components/ArticlesSection.tsx @@ -0,0 +1,79 @@ +import { ImageWithFallback } from './figma/ImageWithFallback'; +import { Button } from './ui/button'; + +interface ArticleCard { + id: string; + title: string; + image: string; +} + +const articles: ArticleCard[] = [ + { + id: '1', + title: 'Choosing a Travel Backpack: A Comprehensive Guide!', + image: 'https://images.unsplash.com/photo-1553062407-98eeb64c6a62?w=500&h=400&fit=crop&q=80' + }, + { + id: '2', + title: 'Bucket List Trip - 52 Places To Visit In Your Life...', + image: 'https://images.unsplash.com/photo-1488646953014-85cb44e25828?w=500&h=400&fit=crop&q=80' + }, + { + id: '3', + title: 'The FREE Way to Travel: No Money, No Problems!', + image: 'https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=500&h=400&fit=crop&q=80' + } +]; + +export function ArticlesSection() { + return ( +
+
+ {/* Header */} +
+

+ Our latest articles about travel +

+

+ Know the latest articles about travel +

+
+ + {/* Articles Grid */} +
+ {articles.map((article) => ( +
+ + {/* Gradient overlay */} +
+ + {/* Article title */} +
+

+ {article.title} +

+
+
+ ))} +
+ + {/* CTA Button */} +
+ +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/AttractionDetailsPage.tsx b/src/components/AttractionDetailsPage.tsx new file mode 100644 index 0000000..834e875 --- /dev/null +++ b/src/components/AttractionDetailsPage.tsx @@ -0,0 +1,474 @@ +import { useState } from 'react'; +import { motion } from 'motion/react'; +import { ArrowLeft, Clock, Users, Calendar, MapPin, Star, Check, X, ChevronLeft, ChevronRight } from 'lucide-react'; +import { Button } from './ui/button'; +import { Badge } from './ui/badge'; +import { Card, CardContent } from './ui/card'; +import { Separator } from './ui/separator'; +import { Calendar as CalendarComponent } from './ui/calendar'; +import Navbar from './Navbar'; +import { Footer } from './Footer'; +import { ImageWithFallback } from './figma/ImageWithFallback'; + +interface AttractionDetailsPageProps { + attractionId: string; + onBackClick: () => void; + onHomeClick: () => void; + onMelbourneClick: () => void; + onPassesClick: () => void; + onCheckoutClick: () => void; + onSignInClick: () => void; + onSignOutClick?: () => void; + onAttractionsClick: () => void; + onBlogsClick: () => void; + onHowItWorksClick: () => void; + onFAQClick: () => void; + onPrivacyPolicyClick: () => void; + onAboutUsClick: () => void; + onProfileClick: () => void; + onCityCardsClick: () => void; + onMagicItineraryClick: () => void; + onPostCardsClick: () => void; + onOffersClick: () => void; + onContactUsClick?: () => void; + onEsimsClick?: () => void; + onHotelDiscountsClick?: () => void; + currentPage: string; + user?: { email: string; name: string } | null; +} + +export function AttractionDetailsPage({ + attractionId, + onBackClick, + onHomeClick, + onMelbourneClick, + onPassesClick, + onCheckoutClick, + onSignInClick, + onSignOutClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onProfileClick, + onCityCardsClick, + onMagicItineraryClick, + onPostCardsClick, + onOffersClick, + onContactUsClick, + onEsimsClick, + onHotelDiscountsClick, + currentPage, + user, +}: AttractionDetailsPageProps) { + const [date, setDate] = useState(new Date()); + + // Featured attraction for the main display + const featuredAttraction = { + id: 'phi-phi', + name: 'Phi Phi Islands Adventure Day Trip with Seaview Lunch by V. Marine Tour', + badges: ['Bestseller', 'Free cancellation', 'Reservation Required'], + images: { + main: 'https://images.unsplash.com/photo-1559827260-dc66d52bef19?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzbm9ya2VsaW5nJTIwdHVydGxlJTIwYWR2ZW50dXJlfGVufDF8fHx8MTc1ODEwNDkwMHww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + gallery: [ + 'https://images.unsplash.com/photo-1559827260-dc66d52bef19?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzbm9ya2VsaW5nJTIwdHVydGxlJTIwYWR2ZW50dXJlfGVufDF8fHx8MTc1ODEwNDkwMHww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + 'https://images.unsplash.com/photo-1571019613454-1cb2f99b2d8b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxpc2xhbmQlMjB0b3VyJTIwYWRvJTIwdHJvcGljYWx8ZW58MXx8fHwxNzU4MTA0OTEwfDA&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxncmVhdCUyMG9jZWFuJTIwcm9hZCUyMGF1c3RyYWxpYXxlbnwxfHx8fDE3NTgxMDQ5Mzd8MA&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + 'https://images.unsplash.com/photo-1682687220742-aba13b6e50ba?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhdHYlMjBkZXNlcnQlMjB0b3VyfGVufDF8fHx8MTc1ODEwNDg5Nnww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral' + ] + }, + overview: { + duration: '3 days', + groupSize: '10 people', + ages: '18-99 yrs', + languages: 'English, Japanese' + }, + description: 'The Phi Phi archipelago is a must-visit while in Phuket, and this speedboat trip whisks you around the islands in one day. Swim over the coral reefs of Pileh Lagoon, have lunch at Phi Phi Leh, snorkel at Bamboo Island, and visit Monkey Beach and Maya Bay, immortalized in "The Beach." Boat transfers, snacks, buffet lunch, snorkeling equipment, and Phuket hotel pickup and drop-off all included.', + highlights: [ + 'Experience the thrill of a speedboat to the stunning Phi Phi Islands', + 'Be amazed by the variety of marine life in the archepelago', + 'Enjoy relaxing in paradise with white sand beaches and azure turquoise water', + 'Feel the comfort of a tour limited to 35 passengers', + 'Catch a glimpse of the wild monkeys around Monkey Beach' + ], + included: [ + 'Beverages, drinking water, morning tea and buffet lunch', + 'Local taxes', + 'Hotel pickup and drop-off by air-conditioned minivan', + 'Insurance Transfer to a private pier', + 'Soft drinks', + 'Tour Guide' + ], + notIncluded: [ + 'Towel', + 'Tips', + 'Alcoholic Beverages' + ], + bookingOptions: [ + 'By Calling on 022 2645675', + 'Email your details at islands.booking@mail.com', + 'Via CityCards Portal' + ] + }; + + return ( +
+ { + if (city === 'Melbourne') { + onMelbourneClick(); + } + }} + onSignInClick={onSignInClick} + onSignOutClick={onSignOutClick} + onPassesClick={onPassesClick} + onCheckoutClick={onCheckoutClick} + onHomeClick={onHomeClick} + onAttractionsClick={onAttractionsClick} + onBlogsClick={onBlogsClick} + onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} + onPrivacyPolicyClick={onPrivacyPolicyClick} + onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} + onCityCardsClick={onCityCardsClick} + onMagicItineraryClick={onMagicItineraryClick} + onPostCardsClick={onPostCardsClick} + onOffersClick={onOffersClick} + currentPage="attractions" + isUserSignedIn={!!user} + user={user} + /> + +
+ {/* Back Button */} + + + + + {/* Title and Badges Section */} +
+
+ {featuredAttraction.badges.map((badge, index) => ( + + {badge} + + ))} +
+ +

+ + Phi Phi Islands Adventure + {' '} + + Day Trip with Seaview Lunch by V. Marine Tour + +

+
+ + {/* Image Gallery Section */} +
+ {/* Main large image */} +
+ +
+ + {/* Gallery images */} + {featuredAttraction.images.gallery.slice(0, 4).map((image, index) => ( +
+ +
+ ))} +
+ + {/* Main Content Grid */} +
+ {/* Left Content - Tour Details */} +
+ {/* Overview Cards */} +
+ {Object.entries(featuredAttraction.overview).map(([key, value]) => ( + +
+ {key === 'duration' && } + {key === 'groupSize' && } + {key === 'ages' && } + {key === 'languages' && } +
+

+ {key === 'groupSize' ? 'Group Size' : key} +

+

{value}

+
+ ))} +
+ + {/* Tour Overview */} +
+
+
+

+ Tour Overview +

+
+

+ {featuredAttraction.description} +

+
+ + {/* Tour Highlights */} +
+
+
+

+ Tour Highlights +

+
+
    + {featuredAttraction.highlights.map((highlight, index) => ( +
  • +
    +
    +
    + {highlight} +
  • + ))} +
+
+ + {/* What's Included/Not Included */} +
+
+
+

+ What's included +

+
+
+ {/* Included */} +
+

+ + Included +

+ {featuredAttraction.included.map((item, index) => ( +
+
+ +
+ {item} +
+ ))} +
+ + {/* Not Included */} +
+

+ + Not Included +

+ {featuredAttraction.notIncluded.map((item, index) => ( +
+
+ +
+ {item} +
+ ))} +
+
+
+ + {/* Location on map placeholder */} +
+
+
+

+ Location on map +

+
+
+
+
+ +
+

Interactive Map

+

Phi Phi Islands, Thailand

+
+
+
+
+ + {/* Right Sidebar - Calendar and Booking */} +
+ {/* Calendar Widget with Custom Design */} + +
+

Select Date

+

Choose your preferred visit date

+
+ + {/* Custom Calendar Design */} +
+ {/* Calendar Header */} +
+ + September 2025 + +
+ + {/* Days of week */} +
+
Su
+
Mo
+
Tu
+
We
+
Th
+
Fr
+
Sa
+
+ + {/* Calendar Grid */} +
+ {/* Previous month */} + + + {/* Current month */} + {Array.from({ length: 30 }, (_, i) => { + const day = i + 1; + const isSelected = day === 27; + const isToday = day === 15; + return ( + + ); + })} + + {/* Next month */} + {Array.from({ length: 4 }, (_, i) => ( + + ))} +
+
+ + {/* Selected Date Display */} +
+
+ +
+

Selected Date

+

September 27, 2025

+
+
+
+
+ + {/* Pricing Card */} + +
+
+ Adult Ticket + $89 +
+
+ Service Fee + $5 +
+
+
+ Total + $94 +
+
+
+
+ + {/* Confirm Booking Button */} + + + {/* Trust Indicators */} +
+
+ + Instant Confirmation +
+
+ + Free Cancellation +
+
+
+
+
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/components/AttractionHassleFreeSection.tsx b/src/components/AttractionHassleFreeSection.tsx new file mode 100644 index 0000000..fc26d0d --- /dev/null +++ b/src/components/AttractionHassleFreeSection.tsx @@ -0,0 +1,225 @@ +import { motion } from 'motion/react'; +import earthImage from '../assets/f32abfc6ad0bc41084ce6dd6d98890502970dda7.png'; + +export function AttractionHassleFreeSection() { + return ( +
+ {/* Subtle Background Elements */} +
+
+
+
+ +
+ + {/* Left Side - Earth Ellipse with Cloud Animation */} + + {/* Earth Ellipse Container */} +
+ {/* Earth PNG Image */} + + Earth + + + {/* Floating Cloud Animations */} + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + {/* Orbital Ring - Centered around the Earth */} + + {/* Small orbiting elements */} + + + +
+
+ + {/* Right Side - Content with Hierarchy - Full Width */} + +
+ {/* Main Heading */} + + Make the most of every{' '} + + attraction + + —hassle-free. + + + {/* Content Sections */} +
+ {/* Section 1 */} + +

+ Explore a diverse array of travel passes +

+

+ Explore a diverse array of travel passes, each designed to enhance your + adventure. From unlimited access to top attractions to exclusive discounts + on local experiences, our selection ensures you find the ideal pass for + your journey. +

+
+ + {/* Section 2 */} + +

+ Discover every attraction effortlessly +

+

+ Explore a diverse array of travel passes, each designed to enhance your + adventure. From unlimited access to top attractions to exclusive discounts + on local experiences, our selection ensures you find the ideal pass for + your journey. +

+
+ + {/* Section 3 */} + +

+ Discover every attraction effortlessly +

+

+ Explore a diverse array of travel passes, each designed to enhance your + adventure. From unlimited access to top attractions to exclusive discounts + on local experiences, our selection ensures you find the ideal pass for + your journey. +

+
+
+
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/AttractionsPage.tsx b/src/components/AttractionsPage.tsx new file mode 100644 index 0000000..1e7eee8 --- /dev/null +++ b/src/components/AttractionsPage.tsx @@ -0,0 +1,604 @@ +import { useState } from 'react'; +import { motion } from 'motion/react'; +import { Search, Star, Clock, ChevronRight } from 'lucide-react'; +import { Button } from './ui/button'; +import { Input } from './ui/input'; +import { Card, CardContent } from './ui/card'; +import { Badge } from './ui/badge'; +import { Checkbox } from './ui/checkbox'; +import Navbar from './Navbar'; +import { CitySubmenu } from './CitySubmenu'; +import { Footer } from './Footer'; +import { ImageWithFallback } from './figma/ImageWithFallback'; + +interface User { + email: string; + name: string; +} + +interface Attraction { + id: string; + name: string; + description: string; + image: string; + location: string; + duration: string; + rating: number; + price: number; + category: string; + hasReservation: boolean; + reviewCount: number; + passType: string; +} + +const attractions: Attraction[] = [ + { + id: '1', + name: 'Centipede Tour - Guided Arizona Desert Tour by ATV', + description: 'Experience the thrill of off-road adventure through the stunning Arizona desert landscape', + image: 'https://images.unsplash.com/photo-1682687220742-aba13b6e50ba?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhdHYlMjBkZXNlcnQlMjB0b3VyfGVufDF8fHx8MTc1ODEwNDg5Nnww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + location: 'Paris, France', + duration: '4 days', + rating: 4.8, + price: 189.25, + category: 'adventure', + hasReservation: true, + reviewCount: 243, + passType: 'unlimited' + }, + { + id: '2', + name: 'Molokini and Turtle Town Snorkeling Adventure Aboard', + description: 'Snorkel in crystal-clear waters and swim alongside sea turtles in this unforgettable marine adventure', + image: 'https://images.unsplash.com/photo-1559827260-dc66d52bef19?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzbm9ya2VsaW5nJTIwdHVydGxlJTIwYWR2ZW50dXJlfGVufDF8fHx8MTc1ODEwNDkwMHww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + location: 'New York, USA', + duration: '4 days', + rating: 4.8, + price: 225, + category: 'adventure', + hasReservation: false, + reviewCount: 167, + passType: 'selective' + }, + { + id: '3', + name: 'Westminster Walking Tour & Westminster Abbey Entry', + description: 'Explore the heart of London with guided tours of historic Westminster and the famous Abbey', + image: 'https://images.unsplash.com/photo-1533929736458-ca588d08c8be?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHx3ZXN0bWluc3RlciUyMGFiYmV5JTIwbG9uZG9ufGVufDF8fHx8MTc1ODEwNDkwNnww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + location: 'London, UK', + duration: '4 days', + rating: 4.8, + price: 343, + category: 'culture', + hasReservation: true, + reviewCount: 343, + passType: 'unlimited' + }, + { + id: '4', + name: 'All Inclusive Ultimate Circle Island Day Tour with Lunch', + description: 'Comprehensive island tour including all major attractions, lunch, and transportation', + image: 'https://images.unsplash.com/photo-1571019613454-1cb2f99b2d8b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxpc2xhbmQlMjB0b3VyJTIwYWRvJTIwdHJvcGljYWx8ZW58MXx8fHwxNzU4MTA0OTEwfDA&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + location: 'New York, USA', + duration: '4 days', + rating: 4.8, + price: 225, + category: 'adventure', + hasReservation: false, + reviewCount: 243, + passType: 'unlimited' + }, + { + id: '5', + name: 'Space Center Houston Admission Ticket', + description: 'Explore NASA\'s Johnson Space Center and discover the wonders of space exploration', + image: 'https://images.unsplash.com/photo-1446776653964-20c1d3a81b06?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzcGFjZSUyMGNlbnRlciUyMG5hc2ElMjBob3VzdG9ufGVufDF8fHx8MTc1ODEwNDkxM3ww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + location: 'Paris, France', + duration: '4 days', + rating: 4.8, + price: 225, + category: 'family', + hasReservation: true, + reviewCount: 243, + passType: 'selective' + }, + { + id: '6', + name: 'Melbourne Skydeck Observatory', + description: 'Experience breathtaking 360-degree views from the Southern Hemisphere\'s highest viewing platform', + image: 'https://images.unsplash.com/photo-1677200922658-d0df5b2ac91e?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxtZWxib3VybmUlMjBhdHRyYWN0aW9ucyUyMGZhbW91cyUyMGxhbmRtYXJrc3xlbnwxfHx8fDE3NTc0MDEwODV8MA&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + location: 'Melbourne CBD', + duration: '2 hours', + rating: 4.5, + price: 25, + category: 'adventure', + hasReservation: true, + reviewCount: 892, + passType: 'selective' + }, + { + id: '7', + name: 'Royal Botanic Gardens Melbourne', + description: 'Explore 38 hectares of stunning gardens featuring over 8,500 species of plants', + image: 'https://images.unsplash.com/photo-1721272962395-a848331ce92d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxtZWxib3VybmUlMjByb3lhbCUyMGJvdGFuaWMlMjBnYXJkZW5zfGVufDF8fHx8MTc1NzMzNzc4OXww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + location: 'South Yarra', + duration: '3 hours', + rating: 4.7, + price: 0, + category: 'nature', + hasReservation: false, + reviewCount: 1245, + passType: 'selective' + }, + { + id: '8', + name: 'Federation Square Cultural Precinct', + description: 'Melbourne\'s cultural precinct featuring galleries, museums, and unique architecture', + image: 'https://images.unsplash.com/photo-1580688027085-8220709e3d84?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxmZWRlcmF0aW9uJTIwc3F1YXJlJTIwbWVsYm91cm5lfGVufDF8fHx8MTc1NzQwMTA5Mnww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + location: 'Melbourne CBD', + duration: '3 hours', + rating: 4.3, + price: 0, + category: 'culture', + hasReservation: true, + reviewCount: 672, + passType: 'unlimited' + }, + { + id: '9', + name: 'St Kilda Pier & Little Penguins', + description: 'Watch little penguins return home at sunset while enjoying the scenic pier', + image: 'https://images.unsplash.com/photo-1597889790884-2bb63cfbd4f6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzdCUyMGtpbGRhJTIwcGllciUyMG1lbGJvdXJuZXxlbnwxfHx8fDE3NTc0MDEwOTV8MA&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + location: 'St Kilda', + duration: '2 hours', + rating: 4.4, + price: 0, + category: 'nature', + hasReservation: false, + reviewCount: 543, + passType: 'unlimited' + }, + { + id: '10', + name: 'Queen Victoria Market Experience', + description: 'Historic market offering fresh produce, gourmet foods, and unique souvenirs', + image: 'https://images.unsplash.com/photo-1676454953709-e0be46f62490?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxxdWVlbiUyMHZpY3RvcmlhJTIwbWFya2V0JTIwbWVsYm91cm5lfGVufDF8fHx8MTc1NzQwMTA5OHww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + location: 'Melbourne CBD', + duration: '2 hours', + rating: 4.6, + price: 0, + category: 'culture', + hasReservation: true, + reviewCount: 987, + passType: 'selective' + }, + { + id: '11', + name: 'Melbourne Zoo Adventure', + description: 'Meet over 320 animal species from around the world in naturalistic habitats', + image: 'https://images.unsplash.com/photo-1681429477985-30dc7b88dd5b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxtZWxib3VybmUlMjB6b28lMjBhbmltYWxzfGVufDF8fHx8MTc1NzMzNzgxMHww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + location: 'Parkville', + duration: '4 hours', + rating: 4.5, + price: 40, + category: 'family', + hasReservation: false, + reviewCount: 1156, + passType: 'selective' + }, + { + id: '12', + name: 'Great Ocean Road Day Tour', + description: 'Scenic coastal drive featuring the famous Twelve Apostles and stunning ocean views', + image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxncmVhdCUyMG9jZWFuJTIwcm9hZCUyMGF1c3RyYWxpYXxlbnwxfHx8fDE3NTgxMDQ5Mzd8MA&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral', + location: 'Great Ocean Road', + duration: '12 hours', + rating: 4.9, + price: 85, + category: 'adventure', + hasReservation: true, + reviewCount: 678, + passType: 'unlimited' + } +]; + +const filterCategories = [ + { value: 'with-reservation', label: 'With Reservation', count: 3 }, + { value: 'without-reservation', label: 'Without Reservation', count: 3 }, + { value: 'beach', label: 'Beach', count: 3 }, + { value: 'adventure', label: 'Adventure', count: 3 }, + { value: 'mountains', label: 'Mountains', count: 3 }, + { value: 'family', label: 'Family Friendly', count: 3 } +]; + +const passTypeCategories = [ + { value: 'selective', label: 'Selective Pass', count: 6 }, + { value: 'unlimited', label: 'Unlimited Pass', count: 6 } +]; + +interface AttractionsPageProps { + onBackClick: () => void; + onHomeClick: () => void; + onMelbourneClick: () => void; + onPassesClick: () => void; + onCheckoutClick: () => void; + onSignInClick: () => void; + onSignOutClick: () => void; + onAttractionsClick: () => void; + onBlogsClick: () => void; + onHowItWorksClick: () => void; + onFAQClick: () => void; + onPrivacyPolicyClick: () => void; + onAboutUsClick: () => void; + onProfileClick: () => void; + onCityCardsClick: () => void; + onMagicItineraryClick: () => void; + onPostCardsClick: () => void; + onOffersClick: () => void; + onContactUsClick?: () => void; + onEsimsClick?: () => void; + onHotelDiscountsClick?: () => void; + onAttractionClick?: (attractionId: string) => void; + currentPage: string; + user: User | null; +} + +export function AttractionsPage({ + onBackClick, + onHomeClick, + onMelbourneClick, + onPassesClick, + onCheckoutClick, + onSignInClick, + onSignOutClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onProfileClick, + onCityCardsClick, + onMagicItineraryClick, + onPostCardsClick, + onOffersClick, + onContactUsClick, + onEsimsClick, + onHotelDiscountsClick, + onAttractionClick, + currentPage, + user +}: AttractionsPageProps) { + const [searchQuery, setSearchQuery] = useState(''); + const [selectedCategories, setSelectedCategories] = useState([]); + const [selectedPassTypes, setSelectedPassTypes] = useState([]); + + const filteredAttractions = attractions.filter(attraction => { + const matchesSearch = attraction.name.toLowerCase().includes(searchQuery.toLowerCase()) || + attraction.description.toLowerCase().includes(searchQuery.toLowerCase()); + + const matchesCategory = selectedCategories.length === 0 || + selectedCategories.some(cat => { + if (cat === 'with-reservation') return attraction.hasReservation; + if (cat === 'without-reservation') return !attraction.hasReservation; + return attraction.category === cat; + }); + + const matchesPassType = selectedPassTypes.length === 0 || + selectedPassTypes.includes(attraction.passType); + + return matchesSearch && matchesCategory && matchesPassType; + }); + + const toggleCategory = (category: string) => { + setSelectedCategories(prev => + prev.includes(category) + ? prev.filter(c => c !== category) + : [...prev, category] + ); + }; + + const togglePassType = (passType: string) => { + setSelectedPassTypes(prev => + prev.includes(passType) + ? prev.filter(p => p !== passType) + : [...prev, passType] + ); + }; + + const showingFrom = 1; + const showingTo = Math.min(12, filteredAttractions.length); + const totalItems = filteredAttractions.length; + + return ( +
+ { + if (city === 'Melbourne') { + onMelbourneClick(); + } + }} + onSignInClick={onSignInClick} + onSignOutClick={onSignOutClick} + onPassesClick={onPassesClick} + onCheckoutClick={onCheckoutClick} + onHomeClick={onHomeClick} + onAttractionsClick={onAttractionsClick} + onBlogsClick={onBlogsClick} + onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} + onPrivacyPolicyClick={onPrivacyPolicyClick} + onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} + onCityCardsClick={onCityCardsClick} + onMagicItineraryClick={onMagicItineraryClick} + onPostCardsClick={onPostCardsClick} + onOffersClick={onOffersClick} + currentPage="attractions" + isUserSignedIn={!!user} + user={user} + /> + + {/* City Submenu */} + {}} // Empty function since submenu always shows on this page + onHomeClick={onHomeClick} + onMelbourneClick={onMelbourneClick} + onAttractionsClick={onAttractionsClick} + onPassesClick={onPassesClick} + onBlogsClick={onBlogsClick} + onHowItWorksClick={onHowItWorksClick} + /> + +
+ {/* Breadcrumb */} + + + {/* Page Header */} +
+

+ Discover{' '} + Melbourne's{' '} + Best{' '} + Attractions +

+

+ Skip the lines and explore Melbourne's most iconic destinations with your CityCard pass +

+
+ + {/* City Card Promotional Banner */} +
+ +
+

+ Find Your Perfect Adventure +

+ + {/* Search Bar and Button Container */} +
+ {/* Search Bar */} +
+ setSearchQuery(e.target.value)} + className="pl-4 pr-12 h-[44px] bg-white/95 backdrop-blur-sm border-0 rounded-lg text-gray-800 placeholder:text-gray-500 font-poppins shadow-lg" + /> + +
+ + {/* Call-to-Action Button */} + +
+
+ + {/* Decorative background elements */} +
+
+
+
+ +
+ {/* Left Sidebar */} +
+ +
+ {/* Search by header */} +
+
+

Search by

+
+ + {/* Filter categories */} +
+ {filterCategories.map(category => ( +
+ toggleCategory(category.value)} + className="border-[#bebebe]" + /> + +
+ ))} +
+ + {/* Divider */} +
+ + {/* Pass Type header */} +
+
+

Pass Type

+
+ + {/* Pass Type filters */} +
+ {passTypeCategories.map(passType => ( +
+ togglePassType(passType.value)} + className="border-[#bebebe]" + /> + +
+ ))} +
+
+
+
+ + {/* Main Content */} +
+ {/* Header */} +
+

Attractions in Melbourne

+ + {/* Results count */} +

+ Showing {showingFrom}-{showingTo} of {totalItems} Item(s) +

+
+ + {/* Attractions Grid */} +
+ {filteredAttractions.slice(0, 12).map((attraction) => ( + + onAttractionClick?.(attraction.id)} + > +
+ + {/* Pass Type Badge */} +
+ {attraction.price === 0 ? ( + + FREE + + ) : attraction.passType === 'unlimited' ? ( + + Unlimited Pass Exclusive + + ) : ( + + Selective Pass + + )} +
+
+ +
+ {attraction.location} +
+

+ {attraction.name} +

+
+
+ {[...Array(5)].map((_, i) => ( + + ))} + + {attraction.rating} ({attraction.reviewCount}) + +
+
+ + {/* Pricing and Pass Info */} +
+
+
+ + {attraction.duration} +
+
+
Normal visit price
+
+ ${attraction.price} +
+
+
+ + {/* Included with Pass CTA */} +
+
+
+

+ ✓ Included with {attraction.passType === 'unlimited' ? 'Unlimited' : 'Selective'} Pass +

+

+ Save ${attraction.price} +

+
+ +
+
+
+
+
+
+ ))} +
+
+
+
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/components/BlogDetailsPage.tsx b/src/components/BlogDetailsPage.tsx new file mode 100644 index 0000000..675c7de --- /dev/null +++ b/src/components/BlogDetailsPage.tsx @@ -0,0 +1,510 @@ +import { useState } from 'react'; +import { motion } from 'motion/react'; +import { ArrowLeft, Calendar, User, Clock, Share2, BookmarkPlus, ThumbsUp, MessageSquare, Tag, MapPin } from 'lucide-react'; +import { Button } from './ui/button'; +import { Badge } from './ui/badge'; +import { Card, CardContent } from './ui/card'; +import { Separator } from './ui/separator'; +import Navbar from './Navbar'; +import { Footer } from './Footer'; +import { ImageWithFallback } from './figma/ImageWithFallback'; + +interface User { + email: string; + name: string; +} + +interface BlogDetailsPageProps { + blogId: string; + onBackClick: () => void; + onHomeClick: () => void; + onMelbourneClick: () => void; + onPassesClick: () => void; + onCheckoutClick: () => void; + onSignInClick: () => void; + onSignOutClick: () => void; + onAttractionsClick: () => void; + onBlogsClick: () => void; + onHowItWorksClick: () => void; + onFAQClick: () => void; + onPrivacyPolicyClick: () => void; + onAboutUsClick: () => void; + onProfileClick: () => void; + onCityCardsClick: () => void; + onMagicItineraryClick: () => void; + onPostCardsClick: () => void; + onOffersClick: () => void; + onContactUsClick?: () => void; + onEsimsClick?: () => void; + onHotelDiscountsClick?: () => void; + currentPage: string; + user: User | null; +} + +// Mock blog data - in a real app this would come from an API +const getBlogById = (id: string) => { + const blogs = { + '1': { + id: '1', + title: 'Phi Phi Islands Adventure Day Trip with Seaview Lunch by V. Marine Tour', + content: ` +

The Phi Phi archipelago is a must-visit while in Phuket, and this speedboat trip whisks you around the islands in one day. Swim over the coral reefs of Pileh Lagoon, have lunch at Phi Phi Leh, snorkel at Bamboo Island, and visit Monkey Beach and Maya Bay, immortalized in "The Beach."

+ +

Boat transfers, snacks, buffet lunch, snorkeling equipment, and Phuket hotel pickup and drop-off all included.

+ +

Tour Overview

+ +

The Phi Phi archipelago is a must-visit while in Phuket, and this speedboat trip whisks you around the islands in one day. Swim over the coral reefs of Pileh Lagoon, have lunch at Phi Phi Leh, snorkel at Bamboo Island, and visit Monkey Beach and Maya Bay, immortalized in "The Beach." Boat transfers, snacks, buffet lunch, snorkeling equipment, and Phuket hotel pickup and drop-off all included.

+ +

What's included

+ +
    +
  • Beverages, drinking water, morning tea and buffet lunch
  • +
  • Local taxes
  • +
  • Hotel pickup and drop-off by air-conditioned minivan
  • +
  • Insurance Transfer to a private pier
  • +
  • Soft drinks
  • +
  • Tour Guide
  • +
+ +

Location on map

+ +

Explore the stunning locations of the Phi Phi Islands, including Maya Bay, Bamboo Island, and Monkey Beach. Each location offers unique experiences from snorkeling to beach relaxation.

+ `, + author: 'Sarah Johnson', + date: 'Dec 15, 2024', + readTime: '5 min read', + category: 'Travel Guide', + image: 'https://images.unsplash.com/photo-1559827260-dc66d52bef19?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzbm9ya2VsaW5nJTIwdHVydGxlJTIwYWR2ZW50dXJlfGVufDF8fHx8MTc1ODEwNDkwMHww&ixlib=rb-4.1.0&q=80&w=1080', + gallery: [ + 'https://images.unsplash.com/photo-1559827260-dc66d52bef19?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzbm9ya2VsaW5nJTIwdHVydGxlJTIwYWR2ZW50dXJlfGVufDF8fHx8MTc1ODEwNDkwMHww&ixlib=rb-4.1.0&q=80&w=1080', + 'https://images.unsplash.com/photo-1571019613454-1cb2f99b2d8b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxpc2xhbmQlMjB0b3VyJTIwYWRvJTIwdHJvcGljYWx8ZW58MXx8fHwxNzU4MTA0OTEwfDA&ixlib=rb-4.1.0&q=80&w=1080', + 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxncmVhdCUyMG9jZWFuJTIwcm9hZCUyMGF1c3RyYWxpYXxlbnwxfHx8fDE3NTgxMDQ5Mzd8MA&ixlib=rb-4.1.0&q=80&w=1080', + 'https://images.unsplash.com/photo-1682687220742-aba13b6e50ba?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhdHYlMjBkZXNlcnQlMjB0b3VyfGVufDF8fHx8MTc1ODEwNDg5Nnww&ixlib=rb-4.1.0&q=80&w=1080' + ], + tags: ['Adventure', 'Islands', 'Snorkeling', 'Marine Life'], + likes: 45, + comments: 12 + }, + '2': { + id: '2', + title: '5 best cafe spots in Melbourne', + content: ` +

Melbourne's coffee culture is legendary, and for good reason. The city is home to some of the world's most innovative cafes, where baristas are treated as artists and coffee is considered a craft.

+ +

From hidden laneway gems to bustling neighborhood favorites, here are our top picks for the best cafe experiences in Melbourne.

+ +

The Coffee Scene

+ +

Melbourne's coffee culture began in the 1950s with Italian and Greek immigrants who brought their espresso traditions to Australia. Today, the city boasts more cafes per capita than any other city in the world.

+ +

Our Top Picks

+ +
    +
  • Degraves Espresso Bar - A laneway institution
  • +
  • Pellegrini's Espresso Bar - Old-school Italian charm
  • +
  • Brother Baba Budan - Single origin specialists
  • +
  • Patricia Coffee Brewers - Modern coffee artistry
  • +
  • Axil Coffee Roasters - Local roasting expertise
  • +
+ +

Coffee Culture Tips

+ +

When visiting Melbourne's cafes, remember that coffee is taken seriously here. Don't be surprised if your barista asks detailed questions about your preferences - they're helping you find your perfect cup.

+ `, + author: 'James Miller', + date: 'Dec 12, 2024', + readTime: '4 min read', + category: 'Food & Drink', + image: 'https://images.unsplash.com/photo-1554118811-1e0d58224f24?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxjb2ZmZWUlMjBzaG9wJTIwbWVsYm91cm5lfGVufDF8fHx8MTc1NjEyNDA5M3ww&ixlib=rb-4.1.0&q=80&w=1080', + gallery: [ + 'https://images.unsplash.com/photo-1554118811-1e0d58224f24?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxjb2ZmZWUlMjBzaG9wJTIwbWVsYm91cm5lfGVufDF8fHx8MTc1NjEyNDA5M3ww&ixlib=rb-4.1.0&q=80&w=1080', + 'https://images.unsplash.com/photo-1679731980101-503d93bbec27?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxtZWxib3VybmUlMjBjb2ZmZWUlMjBsYW5ld2F5c3xlbnwxfHx8fDE3NTYxMjQwNzN8MA&ixlib=rb-4.1.0&q=80&w=1080' + ], + tags: ['Coffee', 'Melbourne', 'Food', 'Culture'], + likes: 32, + comments: 8 + } + }; + + return blogs[id as keyof typeof blogs] || blogs['1']; +}; + +export function BlogDetailsPage({ + blogId, + onBackClick, + onHomeClick, + onMelbourneClick, + onPassesClick, + onCheckoutClick, + onSignInClick, + onSignOutClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onProfileClick, + onCityCardsClick, + onMagicItineraryClick, + onPostCardsClick, + onOffersClick, + onContactUsClick, + onEsimsClick, + onHotelDiscountsClick, + currentPage, + user +}: BlogDetailsPageProps) { + const [isLiked, setIsLiked] = useState(false); + const [isBookmarked, setIsBookmarked] = useState(false); + + const blog = getBlogById(blogId); + + return ( +
+ { + if (city === 'Melbourne') { + onMelbourneClick(); + } + }} + onSignInClick={onSignInClick} + onSignOutClick={onSignOutClick} + onPassesClick={onPassesClick} + onCheckoutClick={onCheckoutClick} + onHomeClick={onHomeClick} + onAttractionsClick={onAttractionsClick} + onBlogsClick={onBlogsClick} + onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} + onPrivacyPolicyClick={onPrivacyPolicyClick} + onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} + onCityCardsClick={onCityCardsClick} + onMagicItineraryClick={onMagicItineraryClick} + onPostCardsClick={onPostCardsClick} + onOffersClick={onOffersClick} + currentPage="blogs" + isUserSignedIn={!!user} + user={user} + /> + +
+ {/* Back Button */} + + + + + {/* Blog Header */} + +
+ + {blog.category} + + {blog.tags.map((tag, index) => ( + + {tag} + + ))} +
+ +

+ Discover the{' '} + + Ultimate + {' '} + {blog.title.split(' ').slice(-3).join(' ')} +

+ +
+
+
+ + {blog.author} +
+
+ + {blog.date} +
+
+ + {blog.readTime} +
+
+ +
+ + + + + + + +
+
+
+ + {/* Image Gallery - Masonry Layout */} + + {/* Large featured image - Left side spanning 2 rows */} +
+ +
+ + {/* Top right wide image */} +
+ +
+ + {/* Bottom right - First small image */} +
+ +
+ + {/* Bottom right - Second small image */} +
+ +
+
+ + {/* Main Content */} + + {/* Tour Overview Section */} +
+

+ Tour{' '} + Overview +

+ + {/* Tour Details Cards */} +
+
+
+ +
+
Duration
+
8 Hours
+
+ +
+
+ +
+
Group Size
+
12 People
+
+ +
+
+ +
+
Age Range
+
5-99 yrs
+
+ +
+
+ +
+
Languages
+
English
+
+
+ +

+ The Phi Phi archipelago is a must-visit while in Phuket, and this speedboat trip whisks you around the islands in one day. Swim over the coral reefs of Pileh Lagoon, have lunch at Phi Phi Leh, snorkel at Bamboo Island, and visit Monkey Beach and Maya Bay, immortalized in "The Beach." Boat transfers, snacks, buffet lunch, snorkeling equipment, and Phuket hotel pickup and drop-off all included. +

+
+ + {/* Tour Highlights Section */} +
+

+ Tour{' '} + + Highlights + +

+
    +
  • +
    + Visit the famous Maya Bay, featured in the movie "The Beach" +
  • +
  • +
    + Snorkel in the crystal-clear waters of Bamboo Island +
  • +
  • +
    + Swim in the stunning Pileh Lagoon surrounded by limestone cliffs +
  • +
  • +
    + Observe playful monkeys at Monkey Beach +
  • +
  • +
    + Enjoy a delicious buffet lunch with sea view +
  • +
+
+ + {/* What's Included Section */} +
+

+ What's Included +

+ +
+
+
    +
  • +
    + +
    + Beverages, drinking water, morning tea and buffet lunch +
  • +
  • +
    + +
    + Local taxes +
  • +
  • +
    + +
    + Hotel pickup and drop-off by air-conditioned minivan +
  • +
+
+ +
+
    +
  • +
    + +
    + Insurance Transfer to a private pier +
  • +
  • +
    + +
    + Soft drinks +
  • +
  • +
    + +
    + Tour Guide +
  • +
+
+
+
+ + {/* Location on Map Section */} +
+

+ Location on{' '} + Map +

+
+ +
+
+
+
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/components/BlogsPage.tsx b/src/components/BlogsPage.tsx new file mode 100644 index 0000000..176ed38 --- /dev/null +++ b/src/components/BlogsPage.tsx @@ -0,0 +1,529 @@ +import { useState } from 'react'; +import { motion } from 'motion/react'; +import { Calendar, User, Clock, ArrowRight, Search, Tag, CreditCard, MapPin, Check, Smartphone, Star, Heart, Share2 } from 'lucide-react'; +import { Button } from './ui/button'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from './ui/card'; +import { Badge } from './ui/badge'; +import { Input } from './ui/input'; +import Navbar from './Navbar'; +import { CitySubmenu } from './CitySubmenu'; +import { MobileAppSection } from './MobileAppSection'; +import { WhyChooseCityCards } from './WhyChooseCityCards'; +import { EnhancedTestimonials } from './EnhancedTestimonials'; +import { ReviewsSection } from './ReviewsSection'; +import { Footer } from './Footer'; +import { ImageWithFallback } from './figma/ImageWithFallback'; +import imgFrame1597884939 from "figma:asset/5da1b0444c0d21bc7ee776c49e36e2a8ea4d3e12.png"; + +// Blog Mobile App Section Component +function BlogMobileAppSection() { + return ( +
+ {/* Subtle Background Elements */} + + +
+ ); +} + +interface BlogsPageProps { + onBackClick: () => void; + onHomeClick: () => void; + onMelbourneClick: () => void; + onPassesClick: () => void; + onCheckoutClick: () => void; + onSignInClick: () => void; + onSignOutClick?: () => void; + onAttractionsClick: () => void; + onBlogsClick: () => void; + onHowItWorksClick: () => void; + onFAQClick: () => void; + onPrivacyPolicyClick: () => void; + onAboutUsClick: () => void; + onProfileClick: () => void; + onCityCardsClick: () => void; + onMagicItineraryClick: () => void; + onPostCardsClick: () => void; + onOffersClick: () => void; + onContactUsClick?: () => void; + onEsimsClick?: () => void; + onHotelDiscountsClick?: () => void; + onBlogClick?: (blogId: string) => void; + currentPage: string; + user?: { email: string; name: string; } | null; +} + +// Mock blog data +const blogPosts = [ + { + id: '1', + title: 'Ultimate Melbourne Coffee Culture Guide', + excerpt: 'Discover the hidden laneway cafes and roastery gems that make Melbourne the coffee capital of Australia.', + author: 'Sarah Johnson', + date: 'Dec 15, 2024', + readTime: '5 min read', + category: 'Food & Drink', + featured: true, + image: 'https://images.unsplash.com/photo-1514432324607-a09d9b4aefdd?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxtZWxib3VybmUlMjBjb2ZmZWV8ZW58MXx8fHwxNzU2MTI0MDYwfDA&ixlib=rb-4.1.0&q=80&w=1080' + }, + { + id: '2', + title: 'Hidden Street Art Treasures in Melbourne', + excerpt: 'Navigate through Melbourne\'s famous laneways and discover world-class street art that transforms the city into an open-air gallery.', + author: 'Michael Chen', + date: 'Dec 12, 2024', + readTime: '4 min read', + category: 'Entertainment', + image: 'https://images.unsplash.com/photo-1523631278395-d65a85c7c3b3?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzdHJlZXQlMjBhcnQlMjBtZWxib3VybmV8ZW58MXx8fHwxNzU2MTI0MDY5fDA&ixlib=rb-4.1.0&q=80&w=1080' + }, + { + id: '3', + title: 'A Foodie\'s Guide to Queen Victoria Market', + excerpt: 'From fresh produce to international delicacies, explore the vibrant flavors and culinary experiences at Melbourne\'s iconic market.', + author: 'Emma Wilson', + date: 'Dec 10, 2024', + readTime: '6 min read', + category: 'Food & Drink', + image: 'https://images.unsplash.com/photo-1567306301408-9b74a2a3e9b4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxtYXJrZXQlMjBmb29kfGVufDF8fHx8MTc1NjEyNDA3Mnww&ixlib=rb-4.1.0&q=80&w=1080' + }, + { + id: '4', + title: 'Exploring Melbourne\'s Rooftop Bars', + excerpt: 'Sip cocktails with stunning city views at Melbourne\'s best rooftop venues, from hidden speakeasies to glamorous sky-high lounges.', + author: 'James Parker', + date: 'Dec 8, 2024', + readTime: '7 min read', + category: 'Adventure', + image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxvdXRiYWNrJTIwYXVzdHJhbGlhfGVufDF8fHx8MTc1NjEyNDEwMXww&ixlib=rb-4.1.0&q=80&w=1080' + }, + { + id: '5', + title: 'Secrets of the Great Ocean Road', + excerpt: 'Uncover hidden gems along one of the world\'s most scenic coastal drives, from secluded beaches to charming seaside towns.', + author: 'Lisa Rodriguez', + date: 'Dec 5, 2024', + readTime: '8 min read', + category: 'Road Trip', + image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxncmVhdCUyMG9jZWFuJTIwcm9hZHxlbnwxfHx8fDE3NTYxMjQxMDV8MA&ixlib=rb-4.1.0&q=80&w=1080' + }, + { + id: '6', + title: 'Wonders of the Great Barrier Reef', + excerpt: 'Explore the underwater paradise of the Great Barrier Reef and discover the incredible marine life that calls this UNESCO World Heritage site home.', + author: 'David Thompson', + date: 'Dec 3, 2024', + readTime: '6 min read', + category: 'Nature', + image: 'https://images.unsplash.com/photo-1559827260-dc66d52bef19?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxncmVhdCUyMGJhcnJpZXIlMjByZWVmfGVufDF8fHx8MTc1NjEyNDEwOXww&ixlib=rb-4.1.0&q=80&w=1080' + } +]; + +const categories = ['All', 'Travel Guide', 'Food & Drink', 'Entertainment', 'Adventure', 'Road Trip', 'Nature']; + +const exploreMoreItems = [ + { + title: 'Melbourne City Guide', + description: 'Complete guide to exploring Melbourne', + category: 'Guide' + }, + { + title: 'Best Attractions', + description: 'Top-rated attractions in Melbourne', + category: 'Attractions' + }, + { + title: 'Food & Culture', + description: 'Culinary experiences and cultural insights', + category: 'Culture' + }, + { + title: 'Events Calendar', + description: 'Upcoming events and festivals', + category: 'Events' + }, + { + title: 'Travel Tips', + description: 'Essential tips for visiting Melbourne', + category: 'Tips' + }, + { + title: 'Photography Spots', + description: 'Instagram-worthy locations in the city', + category: 'Photography' + } +]; + + + +export function BlogsPage({ + onHomeClick, + onMelbourneClick, + onPassesClick, + onCheckoutClick, + onSignInClick, + onSignOutClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onProfileClick, + onCityCardsClick, + onMagicItineraryClick, + onPostCardsClick, + onOffersClick, + onContactUsClick, + onEsimsClick, + onHotelDiscountsClick, + onBlogClick, + currentPage, + user +}: BlogsPageProps) { + const [selectedCategory, setSelectedCategory] = useState('All'); + const [searchQuery, setSearchQuery] = useState(''); + + const filteredPosts = blogPosts.filter(post => { + const matchesCategory = selectedCategory === 'All' || post.category === selectedCategory; + const matchesSearch = post.title.toLowerCase().includes(searchQuery.toLowerCase()) || + post.excerpt.toLowerCase().includes(searchQuery.toLowerCase()); + return matchesCategory && matchesSearch; + }); + + const featuredPost = blogPosts.find(post => post.featured); + const latestPosts = blogPosts.slice(0, 4); + + return ( +
+ {/* Navigation */} + { + if (city === 'Melbourne') { + onMelbourneClick(); + } + }} + onHomeClick={onHomeClick} + onSignInClick={onSignInClick} + onSignOutClick={onSignOutClick} + onPassesClick={onPassesClick} + onCheckoutClick={onCheckoutClick} + onAttractionsClick={onAttractionsClick} + onBlogsClick={onBlogsClick} + onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} + onPrivacyPolicyClick={onPrivacyPolicyClick} + onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} + onCityCardsClick={onCityCardsClick} + onMagicItineraryClick={onMagicItineraryClick} + onPostCardsClick={onPostCardsClick} + onOffersClick={onOffersClick} + onEsimsClick={onEsimsClick} + onHotelDiscountsClick={onHotelDiscountsClick} + currentPage={currentPage} + isUserSignedIn={!!user} + user={user} + /> + + {}} + onHomeClick={onHomeClick} + onMelbourneClick={onMelbourneClick} + onAttractionsClick={onAttractionsClick} + onPassesClick={onPassesClick} + onBlogsClick={onBlogsClick} + onHowItWorksClick={onHowItWorksClick} + /> + +
+ {/* Page Header */} + +

+ Explore more with the{' '} + + Blogs + +

+

+ Discover insider tips, hidden gems, and travel stories from Melbourne and beyond +

+
+ + {/* Search and Filter Section */} + +
+ {/* Search Bar */} +
+ + setSearchQuery(e.target.value)} + className="font-poppins font-normal text-base pl-10 py-3 rounded-xl border-gray-200 focus:border-primary" + /> +
+ + {/* Category Filter */} +
+ {categories.map((category) => ( + + ))} +
+
+
+ + {/* Main Content Grid */} +
+ {/* Left Side - Latest Blogs */} + +
+

+ Latest Blogs +

+ + {/* Featured Blog */} + {featuredPost && ( + onBlogClick?.(featuredPost.id)} + > +
+ + + Featured + +
+
+
+
+ + {featuredPost.category} + +
+

+ {featuredPost.title} +

+

+ {featuredPost.excerpt} +

+
+
+
+
+ + {featuredPost.author} +
+
+ + {featuredPost.date} +
+
+ +
+
+
+ )} + + {/* Blog List */} +
+ {filteredPosts.filter(post => !post.featured).map((post, index) => ( + + onBlogClick?.(post.id)} + > +
+
+
+ +
+
+
+
+ + {post.category} + +
+

+ {post.title} +

+

+ {post.excerpt} +

+
+
+
+ + {post.author} +
+
+ + {post.date} +
+
+ + {post.readTime} +
+
+ +
+
+
+
+
+ ))} +
+
+
+ + {/* Right Side - Explore More */} + +
+

+ Explore More +

+
+ {exploreMoreItems.map((item, index) => ( + +
+
+

+ {item.title} +

+

+ {item.description} +

+
+ +
+
+ ))} +
+ + {/* Newsletter Signup */} + +

+ Stay Updated +

+

+ Get the latest travel tips and city guides delivered to your inbox. +

+
+ + +
+
+
+
+
+ + {/* Access Your CityCards Section */} +
+ +
+ + {/* Why Choose CityCards Section */} +
+ +
+ + {/* Enhanced Testimonials Section */} + + + {/* Blog Mobile App Section */} + + + {/* Reviews Section */} + +
+ +
+
+ ); +} + +export default BlogsPage; \ No newline at end of file diff --git a/src/components/BookAttractionSection.tsx b/src/components/BookAttractionSection.tsx new file mode 100644 index 0000000..9cdbbbe --- /dev/null +++ b/src/components/BookAttractionSection.tsx @@ -0,0 +1,410 @@ +import { useState } from 'react'; +import { ChevronLeft, ChevronRight, Clock, Users, Star, Zap, CheckCircle, MapPin, Volume2, Camera } from 'lucide-react'; +import { ImageWithFallback } from './figma/ImageWithFallback'; +import { motion } from 'motion/react'; + +const attractions = [ + { + id: 1, + name: "Sydney Opera House", + city: "Sydney", + country: "Australia", + image: "https://images.unsplash.com/photo-1657622884558-cc7525f93638?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzeWRuZXklMjBvcGVyYSUyMGhvdXNlJTIwaGFyYm9yJTIwYnJpZGdlfGVufDF8fHx8MTc1NjExNDMwMHww&ixlib=rb-4.1.0&q=80&w=1080", + rating: 4.8, + reviews: "12,500+", + category: "Landmarks", + originalPrice: "$89", + includedValue: "$89", + perks: [ + { icon: Zap, label: "Skip-the-line", color: "text-green-600" }, + { icon: Volume2, label: "Audio guide", color: "text-blue-600" }, + { icon: Camera, label: "Photo spots", color: "text-purple-600" } + ] + }, + { + id: 2, + name: "Great Ocean Road", + city: "Melbourne", + country: "Australia", + image: "https://images.unsplash.com/photo-1557544780-585e99807b15?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxncmVhdCUyMG9jZWFuJTIwcm9hZCUyMHR3ZWx2ZSUyMGFwb3N0bGVzfGVufDF8fHx8MTc1NjExNDMwNHww&ixlib=rb-4.1.0&q=80&w=1080", + rating: 4.9, + reviews: "8,200+", + category: "Nature", + originalPrice: "$125", + includedValue: "$125", + perks: [ + { icon: Users, label: "Guided tour", color: "text-blue-600" }, + { icon: MapPin, label: "Transport", color: "text-green-600" }, + { icon: Camera, label: "Photo stops", color: "text-purple-600" } + ] + }, + { + id: 3, + name: "Lone Pine Koala Sanctuary", + city: "Brisbane", + country: "Australia", + image: "https://images.unsplash.com/photo-1625476038303-0d3022077d39?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxsb25lJTIwcGluZSUyMGtvYWxhJTIwc2FuY3R1YXJ5JTIwYnJpc2JhbmV8ZW58MXx8fHwxNzU2MTE0MzA3fDA&ixlib=rb-4.1.0&q=80&w=1080", + rating: 4.7, + reviews: "15,800+", + category: "Wildlife", + originalPrice: "$65", + includedValue: "$65", + perks: [ + { icon: Zap, label: "Skip-the-line", color: "text-green-600" }, + { icon: Users, label: "Animal encounters", color: "text-orange-600" }, + { icon: Camera, label: "Photo opportunities", color: "text-purple-600" } + ] + }, + { + id: 4, + name: "Kings Park", + city: "Perth", + country: "Australia", + image: "https://images.unsplash.com/photo-1667315682754-852d9e855207?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxraW5ncyUyMHBhcmslMjBwZXJ0aCUyMGJvdGFuaWNhbCUyMGdhcmRlbnxlbnwxfHx8fDE3NTYxMTQzMTJ8MA&ixlib=rb-4.1.0&q=80&w=1080", + rating: 4.6, + reviews: "9,400+", + category: "Parks", + originalPrice: "Free", + includedValue: "$35", + perks: [ + { icon: Users, label: "Walking tours", color: "text-blue-600" }, + { icon: Volume2, label: "Audio guide", color: "text-blue-600" }, + { icon: MapPin, label: "Trail maps", color: "text-green-600" } + ] + }, + { + id: 5, + name: "Barossa Valley", + city: "Adelaide", + country: "Australia", + image: "https://images.unsplash.com/photo-1578274821879-08e7f9050d83?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxiYXJvc3NhJTIwdmFsbGV5JTIwdmluZXlhcmQlMjB3aW5lcnl8ZW58MXx8fHwxNzU2MTE0MzE3fDA&ixlib=rb-4.1.0&q=80&w=1080", + rating: 4.8, + reviews: "6,700+", + category: "Wine Tours", + originalPrice: "$98", + includedValue: "$98", + perks: [ + { icon: Users, label: "Wine tastings", color: "text-purple-600" }, + { icon: MapPin, label: "Transport", color: "text-green-600" }, + { icon: Volume2, label: "Expert guide", color: "text-blue-600" } + ] + }, + { + id: 6, + name: "Uluru", + city: "Northern Territory", + country: "Australia", + image: "https://images.unsplash.com/photo-1535960146738-4113294a306c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHx1bHVydSUyMGF5ZXJzJTIwcm9jayUyMGF1c3RyYWxpYSUyMGRlc2VydHxlbnwxfHx8fDE3NTYxMTQzMjB8MA&ixlib=rb-4.1.0&q=80&w=1080", + rating: 4.9, + reviews: "11,200+", + category: "Landmarks", + originalPrice: "$156", + includedValue: "$156", + perks: [ + { icon: Users, label: "Cultural tours", color: "text-orange-600" }, + { icon: Camera, label: "Sunrise viewing", color: "text-purple-600" }, + { icon: MapPin, label: "Transport", color: "text-green-600" } + ] + }, + { + id: 7, + name: "Blue Mountains", + city: "Sydney", + country: "Australia", + image: "https://images.unsplash.com/photo-1603101468073-50894cb31719?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxibHVlJTIwbW91bnRhaW5zJTIwc3lkbmV5JTIwdGhyZWUlMjBzaXN0ZXJzfGVufDF8fHx8MTc1NjExNDMyNXww&ixlib=rb-4.1.0&q=80&w=1080", + rating: 4.7, + reviews: "10,300+", + category: "Nature", + originalPrice: "$78", + includedValue: "$78", + perks: [ + { icon: MapPin, label: "Scenic railway", color: "text-green-600" }, + { icon: Users, label: "Guided walks", color: "text-blue-600" }, + { icon: Camera, label: "Lookout access", color: "text-purple-600" } + ] + }, + { + id: 8, + name: "Kangaroo Island", + city: "Adelaide", + country: "Australia", + image: "https://images.unsplash.com/photo-1719933564987-6c842ee2084e?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxrYW5nYXJvbyUyMGlzbGFuZCUyMGF1c3RyYWxpYSUyMHdpbGRsaWZlfGVufDF8fHx8MTc1NjExNDMyOXww&ixlib=rb-4.1.0&q=80&w=1080", + rating: 4.8, + reviews: "7,900+", + category: "Wildlife", + originalPrice: "$145", + includedValue: "$145", + perks: [ + { icon: Users, label: "Wildlife tours", color: "text-orange-600" }, + { icon: MapPin, label: "Ferry transport", color: "text-green-600" }, + { icon: Volume2, label: "Nature guide", color: "text-blue-600" } + ] + } +]; + +const categories = ["All", "Landmarks", "Nature", "Wildlife", "Parks", "Wine Tours"]; + +export function BookAttractionSection() { + const [activeCategory, setActiveCategory] = useState("All"); + + const filteredAttractions = activeCategory === "All" + ? attractions + : attractions.filter(attraction => attraction.category === activeCategory); + + const AttractionCard = ({ attraction, index }: { attraction: typeof attractions[0], index: number }) => ( + + {/* Image Container */} +
+ +
+ + {/* Rating Badge */} +
+
+ +
+ {attraction.rating} +
+ + {/* Value Badge - Shows on hover */} + + Included: {attraction.includedValue} + + + {/* Overlay Content */} +
+

+ {attraction.name} +

+

+ {attraction.city}, {attraction.country} +

+
+
+ {attraction.reviews} reviews +
+ +
+ + Explore +
+
+
+
+
+ + {/* Hover Overlay - Included Value & Perks */} + +
+ {/* Included Value Header */} + +
+ + Included Value +
+
+ {attraction.includedValue} +
+

+ {attraction.originalPrice === "Free" ? "Premium access included" : "Save money with CityCard"} +

+
+ + {/* Perks Grid */} +
+

What's Included:

+
+ {attraction.perks.map((perk, perkIndex) => ( + +
+ +
+ {perk.label} +
+ ))} +
+
+ + {/* Action Button */} + + Add to CityCard + +
+
+ + {/* Enhanced Hover Gradient Overlay */} +
+ + {/* Border Glow Effect */} +
+ + ); + + return ( +
+
+ {/* Header */} + +
+
+ + Must-See Destinations + +
+

+ + Top + {' '} + Attractions{' '} + Included +

+

+ Discover Australia's most iconic attractions and hidden gems across Sydney, Melbourne, Brisbane, Perth, and Adelaide - all included with your CityCard +

+
+ + {/* Category Tabs */} + + {categories.map((category, index) => ( + setActiveCategory(category)} + whileHover={{ scale: 1.05 }} + whileTap={{ scale: 0.95 }} + className={`px-6 py-4 h-14 rounded-2xl font-medium transition-all duration-300 ${ + activeCategory === category + ? 'bg-gradient-to-r from-primary to-secondary text-white shadow-xl shadow-primary/25 ring-2 ring-primary/20' + : 'bg-white/80 backdrop-blur-sm text-gray-700 hover:text-gray-900 hover:shadow-lg border border-gray-200/50 hover:border-primary/20 hover:bg-white' + }`} + > + {category} + + ))} + + + {/* Mobile Horizontal Carousel */} +
+
+ {/* Scroll Container */} +
+ {filteredAttractions.map((attraction, index) => ( + + ))} +
+ + {/* Scroll Indicators */} +
+ {Array.from({ length: Math.ceil(filteredAttractions.length / 2) }).map((_, index) => ( +
+ ))} +
+ + {/* Mobile Hint Text */} +
+

+ Swipe to explore more attractions +

+
+
+
+ + {/* Desktop Bento Grid */} +
+ {/* Top Row - 3 equal cards */} +
+ {filteredAttractions.slice(0, 3).map((attraction, index) => ( + + ))} +
+ + {/* Consistent Vertical Spacing */} +
+ + {/* Bottom Row - 2 larger cards */} +
+ {filteredAttractions.slice(3, 5).map((attraction, index) => ( + + ))} +
+
+ + {/* Call to Action */} + + + Get Your City Card + + {/* Shine animation */} +
+
+
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/CTAButton.tsx b/src/components/CTAButton.tsx new file mode 100644 index 0000000..ff5d97d --- /dev/null +++ b/src/components/CTAButton.tsx @@ -0,0 +1,93 @@ +import { motion } from 'motion/react'; +import BeforeLogin from '../imports/BeforeLogin'; +import AfterLogin from '../imports/AfterLogin'; + +interface User { + email: string; + name: string; +} + +interface CTAButtonProps { + user: User | null; + onClick: () => void; + className?: string; +} + +// Helper function to generate initials from user data +const generateInitials = (user: User): string => { + if (user.name && user.name.includes(' ')) { + // If name has spaces, use first letter of first and last name + const nameParts = user.name.trim().split(' '); + return (nameParts[0]?.charAt(0) + nameParts[nameParts.length - 1]?.charAt(0)).toUpperCase(); + } else if (user.name) { + // If name is single word, use first two letters + return user.name.substring(0, 2).toUpperCase(); + } else { + // Fallback to email + const emailPart = user.email.split('@')[0]; + if (emailPart.length >= 2) { + return emailPart.substring(0, 2).toUpperCase(); + } + return emailPart.charAt(0).toUpperCase() + 'X'; + } +}; + +// Custom AfterLogin component with dynamic initials +function CustomAfterLogin({ initials }: { initials: string }) { + return ( +
+
+
+ {/* User Initials Circle */} +
+
+
+
+

{initials}

+
+
+
+
+ + {/* Text */} +
+
+

MY CITY CARD

+
+
+
+
+
+ ); +} + +export function CTAButton({ user, onClick, className = "" }: CTAButtonProps) { + const buttonContent = user ? ( + + ) : ( + + ); + + return ( + + + {buttonContent} + + + {/* Hover glow effect */} +
+ + ); +} \ No newline at end of file diff --git a/src/components/CheckoutPage.tsx b/src/components/CheckoutPage.tsx new file mode 100644 index 0000000..cc9f2b8 --- /dev/null +++ b/src/components/CheckoutPage.tsx @@ -0,0 +1,767 @@ +import { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'motion/react'; +import { ArrowLeft, CreditCard, Users, Calendar, MapPin, Shield, Truck, Clock, ChevronRight, Check, ChevronDown, X, Mail, Smartphone } from 'lucide-react'; +import { Button } from './ui/button'; +import { Input } from './ui/input'; +import { Label } from './ui/label'; +import { Card, CardContent, CardHeader, CardTitle } from './ui/card'; +import { Separator } from './ui/separator'; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from './ui/dialog'; +import { RadioGroup, RadioGroupItem } from './ui/radio-group'; +import { Checkbox } from './ui/checkbox'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select'; +import { Badge } from './ui/badge'; +import { Textarea } from './ui/textarea'; +import Navbar from './Navbar'; +import { Footer } from './Footer'; +import { ImageWithFallback } from './figma/ImageWithFallback'; + +interface CheckoutPageProps { + onBackClick: () => void; + onHomeClick: () => void; + onMelbourneClick: () => void; + onPassesClick: () => void; + onCheckoutClick: () => void; + onSignInClick: () => void; + onSignOutClick?: () => void; + onAttractionsClick: () => void; + onBlogsClick: () => void; + onHowItWorksClick: () => void; + onFAQClick: () => void; + onPrivacyPolicyClick: () => void; + onAboutUsClick: () => void; + onProfileClick: () => void; + onCityCardsClick: () => void; + onMagicItineraryClick: () => void; + onPostCardsClick: () => void; + onOffersClick: () => void; + onSecureCheckoutClick?: () => void; + onContactUsClick?: () => void; + onEsimsClick?: () => void; + onHotelDiscountsClick?: () => void; + currentPage: string; + user?: { email: string; name: string } | null; +} + +// Mock cart data +const mockCartItems = [ + { + id: '1', + name: 'Paris Unlimited Pass', + type: '7-Day Pass', + price: 79, + originalPrice: 149, + discount: 47, + attractions: 45, + validity: '7 days', + image: 'https://images.unsplash.com/photo-1502602898536-47ad22581b52?w=400', + features: ['Skip-the-line access', 'Mobile voucher', 'Free cancellation'] + } +]; + +export function CheckoutPage({ + onBackClick, + onHomeClick, + onMelbourneClick, + onPassesClick, + onCheckoutClick, + onSignInClick, + onSignOutClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onProfileClick, + onCityCardsClick, + onMagicItineraryClick, + onPostCardsClick, + onOffersClick, + onSecureCheckoutClick, + onContactUsClick, + onEsimsClick, + onHotelDiscountsClick, + currentPage, + user, +}: CheckoutPageProps) { + const [purchaseType, setPurchaseType] = useState<'self' | 'gift'>('self'); + const [selectedPayment, setSelectedPayment] = useState('credit-card'); + const [showEmailVerification, setShowEmailVerification] = useState(false); + const [verificationCode, setVerificationCode] = useState(''); + const [isEmailVerified, setIsEmailVerified] = useState(false); + const [formData, setFormData] = useState({ + email: '', + firstName: '', + lastName: '', + phone: '', + country: '', + address: '', + city: '', + postalCode: '', + cardNumber: '', + expiry: '', + cvv: '', + cardName: '', + agreeTerms: false, + subscribeNewsletter: false + }); + const [giftData, setGiftData] = useState({ + recipientName: '', + recipientPhone: '', + recipientEmail: '', + personalizedMessage: '' + }); + + const subtotal = mockCartItems.reduce((sum, item) => sum + item.price, 0); + const tax = Math.round(subtotal * 0.1); + const total = subtotal + tax; + const totalSavings = mockCartItems.reduce((sum, item) => sum + (item.originalPrice - item.price), 0); + + const handleInputChange = (field: string, value: string | boolean) => { + setFormData(prev => ({ ...prev, [field]: value })); + + // Trigger email verification when email is complete + if (field === 'email' && typeof value === 'string' && value.includes('@') && value.includes('.') && !isEmailVerified) { + setTimeout(() => { + setShowEmailVerification(true); + }, 1000); + } + }; + + const handleGiftInputChange = (field: string, value: string) => { + setGiftData(prev => ({ ...prev, [field]: value })); + }; + + const handleEmailVerification = () => { + if (verificationCode === '123456') { + setIsEmailVerified(true); + setShowEmailVerification(false); + } + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + if (!isEmailVerified) { + setShowEmailVerification(true); + return; + } + const checkoutData = { + purchaseType, + formData, + ...(purchaseType === 'gift' && { giftData }), + selectedPayment, + cartItems: mockCartItems + }; + console.log('Processing checkout...', checkoutData); + }; + + const paymentMethods = [ + { + id: 'credit-card', + name: 'Credit Card', + icon: , + description: 'Visa, Mastercard, American Express' + }, + { + id: 'paypal', + name: 'PayPal', + icon:
P
, + description: 'Pay with your PayPal account' + }, + { + id: 'google-pay', + name: 'Google Pay', + icon:
G
, + description: 'Pay with Google Pay' + } + ]; + + return ( +
+ {/* Navbar */} + {}} + onHomeClick={onHomeClick} + onMelbourneClick={onMelbourneClick} + onPassesClick={onPassesClick} + onCheckoutClick={onCheckoutClick} + onSignInClick={onSignInClick} + onSignOutClick={onSignOutClick} + onAttractionsClick={onAttractionsClick} + onBlogsClick={onBlogsClick} + onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} + onPrivacyPolicyClick={onPrivacyPolicyClick} + onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} + onCityCardsClick={onCityCardsClick} + onMagicItineraryClick={onMagicItineraryClick} + onPostCardsClick={onPostCardsClick} + onOffersClick={onOffersClick} + onEsimsClick={onEsimsClick} + onHotelDiscountsClick={onHotelDiscountsClick} + currentPage={currentPage} + isUserSignedIn={!!user} + user={user} + /> + + {/* Header Section */} +
+
+ {/* Back Button */} + + + Back to Cart + + + {/* Page Title */} + +

+ Secure{' '} + Checkout +

+

+ Complete your purchase and start exploring Paris +

+
+
+
+ + {/* Main Checkout Content */} +
+
+
+ {/* Left Column - Form Inputs (3/5 width) */} +
+ {/* Purchase Type Selection */} + + + + Purchase Type + + + setPurchaseType(value as 'self' | 'gift')} + className="grid grid-cols-1 md:grid-cols-2 gap-4" + > +
+ + +
+
+ + +
+
+
+
+
+ + {/* Gift Recipient Information - Only shown when gift is selected */} + {purchaseType === 'gift' && ( + + + + + + Gift Recipient Details + + + +
+ + handleGiftInputChange('recipientName', e.target.value)} + placeholder="Jane Smith" + required={purchaseType === 'gift'} + className="mt-1 font-poppins" + /> +
+
+ + handleGiftInputChange('recipientEmail', e.target.value)} + placeholder="recipient@email.com" + required={purchaseType === 'gift'} + className="mt-1 font-poppins" + /> +
+
+ + handleGiftInputChange('recipientPhone', e.target.value)} + placeholder="+1 (555) 123-4567" + required={purchaseType === 'gift'} + className="mt-1 font-poppins" + /> +
+
+ +