@exxatdesignux/ui 0.1.0 → 0.2.7
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.
- package/bin/cli.mjs +176 -0
- package/bin/init.mjs +15 -1
- package/bin/sync-extras.mjs +65 -0
- package/consumer-extras/README.md +21 -0
- package/consumer-extras/cursor-skills/exxat-accessibility/SKILL.md +282 -0
- package/consumer-extras/cursor-skills/exxat-board-cards/SKILL.md +68 -0
- package/consumer-extras/cursor-skills/exxat-centralized-list-dataset/SKILL.md +99 -0
- package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +713 -0
- package/consumer-extras/cursor-skills/exxat-fontawesome-icons/SKILL.md +31 -0
- package/consumer-extras/cursor-skills/exxat-list-page-view-shells/SKILL.md +36 -0
- package/consumer-extras/cursor-skills/exxat-primary-nav-secondary-panel/SKILL.md +27 -0
- package/consumer-extras/patterns/command-menu-pattern.md +45 -0
- package/consumer-extras/patterns/data-views-pattern.md +167 -0
- package/package.json +7 -3
- package/src/components/ui/sidebar.tsx +7 -2
- package/template/.agents/skills/shadcn/SKILL.md +242 -0
- package/template/.agents/skills/shadcn/agents/openai.yml +5 -0
- package/template/.agents/skills/shadcn/assets/shadcn-small.png +0 -0
- package/template/.agents/skills/shadcn/assets/shadcn.png +0 -0
- package/template/.agents/skills/shadcn/cli.md +257 -0
- package/template/.agents/skills/shadcn/customization.md +202 -0
- package/template/.agents/skills/shadcn/evals/evals.json +47 -0
- package/template/.agents/skills/shadcn/mcp.md +94 -0
- package/template/.agents/skills/shadcn/rules/base-vs-radix.md +306 -0
- package/template/.agents/skills/shadcn/rules/composition.md +195 -0
- package/template/.agents/skills/shadcn/rules/forms.md +192 -0
- package/template/.agents/skills/shadcn/rules/icons.md +101 -0
- package/template/.agents/skills/shadcn/rules/styling.md +162 -0
- package/template/.claude/skills/exxat-ds-skill/SKILL.md +712 -0
- package/template/.cursor/rules/exxat-accessibility.mdc +33 -0
- package/template/.cursor/rules/exxat-command-menu.mdc +23 -0
- package/template/.cursor/rules/exxat-dashboard-view-charts.mdc +53 -0
- package/template/.cursor/rules/exxat-data-tables.mdc +31 -0
- package/template/.cursor/rules/exxat-ds-agents.mdc +26 -0
- package/template/.cursor/rules/exxat-kbd-shortcuts.mdc +100 -0
- package/template/.cursor/rules/exxat-list-page-connected-views.mdc +16 -0
- package/template/.cursor/rules/exxat-no-toast.mdc +26 -0
- package/template/.cursor/rules/exxat-page-vs-drawer.mdc +22 -0
- package/template/.cursor/rules/exxat-table-properties-drawer.mdc +40 -0
- package/template/AGENTS.md +52 -11
- package/template/app/(app)/dashboard/page.tsx +1 -1
- package/template/app/(app)/data-list/[id]/page.tsx +24 -8
- package/template/app/(app)/data-list/new/page.tsx +7 -4
- package/template/app/(app)/data-list/page.tsx +1 -1
- package/template/app/(app)/examples/page.tsx +41 -0
- package/template/app/(app)/question-bank/page.tsx +3 -3
- package/template/app/globals.css +1 -1
- package/template/components/app-sidebar.tsx +52 -35
- package/template/components/compliance-table.tsx +79 -0
- package/template/components/data-list-client.tsx +36 -25
- package/template/components/data-list-table.tsx +797 -10
- package/template/components/data-views/finder-panel-view.tsx +405 -0
- package/template/components/data-views/folder-grid-view.tsx +86 -0
- package/template/components/data-views/index.ts +59 -0
- package/template/components/data-views/list-page-split-details-placeholder.tsx +39 -0
- package/template/components/data-views/list-page-split-hub-chrome.tsx +60 -0
- package/template/components/data-views/list-page-split-hub-tokens.ts +16 -0
- package/template/components/data-views/list-page-tree-column-header.tsx +31 -0
- package/template/components/data-views/list-page-tree-panel-shell.tsx +91 -0
- package/template/components/data-views/list-page-view-frame.tsx +53 -0
- package/template/components/data-views/os-folder-glyph.tsx +121 -0
- package/template/components/folder-details-shell.tsx +230 -0
- package/template/components/hub-tree-panel-view.tsx +672 -0
- package/template/components/list-hub-status-badge.tsx +17 -3
- package/template/components/page-header.tsx +149 -7
- package/template/components/placements-page-header.tsx +14 -8
- package/template/components/placements-table-columns.tsx +8 -8
- package/template/components/question-bank-client.tsx +157 -39
- package/template/components/question-bank-new-folder-sheet.tsx +248 -0
- package/template/components/question-bank-os-folder-view.tsx +648 -0
- package/template/components/question-bank-page-header.tsx +31 -2
- package/template/components/question-bank-panel-activator.tsx +9 -0
- package/template/components/question-bank-secondary-nav.tsx +226 -0
- package/template/components/question-bank-table.tsx +707 -22
- package/template/components/secondary-panel.tsx +41 -107
- package/template/components/sites-table.tsx +66 -0
- package/template/components/team-client.tsx +7 -0
- package/template/components/team-table.tsx +156 -1
- package/template/components/templates/list-page.tsx +2 -2
- package/template/components/ui/avatar.tsx +1 -1
- package/template/components/ui/badge.tsx +1 -1
- package/template/components/ui/banner.tsx +1 -1
- package/template/components/ui/breadcrumb.tsx +1 -1
- package/template/components/ui/button.tsx +1 -1
- package/template/components/ui/calendar.tsx +1 -1
- package/template/components/ui/card.tsx +1 -1
- package/template/components/ui/chart.tsx +1 -1
- package/template/components/ui/checkbox.tsx +1 -1
- package/template/components/ui/coach-mark.tsx +1 -1
- package/template/components/ui/collapsible.tsx +1 -1
- package/template/components/ui/command.tsx +1 -1
- package/template/components/ui/date-picker-field.tsx +1 -1
- package/template/components/ui/dialog.tsx +1 -1
- package/template/components/ui/drag-handle-grip.tsx +1 -1
- package/template/components/ui/drawer.tsx +1 -1
- package/template/components/ui/dropdown-menu.tsx +1 -1
- package/template/components/ui/field.tsx +1 -1
- package/template/components/ui/form.tsx +1 -1
- package/template/components/ui/input-group.tsx +1 -1
- package/template/components/ui/input-mask.tsx +1 -1
- package/template/components/ui/input.tsx +1 -1
- package/template/components/ui/kbd.tsx +1 -1
- package/template/components/ui/label.tsx +1 -1
- package/template/components/ui/payment-card-fields.tsx +1 -1
- package/template/components/ui/popover.tsx +1 -1
- package/template/components/ui/radio-group.tsx +1 -1
- package/template/components/ui/resizable.tsx +68 -0
- package/template/components/ui/select.tsx +1 -1
- package/template/components/ui/selection-tile-grid.tsx +1 -1
- package/template/components/ui/separator.tsx +1 -1
- package/template/components/ui/sheet.tsx +1 -1
- package/template/components/ui/sidebar.tsx +1 -1
- package/template/components/ui/skeleton.tsx +1 -1
- package/template/components/ui/sonner.tsx +1 -1
- package/template/components/ui/status-badge.tsx +1 -1
- package/template/components/ui/table.tsx +1 -1
- package/template/components/ui/tabs.tsx +1 -1
- package/template/components/ui/textarea.tsx +1 -1
- package/template/components/ui/tip.tsx +1 -1
- package/template/components/ui/toggle-group.tsx +1 -1
- package/template/components/ui/toggle-switch.tsx +1 -1
- package/template/components/ui/toggle.tsx +1 -1
- package/template/components/ui/tooltip.tsx +1 -1
- package/template/components/ui/view-segmented-control.tsx +1 -1
- package/template/docs/data-views-pattern.md +7 -0
- package/template/hooks/use-app-theme.ts +1 -1
- package/template/hooks/use-coach-mark.ts +1 -1
- package/template/hooks/use-location-hash.ts +15 -0
- package/template/hooks/use-mobile.ts +1 -1
- package/template/hooks/use-mod-key-label.ts +1 -1
- package/template/hooks/use-sidebar-reflow-zoom.ts +40 -0
- package/template/lib/ask-leo-route-context.ts +25 -57
- package/template/lib/coach-mark-registry.ts +13 -13
- package/template/lib/command-menu-config.ts +28 -23
- package/template/lib/command-menu-search-data.ts +10 -9
- package/template/lib/data-list-view-surface.ts +12 -1
- package/template/lib/data-list-view.ts +6 -3
- package/template/lib/date-filter.ts +1 -1
- package/template/lib/mock/dashboard.ts +11 -11
- package/template/lib/mock/navigation.tsx +22 -63
- package/template/lib/mock/placements-kpi.ts +19 -19
- package/template/lib/mock/question-bank-folders.ts +167 -0
- package/template/lib/mock/question-bank-header-collaborators.ts +14 -0
- package/template/lib/mock/question-bank-inspector.ts +109 -0
- package/template/lib/mock/question-bank-kpi.ts +1 -1
- package/template/lib/mock/question-bank.ts +80 -0
- package/template/lib/question-bank-nav.ts +91 -0
- package/template/lib/utils.ts +1 -1
- package/template/next.config.mjs +8 -0
- package/template/package.json +1 -0
- package/template/public/folders/icons8-folder-windows-11.svg +1 -0
- package/template/app/(app)/compliance/page.tsx +0 -10
- package/template/app/(app)/rotations/page.tsx +0 -15
- package/template/app/(app)/sites/all/page.tsx +0 -13
- package/template/app/(app)/team/page.tsx +0 -10
|
@@ -6,6 +6,15 @@ export type QuestionBankStatus = "published" | "draft" | "in_review"
|
|
|
6
6
|
export type QuestionBankType = "multiple_choice" | "true_false" | "short_answer"
|
|
7
7
|
export type QuestionBankDifficulty = "easy" | "medium" | "hard"
|
|
8
8
|
|
|
9
|
+
/** Bloom taxonomy label for bank inspector / analytics (optional on mock rows). */
|
|
10
|
+
export type QuestionBankBloomLevel =
|
|
11
|
+
| "Remember"
|
|
12
|
+
| "Understand"
|
|
13
|
+
| "Apply"
|
|
14
|
+
| "Analyze"
|
|
15
|
+
| "Evaluate"
|
|
16
|
+
| "Create"
|
|
17
|
+
|
|
9
18
|
export interface QuestionBankItem extends Record<string, unknown> {
|
|
10
19
|
id: string
|
|
11
20
|
/** Short preview / stem */
|
|
@@ -16,6 +25,35 @@ export interface QuestionBankItem extends Record<string, unknown> {
|
|
|
16
25
|
status: QuestionBankStatus
|
|
17
26
|
author: string
|
|
18
27
|
updatedAt: string
|
|
28
|
+
/** Folder tree id (`lib/mock/question-bank-folders.ts`). */
|
|
29
|
+
folderId: string
|
|
30
|
+
/** Multiple choice options (only for type: "multiple_choice") */
|
|
31
|
+
options?: {
|
|
32
|
+
text: string
|
|
33
|
+
isCorrect?: boolean
|
|
34
|
+
}[]
|
|
35
|
+
/** Stable bank code for lists / inspector (e.g. PH-ANA-001). */
|
|
36
|
+
itemCode?: string
|
|
37
|
+
bloomLevel?: QuestionBankBloomLevel | string
|
|
38
|
+
/** Topic-style tags for inspector (# displayed in UI). */
|
|
39
|
+
tags?: string[]
|
|
40
|
+
/** ISO-ish created date (inspector “Creator & history”). */
|
|
41
|
+
createdAt?: string
|
|
42
|
+
/** Display name for “Created by” when different from `author`. */
|
|
43
|
+
createdBy?: string
|
|
44
|
+
/** Last editor display name (inspector copy). */
|
|
45
|
+
lastEditedBy?: string
|
|
46
|
+
/** Precomposed “Last edited” line; overrides derived copy when set. */
|
|
47
|
+
lastEditedSummary?: string
|
|
48
|
+
/** Revision label e.g. v4 */
|
|
49
|
+
version?: string
|
|
50
|
+
examUsageCount?: number
|
|
51
|
+
/** Point-biserial index (psychometrics preview). */
|
|
52
|
+
pbi?: number
|
|
53
|
+
/** Mean percent correct when used in assessments. */
|
|
54
|
+
avgScoreCorrectPct?: number
|
|
55
|
+
/** Where / when the item was last used on an exam. */
|
|
56
|
+
lastUsedLabel?: string
|
|
19
57
|
}
|
|
20
58
|
|
|
21
59
|
export const QUESTION_BANK_ITEMS: QuestionBankItem[] = [
|
|
@@ -28,6 +66,25 @@ export const QUESTION_BANK_ITEMS: QuestionBankItem[] = [
|
|
|
28
66
|
status: "published",
|
|
29
67
|
author: "Dr. Chen",
|
|
30
68
|
updatedAt: "2026-03-28",
|
|
69
|
+
folderId: "fld-science",
|
|
70
|
+
itemCode: "QB-ANA-001",
|
|
71
|
+
bloomLevel: "Apply",
|
|
72
|
+
tags: ["Brachial plexus", "Peripheral nerves", "Spine"],
|
|
73
|
+
createdAt: "2024-11-02",
|
|
74
|
+
createdBy: "Dr. Sarah Thompson",
|
|
75
|
+
lastEditedBy: "Dr. James Patel",
|
|
76
|
+
lastEditedSummary: "14 months ago · Dr. James Patel",
|
|
77
|
+
version: "v4",
|
|
78
|
+
examUsageCount: 22,
|
|
79
|
+
pbi: 0.48,
|
|
80
|
+
avgScoreCorrectPct: 88,
|
|
81
|
+
lastUsedLabel: "Midterm 2024 · 14 months ago",
|
|
82
|
+
options: [
|
|
83
|
+
{ text: "C5, C6, C7, C8, T1", isCorrect: true },
|
|
84
|
+
{ text: "C3, C4, C5, C6", isCorrect: false },
|
|
85
|
+
{ text: "C6, C7, C8, T1, T2", isCorrect: false },
|
|
86
|
+
{ text: "C4, C5, C6, C7", isCorrect: false },
|
|
87
|
+
],
|
|
31
88
|
},
|
|
32
89
|
{
|
|
33
90
|
id: "q2",
|
|
@@ -38,6 +95,7 @@ export const QUESTION_BANK_ITEMS: QuestionBankItem[] = [
|
|
|
38
95
|
status: "published",
|
|
39
96
|
author: "Jordan Lee",
|
|
40
97
|
updatedAt: "2026-03-27",
|
|
98
|
+
folderId: "fld-skills-lab",
|
|
41
99
|
},
|
|
42
100
|
{
|
|
43
101
|
id: "q3",
|
|
@@ -48,6 +106,7 @@ export const QUESTION_BANK_ITEMS: QuestionBankItem[] = [
|
|
|
48
106
|
status: "in_review",
|
|
49
107
|
author: "Alex Rivera",
|
|
50
108
|
updatedAt: "2026-03-26",
|
|
109
|
+
folderId: "fld-science",
|
|
51
110
|
},
|
|
52
111
|
{
|
|
53
112
|
id: "q4",
|
|
@@ -58,6 +117,13 @@ export const QUESTION_BANK_ITEMS: QuestionBankItem[] = [
|
|
|
58
117
|
status: "draft",
|
|
59
118
|
author: "Sam Patel",
|
|
60
119
|
updatedAt: "2026-03-25",
|
|
120
|
+
folderId: "fld-ethics",
|
|
121
|
+
options: [
|
|
122
|
+
{ text: "Patient is incapacitated and disclosure is in their best interest", isCorrect: true },
|
|
123
|
+
{ text: "Family member requests the information", isCorrect: false },
|
|
124
|
+
{ text: "Patient has not explicitly prohibited disclosure", isCorrect: false },
|
|
125
|
+
{ text: "Disclosure would benefit hospital operations", isCorrect: false },
|
|
126
|
+
],
|
|
61
127
|
},
|
|
62
128
|
{
|
|
63
129
|
id: "q5",
|
|
@@ -68,6 +134,7 @@ export const QUESTION_BANK_ITEMS: QuestionBankItem[] = [
|
|
|
68
134
|
status: "published",
|
|
69
135
|
author: "Dr. Chen",
|
|
70
136
|
updatedAt: "2026-03-24",
|
|
137
|
+
folderId: "fld-clinical",
|
|
71
138
|
},
|
|
72
139
|
{
|
|
73
140
|
id: "q6",
|
|
@@ -78,6 +145,13 @@ export const QUESTION_BANK_ITEMS: QuestionBankItem[] = [
|
|
|
78
145
|
status: "published",
|
|
79
146
|
author: "Morgan Lee",
|
|
80
147
|
updatedAt: "2026-03-23",
|
|
148
|
+
folderId: "fld-ops",
|
|
149
|
+
options: [
|
|
150
|
+
{ text: "Gloving and gowning", isCorrect: true },
|
|
151
|
+
{ text: "Hand sanitization", isCorrect: false },
|
|
152
|
+
{ text: "Equipment gathering", isCorrect: false },
|
|
153
|
+
{ text: "Workspace cleaning", isCorrect: false },
|
|
154
|
+
],
|
|
81
155
|
},
|
|
82
156
|
{
|
|
83
157
|
id: "q7",
|
|
@@ -88,6 +162,7 @@ export const QUESTION_BANK_ITEMS: QuestionBankItem[] = [
|
|
|
88
162
|
status: "draft",
|
|
89
163
|
author: "Casey Nguyen",
|
|
90
164
|
updatedAt: "2026-03-22",
|
|
165
|
+
folderId: "fld-clinical",
|
|
91
166
|
},
|
|
92
167
|
{
|
|
93
168
|
id: "q8",
|
|
@@ -98,6 +173,7 @@ export const QUESTION_BANK_ITEMS: QuestionBankItem[] = [
|
|
|
98
173
|
status: "in_review",
|
|
99
174
|
author: "Riley Johnson",
|
|
100
175
|
updatedAt: "2026-03-21",
|
|
176
|
+
folderId: "fld-science",
|
|
101
177
|
},
|
|
102
178
|
{
|
|
103
179
|
id: "q9",
|
|
@@ -108,6 +184,7 @@ export const QUESTION_BANK_ITEMS: QuestionBankItem[] = [
|
|
|
108
184
|
status: "published",
|
|
109
185
|
author: "Quinn Martinez",
|
|
110
186
|
updatedAt: "2026-03-20",
|
|
187
|
+
folderId: "fld-clinical",
|
|
111
188
|
},
|
|
112
189
|
{
|
|
113
190
|
id: "q10",
|
|
@@ -118,6 +195,7 @@ export const QUESTION_BANK_ITEMS: QuestionBankItem[] = [
|
|
|
118
195
|
status: "published",
|
|
119
196
|
author: "Dr. Chen",
|
|
120
197
|
updatedAt: "2026-03-19",
|
|
198
|
+
folderId: "fld-science",
|
|
121
199
|
},
|
|
122
200
|
{
|
|
123
201
|
id: "q11",
|
|
@@ -128,6 +206,7 @@ export const QUESTION_BANK_ITEMS: QuestionBankItem[] = [
|
|
|
128
206
|
status: "draft",
|
|
129
207
|
author: "Taylor Brooks",
|
|
130
208
|
updatedAt: "2026-03-18",
|
|
209
|
+
folderId: "fld-ops",
|
|
131
210
|
},
|
|
132
211
|
{
|
|
133
212
|
id: "q12",
|
|
@@ -138,5 +217,6 @@ export const QUESTION_BANK_ITEMS: QuestionBankItem[] = [
|
|
|
138
217
|
status: "in_review",
|
|
139
218
|
author: "Jordan Lee",
|
|
140
219
|
updatedAt: "2026-03-17",
|
|
220
|
+
folderId: "fld-ops",
|
|
141
221
|
},
|
|
142
222
|
]
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Question bank secondary nav + URL scope — demo “My” matches mock author rows.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { QuestionBankItem } from "@/lib/mock/question-bank"
|
|
6
|
+
import type { QuestionBankFolder } from "@/lib/mock/question-bank-folders"
|
|
7
|
+
import { collectFolderDescendantIds } from "@/lib/mock/question-bank-folders"
|
|
8
|
+
|
|
9
|
+
/** Demo curator — “My questions” filters `author` / `createdBy` to this value. */
|
|
10
|
+
export const QUESTION_BANK_NAV_MY_AUTHOR = "Dr. Chen"
|
|
11
|
+
|
|
12
|
+
export type QuestionBankNavScope = "all" | "my" | "folder"
|
|
13
|
+
|
|
14
|
+
export interface QuestionBankNavState {
|
|
15
|
+
scope: QuestionBankNavScope
|
|
16
|
+
/** Set when `scope === "folder"` */
|
|
17
|
+
folderId: string | null
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function parseQuestionBankNav(searchParams: URLSearchParams): QuestionBankNavState {
|
|
21
|
+
const raw = (searchParams.get("scope") ?? "all").toLowerCase()
|
|
22
|
+
if (raw === "my") return { scope: "my", folderId: null }
|
|
23
|
+
if (raw === "folder") {
|
|
24
|
+
const folderId = searchParams.get("folderId") ?? searchParams.get("folder")
|
|
25
|
+
return { scope: "folder", folderId: folderId || null }
|
|
26
|
+
}
|
|
27
|
+
return { scope: "all", folderId: null }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Breadcrumb + title for `SiteHeader` / `PageHeader` (matches secondary nav scopes). */
|
|
31
|
+
export interface QuestionBankHubHeaderModel {
|
|
32
|
+
title: string
|
|
33
|
+
breadcrumbs?: { label: string; href?: string }[]
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function questionBankHubHeaderModel(
|
|
37
|
+
folders: QuestionBankFolder[],
|
|
38
|
+
nav: QuestionBankNavState,
|
|
39
|
+
): QuestionBankHubHeaderModel {
|
|
40
|
+
if (nav.scope === "my") {
|
|
41
|
+
return {
|
|
42
|
+
breadcrumbs: [{ label: "Question bank", href: "/question-bank" }],
|
|
43
|
+
title: "My questions",
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (nav.scope === "folder" && nav.folderId) {
|
|
47
|
+
const name = folders.find(f => f.id === nav.folderId)?.name ?? "Folder"
|
|
48
|
+
return {
|
|
49
|
+
breadcrumbs: [{ label: "Question bank", href: "/question-bank" }],
|
|
50
|
+
title: name,
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { title: "All questions" }
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function filterQuestionBankItemsByNav(
|
|
57
|
+
items: QuestionBankItem[],
|
|
58
|
+
folders: QuestionBankFolder[],
|
|
59
|
+
nav: QuestionBankNavState,
|
|
60
|
+
): QuestionBankItem[] {
|
|
61
|
+
if (nav.scope === "all") return items
|
|
62
|
+
if (nav.scope === "my") {
|
|
63
|
+
return items.filter(
|
|
64
|
+
i => i.author === QUESTION_BANK_NAV_MY_AUTHOR || i.createdBy === QUESTION_BANK_NAV_MY_AUTHOR,
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
if (nav.scope === "folder" && nav.folderId) {
|
|
68
|
+
const allowedFolderIds = collectFolderDescendantIds(folders, nav.folderId)
|
|
69
|
+
return items.filter(i => allowedFolderIds.has(i.folderId))
|
|
70
|
+
}
|
|
71
|
+
return items
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Build `/question-bank` href with optional query + hash (hash without leading `#`). */
|
|
75
|
+
export function questionBankNavHref(opts: {
|
|
76
|
+
scope: QuestionBankNavScope
|
|
77
|
+
folderId?: string | null
|
|
78
|
+
hash?: string
|
|
79
|
+
}): string {
|
|
80
|
+
const base = "/question-bank"
|
|
81
|
+
const sp = new URLSearchParams()
|
|
82
|
+
if (opts.scope === "my") sp.set("scope", "my")
|
|
83
|
+
if (opts.scope === "folder" && opts.folderId) {
|
|
84
|
+
sp.set("scope", "folder")
|
|
85
|
+
sp.set("folderId", opts.folderId)
|
|
86
|
+
}
|
|
87
|
+
const qs = sp.toString()
|
|
88
|
+
const h = opts.hash?.replace(/^#/, "")
|
|
89
|
+
const hashPart = h ? `#${h}` : ""
|
|
90
|
+
return qs ? `${base}?${qs}${hashPart}` : `${base}${hashPart}`
|
|
91
|
+
}
|
package/template/lib/utils.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { cn } from "
|
|
1
|
+
export { cn } from "../../../packages/ui/src/lib/utils"
|
package/template/next.config.mjs
CHANGED
|
@@ -10,6 +10,14 @@ const nextConfig = {
|
|
|
10
10
|
experimental: {
|
|
11
11
|
optimizePackageImports: ["lucide-react", "recharts", "@exxatdesignux/ui"],
|
|
12
12
|
},
|
|
13
|
+
async redirects() {
|
|
14
|
+
return [
|
|
15
|
+
{ source: "/rotations", destination: "/examples", permanent: false },
|
|
16
|
+
{ source: "/compliance", destination: "/examples", permanent: false },
|
|
17
|
+
{ source: "/sites/all", destination: "/examples", permanent: false },
|
|
18
|
+
{ source: "/sites/all/:path*", destination: "/examples", permanent: false },
|
|
19
|
+
]
|
|
20
|
+
},
|
|
13
21
|
}
|
|
14
22
|
|
|
15
23
|
export default withBundleAnalyzer(nextConfig)
|
package/template/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="240px" height="240px"><linearGradient id="WQEfvoQAcpQgQgyjQQ4Hqa" x1="24" x2="24" y1="6.708" y2="14.977" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#eba600"/><stop offset="1" stop-color="#c28200"/></linearGradient><path fill="url(#WQEfvoQAcpQgQgyjQQ4Hqa)" d="M24.414,10.414l-2.536-2.536C21.316,7.316,20.553,7,19.757,7L5,7C3.895,7,3,7.895,3,9l0,30 c0,1.105,0.895,2,2,2l38,0c1.105,0,2-0.895,2-2V13c0-1.105-0.895-2-2-2l-17.172,0C25.298,11,24.789,10.789,24.414,10.414z"/><linearGradient id="WQEfvoQAcpQgQgyjQQ4Hqb" x1="24" x2="24" y1="10.854" y2="40.983" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffd869"/><stop offset="1" stop-color="#fec52b"/></linearGradient><path fill="url(#WQEfvoQAcpQgQgyjQQ4Hqb)" d="M21.586,14.414l3.268-3.268C24.947,11.053,25.074,11,25.207,11H43c1.105,0,2,0.895,2,2v26 c0,1.105-0.895,2-2,2H5c-1.105,0-2-0.895-2-2V15.5C3,15.224,3.224,15,3.5,15h16.672C20.702,15,21.211,14.789,21.586,14.414z"/></svg>
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { ComplianceClient } from "@/components/compliance-client"
|
|
2
|
-
import { PrimaryPageTemplate } from "@/components/templates/primary-page-template"
|
|
3
|
-
|
|
4
|
-
export default function CompliancePage() {
|
|
5
|
-
return (
|
|
6
|
-
<PrimaryPageTemplate siteHeader={{ title: "Compliance" }}>
|
|
7
|
-
<ComplianceClient />
|
|
8
|
-
</PrimaryPageTemplate>
|
|
9
|
-
)
|
|
10
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { PrimaryPageTemplate } from "@/components/templates/primary-page-template"
|
|
2
|
-
import { RotationsPanelActivator } from "@/components/rotations-panel-activator"
|
|
3
|
-
import { RotationsEmptyState } from "@/components/rotations-empty-state"
|
|
4
|
-
|
|
5
|
-
export default function RotationsPage() {
|
|
6
|
-
return (
|
|
7
|
-
<PrimaryPageTemplate
|
|
8
|
-
beforeSiteHeader={<RotationsPanelActivator />}
|
|
9
|
-
siteHeader={{ title: "Rotations" }}
|
|
10
|
-
contentClassName="px-4 lg:px-6 py-6"
|
|
11
|
-
>
|
|
12
|
-
<RotationsEmptyState />
|
|
13
|
-
</PrimaryPageTemplate>
|
|
14
|
-
)
|
|
15
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { SitesAllClient } from "@/components/sites-all-client"
|
|
2
|
-
import { PrimaryPageTemplate } from "@/components/templates/primary-page-template"
|
|
3
|
-
|
|
4
|
-
export default function SitesAllPage() {
|
|
5
|
-
return (
|
|
6
|
-
<PrimaryPageTemplate
|
|
7
|
-
siteHeader={{ title: "Sites" }}
|
|
8
|
-
contentClassName="pb-6"
|
|
9
|
-
>
|
|
10
|
-
<SitesAllClient />
|
|
11
|
-
</PrimaryPageTemplate>
|
|
12
|
-
)
|
|
13
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { PrimaryPageTemplate } from "@/components/templates/primary-page-template"
|
|
2
|
-
import { TeamClient } from "@/components/team-client"
|
|
3
|
-
|
|
4
|
-
export default function TeamPage() {
|
|
5
|
-
return (
|
|
6
|
-
<PrimaryPageTemplate siteHeader={{ title: "Team" }}>
|
|
7
|
-
<TeamClient />
|
|
8
|
-
</PrimaryPageTemplate>
|
|
9
|
-
)
|
|
10
|
-
}
|