From b66f5cf08505f1e13961d4e72331e24ddc162fb1 Mon Sep 17 00:00:00 2001 From: dharaneesh-r Date: Tue, 14 Jul 2026 12:15:40 +0530 Subject: [PATCH] Revert "updates on the ui changes" This reverts commit 298fc603a09d1cab245e5ca3acb3d3ba644a05d2. --- package-lock.json | 1817 ++++++++++--------- package.json | 13 +- public/navbarLogo.png | Bin 83551 -> 0 bytes src/App.jsx | 10 +- src/app/dashboard-ref/page.tsx | 808 --------- src/app/login-sso/page.tsx | 285 --- src/app/settings-sidebar/page.tsx | 855 --------- src/app/table-page/page.tsx | 441 ----- src/components/EmptyState.jsx | 34 +- src/components/Logo.jsx | 46 +- src/components/PageHeader.jsx | 54 +- src/components/StatCard.jsx | 136 +- src/components/StatusChip.jsx | 83 +- src/components/TabLabelCount.jsx | 24 +- src/components/UserAvatar.jsx | 9 +- src/components/charts/DonutChart.jsx | 46 +- src/index.css | 177 -- src/layout/MainLayout/Header.jsx | 267 ++- src/layout/MainLayout/Sidebar.jsx | 342 ++-- src/layout/MainLayout/index.jsx | 65 +- src/layout/MinimalLayout.jsx | 5 +- src/main.jsx | 30 +- src/menu/navItems.jsx | 20 +- src/pages/Dashboard.jsx | 495 ++--- src/pages/Settings.jsx | 518 +++--- src/pages/auth/Login.jsx | 263 +-- src/pages/bookings/Bookings.jsx | 699 +++---- src/pages/maintenance/ComingSoon.jsx | 97 +- src/pages/maintenance/Error404.jsx | 41 +- src/pages/maintenance/Error500.jsx | 41 +- src/pages/maintenance/UnderConstruction.jsx | 52 +- src/pages/pricing/Pricing.jsx | 821 ++++----- src/pages/survey/Survey.jsx | 1121 ++++++------ src/pages/team/TeamUsers.jsx | 497 +++-- src/pages/team/UserFormDialog.jsx | 99 +- src/pages/tenants/ClientFormDialog.jsx | 249 +-- src/pages/tenants/Tenants.jsx | 869 +++++---- src/theme/componentsOverride.js | 121 ++ src/theme/index.js | 20 + src/theme/palette.js | 102 ++ src/theme/shadows.js | 14 + src/theme/typography.js | 25 + src/utils/mappers.js | 2 +- vite.config.js | 1 - 44 files changed, 4661 insertions(+), 7053 deletions(-) delete mode 100644 public/navbarLogo.png delete mode 100644 src/app/dashboard-ref/page.tsx delete mode 100644 src/app/login-sso/page.tsx delete mode 100644 src/app/settings-sidebar/page.tsx delete mode 100644 src/app/table-page/page.tsx delete mode 100644 src/index.css create mode 100644 src/theme/componentsOverride.js create mode 100644 src/theme/index.js create mode 100644 src/theme/palette.js create mode 100644 src/theme/shadows.js create mode 100644 src/theme/typography.js diff --git a/package-lock.json b/package-lock.json index e3e85a8..6df2d0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,15 @@ "name": "doormile-console-admin", "version": "1.0.0", "dependencies": { - "@astryxdesign/cli": "^0.1.2", - "@astryxdesign/core": "^0.1.2", - "@astryxdesign/theme-neutral": "^0.1.2", + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/icons-material": "^5.15.20", + "@mui/lab": "^5.0.0-alpha.170", + "@mui/material": "^5.15.20", + "@mui/x-date-pickers": "^6.20.2", "dayjs": "^1.11.11", - "react": "^19.2.7", - "react-dom": "^19.2.7", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-router-dom": "^6.23.1" }, "devDependencies": { @@ -21,66 +24,6 @@ "vite": "^5.3.1" } }, - "node_modules/@astryxdesign/cli": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@astryxdesign/cli/-/cli-0.1.2.tgz", - "integrity": "sha512-I4VlPGQRI7PTMcjBRX1hj/wB/KCHU8wd8NbqF1p/McAPgj0A5k72lyJFzH+IAA+ciaef5NMdakvovzbfJGPcSw==", - "license": "MIT", - "dependencies": { - "@clack/prompts": "^1.5.1", - "commander": "^12.1.0", - "jiti": "^2.7.0", - "jscodeshift": "^17.3.0", - "zod": "^4.4.3" - }, - "bin": { - "astryx": "bin/astryx.mjs", - "cli": "bin/astryx.mjs" - }, - "peerDependencies": { - "@astryxdesign/core": "*", - "@astryxdesign/lab": "*", - "@astryxdesign/theme-neutral": "*", - "gpt-tokenizer": "^2.0.0" - }, - "peerDependenciesMeta": { - "@astryxdesign/core": { - "optional": true - }, - "@astryxdesign/lab": { - "optional": true - }, - "@astryxdesign/theme-neutral": { - "optional": true - } - } - }, - "node_modules/@astryxdesign/core": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@astryxdesign/core/-/core-0.1.2.tgz", - "integrity": "sha512-SJOEXUaRvcVgGbdPwV5UL5aYMbwIl09H2yQb3hPh4NNGWqmLTHE05IFTNRi37Mk9ywoo01+UM2ZrewmJe39f0A==", - "license": "MIT", - "dependencies": { - "@stylexjs/stylex": "^0.18.3" - }, - "peerDependencies": { - "react": ">=19.0.0", - "react-dom": ">=19.0.0" - } - }, - "node_modules/@astryxdesign/theme-neutral": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@astryxdesign/theme-neutral/-/theme-neutral-0.1.2.tgz", - "integrity": "sha512-kEBBJ7O5H+27IACsGEqZSEVFy2r4VlBu4Vzfm/LOJ/Ez6C/RBTCXq9Iu8CoZS4Qt/WkYUvqLPDiJlgXuALy9uQ==", - "license": "MIT", - "dependencies": { - "lucide-react": "^1.18.0" - }, - "peerDependencies": { - "@astryxdesign/core": "0.1.2", - "react": ">=19" - } - }, "node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", @@ -99,6 +42,7 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -108,6 +52,7 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", @@ -138,6 +83,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, "license": "MIT" }, "node_modules/@babel/generator": { @@ -156,22 +102,11 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", - "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.29.7", @@ -184,27 +119,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", - "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-member-expression-to-functions": "^7.29.7", - "@babel/helper-optimise-call-expression": "^7.29.7", - "@babel/helper-replace-supers": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", - "@babel/traverse": "^7.29.7", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/helper-globals": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", @@ -214,19 +128,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", - "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", @@ -244,6 +145,7 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.29.7", @@ -257,57 +159,16 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", - "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-plugin-utils": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", - "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.29.7", - "@babel/helper-optimise-call-expression": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", - "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", @@ -330,6 +191,7 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -339,6 +201,7 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.29.7", @@ -363,146 +226,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.29.7.tgz", - "integrity": "sha512-ajMX6QPcyomotqwpzhkYGxcK2i/us0rs1Qo9QvUpa+Fca0FTmqrzKrctoIYLMxcOhGZldGT/BAVkRGTWBiR8gQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", - "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", - "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", - "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.29.7.tgz", - "integrity": "sha512-wRHeUjUjCZnMHmiO5bRgjFLcoEh7JyTdByOW11ahhwNa4V0bmeGEaIvt51yq0zQp2yWIpqfxXXPyUP6GFJZHOQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/plugin-syntax-flow": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", - "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", - "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", - "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", - "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", @@ -535,78 +258,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript": { + "node_modules/@babel/runtime": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", - "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-create-class-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", - "@babel/plugin-syntax-typescript": "^7.29.7" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-flow": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.29.7.tgz", - "integrity": "sha512-KYIRV0BuaN68CDdsqFkAD7MU7yipUqQNuNElwATdxaIdpTjhvtY82QvkBJs7zV3Evxj2jFAAZ1iO8nyy0nhjqA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "@babel/plugin-transform-flow-strip-types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", - "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "@babel/plugin-syntax-jsx": "^7.29.7", - "@babel/plugin-transform-modules-commonjs": "^7.29.7", - "@babel/plugin-transform-typescript": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.29.7.tgz", - "integrity": "sha512-AMGJoWuES861riy6pcB0fphE1YXybtQnBYQMuIyPv6mKLiosfa79BKTnAOyx215c/3RJPJpdQwoHZ3earVH7AA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.6", - "source-map-support": "^0.5.16" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/template": { @@ -654,34 +312,152 @@ "node": ">=6.9.0" } }, - "node_modules/@clack/core": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.2.tgz", - "integrity": "sha512-0Ty/1Gfm+Kb07sXcuESjyKfwEhSy4Ns1AgeEisHb/bDY5fWme0tTeTkU14T1Gmcs17YIjB/teiDe4uaCghbYqQ==", + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", "license": "MIT", "dependencies": { - "fast-wrap-ansi": "^0.2.0", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 20.12.0" + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" } }, - "node_modules/@clack/prompts": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.6.0.tgz", - "integrity": "sha512-EYlRokl8szrP9Z25qT5aepMdBjzBvHF9ZEhzIiUBc9guz/T31EqRgvD0QSgZcpE93xiwrr+OkB4nz0BZyF6fSA==", + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", "license": "MIT", "dependencies": { - "@clack/core": "1.4.2", - "fast-string-width": "^3.0.2", - "fast-wrap-ansi": "^0.2.0", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 20.12.0" + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" } }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -1073,6 +849,44 @@ "node": ">=12" } }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -1087,6 +901,7 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -1118,6 +933,381 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.40-1", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40-1.tgz", + "integrity": "sha512-agKXuNNy0bHUmeU7pNmoZwNFr7Hiyhojkb9+2PVyDG5+6RafYuyMgbrav8CndsB7KUc/U51JAw9vKNDLYBzaUA==", + "deprecated": "This package has been replaced by @base-ui/react", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz", + "integrity": "sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.18.0.tgz", + "integrity": "sha512-1s0vEZj5XFXDMmz3Arl/R7IncFqJ+WQ95LDp1roHWGDE2oCO3IS4/hmiOv1/8SD9r6B7tv9GLiqVZYHo+6PkTg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/lab": { + "version": "5.0.0-alpha.177", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.177.tgz", + "integrity": "sha512-bdCxxtNjlWAgN9rtrwlmFydJ1qxA3IIbb6OlomGFsIXw0zGoHomLyjvh72q/R3yUAC0kvSef18cHY1UalLylyQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.40-1", + "@mui/system": "^5.18.0", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material": ">=5.15.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz", + "integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.18.0", + "@mui/system": "^5.18.0", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.0.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz", + "integrity": "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.17.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.18.0.tgz", + "integrity": "sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.18.0.tgz", + "integrity": "sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.17.1", + "@mui/styled-engine": "^5.18.0", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.24", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", + "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.17.1.tgz", + "integrity": "sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "~7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-date-pickers": { + "version": "6.20.2", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.20.2.tgz", + "integrity": "sha512-x1jLg8R+WhvkmUETRfX2wC+xJreMii78EXKLl6r3G+ggcAZlPyt0myID1Amf6hvJb9CtR7CgUo8BwR+1Vx9Ggw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/base": "^5.0.0-beta.22", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.8.6", + "@mui/system": "^5.8.0", + "date-fns": "^2.25.0 || ^3.2.0", + "date-fns-jalali": "^2.13.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "date-fns-jalali": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true + } + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@remix-run/router": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.3.tgz", @@ -1484,17 +1674,6 @@ "win32" ] }, - "node_modules/@stylexjs/stylex": { - "version": "0.18.3", - "resolved": "https://registry.npmjs.org/@stylexjs/stylex/-/stylex-0.18.3.tgz", - "integrity": "sha512-15gDzAJAorOE0yzxaWLNxldW2aqdmCiLG5QcPD8nmVCVqvrWp0Asgv45zk7LtN86WJb/4Ym9eQ6qT5MJW59tWQ==", - "license": "MIT", - "dependencies": { - "css-mediaquery": "^0.1.2", - "invariant": "^2.2.4", - "styleq": "0.2.1" - } - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1547,6 +1726,37 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.16", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.16.tgz", + "integrity": "sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==", + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", @@ -1568,22 +1778,26 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, - "node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "license": "MIT", "dependencies": { - "tslib": "^2.0.1" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" }, "engines": { - "node": ">=4" + "node": ">=10", + "npm": ">=6" } }, "node_modules/baseline-browser-mapping": { "version": "2.10.33", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.33.tgz", "integrity": "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==", + "dev": true, "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -1592,22 +1806,11 @@ "node": ">=6.0.0" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/browserslist": { "version": "4.28.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, "funding": [ { "type": "opencollective", @@ -1637,16 +1840,20 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } }, "node_modules/caniuse-lite": { "version": "1.0.30001793", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "dev": true, "funding": [ { "type": "opencollective", @@ -1663,40 +1870,42 @@ ], "license": "CC-BY-4.0" }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, "engines": { "node": ">=6" } }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "license": "MIT" }, - "node_modules/css-mediaquery": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", - "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==", - "license": "BSD" + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" }, "node_modules/dayjs": { "version": "1.11.21", @@ -1721,12 +1930,41 @@ } } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.368", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.368.tgz", "integrity": "sha512-7RckJJK4uESJF9PxvfMWd3TGqIiieUTG4HxnKaKuIpGbcr+r2ZEB3g2gAhCP3Fqm42vJSzLfgab9eva/C4/XVw==", + "dev": true, "license": "ISC" }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -1770,107 +2008,30 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-string-truncated-width": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", - "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "license": "MIT" }, - "node_modules/fast-string-width": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", - "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", - "license": "MIT", - "dependencies": { - "fast-string-truncated-width": "^3.0.2" - } - }, - "node_modules/fast-wrap-ansi": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", - "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", - "license": "MIT", - "dependencies": { - "fast-string-width": "^3.0.2" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/flow-estree": { - "version": "0.321.0", - "resolved": "https://registry.npmjs.org/flow-estree/-/flow-estree-0.321.0.tgz", - "integrity": "sha512-rQY7YKoo+PKpAHQjEP2cxyIefk04OCEKUlbtV4y6LAUG3Ly7guQX9YH8th6drSmYcNkMgpqWMaHRhhYaAF69CA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/flow-parser": { - "version": "0.321.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.321.0.tgz", - "integrity": "sha512-9LNK2rp/NWWbwdEK6mxC54XfQRyD2lVV0iPVBYf+5o5vvqJl7ietkR1hX3/dZ39j0GAbL4PIFoeekDViOW0x/Q==", - "license": "MIT", - "dependencies": { - "flow-estree": "0.321.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1886,83 +2047,87 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/gpt-tokenizer": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/gpt-tokenizer/-/gpt-tokenizer-2.9.0.tgz", - "integrity": "sha512-YSpexBL/k4bfliAzMrRqn3M6+it02LutVyhVpDeMKrC/O9+pCe/5s8U2hYKa2vFLD5/vHhsKc8sOn/qGqII8Kg==", - "license": "MIT", - "peer": true - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-object": { + "node_modules/hasown": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { - "isobject": "^3.0.1" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jiti": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", - "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/js-tokens": { @@ -1971,46 +2136,6 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, - "node_modules/jscodeshift": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-17.3.0.tgz", - "integrity": "sha512-LjFrGOIORqXBU+jwfC9nbkjmQfFldtMIoS6d9z2LG/lkmyNXsJAySPT+2SWXJEoE68/bCWcxKpXH37npftgmow==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/preset-flow": "^7.24.7", - "@babel/preset-typescript": "^7.24.7", - "@babel/register": "^7.24.6", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.7", - "neo-async": "^2.5.0", - "picocolors": "^1.0.1", - "recast": "^0.23.11", - "tmp": "^0.2.3", - "write-file-atomic": "^5.0.1" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - }, - "peerDependenciesMeta": { - "@babel/preset-env": { - "optional": true - } - } - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -2023,10 +2148,17 @@ "node": ">=6" } }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -2035,27 +2167,11 @@ "node": ">=6" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "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==", + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -2073,55 +2189,12 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, - "node_modules/lucide-react": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.22.0.tgz", - "integrity": "sha512-c9o3l0PiNcgOQDW4F31BEYHudE7kgxVt3o30qMl36ZPwTxXlGB4QnLilhERvVM4uh/pl5MDyY1/gzZSYcHDtBg==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2147,64 +2220,68 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, "node_modules/node-releases": { "version": "2.0.47", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "callsites": "^3.0.0" }, "engines": { "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } + "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==", + "license": "MIT" }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", - "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/picocolors": { @@ -2213,48 +2290,6 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/postcss": { "version": "8.5.15", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", @@ -2284,27 +2319,54 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", - "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", "dependencies": { - "scheduler": "^0.27.0" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^19.2.7" + "react": "^18.3.1" } }, + "node_modules/react-is": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "license": "MIT" + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", @@ -2347,29 +2409,50 @@ "react-dom": ">=16.8" } }, - "node_modules/recast": { - "version": "0.23.12", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.12.tgz", - "integrity": "sha512-dEWRjcINDu/F4l2dYx57ugBtD7HV9KXESyxhzw/MqWLeglJrsjJKqACPyUPg+6AF8mIgm+Zi0dZ3ACoIg+QtpA==", - "license": "MIT", + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" }, - "engines": { - "node": ">= 4" + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" } }, - "node_modules/recast/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" } }, "node_modules/rollup": { @@ -2418,50 +2501,33 @@ } }, "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -2472,68 +2538,29 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/styleq": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/styleq/-/styleq-0.2.1.tgz", - "integrity": "sha512-L0TR0NQb+X4/ktDEKmjWyp27gla+LUYi/by5k5SjKXf6/pvZP7wbwEB5J+tqxdFVPgzbsuz+d4RTScO/QZquBw==", + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", "license": "MIT" }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, - "node_modules/tmp": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", - "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { - "node": ">=14.14" - } - }, - "node_modules/to-regex-range": { - "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==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=8.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, "funding": [ { "type": "opencollective", @@ -2620,32 +2647,20 @@ } } }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, "license": "ISC" }, - "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "license": "ISC", + "engines": { + "node": ">= 6" } } } diff --git a/package.json b/package.json index ea70a55..c94e1ab 100644 --- a/package.json +++ b/package.json @@ -10,12 +10,15 @@ "preview": "vite preview" }, "dependencies": { - "@astryxdesign/cli": "^0.1.2", - "@astryxdesign/core": "^0.1.2", - "@astryxdesign/theme-neutral": "^0.1.2", + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/icons-material": "^5.15.20", + "@mui/lab": "^5.0.0-alpha.170", + "@mui/material": "^5.15.20", + "@mui/x-date-pickers": "^6.20.2", "dayjs": "^1.11.11", - "react": "^19.2.7", - "react-dom": "^19.2.7", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-router-dom": "^6.23.1" }, "devDependencies": { diff --git a/public/navbarLogo.png b/public/navbarLogo.png deleted file mode 100644 index f64351844eb8674eeada1cad25774313d5258af3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83551 zcmeFZ^;=Zm7dA|Tgn%F+4T>TSQj!V?NC`+u!%)&79fKfU(hZVIcgN5T1JWQ}(hN1^ z%zMVq^FDvXbA9H_}KMDL#0{@f1|0MALrUXtDm(WN_N#|ddPZ7;Uvi*ybpy3y2B&4KlQMJmO4b%00 z4EPU$=;_AyFGiYGsI$UFe*; zH`^Y1d8Wn#MBG!tf6>+|*T|Zj5D2hhn5gO0?Ox4S7(&l$v|j+vXiB4E??*o6%dP7d znUIww=@@bLdhla|_s-x7f^`6XcK2;FutHB8TWiE$$D}g}y>X|Y*9`Mk- z8tNhIf(MWUGHeWH<~T2WG#QzvoUhiB-{(pJ6RQ9BMjY$CI;SAQK${A9{Mo-xxd|%Y z6fCe20^g4N7yU)kSnrsjDtg#5GN7OT<`oTKy=Pv0R{|gkP{_X#Gue2**s1~^VCKFA zlsM+;)6OFfXz@{xw6FoPj4dlrfXG|_o7XNEwWs=Tz%0A@sCVj9Q15thrCmiN#Ki7v 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ℑLH^vV6!ltU%*7=%^zH&!eaFX1 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 V!zj{wQHMGNsHWkAiu;al{txy&3PS(@ diff --git a/src/App.jsx b/src/App.jsx index 74cc6bc..ad72721 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,5 +1,6 @@ import { Suspense, lazy } from 'react'; import { Routes, Route, Navigate } from 'react-router-dom'; +import { Box, CircularProgress } from '@mui/material'; import MainLayout from '@/layout/MainLayout'; import MinimalLayout from '@/layout/MinimalLayout'; @@ -11,10 +12,9 @@ const load = (factory) => { return ( -

- -
+ + + } > @@ -29,7 +29,7 @@ export default function App() { }> import('@/pages/Dashboard'))} /> - import('@/pages/tenants/Tenants'))} /> + import('@/pages/tenants/Tenants'))} /> import('@/pages/survey/Survey.jsx'))} /> diff --git a/src/app/dashboard-ref/page.tsx b/src/app/dashboard-ref/page.tsx deleted file mode 100644 index 194aa74..0000000 --- a/src/app/dashboard-ref/page.tsx +++ /dev/null @@ -1,808 +0,0 @@ -// Copyright (c) Meta Platforms, Inc. and affiliates. - -'use client'; - -import { - VStack, - HStack, - Layout, - LayoutContent, -} from '@astryxdesign/core/Layout'; -import {Text, Heading} from '@astryxdesign/core/Text'; -import {Card} from '@astryxdesign/core/Card'; -import {Button} from '@astryxdesign/core/Button'; -import {ProgressBar} from '@astryxdesign/core/ProgressBar'; -import { - BarChart, - Bar, - LineChart, - Line, - XAxis, - YAxis, - CartesianGrid, - Tooltip, - ResponsiveContainer, -} from 'recharts'; -import {Grid} from '@astryxdesign/core/Grid'; -import {Table, proportional, pixel} from '@astryxdesign/core/Table'; -import type {TableColumn} from '@astryxdesign/core/Table'; -import {Divider} from '@astryxdesign/core/Divider'; -import {Link} from '@astryxdesign/core/Link'; -import {Icon} from '@astryxdesign/core/Icon'; - -// ============= ICONS ============= - -import { - ArrowPathIcon, - ArrowUpIcon, - ArrowDownIcon, -} from '@heroicons/react/24/outline'; -import {StopIcon} from '@heroicons/react/24/solid'; - -// ============= DATA ============= - -// Active users chart data (96 points over 24h at 15-min intervals: Apr 1 14:00 → Apr 2 14:00) -// Each point has an index (0–95) for even spacing, plus a label for display -const activeUsersData = [ - // Apr 1 14:00 — mid-afternoon, strong work hours - {hour: 0, label: 'Apr 1 14:00', allUsers: 116, desktop: 79, mobile: 37}, - {hour: 1, label: 'Apr 1 14:15', allUsers: 118, desktop: 80, mobile: 38}, - {hour: 2, label: 'Apr 1 14:30', allUsers: 117, desktop: 79, mobile: 38}, - {hour: 3, label: 'Apr 1 14:45', allUsers: 119, desktop: 81, mobile: 38}, - // Apr 1 15:00 — afternoon lull - {hour: 4, label: 'Apr 1 15:00', allUsers: 116, desktop: 79, mobile: 37}, - {hour: 5, label: 'Apr 1 15:15', allUsers: 113, desktop: 76, mobile: 37}, - {hour: 6, label: 'Apr 1 15:30', allUsers: 109, desktop: 72, mobile: 37}, - {hour: 7, label: 'Apr 1 15:45', allUsers: 111, desktop: 74, mobile: 37}, - // Apr 1 16:00 — late afternoon, some leaving early - {hour: 8, label: 'Apr 1 16:00', allUsers: 110, desktop: 72, mobile: 38}, - {hour: 9, label: 'Apr 1 16:15', allUsers: 107, desktop: 69, mobile: 38}, - {hour: 10, label: 'Apr 1 16:30', allUsers: 104, desktop: 66, mobile: 38}, - {hour: 11, label: 'Apr 1 16:45', allUsers: 101, desktop: 62, mobile: 39}, - // Apr 1 17:00 — 5PM exodus, desktop drops fast, mobile bumps - {hour: 12, label: 'Apr 1 17:00', allUsers: 100, desktop: 57, mobile: 43}, - {hour: 13, label: 'Apr 1 17:15', allUsers: 99, desktop: 54, mobile: 45}, - {hour: 14, label: 'Apr 1 17:30', allUsers: 97, desktop: 50, mobile: 47}, - {hour: 15, label: 'Apr 1 17:45', allUsers: 95, desktop: 46, mobile: 49}, - // Apr 1 18:00 — commute, mobile overtakes desktop - {hour: 16, label: 'Apr 1 18:00', allUsers: 93, desktop: 41, mobile: 52}, - {hour: 17, label: 'Apr 1 18:15', allUsers: 91, desktop: 39, mobile: 52}, - {hour: 18, label: 'Apr 1 18:30', allUsers: 89, desktop: 37, mobile: 52}, - {hour: 19, label: 'Apr 1 18:45', allUsers: 87, desktop: 36, mobile: 51}, - // Apr 1 19:00 — dinner, decline slowing - {hour: 20, label: 'Apr 1 19:00', allUsers: 85, desktop: 34, mobile: 51}, - {hour: 21, label: 'Apr 1 19:15', allUsers: 83, desktop: 32, mobile: 51}, - {hour: 22, label: 'Apr 1 19:30', allUsers: 80, desktop: 30, mobile: 50}, - {hour: 23, label: 'Apr 1 19:45', allUsers: 77, desktop: 28, mobile: 49}, - // Apr 1 20:00 — couch browsing, mobile plateau - {hour: 24, label: 'Apr 1 20:00', allUsers: 75, desktop: 26, mobile: 49}, - {hour: 25, label: 'Apr 1 20:15', allUsers: 76, desktop: 26, mobile: 50}, - {hour: 26, label: 'Apr 1 20:30', allUsers: 76, desktop: 27, mobile: 49}, - {hour: 27, label: 'Apr 1 20:45', allUsers: 75, desktop: 27, mobile: 48}, - // Apr 1 21:00 — winding down, mobile dropping off - {hour: 28, label: 'Apr 1 21:00', allUsers: 73, desktop: 27, mobile: 46}, - {hour: 29, label: 'Apr 1 21:15', allUsers: 71, desktop: 27, mobile: 44}, - {hour: 30, label: 'Apr 1 21:30', allUsers: 69, desktop: 27, mobile: 42}, - {hour: 31, label: 'Apr 1 21:45', allUsers: 67, desktop: 28, mobile: 39}, - // Apr 1 22:00 — bedtime wave, mobile drops, desktop holds - {hour: 32, label: 'Apr 1 22:00', allUsers: 65, desktop: 29, mobile: 36}, - {hour: 33, label: 'Apr 1 22:15', allUsers: 63, desktop: 29, mobile: 34}, - {hour: 34, label: 'Apr 1 22:30', allUsers: 61, desktop: 30, mobile: 31}, - {hour: 35, label: 'Apr 1 22:45', allUsers: 60, desktop: 31, mobile: 29}, - // Apr 1 23:00 — desktop overtakes as local users sleep, other TZs active - {hour: 36, label: 'Apr 1 23:00', allUsers: 59, desktop: 33, mobile: 26}, - {hour: 37, label: 'Apr 1 23:15', allUsers: 58, desktop: 34, mobile: 24}, - {hour: 38, label: 'Apr 1 23:30', allUsers: 57, desktop: 35, mobile: 22}, - {hour: 39, label: 'Apr 1 23:45', allUsers: 56, desktop: 36, mobile: 20}, - // Apr 2 00:00 — EMEA morning starts, desktop dominant - {hour: 40, label: 'Apr 2 00:00', allUsers: 56, desktop: 38, mobile: 18}, - {hour: 41, label: 'Apr 2 00:15', allUsers: 56, desktop: 39, mobile: 17}, - {hour: 42, label: 'Apr 2 00:30', allUsers: 57, desktop: 40, mobile: 17}, - {hour: 43, label: 'Apr 2 00:45', allUsers: 56, desktop: 40, mobile: 16}, - // Apr 2 01:00 — EMEA working, plateau - {hour: 44, label: 'Apr 2 01:00', allUsers: 56, desktop: 41, mobile: 15}, - {hour: 45, label: 'Apr 2 01:15', allUsers: 55, desktop: 41, mobile: 14}, - {hour: 46, label: 'Apr 2 01:30', allUsers: 55, desktop: 41, mobile: 14}, - {hour: 47, label: 'Apr 2 01:45', allUsers: 54, desktop: 40, mobile: 14}, - // Apr 2 02:00 — EMEA mid-morning, holding steady - {hour: 48, label: 'Apr 2 02:00', allUsers: 54, desktop: 40, mobile: 14}, - {hour: 49, label: 'Apr 2 02:15', allUsers: 53, desktop: 39, mobile: 14}, - {hour: 50, label: 'Apr 2 02:30', allUsers: 53, desktop: 39, mobile: 14}, - {hour: 51, label: 'Apr 2 02:45', allUsers: 52, desktop: 38, mobile: 14}, - // Apr 2 03:00 — EMEA lunch gap, slight dip - {hour: 52, label: 'Apr 2 03:00', allUsers: 51, desktop: 37, mobile: 14}, - {hour: 53, label: 'Apr 2 03:15', allUsers: 50, desktop: 36, mobile: 14}, - {hour: 54, label: 'Apr 2 03:30', allUsers: 49, desktop: 35, mobile: 14}, - {hour: 55, label: 'Apr 2 03:45', allUsers: 49, desktop: 35, mobile: 14}, - // Apr 2 04:00 — EMEA afternoon, floor - {hour: 56, label: 'Apr 2 04:00', allUsers: 48, desktop: 34, mobile: 14}, - {hour: 57, label: 'Apr 2 04:15', allUsers: 48, desktop: 33, mobile: 15}, - {hour: 58, label: 'Apr 2 04:30', allUsers: 49, desktop: 33, mobile: 16}, - {hour: 59, label: 'Apr 2 04:45', allUsers: 49, desktop: 32, mobile: 17}, - // Apr 2 05:00 — early risers checking phones, mobile climbing - {hour: 60, label: 'Apr 2 05:00', allUsers: 50, desktop: 31, mobile: 19}, - {hour: 61, label: 'Apr 2 05:15', allUsers: 51, desktop: 30, mobile: 21}, - {hour: 62, label: 'Apr 2 05:30', allUsers: 52, desktop: 29, mobile: 23}, - {hour: 63, label: 'Apr 2 05:45', allUsers: 54, desktop: 28, mobile: 26}, - // Apr 2 06:00 — alarms going off, mobile surging - {hour: 64, label: 'Apr 2 06:00', allUsers: 56, desktop: 27, mobile: 29}, - {hour: 65, label: 'Apr 2 06:15', allUsers: 58, desktop: 26, mobile: 32}, - {hour: 66, label: 'Apr 2 06:30', allUsers: 61, desktop: 26, mobile: 35}, - {hour: 67, label: 'Apr 2 06:45', allUsers: 64, desktop: 27, mobile: 37}, - // Apr 2 07:00 — commute, mobile peaks, desktop starting - {hour: 68, label: 'Apr 2 07:00', allUsers: 67, desktop: 28, mobile: 39}, - {hour: 69, label: 'Apr 2 07:15', allUsers: 70, desktop: 30, mobile: 40}, - {hour: 70, label: 'Apr 2 07:30', allUsers: 73, desktop: 33, mobile: 40}, - {hour: 71, label: 'Apr 2 07:45', allUsers: 76, desktop: 37, mobile: 39}, - // Apr 2 08:00 — arriving at desks, desktop ramping - {hour: 72, label: 'Apr 2 08:00', allUsers: 80, desktop: 43, mobile: 37}, - {hour: 73, label: 'Apr 2 08:15', allUsers: 85, desktop: 49, mobile: 36}, - {hour: 74, label: 'Apr 2 08:30', allUsers: 90, desktop: 55, mobile: 35}, - {hour: 75, label: 'Apr 2 08:45', allUsers: 95, desktop: 61, mobile: 34}, - // Apr 2 09:00 — work day, desktop dominant - {hour: 76, label: 'Apr 2 09:00', allUsers: 99, desktop: 66, mobile: 33}, - {hour: 77, label: 'Apr 2 09:15', allUsers: 102, desktop: 69, mobile: 33}, - {hour: 78, label: 'Apr 2 09:30', allUsers: 104, desktop: 72, mobile: 32}, - {hour: 79, label: 'Apr 2 09:45', allUsers: 104, desktop: 72, mobile: 32}, - // Apr 2 10:00 — coffee break stall, then climbing - {hour: 80, label: 'Apr 2 10:00', allUsers: 106, desktop: 74, mobile: 32}, - {hour: 81, label: 'Apr 2 10:15', allUsers: 109, desktop: 76, mobile: 33}, - {hour: 82, label: 'Apr 2 10:30', allUsers: 112, desktop: 78, mobile: 34}, - {hour: 83, label: 'Apr 2 10:45', allUsers: 114, desktop: 80, mobile: 34}, - // Apr 2 11:00 — approaching peak - {hour: 84, label: 'Apr 2 11:00', allUsers: 116, desktop: 81, mobile: 35}, - {hour: 85, label: 'Apr 2 11:15', allUsers: 117, desktop: 81, mobile: 36}, - {hour: 86, label: 'Apr 2 11:30', allUsers: 119, desktop: 83, mobile: 36}, - {hour: 87, label: 'Apr 2 11:45', allUsers: 119, desktop: 82, mobile: 37}, - // Apr 2 12:00 — lunch dip, mobile ticks up - {hour: 88, label: 'Apr 2 12:00', allUsers: 120, desktop: 83, mobile: 37}, - {hour: 89, label: 'Apr 2 12:15', allUsers: 115, desktop: 78, mobile: 37}, - {hour: 90, label: 'Apr 2 12:30', allUsers: 111, desktop: 74, mobile: 37}, - {hour: 91, label: 'Apr 2 12:45', allUsers: 110, desktop: 73, mobile: 37}, - // Apr 2 13:00 — returning from lunch - {hour: 92, label: 'Apr 2 13:00', allUsers: 113, desktop: 76, mobile: 37}, - {hour: 93, label: 'Apr 2 13:15', allUsers: 116, desktop: 79, mobile: 37}, - {hour: 94, label: 'Apr 2 13:30', allUsers: 118, desktop: 81, mobile: 37}, - {hour: 95, label: 'Apr 2 14:00', allUsers: 120, desktop: 83, mobile: 37}, -]; - -// X-axis tick indices and their display labels -const xAxisTicks = [0, 32, 64, 95]; -const xAxisLabels: Record = { - 0: 'Apr 1 14:00', - 32: 'Apr 1 22:00', - 64: 'Apr 2 06:00', - 95: 'Apr 2 14:00', -}; - -// Metric cards -const metrics = [ - { - label: 'Monthly Visitors', - value: '27.3 k', - change: '+18.2%', - positive: true, - }, - { - label: 'Monthly Page Views', - value: '48.2 k', - change: '+12.5%', - positive: true, - }, - { - label: 'Avg. Session', - value: '4.5 min', - change: '-14.3%', - positive: false, - }, - { - label: 'Bounce Rate', - value: '42.3%', - change: '-8.7%', - positive: false, - }, -]; - -// Sparkline data for each metric card (30 days, weekends at indices 5-6, 12-13, 19-20, 26-27) -const sparklines = [ - // Monthly Visitors: +18.2% — declining first 2 weeks, hits bottom around day 14, then sharp recovery - // prettier-ignore - [48, 46, 44, 42, 40, 18, 16, 38, 36, 34, 32, 30, 12, 10, 28, 26, 28, 32, 36, 14, 12, 40, 44, 48, 52, 56, 28, 24, 58, 62], - // Monthly Page Views: +12.5% — flat/choppy first 3 weeks, then kicks up sharply in final week - // prettier-ignore - [36, 38, 35, 37, 36, 14, 12, 38, 36, 34, 37, 35, 12, 10, 36, 34, 36, 35, 38, 14, 12, 40, 44, 50, 54, 56, 26, 22, 58, 60], - // Avg. Session: -14.3% — strong start, holds through week 2, then clear drop-off week 3-4 - // prettier-ignore - [58, 56, 60, 58, 62, 30, 26, 60, 58, 62, 60, 58, 28, 24, 56, 54, 50, 46, 42, 18, 14, 38, 36, 34, 32, 30, 10, 8, 28, 26], - // Bounce Rate: -8.7% — high and volatile first half, starts dropping around day 16, steady decline - // prettier-ignore - [52, 56, 50, 54, 58, 62, 60, 54, 52, 56, 50, 54, 60, 58, 50, 48, 46, 44, 40, 46, 44, 38, 36, 34, 36, 32, 38, 36, 30, 28], -]; - -// Demographics -const regionData = [ - { - label: 'NORAM', - value: 38, - color: 'var(--color-data-categorical-blue, #0171E3)', - }, - { - label: 'EMEA', - value: 28, - color: 'var(--color-data-categorical-orange, #EB6E00)', - }, - { - label: 'APAC', - value: 22, - color: 'var(--color-data-categorical-green, #0B991F)', - }, - { - label: 'LATAM', - value: 8, - color: 'var(--color-data-categorical-purple, #6B1EFD)', - }, - {label: 'Other', value: 4, color: 'var(--color-data-neutral, #8494A3)'}, -]; - -const roleData = [ - { - label: 'Engineer', - value: 45, - color: 'var(--color-data-categorical-blue, #0171E3)', - }, - { - label: 'Manager', - value: 20, - color: 'var(--color-data-categorical-orange, #EB6E00)', - }, - { - label: 'Designer', - value: 15, - color: 'var(--color-data-categorical-green, #0B991F)', - }, - { - label: 'Data Scientist', - value: 12, - color: 'var(--color-data-categorical-purple, #6B1EFD)', - }, - {label: 'Other', value: 8, color: 'var(--color-data-neutral, #8494A3)'}, -]; - -// Engagement — Top pages -interface PageRow extends Record { - id: string; - page: string; - views: number; - newUsers: string; - avgTime: string; - exits: string; -} - -const topPagesData: PageRow[] = [ - { - id: '1', - page: '/home', - views: 8420, - newUsers: '62.3%', - avgTime: '3:42', - exits: '18.5%', - }, - { - id: '2', - page: '/products', - views: 6150, - newUsers: '45.1%', - avgTime: '4:15', - exits: '22.8%', - }, - { - id: '3', - page: '/pricing', - views: 4830, - newUsers: '38.7%', - avgTime: '2:58', - exits: '35.2%', - }, - { - id: '4', - page: '/blog', - views: 3920, - newUsers: '71.4%', - avgTime: '5:30', - exits: '12.1%', - }, - { - id: '5', - page: '/docs', - views: 3410, - newUsers: '29.8%', - avgTime: '6:12', - exits: '8.4%', - }, - { - id: '6', - page: '/about', - views: 2980, - newUsers: '55.6%', - avgTime: '2:15', - exits: '28.3%', - }, - { - id: '7', - page: '/contact', - views: 2540, - newUsers: '48.2%', - avgTime: '1:48', - exits: '41.7%', - }, - { - id: '8', - page: '/changelog', - views: 2210, - newUsers: '22.1%', - avgTime: '4:55', - exits: '15.6%', - }, - { - id: '9', - page: '/support', - views: 1870, - newUsers: '59.3%', - avgTime: '3:22', - exits: '30.9%', - }, - { - id: '10', - page: '/careers', - views: 1520, - newUsers: '83.1%', - avgTime: '2:34', - exits: '45.2%', - }, -]; - -const topPagesMaxViews = Math.max(...topPagesData.map(d => d.views)); - -const topPagesColumns: TableColumn[] = [ - {key: 'page', header: 'Page', width: pixel(160)}, - { - key: 'views', - header: 'Views', - width: proportional(1), - renderCell: (item: PageRow) => ( - - - {item.views.toLocaleString()} views - - ), - }, - {key: 'newUsers', header: 'New Users', width: pixel(120)}, - {key: 'avgTime', header: 'Avg. Time', width: pixel(120)}, -]; - -// Engagement — Top events -interface EventRow extends Record { - id: string; - event: string; - count: number; - users: number; - newUsers: number; -} - -const topEventsData: EventRow[] = [ - {id: '1', event: 'page_view', count: 18420, users: 12300, newUsers: 4920}, - {id: '2', event: 'session_start', count: 14850, users: 9870, newUsers: 3950}, - {id: '3', event: 'first_visit', count: 8230, users: 8230, newUsers: 8230}, - {id: '4', event: 'user_engagement', count: 6120, users: 4510, newUsers: 1580}, - {id: '5', event: 'click', count: 3540, users: 2680, newUsers: 940}, - {id: '6', event: 'scroll', count: 2910, users: 2140, newUsers: 750}, - {id: '7', event: 'form_submit', count: 1870, users: 1350, newUsers: 540}, - {id: '8', event: 'video_play', count: 1240, users: 980, newUsers: 390}, - {id: '9', event: 'search', count: 960, users: 720, newUsers: 290}, - {id: '10', event: 'share', count: 580, users: 410, newUsers: 160}, -]; - -const topEventsMaxCount = Math.max(...topEventsData.map(d => d.count)); - -const topEventsColumns: TableColumn[] = [ - {key: 'event', header: 'Event', width: pixel(160)}, - { - key: 'count', - header: 'Count', - width: proportional(1), - renderCell: (item: EventRow) => ( - - - {item.count.toLocaleString()} - - ), - }, - { - key: 'users', - header: 'Users', - width: pixel(120), - renderCell: (item: EventRow) => item.users.toLocaleString(), - }, - { - key: 'newUsers', - header: 'New Users', - width: pixel(120), - renderCell: (item: EventRow) => item.newUsers.toLocaleString(), - }, -]; - -// ============= CHART COMPONENTS ============= - -// Chart line colors via Astryx design tokens (CSS custom properties) -const chartColors = { - allUsers: 'var(--color-data-categorical-blue, #0171E3)', - desktop: 'var(--color-data-categorical-orange, #EB6E00)', - mobile: 'var(--color-data-categorical-purple, #6B1EFD)', -}; - -function ChartLegendItem({color, label}: {color: string; label: string}) { - return ( - - - - {label} - - - ); -} - -function ChartTooltip({ - active, - payload, - label, -}: { - active?: boolean; - payload?: Array<{name: string; value: number; color: string}>; - label?: number; -}) { - if (!active || !payload?.length) { - return null; - } - const point = activeUsersData.find(d => d.hour === label); - return ( - - - - {point?.label ?? ''} - - {payload.map(entry => ( - - - - {entry.name}: {entry.value} - - - ))} - - - ); -} - -function ActiveUsersChart() { - return ( - - - - - xAxisLabels[v] ?? ''} - tick={{ - fontSize: 'var(--font-size-sm, 12px)', - fill: 'var(--color-text-secondary, #4E606F)', - }} - axisLine={false} - tickLine={false} - /> - - } - cursor={{stroke: 'var(--color-border, rgba(5, 54, 89, 0.1))'}} - /> - - - - - - - - - - - - ); -} - -function Sparkline({data}: {data: number[]}) { - const chartData = data.map((v, i) => ({i, v})); - return ( - - - - - - ); -} - -// ============= CARD COMPONENTS ============= - -function MetricCard({ - label, - value, - change, - positive, - sparkline, -}: { - label: string; - value: string; - change: string; - positive: boolean; - sparkline: number[]; -}) { - return ( - - - {label} - - {value} - - {positive ? ( - - ) : ( - - )} - - {change} - - - - - Last 30 days vs. Previous - - - - - ); -} - -function StackedBarCard({ - title, - data, -}: { - title: string; - data: Array<{label: string; value: number; color: string}>; -}) { - const total = data.reduce((sum, d) => sum + d.value, 0); - // Recharts needs a single data row with each segment as a separate key - const chartData = [Object.fromEntries(data.map(d => [d.label, d.value]))]; - - return ( - - - {title} - - - - - {data.map((d, i) => ( - - ))} - - - {/* Legend */} - - {data.map(d => ( - - - - {d.label} - - - {d.value} - {((d.value / total) * 100).toFixed(2)}% - - - ))} - - - - ); -} - -// ============= TABLE COMPONENTS ============= - -function TableCard({ - title, - linkLabel, - linkHref, - data, - columns, -}: { - title: string; - linkLabel: string; - linkHref: string; - data: T[]; - columns: TableColumn[]; -}) { - return ( - - - - {title} - {linkLabel} - - - data={data} - columns={columns} - idKey="id" - density="compact" - dividers="rows" - hasHover - /> - - - ); -} - -// ============= SIDENAV ============= - -// ============= MAIN COMPONENT ============= - -export default function DashboardTemplate() { - return ( - - - {/* Active Users Chart */} - - - Active users - } + /> - {error && ( -
- } - /> -
- )} + {error && Retry}>{error}} -
- - - - -
- {/* Main dashboard panels */} -
-
- {/* Recent Clients */} -
- 0 && ( -
+ + + + {statusData.length === 0 + ? + : } + + + - -
+ + + {team.length === 0 ? ( + + ) : ( + } spacing={0}> + {team.slice(0, 6).map((u) => ( + + + + {u.name} + {u.email} + + + + ))} + + )} + + + + ); } diff --git a/src/pages/Settings.jsx b/src/pages/Settings.jsx index 03939ee..2c42eef 100644 --- a/src/pages/Settings.jsx +++ b/src/pages/Settings.jsx @@ -1,27 +1,22 @@ import { useState } from 'react'; import { - Save, - Sliders, - Bell, - Lock, - Shield, - Megaphone, - Building, - CheckCircle2, - AlertTriangle, - HelpCircle, - LogOut, - Eye, - EyeOff -} from 'lucide-react'; -import { Button } from '@astryxdesign/core/Button'; -import { Card } from '@astryxdesign/core/Card'; -import { List, ListItem } from '@astryxdesign/core/List'; -import { Text, Heading } from '@astryxdesign/core/Text'; -import { TextInput } from '@astryxdesign/core/TextInput'; -import { Selector } from '@astryxdesign/core/Selector'; -import { Switch } from '@astryxdesign/core/Switch'; -import { Badge } from '@astryxdesign/core/Badge'; + Grid, Card, Box, Stack, TextField, MenuItem, Switch, Button, Typography, Divider, + Snackbar, Alert, Chip, IconButton, InputAdornment, LinearProgress, Avatar +} from '@mui/material'; +import SaveOutlinedIcon from '@mui/icons-material/SaveOutlined'; +import TuneOutlinedIcon from '@mui/icons-material/TuneOutlined'; +import NotificationsNoneIcon from '@mui/icons-material/NotificationsNone'; +import LockOutlinedIcon from '@mui/icons-material/LockOutlined'; +import ShieldOutlinedIcon from '@mui/icons-material/ShieldOutlined'; +import CampaignOutlinedIcon from '@mui/icons-material/CampaignOutlined'; +import BusinessOutlinedIcon from '@mui/icons-material/BusinessOutlined'; +import VerifiedOutlinedIcon from '@mui/icons-material/VerifiedOutlined'; +import WarningAmberRoundedIcon from '@mui/icons-material/WarningAmberRounded'; +import HelpOutlineRoundedIcon from '@mui/icons-material/HelpOutlineRounded'; +import LogoutOutlinedIcon from '@mui/icons-material/LogoutOutlined'; +import ChevronRightIcon from '@mui/icons-material/ChevronRight'; +import Visibility from '@mui/icons-material/Visibility'; +import VisibilityOff from '@mui/icons-material/VisibilityOff'; import PageHeader from '@/components/PageHeader'; @@ -41,9 +36,9 @@ const INITIAL_NOTIFY = { const INITIAL_SECURITY = { currentPassword: '', newPassword: '', confirmPassword: '', twoFactor: false }; const NAV = [ - { icon: Sliders, label: 'General', desc: 'Organisation profile' }, - { icon: Bell, label: 'Notifications', desc: 'Alerts & channels' }, - { icon: Lock, label: 'Security', desc: 'Password & 2FA' } + { icon: TuneOutlinedIcon, label: 'General', desc: 'Organisation profile' }, + { icon: NotificationsNoneIcon, label: 'Notifications', desc: 'Alerts & channels' }, + { icon: LockOutlinedIcon, label: 'Security', desc: 'Password & 2FA' } ]; const NOTIFY_ROWS = [ @@ -54,13 +49,12 @@ const NOTIFY_ROWS = [ ]; const STRENGTH = [ - { label: 'Too weak', color: '#ef4444' }, - { label: 'Weak', color: '#ef4444' }, - { label: 'Fair', color: '#f59e0b' }, - { label: 'Good', color: '#3b82f6' }, - { label: 'Strong', color: '#10b981' } + { label: 'Too weak', color: 'error' }, + { label: 'Weak', color: 'error' }, + { label: 'Fair', color: 'warning' }, + { label: 'Good', color: 'info' }, + { label: 'Strong', color: 'success' } ]; - const scorePassword = (pw) => { let s = 0; if (pw.length >= 8) s++; @@ -70,89 +64,63 @@ const scorePassword = (pw) => { return s; }; -function Section({ icon: Icon, title, subtitle, danger = false, children }) { +// Section surface with a tinted icon header band. +function Section({ icon: Icon, title, subtitle, color = 'primary', danger = false, children }) { return ( - -
+ `linear-gradient(90deg, ${theme.palette[color].lighter}66 0%, ${theme.palette.background.paper} 72%)` }} > -
- -
-
- {title} - {subtitle && {subtitle}} -
-
-
{children}
+ + + + + {title} + {subtitle && {subtitle}} + + + {children}
); } -function Row({ label, description, controlAlign = 'stretch', children }) { +// Two-column row: label + helper on the left, control on the right. +function Row({ label, description, children, align = 'center' }) { return ( -
-
- {label} - {description && {description}} -
-
- {children} -
-
+ + + {label} + {description && {description}} + + {children} + ); } -function PasswordField({ label, value, onChange }) { +const rightAlign = { display: 'flex', justifyContent: { sm: 'flex-end' } }; + +function PasswordField({ label, value, onChange, autoComplete }) { const [show, setShow] = useState(false); return ( -
- - -
+ + setShow((s) => !s)} edge="end" size="small"> + {show ? : } + + + ) + }} + /> ); } @@ -165,11 +133,11 @@ export default function Settings() { const [notify, setNotify] = useState(INITIAL_NOTIFY); const [security, setSecurity] = useState(INITIAL_SECURITY); - const setG = (k) => (val) => { setGeneral((p) => ({ ...p, [k]: val })); setDirty(true); }; - const setN = (k) => (val) => { setNotify((p) => ({ ...p, [k]: val })); setDirty(true); }; - const setSText = (k) => (val) => { setSecurity((p) => ({ ...p, [k]: val })); setDirty(true); }; + const setG = (k) => (e) => { setGeneral((p) => ({ ...p, [k]: e.target.value })); setDirty(true); }; + const setN = (k) => (e) => { setNotify((p) => ({ ...p, [k]: e.target.checked })); setDirty(true); }; + const setSText = (k) => (e) => { setSecurity((p) => ({ ...p, [k]: e.target.value })); setDirty(true); }; - const save = () => { setToast(true); setDirty(false); setTimeout(() => setToast(false), 2500); }; + const save = () => { setToast(true); setDirty(false); }; const discard = () => { setGeneral(INITIAL_GENERAL); setNotify(INITIAL_NOTIFY); @@ -182,211 +150,211 @@ export default function Settings() { const mismatch = security.confirmPassword && security.newPassword !== security.confirmPassword; return ( -
+ <> - {dirty && } -
+ + {dirty && } + + + } /> -
+ {/* Sidebar */} -
-
- - - {NAV.map((item, i) => ( - } - isSelected={tab === i} - onClick={() => setTab(i)} - /> - ))} - + + + + Preferences + + {NAV.map((item, i) => { + const active = tab === i; + const Icon = item.icon; + return ( + setTab(i)} + sx={{ + px: 1.5, py: 1.25, borderRadius: 2, cursor: 'pointer', position: 'relative', + bgcolor: active ? 'primary.lighter' : 'transparent', + transition: 'background-color .15s', + '&:hover': { bgcolor: active ? 'primary.lighter' : 'grey.50' }, + '&::before': active ? { content: '""', position: 'absolute', left: 0, top: 9, bottom: 9, width: 3, borderRadius: 3, bgcolor: 'primary.main' } : {} + }} + > + + + + + {item.label} + {item.desc} + + + + ); + })} + - -
-
- -
-
- Need a hand? -
- Our team is available 24/7 for operational support. -
-
-
+ + + + + + + Need a hand? + Our team is available 24/7 for operational support. + + + -
-
+ +
{/* Content */} -
+ {tab === 0 && ( -
- {/* Org banner */} - -
+ {/* Organisation identity banner */} + + `linear-gradient(90deg, ${theme.palette.primary.lighter}88 0%, ${theme.palette.background.paper} 75%)` }} > -
- -
-
-
- {general.orgName} - } label="Verified" /> -
- {general.supportEmail} · {general.contact} -
-
+ + + + + + {general.orgName} + } label="Verified" sx={{ fontWeight: 700, bgcolor: 'success.lighter', color: 'success.dark', '& .MuiChip-icon': { color: 'inherit' } }} /> + + {general.supportEmail} · {general.contact} + + +
-
- - - - - - - - - - -
- setG('timezone')(v || '')} /> -
-
- -
- setG('language')(v || '')} /> -
-
+
+ }> + + + + + + + + + + + + {TIMEZONES.map((t) => {t})} + + + + + {LANGUAGES.map((l) => {l})} + + +
-
+ )} {tab === 1 && ( -
-
- {NOTIFY_ROWS.map((row) => ( - - + +
+ }> + {NOTIFY_ROWS.map((row) => ( + + + + ))} + +
+
+ }> + + - ))} + + + +
-
- - - - - - -
-
+ )} {tab === 2 && ( -
-
- - - - -
- - {security.newPassword && ( -
-
-
-
- {pwMeta.label} -
- )} -
- - -
- - {mismatch && Passwords do not match} -
-
+ +
+ }> + + + + + + + {security.newPassword && ( + + + {pwMeta.label} + + )} + + + + + + {mismatch && Passwords do not match} + + +
-
- -
- - { setSecurity((p) => ({ ...p, twoFactor: v })); setDirty(true); }} +
+ + + } + label={security.twoFactor ? 'Enabled' : 'Disabled'} + sx={{ fontWeight: 700, bgcolor: security.twoFactor ? 'success.lighter' : 'grey.100', color: security.twoFactor ? 'success.dark' : 'grey.600', '& .MuiChip-icon': { color: 'inherit' } }} /> -
+ { setSecurity((p) => ({ ...p, twoFactor: e.target.checked })); setDirty(true); }} /> +
-
- - +
-
+ )} -
-
+ + - {toast && ( -
- + setToast(false)} + anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} + > + setToast(false)} sx={{ width: '100%' }}> Settings saved successfully. -
- )} - - -
+ + + ); } diff --git a/src/pages/auth/Login.jsx b/src/pages/auth/Login.jsx index 45286c4..352ef34 100644 --- a/src/pages/auth/Login.jsx +++ b/src/pages/auth/Login.jsx @@ -1,18 +1,25 @@ import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import { Eye, EyeOff, Mail, Lock } from 'lucide-react'; -import { Center } from '@astryxdesign/core/Center'; -import { Card } from '@astryxdesign/core/Card'; -import { VStack, HStack } from '@astryxdesign/core/Layout'; -import { Text } from '@astryxdesign/core/Text'; -import { TextInput } from '@astryxdesign/core/TextInput'; -import { CheckboxInput } from '@astryxdesign/core/CheckboxInput'; -import { Button } from '@astryxdesign/core/Button'; -import { Link } from '@astryxdesign/core/Link'; -import { Banner } from '@astryxdesign/core/Banner'; +import { + Box, + Grid, + Card, + Stack, + Typography, + TextField, + InputAdornment, + IconButton, + Button, + Checkbox, + FormControlLabel, + Link +} from '@mui/material'; +import Visibility from '@mui/icons-material/Visibility'; +import VisibilityOff from '@mui/icons-material/VisibilityOff'; import Logo from '@/components/Logo'; import bgImage from '../../assets/mid-mile-approach.jpg'; + import { loginAdmin } from '@/utils/apiClient'; export default function Login() { @@ -21,14 +28,10 @@ export default function Login() { const [auth, setAuth] = useState(''); const [pwd, setPwd] = useState(''); const [error, setError] = useState(''); - const [rememberMe, setRememberMe] = useState(true); - const [loading, setLoading] = useState(false); const handleLogin = async () => { - if (!auth || !pwd || loading) return; - setLoading(true); - setError(''); try { + setError(''); const data = await loginAdmin(auth, pwd); localStorage.setItem('logged_in', 'true'); localStorage.setItem('auth_token', data.token); @@ -36,8 +39,6 @@ export default function Login() { navigate('/dashboard'); } catch (err) { setError(err.message || 'Invalid email or password'); - } finally { - setLoading(false); } }; @@ -46,128 +47,132 @@ export default function Login() { }; return ( -
-
+ + > + + Welcome back + + Sign in to your Doormile operations account. + -
- - - -
- -
- Welcome back - - Sign in to your Doormile operations account. - -
- - {error && } - - - } - hasAutoFocus - /> - -
- } - /> - -
-
- - - - Forgot password? - - -
+ + + Password + setPwd(e.target.value)} + onKeyDown={handleKeyDown} + sx={{ + '& .MuiOutlinedInput-root': { + bgcolor: 'rgba(255,255,255,0.6)', + borderRadius: 2, + transition: 'all 0.2s ease', + '&:hover': { bgcolor: 'rgba(255,255,255,0.9)' }, + '&.Mui-focused': { bgcolor: '#fff', boxShadow: '0 4px 12px rgba(0,0,0,0.05)' } + } + }} + InputProps={{ + endAdornment: ( + + setShow((s) => !s)} edge="end" size="small"> + {show ? : } + + + ) + }} + /> + + + } label={Remember me} /> + Forgot password? + -
- + {error && {error}} + + + + + + + © {new Date().getFullYear()} Doormile Technologies. All rights reserved. - -
-
+ + + ); } diff --git a/src/pages/bookings/Bookings.jsx b/src/pages/bookings/Bookings.jsx index 71c74df..5a5dc61 100644 --- a/src/pages/bookings/Bookings.jsx +++ b/src/pages/bookings/Bookings.jsx @@ -1,23 +1,15 @@ -import { useState, useEffect, useMemo } from 'react'; -import { Plus, Search, Trash2 } from 'lucide-react'; -import { Button } from '@astryxdesign/core/Button'; -import { Card } from '@astryxdesign/core/Card'; -import { Table, proportional, pixel } from '@astryxdesign/core/Table'; -import { Badge } from '@astryxdesign/core/Badge'; -import { Text } from '@astryxdesign/core/Text'; -import { Dialog, DialogHeader } from '@astryxdesign/core/Dialog'; -import { Layout, LayoutContent, LayoutFooter } from '@astryxdesign/core/Layout'; -import { FormLayout } from '@astryxdesign/core/FormLayout'; -import { Field } from '@astryxdesign/core/Field'; -import { TextInput } from '@astryxdesign/core/TextInput'; -import { NumberInput } from '@astryxdesign/core/NumberInput'; -import { Selector } from '@astryxdesign/core/Selector'; -import { CheckboxInput } from '@astryxdesign/core/CheckboxInput'; +import { useState, useEffect } from 'react'; +import { + Card, Box, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, + Typography, TextField, Button, Dialog, DialogTitle, DialogContent, DialogActions, + Grid, IconButton, CircularProgress, Chip, MenuItem, InputAdornment, alpha, Autocomplete, Checkbox, FormControlLabel, Tabs, Tab, Snackbar, Alert +} from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; +import SearchIcon from '@mui/icons-material/Search'; +import CloseIcon from '@mui/icons-material/Close'; +import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline'; import PageHeader from '@/components/PageHeader'; -import EmptyState from '@/components/EmptyState'; -import StatusChip from '@/components/StatusChip'; -import TabLabelCount from '@/components/TabLabelCount'; import { fetchClients } from '@/utils/apiClient'; import ClientFormDialog from '../tenants/ClientFormDialog'; @@ -124,13 +116,11 @@ function BookingFormDialog({ open, onClose, onSave, clients, surveys }) { } }, [open]); - const set = (field) => (val) => { - setFormData(prev => ({ ...prev, [field]: val })); - }; + const handleChange = (field) => (e) => setFormData(prev => ({ ...prev, [field]: e.target.value })); - const handleParcelChange = (index, field) => (val) => { + const handleParcelChange = (index, field) => (e) => { const newParcels = [...formData.parcels]; - newParcels[index] = { ...newParcels[index], [field]: val }; + newParcels[index] = { ...newParcels[index], [field]: e.target.value }; setFormData(prev => ({ ...prev, parcels: newParcels })); }; @@ -206,219 +196,214 @@ function BookingFormDialog({ open, onClose, onSave, clients, surveys }) { const uniqueProviders = Array.from(new Set(surveys.map(s => s.company).filter(Boolean))); const providerLocations = surveys.filter(s => s.company === formData.providercompany).map(s => s.area || s.address).filter(Boolean); - const num = (v) => (v === '' || v == null ? undefined : Number(v)); - const setNum = (field) => (v) => set(field)(v == null ? '' : v); return ( <> - { if (!o) onClose(); }} width={800} maxHeight="90dvh" purpose="form"> - { if (!o) onClose(); }} />} - content={ - - - {error && ( -
- {error} -
+ setError(null)} + anchorOrigin={{ vertical: 'top', horizontal: 'right' }} + sx={{ zIndex: 9999 }} + > + setError(null)} severity="error" variant="filled" sx={{ width: '100%', boxShadow: 3 }}> + {error} + + + + + Create New Booking + + Customer Details + + + + { + if (typeof option === 'string') return option; + return `${option.first_name || ''} ${option.last_name || ''} - ${option.phone || ''}`; + }} + onChange={(e, newValue) => { + if (newValue && typeof newValue === 'object') { + setFormData(prev => ({ + ...prev, + customer_name: `${newValue.first_name || ''} ${newValue.last_name || ''}`.trim(), + customer_phone: newValue.phone || '' + })); + } else { + setFormData(prev => ({ ...prev, customer_name: '', customer_phone: '' })); + } + }} + renderInput={(params) => ( + )} + /> + + + + - {/* Customer Details */} -
-
Customer Details
-
-
- - { - const selected = clients.find(c => `${c.first_name || ''} ${c.last_name || ''} - ${c.phone || ''}` === e.target.value); - if (selected) { - setFormData(prev => ({ - ...prev, - customer_name: `${selected.first_name || ''} ${selected.last_name || ''}`.trim(), - customer_phone: selected.phone || '' - })); - } else { - setFormData(prev => ({ ...prev, customer_name: '', customer_phone: '' })); - } - }} - /> - - {clients.map((c) => ( - - -
-
-
+ Assigned Provider (From Survey) + + + setFormData(prev => ({ ...prev, providercompany: val || '', providerlocation: '' }))} + renderInput={(params) => } + /> + + + setFormData(prev => ({ ...prev, providerlocation: val || '' }))} + renderInput={(params) => } + disabled={!formData.providercompany} + /> + + - {/* Assigned Provider */} -
-
Assigned Provider (From Survey)
- - setFormData(prev => ({ ...prev, providercompany: v ?? '', providerlocation: '' }))} - /> - set('providerlocation')(v ?? '')} - isDisabled={!formData.providercompany} - /> - -
+ Pickup Location + + + + + + + + - {/* Pickup Location */} -
-
Pickup Location
- - - - -
+ Delivery Destination + + + + + + setFormData(prev => ({ ...prev, deliverycity: val || '' }))} + onInputChange={(e, val) => setFormData(prev => ({ ...prev, deliverycity: val || '' }))} + renderInput={(params) => } + /> + + + + + - {/* Delivery Destination */} -
-
Delivery Destination
- - - - - set('deliverycity')(e.target.value)} /> - - {CITIES.map((c) => - - - - -
+ + Parcel Details + + + + {formData.parcels.map((parcel, idx) => ( + + + + + + + + + + + + + + + + + + removeParcel(idx)} disabled={formData.parcels.length === 1}> + + + + + ))} - {/* Parcel Details */} -
-
-
Parcel Details
-
+ + Price & Insurance + + + {quoteInfo && ( + + Estimated Base Price: ₹{quoteInfo.basequote?.toFixed(2)} (Chargeable Weight: {quoteInfo.chargeableweight} kg) + + )} + + + + + + + { + const checked = e.target.checked; + setFormData(prev => ({ + ...prev, + needsinsurance: checked, + insuranceamount: checked && prev.declaredvalue ? (parseFloat(prev.declaredvalue) * 0.01).toFixed(2) : prev.insuranceamount + })); + }} />} + label="Needs Insurance? (1%)" + sx={{ whiteSpace: 'nowrap' }} + /> + { + const val = e.target.value; + setFormData(prev => ({ + ...prev, + declaredvalue: val, + insuranceamount: prev.needsinsurance && val ? (parseFloat(val) * 0.01).toFixed(2) : prev.insuranceamount + })); + }} + /> + + + + - {formData.parcels.map((parcel, idx) => ( -
-
- -
-
- handleParcelChange(idx, 'weight')(v == null ? '' : v)} /> -
-
- handleParcelChange(idx, 'length')(v == null ? '' : v)} /> -
-
- handleParcelChange(idx, 'width')(v == null ? '' : v)} /> -
-
- handleParcelChange(idx, 'height')(v == null ? '' : v)} /> -
- -
- ))} -
- - {/* Price & Insurance */} -
-
-
Price & Insurance
-
- {quoteInfo && ( -
- Estimated Base Price: ₹{quoteInfo.basequote?.toFixed(2)} (Chargeable Weight: {quoteInfo.chargeableweight} kg) -
- )} - - -
- { - setFormData(prev => ({ - ...prev, - needsinsurance: checked, - insuranceamount: checked && prev.declaredvalue ? (parseFloat(prev.declaredvalue) * 0.01).toFixed(2) : prev.insuranceamount - })); - }} - /> -
- { - setFormData(prev => ({ - ...prev, - declaredvalue: v == null ? '' : v, - insuranceamount: prev.needsinsurance && v != null ? (v * 0.01).toFixed(2) : prev.insuranceamount - })); - }} - /> - -
-
- - {/* Additional info */} -
-
Additional Information
- - - - -
-
-
- } - footer={ - -
-
-
- } - /> -
+ Additional Information + + + + Normal + Fast Express + + + + + + + + + + + + + {/* Embedded Client Registration Form */} {clientDialogOpen && ( setClientDialogOpen(false)} onSaved={() => { setClientDialogOpen(false); - onSave(); + onSave(); // Refetch clients so they appear in dropdown }} /> )} @@ -442,8 +427,6 @@ export default function Bookings() { const [search, setSearch] = useState(''); const [sourceFilter, setSourceFilter] = useState('All'); const [formOpen, setFormOpen] = useState(false); - const [page, setPage] = useState(0); - const [rpp, setRpp] = useState(10); const loadData = async () => { setLoading(true); @@ -476,177 +459,78 @@ export default function Bookings() { return matchesSearch && matchesSource; }); - const pagedBookings = displayBookings.slice(page * rpp, page * rpp + rpp); - - const bookingColumns = useMemo(() => [ - { - key: 'bookingno', - header:
Booking No
, - width: proportional(1.5), - renderCell: (b) => ( -
- {b.bookingno} -
- ) - }, - { - key: 'deliverycity', - header: 'Delivery City', - width: proportional(1), - renderCell: (b) => { - const city = b.deliverycity || b.deliverypincode; - return city - ? {city} - : N/A; - } - }, - { - key: 'providercompany', - header: 'Provider', - width: proportional(1), - renderCell: (b) => b.providercompany - ? - : N/A - }, - { - key: 'bookingsource', - header: 'Source', - width: pixel(100), - renderCell: (b) => ( - - ) - }, - { - key: 'price', - header: 'Price', - width: pixel(120), - renderCell: (b) => ( - - {b.serviceoptions && b.serviceoptions.length > 0 ? `₹${b.serviceoptions[0].estimatedprice}` : 'N/A'} - - ) - }, - { - key: 'status', - header: 'Status', - width: pixel(150), - renderCell: (b) => - } - ], []); - - const sourceCounts = useMemo(() => { - const counts = { All: bookings.length, Customer_App: 0, CRM_Console: 0 }; - bookings.forEach((b) => { - if (b.bookingsource === 'CRM_Console') counts.CRM_Console += 1; - else counts.Customer_App += 1; - }); - return counts; - }, [bookings]); - return ( -
- -
- } - hasClear - value={search} - onChange={(v) => { setSearch(v); setPage(0); }} - /> -
-
- } - /> + + - - {/* Tab filters */} -
- {[ - { label: 'All Bookings', value: 'All' }, - { label: 'App Bookings', value: 'Customer_App' }, - { label: 'CRM Bookings', value: 'CRM_Console' } - ].map((tab) => ( -
{ setSourceFilter(tab.value); setPage(0); }} - style={{ - padding: '16px 0', - cursor: 'pointer', - borderBottom: sourceFilter === tab.value ? '2px solid #C01227' : '2px solid transparent', - color: sourceFilter === tab.value ? '#C01227' : '#64748b', - fontWeight: sourceFilter === tab.value ? 600 : 500, - fontSize: '0.875rem', - transition: 'all 0.2s' - }} - > - -
- ))} -
+ + + setSearch(e.target.value)} + size="small" + InputProps={{ + startAdornment: , + sx: { borderRadius: 3, bgcolor: alpha('#e2e8f0', 0.4) } + }} + /> + + + + + setSourceFilter(val)} aria-label="booking source filter tabs"> + + + + + {loading ? ( -
-
-
- ) : displayBookings.length === 0 ? ( - + ) : ( -
- - - )} - - {!loading && displayBookings.length > 0 && ( -
-
- Rows per page: - -
- - {displayBookings.length === 0 ? '0-0' : `${page * rpp + 1}-${Math.min((page + 1) * rpp, displayBookings.length)}`} of {displayBookings.length} - -
-
-
+ +
+ + + Booking No + Delivery City + Provider + Source + Price + Status + + + + {displayBookings.length === 0 ? ( + No bookings found. + ) : ( + displayBookings.map(b => ( + + {b.bookingno} + {b.deliverycity || b.deliverypincode || 'N/A'} + + {b.providercompany ? ( + + ) : 'N/A'} + + + + + + {b.serviceoptions && b.serviceoptions.length > 0 ? `₹${b.serviceoptions[0].estimatedprice}` : 'N/A'} + + + + + + )) + )} + +
+ )} @@ -657,31 +541,6 @@ export default function Bookings() { clients={clients} surveys={surveys} /> - -
+ ); } - -const inputStyle = { - width: '100%', - padding: '8px 12px', - borderRadius: '6px', - border: '1px solid #cbd5e1', - fontSize: '0.875rem', - color: '#1e293b', - outline: 'none', - boxSizing: 'border-box', - transition: 'border-color 0.2s', - backgroundColor: '#ffffff' -}; - -const selectStyle = { - ...inputStyle, - height: '38px', - cursor: 'pointer' -}; diff --git a/src/pages/maintenance/ComingSoon.jsx b/src/pages/maintenance/ComingSoon.jsx index d3c70a4..de12bf3 100644 --- a/src/pages/maintenance/ComingSoon.jsx +++ b/src/pages/maintenance/ComingSoon.jsx @@ -1,8 +1,5 @@ import { useState } from 'react'; -import { Button } from '@astryxdesign/core/Button'; -import { TextInput } from '@astryxdesign/core/TextInput'; -import { Text, Heading } from '@astryxdesign/core/Text'; -import { Mail } from 'lucide-react'; +import { Box, Stack, Typography, TextField, Button } from '@mui/material'; import Logo from '@/components/Logo'; @@ -17,73 +14,67 @@ export default function ComingSoon() { const [email, setEmail] = useState(''); return ( -
-
+ - Coming Soon - Something new is on its way + Coming Soon + Something new is on its way {/* Countdown */} -
+ {COUNTDOWN.map((c, i) => ( -
-
+ -
+ {String(c.value).padStart(2, '0')} -
-
+ + {c.label} -
-
+ + {i < COUNTDOWN.length - 1 && ( -
:
+ : )} -
+
))} -
+
{/* Subscribe */} -
-
- - Be the first to be notified when Doormile launches. - -
-
-
- } - value={email} - onChange={setEmail} - /> -
-
-
-
-
+ + + Be the first to be notified when Doormile launches. + + + setEmail(e.target.value)} + /> + + + + + ); } diff --git a/src/pages/maintenance/Error404.jsx b/src/pages/maintenance/Error404.jsx index 8ff0025..afd0b4b 100644 --- a/src/pages/maintenance/Error404.jsx +++ b/src/pages/maintenance/Error404.jsx @@ -1,37 +1,34 @@ import { useNavigate } from 'react-router-dom'; -import { Button } from '@astryxdesign/core/Button'; -import { Text, Heading } from '@astryxdesign/core/Text'; -import { Home } from 'lucide-react'; +import { Box, Stack, Typography, Button } from '@mui/material'; +import HomeOutlinedIcon from '@mui/icons-material/HomeOutlined'; export default function Error404() { const navigate = useNavigate(); return ( -
-
- + + 404 - -
- Page Not Found -
- - The page you are looking for was moved, removed, renamed, or might never exist! - -
-
-
+ + + Page Not Found + + The page you are looking for was moved, removed, renamed, or might never exist! + + + + ); } diff --git a/src/pages/maintenance/Error500.jsx b/src/pages/maintenance/Error500.jsx index 7291077..62998d9 100644 --- a/src/pages/maintenance/Error500.jsx +++ b/src/pages/maintenance/Error500.jsx @@ -1,37 +1,34 @@ import { useNavigate } from 'react-router-dom'; -import { Button } from '@astryxdesign/core/Button'; -import { Text, Heading } from '@astryxdesign/core/Text'; -import { Home } from 'lucide-react'; +import { Box, Stack, Typography, Button } from '@mui/material'; +import HomeOutlinedIcon from '@mui/icons-material/HomeOutlined'; export default function Error500() { const navigate = useNavigate(); return ( -
-
- + + 500 - -
- Internal Server Error -
- - Server error 500. We are fixing the problem. Please try again at a later stage. - -
-
-
+ + + Internal Server Error + + Server error 500. We are fixing the problem. Please try again at a later stage. + + + + ); } diff --git a/src/pages/maintenance/UnderConstruction.jsx b/src/pages/maintenance/UnderConstruction.jsx index 9cf9e6d..be57252 100644 --- a/src/pages/maintenance/UnderConstruction.jsx +++ b/src/pages/maintenance/UnderConstruction.jsx @@ -1,47 +1,45 @@ import { useNavigate } from 'react-router-dom'; -import { Button } from '@astryxdesign/core/Button'; -import { Text, Heading } from '@astryxdesign/core/Text'; -import { Construction, Home } from 'lucide-react'; +import { Box, Stack, Typography, Button } from '@mui/material'; +import ConstructionOutlinedIcon from '@mui/icons-material/ConstructionOutlined'; +import HomeOutlinedIcon from '@mui/icons-material/HomeOutlined'; export default function UnderConstruction() { const navigate = useNavigate(); return ( -
-
-
+ - -
- Under Construction -
- - Hey! Please check out this site later. We are doing some maintenance on it right now. - -
-
-
+ + + Under Construction + + Hey! Please check out this site later. We are doing some maintenance on it right now. + + + + ); } diff --git a/src/pages/pricing/Pricing.jsx b/src/pages/pricing/Pricing.jsx index 3d26d4b..6278978 100644 --- a/src/pages/pricing/Pricing.jsx +++ b/src/pages/pricing/Pricing.jsx @@ -1,22 +1,21 @@ -import { useState, useEffect, useMemo } from 'react'; -import { Plus, Search, Edit, ChevronDown, ChevronUp, MapPin, LayoutGrid } from 'lucide-react'; -import { Button } from '@astryxdesign/core/Button'; -import { Card } from '@astryxdesign/core/Card'; -import { Table, proportional, pixel } from '@astryxdesign/core/Table'; -import { Badge } from '@astryxdesign/core/Badge'; -import { Text, Heading } from '@astryxdesign/core/Text'; -import { IconButton } from '@astryxdesign/core/IconButton'; -import { TextInput } from '@astryxdesign/core/TextInput'; -import { Selector } from '@astryxdesign/core/Selector'; -import { Dialog, DialogHeader } from '@astryxdesign/core/Dialog'; -import { Layout, LayoutContent, LayoutFooter } from '@astryxdesign/core/Layout'; -import { FormLayout } from '@astryxdesign/core/FormLayout'; -import { Banner } from '@astryxdesign/core/Banner'; -import { Item } from '@astryxdesign/core/Item'; -import { Icon } from '@astryxdesign/core/Icon'; - +import { useState, useEffect } from 'react'; +import { + Card, Box, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, + Typography, TextField, InputAdornment, CircularProgress, MenuItem, + Select, FormControl, OutlinedInput, alpha, Avatar, Chip, Stack, Collapse, Button, + Dialog, DialogTitle, DialogContent, DialogActions, IconButton, Grid, Tooltip, Alert, Snackbar +} from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +import AddCircleOutlineIcon from '@mui/icons-material/AddCircleOutline'; +import CloseIcon from '@mui/icons-material/Close'; +import SearchIcon from '@mui/icons-material/Search'; +import StorefrontOutlinedIcon from '@mui/icons-material/StorefrontOutlined'; +import LocalShippingOutlinedIcon from '@mui/icons-material/LocalShippingOutlined'; +import PlaceOutlinedIcon from '@mui/icons-material/PlaceOutlined'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; import PageHeader from '@/components/PageHeader'; -import EmptyState from '@/components/EmptyState'; import { fetchUsers } from '@/utils/apiClient'; const API_BASE = import.meta.env.VITE_API_BASE || 'https://api.doormile.com/api/v1'; @@ -61,6 +60,8 @@ async function apiSavePricing(data) { const ZONES = ['Local / Same', 'Within Tamilnadu', 'Interstate India']; const WEIGHT_SLABS = ['< 500g', '500g - 1kg', '1kg - 2kg', '2kg - 5kg', '> 5kg']; +// isCell=true → editing a specific cell (company/slab/zone locked, only rate editable) +// isCell=false → "Add Rate" button (all fields editable) function PricingFormDialog({ open, onClose, onSave, initialData, isCell = false, pricingList = [], providerColumns = [], providerUsesServiceType = false }) { const [formData, setFormData] = useState({}); const [saving, setSaving] = useState(false); @@ -73,6 +74,9 @@ function PricingFormDialog({ open, onClose, onSave, initialData, isCell = false, } }, [open, initialData]); + const set = (field) => (e) => setFormData(prev => ({ ...prev, [field]: e.target.value })); + + // Column key: zone if available, otherwise service_type (e.g. DTDC) const colKey = (p) => ((p.zone || '').trim() || (p.service_type || '').trim()); const findExistingRecord = (data) => { @@ -99,6 +103,7 @@ function PricingFormDialog({ open, onClose, onSave, initialData, isCell = false, setError(null); try { let dataToSave = { ...formData }; + // Route the column value to the right field based on provider type if (!isCell) { dataToSave = { ...dataToSave, @@ -121,93 +126,85 @@ function PricingFormDialog({ open, onClose, onSave, initialData, isCell = false, } }; - if (!open) return null; - - const zoneOptions = providerColumns.length > 0 ? providerColumns : ZONES; - return ( - { if (!o) onClose(); }} width={440} purpose="form"> - { if (!o) onClose(); }} - /> - } - content={ - - - {error && } + <> + setError(null)} + anchorOrigin={{ vertical: 'top', horizontal: 'right' }} + sx={{ zIndex: 9999 }} + > + setError(null)} severity="error" variant="filled" sx={{ width: '100%', boxShadow: 3 }}> + {error} + + - {isCell ? ( - - Updating rate for -
- {formData.company} -
-
- {formData.weight_slab} · {formData.zone || formData.service_type} -
-
- ) : ( - <> - setFormData((prev) => ({ ...prev, company: v }))} - /> - setFormData((prev) => ({ ...prev, weight_slab: v || '' }))} - /> - setFormData((prev) => ({ - ...prev, - zone: providerUsesServiceType ? '' : (v || ''), - service_type: providerUsesServiceType ? (v || '') : '' - }))} - /> - - )} - - setFormData((prev) => ({ ...prev, rate: v }))} - /> -
-
- } - footer={ - -
-
-
- } - /> + + + {isCell ? (initialData?.id ? 'Edit Rate' : 'Add Rate') : (initialData?.id ? 'Edit Rate' : 'Add New Rate')} + + + + + {isCell ? ( + + + UPDATING RATE FOR + {formData.company} + {formData.weight_slab} · {formData.zone || formData.service_type} + + + ) : ( + <> + + + + + + {WEIGHT_SLABS.map(s => {s})} + + + + setFormData(prev => ({ + ...prev, + zone: providerUsesServiceType ? '' : e.target.value, + service_type: providerUsesServiceType ? e.target.value : '' + }))} + size="small" + > + {(providerColumns.length > 0 ? providerColumns : ZONES).map(z => ( + {z} + ))} + + + + )} + + + + + + + + + + ); } @@ -226,9 +223,9 @@ export default function Pricing() { const [selectedProvider, setSelectedProvider] = useState(''); const [searchQuery, setSearchQuery] = useState(''); const [locationsOpen, setLocationsOpen] = useState(false); - const [locationSearch, setLocationSearch] = useState(''); const [formOpen, setFormOpen] = useState(false); const [editingRecord, setEditingRecord] = useState(null); + const [isEditMode, setIsEditMode] = useState(false); const [isCellEdit, setIsCellEdit] = useState(false); const [users, setUsers] = useState([]); @@ -256,6 +253,7 @@ export default function Pricing() { return loadData(); }, []); + // Ensure absolutely unique companies and default selection const companies = [...new Set(pricingList.map(p => p.company).filter(Boolean))]; useEffect(() => { if (!selectedProvider && companies.length > 0) { @@ -264,23 +262,19 @@ export default function Pricing() { }, [companies, selectedProvider]); const providerRates = pricingList.filter(p => p.company === selectedProvider); + // Normalize: lowercase, trim edges, collapse internal spaces const normCompany = (s) => (s || '').toLowerCase().trim().replace(/\s+/g, ' '); const normProvider = normCompany(selectedProvider); const providerSurveys = surveysList.filter(p => { const pn = normCompany(p.company); + // Exact after normalising, or one name starts with the other (handles "Pvt Ltd" suffixes) return pn === normProvider || pn.startsWith(normProvider) || normProvider.startsWith(pn); }); - const filteredSurveys = useMemo(() => { - if (!locationSearch.trim()) return providerSurveys; - const q = locationSearch.toLowerCase(); - return providerSurveys.filter((s) => - (s.area || '').toLowerCase().includes(q) || (s.address || '').toLowerCase().includes(q) - ); - }, [providerSurveys, locationSearch]); - + // Sort by ID desc so most recent record wins when duplicates exist const sortedProviderRates = [...providerRates].sort((a, b) => (b.id || 0) - (a.id || 0)); + // Extract numeric weight from a slab string for sorting rows logically const slabSortWeight = (slab) => { const s = (slab || '').toLowerCase().replace(/\s+/g, ''); const nums = s.match(/[\d.]+/g); @@ -292,23 +286,15 @@ export default function Pricing() { return grams; }; - const normalizeZone = (z) => { - if (!z) return ''; - let val = z.trim(); - const lower = val.toLowerCase().replace(/\s+/g, ''); - if (lower === 'tamilnadu') return 'Tamil Nadu'; - if (lower === 'karanataka' || lower === 'karnataka') return 'Karnataka'; - if (lower === 'local' || lower === 'localsame' || lower === 'local/same') return 'Local'; - if (lower === 'central/northindia' || lower === 'central/north') return 'Central/North India'; - return val; - }; - - const getColKey = (r) => normalizeZone((r.zone || '').trim() || (r.service_type || '').trim()); + // Use zone if available, fall back to service_type (e.g. DTDC has service_type instead of zone) + const getColKey = (r) => ((r.zone || '').trim() || (r.service_type || '').trim()); const providerUsesServiceType = sortedProviderRates.length > 0 && sortedProviderRates.every(r => !(r.zone || '').trim()); + // Dynamic columns — whichever field the provider uses for differentiation const providerZones = [...new Set(sortedProviderRates.map(getColKey).filter(Boolean))].sort(); + // Dynamic rows: every unique weight slab, sorted by actual weight const allProviderSlabs = [...new Set(sortedProviderRates.map(r => (r.weight_slab || '').trim()).filter(Boolean))] .sort((a, b) => slabSortWeight(a) - slabSortWeight(b)); @@ -316,281 +302,321 @@ export default function Pricing() { ? allProviderSlabs.filter(s => s.toLowerCase().includes(searchQuery.toLowerCase())) : allProviderSlabs; - const matrixData = useMemo( - () => displaySlabs.map((slab) => ({ - slab, - rates: Object.fromEntries( - providerZones.map((zone) => [ - zone, - sortedProviderRates.find(r => (r.weight_slab || '').trim() === slab && getColKey(r) === zone) || null - ]) - ) - })), - [displaySlabs, providerZones, sortedProviderRates] - ); - - const matrixColumns = useMemo(() => { - const openCellEdit = (slab, zone, match) => { - setEditingRecord({ - id: match ? match.id : undefined, - company: selectedProvider, - weight_slab: slab, - zone: providerUsesServiceType ? '' : zone, - service_type: providerUsesServiceType ? zone : (match?.service_type || ''), - rate: match ? String(match.rate) : '' - }); - setIsCellEdit(true); - setFormOpen(true); - }; - - return [ - { - key: 'slab', - header:
Weight Slab
, - width: pixel(180), - renderCell: (row) => ( -
- {row.slab} -
- ) - }, - ...providerZones.map((zone) => ({ - key: zone, - header: zone, - width: proportional(1), - align: 'center', - renderCell: (row) => { - const match = row.rates[zone]; - const hasRate = !!match; - return ( -
- {hasRate ? ( - - ) : ( - - )} - -
- ); - } - })) - ]; - }, [providerZones, selectedProvider, providerUsesServiceType]); - return ( -
+ -
- setSelectedProvider(v || '')} - /> -
-
- } - hasClear - value={searchQuery} - onChange={(v) => setSearchQuery(v)} - /> -
-
- } + breadcrumbs={[{ label: 'Pricing Overview' }]} /> -
+ + + {/* Modern Premium Control Panel */} + + + + + + + + Active Logistics Provider + + + + + + - {/* Collapsible Provider Profile */} + + setSearchQuery(e.target.value)} + InputProps={{ + startAdornment: , + sx: { + borderRadius: 50, + bgcolor: alpha('#e2e8f0', 0.3), + '& fieldset': { border: 'none' }, + '&:hover': { bgcolor: alpha('#e2e8f0', 0.5) }, + '&.Mui-focused': { bgcolor: '#fff', '& fieldset': { border: '2px solid', borderColor: 'primary.main' } } + } + }} + /> + + + + + + {/* Minimalist Collapsible Provider Profile Widget */} {selectedProvider && providerSurveys.length > 0 && ( - -
setLocationsOpen(!locationsOpen)} > -
-
+ + {/* Avatar & Title */} + + {(selectedProvider || 'A')[0].toUpperCase()} -
-
- {selectedProvider} -
- - {providerSurveys.length} location{providerSurveys.length !== 1 && 's'} -
-
-
+ + + LOGISTICS PARTNER + {selectedProvider} + + + {providerSurveys.length} Registered Location{providerSurveys.length !== 1 && 's'} + + + + + {/* Badges & Action */} + + + + + + + + - : } - /> -
+ - {locationsOpen && ( -
-
-
- } - hasClear - value={locationSearch} - onChange={(v) => setLocationSearch(v)} + + + + + ALL SERVICED AREAS: + + + {providerSurveys.map((s, idx) => ( + -
- - {filteredSurveys.length} of {providerSurveys.length} serviced location{providerSurveys.length !== 1 ? 's' : ''} - -
- - {filteredSurveys.length === 0 ? ( - - - - ) : ( -
- {filteredSurveys.map((s, idx) => { - const title = s.area || s.address || 'Unknown area'; - const subtitle = s.area && s.address ? s.address : null; - const mapQuery = s.plus_code ? `${s.plus_code} ${s.address || ''}`.trim() : (s.address || s.area); - const mapUrl = mapQuery ? `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(mapQuery)}` : undefined; - return ( -
- } - endContent={mapUrl ? : undefined} - href={mapUrl} - target={mapUrl ? '_blank' : undefined} - rel={mapUrl ? 'noopener noreferrer' : undefined} - /> -
- ); - })} -
- )} -
- )} + ))} +
+ + )} - {/* Pricing Data Matrix */} - -
-
-
- -
-
- Rate Matrix - Weight slab × zone pricing grid{selectedProvider ? ` for ${selectedProvider}` : ''} -
-
- {!loading && providerZones.length > 0 && ( -
- - -
- )} -
- + {/* Pricing Data Grid */} + {loading ? ( -
-
-
- ) : providerZones.length === 0 ? ( - - ) : displaySlabs.length === 0 ? ( - + + + ) : ( - + +
+ + + Weight Slab + {providerZones.map(zone => ( + + {zone} + + ))} + + + + {providerZones.length === 0 ? ( + + + + No pricing data for this provider yet. + + + + ) : displaySlabs.length === 0 ? ( + + + + No weight slabs match your search. + + + + ) : ( + displaySlabs.map((slab) => ( + + + {slab} + + {providerZones.map(zone => { + // Exact match — use getColKey so DTDC service_type columns work too + const match = sortedProviderRates.find(r => (r.weight_slab || '').trim() === slab && getColKey(r) === zone); + const hasRate = !!match; + const rateStr = match ? `₹${match.rate}` : '—'; + + let tooltipText = ''; + if (match && match.updated_by) { + const updater = users.find(u => u.id === match.updated_by); + tooltipText = `Last updated by: ${updater ? updater.first_name : 'ID ' + match.updated_by}`; + } + + const openCellEdit = () => { + setEditingRecord({ + id: match ? match.id : undefined, + company: selectedProvider, + weight_slab: slab, + zone: providerUsesServiceType ? '' : zone, + service_type: providerUsesServiceType ? zone : (match?.service_type || ''), + rate: match ? String(match.rate) : '' + }); + setIsCellEdit(true); + setFormOpen(true); + }; + + return ( + + + + + {rateStr} + + {isEditMode && ( + hasRate + ? + : + )} + + + + ); + })} + + )) + )} + +
+ )} -
+ - -
+ ); } diff --git a/src/pages/survey/Survey.jsx b/src/pages/survey/Survey.jsx index ac1129b..8245f49 100644 --- a/src/pages/survey/Survey.jsx +++ b/src/pages/survey/Survey.jsx @@ -1,43 +1,27 @@ -import { useState, useEffect } from 'react'; +import { useState, useEffect, Fragment } from 'react'; import { fetchUsers, deleteCompetitorBranch } from '@/utils/apiClient'; import { - Search, - Edit, - Trash2, - Phone, - MapPin, - FileText, - ChevronDown, - ChevronUp, - Store, - Truck, - Map, - Plus, - X, - CheckCircle2, - AlertCircle -} from 'lucide-react'; -import { Button } from '@astryxdesign/core/Button'; -import { Card } from '@astryxdesign/core/Card'; -import { Dialog, DialogHeader } from '@astryxdesign/core/Dialog'; -import { Layout, LayoutContent, LayoutFooter } from '@astryxdesign/core/Layout'; -import { FormLayout } from '@astryxdesign/core/FormLayout'; -import { TextInput } from '@astryxdesign/core/TextInput'; -import { TextArea } from '@astryxdesign/core/TextArea'; -import { Selector } from '@astryxdesign/core/Selector'; -import { AlertDialog } from '@astryxdesign/core/AlertDialog'; -import { Text, Heading } from '@astryxdesign/core/Text'; -import { Badge } from '@astryxdesign/core/Badge'; -import { IconButton } from '@astryxdesign/core/IconButton'; -import { Banner } from '@astryxdesign/core/Banner'; + Card, Box, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, + Typography, TextField, InputAdornment, IconButton, Collapse, TablePagination, Stack, CircularProgress, alpha, + Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, MenuItem, Alert, Autocomplete, Snackbar +} from '@mui/material'; +import SearchIcon from '@mui/icons-material/Search'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline'; +import PhoneOutlinedIcon from '@mui/icons-material/PhoneOutlined'; +import PlaceOutlinedIcon from '@mui/icons-material/PlaceOutlined'; +import AssignmentOutlinedIcon from '@mui/icons-material/AssignmentOutlined'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; +import StorefrontOutlinedIcon from '@mui/icons-material/StorefrontOutlined'; +import LocalShippingOutlinedIcon from '@mui/icons-material/LocalShippingOutlined'; +import MapOutlinedIcon from '@mui/icons-material/MapOutlined'; +import { Avatar, Button, Chip, Grid } from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; +import CloseIcon from '@mui/icons-material/Close'; import PageHeader from '@/components/PageHeader'; import StatCard from '@/components/StatCard'; -import EmptyState from '@/components/EmptyState'; - -function isQuoted(row) { - return !!(row.rate_per_kg && !String(row.rate_per_kg).toLowerCase().includes('not answered')); -} const API_BASE = import.meta.env.VITE_API_BASE || 'https://api.doormile.com/api/v1'; @@ -49,62 +33,83 @@ const getHeaders = () => { }; }; -function Pill({ label, color = 'neutral', truncate = false }) { - if (!label) return ; - - const badgeStyles = { - success: { bg: '#E3F6EC', fg: '#00773B' }, - warning: { bg: '#FFF7E0', fg: '#8A6500' }, - info: { bg: '#E0F7F8', fg: '#00727B' }, - error: { bg: '#FEEAE9', fg: '#A82216' }, - primary: { bg: '#F8E0E3', fg: '#9E0E20' }, - neutral: { bg: '#f1f5f9', fg: '#475569' } - }; - - const style = badgeStyles[color] || badgeStyles.neutral; +const FIELD_LABEL_SX = { textTransform: 'uppercase', letterSpacing: 0.4, fontSize: '0.68rem', fontWeight: 700, color: 'grey.700' }; +function Pill({ label, color = 'default' }) { + if (!label) return ; return ( - - {label} - + ); } function Field({ label, children }) { return ( -
- {label} -
{children}
-
+ + {label} + {children} + + ); +} + +function MagicStatCard({ title, value, icon: Icon, gradient, percentage }) { + return ( + + + + + {title} + + + + + + + + {value} + + {percentage && ( + + )} + + + + ); } function SectionCard({ icon: Icon, title, children }) { return ( -
-
- - {title} -
-
{children}
-
+ + + + {title} + + {children} + ); } @@ -133,8 +138,9 @@ async function apiSaveSurvey(data) { } async function apiSavePricing(data) { - const url = `${API_BASE}/admin/carrier-pricing`; - const method = 'POST'; + const isUpdate = !!data.id; + const url = isUpdate ? `${API_BASE}/admin/carrier-pricing/${data.id}` : `${API_BASE}/admin/carrier-pricing`; + const method = isUpdate ? 'PUT' : 'POST'; const res = await fetch(url, { method, headers: getHeaders(), @@ -177,13 +183,13 @@ function SurveyFormDialog({ open, onClose, onSave, initialData }) { } }, [open, initialData]); - const set = (field) => (val) => { - setFormData(prev => ({ ...prev, [field]: val })); + const handleChange = (field) => (e) => { + setFormData(prev => ({ ...prev, [field]: e.target.value })); }; - const handleSlabChange = (index, field) => (val) => { + const handleSlabChange = (index, field) => (e) => { const newSlabs = [...(formData.slabs || [])]; - newSlabs[index] = { ...newSlabs[index], [field]: val }; + newSlabs[index] = { ...newSlabs[index], [field]: e.target.value }; setFormData(prev => ({ ...prev, slabs: newSlabs })); }; @@ -200,9 +206,9 @@ function SurveyFormDialog({ open, onClose, onSave, initialData }) { setFormData(prev => ({ ...prev, slabs: newSlabs })); }; - const handlePincodeChange = (index) => (val) => { + const handlePincodeChange = (index) => (e) => { const newPincodes = [...(formData.pincodes || [])]; - newPincodes[index] = val; + newPincodes[index] = e.target.value; setFormData(prev => ({ ...prev, pincodes: newPincodes })); }; @@ -226,7 +232,7 @@ function SurveyFormDialog({ open, onClose, onSave, initialData }) { if (formData.pincodes && formData.pincodes.length > 0) { const invalidPincodes = formData.pincodes.filter(p => p.trim() && !/^\d{6}$/.test(p.trim())); if (invalidPincodes.length > 0) { - throw new Error(`Invalid pincodes: ${invalidPincodes.join(', ')}. Must be 6 digits.`); + throw new Error(`Invalid pincodes detected: ${invalidPincodes.join(', ')}. All pincodes must be exactly 6 numeric digits.`); } } @@ -263,6 +269,7 @@ function SurveyFormDialog({ open, onClose, onSave, initialData }) { })); } catch (err) { console.error("Failed to save pricing slabs", err); + // Continue anyway since survey was saved } } @@ -276,127 +283,151 @@ function SurveyFormDialog({ open, onClose, onSave, initialData }) { } }; - const YES_NO = [{ value: 'yes', label: 'Yes' }, { value: 'no', label: 'No' }]; - const FREQUENCY_OPTIONS = ['Daily', 'Weekly', 'Bi-weekly', 'Monthly', 'On-demand']; - const WEIGHT_SLAB_OPTIONS = WEIGHT_SLABS.map((s) => ({ value: s, label: s })); - const ZONE_OPTIONS = ZONES.map((z) => ({ value: z, label: z })); - return ( - { if (!o) onClose(); }} width={600} maxHeight="90dvh" purpose="form"> - { if (!o) onClose(); }} />} - content={ - - - {error && } + <> + setError(null)} + anchorOrigin={{ vertical: 'top', horizontal: 'right' }} + sx={{ zIndex: 9999 }} + > + setError(null)} severity="error" variant="filled" sx={{ width: '100%', boxShadow: 3 }}> + {error} + + - - - - - - - - - - - - - - - - - - set('frequency')(v ?? '')} - /> - - - -
-
- SERVICEABLE PINCODES -
- {(formData.pincodes || []).map((pincode, index) => ( -
-
- -
- -
- ))} -
- -