From f16c7eb4dd3fbef4777932bc00f172468c36cc24 Mon Sep 17 00:00:00 2001 From: Ashwin Kumar Date: Wed, 25 Mar 2026 22:13:11 +0100 Subject: [PATCH] feat: add users and companies dashboard route surfaces --- package-lock.json | 349 +++++++++++++++++- package.json | 2 + src/app.css | 139 +++---- src/components/admin/AdminShell.tsx | 88 +++-- src/components/dashboard/DashboardLayout.tsx | 125 ++++--- src/lib/auth.ts | 26 +- src/lib/runtime/types.ts | 1 + src/routes/admin/index.tsx | 6 +- src/routes/api/runtime/onboarding/schema.ts | 76 +++- src/routes/auth/login/index.tsx | 2 +- src/routes/auth/register/index.tsx | 20 +- src/routes/companies/applications.tsx | 5 + src/routes/companies/feedback.tsx | 5 + src/routes/companies/job-postings.tsx | 5 + src/routes/companies/profile.tsx | 12 + src/routes/companies/settings.tsx | 12 + src/routes/companies/support.tsx | 12 + src/routes/companies/tracecoins.tsx | 5 + src/routes/dashboard/applications/index.tsx | 4 +- src/routes/dashboard/jobs/index.tsx | 2 +- src/routes/dashboard/notifications.tsx | 2 +- src/routes/dashboard/services/index.tsx | 2 +- src/routes/dashboard/wallet/index.tsx | 2 +- src/routes/dashboard/wallet/ledger.tsx | 2 +- src/routes/forgot-password.tsx | 2 +- src/routes/onboarding.tsx | 54 ++- src/routes/users/dashboard.tsx | 5 + src/routes/users/leads.tsx | 5 + src/routes/users/notifications.tsx | 5 + src/routes/users/onboarding/index.tsx | 5 + .../users/onboarding/role-selection.tsx | 5 + src/routes/users/professional/portfolio.tsx | 5 + src/routes/users/profile.tsx | 5 + src/routes/users/requirements/new.tsx | 12 + src/routes/users/settings.tsx | 5 + src/routes/users/support.tsx | 5 + src/routes/users/verification-status.tsx | 5 + src/routes/verify-email.tsx | 2 +- src/routes/workspace.tsx | 184 ++++++--- vite.config.ts | 7 +- 40 files changed, 937 insertions(+), 278 deletions(-) create mode 100644 src/routes/companies/applications.tsx create mode 100644 src/routes/companies/feedback.tsx create mode 100644 src/routes/companies/job-postings.tsx create mode 100644 src/routes/companies/profile.tsx create mode 100644 src/routes/companies/settings.tsx create mode 100644 src/routes/companies/support.tsx create mode 100644 src/routes/companies/tracecoins.tsx create mode 100644 src/routes/users/dashboard.tsx create mode 100644 src/routes/users/leads.tsx create mode 100644 src/routes/users/notifications.tsx create mode 100644 src/routes/users/onboarding/index.tsx create mode 100644 src/routes/users/onboarding/role-selection.tsx create mode 100644 src/routes/users/professional/portfolio.tsx create mode 100644 src/routes/users/profile.tsx create mode 100644 src/routes/users/requirements/new.tsx create mode 100644 src/routes/users/settings.tsx create mode 100644 src/routes/users/support.tsx create mode 100644 src/routes/users/verification-status.tsx diff --git a/package-lock.json b/package-lock.json index fab6c99..b43f0f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,8 @@ "vinxi": "^0.5.7" }, "devDependencies": { + "@tailwindcss/vite": "^4.2.2", + "tailwindcss": "^4.2.2", "vitest": "^3.2.4" }, "engines": { @@ -355,7 +357,6 @@ "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" @@ -367,7 +368,6 @@ "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -378,7 +378,6 @@ "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -968,7 +967,6 @@ "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", @@ -2287,6 +2285,288 @@ "integrity": "sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==", "license": "CC0-1.0" }, + "node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/node/node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", + "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "tailwindcss": "4.2.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, "node_modules/@tanstack/directive-functions-plugin": { "version": "1.121.21", "resolved": "https://registry.npmjs.org/@tanstack/directive-functions-plugin/-/directive-functions-plugin-1.121.21.tgz", @@ -2367,7 +2647,6 @@ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -4185,6 +4464,20 @@ "node": ">= 0.8" } }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -5204,9 +5497,8 @@ "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "devOptional": true, "license": "MPL-2.0", - "optional": true, - "peer": true, "dependencies": { "detect-libc": "^2.0.3" }, @@ -5238,12 +5530,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "android" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -5259,12 +5551,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -5280,12 +5572,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -5301,12 +5593,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -5322,12 +5614,12 @@ "cpu": [ "arm" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -5343,12 +5635,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -5364,12 +5656,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -5385,12 +5677,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -5406,12 +5698,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -5427,12 +5719,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -5448,12 +5740,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -7527,6 +7819,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.1.tgz", + "integrity": "sha512-b+u3CEM6FjDHru+nhUSjDofpWSBp2rINziJWgApm72wwGasQ/wKXftZe4tI2Y5HPv6OpzXSZHOFq87H4vfsgsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/tar": { "version": "7.5.11", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", diff --git a/package.json b/package.json index 94e5008..9e1453c 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,8 @@ "vinxi": "^0.5.7" }, "devDependencies": { + "@tailwindcss/vite": "^4.2.2", + "tailwindcss": "^4.2.2", "vitest": "^3.2.4" }, "engines": { diff --git a/src/app.css b/src/app.css index 0de5d2e..e176a89 100644 --- a/src/app.css +++ b/src/app.css @@ -1,7 +1,8 @@ @import url('https://fonts.googleapis.com/css2?family=Exo+2:wght@400;500;600;700;800&display=swap'); +@import "tailwindcss"; :root { - --brand-orange: #fd6216; + --brand-orange: #fd6116; --brand-orange-dark: #e45a14; --brand-navy: #050026; --ink: #100b2f; @@ -240,7 +241,7 @@ body { color: #64748b; } -.grid { +.page-grid { display: grid; grid-template-columns: 1.25fr 0.75fr; gap: 16px; @@ -354,7 +355,7 @@ body { } .contact-upload-icon { - color: #fd6216; + color: #fd6116; font-size: 14px; } @@ -382,7 +383,7 @@ body { display: inline-flex; align-items: center; justify-content: center; - color: #fd6216; + color: #fd6116; } .contact-icon svg { @@ -516,7 +517,7 @@ body { } .help-clear-filter { - color: #fd6216; + color: #fd6116; font-size: 12px; font-weight: 700; text-decoration: underline; @@ -545,7 +546,7 @@ body { .help-category-pill-active { border-color: rgba(253, 98, 22, 0.45); background: #fff4ec; - color: #fd6216; + color: #fd6116; } .help-article-card { @@ -562,7 +563,7 @@ body { } .help-article-link:hover { - color: #fd6216; + color: #fd6116; } .help-article-summary { @@ -599,7 +600,7 @@ body { } .help-read-link { - color: #fd6216; + color: #fd6116; font-size: 13px; font-weight: 700; text-decoration: none; @@ -793,12 +794,12 @@ body { height: 2px; transform: scaleX(0); transform-origin: left; - background: #fd6216; + background: #fd6116; transition: transform 260ms ease; } .public-header .nav-links a:hover { - color: #fd6216; + color: #fd6116; } .public-header .nav-links a:hover::after { @@ -807,7 +808,7 @@ body { .public-header .nav-links a.active, .public-header .nav-links a[aria-current='page'] { - color: #fd6216; + color: #fd6116; } .public-header .nav-links a.active::after, @@ -846,7 +847,7 @@ body { .nav-auth-primary { border: 1px solid rgba(253, 98, 22, 0.72); - background: #fd6216; + background: #fd6116; color: #fff; box-shadow: 0 0 0 1px rgba(253, 98, 22, 0.4) inset, 0 12px 24px -16px rgba(253, 98, 22, 0.9); } @@ -935,7 +936,7 @@ body { .mobile-signup { border: 1px solid rgba(253, 98, 22, 0.72); - background: #fd6216; + background: #fd6116; color: #fff; } @@ -1111,8 +1112,8 @@ body { } .chip-btn.active { - border-color: #fd6216; - background: #fd6216; + border-color: #fd6116; + background: #fd6116; color: #fff; box-shadow: 0 8px 18px -10px rgba(253, 98, 22, 0.8); } @@ -1192,7 +1193,7 @@ body { } .path-icon { - color: #fd6216; + color: #fd6116; width: 20px; height: 20px; display: inline-flex; @@ -1234,7 +1235,7 @@ body { .path-chip svg { width: 14px; height: 14px; - stroke: #fd6216; + stroke: #fd6116; fill: none; stroke-width: 2; } @@ -1275,7 +1276,7 @@ body { border-radius: 999px; border: 1px solid rgba(253, 98, 22, 0.5); background: #fff; - color: #fd6216; + color: #fd6116; font-size: 16px; cursor: pointer; } @@ -1337,7 +1338,7 @@ body { .lp-path-dot.active { width: 28px; - background: #fd6216; + background: #fd6116; } .path-body h3 { @@ -1417,7 +1418,7 @@ body { } .step-item.active { - border-color: #fd6216; + border-color: #fd6116; background: #fff7ed; } @@ -1428,7 +1429,7 @@ body { align-items: center; justify-content: center; border-radius: 999px; - background: #fd6216; + background: #fd6116; color: #fff; font-size: 12px; font-weight: 700; @@ -1503,7 +1504,7 @@ body { .faq-q-icon.open { transform: rotate(180deg); - color: #fd6216; + color: #fd6116; } .faq-a { @@ -1608,7 +1609,7 @@ body { } .public-footer-links a:hover { - color: #fd6216; + color: #fd6116; } @media (min-width: 640px) { @@ -1865,7 +1866,7 @@ body { border-radius: 999px; border: 1px solid rgba(253, 98, 22, 0.46); background: rgba(255, 255, 255, 0.14); - color: #fd6216; + color: #fd6116; backdrop-filter: blur(14px); box-shadow: 0 18px 36px -22px rgba(2, 6, 23, 0.8), @@ -1935,7 +1936,7 @@ body { .lp-primary-btn { border: 1px solid rgba(253, 98, 22, 0.72); - background: #fd6216; + background: #fd6116; color: #fff; box-shadow: 0 0 0 1px rgba(253, 98, 22, 0.4) inset, 0 12px 24px -16px rgba(253, 98, 22, 0.9); } @@ -2343,7 +2344,7 @@ body { height: 3px; width: 100%; transform-origin: left; - background: linear-gradient(90deg, #fd6216, rgba(255, 188, 153, 0.9)); + background: linear-gradient(90deg, #fd6116, rgba(255, 188, 153, 0.9)); animation: whyTrackFill 4.2s linear forwards; z-index: 3; } @@ -2551,7 +2552,7 @@ body { } .hiwCodeStepActive { - border-color: #fd6216; + border-color: #fd6116; box-shadow: 0 0 0 3px rgba(253, 98, 22, 0.12); background: linear-gradient(145deg, #fff7f1 0%, #fff 100%); transform: translateY(-1px); @@ -2563,7 +2564,7 @@ body { border-radius: 999px; border: 1px solid rgba(253, 98, 22, 0.48); background: #fff3eb; - color: #fd6216; + color: #fd6116; display: inline-flex; align-items: center; justify-content: center; @@ -2633,7 +2634,7 @@ body { .hiwCodeDotActive { width: 20px; - background: #fd6216; + background: #fd6116; } @keyframes whyCardBreath { @@ -2733,7 +2734,7 @@ body { } .lp-dot.active { - background: #fd6216; + background: #fd6116; } @keyframes lp-float-slow { @@ -2905,7 +2906,7 @@ body { .onboarding-progress-fill { height: 100%; border-radius: 999px; - background: #fd6216; + background: #fd6116; transition: width 220ms ease; } @@ -2938,7 +2939,7 @@ body { } .multi-select-option.is-selected { - border-color: #fd6216; + border-color: #fd6116; background: #fff2ea; color: #2c3551; box-shadow: 0 0 0 1px rgba(253, 98, 22, 0.12); @@ -2946,7 +2947,7 @@ body { .multi-select-option:focus-visible { outline: none; - border-color: #fd6216; + border-color: #fd6116; box-shadow: 0 0 0 2px #ffd8c3; } @@ -2986,8 +2987,8 @@ body { } .multi-select-tick.is-visible { - border-color: #fd6216; - background: #fd6216; + border-color: #fd6116; + background: #fd6116; color: #ffffff; } @@ -3113,7 +3114,7 @@ body { .auth-form .input:focus, .auth-form .select:focus, .auth-form .textarea:focus { - border-color: #fd6216; + border-color: #fd6116; box-shadow: 0 0 0 2px #ffd8c3; } @@ -3127,7 +3128,7 @@ body { .auth-forgot-link { font-size: 12px; font-weight: 700; - color: #fd6216; + color: #fd6116; text-decoration: underline; } @@ -3222,7 +3223,7 @@ body { height: 44px; border: 0; border-radius: 12px; - background: #fd6216; + background: #fd6116; color: #fff; font-size: 14px; font-weight: 700; @@ -3246,7 +3247,7 @@ body { } .auth-footer-row a { - color: #fd6216; + color: #fd6116; font-weight: 600; text-decoration: none; } @@ -3270,7 +3271,7 @@ body { min-width: 20px; margin-top: 2px; cursor: pointer; - accent-color: #fd6216; + accent-color: #fd6116; } .auth-checkbox-label { @@ -3280,7 +3281,7 @@ body { } .auth-checkbox-label a { - color: #fd6216; + color: #fd6116; text-decoration: underline; font-weight: 600; } @@ -3343,7 +3344,7 @@ body { height: 46px; border-radius: 999px; border: 1px solid rgba(253, 98, 22, 0.75); - background: #fd6216; + background: #fd6116; color: #fff; font-size: 20px; font-weight: 700; @@ -3416,7 +3417,7 @@ body { top: 0; width: 2px; border-radius: 999px; - background: #fd6216; + background: #fd6116; box-shadow: 0 0 16px rgba(253, 98, 22, 0.66); transition: height 260ms ease; } @@ -3446,7 +3447,7 @@ body { } .about-chapter-item-active a { - color: #fd6216; + color: #fd6116; text-shadow: 0 0 14px rgba(253, 98, 22, 0.55); } @@ -3487,7 +3488,7 @@ body { } .about-kicker-orange { - color: #fd6216; + color: #fd6116; } .about-title { @@ -3579,7 +3580,7 @@ body { } .about-chapter-label-orange { - color: #fd6216; + color: #fd6116; } .about-chapter-title { @@ -3806,7 +3807,7 @@ body { font-weight: 700; text-transform: uppercase; letter-spacing: 0.13em; - color: #fd6216; + color: #fd6116; } .about-chapter-two-panel-title { @@ -3843,7 +3844,7 @@ body { width: 8px; height: 8px; border-radius: 999px; - background: #fd6216; + background: #fd6116; box-shadow: 0 0 0 5px rgba(253, 98, 22, 0.14); } @@ -3902,7 +3903,7 @@ body { width: 8px; height: 8px; border-radius: 999px; - background: #fd6216; + background: #fd6116; } .about-trust-num { @@ -3911,7 +3912,7 @@ body { font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; - color: #fd6216; + color: #fd6116; } .about-trust-sequence-card h3 { @@ -4023,7 +4024,7 @@ body { } .about-orange-word { - color: #fd6216; + color: #fd6116; text-shadow: 0 0 22px rgba(253, 98, 22, 0.45); } @@ -4180,7 +4181,7 @@ body { width: 24px; height: 24px; border-radius: 999px; - background: #fd6216; + background: #fd6116; color: #fff; font-size: 11px; font-weight: 700; @@ -4401,7 +4402,7 @@ body { .sidebar-role-badge .role-badge { background: rgba(253, 98, 22, 0.18); border: 1px solid rgba(253, 98, 22, 0.35); - color: #fd6216; + color: #fd6116; font-size: 11px; font-weight: 700; letter-spacing: 0.08em; @@ -4443,7 +4444,7 @@ body { .nav-item-active, .nav-item[aria-current="page"] { background: rgba(253, 98, 22, 0.18); - color: #fd6216; + color: #fd6116; } .nav-item-logout { @@ -4637,7 +4638,7 @@ body { .kpi-link { font-size: 12px; font-weight: 700; - color: #fd6216; + color: #fd6116; text-decoration: none; margin-top: auto; } @@ -4669,7 +4670,7 @@ body { font-size: 11px; font-weight: 700; letter-spacing: 0.08em; - color: #fd6216; + color: #fd6116; text-transform: uppercase; } @@ -4697,7 +4698,7 @@ body { .tour-progress span { display: block; height: 100%; - background: linear-gradient(90deg, #fd6216, #ff8a4d); + background: linear-gradient(90deg, #fd6116, #ff8a4d); transition: width 200ms ease; } @@ -4816,7 +4817,7 @@ body { } .role-path-card.selected { - border-color: #fd6216; + border-color: #fd6116; box-shadow: 0 0 0 2px rgba(253, 98, 22, 0.28), 0 22px 42px -30px rgba(253, 98, 22, 0.85); } @@ -4880,7 +4881,7 @@ body { } .role-card.selected { - border-color: #fd6216; + border-color: #fd6116; background: #ffffff; box-shadow: 0 0 0 2px rgba(253, 98, 22, 0.3) inset, 0 24px 52px -20px rgba(253, 98, 22, 0.3); } @@ -4932,7 +4933,7 @@ body { margin-top: 8px; font-size: 13px; font-weight: 600; - color: #fd6216; + color: #fd6116; opacity: 0.8; transition: opacity 180ms ease; } @@ -4995,7 +4996,7 @@ body { } .pending-support { font-size: 13px; color: #94a3b8; } -.pending-support a { color: #fd6216; } +.pending-support a { color: #fd6116; } /* ── Shared Button Variants ── */ .btn-primary { @@ -5095,8 +5096,8 @@ body { } .filter-btn.active, .filter-btn:hover { - border-color: #fd6216; - color: #fd6216; + border-color: #fd6116; + color: #fd6116; background: #fff7ed; } @@ -5166,7 +5167,7 @@ body { outline: none; } .input:focus, .textarea:focus, .select:focus { - border-color: #fd6216; + border-color: #fd6116; box-shadow: 0 0 0 3px rgba(253, 98, 22, 0.12); } .input::placeholder, .textarea::placeholder { @@ -5220,7 +5221,7 @@ body { font-weight: 600; transition: color 150ms; } -.back-link a:hover { color: #fd6216; } +.back-link a:hover { color: #fd6116; } /* ── Button Sizes ────────────────────────────────────────────────────────── */ .btn-sm { @@ -5305,16 +5306,16 @@ body { white-space: nowrap; } .btn:hover:not(:disabled) { - border-color: #fd6216; - color: #fd6216; + border-color: #fd6116; + color: #fd6116; } .btn:disabled { opacity: 0.55; cursor: not-allowed; } .btn-primary { - background: #fd6216; - border-color: #fd6216; + background: #fd6116; + border-color: #fd6116; color: #fff; } .btn-primary:hover:not(:disabled) { diff --git a/src/components/admin/AdminShell.tsx b/src/components/admin/AdminShell.tsx index 38ab030..64f013c 100644 --- a/src/components/admin/AdminShell.tsx +++ b/src/components/admin/AdminShell.tsx @@ -2,38 +2,67 @@ import { A, useLocation } from '@solidjs/router'; import { For, Show, createMemo, type JSX } from 'solid-js'; import { adminModules } from '~/lib/admin/module-config'; -const iconByRoute: Record = { - '/admin': 'DB', - '/admin/department': 'DP', - '/admin/designation': 'DG', - '/admin/internal-role-management': 'IR', - '/admin/employees': 'EM', - '/admin/external-role-management': 'ER', - '/admin/external-onboarding': 'EO', - '/admin/internal-dashboard': 'ID', - '/admin/external-dashboard': 'ED', - '/admin/verification-management': 'VR', - '/admin/approval-management': 'AP', -}; +function NavIcon(props: { route: string }) { + const common = 'h-[18px] w-[18px]'; + if (props.route === '/admin') { + return ( + + ); + } + if (props.route === '/admin/department') { + return ( + + ); + } + if (props.route === '/admin/designation') { + return ( + + ); + } + if (props.route.includes('role')) { + return ( + + ); + } + return ( + + ); +} export default function AdminShell(props: { children: JSX.Element }) { const location = useLocation(); const navItems = createMemo(() => adminModules.filter((module) => module.route !== '/admin')); + const dashboardActive = () => location.pathname === '/admin'; return (
-
-