From 045338548779eb6ec75c21a13a324ff997aa0f4d Mon Sep 17 00:00:00 2001 From: ELFrancisco4 Date: Tue, 4 Mar 2025 18:10:53 +0100 Subject: [PATCH 1/3] Set up dashboard page --- components.json | 21 ++ package-lock.json | 186 ++++++++++++- package.json | 12 +- public/image.png | Bin 0 -> 15089 bytes "public/\360\237\216\223 View Teachers.png" | Bin 0 -> 3641 bytes "public/\360\237\223\232 View Students.png" | Bin 0 -> 4214 bytes src/app/(batches)/[batchId]/students/page.tsx | 0 src/app/(batches)/batches/page.tsx | 0 .../(root)/(dashboard)/_components/Button.tsx | 20 ++ .../(root)/(dashboard)/_components/Card.tsx | 27 ++ .../(root)/(dashboard)/_components/index.ts | 1 - src/app/(root)/(dashboard)/page.tsx | 162 +++++++++++- src/app/globals.css | 83 +++--- src/app/layout.tsx | 7 +- src/components/ui/button.tsx | 57 ++++ src/components/ui/card.tsx | 76 ++++++ src/lib/utils.ts | 6 + tailwind.config.ts | 247 ++++++++++-------- 18 files changed, 753 insertions(+), 152 deletions(-) create mode 100644 components.json create mode 100644 public/image.png create mode 100644 "public/\360\237\216\223 View Teachers.png" create mode 100644 "public/\360\237\223\232 View Students.png" create mode 100644 src/app/(batches)/[batchId]/students/page.tsx create mode 100644 src/app/(batches)/batches/page.tsx create mode 100644 src/app/(root)/(dashboard)/_components/Button.tsx create mode 100644 src/app/(root)/(dashboard)/_components/Card.tsx delete mode 100644 src/app/(root)/(dashboard)/_components/index.ts create mode 100644 src/components/ui/button.tsx create mode 100644 src/components/ui/card.tsx create mode 100644 src/lib/utils.ts diff --git a/components.json b/components.json new file mode 100644 index 0000000..0e8b633 --- /dev/null +++ b/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e801e52..9e5e731 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,10 +8,14 @@ "name": "leadlly.admin.web.next", "version": "0.1.0", "dependencies": { + "@radix-ui/react-slot": "^1.1.2", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.477.0", "next": "15.0.3", "react": "19.0.0-rc-66855b96-20241106", "react-dom": "19.0.0-rc-66855b96-20241106", - "tailwind-merge": "^2.3.0", + "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.7" }, "devDependencies": { @@ -27,6 +31,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -410,6 +415,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -427,6 +433,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -441,6 +448,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -450,6 +458,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -459,12 +468,14 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -609,6 +620,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -622,6 +634,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -631,6 +644,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -644,12 +658,46 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, "license": "MIT", "optional": true, "engines": { "node": ">=14" } }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", + "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -707,6 +755,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -719,6 +768,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -731,12 +781,14 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -750,18 +802,21 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, "license": "MIT" }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -774,6 +829,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -783,6 +839,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -806,6 +863,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -835,6 +893,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -859,6 +918,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -867,12 +927,33 @@ "node": ">= 6" } }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -891,6 +972,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -903,6 +985,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true, "license": "MIT" }, "node_modules/color-string": { @@ -920,6 +1003,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -929,6 +1013,7 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -943,6 +1028,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, "license": "MIT", "bin": { "cssesc": "bin/cssesc" @@ -972,30 +1058,35 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, "license": "Apache-2.0" }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, "license": "MIT" }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, "license": "MIT" }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -1012,6 +1103,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -1024,6 +1116,7 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -1033,6 +1126,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -1045,6 +1139,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", @@ -1061,6 +1156,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -1075,6 +1171,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1084,6 +1181,7 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -1104,6 +1202,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -1116,6 +1215,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -1135,6 +1235,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -1147,6 +1248,7 @@ "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -1162,6 +1264,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -1171,6 +1274,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1180,6 +1284,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -1192,6 +1297,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -1201,12 +1307,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, "license": "ISC" }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -1222,6 +1330,7 @@ "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, "license": "MIT", "bin": { "jiti": "bin/jiti.js" @@ -1231,6 +1340,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -1240,18 +1350,30 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, "license": "MIT" }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, "license": "ISC" }, + "node_modules/lucide-react": { + "version": "0.477.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.477.0.tgz", + "integrity": "sha512-yCf7aYxerFZAbd8jHJxjwe1j7jEMPptjnaOqdYeirFnEy85cNR3/L+o0I875CYFYya+eEVzZSbNuRk8BZPDpVw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -1261,6 +1383,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -1274,6 +1397,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -1289,6 +1413,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" @@ -1298,6 +1423,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0", @@ -1409,6 +1535,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -1418,6 +1545,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -1427,6 +1555,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -1436,12 +1565,14 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1451,12 +1582,14 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", @@ -1479,6 +1612,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -1491,6 +1625,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -1500,6 +1635,7 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -1509,6 +1645,7 @@ "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, "funding": [ { "type": "opencollective", @@ -1537,6 +1674,7 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", @@ -1554,6 +1692,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" @@ -1573,6 +1712,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -1608,6 +1748,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, "license": "MIT", "engines": { "node": ">=14" @@ -1620,6 +1761,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -1645,6 +1787,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -1658,12 +1801,14 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -1705,6 +1850,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, "license": "MIT", "dependencies": { "pify": "^2.3.0" @@ -1714,6 +1860,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -1726,6 +1873,7 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -1743,6 +1891,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -1753,6 +1902,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -1835,6 +1985,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -1847,6 +1998,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1856,6 +2008,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -1895,6 +2048,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -1913,6 +2067,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -1927,6 +2082,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1936,12 +2092,14 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, "license": "MIT" }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -1954,6 +2112,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -1970,6 +2129,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -1982,6 +2142,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -2014,6 +2175,7 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", @@ -2036,6 +2198,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2045,9 +2208,9 @@ } }, "node_modules/tailwind-merge": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.4.tgz", - "integrity": "sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", + "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==", "license": "MIT", "funding": { "type": "github", @@ -2058,6 +2221,7 @@ "version": "3.4.14", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz", "integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==", + "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -2104,6 +2268,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0" @@ -2113,6 +2278,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" @@ -2125,6 +2291,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -2137,6 +2304,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, "license": "Apache-2.0" }, "node_modules/tslib": { @@ -2170,12 +2338,14 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, "license": "MIT" }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -2191,6 +2361,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -2209,6 +2380,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -2226,6 +2398,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -2235,6 +2408,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -2250,12 +2424,14 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -2270,6 +2446,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -2282,6 +2459,7 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/package.json b/package.json index b2efd97..c8864c3 100644 --- a/package.json +++ b/package.json @@ -9,18 +9,22 @@ "lint": "next lint" }, "dependencies": { + "@radix-ui/react-slot": "^1.1.2", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.477.0", + "next": "15.0.3", "react": "19.0.0-rc-66855b96-20241106", "react-dom": "19.0.0-rc-66855b96-20241106", - "next": "15.0.3", - "tailwind-merge": "^2.3.0", + "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.7" }, "devDependencies": { - "typescript": "^5", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", "postcss": "^8", - "tailwindcss": "^3.4.1" + "tailwindcss": "^3.4.1", + "typescript": "^5" } } diff --git a/public/image.png b/public/image.png new file mode 100644 index 0000000000000000000000000000000000000000..3f27708ee6f25ebb8f8e74ed5578585ff4d24d9c GIT binary patch literal 15089 zcmVf&zAmP+OO7WcDwT`6iY?{vA)6u+7Wjl8ZOz2*8q#-3)mZiwCcwRY{ zh2L7&p>s{rxG$A^WAb?Dp@&SuIazfd5|p7vvN}O0zvy0Rr)V1bt-gmtNC%xV_39D1 zS4xscvS;lPP&cOf;Y^5qVD;}rn<>Hhj^v}cDRng^IxdrSYPBRa&h)ts40!EF(c(w8~Huhgdhwaz>9HZPTb% z+&#s`#hTBcb6%_dmK2^ZSw6|`)A|t1Y7q(XA_EXF3U(WkaZPo%qenb8VV`KTYn@kK zwEDVT*mUzy?zN{Fm>_3q-9ti9~&x-0d!tJ*Bt{p#|p8uyCtFotMV zAFar&^z?{sCsZ{D)gn@nYpTDxL=6<#9O7@*&;_-{8s*r87pl1_*Bz?g znsx5r7JYuL=Tx6dR?kFr(z;jmA$FwB>i4H+Kv5zUL<2REs+FrQLyJwT2~?}QRTH8E z?G5M@ers*cRL&_cGU1jajZ^Db>mGJ)z<>eC>fO=Ju2Ua-N83lE&dvnS?o4p(OtDNg zv5VX{5m!|!TuHg9C0PPS@e)D#sm_r9E-x>iYOz?Zwpy)MQqsXNa9V?Cri8XFwY9a6 z4jVS?5ERD@os%Da_+dt*(ceTb5vPqVYfVPQQP$i}r|s0geEIUMF=NI&K*V{s-EIfl zOePZyoZe__YeO&?gx~K+AQ1TDjvYH5oj!efEy8pY5|YYj_bhgbNF^Zy^?7OG!i8Dq zpMU;RBFynFmrEpK0|q!4bMyIpj95#yZrwUlAyj?|vBa5>P!q8|kwBw+5{CKlx#yny zfWzS!?{>Ql0yUrsMi-2MF-FFETxe_dUE`!eHy@)sZQQuAps=uTUwV4FL7)bbg3(cZ zeLWf)8fFe2Ja{GA2{O|4iySo$2?a=%P#dMjfddCJE@}{{ft0}Lgy}2P>s}c-rAnep zpbW{h9Fc=YGclXZ<7tBd1F3=$DG}>c%1=G-lP1^GBT}`DAPH%iMQS{moM6B}s$fl57)SwXZmK>Xg%**@S~sm&u|hKg0|q(>k><1lPXHC2 z>2XpK-RopEaJoY#*Qpk>6P2eJno|?0S}suAN{#N`KvyB{+_^JKV`O)axdsiUs7G+( zc`<;MAD=vV(w~);1p@{;0`lb}J3E^NsxU$fp`CkbanR_oUU#qNm?B3tx_<**fo`|1 zcg~a`Bk_7d?aP3H4j{?^$zsI2_lT=qKth=`CV?U^@Jw}tT>}O>1Ku-}#fZm(%%4AB zycVbTXvT*^TUnBdii)Jt(o!aq`V5)WKu4j-q%OqEqoOZA&akiMq)}Pnp@$w4&++q& zKw-c@_aQ=Wkw9ooB-8Fq!amAT4NhvHGtlCs)ZK@ws;XGmFKYZToK%ZQwLAbZW+;P5 z4Ri*A35p?v_E5b8Nnb(1E&I-UdxCMq&3tzS$7}V zM}{wR7#=4Boq>i-8rcJ}U4BCC9_Sz|HejHWh$`ZWQJ+B_fya?33W|FIB3=O)?ob2W zfP#VoHK&yG^76FwpD0o>K}qV((C!U%2CD9!A*k%tUA}lOrFc^H%?1o~3B*lfIH~G# z@&FS>yV8;kOym}Y0Rvq{Sy>q;vf|=mQPWS|P8u1;te6BuSwSYZC=3|rBBBg%W0FA9ngrF#7xlQG80Kvy8R zMI*hnUeGg;#013E!-w#jLu=xDO_>y@qbw?gmCsPH4S_%qbxl5a{Vk|( zXvE3JCN$PJqtzdP-`9dbYmk!1c1&_81c$>4Po@X1bT@K6E@Y&o!R>Y;-R*$gW`@ap z+O0j1$dIoItrm* zV1JApl#hY^bCI2!1&hU;u#UY1ddgBLSwi)>2nUTZ?Dxna&5;2I(WeU^FygALZN!Gn zyRl(Q8Fn76z|OLA94tFd9MTWj4J(Z%4AY0d~8yh#UzG1(4NJO^Ft+FFw|bQ zER?S-GbDL^aJg(4F!T(J9x@1L_RYt+69-}P#8Jr2&QPtFB_rOv*fU62j3*^)QHag> z%%<64j8I{S9iC=~K|RYe@6URkOezztgy>}}9Eu31{8%+suiuG(fAkr)lvknr#7VRr zs|7NMD2ZT*MFP}~6PtwOa>8u4!ezC>L7k7yVMczY6M5-roJ)Gr9I%-sPRkq;AK`#j zBF@G}AKH9vTs%15Ox%}5gqDy5A2E!8&r44k${fYSV^sL2(RRi&&S}Ajju2```OH1YGD3SI!#YtRY+UNIU#hMZ< zSh)!cmv1J*X+f}+h{S9P6G`#MURGJ!7V^yiMX|hlo(=6X9Y(qdy35a}!Q5ae~B%V-+W{=U5f?AFW3D z$$IQRSb>&0BHWBL5YH+|5=-C(o89yFnUUOJ{v8I1`e zi*P1!uTg~qki+G}R1}-`HkCt+BpFu?@{hxm!pebc+3lLD8tgn!fo%s)VB@|rtX#7V zM^7}M)e>TBbBF6oikq1@==gDkxOL8XxOwhuzS3M6T7hd{FX#+uj&$#8&r=j}Pefn8 z6yZF?hRw?QO$^%8TyYIg&QCI1+wyTJFNLI0zY2ai0!52ShQjtKH0PfyZ4u) zH9%c_ekSCaI+#c#c;_F#!WFa6Mo)o;Ov(w9b@#M|gu$ONL>k8?l+mJG*iq(;lvG=f zLxV2>$&(IqP8!mvYro|3DVRHJGA^HXHkpX*ap^@7As+e?5;Ik;`{)y_TD1&?hY#V~ z_uq?-AX2VmGLv|b$+uY-j3p7li=`x@yuN%B7Jso54O!{LeNAWxw4w)sD@DwM$%Ztu z5umNu`hLkzGCqanDw=i!#DdPN3_LBS*XG z+UhE-T<~vH9w}EYg#-fa%(op|zaZ7UjXpHq3rOK!pa(+Bh#x~=YTv!q!Vb|^RV}I4 zOQ7Ye=sdW4pV>qM0etY%E7-kq6+V9Tb+oj!aAM+~s8ht|dMLNh*F2TITHH!x4VF|c zQ3EQ3LLuIud$*V1_6w%t^+$dOk0lfT{MAGF$<&Lnht4xQsvLrWc63<3Nfu8UIhHie zpWfhJQ4@}p9m2h{FUO`0pCLo`z!WsoJ_8%qufcy`el;qO9Se8)vhkgZ5Q6B{NIF_n zOc?jOsHn)`su3uk>u2vRMr~CCCXYN9=|cu0n{2NcLkD8=i1Sc)ycVCm`<{~C_`XF% zg6Nf?=V;?7@@PzBCDZO>GBAcT$D*yZ6(Nre7v6FsanK+I#ZZyXgXQ&F6vDHO%Y;G8;Oe*KnaAL@@+ zA=uD}=JI3YU-u$VTZd3%BWjLSB0$&8R)dQQ&@**(IOtiEFpWucW8w0+v8QA!R=xZN zy!G{X_n$ALzVtBp)L%mVk!q}Y{au(H4otl8d>Du#5=^3XEGw}iNfjq8>vMNly?Y&+ ziF=Me|6F|YXSd^wF@>0S&)skp4ZyXx-GZEvgK@<@w_^PC3*lwaRt6$abIcfeQ@Z+u z9w%`{GPNUF+zcr2H#DRA;33phRk5)l7&LYqY&q$utE@!%p8W{4__(RcKnz5tmz19L zqM+0nsAEeF5YjU;@!1C-V)I)cV)*Q-So`6J$ZVCd^20?KI`J&5e02fp15GGC|3Vmu zfynIC%rFjdzI!GUumfS-{b@s#a#DkPtm`O5W~ad;i_m}4SV+g~u;kgl;>{QSgioIQ z3sBdDq32G*@X=%A4f%3M>(Q$^uNZn#?4;_TlZ5f4azrLjO%Bm(!EBus2M?mp8E3%m zcIzipqMX>+qVfZWuw~UMeDLb4IJ~h0)wR{|B8Y6*VUwt<_txRfcmEIRuwuuG61;nNkXFmGrfdK;L%U2qI_TqccxEhSEy81UR{2sP3w zexDD2d*~6&|Ks!6y?6zRiYLO?q^*g!_kfqovrgawW!&9)a2uN3e0(2?T>7m`NMw z5l%dD*iGjpZYViyaFEE};`8J9;lr@oZ1DR1a1*h4TUy|@*%1h~!Dg|diHMq=Z)Vr+ z4zv(gWrS{}T=(qUfo*G+!_5efh4b;T{NRBoEVR#Twjf0LjTljgb;RY1CKqG+Rac@H zL1qCa%zv*8XXXT{H*6bU)K|>2L^}6d|4w(>W3&3Ks5RtaRWM*A=kPj7> z==)^nT3cE%oD`%p3WuQS&Yw`1osJ6PazjQ8N9nFzD59?aFv+%NBHT8w4+SHJVK2Re z;iE?5z@9xAICwCbsj89YcA=cod7Npm*sb(InA_D{K32aKHY&f3%C{1+hsfA6c<4~{ zGDvJ<2zDS0^o$tslSbwP@nL!*dWD@d64CC=$;SLA9>>C`pF(ba9u~d&3Rj+3bbUj0 z4a#=y#vtRr5seX`*pwI^%fCa+WVi4$-V@l{oxKwDcI8XD@6 zmY#u1^5?VjH8s_+IPGZmHX%q{`t$h<@P|hqpl;ob?Q7TJz>XbUNm}#f0@#QffB5o0 zk>4i|Z$JHeEcpEs@Z{#8H=?+>So|pq5l|_G>H+Np$%dPD=Xi^+9FYeIwGp>$W!3GSRME`PSQg{b>(H(@NbgBSkh=h`1Pw1#Q?<0S~}sQ%{Wbs2tFI$M^^k^t1cjqUVfU_`7&dYwj_fOiJ3Spu)a4H(g=!xuR3qs6;nMv$ zV@LsNs;f!%&4<q*~mw=eL&Nax_tQ?{8>8MotcH{mo-=4ef*Le)UWA89f9S-t=9J zzjh7^XPkp8|MRD4BCczqTPu$r!;!LsXe2^pTD_N)q{F0OG5c!i_U$-&=n(er-VHDP zKDcuipP+0Xov&w#*uH(JICPljFuQbQ#zZ28|a;6FU`ovfYojzc~?eW(GWPY(qPVV!#yM)NV6bq$QdxZt>`mh zILt09i5smDXIPQhn0xjdeC)mOT6)MEDkvz3atSug4mu-~Dy&u=q0++$HMaWxWeW|3@&#ZGNjUG)*~oEwFlE+k>T2_m-#3>NWCqzdZ4~ zZB82wP*=|8YC1wh$~Y@iikMcupNN$C^baZL4{YB-CMGK%gP%wK`0o-&%_2*{nDOJ_ zX1;%u9T~G`A=gFaUos0;`hYIDcp5Aj9ymxA=1)a$;?fI70_i4XSUf1|pNAd_Ek}_E zS)EubgUDW#4S8@}`&QBnw0#Y*%QsATIniCpz7GwQd=LG0SF z9+k%`kjZ^Nu@%(&EyfuF`dXl@b4_e1txsP3SR_RUSC^$#Ua~UPDz9Go>g!07Uu0hg zKk}<95NK<`R|G9Cqi(*W-MzX^5DBfqS70l(kco!{Y_yzcKzdr9GIe9bDdL+x&W1%xy zwO1dfydoZ(K05LmyG@8;vKI69u(9cSN&qwKFkd$(0Of^v$&}O@Y9WHnB!$L`#@dto z#oEmd)CW(}Ls^lLo`(==$c?^}a68lC_j#HBhI~5#`frAdUXqFS4fQoVir!3~C9m8V zeu?yFp+CFT1%GQZm^VK{^e*xc+3haWduzB`Rp$C+kW8Eze5H|q?1N3Rqe*V!`9@%c z4Q*69^Dw#TgKMfg2|uOHaOJ?}u%q$hNi?DXZlrVPg1^2Q-nK?$dh%ehns|UpbEpw6 z$;0a|krko7;Uql`wSzemj*K+4Hha;~!k*vGLjfCo^;EMqrS2iP%^7f#r;G<_OQe)p z%>0=`vJPXT^R0eAY<7FM#SkcNQMT&0xTtbMND0o1U3+v5Cv=N;A7))Fh~kZBo?0cVdxzoJ5vELuwL%PLHmH4`#vr*@x{V-kkfY{M$ejt1D|g~zcWXWY+H?jQ6o{hehbPs?Lsx4K=mcy=fx~&m4=4+}yA~nd-A)(T6xe?$2>EW?<~hsgOKGu;eOT^}f1$u(%wUc==59DJsBc zufBt-vIEG>?}rIj&7!h`*uHoLM$fo_eE<2J+gofFY+k++6`ObQwa_v$GjQ&eGhwn@ z=;MkfQc}-Qb^Is_&OZm&|MYHhK-ke$XsmZ1T~|~wcj|IeH6p|rAx!oOF^+2|t&G*w zK}0Hd4Wa1Ku1%ZdoBH;buck`<02%Vl@TfMId=s+dZ@CNPYdwSHX|T&LJ^id)TVE@G zYrrUZ0^L`#>?8TJPnOC5as51=ClQ4_w`jP0ebF$vp{YTBaL#pdX~}l^r9b{rE?K)y z-nn^`JlpD#FSMu0#||Homn?io{?nt6@_QQ^8|7x7SKhaEhy297_sjM5bxM`Pb^hq} z*X5fhPnH{MPg2@?`N)C&{QPqdJt#kQ-@S6#!2|Nke||CUi5I;1H@UX9PG0`jTk>eC zbLr--a&2|BJTG^sJP~I3(+?K&blbo9LM|jSdh(WAWUsGTzBa$Vd?qREXN<@xIyzR!PGR#eD$T`*0qIaVPPBjC^AZ*7sE`>$Wf zv#3p3JAR9{n~=%dSKa39JzPck-O_)cyr-l@?k+I8Vf3SHHifP%3XO@QKN7n|bqJQD z`=;4ZoDRgDMoyfFpMU%j()0SUFbkx)`&0Ma2QFpvIQx++lDbmn@D7D#NjATd&*$Uj zBsPxH-_S%}B`=p3{nS0lBof^8;DZQ|ZL^*{L@e5!4a+!jXm zJUrB8KX~u``03Tx;`JB)jANw-IEPBh$i#au`~}~eP)y#Yo%nRg$GBm_WITPx?Rf3C zzs31;=HT&vyo90S$KsFwaSu*ZA0)%P8;$k#Xe04wOmQ(To_R4U>36WDl@D7PR#1px z=bVii@>Y!)Hy-^53?>n%jjc?`Tl0cBv*ET{F>-o%Iv=)LiPa|YIM(N$eHP!m>MDHi zJKx5NH{M0MH9g#u(`IvL^7eHJ?VaZ8Pa;GB+5HCK=gXI3_&91S=7EsaQFUF%v}x0z zLmV*$C7e}H^;=7E?Ign8eI&!-W5?j`1#iNVl}im=6<%cyayW%73z~EI*km>H2zWLQ zh&cw?Pz!cGi~Q-kHgCp1o_-paUOx|0uDTixBqETN6l^*HkIjkgpMQ=f@*+*8>k}@W zMQ+b}e7?i;S5>u-v7LaeVa@0 zjhnxR)$hKKWv|Xho~=KBPKV2h&z3B~zD-+j+i!jgM_&?uNF1v6HsYcyEJgx}_|Y#Pz`0YWv)NE-OdcRFdUrTbt=&o4u8=X650|fBzc=!-p%*4hh}pIf!ygRh+V}tu)aj zy0UPCL|uI(lWv$?ThX1BL2hg-zHka|d-ZQ(=7;49=41u z*la|&lpx*i#0P)=E2>T$$B!TQ1?-k^kOmtspOKY=gB9giyKoWie(blH@vXV|=#@9% zB_dDH%|RXc>VJ3l&+xn3enQ;v&j`}XW-{@2{_`IE>Ek7sPIBYk4PT(;cqLYUumq3a zaR+{OB@qslHS5}|xwnc3G}|1=G23}SwS!!r`H~wM_B_;joAAn?p5xE*_MiU_Ya6*x znX8nVlm)0%?LUC$A9w)c=wrC;XFuh`QfxLG#uD-6<>%wSo_Z1mLx*7O#WP49vLM@? zhV_e=VEft)xZ_t3z(@7n^zkxo@MmSSrGftMm6!2zvN1n*&%Go&pFp}LopVw3OJqx$ zd%Y*o<~HN5`7dG81?TZLla=>$3ZTaf;|kLa)l+TEL(q+!v^|@M`Gnyd;%wi4`YF`V zpWoXMx4_%IwhT7lPo_Y|Du6CYSu zNSwBX51ey)(s@gK`rbnNoq>V$!k4}DD$m=(hHm8KV(yQBj4N)s3D@2E6AT@9Cf9tQ zzV8>9Jzxkvp1%OI=3R#~CXL6O?|m0j>3I6QxybL|5A{v;Fp)CDBAsNaHXA_ap)y=) zZptGR?qaE&mWEnhUUL&ERVEt|b{qe=oH5@xv!4-4x z#i|u(sXC60BpQvFFaa|zn~6}s$Gvf@mM!6Ve)8UXIC1RQG=W)hn-za8nzv~=tWsVW^RHCQR!Y&*y3lEtvEp(r_C&( z&yWH>uxW)dQ@#v0GWzw!p{={|>cdaM=WQXAmQ1_jYnTzxR zeX;qyrSMhP6UVa=p@opyuMa8?9KxQJD^a!YC_DxIv0>Q?w6aJi5^o;;&P{mj<(EjV zoKF^tQ9N3z`eY4`Z!g8xWvl3U24Ttbe}})ZnQQ)AKU@uKx`&GqW)eYU((ZR|*np#3 z_rPMYk;zShlUS;WHfDKfky>!wBfrEIKf6=0_sZSA3N+If9)JAtUn@V=nmlKQ1nJ?2 zAC9>%6%$k(p>}_OiDH@-jMaa={byM5BFRzC0<@S&NidVOk{Xm5pjm*iudNB`={dx) zBs4UhgoD_Z&Eny&!?zyn231gR{j7iqA2KVA@fr!e;E#olbdI}K0ks| zDFe ztjuh>*AcR!%6AacZvP2xec_q#dth@8n1Jpch@oMEl6AHiBs1nGI@gVeb>fw7+k!o- zSHmsk@a~JnjS%_wJsAWP9|k~6r74s zJy~&Q9zJ*gza~YYx%@bC+=F@O8e2}gip(i(p{VV*UCQQ)XKZL)ybPYqRSZ>nK*x=& zlYb<=R-UOs(kNFiUkS0&m|ocuqM?Y8Ax0Ol9x0bTWLuDNVhgIgWymZTj0abKg1&?-~;B=H+m}NRS%!T+*b+Trm?n*KR^nWhI$*oCuM8HG*83{RR%?E>;7v zVDk9U!-sK*l(!(s+AwKgUskvQ3-t2XavS=fVYK z0mvH;A@a(+rVH=rQ`Z)?Y2aQ&fyI?cBAP3ZKZ9=w`kBv(f;Sb-w z6?gvYIqqmcbOb<`+bM>NvMHPd&yy^*Q)p7fDY|D1j?JGxKSnO?t|%zx(fAAbzuzbK zV!!k(#U!Ku4KVknzonV9Xg>yBbRh;#xd5}tm|i$yM8eWue0?cy|M3%G1K#_O8j6y4 zeuvzgETJl*67qF|7!@X=vg#xzTysB;?Jnb&UVQO>+&XuLa$WlwN=Zcf=*_oq=<`oe zzWP&G$TY>gU@|nVJ<+nrc!~-V!M<_#-MH<^-zl85YwaYMpkgARlzmW@JfTb)17*5s z@y2d=o8c^iWOuy$`#0k1+kZ%AAsbR-(k5;OVlr$N`L{Fja}%TuS2rh(^p>;|NBok<|W(f zSQ3fKk0CoPxkIIB)JWvs`Xkg{Ifr}MxYC)@ve6PZ>G{2WK4Z0&k67(?*;I^L(d_CY z3H35yFe#Iq@?&(XcHb_Ob{WFV%35e@_Tp#1`zQWBe>rIf>0~ZwL6*~wXYRcLH(oPc z$U-g8x8neb73v=>bfhYlNZW{P2|yOA;bKn@ni88 zd7cUf(uYJY*=;4;F#62VsHtn9dyinoMN^QMlcm`%;a;YlfdBQ*D%|z>KhWrJBa1v) zH)E=%DNkx+esOWJtc<-^o1lOsoK)=YnY_Sf6#Kkx7I)d_ABJQInP*dwg@#JD6QgtaIM5gErk3jI@=g+)`=U!d}IV%$qIRYed zr9N`!b@=&R^TGi-QKjb8i7Tflz(hScL`2_-``R?Sd*RFBoKu*M_v4MK;&nIj! z;lJ;`kvQ8x-1gglp^m&oGI7;s|MekOZrF|A-}7C}IDdS27!-g0*nC*q=! z)%DHzV%K3l-Od$Li_uJeejk~4*gT@we{&}G>^;P%*cml!2-=8yv{HU)efn{;+N6<# zuy)5$>?%EsqCtJ5`OAviG(r$7S8vAMe|Q~RcOM|`pT*ZK&30Jv{1bQJTUUqW&@WNz zK9vwTsHS4B`Gl;YRC7VaTt*KAlM`703&T9>-dDf!Fs6(h3RKqt`B~VqzZ{p{{uu6i z@+IPO^-)3*$Npq{Txj%$aER{7$;;q@Eq;0fH_6@(1gJ@~Gt;7Zhd+w23-u(Gf8UcYoAfy-6OYMjcYHR!WUSG^eO>z7L-@ikmz8e-)4AyEg0B8k8?9NR};JL za)lLFcCM9JZ^em|$j`}ug}UkTV>LK~P1{3`iIeqS4CGfU%|*tM&;+HJpCYZ% zjRWz%T8N6k>d&|0r^LB7Z$C&}D~*NuGffMZT{H;~-FgkqE*^#MN4wO-2zvdNJ$U%V zx3GA{X2|JjVFUZgdQ3WVD4zMR@8QC8#|d>ukDFd60u_vtgIsOz=?Zqn1la!^EbGN5Pxsagqlbd?Ots!jqCE0b@vSF023Ak zq1w6QMRLGOv|tmd`=&KffuKmG13d~^1Be27VV9_*+WuulPM zPO8z}YliA2@;LQknN%O@u9Xq%q7`4@AMY&3C+l~kg#~2Th*%vq&RsLe)>=G%I4(PT z6fU1O8AJQ$qwMH0e6aEhe6Vg0){(KlsjfM!l=%aUa_M#xapF<9h5YW9k)4%!s@gqG zqUWnu5~+(#Nls27wf|n^q{+2=g&U|%QKxW>)7KDD1u5JF%yhJR(;obVWXY8qccJn~ zB^xjWc!)7H)RSApf?RTc4$ku6Fu5(OYMa8Af-EA=1}__hhCT!GG5hS%_~A7(aQ?&* zd~8*?s1T$m4-g}tdKXmPeGu_PsaB#m5-Co+rIa;xOruASmXt}$P7fkgpd}3+tvG>y zFI$YJ1_EI!96Nh9Y213E;EPGruAUkK8$Ajv%!dT+_-VB^73*nkLvjDgixaI%(1*rxO2>Xp9q(qD;zQ z682FI|8(M{T2LmQf!KV0k~jApJc3>O4q|v=0mc*!jCzQo_w^D}QfHxxC)Fd+luS@s zF3}jT)9Fs6VaOWiq$KH1V+ut=B87M^99G&MH`!6?y!Q!8ord`Bsuff5SZydd?ZF#G znOjUto0mE|#wjLa;n+Y7#BW{FIW{0dHI1kq!Ez+yq@v1cz(99EBuI5Pq=`gCsWtDh+I_NTSM!2 zqM4rc&KZi6fv!MSx_glkc3LLYyV>BR2D*ZzBaUU&x>BjwNuymoTObMs40ID%JP6w} z#Yu$PPMXl;q#EO7C{6~t1eM1Lh@HViy{vc?YEBwMv_zmOV08Bex(~d&C$Um}KB=8FjtF(ufHYvBGl+2%QFot|0Vea^%SuKD_cU-Spr$J= zMLnfenhhD$z^R0mOEe|7Xao^MJ||Qmdc}Z&?t<>vrU*<4ZW1Y)?=2RK5nF1YOBgU< z0AqIIDK+Peqc6Rgp4HUMiBlC#ZNNZ>QC?oIKBZQi#MLY~^t$`VQWIL5m(krD=qf}p zQZFPlibSD$+;^{WqtV?P=q_k!_em3}&qanY8v!N;x(tmW&3bb|K|Iz|oFXu~cmv&y zWTQM%vXhFTdQjh>(##AP=qRKVt|wKTqC~0qRAX-HzIB`ooQ_~7C;_sT%UvCruP2kL zM~ueo4VlzHXCRCg6@#7`qFubKP-rUC>}UzFntoLS20Dq51{Y_<`kC6@y_(%7 zNpHYF$|x!-ih47ZfalOd4?UzNxa6UFS}Woe7Z*p54H)Pw1g~Xu%)N?8<3vzBO-pYU z6aKq*ERkd2%Z4J8vNg%YS)R4laf)%xrxf(8k%<8VT>&G|gxAF%mLv&G(4Pv$fPu~+ z8MBLXAn9?^n6XXb;C;rXVZcE5AfYT8K}wPN!a%8HY}$Z1045SLS+&a-s2?Qc!OM@aztO@UxQoI%u1yxyD`FoGYbC=WUgaHGo zprxe+O-)TN<>u!82+*C6R8y2p**Gr*o5((&?_E}C0;9hH15q$K@%#PE1oa5C2{WNm zo=QYYWY02-En^w34Fd)e!Rz&+xw-kd{QUg?P)?=HMHv!tQgKFJ^>2B{ zjvbE>H!WcmFgU6KEik$u;$&R3gwYH1<3AD-P^z3%{hROCty`BlWXO;QZ8qCo4u^v; zr)_3yY8p7L!IWwy4zjJawe>khpwp*MuN9JrBa-7*z*D26M9MWXMJt1{IIgsP`}Tsq zefvH@KK}`{je~*H9nAXkZd+U1yF?eOkT|N2p-V(6rV%rY5Gk8vm(3N$f3H}vBGG)O zUGZ4)dDc@1xK8-6$YAlmzT?Wd8L5p z`)1`5!D;0O#B)MDf>iJ0eDr!ql}ObZn51z{Qs>7ar^xspJ;WqQ+(92XCke>s~>Vqg(CaNW}>d2aZe_Qvb{w)wkVrbwb@k1dYfI@Y{EX(O}y7e zA4bexm7h9qYofeV`NVBR=yr|!Q>}AK&!u9}cEHj}t11Z#>^R@sXcw$Io^fgP z&I`xUO(6n{DxD=kJv8&tDZ`q=7MD(=O{`jJBAZqnROj{D*rM?);yaEKW`q`mP2JOW zJAta9N37y+@k=u4JdF6D7J)F;jgZQ*8QO%P*O= zZ;f_MRG+x_B;2n_kZe;Jk|fZ9NE3jLNO&p{L!@kda>Q3g>njq^nN`P;#?VS*)=IB& z-JB$C%sm39*G;2WSDkXyX-yjSPgHMHlDc%JZf5nfD#yBYNzg9h`&3UFqPfJU&i17t zmCEQ5Xwpq3>vm)_C&*8Ioalwe-Iro{QYvXu$X9a{2u!y;jWiu6l(xVlOj8cX67nSUR6A?X-ywT#m@FZpEmK(WGA+WCG0ij+-0T}3K{cG?l40RsjM7%*VqE64u_R>fUt TjOoa?00000NkvXXu0mjfxJWgv literal 0 HcmV?d00001 diff --git "a/public/\360\237\216\223 View Teachers.png" "b/public/\360\237\216\223 View Teachers.png" new file mode 100644 index 0000000000000000000000000000000000000000..725f1ab5322b6f5772492a44218701d11ac97fdc GIT binary patch literal 3641 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 LNkvXXu0mjfyPfu1 literal 0 HcmV?d00001 diff --git "a/public/\360\237\223\232 View Students.png" "b/public/\360\237\223\232 View Students.png" new file mode 100644 index 0000000000000000000000000000000000000000..c7a82a4db672a82c509b35be808c5e2715195b2b GIT binary patch literal 4214 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 M07*qoM6N<$g0YtfxBvhE literal 0 HcmV?d00001 diff --git a/src/app/(batches)/[batchId]/students/page.tsx b/src/app/(batches)/[batchId]/students/page.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/app/(batches)/batches/page.tsx b/src/app/(batches)/batches/page.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/app/(root)/(dashboard)/_components/Button.tsx b/src/app/(root)/(dashboard)/_components/Button.tsx new file mode 100644 index 0000000..12fed93 --- /dev/null +++ b/src/app/(root)/(dashboard)/_components/Button.tsx @@ -0,0 +1,20 @@ +import React from "react"; +import { Button as ShadCnButton } from "@/components/ui/button"; + +interface ButtonProps { + label?: string; + onClick: () => void; + className?: string; + children?: React.ReactNode; +} + +const Button: React.FC = ({ label, onClick, className, children }) => { + return ( + + {label} + {children} + + ); +}; + +export default Button; \ No newline at end of file diff --git a/src/app/(root)/(dashboard)/_components/Card.tsx b/src/app/(root)/(dashboard)/_components/Card.tsx new file mode 100644 index 0000000..5fd9cba --- /dev/null +++ b/src/app/(root)/(dashboard)/_components/Card.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { + Card as ShadCNCard, + CardContent, + CardHeader, + } from "@/components/ui/card" + +interface CardProps { + title: string; + children: React.ReactNode; + className?: string; +} + +const Card: React.FC = ({ title, children, className }) => { + return ( + + +

{title}

+
+ + {children} + +
+ ); +}; + +export default Card; \ No newline at end of file diff --git a/src/app/(root)/(dashboard)/_components/index.ts b/src/app/(root)/(dashboard)/_components/index.ts deleted file mode 100644 index 28d4d61..0000000 --- a/src/app/(root)/(dashboard)/_components/index.ts +++ /dev/null @@ -1 +0,0 @@ -// here we can add all the components that we want to use in the dashboard (you can rename this file to whatever you want) \ No newline at end of file diff --git a/src/app/(root)/(dashboard)/page.tsx b/src/app/(root)/(dashboard)/page.tsx index 75a3155..49c20bc 100644 --- a/src/app/(root)/(dashboard)/page.tsx +++ b/src/app/(root)/(dashboard)/page.tsx @@ -1,7 +1,167 @@ +"use client"; import Image from "next/image"; +import { + MapPin, + Mail, + Phone, + Users, + BookOpen, + Clipboard, + Smile, +} from "lucide-react"; +import Card from "./_components/Card"; +import Button from "./_components/Button"; +import { Edit } from "lucide-react"; // Import the Edit icon export default function Home() { return ( - <>Home + <> +
+
+

