@appcorp/shadcn 1.1.88 → 1.1.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import * as ResizablePrimitive from "react-resizable-panels";
3
3
  declare const ResizablePanelGroup: ({ className, ...props }: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) => React.JSX.Element;
4
- declare const ResizablePanel: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement | HTMLButtonElement | HTMLDivElement | HTMLFormElement | HTMLInputElement | HTMLObjectElement | HTMLSlotElement | HTMLStyleElement | HTMLTitleElement | HTMLSpanElement | HTMLAnchorElement | HTMLAreaElement | HTMLAudioElement | HTMLBaseElement | HTMLQuoteElement | HTMLBodyElement | HTMLBRElement | HTMLCanvasElement | HTMLTableColElement | HTMLDataElement | HTMLDataListElement | HTMLModElement | HTMLDetailsElement | HTMLDialogElement | HTMLDListElement | HTMLEmbedElement | HTMLFieldSetElement | HTMLHeadingElement | HTMLHeadElement | HTMLHRElement | HTMLHtmlElement | HTMLIFrameElement | HTMLImageElement | HTMLLabelElement | HTMLLegendElement | HTMLLIElement | HTMLLinkElement | HTMLMapElement | HTMLMetaElement | HTMLMeterElement | HTMLOListElement | HTMLOptGroupElement | HTMLOptionElement | HTMLOutputElement | HTMLParagraphElement | HTMLPreElement | HTMLProgressElement | HTMLScriptElement | HTMLSelectElement | HTMLSourceElement | HTMLTableElement | HTMLTemplateElement | HTMLTableSectionElement | HTMLTableCellElement | HTMLTextAreaElement | HTMLTimeElement | HTMLTableRowElement | HTMLTrackElement | HTMLUListElement | HTMLVideoElement | HTMLTableCaptionElement | HTMLMenuElement | HTMLPictureElement>, "id" | "onResize"> & {
4
+ declare const ResizablePanel: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement | HTMLButtonElement | HTMLObjectElement | HTMLSlotElement | HTMLStyleElement | HTMLTitleElement | HTMLInputElement | HTMLSpanElement | HTMLAnchorElement | HTMLAreaElement | HTMLAudioElement | HTMLBaseElement | HTMLQuoteElement | HTMLBodyElement | HTMLBRElement | HTMLCanvasElement | HTMLTableColElement | HTMLDataElement | HTMLDataListElement | HTMLModElement | HTMLDetailsElement | HTMLDialogElement | HTMLDivElement | HTMLDListElement | HTMLEmbedElement | HTMLFieldSetElement | HTMLFormElement | HTMLHeadingElement | HTMLHeadElement | HTMLHRElement | HTMLHtmlElement | HTMLIFrameElement | HTMLImageElement | HTMLLabelElement | HTMLLegendElement | HTMLLIElement | HTMLLinkElement | HTMLMapElement | HTMLMetaElement | HTMLMeterElement | HTMLOListElement | HTMLOptGroupElement | HTMLOptionElement | HTMLOutputElement | HTMLParagraphElement | HTMLPreElement | HTMLProgressElement | HTMLScriptElement | HTMLSelectElement | HTMLSourceElement | HTMLTableElement | HTMLTemplateElement | HTMLTableSectionElement | HTMLTableCellElement | HTMLTextAreaElement | HTMLTimeElement | HTMLTableRowElement | HTMLTrackElement | HTMLUListElement | HTMLVideoElement | HTMLTableCaptionElement | HTMLMenuElement | HTMLPictureElement>, "id" | "onResize"> & {
5
5
  className?: string;
6
6
  collapsedSize?: number | undefined;
7
7
  collapsible?: boolean | undefined;
@@ -0,0 +1,24 @@
1
+ import React from "react";
2
+ interface UseEnhancedComboboxProps<T extends {
3
+ id: string;
4
+ name: string;
5
+ }> {
6
+ emptyText?: string;
7
+ id: string;
8
+ info: string;
9
+ label: string;
10
+ onValueChange: (value: string) => void;
11
+ options: T[];
12
+ placeholder: string;
13
+ required?: boolean;
14
+ searchEndpoint: string;
15
+ searchPlaceholder?: string;
16
+ value: string;
17
+ }
18
+ export declare const useEnhancedCombobox: <T extends {
19
+ id: string;
20
+ name: string;
21
+ }>({ emptyText, id, info, label, onValueChange, options, placeholder, required, searchEndpoint, searchPlaceholder, value, }: UseEnhancedComboboxProps<T>) => {
22
+ enhancedComboboxElement: React.JSX.Element;
23
+ };
24
+ export {};
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __generator = (this && this.__generator) || function (thisArg, body) {
45
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
46
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
47
+ function verb(n) { return function (v) { return step([n, v]); }; }
48
+ function step(op) {
49
+ if (f) throw new TypeError("Generator is already executing.");
50
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
51
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
52
+ if (y = 0, t) op = [op[0] & 2, t.value];
53
+ switch (op[0]) {
54
+ case 0: case 1: t = op; break;
55
+ case 4: _.label++; return { value: op[1], done: false };
56
+ case 5: _.label++; y = op[1]; op = [0]; continue;
57
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
58
+ default:
59
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
60
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
61
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
62
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
63
+ if (t[2]) _.ops.pop();
64
+ _.trys.pop(); continue;
65
+ }
66
+ op = body.call(thisArg, _);
67
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
68
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
69
+ }
70
+ };
71
+ Object.defineProperty(exports, "__esModule", { value: true });
72
+ exports.useEnhancedCombobox = void 0;
73
+ var react_1 = __importStar(require("react"));
74
+ var fetch_data_1 = require("@react-pakistan/util-functions/general/fetch-data");
75
+ var api_methods_1 = require("@react-pakistan/util-functions/constants/api-methods");
76
+ var use_debounce_1 = require("@react-pakistan/util-functions/hooks/use-debounce");
77
+ var enhanced_combobox_1 = require("../components/enhanced-combobox");
78
+ var useEnhancedCombobox = function (_a) {
79
+ var emptyText = _a.emptyText, id = _a.id, info = _a.info, label = _a.label, onValueChange = _a.onValueChange, options = _a.options, placeholder = _a.placeholder, required = _a.required, searchEndpoint = _a.searchEndpoint, searchPlaceholder = _a.searchPlaceholder, value = _a.value;
80
+ var _b = (0, react_1.useState)(""), searchQuery = _b[0], setSearchQuery = _b[1];
81
+ var _c = (0, react_1.useState)([]), searchOptions = _c[0], setSearchOptions = _c[1];
82
+ var _d = (0, react_1.useState)(false), loading = _d[0], setLoading = _d[1];
83
+ var debouncedSearchQuery = (0, use_debounce_1.useDebounce)(searchQuery, 800);
84
+ (0, react_1.useEffect)(function () {
85
+ if (!debouncedSearchQuery) {
86
+ setSearchOptions([]);
87
+ setLoading(false);
88
+ return;
89
+ }
90
+ setLoading(true);
91
+ (function () { return __awaiter(void 0, void 0, void 0, function () {
92
+ var data, error_1;
93
+ return __generator(this, function (_a) {
94
+ switch (_a.label) {
95
+ case 0:
96
+ _a.trys.push([0, 2, 3, 4]);
97
+ return [4 /*yield*/, (0, fetch_data_1.fetchData)({
98
+ url: searchEndpoint,
99
+ method: api_methods_1.API_METHODS.GET,
100
+ params: { searchQuery: debouncedSearchQuery },
101
+ })];
102
+ case 1:
103
+ data = (_a.sent()).data;
104
+ setSearchOptions(data.items || []);
105
+ return [3 /*break*/, 4];
106
+ case 2:
107
+ error_1 = _a.sent();
108
+ console.error("Failed to fetch expense categories:", error_1);
109
+ setSearchOptions([]);
110
+ return [3 /*break*/, 4];
111
+ case 3:
112
+ setLoading(false);
113
+ return [7 /*endfinally*/];
114
+ case 4: return [2 /*return*/];
115
+ }
116
+ });
117
+ }); })();
118
+ }, [debouncedSearchQuery, searchEndpoint]);
119
+ var mappedOptions = (0, react_1.useMemo)(function () {
120
+ var opts = searchOptions.length > 0 ? searchOptions : options;
121
+ return ((opts === null || opts === void 0 ? void 0 : opts.map(function (category) { return ({
122
+ label: category.name,
123
+ value: category.id,
124
+ }); })) || []);
125
+ }, [searchOptions, options]);
126
+ var handleSearchChange = (0, react_1.useCallback)(function (query) {
127
+ setSearchQuery(query);
128
+ }, []);
129
+ var enhancedComboboxElement = (0, react_1.useMemo)(function () { return (react_1.default.createElement(enhanced_combobox_1.EnhancedCombobox, { emptyText: emptyText, id: id, info: info, label: label, loading: loading, onSearchChange: handleSearchChange, onValueChange: onValueChange, options: mappedOptions, placeholder: placeholder, required: required, searchPlaceholder: searchPlaceholder, value: value })); }, [
130
+ emptyText,
131
+ handleSearchChange,
132
+ id,
133
+ info,
134
+ label,
135
+ loading,
136
+ mappedOptions,
137
+ onValueChange,
138
+ placeholder,
139
+ required,
140
+ searchPlaceholder,
141
+ value,
142
+ ]);
143
+ return { enhancedComboboxElement: enhancedComboboxElement };
144
+ };
145
+ exports.useEnhancedCombobox = useEnhancedCombobox;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appcorp/shadcn",
3
- "version": "1.1.88",
3
+ "version": "1.1.90",
4
4
  "scripts": {
5
5
  "build:next": "next build",
6
6
  "build:storybook": "mv ../.pnp.cjs ../.pnp.cjs.bak 2>/dev/null || true && storybook build -c .storybook -o .out && mv ../.pnp.cjs.bak ../.pnp.cjs 2>/dev/null || true",
@@ -0,0 +1,33 @@
1
+ export interface DashboardMockupProps {
2
+ domain: string;
3
+ enrollmentHeading: string;
4
+ enrollmentList: {
5
+ name: string;
6
+ class: string;
7
+ status: string;
8
+ }[];
9
+ items: {
10
+ icon: React.ElementType;
11
+ label: string;
12
+ active: boolean;
13
+ }[];
14
+ schoolName: string;
15
+ stats: {
16
+ label: string;
17
+ value: string;
18
+ color: string;
19
+ }[];
20
+ }
21
+ export declare const dashboardMockupMenuList: DashboardMockupProps;
22
+ export interface FeatureCardsProps {
23
+ items: {
24
+ icon: React.ElementType;
25
+ title: string;
26
+ description: string;
27
+ highlights: string[];
28
+ href: string;
29
+ accent: string;
30
+ bg: string;
31
+ }[];
32
+ }
33
+ export declare const featureCards: FeatureCardsProps;
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.featureCards = exports.dashboardMockupMenuList = void 0;
4
+ var lucide_react_1 = require("lucide-react");
5
+ exports.dashboardMockupMenuList = {
6
+ domain: "subdomain.edupilotpro.com",
7
+ items: [
8
+ { icon: lucide_react_1.LayoutDashboard, label: "Dashboard", active: true },
9
+ { icon: lucide_react_1.Users, label: "Students", active: false },
10
+ { icon: lucide_react_1.BookOpen, label: "Courses", active: false },
11
+ { icon: lucide_react_1.Calendar, label: "Attendance", active: false },
12
+ { icon: lucide_react_1.Receipt, label: "Finance", active: false },
13
+ { icon: lucide_react_1.BarChart3, label: "Analytics", active: false },
14
+ ],
15
+ schoolName: "Greenwood Academy",
16
+ stats: [
17
+ { label: "Students", value: "412", color: "text-blue-600" },
18
+ { label: "Teachers", value: "34", color: "text-purple-600" },
19
+ { label: "Attendance", value: "97%", color: "text-green-700" },
20
+ { label: "Fees Due", value: "$4.2k", color: "text-rose-600" },
21
+ ],
22
+ enrollmentHeading: "Recent Enrollments",
23
+ enrollmentList: [
24
+ { name: "Aisha Patel", class: "Grade 7A", status: "Active" },
25
+ { name: "Omar Faruk", class: "Grade 5B", status: "Active" },
26
+ { name: "Lena Müller", class: "Grade 9C", status: "Pending" },
27
+ ],
28
+ };
29
+ exports.featureCards = {
30
+ items: [
31
+ {
32
+ icon: lucide_react_1.Users,
33
+ title: "AI Admission Assistant",
34
+ description: "Automate your entire admissions pipeline. The AI Admission Assistant captures enquiries, collects documents, and moves students from application to enrolled — with no manual follow-up from your team.",
35
+ highlights: [
36
+ "Digital admission forms & document collection",
37
+ "AI-guided enrolment workflows",
38
+ "Family portal with sibling linking",
39
+ "Searchable student & family database",
40
+ ],
41
+ accent: "text-blue-700",
42
+ bg: "bg-blue-50 dark:bg-blue-950/30",
43
+ href: "/features/student-family",
44
+ },
45
+ {
46
+ icon: lucide_react_1.BookOpen,
47
+ title: "Academic Structure Engine",
48
+ description: "Configure your school's full academic hierarchy — year groups, sections, subjects, courses — once. Every module (attendance, grades, timetables) inherits this structure automatically.",
49
+ highlights: [
50
+ "Multi-level class & section hierarchy",
51
+ "Subject catalogue & course management",
52
+ "Teacher assignments & academic year config",
53
+ "Supports all curriculum frameworks",
54
+ ],
55
+ accent: "text-purple-700",
56
+ bg: "bg-purple-50 dark:bg-purple-950/30",
57
+ href: "/features/academic-structure",
58
+ },
59
+ {
60
+ icon: lucide_react_1.Calendar,
61
+ title: "AI Attendance Assistant",
62
+ description: "Teachers mark an entire class present in one tap. The AI Attendance Assistant records every entry, detects chronic absence patterns, and automatically notifies parents — all without lifting a finger.",
63
+ highlights: [
64
+ "One-tap bulk attendance marking",
65
+ "AI-powered absence pattern detection",
66
+ "Instant automated parent notifications",
67
+ "Conflict-free visual timetable builder",
68
+ ],
69
+ accent: "text-green-700",
70
+ bg: "bg-green-50 dark:bg-green-950/30",
71
+ href: "/features/attendance-schedules",
72
+ },
73
+ {
74
+ icon: lucide_react_1.BarChart3,
75
+ title: "AI Reporting Assistant",
76
+ description: "From test scores to polished report cards in one click. The AI Reporting Assistant calculates GPA, ranks students, flags underperformers, and generates print-ready PDFs at the end of every term.",
77
+ highlights: [
78
+ "Automatic GPA & class rank calculation",
79
+ "AI-flagged underperformance alerts",
80
+ "One-click PDF report card generation",
81
+ "Multi-term performance trend analytics",
82
+ ],
83
+ accent: "text-orange-700",
84
+ bg: "bg-orange-50 dark:bg-orange-950/30",
85
+ href: "/features/grades-assessments",
86
+ },
87
+ {
88
+ icon: lucide_react_1.CreditCard,
89
+ title: "AI Fee Reminder Automation",
90
+ description: "Build your fee structures once. EduPilotPro auto-generates invoices every term, sends escalating payment reminders automatically, and keeps your outstanding fee dashboard updated in real time.",
91
+ highlights: [
92
+ "Automated termly invoice generation",
93
+ "AI fee reminder sequences to parents",
94
+ "Real-time outstanding balance tracking",
95
+ "Discount, scholarship & exemption management",
96
+ ],
97
+ accent: "text-rose-700",
98
+ bg: "bg-rose-50 dark:bg-rose-950/30",
99
+ href: "/features/financial-management",
100
+ },
101
+ {
102
+ icon: lucide_react_1.Shield,
103
+ title: "Smart Role-Based Access",
104
+ description: "Every staff member, teacher, and parent sees exactly what they need. Five permission levels ensure data is protected, workflows are clean, and nothing leaks between roles.",
105
+ highlights: [
106
+ "5-tier role hierarchy (Admin → Parent)",
107
+ "Staff & workspace user management",
108
+ "Audit-ready access and activity logs",
109
+ "Secure, GDPR-compliant authentication",
110
+ ],
111
+ accent: "text-teal-700",
112
+ bg: "bg-teal-50 dark:bg-teal-950/30",
113
+ href: "/features/access-control",
114
+ },
115
+ ],
116
+ };
@@ -0,0 +1,13 @@
1
+ import React, { FC } from "react";
2
+ export interface FeatureCardProps {
3
+ accent: string;
4
+ bg: string;
5
+ description: string;
6
+ highlights: string[];
7
+ href: string;
8
+ Icon: React.ComponentType<{
9
+ className?: string;
10
+ }>;
11
+ title: string;
12
+ }
13
+ export declare const FeatureCard: FC<FeatureCardProps>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FeatureCard = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var link_1 = __importDefault(require("next/link"));
9
+ var lucide_react_1 = require("lucide-react");
10
+ var card_1 = require("../../components/ui/card");
11
+ var FeatureCard = function (_a) {
12
+ var accent = _a.accent, bg = _a.bg, description = _a.description, highlights = _a.highlights, href = _a.href, Icon = _a.Icon, title = _a.title;
13
+ return (react_1.default.createElement(link_1.default, { key: title, href: href, prefetch: false, className: "group flex" },
14
+ react_1.default.createElement(card_1.Card, { className: "flex w-full flex-col border-border/60 transition-all hover:shadow-lg hover:border-primary/40" },
15
+ react_1.default.createElement(card_1.CardHeader, { className: "pb-3" },
16
+ react_1.default.createElement("div", { className: "mb-4 inline-flex h-11 w-11 items-center justify-center rounded-xl ".concat(bg) },
17
+ react_1.default.createElement(Icon, { className: "h-5 w-5 ".concat(accent) })),
18
+ react_1.default.createElement(card_1.CardTitle, { className: "text-lg" }, title)),
19
+ react_1.default.createElement(card_1.CardContent, { className: "flex flex-col flex-1 gap-4" },
20
+ react_1.default.createElement("p", { className: "text-sm text-muted-foreground leading-relaxed" }, description),
21
+ react_1.default.createElement("ul", { className: "mt-auto space-y-1.5" }, highlights.map(function (h) { return (react_1.default.createElement("li", { key: h, className: "flex items-start gap-2 text-sm text-foreground" },
22
+ react_1.default.createElement(lucide_react_1.CheckCircle2, { className: "mt-0.5 h-4 w-4 shrink-0 ".concat(accent) }),
23
+ h)); })),
24
+ react_1.default.createElement("div", { className: "mt-2 flex items-center gap-1 text-xs font-semibold ".concat(accent) },
25
+ "Learn more",
26
+ react_1.default.createElement(lucide_react_1.ArrowRight, { className: "h-3.5 w-3.5 transition-transform group-hover:translate-x-0.5" }))))));
27
+ };
28
+ exports.FeatureCard = FeatureCard;
@@ -0,0 +1,3 @@
1
+ import { FC } from "react";
2
+ import { DashboardMockupProps } from "../../data/edupilotpro-v1";
3
+ export declare const DashboardMockup: FC<DashboardMockupProps>;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DashboardMockup = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var lucide_react_1 = require("lucide-react");
9
+ var DashboardMockup = function (_a) {
10
+ var domain = _a.domain, enrollmentHeading = _a.enrollmentHeading, enrollmentList = _a.enrollmentList, items = _a.items, schoolName = _a.schoolName, stats = _a.stats;
11
+ return (react_1.default.createElement("div", { className: "relative mx-auto w-full max-w-3xl" },
12
+ react_1.default.createElement("div", { className: "absolute inset-0 -z-10 scale-95 blur-3xl opacity-30 bg-gradient-to-br from-primary via-purple-500 to-blue-500 rounded-2xl" }),
13
+ react_1.default.createElement("div", { className: "rounded-xl border border-border/60 bg-background shadow-2xl overflow-hidden" },
14
+ react_1.default.createElement("div", { className: "flex items-center gap-2 border-b border-border/60 bg-muted/50 px-4 py-3" },
15
+ react_1.default.createElement("span", { className: "h-3 w-3 rounded-full bg-red-400" }),
16
+ react_1.default.createElement("span", { className: "h-3 w-3 rounded-full bg-yellow-400" }),
17
+ react_1.default.createElement("span", { className: "h-3 w-3 rounded-full bg-green-400" }),
18
+ react_1.default.createElement("div", { className: "ml-3 flex-1 rounded-md bg-background/70 border border-border/40 px-3 py-1 text-xs text-muted-foreground" }, domain)),
19
+ react_1.default.createElement("div", { className: "flex h-[340px] sm:h-[380px]" },
20
+ react_1.default.createElement("div", { className: "hidden w-44 flex-shrink-0 border-r border-border/40 bg-muted/30 p-3 sm:block" },
21
+ react_1.default.createElement("div", { className: "mb-4 flex items-center gap-2" },
22
+ react_1.default.createElement("span", { className: "flex h-6 w-6 items-center justify-center rounded bg-primary text-primary-foreground" },
23
+ react_1.default.createElement(lucide_react_1.GraduationCap, { className: "h-4 w-4" })),
24
+ react_1.default.createElement("span", { className: "text-xs font-bold" }, "EduPilotPro")),
25
+ items.map(function (_a) {
26
+ var Icon = _a.icon, label = _a.label, active = _a.active;
27
+ return (react_1.default.createElement("div", { key: label, className: "mb-1 flex items-center gap-2 rounded-md px-2 py-1.5 text-xs ".concat(active
28
+ ? "bg-primary/10 text-primary font-semibold"
29
+ : "text-muted-foreground") },
30
+ react_1.default.createElement(Icon, { className: "h-3.5 w-3.5 shrink-0" }),
31
+ label));
32
+ })),
33
+ react_1.default.createElement("div", { className: "flex-1 overflow-hidden p-4" },
34
+ react_1.default.createElement("p", { className: "mb-3 text-sm font-semibold text-foreground" },
35
+ "Overview \u2014 ",
36
+ schoolName),
37
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-2 sm:grid-cols-4" }, stats.map(function (_a) {
38
+ var label = _a.label, value = _a.value, color = _a.color;
39
+ return (react_1.default.createElement("div", { key: label, className: "rounded-lg border border-border/50 bg-card p-3" },
40
+ react_1.default.createElement("p", { className: "text-[10px] text-muted-foreground" }, label),
41
+ react_1.default.createElement("p", { className: "text-lg font-bold ".concat(color) }, value)));
42
+ })),
43
+ react_1.default.createElement("div", { className: "mt-3 rounded-lg border border-border/50 bg-card p-3" },
44
+ react_1.default.createElement("p", { className: "mb-2 text-xs font-semibold text-foreground" }, enrollmentHeading),
45
+ react_1.default.createElement("div", { className: "space-y-1.5" }, enrollmentList.map(function (_a) {
46
+ var name = _a.name, cls = _a.class, status = _a.status;
47
+ return (react_1.default.createElement("div", { key: name, className: "flex items-center justify-between text-[10px]" },
48
+ react_1.default.createElement("span", { className: "font-medium text-foreground" }, name),
49
+ react_1.default.createElement("span", { className: "text-muted-foreground" }, cls),
50
+ react_1.default.createElement("span", { className: "rounded-full px-1.5 py-0.5 text-[9px] font-medium ".concat(status === "Active"
51
+ ? "bg-green-100 text-green-700"
52
+ : "bg-yellow-100 text-yellow-700") }, status)));
53
+ }))))))));
54
+ };
55
+ exports.DashboardMockup = DashboardMockup;