diff --git a/components.json b/components.json new file mode 100644 index 0000000..a577707 --- /dev/null +++ b/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app/globals.css", + "baseColor": "zinc", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b1fa5d0..a3b69e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,32 @@ "name": "wag-managment-frontend", "version": "0.1.0", "dependencies": { + "@hookform/resolvers": "^3.9.1", + "@radix-ui/react-avatar": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.2", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-popover": "^1.1.2", + "@radix-ui/react-scroll-area": "^1.2.1", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-switch": "^1.1.1", + "@radix-ui/react-toast": "^1.2.2", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.0.0", + "flatpickr": "^4.6.13", + "lucide-react": "^0.462.0", "next": "15.0.3", - "react": "19.0.0-rc-66855b96-20241106", - "react-dom": "19.0.0-rc-66855b96-20241106" + "next-crypto": "^1.0.8", + "next-themes": "^0.4.3", + "react": "^18.3.1", + "react-apexcharts": "^1.6.0", + "react-dom": "^18.3.1", + "react-hook-form": "^7.53.2", + "react-phone-number-input": "^3.4.9", + "sonner": "^1.7.0", + "tailwind-merge": "^2.5.5", + "tailwindcss-animate": "^1.0.7", + "zod": "^3.23.8" }, "devDependencies": { "@types/node": "^20", @@ -25,7 +48,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, "engines": { "node": ">=10" }, @@ -42,6 +64,48 @@ "tslib": "^2.4.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", + "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "dependencies": { + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", + "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" + }, + "node_modules/@hookform/resolvers": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.1.tgz", + "integrity": "sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==", + "peerDependencies": { + "react-hook-form": "^7.0.0" + } + }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", @@ -388,7 +452,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -405,7 +468,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -419,7 +481,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -428,7 +489,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -436,14 +496,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -578,7 +636,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -591,7 +648,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -600,7 +656,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -613,12 +668,737 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, "optional": true, "engines": { "node": ">=14" } }, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.1.tgz", + "integrity": "sha512-eoOtThOmxeoizxpX6RiEsQZ2wj5r4+zoeqAwO0cBaFQGjJwIH3dIX0OCxNrCyrrdxG+vBweMETh3VziQG7c1kw==", + "dependencies": { + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "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/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "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-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "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-dialog": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz", + "integrity": "sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.6.0" + }, + "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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz", + "integrity": "sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", + "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", + "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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.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-label": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz", + "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.2.tgz", + "integrity": "sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.6.0" + }, + "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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "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/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "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-portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.2.tgz", + "integrity": "sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.1.tgz", + "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.1.tgz", + "integrity": "sha512-FnM1fHfCtEZ1JkyfH/1oMiTcFBQvHKl4vD9WnpwkLgtF+UmnXMCad6ECPTaAjcDjam+ndOEJWgHyKDGNteWSHw==", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.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-switch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.1.tgz", + "integrity": "sha512-diPqDDoBcZPSicYoMWdWx+bCPuTRH4QSp9J+65IvtdS0Kuzt67bI6n32vCj8q6NZmYW/ah+2orOtMwcX5eQwIg==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "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-toast": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.2.tgz", + "integrity": "sha512-Z6pqSzmAP/bFJoqMAston4eSNa+ud44NSZTiZUmUen+IOZ5nBY8kzuU5WDBVyFXPtcW6yUalOHsxM/BP6Sv8ww==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "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.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.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-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "dependencies": { + "@radix-ui/rect": "1.1.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-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.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-visually-hidden": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" + }, + "node_modules/@svgdotjs/svg.draggable.js": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.4.tgz", + "integrity": "sha512-vWi/Col5Szo74HJVBgMHz23kLVljt3jvngmh0DzST45iO2ubIZ487uUAHIxSZH2tVRyiaaTL+Phaasgp4gUD2g==", + "peer": true, + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4" + } + }, + "node_modules/@svgdotjs/svg.filter.js": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.8.tgz", + "integrity": "sha512-YshF2YDaeRA2StyzAs5nUPrev7npQ38oWD0eTRwnsciSL2KrRPMoUw8BzjIXItb3+dccKGTX3IQOd2NFzmHkog==", + "peer": true, + "dependencies": { + "@svgdotjs/svg.js": "^3.1.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@svgdotjs/svg.js": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.js/-/svg.js-3.2.4.tgz", + "integrity": "sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Fuzzyma" + } + }, + "node_modules/@svgdotjs/svg.resize.js": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz", + "integrity": "sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==", + "peer": true, + "engines": { + "node": ">= 14.18" + }, + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.select.js": "^4.0.1" + } + }, + "node_modules/@svgdotjs/svg.select.js": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.select.js/-/svg.select.js-4.0.2.tgz", + "integrity": "sha512-5gWdrvoQX3keo03SCmgaBbD+kFftq0F/f2bzCbNnpkkvW6tk4rl4MakORzFuNjvXPWwB4az9GwuvVxQVnjaK2g==", + "peer": true, + "engines": { + "node": ">= 14.18" + }, + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4" + } + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -645,13 +1425,13 @@ "version": "15.7.13", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", - "dev": true + "devOptional": true }, "node_modules/@types/react": { "version": "18.3.12", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", - "dev": true, + "devOptional": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -661,16 +1441,21 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", - "dev": true, + "devOptional": true, "dependencies": { "@types/react": "*" } }, + "node_modules/@yr/monotone-cubic-spline": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", + "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==", + "peer": true + }, "node_modules/ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, "engines": { "node": ">=12" }, @@ -682,7 +1467,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, "engines": { "node": ">=12" }, @@ -693,14 +1477,12 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -709,23 +1491,45 @@ "node": ">= 8" } }, + "node_modules/apexcharts": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-4.1.0.tgz", + "integrity": "sha512-TE0q0cXeS5k/AByLqlZAQ/aRQfdD3z0Ajd1uQWWZEjxiIC5qcBpMrTaG+aT+c3golqkvLH3u6kxDW8HBrggpLw==", + "peer": true, + "dependencies": { + "@svgdotjs/svg.draggable.js": "^3.0.4", + "@svgdotjs/svg.filter.js": "^3.0.8", + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.resize.js": "^2.0.2", + "@svgdotjs/svg.select.js": "^4.0.1", + "@yr/monotone-cubic-spline": "^1.0.3" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, "engines": { "node": ">=8" }, @@ -737,7 +1541,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -746,7 +1549,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -769,7 +1571,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, "engines": { "node": ">= 6" } @@ -797,7 +1598,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -821,7 +1621,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -829,11 +1628,50 @@ "node": ">= 6" } }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.0.4.tgz", + "integrity": "sha512-AnsjfHyHpQ/EFeAnG216WY7A5LiYCoZzCSygiLvfXC3H3LFGCprErteUcszaVluGOhuOTbJS3jWHrSDYPBBygg==", + "dependencies": { + "@radix-ui/react-dialog": "^1.1.2", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.0", + "use-sync-external-store": "^1.2.2" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -851,7 +1689,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -862,8 +1699,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-string": { "version": "1.9.1", @@ -879,16 +1715,19 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, "engines": { "node": ">= 6" } }, + "node_modules/country-flag-icons": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/country-flag-icons/-/country-flag-icons-1.5.13.tgz", + "integrity": "sha512-4JwHNqaKZ19doQoNcBjsoYA+I7NqCH/mC/6f5cBWvdKzcK5TMmzLpq3Z/syVHMHJuDGFwJ+rPpGizvrqJybJow==" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -902,7 +1741,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -914,7 +1752,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "devOptional": true }, "node_modules/detect-libc": { "version": "2.0.3", @@ -925,35 +1763,35 @@ "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==" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -969,7 +1807,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -981,7 +1818,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -990,7 +1826,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -998,11 +1833,15 @@ "node": ">=8" } }, + "node_modules/flatpickr": { + "version": "4.6.13", + "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz", + "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==" + }, "node_modules/foreground-child": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -1018,7 +1857,6 @@ "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, "optional": true, "os": [ @@ -1032,16 +1870,22 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "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==", + "engines": { + "node": ">=6" + } + }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -1061,7 +1905,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -1073,7 +1916,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -1081,6 +1923,34 @@ "node": ">= 0.4" } }, + "node_modules/input-format": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/input-format/-/input-format-0.3.11.tgz", + "integrity": "sha512-q24+iW10ZMb7KIRDlVUl3GvFcadf1ttE/QA2waINkDMdjsPXStQSOvdTyHwO8p+4Mq433ILQJZRL8YKtPjNk4g==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": "^18.1.0", + "react-dom": "^18.1.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", @@ -1091,7 +1961,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -1103,7 +1972,6 @@ "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, "dependencies": { "hasown": "^2.0.2" }, @@ -1118,7 +1986,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1127,7 +1994,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -1136,7 +2002,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -1148,7 +2013,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -1156,14 +2020,12 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -1178,16 +2040,24 @@ "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true, "bin": { "jiti": "bin/jiti.js" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/libphonenumber-js": { + "version": "1.11.15", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.15.tgz", + "integrity": "sha512-M7+rtYi9l5RvMmHyjyoF3BHHUpXTYdJ0PezZGHNs0GyW1lO+K7jxlXpbdIb7a56h0nqLYdjIw+E+z0ciGaJP7g==" + }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, "engines": { "node": ">=10" } @@ -1195,20 +2065,36 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "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==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/lucide-react": { + "version": "0.462.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.462.0.tgz", + "integrity": "sha512-NTL7EbAao9IFtuSivSZgrAh4fZd09Lr+6MTkqIxuHaH2nnYiYIzXPo06cOxHg9wKLdj6LL8TByG4qpePqwgx/g==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -1217,7 +2103,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -1230,7 +2115,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1245,7 +2129,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } @@ -1254,7 +2137,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -1331,6 +2213,20 @@ } } }, + "node_modules/next-crypto": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/next-crypto/-/next-crypto-1.0.8.tgz", + "integrity": "sha512-6VcrH+xFuuCRGCdDMjFFibhJ97c4s+J/6SEV73RUYJhh38MDW4WXNZNTWIMZBq0B29LOIfAQ0XA37xGUZZCCjA==" + }, + "node_modules/next-themes": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.3.tgz", + "integrity": "sha512-nG84VPkTdUHR2YeD89YchvV4I9RbiMAql3GiLEQlPvq1ioaqPaIReK+yMRdg/zgiXws620qS1rU30TiWmmG9lA==", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -1362,7 +2258,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1371,7 +2266,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1380,7 +2274,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, "engines": { "node": ">= 6" } @@ -1388,14 +2281,12 @@ "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -1403,14 +2294,12 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -1431,7 +2320,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -1443,7 +2331,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1452,7 +2339,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, "engines": { "node": ">= 6" } @@ -1461,7 +2347,6 @@ "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, "funding": [ { "type": "opencollective", @@ -1489,7 +2374,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -1506,7 +2390,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -1525,7 +2408,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -1560,7 +2442,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true, "engines": { "node": ">=14" }, @@ -1572,7 +2453,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -1597,7 +2477,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -1609,14 +2488,22 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "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==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -1633,29 +2520,147 @@ ] }, "node_modules/react": { - "version": "19.0.0-rc-66855b96-20241106", - "resolved": "https://registry.npmjs.org/react/-/react-19.0.0-rc-66855b96-20241106.tgz", - "integrity": "sha512-klH7xkT71SxRCx4hb1hly5FJB21Hz0ACyxbXYAECEqssUjtJeFUAaI2U1DgJAzkGEnvEm3DkxuBchMC/9K4ipg==", + "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==", + "dependencies": { + "loose-envify": "^1.1.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/react-dom": { - "version": "19.0.0-rc-66855b96-20241106", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0-rc-66855b96-20241106.tgz", - "integrity": "sha512-D25vdaytZ1wFIRiwNU98NPQ/upS2P8Co4/oNoa02PzHbh8deWdepjm5qwZM/46OdSiGv4WSWwxP55RO9obqJEQ==", + "node_modules/react-apexcharts": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.6.0.tgz", + "integrity": "sha512-DmokF8EA2MPghdGuxdLMIDOB1rocqb8HhBTWGHQ+xs0U0nU3R0GFQCUP2EQ10siKUeD2aS2wDyCWuHoYYgSNKQ==", "dependencies": { - "scheduler": "0.25.0-rc-66855b96-20241106" + "prop-types": "^15.8.1" }, "peerDependencies": { - "react": "19.0.0-rc-66855b96-20241106" + "apexcharts": ">=4.0.0", + "react": ">=0.13" + } + }, + "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==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-hook-form": { + "version": "7.53.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.2.tgz", + "integrity": "sha512-YVel6fW5sOeedd1524pltpHX+jgU2u3DSDtXEaBORNdqiNrsX/nUI/iGXONegttg0mJVnfrIkiV0cmTU6Oo2xw==", + "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": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-phone-number-input": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/react-phone-number-input/-/react-phone-number-input-3.4.9.tgz", + "integrity": "sha512-RG40GTjfJwBR5whpEkQMvMMKcbqQSlXiKfiTp2mYoULkTYwxFn04iAVplRizWi3yLPL0fQiL4U+YU+9MIQGZog==", + "dependencies": { + "classnames": "^2.5.1", + "country-flag-icons": "^1.5.11", + "input-format": "^0.3.10", + "libphonenumber-js": "^1.11.12", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz", + "integrity": "sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.6", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "dependencies": { "pify": "^2.3.0" } @@ -1664,7 +2669,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -1676,7 +2680,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -1693,7 +2696,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -1703,7 +2705,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -1723,9 +2724,12 @@ } }, "node_modules/scheduler": { - "version": "0.25.0-rc-66855b96-20241106", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0-rc-66855b96-20241106.tgz", - "integrity": "sha512-HQXp/Mnp/MMRSXMQF7urNFla+gmtXW/Gr1KliuR0iboTit4KvZRY8KYaq5ccCTAOJiUqQh2rE2F3wgUekmgdlA==" + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } }, "node_modules/semver": { "version": "7.6.3", @@ -1782,7 +2786,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -1794,7 +2797,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -1803,7 +2805,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "engines": { "node": ">=14" }, @@ -1820,6 +2821,15 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/sonner": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.7.0.tgz", + "integrity": "sha512-W6dH7m5MujEPyug3lpI2l3TC3Pp1+LTgK0Efg+IHDrBbtEjyCmCHHo6yfNBOsf1tFZ6zf+jceWwB38baC8yO9g==", + "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", @@ -1840,7 +2850,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -1858,7 +2867,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1872,7 +2880,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -1880,14 +2887,12 @@ "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1899,7 +2904,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1915,7 +2919,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1927,7 +2930,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -1958,7 +2960,6 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -1980,7 +2981,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -1988,11 +2988,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tailwind-merge": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.5.tgz", + "integrity": "sha512-0LXunzzAZzo0tEPxV3I297ffKZPlKDrjj7NXphC8V5ak9yHC5zRmxnOe2m/Rd/7ivsOMJe3JZ2JVocoDdQTRBA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "3.4.15", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.15.tgz", "integrity": "sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==", - "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -2025,11 +3033,18 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "dependencies": { "any-promise": "^1.0.0" } @@ -2038,7 +3053,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -2050,7 +3064,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -2061,8 +3074,7 @@ "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/tslib": { "version": "2.8.1", @@ -2088,17 +3100,64 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -2113,7 +3172,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -2131,7 +3189,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -2148,7 +3205,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -2157,7 +3213,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -2171,14 +3226,12 @@ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -2192,7 +3245,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2204,13 +3256,20 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", - "dev": true, "bin": { "yaml": "bin.mjs" }, "engines": { "node": ">= 14" } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index fa4d3a5..4c71df6 100644 --- a/package.json +++ b/package.json @@ -9,16 +9,39 @@ "lint": "next lint" }, "dependencies": { - "react": "19.0.0-rc-66855b96-20241106", - "react-dom": "19.0.0-rc-66855b96-20241106", - "next": "15.0.3" + "@hookform/resolvers": "^3.9.1", + "@radix-ui/react-avatar": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.2", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-popover": "^1.1.2", + "@radix-ui/react-scroll-area": "^1.2.1", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-switch": "^1.1.1", + "@radix-ui/react-toast": "^1.2.2", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.0.0", + "flatpickr": "^4.6.13", + "lucide-react": "^0.462.0", + "next": "15.0.3", + "next-crypto": "^1.0.8", + "next-themes": "^0.4.3", + "react": "^18.3.1", + "react-apexcharts": "^1.6.0", + "react-dom": "^18.3.1", + "react-hook-form": "^7.53.2", + "react-phone-number-input": "^3.4.9", + "sonner": "^1.7.0", + "tailwind-merge": "^2.5.5", + "tailwindcss-animate": "^1.0.7", + "zod": "^3.23.8" }, "devDependencies": { - "typescript": "^5", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", "postcss": "^8", - "tailwindcss": "^3.4.1" + "tailwindcss": "^3.4.1", + "typescript": "^5" } } diff --git a/public/file copy.svg b/public/file copy.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/public/file copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/globe copy.svg b/public/globe copy.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/public/globe copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/green-house.webp b/public/green-house.webp new file mode 100644 index 0000000..30d3ce5 Binary files /dev/null and b/public/green-house.webp differ diff --git a/public/images/best-value-banner.png b/public/images/best-value-banner.png new file mode 100644 index 0000000..d39b518 Binary files /dev/null and b/public/images/best-value-banner.png differ diff --git a/public/images/brand/brand-01.svg b/public/images/brand/brand-01.svg new file mode 100644 index 0000000..73bb7fc --- /dev/null +++ b/public/images/brand/brand-01.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/images/brand/brand-02.svg b/public/images/brand/brand-02.svg new file mode 100644 index 0000000..381fe8d --- /dev/null +++ b/public/images/brand/brand-02.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/brand/brand-03.svg b/public/images/brand/brand-03.svg new file mode 100644 index 0000000..09fee07 --- /dev/null +++ b/public/images/brand/brand-03.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/images/brand/brand-04.svg b/public/images/brand/brand-04.svg new file mode 100644 index 0000000..deae9dd --- /dev/null +++ b/public/images/brand/brand-04.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/brand/brand-05.svg b/public/images/brand/brand-05.svg new file mode 100644 index 0000000..bb042c3 --- /dev/null +++ b/public/images/brand/brand-05.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/images/cards/cards-01.png b/public/images/cards/cards-01.png new file mode 100644 index 0000000..9121965 Binary files /dev/null and b/public/images/cards/cards-01.png differ diff --git a/public/images/cards/cards-02.png b/public/images/cards/cards-02.png new file mode 100644 index 0000000..3b5a301 Binary files /dev/null and b/public/images/cards/cards-02.png differ diff --git a/public/images/cards/cards-03.png b/public/images/cards/cards-03.png new file mode 100644 index 0000000..6657efe Binary files /dev/null and b/public/images/cards/cards-03.png differ diff --git a/public/images/cards/cards-04.png b/public/images/cards/cards-04.png new file mode 100644 index 0000000..c161cc3 Binary files /dev/null and b/public/images/cards/cards-04.png differ diff --git a/public/images/cards/cards-05.png b/public/images/cards/cards-05.png new file mode 100644 index 0000000..57f62d2 Binary files /dev/null and b/public/images/cards/cards-05.png differ diff --git a/public/images/cards/cards-06.png b/public/images/cards/cards-06.png new file mode 100644 index 0000000..f4c9cb1 Binary files /dev/null and b/public/images/cards/cards-06.png differ diff --git a/public/images/country/country-01.svg b/public/images/country/country-01.svg new file mode 100644 index 0000000..f7847a3 --- /dev/null +++ b/public/images/country/country-01.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/country/country-02.svg b/public/images/country/country-02.svg new file mode 100644 index 0000000..690f684 --- /dev/null +++ b/public/images/country/country-02.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/images/country/country-03.svg b/public/images/country/country-03.svg new file mode 100644 index 0000000..0672951 --- /dev/null +++ b/public/images/country/country-03.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/public/images/country/country-04.svg b/public/images/country/country-04.svg new file mode 100644 index 0000000..e869372 --- /dev/null +++ b/public/images/country/country-04.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/public/images/country/country-05.svg b/public/images/country/country-05.svg new file mode 100644 index 0000000..a43ceb6 --- /dev/null +++ b/public/images/country/country-05.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/country/country-06.svg b/public/images/country/country-06.svg new file mode 100644 index 0000000..760807e --- /dev/null +++ b/public/images/country/country-06.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/images/cover/cover-01.png b/public/images/cover/cover-01.png new file mode 100644 index 0000000..44c0008 Binary files /dev/null and b/public/images/cover/cover-01.png differ diff --git a/public/images/favicon.ico b/public/images/favicon.ico new file mode 100644 index 0000000..cf3128a Binary files /dev/null and b/public/images/favicon.ico differ diff --git a/public/images/icon/icon-arrow-down.svg b/public/images/icon/icon-arrow-down.svg new file mode 100644 index 0000000..1fd6d42 --- /dev/null +++ b/public/images/icon/icon-arrow-down.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/public/images/icon/icon-calendar.svg b/public/images/icon/icon-calendar.svg new file mode 100644 index 0000000..d75d993 --- /dev/null +++ b/public/images/icon/icon-calendar.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/public/images/icon/icon-copy-alt.svg b/public/images/icon/icon-copy-alt.svg new file mode 100644 index 0000000..1f0c770 --- /dev/null +++ b/public/images/icon/icon-copy-alt.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/images/icon/icon-moon.svg b/public/images/icon/icon-moon.svg new file mode 100644 index 0000000..1ca395d --- /dev/null +++ b/public/images/icon/icon-moon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/icon/icon-sun.svg b/public/images/icon/icon-sun.svg new file mode 100644 index 0000000..4524cde --- /dev/null +++ b/public/images/icon/icon-sun.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/illustration/illustration-01.svg b/public/images/illustration/illustration-01.svg new file mode 100644 index 0000000..2cbd768 --- /dev/null +++ b/public/images/illustration/illustration-01.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/illustration/illustration-02.svg b/public/images/illustration/illustration-02.svg new file mode 100644 index 0000000..b67fcbc --- /dev/null +++ b/public/images/illustration/illustration-02.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/images/illustration/illustration-03.svg b/public/images/illustration/illustration-03.svg new file mode 100644 index 0000000..990a752 --- /dev/null +++ b/public/images/illustration/illustration-03.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/illustration/illustration-04.svg b/public/images/illustration/illustration-04.svg new file mode 100644 index 0000000..fff1d6d --- /dev/null +++ b/public/images/illustration/illustration-04.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/logo/logo-dark.svg b/public/images/logo/logo-dark.svg new file mode 100644 index 0000000..65d5b15 --- /dev/null +++ b/public/images/logo/logo-dark.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/logo/logo-icon.svg b/public/images/logo/logo-icon.svg new file mode 100644 index 0000000..3da02a5 --- /dev/null +++ b/public/images/logo/logo-icon.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/logo/logo.svg b/public/images/logo/logo.svg new file mode 100644 index 0000000..0fbc3a9 --- /dev/null +++ b/public/images/logo/logo.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/product/product-01.png b/public/images/product/product-01.png new file mode 100644 index 0000000..137e6a9 Binary files /dev/null and b/public/images/product/product-01.png differ diff --git a/public/images/product/product-02.png b/public/images/product/product-02.png new file mode 100644 index 0000000..1505c7c Binary files /dev/null and b/public/images/product/product-02.png differ diff --git a/public/images/product/product-03.png b/public/images/product/product-03.png new file mode 100644 index 0000000..f582289 Binary files /dev/null and b/public/images/product/product-03.png differ diff --git a/public/images/product/product-04.png b/public/images/product/product-04.png new file mode 100644 index 0000000..1548a80 Binary files /dev/null and b/public/images/product/product-04.png differ diff --git a/public/images/product/product-thumb.png b/public/images/product/product-thumb.png new file mode 100644 index 0000000..56965b8 Binary files /dev/null and b/public/images/product/product-thumb.png differ diff --git a/public/images/task/task-01.jpg b/public/images/task/task-01.jpg new file mode 100644 index 0000000..8a59bf7 Binary files /dev/null and b/public/images/task/task-01.jpg differ diff --git a/public/images/user/user-01.png b/public/images/user/user-01.png new file mode 100644 index 0000000..04424a4 Binary files /dev/null and b/public/images/user/user-01.png differ diff --git a/public/images/user/user-02.png b/public/images/user/user-02.png new file mode 100644 index 0000000..dff8752 Binary files /dev/null and b/public/images/user/user-02.png differ diff --git a/public/images/user/user-03.png b/public/images/user/user-03.png new file mode 100644 index 0000000..5e0f95c Binary files /dev/null and b/public/images/user/user-03.png differ diff --git a/public/images/user/user-04.png b/public/images/user/user-04.png new file mode 100644 index 0000000..0f81f0d Binary files /dev/null and b/public/images/user/user-04.png differ diff --git a/public/images/user/user-05.png b/public/images/user/user-05.png new file mode 100644 index 0000000..99a92a9 Binary files /dev/null and b/public/images/user/user-05.png differ diff --git a/public/images/user/user-06.png b/public/images/user/user-06.png new file mode 100644 index 0000000..f882c2a Binary files /dev/null and b/public/images/user/user-06.png differ diff --git a/public/images/user/user-07.png b/public/images/user/user-07.png new file mode 100644 index 0000000..d25517d Binary files /dev/null and b/public/images/user/user-07.png differ diff --git a/public/images/user/user-08.png b/public/images/user/user-08.png new file mode 100644 index 0000000..6e4ac76 Binary files /dev/null and b/public/images/user/user-08.png differ diff --git a/public/images/user/user-09.png b/public/images/user/user-09.png new file mode 100644 index 0000000..ac99d0c Binary files /dev/null and b/public/images/user/user-09.png differ diff --git a/public/images/user/user-10.png b/public/images/user/user-10.png new file mode 100644 index 0000000..296a80f Binary files /dev/null and b/public/images/user/user-10.png differ diff --git a/public/images/user/user-11.png b/public/images/user/user-11.png new file mode 100644 index 0000000..7b84351 Binary files /dev/null and b/public/images/user/user-11.png differ diff --git a/public/images/user/user-12.png b/public/images/user/user-12.png new file mode 100644 index 0000000..734305e Binary files /dev/null and b/public/images/user/user-12.png differ diff --git a/public/images/user/user-13.png b/public/images/user/user-13.png new file mode 100644 index 0000000..86cf257 Binary files /dev/null and b/public/images/user/user-13.png differ diff --git a/public/next copy.svg b/public/next copy.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/public/next copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/vercel copy.svg b/public/vercel copy.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/public/vercel copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/window copy.svg b/public/window copy.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/public/window copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/apicalls/api-fetcher.tsx b/src/apicalls/api-fetcher.tsx new file mode 100644 index 0000000..9debca7 --- /dev/null +++ b/src/apicalls/api-fetcher.tsx @@ -0,0 +1,82 @@ +"use server"; + +import { redirect } from "next/navigation"; + +const defaultHeaders = { + accept: "application/json", + "Content-type": "application/json", +}; + +interface HeadersObject { + cache: string; + method: string; + headers: Object; + body?: string; +} + +const fetchData = async ( + endpoint: string, + payload: any, + method: string = "POST", + cache: boolean = false +) => { + let headersObject: any = { + cache: cache ? "force-cache" : "no-store", + method: method, + headers: defaultHeaders, + }; + if (method !== "GET") { + headersObject = { + ...headersObject, + body: JSON.stringify(payload), + }; + } + + try { + const response = await fetch(endpoint, headersObject); + if (response.status === 200) { + return response; + } else if (response.status === 401) { + return { status: 401 }; + } else { + return { status: response.status }; + } + } catch (error) {} + return { status: 500 }; +}; + +const fetchDataWithToken = async ( + endpoint: string, + token: string, + payload: any, + method: string = "POST", + cache: boolean = false +) => { + let headersObject: any = { + cache: cache ? "force-cache" : "no-store", + method: method, + headers: { + ...defaultHeaders, + "evyos-session-key": token, + }, + }; + if (method !== "GET") { + headersObject = { + ...headersObject, + body: JSON.stringify(payload), + }; + } + try { + const response = await fetch(endpoint, headersObject); + if (response.status === 200) { + return response; + } else if (response.status === 401) { + redirect("/login/email"); + } else { + return { status: response.status }; + } + } catch (error) {} + return { status: 500 }; +}; + +export { fetchData, fetchDataWithToken }; diff --git a/src/apicalls/basics.ts b/src/apicalls/basics.ts new file mode 100644 index 0000000..4a5705f --- /dev/null +++ b/src/apicalls/basics.ts @@ -0,0 +1,10 @@ +export const baseUrl = "http://0.0.0.0:41575"; +export const tokenSecret = + "SyIkoYIK5JLD2cuRB0hnB-1zcj5FB5oxbB73ph-Oe3Kn0WWeSOjnWAuzzi6ZUX_5TpFF0-KGpKDZepaUhVEmmdaY5E-_sI3b9UwfN_eg-KgtpCiiWiHADSu9bRSBez_ZI4AFkeNK0LSRWpqq9El6V3pauvgsKJU_ZXwplIW49Y8"; +export const cookieObject: any = { + httpOnly: true, + path: "/", + secure: true, + sameSite: "strict", + // maxAge: 3600, +}; diff --git a/src/apicalls/cookies/token.tsx b/src/apicalls/cookies/token.tsx new file mode 100644 index 0000000..4f59e02 --- /dev/null +++ b/src/apicalls/cookies/token.tsx @@ -0,0 +1,55 @@ +"use server"; +import { fetchDataWithToken } from "../api-fetcher"; +import { cookies } from "next/headers"; +import { baseUrl, tokenSecret } from "../basics"; +import NextCrypto from "next-crypto"; + +const checkToken = `${baseUrl}/authentication/valid`; +const nextCrypto = new NextCrypto(tokenSecret); + +async function check_access_token_is_valid() { + const cookieStore = await cookies(); + const encrpytAccessToken = cookieStore.get("accessToken")?.value || ""; + const decryptedAccessToken = + (await nextCrypto.decrypt(encrpytAccessToken)) || ""; + + const response = await fetchDataWithToken( + checkToken, + decryptedAccessToken, + {}, + "GET", + false + ); + return response?.status === 200 ? true : false; +} + +async function retrieve_access_token() { + const cookieStore = await cookies(); + const encrpytAccessToken = cookieStore.get("accessToken")?.value || ""; + return encrpytAccessToken + ? await nextCrypto.decrypt(encrpytAccessToken) + : null; +} + +async function retrieve_user_type() { + const cookieStore = await cookies(); + const encrpytaccessObject = cookieStore.get("accessObject")?.value || "{}"; + const decrpytUserType = JSON.parse( + (await nextCrypto.decrypt(encrpytaccessObject)) || "{}" + ); + return decrpytUserType ? decrpytUserType?.user_type : null; +} + +async function retrieve_access_objects() { + const cookieStore = await cookies(); + const encrpytAccessObject = cookieStore.get("accessObject")?.value || ""; + const decrpytAccessObject = await nextCrypto.decrypt(encrpytAccessObject); + return decrpytAccessObject ? JSON.parse(decrpytAccessObject) : null; +} + +export { + check_access_token_is_valid, + retrieve_access_token, + retrieve_user_type, + retrieve_access_objects, +}; diff --git a/src/apicalls/login/login.tsx b/src/apicalls/login/login.tsx new file mode 100644 index 0000000..5f22159 --- /dev/null +++ b/src/apicalls/login/login.tsx @@ -0,0 +1,153 @@ +"use server"; +import { fetchData, fetchDataWithToken } from "../api-fetcher"; +import { cookies } from "next/headers"; +import { baseUrl, cookieObject, tokenSecret } from "../basics"; +import NextCrypto from "next-crypto"; + +const loginEndpoint = `${baseUrl}/authentication/login`; +const loginSelectEndpoint = `${baseUrl}/authentication/select`; + +interface LoginViaAccessKeys { + domain: string; + accessKey: string; + password: string; + rememberMe: boolean; +} + +interface LoginSelectEmployee { + token: string; + company_uu_id: string; +} + +interface LoginSelectOccupant { + token: string; + build_part_uu_id: string; + occupant_uu_id: string; +} + +async function login_via_access_keys(payload: LoginViaAccessKeys) { + const cookieStore = await cookies(); + const nextCrypto = new NextCrypto(tokenSecret); + + let responseData: any = {}; + const tokenResponse: any = await fetchData( + loginEndpoint, + { + domain: payload.domain, + access_key: payload.accessKey, + password: payload.password, + remember_me: payload.rememberMe, + }, + "POST", + false + ); + if (tokenResponse.status === 200) { + responseData = await tokenResponse?.json(); + const accessToken = await nextCrypto.encrypt(responseData.access_token); + const accessObject = await nextCrypto.encrypt( + JSON.stringify(responseData.access_object) + ); + const userProfile = await nextCrypto.encrypt( + JSON.stringify(responseData.user) + ); + const refreshToken = await nextCrypto.encrypt(responseData.refresh_token); + + // const userType = await nextCrypto.encrypt(responseData.user_type); + // cookieStore.set({ + // name: "refreshToken", + // value: refreshToken, + // httpOnly: true, + // path: "/", + // }); + + cookieStore.set({ + name: "accessToken", + value: accessToken, + ...cookieObject, + }); + + cookieStore.set({ + name: "accessObject", + value: accessObject, + ...cookieObject, + }); + cookieStore.set({ + name: "userProfile", + value: JSON.stringify(userProfile), + ...cookieObject, + }); + // cookieStore.set({ + // name: "userType", + // value: userType, + // ...cookieObject, + // }); + } + return responseData; +} + +async function login_select_employee(payload: LoginSelectEmployee) { + let responseData = null; + const cookieStore = await cookies(); + const nextCrypto = new NextCrypto(tokenSecret); + + const selectResponse: any = await fetchDataWithToken( + loginSelectEndpoint, + payload.token, + { + company_uu_id: payload.company_uu_id, + }, + "POST", + false + ); + if (selectResponse.status === 200) { + responseData = await selectResponse?.json(); + const usersSelection = await nextCrypto.encrypt( + JSON.stringify({ + company_uu_id: payload.company_uu_id, + user_type: "employee", + }) + ); + cookieStore.set({ + name: "userSelection", + value: usersSelection, + ...cookieObject, + }); + } + return responseData; +} + +async function login_select_occupant(payload: LoginSelectOccupant) { + let responseData = null; + const cookieStore = await cookies(); + const nextCrypto = new NextCrypto(tokenSecret); + const selectResponse: any = await fetchDataWithToken( + loginSelectEndpoint, + payload.token, + { + build_part_uu_id: payload.build_part_uu_id, + occupant_uu_id: payload.occupant_uu_id, + }, + "POST", + false + ); + if (selectResponse.status === 200) { + responseData = await selectResponse?.json(); + const usersSelection = await nextCrypto.encrypt( + JSON.stringify({ + company_uu_id: { + build_part_uu_id: payload.build_part_uu_id, + occupant_uu_id: payload.occupant_uu_id, + }, + user_type: "occupant", + }) + ); + cookieStore.set({ + name: "userSelection", + value: usersSelection, + ...cookieObject, + }); + } + return responseData; +} + +export { login_via_access_keys, login_select_employee, login_select_occupant }; diff --git a/src/app/globals.css b/src/app/globals.css index 6b717ad..942f871 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -2,20 +2,71 @@ @tailwind components; @tailwind utilities; -:root { - --background: #ffffff; - --foreground: #171717; +body { + font-family: Arial, Helvetica, sans-serif; } -@media (prefers-color-scheme: dark) { +@layer base { :root { - --background: #0a0a0a; - --foreground: #ededed; + --background: 0 0% 100%; + --foreground: 240 10% 3.9%; + --card: 0 0% 100%; + --card-foreground: 240 10% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 240 10% 3.9%; + --primary: 240 5.9% 10%; + --primary-foreground: 0 0% 98%; + --secondary: 240 4.8% 95.9%; + --secondary-foreground: 240 5.9% 10%; + --muted: 240 4.8% 95.9%; + --muted-foreground: 240 3.8% 46.1%; + --accent: 240 4.8% 95.9%; + --accent-foreground: 240 5.9% 10%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 240 5.9% 90%; + --input: 240 5.9% 90%; + --ring: 240 10% 3.9%; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --radius: 0.5rem; + } + .dark { + --background: 240 10% 3.9%; + --foreground: 0 0% 98%; + --card: 240 10% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 240 10% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 240 5.9% 10%; + --secondary: 240 3.7% 15.9%; + --secondary-foreground: 0 0% 98%; + --muted: 240 3.7% 15.9%; + --muted-foreground: 240 5% 64.9%; + --accent: 240 3.7% 15.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 240 3.7% 15.9%; + --input: 240 3.7% 15.9%; + --ring: 240 4.9% 83.9%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; } } -body { - color: var(--foreground); - background: var(--background); - font-family: Arial, Helvetica, sans-serif; +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } } diff --git a/src/app/login/email/page.tsx b/src/app/login/email/page.tsx new file mode 100644 index 0000000..3aaf12f --- /dev/null +++ b/src/app/login/email/page.tsx @@ -0,0 +1,13 @@ +"use server"; +import LoginWithEmail from "@/components/login/loginwithemail"; +import { check_access_token_is_valid } from "@/apicalls/cookies/token"; +import { redirect } from "next/navigation"; + +export default async function MyForm() { + const token_is_valid = await check_access_token_is_valid(); + if (token_is_valid) { + redirect("/login/select"); + } + + return ; +} diff --git a/src/app/login/phone/page.tsx b/src/app/login/phone/page.tsx new file mode 100644 index 0000000..72a071c --- /dev/null +++ b/src/app/login/phone/page.tsx @@ -0,0 +1,40 @@ +"use server"; + +import LoginWithPhone from "@/components/login/loginwithephone"; +import Image from "next/image"; +import { check_access_token_is_valid } from "@/apicalls/cookies/token"; +import { redirect } from "next/navigation"; + +export default async function MyForm() { + const token_is_valid = await check_access_token_is_valid(); + if (token_is_valid) { + redirect("/login/select"); + } + + return ( +
+
+ Evyos +

+ Telefon Numarası ile Giriş Yapın +

+
+ +

+ Üye değilmisiniz?{" "} + + Üye olmak için tıklayın + +

+
+ ); +} diff --git a/src/app/login/select/page.tsx b/src/app/login/select/page.tsx new file mode 100644 index 0000000..32ecf06 --- /dev/null +++ b/src/app/login/select/page.tsx @@ -0,0 +1,29 @@ +"use server"; +import React from "react"; + +import LoginEmployeeCard from "@/components/login/loginemployee"; +import LoginOccupantCard from "@/components/login/loginoccupant"; +import { + check_access_token_is_valid, + retrieve_user_type, +} from "@/apicalls/cookies/token"; +import { redirect } from "next/navigation"; + +const SelectPage: React.FC = async () => { + const token_is_valid = await check_access_token_is_valid(); + const userType = await retrieve_user_type(); + if (!userType || !token_is_valid) { + redirect("/login/email"); + } + return userType === "employee" ? ( +
+ +
+ ) : ( +
+ +
+ ); +}; + +export default SelectPage; diff --git a/src/components/Breadcrumbs/Breadcrumb.tsx b/src/components/Breadcrumbs/Breadcrumb.tsx new file mode 100644 index 0000000..c4571d5 --- /dev/null +++ b/src/components/Breadcrumbs/Breadcrumb.tsx @@ -0,0 +1,26 @@ +import Link from "next/link"; +interface BreadcrumbProps { + pageName: string; +} +const Breadcrumb = ({ pageName }: BreadcrumbProps) => { + return ( +
+

+ {pageName} +

+ + +
+ ); +}; + +export default Breadcrumb; diff --git a/src/components/Calender/index.tsx b/src/components/Calender/index.tsx new file mode 100644 index 0000000..2d8ec3e --- /dev/null +++ b/src/components/Calender/index.tsx @@ -0,0 +1,273 @@ +import Breadcrumb from "../Breadcrumbs/Breadcrumb"; + +const Calendar = () => { + return ( +
+ + + {/* */} +
+ + + + + + + + + + + + + + {/* */} + + + + + + + + + + {/* */} + {/* */} + + + + + + + + + + {/* */} + {/* */} + + + + + + + + + + {/* */} + {/* */} + + + + + + + + + + {/* */} + {/* */} + + + + + + + + + + {/* */} + +
+ Sunday + Sun + + Monday + Mon + + Tuesday + Tue + + Wednesday + Wed + + Thursday + Thur + + Friday + Fri + + Saturday + Sat +
+ + 1 + +
+ + More + +
+ + Redesign Website + + + 1 Dec - 2 Dec + +
+
+
+ + 2 + + + + 3 + + + + 4 + + + + 5 + + + + 6 + + + + 7 + +
+ + 8 + + + + 9 + + + + 10 + + + + 11 + + + + 12 + + + + 13 + + + + 14 + +
+ + 15 + + + + 16 + + + + 17 + + + + 18 + + + + 19 + + + + 20 + + + + 21 + +
+ + 22 + + + + 23 + + + + 24 + + + + 25 + +
+ + More + +
+ + App Design + + + 25 Dec - 27 Dec + +
+
+
+ + 26 + + + + 27 + + + + 28 + +
+ + 29 + + + + 30 + + + + 31 + + + + 1 + + + + 2 + + + + 3 + + + + 4 + +
+
+ {/* */} +
+ ); +}; + +export default Calendar; diff --git a/src/components/CardDataStats.tsx b/src/components/CardDataStats.tsx new file mode 100644 index 0000000..bc94ff0 --- /dev/null +++ b/src/components/CardDataStats.tsx @@ -0,0 +1,77 @@ +import React, { ReactNode } from "react"; + +interface CardDataStatsProps { + title: string; + total: string; + rate: string; + levelUp?: boolean; + levelDown?: boolean; + children: ReactNode; +} + +const CardDataStats: React.FC = ({ + title, + total, + rate, + levelUp, + levelDown, + children, +}) => { + return ( +
+
+ {children} +
+ +
+
+

+ {total} +

+ {title} +
+ + + {rate} + + {levelUp && ( + + + + )} + {levelDown && ( + + + + )} + +
+
+ ); +}; + +export default CardDataStats; diff --git a/src/components/Charts/ChartOne.tsx b/src/components/Charts/ChartOne.tsx new file mode 100644 index 0000000..ddcf9fc --- /dev/null +++ b/src/components/Charts/ChartOne.tsx @@ -0,0 +1,197 @@ +"use client"; + +import { ApexOptions } from "apexcharts"; +import React from "react"; +import dynamic from "next/dynamic"; + +const ReactApexChart = dynamic(() => import("react-apexcharts"), { + ssr: false, +}); + +const options: ApexOptions = { + legend: { + show: false, + position: "top", + horizontalAlign: "left", + }, + colors: ["#3C50E0", "#80CAEE"], + chart: { + fontFamily: "Satoshi, sans-serif", + height: 335, + type: "area", + dropShadow: { + enabled: true, + color: "#623CEA14", + top: 10, + blur: 4, + left: 0, + opacity: 0.1, + }, + + toolbar: { + show: false, + }, + }, + responsive: [ + { + breakpoint: 1024, + options: { + chart: { + height: 300, + }, + }, + }, + { + breakpoint: 1366, + options: { + chart: { + height: 350, + }, + }, + }, + ], + stroke: { + width: [2, 2], + curve: "straight", + }, + // labels: { + // show: false, + // position: "top", + // }, + grid: { + xaxis: { + lines: { + show: true, + }, + }, + yaxis: { + lines: { + show: true, + }, + }, + }, + dataLabels: { + enabled: false, + }, + markers: { + size: 4, + colors: "#fff", + strokeColors: ["#3056D3", "#80CAEE"], + strokeWidth: 3, + strokeOpacity: 0.9, + strokeDashArray: 0, + fillOpacity: 1, + discrete: [], + hover: { + size: undefined, + sizeOffset: 5, + }, + }, + xaxis: { + type: "category", + categories: [ + "Sep", + "Oct", + "Nov", + "Dec", + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + ], + axisBorder: { + show: false, + }, + axisTicks: { + show: false, + }, + }, + yaxis: { + title: { + style: { + fontSize: "0px", + }, + }, + min: 0, + max: 100, + }, +}; + +interface ChartOneState { + series: { + name: string; + data: number[]; + }[]; +} + +const ChartOne: React.FC = () => { + const series = [ + { + name: "Product One", + data: [23, 11, 22, 27, 13, 22, 37, 21, 44, 22, 30, 45], + }, + + { + name: "Product Two", + data: [30, 25, 36, 30, 45, 35, 64, 52, 59, 36, 39, 51], + }, + ] + + return ( +
+
+
+
+ + + +
+

Total Revenue

+

12.04.2022 - 12.05.2022

+
+
+
+ + + +
+

Total Sales

+

12.04.2022 - 12.05.2022

+
+
+
+
+
+ + + +
+
+
+ +
+
+ +
+
+
+ ); +}; + +export default ChartOne; diff --git a/src/components/Charts/ChartThree.tsx b/src/components/Charts/ChartThree.tsx new file mode 100644 index 0000000..37322eb --- /dev/null +++ b/src/components/Charts/ChartThree.tsx @@ -0,0 +1,149 @@ +import { ApexOptions } from "apexcharts"; +import React from "react"; +import ReactApexChart from "react-apexcharts"; + +interface ChartThreeState { + series: number[]; +} + +const options: ApexOptions = { + chart: { + fontFamily: "Satoshi, sans-serif", + type: "donut", + }, + colors: ["#3C50E0", "#6577F3", "#8FD0EF", "#0FADCF"], + labels: ["Desktop", "Tablet", "Mobile", "Unknown"], + legend: { + show: false, + position: "bottom", + }, + + plotOptions: { + pie: { + donut: { + size: "65%", + background: "transparent", + }, + }, + }, + dataLabels: { + enabled: false, + }, + responsive: [ + { + breakpoint: 2600, + options: { + chart: { + width: 380, + }, + }, + }, + { + breakpoint: 640, + options: { + chart: { + width: 200, + }, + }, + }, + ], +}; + +const ChartThree: React.FC = () => { + const series = [65, 34, 12, 56]; + + return ( +
+
+
+
+ Visitors Analytics +
+
+
+
+ + + + + + + +
+
+
+ +
+
+ +
+
+ +
+
+
+ +

+ Desktop + 65% +

+
+
+
+
+ +

+ Tablet + 34% +

+
+
+
+
+ +

+ Mobile + 45% +

+
+
+
+
+ +

+ Unknown + 12% +

+
+
+
+
+ ); +}; + +export default ChartThree; diff --git a/src/components/Charts/ChartTwo.tsx b/src/components/Charts/ChartTwo.tsx new file mode 100644 index 0000000..739f5e6 --- /dev/null +++ b/src/components/Charts/ChartTwo.tsx @@ -0,0 +1,151 @@ +"use client"; + +import { ApexOptions } from "apexcharts"; +import React from "react"; +import dynamic from "next/dynamic"; + +const ReactApexChart = dynamic(() => import("react-apexcharts"), { + ssr: false, +}); + +const options: ApexOptions = { + colors: ["#3C50E0", "#80CAEE"], + chart: { + fontFamily: "Satoshi, sans-serif", + type: "bar", + height: 335, + stacked: true, + toolbar: { + show: false, + }, + zoom: { + enabled: false, + }, + }, + + responsive: [ + { + breakpoint: 1536, + options: { + plotOptions: { + bar: { + borderRadius: 0, + columnWidth: "25%", + }, + }, + }, + }, + ], + plotOptions: { + bar: { + horizontal: false, + borderRadius: 0, + columnWidth: "25%", + borderRadiusApplication: "end", + borderRadiusWhenStacked: "last", + }, + }, + dataLabels: { + enabled: false, + }, + + xaxis: { + categories: ["M", "T", "W", "T", "F", "S", "S"], + }, + legend: { + position: "top", + horizontalAlign: "left", + fontFamily: "Satoshi", + fontWeight: 500, + fontSize: "14px", + + markers: { + radius: 99, + }, + }, + fill: { + opacity: 1, + }, +}; + +interface ChartTwoState { + series: { + name: string; + data: number[]; + }[]; +} + +const ChartTwo: React.FC = () => { + const series = [ + { + name: "Sales", + data: [44, 55, 41, 67, 22, 43, 65], + }, + { + name: "Revenue", + data: [13, 23, 20, 8, 13, 27, 15], + }, + ]; + + return ( +
+
+
+

+ Profit this week +

+
+
+
+ + + + + + + +
+
+
+ +
+
+ +
+
+
+ ); +}; + +export default ChartTwo; diff --git a/src/components/Charts/page.tsx b/src/components/Charts/page.tsx new file mode 100644 index 0000000..a67b1f7 --- /dev/null +++ b/src/components/Charts/page.tsx @@ -0,0 +1,26 @@ +"use client"; +import Breadcrumb from "@/components/Breadcrumbs/Breadcrumb"; +import ChartOne from "@/components/Charts/ChartOne"; +import ChartTwo from "@/components/Charts/ChartTwo"; +import dynamic from "next/dynamic"; +import React from "react"; + +const ChartThree = dynamic(() => import("@/components/Charts/ChartThree"), { + ssr: false, +}); + +const Chart: React.FC = () => { + return ( + <> + + +
+ + + +
+ + ); +}; + +export default Chart; diff --git a/src/components/Chat/ChatCard.tsx b/src/components/Chat/ChatCard.tsx new file mode 100644 index 0000000..61bbc4f --- /dev/null +++ b/src/components/Chat/ChatCard.tsx @@ -0,0 +1,116 @@ +import Link from "next/link"; +import Image from "next/image"; +import { Chat } from "@/types/chat"; + +const chatData: Chat[] = [ + { + avatar: "/images/user/user-01.png", + name: "Devid Heilo", + text: "How are you?", + time: 12, + textCount: 3, + dot: 3, + }, + { + avatar: "/images/user/user-02.png", + name: "Henry Fisher", + text: "Waiting for you!", + time: 12, + textCount: 0, + dot: 1, + }, + { + avatar: "/images/user/user-04.png", + name: "Jhon Doe", + text: "What's up?", + time: 32, + textCount: 0, + dot: 3, + }, + { + avatar: "/images/user/user-05.png", + name: "Jane Doe", + text: "Great", + time: 32, + textCount: 2, + dot: 6, + }, + { + avatar: "/images/user/user-01.png", + name: "Jhon Doe", + text: "How are you?", + time: 32, + textCount: 0, + dot: 3, + }, + { + avatar: "/images/user/user-03.png", + name: "Jhon Doe", + text: "How are you?", + time: 32, + textCount: 3, + dot: 6, + }, +]; + +const ChatCard = () => { + return ( +
+

+ Chats +

+ +
+ {chatData.map((chat, key) => ( + +
+ User + +
+ +
+
+
+ {chat.name} +
+

+ + {chat.text} + + . {chat.time} min +

+
+ {chat.textCount !== 0 && ( +
+ + {" "} + {chat.textCount} + +
+ )} +
+ + ))} +
+
+ ); +}; + +export default ChatCard; diff --git a/src/components/Checkboxes/CheckboxFive.tsx b/src/components/Checkboxes/CheckboxFive.tsx new file mode 100644 index 0000000..49dcb68 --- /dev/null +++ b/src/components/Checkboxes/CheckboxFive.tsx @@ -0,0 +1,35 @@ +import { useState } from "react"; + +const CheckboxFive = () => { + const [isChecked, setIsChecked] = useState(false); + + return ( +
+ +
+ ); +}; + +export default CheckboxFive; diff --git a/src/components/Checkboxes/CheckboxFour.tsx b/src/components/Checkboxes/CheckboxFour.tsx new file mode 100644 index 0000000..d6c1e0b --- /dev/null +++ b/src/components/Checkboxes/CheckboxFour.tsx @@ -0,0 +1,41 @@ +import { useState } from "react"; + +const CheckboxFour = () => { + const [isChecked, setIsChecked] = useState(false); + + return ( +
+ +
+ ); +}; + +export default CheckboxFour; diff --git a/src/components/Checkboxes/CheckboxOne.tsx b/src/components/Checkboxes/CheckboxOne.tsx new file mode 100644 index 0000000..05791e2 --- /dev/null +++ b/src/components/Checkboxes/CheckboxOne.tsx @@ -0,0 +1,37 @@ +import { useState } from "react"; + +const CheckboxOne = () => { + const [isChecked, setIsChecked] = useState(false); + + return ( +
+ +
+ ); +}; + +export default CheckboxOne; diff --git a/src/components/Checkboxes/CheckboxThree.tsx b/src/components/Checkboxes/CheckboxThree.tsx new file mode 100644 index 0000000..3c63d80 --- /dev/null +++ b/src/components/Checkboxes/CheckboxThree.tsx @@ -0,0 +1,53 @@ +import { useState } from "react"; + +const CheckboxThree = () => { + const [isChecked, setIsChecked] = useState(false); + + return ( +
+ +
+ ); +}; + +export default CheckboxThree; diff --git a/src/components/Checkboxes/CheckboxTwo.tsx b/src/components/Checkboxes/CheckboxTwo.tsx new file mode 100644 index 0000000..2b8f4d7 --- /dev/null +++ b/src/components/Checkboxes/CheckboxTwo.tsx @@ -0,0 +1,50 @@ +import { useState } from "react"; + +const CheckboxTwo = () => { + const [isChecked, setIsChecked] = useState(false); + + return ( +
+ +
+ ); +}; + +export default CheckboxTwo; diff --git a/src/components/ClickOutside.tsx b/src/components/ClickOutside.tsx new file mode 100644 index 0000000..30a8172 --- /dev/null +++ b/src/components/ClickOutside.tsx @@ -0,0 +1,51 @@ +import React, { useRef, useEffect } from "react"; + +interface Props { + children: React.ReactNode; + exceptionRef?: React.RefObject; + onClick: () => void; + className?: string; +} + +const ClickOutside: React.FC = ({ + children, + exceptionRef, + onClick, + className, +}) => { + const wrapperRef = useRef(null); + + useEffect(() => { + const handleClickListener = (event: MouseEvent) => { + let clickedInside: null | boolean = false; + if (exceptionRef) { + clickedInside = + (wrapperRef.current && + wrapperRef.current.contains(event.target as Node)) || + (exceptionRef.current && exceptionRef.current === event.target) || + (exceptionRef.current && + exceptionRef.current.contains(event.target as Node)); + } else { + clickedInside = + wrapperRef.current && + wrapperRef.current.contains(event.target as Node); + } + + if (!clickedInside) onClick(); + }; + + document.addEventListener("mousedown", handleClickListener); + + return () => { + document.removeEventListener("mousedown", handleClickListener); + }; + }, [exceptionRef, onClick]); + + return ( +
+ {children} +
+ ); +}; + +export default ClickOutside; diff --git a/src/components/Dashboard/E-commerce.tsx b/src/components/Dashboard/E-commerce.tsx new file mode 100644 index 0000000..be70c6f --- /dev/null +++ b/src/components/Dashboard/E-commerce.tsx @@ -0,0 +1,122 @@ +"use client"; +import dynamic from "next/dynamic"; +import React from "react"; +import ChartOne from "../Charts/ChartOne"; +import ChartTwo from "../Charts/ChartTwo"; +import ChatCard from "../Chat/ChatCard"; +import TableOne from "../Tables/TableOne"; +import CardDataStats from "../CardDataStats"; + +const MapOne = dynamic(() => import("@/components/Maps/MapOne"), { + ssr: false, +}); + +const ChartThree = dynamic(() => import("@/components/Charts/ChartThree"), { + ssr: false, +}); + +const ECommerce: React.FC = () => { + return ( + <> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+ +
+ + ); +}; + +export default ECommerce; diff --git a/src/components/Dropdowns/DropdownDefault.tsx b/src/components/Dropdowns/DropdownDefault.tsx new file mode 100644 index 0000000..76943b5 --- /dev/null +++ b/src/components/Dropdowns/DropdownDefault.tsx @@ -0,0 +1,128 @@ +import { useEffect, useRef, useState } from "react"; + +const DropdownDefault = () => { + const [dropdownOpen, setDropdownOpen] = useState(false); + + const trigger = useRef(null); + const dropdown = useRef(null); + + // close on click outside + useEffect(() => { + const clickHandler = ({ target }: MouseEvent) => { + if (!dropdown.current) return; + if ( + !dropdownOpen || + dropdown.current.contains(target) || + trigger.current.contains(target) + ) + return; + setDropdownOpen(false); + }; + document.addEventListener("click", clickHandler); + return () => document.removeEventListener("click", clickHandler); + }); + + // close if the esc key is pressed + useEffect(() => { + const keyHandler = ({ keyCode }: KeyboardEvent) => { + if (!dropdownOpen || keyCode !== 27) return; + setDropdownOpen(false); + }; + document.addEventListener("keydown", keyHandler); + return () => document.removeEventListener("keydown", keyHandler); + }); + + return ( +
+ +
setDropdownOpen(true)} + onBlur={() => setDropdownOpen(false)} + className={`absolute right-0 top-full z-40 w-40 space-y-1 rounded-sm border border-stroke bg-white p-1.5 shadow-default dark:border-strokedark dark:bg-boxdark ${ + dropdownOpen === true ? "block" : "hidden" + }`} + > + + +
+
+ ); +}; + +export default DropdownDefault; diff --git a/src/components/FormElements/DatePicker/DatePickerOne.tsx b/src/components/FormElements/DatePicker/DatePickerOne.tsx new file mode 100644 index 0000000..f8f32a8 --- /dev/null +++ b/src/components/FormElements/DatePicker/DatePickerOne.tsx @@ -0,0 +1,50 @@ +import flatpickr from "flatpickr"; +import { useEffect } from "react"; + +const DatePickerOne = () => { + useEffect(() => { + // Init flatpickr + flatpickr(".form-datepicker", { + mode: "single", + static: true, + monthSelectorType: "static", + dateFormat: "M j, Y", + prevArrow: + '', + nextArrow: + '', + }); + }, []); + + return ( +
+ +
+ + +
+ + + +
+
+
+ ); +}; + +export default DatePickerOne; diff --git a/src/components/FormElements/DatePicker/DatePickerTwo.tsx b/src/components/FormElements/DatePicker/DatePickerTwo.tsx new file mode 100644 index 0000000..6385c3d --- /dev/null +++ b/src/components/FormElements/DatePicker/DatePickerTwo.tsx @@ -0,0 +1,50 @@ +import flatpickr from "flatpickr"; +import { useEffect } from "react"; + +const DatePickerTwo = () => { + useEffect(() => { + // Init flatpickr + flatpickr(".form-datepicker", { + mode: "single", + static: true, + monthSelectorType: "static", + dateFormat: "M j, Y", + prevArrow: + '', + nextArrow: + '', + }); + }, []); + + return ( +
+ +
+ + +
+ + + +
+
+
+ ); +}; + +export default DatePickerTwo; diff --git a/src/components/FormElements/MultiSelect.tsx b/src/components/FormElements/MultiSelect.tsx new file mode 100644 index 0000000..9fdef93 --- /dev/null +++ b/src/components/FormElements/MultiSelect.tsx @@ -0,0 +1,226 @@ +import React, { useState, useEffect, useRef } from "react"; + +interface Option { + value: string; + text: string; + selected: boolean; + element?: HTMLElement; +} + +interface DropdownProps { + id: string; +} + +const MultiSelect: React.FC = ({ id }) => { + const [options, setOptions] = useState([]); + const [selected, setSelected] = useState([]); + const [show, setShow] = useState(false); + const dropdownRef = useRef(null); + const trigger = useRef(null); + + useEffect(() => { + const loadOptions = () => { + const select = document.getElementById(id) as HTMLSelectElement | null; + if (select) { + const newOptions: Option[] = []; + for (let i = 0; i < select.options.length; i++) { + newOptions.push({ + value: select.options[i].value, + text: select.options[i].innerText, + selected: select.options[i].hasAttribute("selected"), + }); + } + setOptions(newOptions); + } + }; + + loadOptions(); + }, [id]); + + const open = () => { + setShow(true); + }; + + const isOpen = () => { + return show === true; + }; + + const select = (index: number, event: React.MouseEvent) => { + const newOptions = [...options]; + + if (!newOptions[index].selected) { + newOptions[index].selected = true; + newOptions[index].element = event.currentTarget as HTMLElement; + setSelected([...selected, index]); + } else { + const selectedIndex = selected.indexOf(index); + if (selectedIndex !== -1) { + newOptions[index].selected = false; + setSelected(selected.filter((i) => i !== index)); + } + } + + setOptions(newOptions); + }; + + const remove = (index: number) => { + const newOptions = [...options]; + const selectedIndex = selected.indexOf(index); + + if (selectedIndex !== -1) { + newOptions[index].selected = false; + setSelected(selected.filter((i) => i !== index)); + setOptions(newOptions); + } + }; + + const selectedValues = () => { + return selected.map((option) => options[option].value); + }; + + useEffect(() => { + const clickHandler = ({ target }: MouseEvent) => { + if (!dropdownRef.current) return; + if ( + !show || + dropdownRef.current.contains(target) || + trigger.current.contains(target) + ) + return; + setShow(false); + }; + document.addEventListener("click", clickHandler); + return () => document.removeEventListener("click", clickHandler); + }); + + return ( +
+ +
+ + +
+ +
+
+
+
+
+ {selected.map((index) => ( +
+
+ {options[index].text} +
+
+
remove(index)} + className="cursor-pointer pl-2 hover:text-danger" + > + + + +
+
+
+ ))} + {selected.length === 0 && ( +
+ +
+ )} +
+
+ +
+
+
+
+
setShow(true)} + onBlur={() => setShow(false)} + > +
+ {options.map((option, index) => ( +
+
select(index, event)} + > +
+
+
+ {option.text} +
+
+
+
+
+ ))} +
+
+
+
+
+
+
+
+ ); +}; + +export default MultiSelect; diff --git a/src/components/FormElements/index.tsx b/src/components/FormElements/index.tsx new file mode 100644 index 0000000..3b21693 --- /dev/null +++ b/src/components/FormElements/index.tsx @@ -0,0 +1,206 @@ +"use client"; +import Breadcrumb from "@/components/Breadcrumbs/Breadcrumb"; +import CheckboxFive from "@/components/Checkboxes/CheckboxFive"; +import CheckboxFour from "@/components/Checkboxes/CheckboxFour"; +import CheckboxOne from "@/components/Checkboxes/CheckboxOne"; +import CheckboxThree from "@/components/Checkboxes/CheckboxThree"; +import CheckboxTwo from "@/components/Checkboxes/CheckboxTwo"; +import SwitcherFour from "@/components/Switchers/SwitcherFour"; +import SwitcherOne from "@/components/Switchers/SwitcherOne"; +import SwitcherThree from "@/components/Switchers/SwitcherThree"; +import SwitcherTwo from "@/components/Switchers/SwitcherTwo"; +import DatePickerTwo from "@/components/FormElements/DatePicker/DatePickerTwo"; +import DatePickerOne from "@/components/FormElements/DatePicker/DatePickerOne"; +import MultiSelect from "@/components/FormElements/MultiSelect"; +import SelectGroupTwo from "@/components/SelectGroup/SelectGroupTwo"; + +const FormElements = () => { + return ( + <> + + +
+
+ {/* */} +
+
+

+ Input Fields +

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

+ Toggle switch input +

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

+ Time and date +

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

+ File upload +

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

+ Textarea Fields +

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

+ Checkbox and radio +

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

+ Select input +

+
+
+ + +
+
+
+
+ + ); +}; + +export default FormElements; diff --git a/src/components/Header/DarkModeSwitcher.tsx b/src/components/Header/DarkModeSwitcher.tsx new file mode 100644 index 0000000..692d13b --- /dev/null +++ b/src/components/Header/DarkModeSwitcher.tsx @@ -0,0 +1,65 @@ +import useColorMode from "@/hooks/useColorMode"; + +const DarkModeSwitcher = () => { + const [colorMode, setColorMode] = useColorMode(); + + return ( +
  • + +
  • + ); +}; + +export default DarkModeSwitcher; diff --git a/src/components/Header/DropdownMessage.tsx b/src/components/Header/DropdownMessage.tsx new file mode 100644 index 0000000..dcb80cb --- /dev/null +++ b/src/components/Header/DropdownMessage.tsx @@ -0,0 +1,211 @@ +import { useEffect, useRef, useState } from "react"; +import Link from "next/link"; +import Image from "next/image"; +import ClickOutside from "@/components/ClickOutside"; + +const DropdownMessage = () => { + const [dropdownOpen, setDropdownOpen] = useState(false); + const [notifying, setNotifying] = useState(true); + + + return ( + setDropdownOpen(false)} className="relative"> +
  • + { + setNotifying(false); + setDropdownOpen(!dropdownOpen); + }} + className="relative flex h-8.5 w-8.5 items-center justify-center rounded-full border-[0.5px] border-stroke bg-gray hover:text-primary dark:border-strokedark dark:bg-meta-4 dark:text-white" + href="#" + > + + + + + + + + + + + + + {/* */} + {dropdownOpen && ( +
    +
    +
    Messages
    +
    + +
      +
    • + +
      + User +
      + +
      +
      + Mariya Desoja +
      +

      I like your confidence 💪

      +

      2min ago

      +
      + +
    • +
    • + +
      + User +
      + +
      +
      + Robert Jhon +
      +

      Can you share your offer?

      +

      10min ago

      +
      + +
    • +
    • + +
      + User +
      + +
      +
      + Henry Dholi +
      +

      I cam across your profile and...

      +

      1day ago

      +
      + +
    • +
    • + +
      + User +
      + +
      +
      + Cody Fisher +
      +

      I’m waiting for you response!

      +

      5days ago

      +
      + +
    • +
    • + +
      + User +
      + +
      +
      + Mariya Desoja +
      +

      I like your confidence 💪

      +

      2min ago

      +
      + +
    • +
    +
    + )} + {/* */} +
  • +
    + ); +}; + +export default DropdownMessage; diff --git a/src/components/Header/DropdownNotification.tsx b/src/components/Header/DropdownNotification.tsx new file mode 100644 index 0000000..835986a --- /dev/null +++ b/src/components/Header/DropdownNotification.tsx @@ -0,0 +1,125 @@ +import { useState } from "react"; +import Link from "next/link"; +import ClickOutside from "@/components/ClickOutside"; + +const DropdownNotification = () => { + const [dropdownOpen, setDropdownOpen] = useState(false); + const [notifying, setNotifying] = useState(true); + + return ( + setDropdownOpen(false)} className="relative"> +
  • + { + setNotifying(false); + setDropdownOpen(!dropdownOpen); + }} + href="#" + className="relative flex h-8.5 w-8.5 items-center justify-center rounded-full border-[0.5px] border-stroke bg-gray hover:text-primary dark:border-strokedark dark:bg-meta-4 dark:text-white" + > + + + + + + + + + + {dropdownOpen && ( +
    +
    +
    + Notification +
    +
    + +
      +
    • + +

      + + Edit your information in a swipe + {" "} + Sint occaecat cupidatat non proident, sunt in culpa qui + officia deserunt mollit anim. +

      + +

      12 May, 2025

      + +
    • +
    • + +

      + + It is a long established fact + {" "} + that a reader will be distracted by the readable. +

      + +

      24 Feb, 2025

      + +
    • +
    • + +

      + + There are many variations + {" "} + of passages of Lorem Ipsum available, but the majority have + suffered +

      + +

      04 Jan, 2025

      + +
    • +
    • + +

      + + There are many variations + {" "} + of passages of Lorem Ipsum available, but the majority have + suffered +

      + +

      01 Dec, 2024

      + +
    • +
    +
    + )} +
  • +
    + ); +}; + +export default DropdownNotification; diff --git a/src/components/Header/DropdownUser.tsx b/src/components/Header/DropdownUser.tsx new file mode 100644 index 0000000..f627b9e --- /dev/null +++ b/src/components/Header/DropdownUser.tsx @@ -0,0 +1,158 @@ +import { useState } from "react"; +import Link from "next/link"; +import Image from "next/image"; +import ClickOutside from "@/components/ClickOutside"; + +const DropdownUser = () => { + const [dropdownOpen, setDropdownOpen] = useState(false); + + return ( + setDropdownOpen(false)} className="relative"> + setDropdownOpen(!dropdownOpen)} + className="flex items-center gap-4" + href="#" + > + + + Thomas Anree + + UX Designer + + + + User + + + + + + + + {/* */} + {dropdownOpen && ( +
    +
      +
    • + + + + + + My Profile + +
    • +
    • + + + + + My Contacts + +
    • +
    • + + + + + + Account Settings + +
    • +
    + +
    + )} + {/* */} +
    + ); +}; + +export default DropdownUser; diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx new file mode 100644 index 0000000..a01c0cf --- /dev/null +++ b/src/components/Header/index.tsx @@ -0,0 +1,129 @@ +import Link from "next/link"; +import DarkModeSwitcher from "./DarkModeSwitcher"; +import DropdownMessage from "./DropdownMessage"; +import DropdownNotification from "./DropdownNotification"; +import DropdownUser from "./DropdownUser"; +import Image from "next/image"; + +const Header = (props: { + sidebarOpen: string | boolean | undefined; + setSidebarOpen: (arg0: boolean) => void; +}) => { + return ( +
    +
    +
    + {/* */} + + {/* */} + + + Logo + +
    + +
    +
    +
    + + + +
    +
    +
    + +
    +
      + {/* */} + + {/* */} + + {/* */} + + {/* */} + + {/* */} + + {/* */} +
    + + {/* */} + + {/* */} +
    +
    +
    + ); +}; + +export default Header; diff --git a/src/components/Layouts/DefaultLayout.tsx b/src/components/Layouts/DefaultLayout.tsx new file mode 100644 index 0000000..82862be --- /dev/null +++ b/src/components/Layouts/DefaultLayout.tsx @@ -0,0 +1,38 @@ +"use client"; +import React, { useState, ReactNode } from "react"; +import Sidebar from "@/components/Sidebar"; +import Header from "@/components/Header"; + +export default function DefaultLayout({ + children, +}: { + children: React.ReactNode; +}) { + const [sidebarOpen, setSidebarOpen] = useState(false); + return ( + <> + {/* */} +
    + {/* */} + + {/* */} + + {/* */} +
    + {/* */} + {/* */} + + {/* */} +
    +
    + {children} +
    +
    + {/* */} +
    + {/* */} +
    + {/* */} + + ); +} diff --git a/src/components/Maps/MapOne.tsx b/src/components/Maps/MapOne.tsx new file mode 100644 index 0000000..c9c5f2d --- /dev/null +++ b/src/components/Maps/MapOne.tsx @@ -0,0 +1,64 @@ +"use client"; +import jsVectorMap from "jsvectormap"; +import "jsvectormap/dist/jsvectormap.css"; +import React, { useEffect } from "react"; +import "../../js/us-aea-en"; + +const MapOne: React.FC = () => { + useEffect(() => { + const mapOne = new jsVectorMap({ + selector: "#mapOne", + map: "us_aea_en", + zoomButtons: true, + + regionStyle: { + initial: { + fill: "#C8D0D8", + }, + hover: { + fillOpacity: 1, + fill: "#3056D3", + }, + }, + regionLabelStyle: { + initial: { + fontFamily: "Satoshi", + fontWeight: "semibold", + fill: "#fff", + }, + hover: { + cursor: "pointer", + }, + }, + + labels: { + regions: { + render(code: string) { + return code.split("-")[1]; + }, + }, + }, + }); + + return () => { + const map = document.getElementById("mapOne"); + if (map) { + map.innerHTML = ""; + } + // mapOne.destroy(); + }; + }, []); + + return ( +
    +

    + Region labels +

    +
    +
    +
    +
    + ); +}; + +export default MapOne; diff --git a/src/components/SelectGroup/SelectGroupOne.tsx b/src/components/SelectGroup/SelectGroupOne.tsx new file mode 100644 index 0000000..c6c86f6 --- /dev/null +++ b/src/components/SelectGroup/SelectGroupOne.tsx @@ -0,0 +1,68 @@ +"use client"; +import React, { useState } from "react"; + +const SelectGroupOne: React.FC = () => { + const [selectedOption, setSelectedOption] = useState(""); + const [isOptionSelected, setIsOptionSelected] = useState(false); + + const changeTextColor = () => { + setIsOptionSelected(true); + }; + + return ( +
    + + +
    + + + + + + + + + +
    +
    + ); +}; + +export default SelectGroupOne; diff --git a/src/components/SelectGroup/SelectGroupTwo.tsx b/src/components/SelectGroup/SelectGroupTwo.tsx new file mode 100644 index 0000000..ccdfb0f --- /dev/null +++ b/src/components/SelectGroup/SelectGroupTwo.tsx @@ -0,0 +1,97 @@ +"use client"; +import React, { useState } from "react"; + +const SelectGroupTwo: React.FC = () => { + const [selectedOption, setSelectedOption] = useState(""); + const [isOptionSelected, setIsOptionSelected] = useState(false); + + const changeTextColor = () => { + setIsOptionSelected(true); + }; + + return ( +
    + + +
    + + + + + + + + + + + + + + + + + + + +
    +
    + ); +}; + +export default SelectGroupTwo; diff --git a/src/components/Sidebar/SidebarDropdown.tsx b/src/components/Sidebar/SidebarDropdown.tsx new file mode 100644 index 0000000..f492ace --- /dev/null +++ b/src/components/Sidebar/SidebarDropdown.tsx @@ -0,0 +1,28 @@ +import React from "react"; +import Link from "next/link"; +import { usePathname } from "next/navigation"; + +const SidebarDropdown = ({ item }: any) => { + const pathname = usePathname(); + + return ( + <> +
      + {item.map((item: any, index: number) => ( +
    • + + {item.label} + +
    • + ))} +
    + + ); +}; + +export default SidebarDropdown; diff --git a/src/components/Sidebar/SidebarItem.tsx b/src/components/Sidebar/SidebarItem.tsx new file mode 100644 index 0000000..9f18494 --- /dev/null +++ b/src/components/Sidebar/SidebarItem.tsx @@ -0,0 +1,70 @@ +import React from "react"; +import Link from "next/link"; +import SidebarDropdown from "@/components/Sidebar/SidebarDropdown"; +import { usePathname } from "next/navigation"; + +const SidebarItem = ({ item, pageName, setPageName }: any) => { + const handleClick = () => { + const updatedPageName = + pageName !== item.label.toLowerCase() ? item.label.toLowerCase() : ""; + return setPageName(updatedPageName); + }; + + const pathname = usePathname(); + + const isActive = (item: any) => { + if (item.route === pathname) return true; + if (item.children) { + return item.children.some((child: any) => isActive(child)); + } + return false; + }; + + const isItemActive = isActive(item); + + return ( + <> +
  • + + {item.icon} + {item.label} + {item.children && ( + + + + )} + + + {item.children && ( +
    + +
    + )} +
  • + + ); +}; + +export default SidebarItem; diff --git a/src/components/Sidebar/index.tsx b/src/components/Sidebar/index.tsx new file mode 100644 index 0000000..64e73ed --- /dev/null +++ b/src/components/Sidebar/index.tsx @@ -0,0 +1,436 @@ +"use client"; + +import React, { useEffect, useRef, useState } from "react"; +import { usePathname } from "next/navigation"; +import Link from "next/link"; +import Image from "next/image"; +import SidebarItem from "@/components/Sidebar/SidebarItem"; +import ClickOutside from "@/components/ClickOutside"; +import useLocalStorage from "@/hooks/useLocalStorage"; + +interface SidebarProps { + sidebarOpen: boolean; + setSidebarOpen: (arg: boolean) => void; +} + +const menuGroups = [ + { + name: "MENU", + menuItems: [ + { + icon: ( + + + + + + + ), + label: "Dashboard", + route: "#", + children: [{ label: "eCommerce", route: "/" }], + }, + { + icon: ( + + + + ), + label: "Calendar", + route: "/calendar", + }, + { + icon: ( + + + + + ), + label: "Profile", + route: "/profile", + }, + { + icon: ( + + + + + + + + ), + label: "Forms", + route: "#", + children: [ + { label: "Form Elements", route: "/forms/form-elements" }, + { label: "Form Layout", route: "/forms/form-layout" }, + ], + }, + { + icon: ( + + + + + + + + + + + ), + label: "Tables", + route: "/tables", + }, + { + icon: ( + + + + + + + + + + + + ), + label: "Settings", + route: "/settings", + }, + ], + }, + { + name: "OTHERS", + menuItems: [ + { + icon: ( + + + + + + + + + + + + ), + label: "Chart", + route: "/chart", + }, + { + icon: ( + + + + + + + + + + + + + ), + label: "UI Elements", + route: "#", + children: [ + { label: "Alerts", route: "/ui/alerts" }, + { label: "Buttons", route: "/ui/buttons" }, + ], + }, + { + icon: ( + + + + + + + + + + + + ), + label: "Authentication", + route: "#", + children: [ + { label: "Sign In", route: "/auth/signin" }, + { label: "Sign Up", route: "/auth/signup" }, + ], + }, + ], + }, +]; + +const Sidebar = ({ sidebarOpen, setSidebarOpen }: SidebarProps) => { + const pathname = usePathname(); + const [pageName, setPageName] = useLocalStorage("selectedMenu", "dashboard"); + + return ( + setSidebarOpen(false)}> + + + ); +}; + +export default Sidebar; diff --git a/src/components/Switchers/SwitcherFour.tsx b/src/components/Switchers/SwitcherFour.tsx new file mode 100644 index 0000000..fba0c8c --- /dev/null +++ b/src/components/Switchers/SwitcherFour.tsx @@ -0,0 +1,33 @@ +import { useState } from "react"; + +const SwitcherFour = () => { + const [enabled, setEnabled] = useState(false); + + return ( +
    + +
    + ); +}; + +export default SwitcherFour; diff --git a/src/components/Switchers/SwitcherOne.tsx b/src/components/Switchers/SwitcherOne.tsx new file mode 100644 index 0000000..5fbffbd --- /dev/null +++ b/src/components/Switchers/SwitcherOne.tsx @@ -0,0 +1,33 @@ +import { useState } from "react"; + +const SwitcherOne = () => { + const [enabled, setEnabled] = useState(false); + + return ( +
    + +
    + ); +}; + +export default SwitcherOne; diff --git a/src/components/Switchers/SwitcherThree.tsx b/src/components/Switchers/SwitcherThree.tsx new file mode 100644 index 0000000..6cda5e4 --- /dev/null +++ b/src/components/Switchers/SwitcherThree.tsx @@ -0,0 +1,66 @@ +import { useState } from "react"; + +const SwitcherThree = () => { + const [enabled, setEnabled] = useState(false); + + return ( +
    + +
    + ); +}; + +export default SwitcherThree; diff --git a/src/components/Switchers/SwitcherTwo.tsx b/src/components/Switchers/SwitcherTwo.tsx new file mode 100644 index 0000000..f483fc8 --- /dev/null +++ b/src/components/Switchers/SwitcherTwo.tsx @@ -0,0 +1,33 @@ +import { useState } from "react"; + +const SwitcherTwo = () => { + const [enabled, setEnabled] = useState(false); + + return ( +
    + +
    + ); +}; + +export default SwitcherTwo; diff --git a/src/components/Tables/TableFour.tsx b/src/components/Tables/TableFour.tsx new file mode 100644 index 0000000..60d21e2 --- /dev/null +++ b/src/components/Tables/TableFour.tsx @@ -0,0 +1,124 @@ +import { BRAND } from "@/types/brand"; +import Image from "next/image"; +import DropdownDefault from "../Dropdowns/DropdownDefault"; + +const brandData: BRAND[] = [ + { + logo: "/images/brand/brand-01.svg", + name: "Google", + visitors: 3.5, + revenues: "5,768", + sales: 590, + conversion: 4.8, + }, + { + logo: "/images/brand/brand-02.svg", + name: "Twitter", + visitors: 2.2, + revenues: "4,635", + sales: 467, + conversion: 4.3, + }, + { + logo: "/images/brand/brand-06.svg", + name: "Youtube", + visitors: 2.1, + revenues: "4,290", + sales: 420, + conversion: 3.7, + }, + { + logo: "/images/brand/brand-04.svg", + name: "Vimeo", + visitors: 1.5, + revenues: "3,580", + sales: 389, + conversion: 2.5, + }, + { + logo: "/images/brand/brand-05.svg", + name: "Facebook", + visitors: 3.5, + revenues: "6,768", + sales: 390, + conversion: 4.2, + }, +]; + +const TableFour: React.FC = () => { + return ( +
    +
    +
    +
    +

    + Top Channels +

    +
    + +
    + +
    +
    +
    +
    + Source +
    +
    +
    +
    + Visitors +
    +
    +
    +
    + Revenues +
    +
    +
    +
    + Conversion +
    +
    +
    + + {brandData.map((brand, key) => ( +
    +
    +
    + Brand +
    +

    + {brand.name} +

    +
    + +
    +

    + {brand.visitors}K +

    +
    + +
    +

    ${brand.revenues}

    +
    + +
    +

    {brand.conversion}%

    +
    +
    + ))} +
    +
    +
    + ); +}; + +export default TableFour; diff --git a/src/components/Tables/TableOne.tsx b/src/components/Tables/TableOne.tsx new file mode 100644 index 0000000..83ad835 --- /dev/null +++ b/src/components/Tables/TableOne.tsx @@ -0,0 +1,123 @@ +import { BRAND } from "@/types/brand"; +import Image from "next/image"; + +const brandData: BRAND[] = [ + { + logo: "/images/brand/brand-01.svg", + name: "Google", + visitors: 3.5, + revenues: "5,768", + sales: 590, + conversion: 4.8, + }, + { + logo: "/images/brand/brand-02.svg", + name: "Twitter", + visitors: 2.2, + revenues: "4,635", + sales: 467, + conversion: 4.3, + }, + { + logo: "/images/brand/brand-03.svg", + name: "Github", + visitors: 2.1, + revenues: "4,290", + sales: 420, + conversion: 3.7, + }, + { + logo: "/images/brand/brand-04.svg", + name: "Vimeo", + visitors: 1.5, + revenues: "3,580", + sales: 389, + conversion: 2.5, + }, + { + logo: "/images/brand/brand-05.svg", + name: "Facebook", + visitors: 3.5, + revenues: "6,768", + sales: 390, + conversion: 4.2, + }, +]; + +const TableOne = () => { + return ( +
    +

    + Top Channels +

    + +
    +
    +
    +
    + Source +
    +
    +
    +
    + Visitors +
    +
    +
    +
    + Revenues +
    +
    +
    +
    + Sales +
    +
    +
    +
    + Conversion +
    +
    +
    + + {brandData.map((brand, key) => ( +
    +
    +
    + Brand +
    +

    + {brand.name} +

    +
    + +
    +

    {brand.visitors}K

    +
    + +
    +

    ${brand.revenues}

    +
    + +
    +

    {brand.sales}

    +
    + +
    +

    {brand.conversion}%

    +
    +
    + ))} +
    +
    + ); +}; + +export default TableOne; diff --git a/src/components/Tables/TableThree.tsx b/src/components/Tables/TableThree.tsx new file mode 100644 index 0000000..bd01c6e --- /dev/null +++ b/src/components/Tables/TableThree.tsx @@ -0,0 +1,156 @@ +import { Package } from "@/types/package"; + +const packageData: Package[] = [ + { + name: "Free package", + price: 0.0, + invoiceDate: `Jan 13,2023`, + status: "Paid", + }, + { + name: "Standard Package", + price: 59.0, + invoiceDate: `Jan 13,2023`, + status: "Paid", + }, + { + name: "Business Package", + price: 99.0, + invoiceDate: `Jan 13,2023`, + status: "Unpaid", + }, + { + name: "Standard Package", + price: 59.0, + invoiceDate: `Jan 13,2023`, + status: "Pending", + }, +]; + +const TableThree = () => { + return ( +
    +
    + + + + + + + + + + + {packageData.map((packageItem, key) => ( + + + + + + + ))} + +
    + Package + + Invoice date + + Status + + Actions +
    +
    + {packageItem.name} +
    +

    ${packageItem.price}

    +
    +

    + {packageItem.invoiceDate} +

    +
    +

    + {packageItem.status} +

    +
    +
    + + + +
    +
    +
    +
    + ); +}; + +export default TableThree; diff --git a/src/components/Tables/TableTwo.tsx b/src/components/Tables/TableTwo.tsx new file mode 100644 index 0000000..f04ab86 --- /dev/null +++ b/src/components/Tables/TableTwo.tsx @@ -0,0 +1,108 @@ +import Image from "next/image"; +import { Product } from "@/types/product"; + +const productData: Product[] = [ + { + image: "/images/product/product-01.png", + name: "Apple Watch Series 7", + category: "Electronics", + price: 296, + sold: 22, + profit: 45, + }, + { + image: "/images/product/product-02.png", + name: "Macbook Pro M1", + category: "Electronics", + price: 546, + sold: 12, + profit: 125, + }, + { + image: "/images/product/product-03.png", + name: "Dell Inspiron 15", + category: "Electronics", + price: 443, + sold: 64, + profit: 247, + }, + { + image: "/images/product/product-04.png", + name: "HP Probook 450", + category: "Electronics", + price: 499, + sold: 72, + profit: 103, + }, +]; + +const TableTwo = () => { + return ( +
    +
    +

    + Top Products +

    +
    + +
    +
    +

    Product Name

    +
    +
    +

    Category

    +
    +
    +

    Price

    +
    +
    +

    Sold

    +
    +
    +

    Profit

    +
    +
    + + {productData.map((product, key) => ( +
    +
    +
    +
    + Product +
    +

    + {product.name} +

    +
    +
    +
    +

    + {product.category} +

    +
    +
    +

    + ${product.price} +

    +
    +
    +

    {product.sold}

    +
    +
    +

    ${product.profit}

    +
    +
    + ))} +
    + ); +}; + +export default TableTwo; diff --git a/src/components/common/Loader/index.tsx b/src/components/common/Loader/index.tsx new file mode 100644 index 0000000..5e4d3a6 --- /dev/null +++ b/src/components/common/Loader/index.tsx @@ -0,0 +1,9 @@ +const Loader = () => { + return ( +
    +
    +
    + ); +}; + +export default Loader; diff --git a/src/components/localstoragehandler.tsx b/src/components/localstoragehandler.tsx new file mode 100644 index 0000000..e1f0b20 --- /dev/null +++ b/src/components/localstoragehandler.tsx @@ -0,0 +1,30 @@ +import { useEffect, useState } from "react"; + +function useLocalStorage(itemName, initialValue) { + const [item, setItem] = useState(initialValue); + useEffect(() => { + const localStorageItem = localStorage.getItem(itemName); + let parsedItem; + + if (!localStorageItem) { + localStorage.setItem(itemName, JSON.stringify(initialValue)); + parsedItem = initialValue; + } else { + parsedItem = JSON.parse(localStorageItem); + } + setItem(parsedItem); + }, []); + + const saveItem = (newItem) => { + const stringifiedItem = JSON.stringify(newItem); + localStorage.setItem(itemName, stringifiedItem); + setItem(newItem); + }; + + return { + item, + saveItem, + }; +} + +export { useLocalStorage }; diff --git a/src/components/login/loginbutton.tsx b/src/components/login/loginbutton.tsx new file mode 100644 index 0000000..0d665cf --- /dev/null +++ b/src/components/login/loginbutton.tsx @@ -0,0 +1,22 @@ +"use client"; +import React from "react"; +import { Button } from "@/components/ui/button"; +import { useRouter } from "next/navigation"; + +const LoginButton: React.FC = () => { + const router = useRouter(); + const onClick = () => { + router.push("/login/email"); + }; + return ( + + ); +}; + +export default LoginButton; diff --git a/src/components/login/loginemployee.tsx b/src/components/login/loginemployee.tsx new file mode 100644 index 0000000..3a24cbc --- /dev/null +++ b/src/components/login/loginemployee.tsx @@ -0,0 +1,29 @@ +"use server"; +import React from "react"; +import LoginSelectEmployee from "./loginselectemployee"; +import { + retrieve_access_objects, + retrieve_access_token, +} from "@/apicalls/cookies/token"; + +const LoginEmployeeCard: React.FC = async () => { + const accessObject: any = await retrieve_access_objects(); + const accessToken: any = await retrieve_access_token(); + return ( + <> +
    +

    + Şirket Seçimi Yapınız +

    +
    + +
    +
    + + ); +}; + +export default LoginEmployeeCard; diff --git a/src/components/login/loginoccupant.tsx b/src/components/login/loginoccupant.tsx new file mode 100644 index 0000000..afd99cb --- /dev/null +++ b/src/components/login/loginoccupant.tsx @@ -0,0 +1,30 @@ +"use server"; +import React from "react"; +import LoginSelectOccupant from "./loginselectoccupant"; +import { + retrieve_access_objects, + retrieve_access_token, +} from "@/apicalls/cookies/token"; + +const LoginOccupantCard: React.FC = async () => { + const accessObject: any = await retrieve_access_objects(); + const accessToken: any = await retrieve_access_token(); + + return ( + <> +
    +

    + Görev Seçimi Yapınız +

    +
    + +
    +
    + + ); +}; + +export default LoginOccupantCard; diff --git a/src/components/login/loginselectemployee.tsx b/src/components/login/loginselectemployee.tsx new file mode 100644 index 0000000..6500395 --- /dev/null +++ b/src/components/login/loginselectemployee.tsx @@ -0,0 +1,91 @@ +"use client"; +import Image from "next/image"; + +import { Toaster } from "@/components/ui/toaster"; +import { useToast } from "@/hooks/use-toast"; +import { showToast } from "./toaster"; +import { useRouter } from "next/navigation"; +import { login_select_employee } from "@/apicalls/login/login"; + +interface CompanyList { + company_list: Array; + access_token: string; +} + +const LoginSelectEmployee: React.FC = ({ + company_list, + access_token, +}) => { + const { toast } = useToast(); + const router = useRouter(); + const companiesList = company_list || []; + const onClick = (data: any) => { + login_select_employee({ company_uu_id: data?.uu_id, token: access_token }) + .then((responseData: any) => { + if (responseData?.completed) { + showToast(toast, "Şirket seçimi", { + message: "Şirket seçimi başarılı", + data: JSON.stringify(responseData), + }); + router.push("/dashboard"); + } + }) + .catch((error) => { + console.error(error); + showToast(toast, "Şirket seçimi", { + message: "Şirket seçimi başarılı", + data: JSON.stringify(error), + }); + }); + }; + + return ( + <> +
    +
    + +
    +
    + {companiesList.map((data: any, index: number) => ( +
    +
    onClick(data)} + > +
    + {`Evyos +
    +
    +

    + UUID : {data.uu_id} +

    +

    + Şirket Unvanı : {data.public_name} +

    +

    + Şirket Tipi Name : {data.company_type} +

    +

    + Adres :{" "} + {data.company_address + ? data.company_address + : "Tanımlı Değil"} +

    +
    +
    +
    + ))} +
    +
    + + ); +}; + +export default LoginSelectEmployee; diff --git a/src/components/login/loginselectoccupant.tsx b/src/components/login/loginselectoccupant.tsx new file mode 100644 index 0000000..88f067a --- /dev/null +++ b/src/components/login/loginselectoccupant.tsx @@ -0,0 +1,164 @@ +"use client"; +import React from "react"; +import Image from "next/image"; +import { Toaster } from "@/components/ui/toaster"; +import { useToast } from "@/hooks/use-toast"; +import { showToast } from "./toaster"; +import { login_select_occupant } from "@/apicalls/login/login"; +import { useRouter } from "next/navigation"; + +interface LoginSelectOccupantProps { + access_token: string; + available_occupants: Array; +} + +const LoginSelectOccupant: React.FC = ({ + access_token, + available_occupants, +}) => { + const { toast } = useToast(); + const router = useRouter(); + const [activeBuildingList, setActiveBuildingList] = React.useState([]); + const [activeOccupantList, setactiveOccupantList] = React.useState([]); + const [isBuildingSelected, setIsBuildingSelected] = React.useState(false); + const [selectedBuilding, setselectedBuilding] = React.useState(""); + + const onClickBuild = (data: any) => { + setselectedBuilding(data.build_uu_id); + setIsBuildingSelected(true); + }; + + const onClick = (data: any) => { + login_select_occupant({ + build_part_uu_id: data?.part_uu_id, + occupant_uu_id: data?.uu_id, + token: access_token, + }) + .then((responseData: any) => { + if (responseData?.completed) { + showToast(toast, "Şirket seçimi", { + message: "Şirket seçimi başarılı", + data: JSON.stringify(responseData), + }); + router.push("/dashboard"); + } + }) + .catch((error) => { + console.error(error); + showToast(toast, "Şirket seçimi", { + message: "Şirket seçimi başarılı", + data: JSON.stringify(error), + }); + }); + }; + if (!isBuildingSelected) { + for (const [key, value] of Object.entries(available_occupants)) { + const building = JSON.parse( + JSON.stringify({ + build_uu_id: value?.build_uu_id, + build_name: value?.build_name, + build_no: value?.build_no, + }) + ); + const isNotInList = + activeBuildingList || + [].some((item) => JSON.stringify(item) === JSON.stringify(building)); + if (!isNotInList) { + setActiveBuildingList(activeBuildingList.push(building)); + } else if (activeBuildingList.length === 0) { + setActiveBuildingList([building]); + } + } + } else if (isBuildingSelected && activeOccupantList.length === 0) { + for (const [key, value] of Object.entries(available_occupants)) { + const occupants = value?.occupants; + if (value?.build_uu_id === selectedBuilding) { + setactiveOccupantList(occupants); + } + } + } + + return ( + <> +
    +
    + +
    + {!isBuildingSelected ? ( +
    + {activeBuildingList.map((data: any) => ( +
    onClickBuild(data)} + key={data.build_uu_id} + > +
    + {`Evyos +
    +
    +

    + UUID : {data.build_uu_id} +

    +

    + Bina : {data.build_name} +

    +

    + Bina No : {data.build_no} +

    + {/*

    + Adres :{" "} + {data.company_address + ? data.company_address + : "Tanımlı Değil"} +

    */} +
    +
    + ))} +
    + ) : ( +
    + {activeOccupantList.map((data: any) => ( +
    onClick(data)} + > +
    + {`Evyos +
    +
    +

    + UUID : {data.part_uu_id} +

    +

    + Bina : {data.part_name} +

    +

    + Daire Kat : {data.part_level} +

    +

    + Giriş Tipi : {data.code} - {data.description} +

    +
    +
    + ))} +
    + )} +
    + + ); +}; + +export default LoginSelectOccupant; diff --git a/src/components/login/loginwithemail.tsx b/src/components/login/loginwithemail.tsx new file mode 100644 index 0000000..d8ed259 --- /dev/null +++ b/src/components/login/loginwithemail.tsx @@ -0,0 +1,440 @@ +"use client"; + +import { useToast } from "@/hooks/use-toast"; +import { Toaster } from "@/components/ui/toaster"; +import { set, useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import * as z from "zod"; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { Switch } from "@/components/ui/switch"; +import { Button } from "@/components/ui/button"; +import { PasswordInput } from "@/components/ui/password-input"; + +import { useRouter } from "next/navigation"; +import { showToast } from "./toaster"; +import { login_via_access_keys } from "@/apicalls/login/login"; +import { Link } from "lucide-react"; +import Image from "next/image"; + +const formSchema = z.object({ + loginEmailInput: z + .string() + .min(4, { message: "Email adresi minimum 4 karaterden oluşmalıdır" }) + .email("Geçerli bir mail adresi giriniz") + .default(""), + loginPassword: z + .string() + .min(5, { message: "Şifre 6 karakterden az olamaz" }) + .default(""), + loginRememberMe: z.boolean().optional().default(false), +}); + +const LoginWithEmail: React.FC = () => { + const { toast } = useToast(); + const router = useRouter(); + + const form = useForm>({ + resolver: zodResolver(formSchema), + }); + + function onSubmit(values: z.infer) { + login_via_access_keys({ + domain: "evyos.com.tr", + accessKey: values.loginEmailInput, + password: values.loginPassword, + rememberMe: values.loginRememberMe, + }) + .then((res: any) => { + if (res?.completed) { + showToast(toast, "Giriş başarılı", { + message: res?.message, + data: res?.user, + }); + setTimeout(() => { + router.push("/login/select"); + }, 3000); + } + }) + .catch((error) => { + console.error(error); + showToast(toast, "Giriş başarısız", { + message: "Kullanıcı adı veya şifre hatalı", + data: JSON.stringify(error.code), + }); + }); + } + + return ( + <> +
    +
    +
    +
    +
    +
    + + Logo + Logo + + +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit + suspendisse. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + Start for free + +

    + Mail ile Giriş Yap +

    +
    + +
    + +
    + ( + + + + + + + )} + /> + + + + + + + +
    + +
    + + + + + + + +
    +
    + +
    + + ( + + + + + + Şifrenizi giriniz + + + + )} + /> +
    + + + + + + + + +
    +
    + ( + +
    + + Beni Hatırla + +
    + + + +
    + )} + /> + +
    + +
    + + + + +
    + +
    +
    +
    +
    +
    +
    +
    + + + ); +}; + +export default LoginWithEmail; diff --git a/src/components/login/loginwithephone.tsx b/src/components/login/loginwithephone.tsx new file mode 100644 index 0000000..65489f5 --- /dev/null +++ b/src/components/login/loginwithephone.tsx @@ -0,0 +1,131 @@ +"use client"; +import { useToast } from "@/hooks/use-toast"; +import { Toaster } from "@/components/ui/toaster"; + +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import * as z from "zod"; +import { Button } from "@/components/ui/button"; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { PhoneInput } from "@/components/ui/phone-input"; +import { PasswordInput } from "@/components/ui/password-input"; +import { Switch } from "@/components/ui/switch"; + +import { useRouter } from "next/navigation"; +import { showToast } from "./toaster"; + +const formSchema = z.object({ + loginPhone: z + .string() + .min(10, { message: "Telefon numarası 10 karakterden az olamaz" }) + .max(14, { message: "Telefon numarası 14 karakterden fazla olamaz" }) + .default(""), + loginPassword: z + .string() + .min(5, { message: "Şifre 6 karakterden az olamaz" }) + .default(""), + loginRememberMe: z.boolean().optional().default(false), +}); + +const LoginWithPhone: React.FC = () => { + const { toast } = useToast(); + const router = useRouter(); + + const form = useForm>({ + resolver: zodResolver(formSchema), + }); + + function onSubmit(values: z.infer) { + showToast(toast, "Form submitted", values, "success"); + router.push("/login/select"); + } + + return ( + <> +
    + + ( + + Phone number + + + + + Telefonunuzu girerek giriş yapabilirsiniz + + + + )} + /> + + ( + + Şifre + + + + Şifrenizi giriniz + + + )} + /> + + ( + +
    + Beni Hatırla +
    + + + +
    + )} + /> + + + + + + + ); +}; + +export default LoginWithPhone; diff --git a/src/components/login/toaster.tsx b/src/components/login/toaster.tsx new file mode 100644 index 0000000..8ba7fb3 --- /dev/null +++ b/src/components/login/toaster.tsx @@ -0,0 +1,25 @@ +import React from "react"; + +export function showToast( + toast: any, + message: string, + data: any, + type: "success" | "error" | "info" | "warning" = "info" +) { + try { + toast({ + variant: type, + title: message, + description: ( +
    +          
    +            {JSON.stringify(data || { message: "No data provided" }, null, 2)}
    +          
    +        
    + ), + }); + } catch (error) { + console.error("Form submission error", error); + toast.error("Failed to submit the form. Please try again."); + } +} diff --git a/src/components/ui/avatar.tsx b/src/components/ui/avatar.tsx new file mode 100644 index 0000000..51e507b --- /dev/null +++ b/src/components/ui/avatar.tsx @@ -0,0 +1,50 @@ +"use client" + +import * as React from "react" +import * as AvatarPrimitive from "@radix-ui/react-avatar" + +import { cn } from "@/lib/utils" + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Avatar.displayName = AvatarPrimitive.Root.displayName + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AvatarImage.displayName = AvatarPrimitive.Image.displayName + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName + +export { Avatar, AvatarImage, AvatarFallback } diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx new file mode 100644 index 0000000..65d4fcd --- /dev/null +++ b/src/components/ui/button.tsx @@ -0,0 +1,57 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/src/components/ui/command.tsx b/src/components/ui/command.tsx new file mode 100644 index 0000000..2cecd91 --- /dev/null +++ b/src/components/ui/command.tsx @@ -0,0 +1,153 @@ +"use client" + +import * as React from "react" +import { type DialogProps } from "@radix-ui/react-dialog" +import { Command as CommandPrimitive } from "cmdk" +import { Search } from "lucide-react" + +import { cn } from "@/lib/utils" +import { Dialog, DialogContent } from "@/components/ui/dialog" + +const Command = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Command.displayName = CommandPrimitive.displayName + +const CommandDialog = ({ children, ...props }: DialogProps) => { + return ( + + + + {children} + + + + ) +} + +const CommandInput = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
    + + +
    +)) + +CommandInput.displayName = CommandPrimitive.Input.displayName + +const CommandList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandList.displayName = CommandPrimitive.List.displayName + +const CommandEmpty = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>((props, ref) => ( + +)) + +CommandEmpty.displayName = CommandPrimitive.Empty.displayName + +const CommandGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandGroup.displayName = CommandPrimitive.Group.displayName + +const CommandSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +CommandSeparator.displayName = CommandPrimitive.Separator.displayName + +const CommandItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandItem.displayName = CommandPrimitive.Item.displayName + +const CommandShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +CommandShortcut.displayName = "CommandShortcut" + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +} diff --git a/src/components/ui/dialog.tsx b/src/components/ui/dialog.tsx new file mode 100644 index 0000000..1647513 --- /dev/null +++ b/src/components/ui/dialog.tsx @@ -0,0 +1,122 @@ +"use client" + +import * as React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
    +) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
    +) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogTrigger, + DialogClose, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} diff --git a/src/components/ui/form.tsx b/src/components/ui/form.tsx new file mode 100644 index 0000000..b6daa65 --- /dev/null +++ b/src/components/ui/form.tsx @@ -0,0 +1,178 @@ +"use client" + +import * as React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { Slot } from "@radix-ui/react-slot" +import { + Controller, + ControllerProps, + FieldPath, + FieldValues, + FormProvider, + useFormContext, +} from "react-hook-form" + +import { cn } from "@/lib/utils" +import { Label } from "@/components/ui/label" + +const Form = FormProvider + +type FormFieldContextValue< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath +> = { + name: TName +} + +const FormFieldContext = React.createContext( + {} as FormFieldContextValue +) + +const FormField = < + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath +>({ + ...props +}: ControllerProps) => { + return ( + + + + ) +} + +const useFormField = () => { + const fieldContext = React.useContext(FormFieldContext) + const itemContext = React.useContext(FormItemContext) + const { getFieldState, formState } = useFormContext() + + const fieldState = getFieldState(fieldContext.name, formState) + + if (!fieldContext) { + throw new Error("useFormField should be used within ") + } + + const { id } = itemContext + + return { + id, + name: fieldContext.name, + formItemId: `${id}-form-item`, + formDescriptionId: `${id}-form-item-description`, + formMessageId: `${id}-form-item-message`, + ...fieldState, + } +} + +type FormItemContextValue = { + id: string +} + +const FormItemContext = React.createContext( + {} as FormItemContextValue +) + +const FormItem = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + const id = React.useId() + + return ( + +
    + + ) +}) +FormItem.displayName = "FormItem" + +const FormLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + const { error, formItemId } = useFormField() + + return ( +