+ Institute Overview & Management +

+
+
+ +
+
+ Institute Logo +
+

Established in 2001

+

Chaitanya Bharathi Institute

+

Institute Code: 21XYZ1234

+
+
+ +
+
+ +
+

Address:

+

123, Main Street, City, Country

+
+
+
+ +
+

Contact:

+

+1234567890

+
+
+
+ +
+

Email:

+

info@institute.com

+
+
+
+
+
+ +
+
+

Total Students

+
+ +

2284

+
+
+
+

Active Courses

+
+ +

84

+
+
+
+ +
+
+

Average Attendance

+
+ +

98%

+
+
+ +
+

Performance Index

+
+ +

9.0/10

+
+
+
+ +
+ +
+
+

Total Teachers

+
+ +

24

+
+
+ +
+

Departments

+
+ +

14

+
+
+
+ +
+
+

Active Classes

+
+ +

98

+
+
+ +
+

Satisfaction Rate

+
+ +

9.0/10

+
+
+
+ +
+
+ ); } diff --git a/src/app/globals.css b/src/app/globals.css index 9817d51..228c821 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -5,66 +5,81 @@ @layer base { :root { --background: 0 0% 100%; - --foreground: 222.2 84% 4.9%; + --foreground: 0 0% 3.9%; --card: 0 0% 100%; - --card-foreground: 222.2 84% 4.9%; + --card-foreground: 0 0% 3.9%; --popover: 0 0% 100%; - --popover-foreground: 222.2 84% 4.9%; + --popover-foreground: 0 0% 3.9%; - --primary: 265 88% 64%; - --primary-foreground: 210 40% 98%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; - --secondary: 210 40% 96.1%; - --secondary-foreground: 222.2 47.4% 11.2%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; --sidebar-background: 262, 86%, 46%, 0.03; - --muted: 210 40% 96.1%; - --muted-foreground: 215.4 16.3% 46.9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; - --accent: 210 40% 96.1%; - --accent-foreground: 222.2 47.4% 11.2%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 40% 98%; + --destructive-foreground: 0 0% 98%; - --border: 214.3 31.8% 91.4%; - --input: 214.3 31.8% 91.4%; - --ring: 222.2 84% 4.9%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; --radius: 0.5rem; + + --chart-1: 12 76% 61%; + + --chart-2: 173 58% 39%; + + --chart-3: 197 37% 24%; + + --chart-4: 43 74% 66%; + + --chart-5: 27 87% 67%; } .dark { - --background: 222.2 84% 4.9%; - --foreground: 210 40% 98%; + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; - --card: 222.2 84% 4.9%; - --card-foreground: 210 40% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; - --popover: 222.2 84% 4.9%; - --popover-foreground: 210 40% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; - --primary: 210 40% 98%; - --primary-foreground: 222.2 47.4% 11.2%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; - --secondary: 217.2 32.6% 17.5%; - --secondary-foreground: 210 40% 98%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; - --muted: 217.2 32.6% 17.5%; - --muted-foreground: 215 20.2% 65.1%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; - --accent: 217.2 32.6% 17.5%; - --accent-foreground: 210 40% 98%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 40% 98%; - - --border: 217.2 32.6% 17.5%; - --input: 217.2 32.6% 17.5%; - --ring: 212.7 26.8% 83.9%; + --destructive-foreground: 0 0% 98%; + + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; } } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index d178a3f..4d58784 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -14,9 +14,10 @@ export default function RootLayout({ }>) { return ( - - {children} + +
+ {children} +
); diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx new file mode 100644 index 0000000..65d4fcd --- /dev/null +++ b/src/components/ui/button.tsx @@ -0,0 +1,57 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx new file mode 100644 index 0000000..cabfbfc --- /dev/null +++ b/src/components/ui/card.tsx @@ -0,0 +1,76 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..bd0c391 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/tailwind.config.ts b/tailwind.config.ts index 2873606..3f33834 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -11,111 +11,148 @@ const config = { ], prefix: '', theme: { - container: { - center: true, - padding: '2rem', - screens: { - '2xl': '1400px', - }, - }, - extend: { - screens: { - '2xl': '1400px', - }, - fontFamily: { - sans: ['var(--font-sans)', ...fontFamily.sans], - }, - colors: { - border: 'hsl(var(--border))', - input: 'hsl(var(--input))', - ring: 'hsl(var(--ring))', - background: 'hsl(var(--background))', - foreground: 'hsl(var(--foreground))', - 'sidebar-background': 'hsla(262, 86%, 46%, 0.03)', - primary: { - DEFAULT: 'hsl(var(--primary))', - foreground: 'hsl(var(--primary-foreground))', - }, - secondary: { - DEFAULT: 'hsl(var(--secondary))', - foreground: 'hsl(var(--secondary-foreground))', - }, - destructive: { - DEFAULT: 'hsl(var(--destructive))', - foreground: 'hsl(var(--destructive-foreground))', - }, - muted: { - DEFAULT: 'hsl(var(--muted))', - foreground: 'hsl(var(--muted-foreground))', - }, - accent: { - DEFAULT: 'hsl(var(--accent))', - foreground: 'hsl(var(--accent-foreground))', - }, - popover: { - DEFAULT: 'hsl(var(--popover))', - foreground: 'hsl(var(--popover-foreground))', - }, - card: { - DEFAULT: 'hsl(var(--card))', - foreground: 'hsl(var(--card-foreground))', - }, - }, - borderRadius: { - lg: 'var(--radius)', - md: 'calc(var(--radius) - 2px)', - sm: 'calc(var(--radius) - 4px)', - }, - keyframes: { - 'accordion-down': { - from: { height: '0' }, - to: { height: 'var(--radix-accordion-content-height)' }, - }, - 'accordion-up': { - from: { height: 'var(--radix-accordion-content-height)' }, - to: { height: '0' }, - }, - 'collapsible-down': { - from: { height: '0' }, - to: { height: 'var(--radix-collapsible-content-height)' }, - }, - 'collapsible-up': { - from: { height: 'var(--radix-collapsible-content-height)' }, - to: { height: '0' }, - }, - 'caret-blink': { - '0%,70%,100%': { opacity: '1' }, - '20%,50%': { opacity: '0' }, - }, - }, - animation: { - 'accordion-down': 'accordion-down 0.2s ease-out', - 'accordion-up': 'accordion-up 0.2s ease-out', - 'collapsible-down': 'collapsible-down 0.2s ease-out', - 'collapsible-up': 'collapsible-up 0.2s ease-out', - 'caret-blink': 'caret-blink 1.25s ease-out infinite', - }, - fontSize: { - 'page-title': ['40px', '52px'], - }, - width: { - sidebar: '261px', - }, - height: { - 'main-height': 'calc(100dvh - 24px)', - }, - boxShadow: { - custom: '0px 17px 37px 0px rgba(165, 92, 255, 0.0)', - dialog: '0 0 21.5px 2px rgba(0, 0, 0, 0.29)', - tracker_subject_overview: - '2px 1px 10.5px 0 rgba(151, 83, 245, 0.18), inset 0 0 32px -7px rgba(151, 83, 245, 0.18)', - question: ' 0px 0px 26.7px -10px #00000033', - 'custom-back': 'inset 1.68px 3.37px 5.31px 0 rgba(0, 0, 0, 0.1)', - 'section':' 0px 1px 24.8px -9px #00000038', - 'card':'0px 1.15px 21.31px 0px #FF990012' - }, - }, - }, + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px' + } + }, + extend: { + screens: { + '2xl': '1400px' + }, + fontFamily: { + sans: [ + 'var(--font-sans)', + ...fontFamily.sans + ] + }, + colors: { + border: 'hsl(var(--border))', + 'custom-gray': '#0000007A', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + 'sidebar-background': 'hsla(262, 86%, 46%, 0.03)', + 'student-green': '#0DA21B24', + 'student-green-text': '#0DA21B', + 'teacher-blue-text': '#2E77D5', + 'teacher-button-blue': '#2E77D524', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))' + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))' + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))' + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))' + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))' + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))' + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))' + }, + chart: { + '1': 'hsl(var(--chart-1))', + '2': 'hsl(var(--chart-2))', + '3': 'hsl(var(--chart-3))', + '4': 'hsl(var(--chart-4))', + '5': 'hsl(var(--chart-5))' + } + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)' + }, + keyframes: { + 'accordion-down': { + from: { + height: '0' + }, + to: { + height: 'var(--radix-accordion-content-height)' + } + }, + 'accordion-up': { + from: { + height: 'var(--radix-accordion-content-height)' + }, + to: { + height: '0' + } + }, + 'collapsible-down': { + from: { + height: '0' + }, + to: { + height: 'var(--radix-collapsible-content-height)' + } + }, + 'collapsible-up': { + from: { + height: 'var(--radix-collapsible-content-height)' + }, + to: { + height: '0' + } + }, + 'caret-blink': { + '0%,70%,100%': { + opacity: '1' + }, + '20%,50%': { + opacity: '0' + } + } + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + 'collapsible-down': 'collapsible-down 0.2s ease-out', + 'collapsible-up': 'collapsible-up 0.2s ease-out', + 'caret-blink': 'caret-blink 1.25s ease-out infinite' + }, + fontSize: { + 'page-title': [ + '40px', + '52px' + ] + }, + width: { + sidebar: '261px' + }, + height: { + 'main-height': 'calc(100dvh - 24px)' + }, + boxShadow: { + custom: '0px 17px 37px 0px rgba(165, 92, 255, 0.0)', + dialog: '0 0 21.5px 2px rgba(0, 0, 0, 0.29)', + tracker_subject_overview: '2px 1px 10.5px 0 rgba(151, 83, 245, 0.18), inset 0 0 32px -7px rgba(151, 83, 245, 0.18)', + question: ' 0px 0px 26.7px -10px #00000033', + 'custom-back': 'inset 1.68px 3.37px 5.31px 0 rgba(0, 0, 0, 0.1)', + section: ' 0px 1px 24.8px -9px #00000038', + card: '0px 1.15px 21.31px 0px #FF990012' + } + } + }, plugins: [require('tailwindcss-animate')], } satisfies Config; From 118b62c1d1f0fd2f55b2bd7caeea1d076f81441a Mon Sep 17 00:00:00 2001 From: ELFrancisco4 Date: Wed, 5 Mar 2025 11:41:29 +0100 Subject: [PATCH 2/3] feat: Implement Batches Page with Dummy Data and UI Enhancements - Added a new BatchesPage component to display student batches with dummy data. - Integrated Card and Button components from Shadcn for consistent UI styling. - Implemented a Dropdown component for filtering batches by standard. - Styled the progress bar with a purple color using Tailwind CSS. - Enhanced the UI with images and additional details for each class. - Updated routing to handle navigation to batch details and add batch pages. - Commented out API data fetching logic for future integration. --- package-lock.json | 63 ++++++++++++++ package.json | 1 + public/omega.png | Bin 0 -> 1234 bytes public/sigma.png | Bin 0 -> 1194 bytes src/app/(batches)/[batchId]/students/page.tsx | 0 src/app/(batches)/batches/page.tsx | 0 src/app/(root)/(dashboard)/page.tsx | 8 +- src/app/(root)/batches/_components/Button.tsx | 17 ++++ src/app/(root)/batches/_components/Card.tsx | 16 ++++ .../(root)/batches/_components/DropDown.tsx | 44 ++++++++++ src/app/(root)/batches/page.tsx | 80 ++++++++++++++++++ src/components/ui/progress.tsx | 28 ++++++ 12 files changed, 254 insertions(+), 3 deletions(-) create mode 100644 public/omega.png create mode 100644 public/sigma.png delete mode 100644 src/app/(batches)/[batchId]/students/page.tsx delete mode 100644 src/app/(batches)/batches/page.tsx create mode 100644 src/app/(root)/batches/_components/Button.tsx create mode 100644 src/app/(root)/batches/_components/Card.tsx create mode 100644 src/app/(root)/batches/_components/DropDown.tsx create mode 100644 src/app/(root)/batches/page.tsx create mode 100644 src/components/ui/progress.tsx diff --git a/package-lock.json b/package-lock.json index 9e5e731..9c0904f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "leadlly.admin.web.next", "version": "0.1.0", "dependencies": { + "@radix-ui/react-progress": "^1.1.2", "@radix-ui/react-slot": "^1.1.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -680,6 +681,68 @@ } } }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz", + "integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.2.tgz", + "integrity": "sha512-u1IgJFQ4zNAUTjGdDL5dcl/U8ntOR6jsnhxKb5RKp5Ozwl88xKR9EqRZOe/Mk8tnx0x5tNUe2F+MzsyjqMg0MA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", diff --git a/package.json b/package.json index c8864c3..b7e40fd 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "next lint" }, "dependencies": { + "@radix-ui/react-progress": "^1.1.2", "@radix-ui/react-slot": "^1.1.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", diff --git a/public/omega.png b/public/omega.png new file mode 100644 index 0000000000000000000000000000000000000000..278bbc611036884fdee9e7f6a3e8613c252cfe75 GIT binary patch literal 1234 zcmV;@1TFiCP)S3`ig*To%ei zvJ|OH0|FM1FlyEar%{PSN;$f8AokbGED?V$TiS|P<3nKkmQ=#lixF=DnI8^v*Py}sI!g4A9@xHp$Yi?Jf51!G7n;P?C zV+Cw4s<$d?uG@r;L?4*b(?YO@VL_w5p)na%Rh0EOljzV%rszU8*!l(4y(1(Eg<=@s zv#dvLM8$Cmv`OqNN@H{Sjjdm{5giF|VF-@X6I!8~gu_j25{>N=n8E)CWqS~GdN61l z+y^}Un8yN%+qP6g{t;_lfxqqoUoZ8Z`}ry0$m3>wdKj!SW9 zzj;}T7oQTT?dm-LnM9IrEdZB)1eR{LuXi9Da|=ckCOnqm&Ruxn`b~4C(4L18KUh%d@y1*AZ;H|jqhIlm*ksb zbNB5sjzd+`VXiD0lFZS^D#r2b&G}$d$cA!|EqL;5d*Q{ah9pT5OTQT#e5Yi{O;-F= zorTs24u@OHhg_f}iPydWzWmADzdeYxrH`5Sgha%>7K3_=YFjVD;qtSX*)dL*}QAeaXnwjNJqITx* z^kmd)ZO#a=$UniYi|QLVI#ilnjvq8vdNxl-odP;HVoRE1Ux;bOrBRrSt8h3t^F>## z120dQRC!>J$x7!tR9V~@O@wy)-Euy)|J_74}XhHmopY2+5f& zl0+s^cGF_A7+N1HN+j8_q1&_LyzOC2G&dTcwAQ0V?$pD7h+Vz_*9K9xSYRluGAwp# z-rDf`Rb=d}gfCzgx-UobBACMa=Nn>dRu|>eH68x|;YK>*aZ+A3FS+}Y55W|3>31^^8SK?2J&((FW1hb5OGQApe6R(s zXymm*zaB&X)`Gg_@=DURc)+?7EMk)G=7y|4bA>Yho3{h7hs2u`w*`E2u)!^+cgFEiz;( zv8l=icK2+EB;r~&9bjM5wU|%|oJ?s<&Ms|Ti}XL0jWMBhby#2Pz_CK3kLfVlG$FJ+ zE;}(tV9t*Ior;`vV-CT*9d$L}%gP11)uqcn{sw6N6L{k-ICJp;aOsfUy=7OI@x0`y zsPBX&U$z6w2Z2wTO>T2J=F1Oj-vu=NVfS58R|8Iw($WS?zWx<>bO+eh0z7*HXO>G& z`EC_(ey`pA;wrVBO$BvW3P&E^o?hgq-vdAI0A7DnhKV@%;|9}y{k+?dQQDXoh?_0& zgd*PmJl=NWf_a}`4}2x=fA)hBc5V;+kk~0LjN~*6Puh1HAyIa>8nG7-iqKyq@S2SK zr?$YGbQ+mJG1@h}IJOSBb~4@;I?AA<$l)R2J#oEbKd{F-65rvLZi_5T&hS0xxv$R33dK60D5{|`-j?JP$7&K3AG&TORGF<& zDUWhrtt=PL*JbAUNv6%;2F$GE0+T-Hf7`suZXX@RU`a4vIO)so?(w0Fj!3mIvvJterY2@4+4ygVN&a&JZbL$mBvvU| zwMchpJv+sR7z%mm@{giTvAKTBh#FvEVRk9Z3tnE#C)S=MU0p#H3+if+9&PJ=pav`3 z6IV~8W2G&s_e9`}6n8t5M3O|ItfrO4&Qu+$Kqsdv=uTU4u65dCsqwWm+M*GjgjEfH z^}9MVK91AXY+DlGQR$y?&S?Z~y=R07*qo IM6N<$f{VQ;LI3~& literal 0 HcmV?d00001 diff --git a/src/app/(batches)/[batchId]/students/page.tsx b/src/app/(batches)/[batchId]/students/page.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/app/(batches)/batches/page.tsx b/src/app/(batches)/batches/page.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/app/(root)/(dashboard)/page.tsx b/src/app/(root)/(dashboard)/page.tsx index 49c20bc..db01d20 100644 --- a/src/app/(root)/(dashboard)/page.tsx +++ b/src/app/(root)/(dashboard)/page.tsx @@ -12,8 +12,10 @@ import { import Card from "./_components/Card"; import Button from "./_components/Button"; import { Edit } from "lucide-react"; // Import the Edit icon +import { useRouter } from "next/navigation"; export default function Home() { + const router = useRouter() return ( <>
@@ -109,8 +111,8 @@ export default function Home() {
@@ -156,7 +158,7 @@ export default function Home() {
diff --git a/src/app/(root)/batches/_components/Button.tsx b/src/app/(root)/batches/_components/Button.tsx new file mode 100644 index 0000000..bd8b868 --- /dev/null +++ b/src/app/(root)/batches/_components/Button.tsx @@ -0,0 +1,17 @@ +import React from "react"; + +interface ButtonProps { + onClick: () => void; + className?: string; + children: React.ReactNode; +} + +const Button: React.FC = ({ onClick, className, children }) => { + return ( + + ); +}; + +export default Button; \ No newline at end of file diff --git a/src/app/(root)/batches/_components/Card.tsx b/src/app/(root)/batches/_components/Card.tsx new file mode 100644 index 0000000..b43ad07 --- /dev/null +++ b/src/app/(root)/batches/_components/Card.tsx @@ -0,0 +1,16 @@ +import React from "react"; + +interface CardProps { + className?: string; + children: React.ReactNode; +} + +const Card: React.FC = ({ className, children }) => { + return ( +
+ {children} +
+ ); +}; + +export default Card; \ No newline at end of file diff --git a/src/app/(root)/batches/_components/DropDown.tsx b/src/app/(root)/batches/_components/DropDown.tsx new file mode 100644 index 0000000..4ed3015 --- /dev/null +++ b/src/app/(root)/batches/_components/DropDown.tsx @@ -0,0 +1,44 @@ +import React, { useState } from "react"; + +interface DropdownProps { + options: string[]; + onSelect: (value: string) => void; + className?: string; +} + +const Dropdown: React.FC = ({ options, onSelect, className }) => { + const [selected, setSelected] = useState(options[0]); + const [isOpen, setIsOpen] = useState(false); + + const handleSelect = (value: string) => { + setSelected(value); + onSelect(value); + setIsOpen(false); + }; + + return ( +
+ + {isOpen && ( +
+ {options.map((option, index) => ( +
handleSelect(option)} + > + {option} +
+ ))} +
+ )} +
+ ); +}; + +export default Dropdown; diff --git a/src/app/(root)/batches/page.tsx b/src/app/(root)/batches/page.tsx new file mode 100644 index 0000000..16a3fe8 --- /dev/null +++ b/src/app/(root)/batches/page.tsx @@ -0,0 +1,80 @@ +"use client"; +import React, { useState } from "react"; +import { useRouter } from "next/navigation"; +import { Filter } from "lucide-react"; +import { Card, CardContent } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { Progress } from "@/components/ui/progress"; +import Dropdown from "./_components/DropDown"; +import Image from "next/image"; + +const BatchesPage: React.FC = () => { + const router = useRouter(); + const dummyBatches = [ + { + standard: "11th standard", + classes: [ + { id: 1, name: "Omega", subject: "Chemistry, Physics, Biology", totalStudents: 120, capacity: 180, teacher: "Dr. Sarah Wilson", imgUrl: '/omega.png' }, + { id: 2, name: "Sigma", subject: "Mathematics, Chemistry, Physics", totalStudents: 120, capacity: 180, teacher: "Dr. Sarah Wilson", imgUrl: '/sigma.png' }, + { id: 3, name: "Omega", subject: "Physics", totalStudents: 120, capacity: 180, teacher: "Dr. Sarah Wilson", imgUrl: '/omega.png' }, + ], + }, + { + standard: "12th standard", + classes: [ + { id: 4, name: "Omega", subject: "Chemistry", totalStudents: 120, capacity: 180, teacher: "Dr. Sarah Wilson", imgUrl: '/omega.png' }, + { id: 5, name: "Sigma", subject: "Mathematics", totalStudents: 120, capacity: 180, teacher: "Dr. Sarah Wilson", imgUrl: '/sigma.png' }, + { id: 6, name: "Omega", subject: "Physics", totalStudents: 120, capacity: 180, teacher: "Dr. Sarah Wilson", imgUrl: '/omega.png' }, + ], + }, + ]; + + return ( +
+

Student Batches of Institute

+
+
+ + Filter by : + {}} /> +
+ +
+ {dummyBatches.map((batch, index) => ( +
+

{batch.standard}

+
+ {batch.classes.map((classItem, idx) => ( + + +
+ Class Logo +
+

{classItem.name}

+

{batch.standard}

+
+ Active +
+

Subject: {classItem.subject}

+

Total Students: {classItem.totalStudents}

+ +
+

By {classItem.teacher}

+ +
+
+
+ ))} +
+
+ ))} +
+ ); +}; + +export default BatchesPage; diff --git a/src/components/ui/progress.tsx b/src/components/ui/progress.tsx new file mode 100644 index 0000000..5a7a940 --- /dev/null +++ b/src/components/ui/progress.tsx @@ -0,0 +1,28 @@ +"use client" + +import * as React from "react" +import * as ProgressPrimitive from "@radix-ui/react-progress" + +import { cn } from "@/lib/utils" + +const Progress = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, value, ...props }, ref) => ( + + + +)) +Progress.displayName = ProgressPrimitive.Root.displayName + +export { Progress } From 6abab07c1a488373e327dbc16074f7a2f1b7dec7 Mon Sep 17 00:00:00 2001 From: ELFrancisco4 Date: Sat, 8 Mar 2025 10:28:30 +0100 Subject: [PATCH 3/3] feat: Align Header with Back Button and Improve UI Consistency - Aligned the 'Student Batches of Institute' header with the back button for better visual consistency. - Ensured the use of consistent styling across components, including buttons and progress bars. - Updated the Progress component to dynamically apply colors based on student performance. - Enhanced the overall layout and responsiveness of the BatchesPage component. --- package-lock.json | 199 ++++++++++++++++++ package.json | 1 + public/student1.png | Bin 0 -> 9200 bytes .../batches/[batchId]/students/page.tsx | 184 ++++++++++++++++ src/app/(root)/batches/_components/NavBar.tsx | 31 +++ .../(root)/batches/_components/SearchBar.tsx | 17 ++ src/app/(root)/batches/page.tsx | 124 +++++++++-- src/components/ui/backbutton.tsx | 22 ++ src/components/ui/input.tsx | 22 ++ src/components/ui/progress.tsx | 2 +- src/components/ui/tabs.tsx | 55 +++++ 11 files changed, 637 insertions(+), 20 deletions(-) create mode 100644 public/student1.png create mode 100644 src/app/(root)/batches/[batchId]/students/page.tsx create mode 100644 src/app/(root)/batches/_components/NavBar.tsx create mode 100644 src/app/(root)/batches/_components/SearchBar.tsx create mode 100644 src/components/ui/backbutton.tsx create mode 100644 src/components/ui/input.tsx create mode 100644 src/components/ui/tabs.tsx diff --git a/package-lock.json b/package-lock.json index 9c0904f..284836c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@radix-ui/react-progress": "^1.1.2", "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-tabs": "^1.1.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.477.0", @@ -666,6 +667,38 @@ "node": ">=14" } }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.2.tgz", + "integrity": "sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", @@ -696,6 +729,63 @@ } } }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-primitive": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz", @@ -743,6 +833,37 @@ } } }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.2.tgz", + "integrity": "sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", @@ -761,6 +882,84 @@ } } }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.3.tgz", + "integrity": "sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-roving-focus": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", diff --git a/package.json b/package.json index b7e40fd..f9ae197 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "dependencies": { "@radix-ui/react-progress": "^1.1.2", "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-tabs": "^1.1.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.477.0", diff --git a/public/student1.png b/public/student1.png new file mode 100644 index 0000000000000000000000000000000000000000..974a7c91a6017d8ecc9ec837ad094cb782420e5e GIT binary patch literal 9200 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 { + const router = useRouter(); + const [students, setStudents] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [filter, setFilter] = useState("All"); + + useEffect(() => { + const fetchStudents = async () => { + try { + // Simulate API call + const data: Student[] = [ + { + id: 1, + name: "Abhinav Mishra", + class: 11, + level: 90, + levelColor: "bg-green-500", + imgUrl: "/student1.png", + }, + { + id: 2, + name: "Abhinav Mishra", + class: 11, + level: 60, + levelColor: "bg-yellow-500", + imgUrl: "/student1.png", + }, + { + id: 3, + name: "Abhinav Mishra", + class: 11, + level: 30, + levelColor: "bg-red-500", + imgUrl: "/student1.png", + }, + { + id: 4, + name: "Abhinav Mishra", + class: 11, + level: 90, + levelColor: "bg-green-500", + imgUrl: "/student1.png", + }, + { + id: 5, + name: "Abhinav Mishra", + class: 11, + level: 60, + levelColor: "bg-yellow-500", + imgUrl: "/student1.png", + }, + { + id: 6, + name: "Abhinav Mishra", + class: 11, + level: 30, + levelColor: "bg-red-500", + imgUrl: "/student1.png", + }, + ]; + setStudents(data); + } catch (err) { + setError("Failed to load students."); + } finally { + setLoading(false); + } + }; + + fetchStudents(); + }, []); + + if (loading) return
Loading...
; + if (error) return
Error: {error}
; + + const filteredStudents = + filter === "All" + ? students + : students.filter((student) => { + if (filter === "Excellent") return student.level >= 80; + if (filter === "Optimal") + return student.level >= 50 && student.level < 80; + if (filter === "Inefficient") return student.level < 50; + }); + + return ( +
+
+
+ +

Students Info

+
+ +
+
+ + setFilter(value)}> + + + All + + + Excellent + + + Optimal + + + Inefficient + + + + +
+
+ {filteredStudents.map((student) => ( + + +
+ Student +
+

{student.name}

+

+ Class: {student.class} +

+
+
+

Level:

+ +
+
+ ))} +
+
+ ); +}; + +export default StudentsPage; diff --git a/src/app/(root)/batches/_components/NavBar.tsx b/src/app/(root)/batches/_components/NavBar.tsx new file mode 100644 index 0000000..926b70a --- /dev/null +++ b/src/app/(root)/batches/_components/NavBar.tsx @@ -0,0 +1,31 @@ +"use client"; + +import React from "react"; +import Image from "next/image"; +import { Bell, Users, Image as ImageIcon } from "lucide-react"; + +const NavBar: React.FC = () => { + return ( + + ); +}; + +export default NavBar; diff --git a/src/app/(root)/batches/_components/SearchBar.tsx b/src/app/(root)/batches/_components/SearchBar.tsx new file mode 100644 index 0000000..98b2f40 --- /dev/null +++ b/src/app/(root)/batches/_components/SearchBar.tsx @@ -0,0 +1,17 @@ +import { Search } from "lucide-react"; +import { Input } from "@/components/ui/input"; + +const SearchBar = () => { + return ( +
+ + +
+ ); +}; + +export default SearchBar; diff --git a/src/app/(root)/batches/page.tsx b/src/app/(root)/batches/page.tsx index 16a3fe8..a9f8747 100644 --- a/src/app/(root)/batches/page.tsx +++ b/src/app/(root)/batches/page.tsx @@ -1,12 +1,13 @@ "use client"; import React, { useState } from "react"; import { useRouter } from "next/navigation"; -import { Filter } from "lucide-react"; +import { SlidersHorizontal } from "lucide-react"; import { Card, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Progress } from "@/components/ui/progress"; import Dropdown from "./_components/DropDown"; import Image from "next/image"; +import BackButton from "@/components/ui/backbutton"; const BatchesPage: React.FC = () => { const router = useRouter(); @@ -14,31 +15,90 @@ const BatchesPage: React.FC = () => { { standard: "11th standard", classes: [ - { id: 1, name: "Omega", subject: "Chemistry, Physics, Biology", totalStudents: 120, capacity: 180, teacher: "Dr. Sarah Wilson", imgUrl: '/omega.png' }, - { id: 2, name: "Sigma", subject: "Mathematics, Chemistry, Physics", totalStudents: 120, capacity: 180, teacher: "Dr. Sarah Wilson", imgUrl: '/sigma.png' }, - { id: 3, name: "Omega", subject: "Physics", totalStudents: 120, capacity: 180, teacher: "Dr. Sarah Wilson", imgUrl: '/omega.png' }, + { + id: 1, + name: "Omega", + subject: "Chemistry, Physics, Biology", + totalStudents: 120, + capacity: 180, + teacher: "Dr. Sarah Wilson", + imgUrl: "/omega.png", + }, + { + id: 2, + name: "Sigma", + subject: "Mathematics, Chemistry, Physics", + totalStudents: 120, + capacity: 180, + teacher: "Dr. Sarah Wilson", + imgUrl: "/sigma.png", + }, + { + id: 3, + name: "Omega", + subject: "Physics", + totalStudents: 120, + capacity: 180, + teacher: "Dr. Sarah Wilson", + imgUrl: "/omega.png", + }, ], }, { standard: "12th standard", classes: [ - { id: 4, name: "Omega", subject: "Chemistry", totalStudents: 120, capacity: 180, teacher: "Dr. Sarah Wilson", imgUrl: '/omega.png' }, - { id: 5, name: "Sigma", subject: "Mathematics", totalStudents: 120, capacity: 180, teacher: "Dr. Sarah Wilson", imgUrl: '/sigma.png' }, - { id: 6, name: "Omega", subject: "Physics", totalStudents: 120, capacity: 180, teacher: "Dr. Sarah Wilson", imgUrl: '/omega.png' }, + { + id: 4, + name: "Omega", + subject: "Chemistry", + totalStudents: 120, + capacity: 180, + teacher: "Dr. Sarah Wilson", + imgUrl: "/omega.png", + }, + { + id: 5, + name: "Sigma", + subject: "Mathematics", + totalStudents: 120, + capacity: 180, + teacher: "Dr. Sarah Wilson", + imgUrl: "/sigma.png", + }, + { + id: 6, + name: "Omega", + subject: "Physics", + totalStudents: 120, + capacity: 180, + teacher: "Dr. Sarah Wilson", + imgUrl: "/omega.png", + }, ], }, ]; return (
-

Student Batches of Institute

+
+ +

+ Student Batches of Institute +

+
- + Filter by : - {}} /> + {}} + />
-
@@ -50,20 +110,46 @@ const BatchesPage: React.FC = () => {
- Class Logo + Class Logo

{classItem.name}

{batch.standard}

- Active + + Active +
-

Subject: {classItem.subject}

-

Total Students: {classItem.totalStudents}

- +

+ Subject:{" "} + {classItem.subject} +

+

+ Total Students:{" "} + + {classItem.totalStudents} + +

+
-

By {classItem.teacher}

-
diff --git a/src/components/ui/backbutton.tsx b/src/components/ui/backbutton.tsx new file mode 100644 index 0000000..829a299 --- /dev/null +++ b/src/components/ui/backbutton.tsx @@ -0,0 +1,22 @@ +"use client"; + +import React from "react"; +import { ArrowLeft } from "lucide-react"; +import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"; + +interface BackButtonProps { + router: AppRouterInstance; +} + +const BackButton: React.FC = ({ router }) => { + return ( + + ); +}; + +export default BackButton; diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx new file mode 100644 index 0000000..69b64fb --- /dev/null +++ b/src/components/ui/input.tsx @@ -0,0 +1,22 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Input = React.forwardRef>( + ({ className, type, ...props }, ref) => { + return ( + + ) + } +) +Input.displayName = "Input" + +export { Input } diff --git a/src/components/ui/progress.tsx b/src/components/ui/progress.tsx index 5a7a940..51eb7ed 100644 --- a/src/components/ui/progress.tsx +++ b/src/components/ui/progress.tsx @@ -18,7 +18,7 @@ const Progress = React.forwardRef< {...props} > diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx new file mode 100644 index 0000000..0f4caeb --- /dev/null +++ b/src/components/ui/tabs.tsx @@ -0,0 +1,55 @@ +"use client" + +import * as React from "react" +import * as TabsPrimitive from "@radix-ui/react-tabs" + +import { cn } from "@/lib/utils" + +const Tabs = TabsPrimitive.Root + +const TabsList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsList.displayName = TabsPrimitive.List.displayName + +const TabsTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName + +const TabsContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsContent.displayName = TabsPrimitive.Content.displayName + +export { Tabs, TabsList, TabsTrigger, TabsContent }