@exxatdesignux/ui 0.0.6 → 0.0.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/init.mjs +29 -0
- package/package.json +7 -2
- package/template/.nvmrc +1 -0
- package/template/.prettierignore +7 -0
- package/template/.prettierrc +11 -0
- package/template/AGENTS.md +485 -0
- package/template/Logo/Exxat_Prism.svg +39 -0
- package/template/Logo/Exxat_one.svg +36 -0
- package/template/README.md +58 -0
- package/template/app/(app)/compliance/page.tsx +10 -0
- package/template/app/(app)/dashboard/loading.tsx +18 -0
- package/template/app/(app)/dashboard/page.tsx +36 -0
- package/template/app/(app)/data-list/[id]/page.tsx +28 -0
- package/template/app/(app)/data-list/new/page.tsx +31 -0
- package/template/app/(app)/data-list/page.tsx +10 -0
- package/template/app/(app)/error.tsx +43 -0
- package/template/app/(app)/help/page.tsx +34 -0
- package/template/app/(app)/layout.tsx +54 -0
- package/template/app/(app)/loading.tsx +18 -0
- package/template/app/(app)/question-bank/page.tsx +10 -0
- package/template/app/(app)/rotations/page.tsx +15 -0
- package/template/app/(app)/settings/page.tsx +17 -0
- package/template/app/(app)/sites/all/page.tsx +13 -0
- package/template/app/(app)/team/page.tsx +10 -0
- package/template/app/favicon.ico +0 -0
- package/template/app/globals.css +1811 -0
- package/template/app/layout.tsx +95 -0
- package/template/app/page.tsx +9 -0
- package/template/components/.gitkeep +0 -0
- package/template/components/app-sidebar-dynamic.tsx +15 -0
- package/template/components/app-sidebar.tsx +901 -0
- package/template/components/ask-leo-composer.tsx +216 -0
- package/template/components/ask-leo-sidebar.tsx +509 -0
- package/template/components/chart-area-interactive.tsx +293 -0
- package/template/components/charts-overview.tsx +2321 -0
- package/template/components/command-menu-01.tsx +133 -0
- package/template/components/command-menu-02.tsx +386 -0
- package/template/components/command-menu.tsx +182 -0
- package/template/components/compliance-board-view.tsx +134 -0
- package/template/components/compliance-client.tsx +92 -0
- package/template/components/compliance-list-view.tsx +59 -0
- package/template/components/compliance-page-header.tsx +89 -0
- package/template/components/compliance-table.tsx +525 -0
- package/template/components/dashboard-onboarding-gallery.tsx +13 -0
- package/template/components/dashboard-onboarding.tsx +21 -0
- package/template/components/dashboard-promo-banner.tsx +67 -0
- package/template/components/dashboard-quota-progress-card.tsx +369 -0
- package/template/components/dashboard-report-charts.tsx +69 -0
- package/template/components/dashboard-section-heading.tsx +68 -0
- package/template/components/dashboard-tabs.tsx +598 -0
- package/template/components/data-list-client.tsx +239 -0
- package/template/components/data-list-table-cells.test.tsx +22 -0
- package/template/components/data-list-table-cells.tsx +173 -0
- package/template/components/data-list-table.tsx +879 -0
- package/template/components/data-table/filter-date-calendar.tsx +38 -0
- package/template/components/data-table/filter-text-value-input.tsx +77 -0
- package/template/components/data-table/index.tsx +1612 -0
- package/template/components/data-table/pagination.tsx +256 -0
- package/template/components/data-table/types.ts +91 -0
- package/template/components/data-table/use-table-state.ts +566 -0
- package/template/components/data-view-dashboard-charts-compliance.tsx +960 -0
- package/template/components/data-view-dashboard-charts-team.tsx +968 -0
- package/template/components/data-view-dashboard-charts.tsx +1668 -0
- package/template/components/data-views/board-card-primitives.tsx +93 -0
- package/template/components/data-views/index.ts +41 -0
- package/template/components/data-views/list-page-board-card.tsx +192 -0
- package/template/components/data-views/list-page-board-template.tsx +122 -0
- package/template/components/data-views/placement-board-card.tsx +262 -0
- package/template/components/export-drawer.tsx +375 -0
- package/template/components/exxat-product-logo.tsx +453 -0
- package/template/components/form-layout-01.tsx +131 -0
- package/template/components/getting-started.tsx +625 -0
- package/template/components/key-metrics.tsx +920 -0
- package/template/components/leo-insight-indicator.tsx +364 -0
- package/template/components/leo-typing-dots.tsx +121 -0
- package/template/components/list-hub-status-badge.tsx +51 -0
- package/template/components/list-page-dashboard-charts.tsx +18 -0
- package/template/components/nav-documents.tsx +89 -0
- package/template/components/nav-main.tsx +58 -0
- package/template/components/nav-secondary.tsx +64 -0
- package/template/components/nav-user.tsx +190 -0
- package/template/components/new-placement-back-btn.tsx +28 -0
- package/template/components/new-placement-form.tsx +1066 -0
- package/template/components/onboarding/index.ts +4 -0
- package/template/components/onboarding/onboarding-01.tsx +7 -0
- package/template/components/onboarding/onboarding-02.tsx +7 -0
- package/template/components/onboarding/onboarding-03.tsx +7 -0
- package/template/components/onboarding/onboarding-04.tsx +7 -0
- package/template/components/page-header.tsx +57 -0
- package/template/components/placement-detail.tsx +438 -0
- package/template/components/placements-board-view.tsx +404 -0
- package/template/components/placements-list-view.tsx +285 -0
- package/template/components/placements-page-header.tsx +160 -0
- package/template/components/placements-table-columns.tsx +639 -0
- package/template/components/product-switcher.tsx +116 -0
- package/template/components/question-bank-board-view.tsx +205 -0
- package/template/components/question-bank-client.tsx +77 -0
- package/template/components/question-bank-list-view.tsx +59 -0
- package/template/components/question-bank-page-header.tsx +89 -0
- package/template/components/question-bank-table.tsx +586 -0
- package/template/components/rotations-empty-state.tsx +47 -0
- package/template/components/rotations-panel-activator.tsx +8 -0
- package/template/components/secondary-nav.tsx +394 -0
- package/template/components/secondary-panel.tsx +239 -0
- package/template/components/section-cards.tsx +106 -0
- package/template/components/settings-appearance-card.tsx +424 -0
- package/template/components/settings-client.tsx +537 -0
- package/template/components/settings-form-row.tsx +42 -0
- package/template/components/sidebar-auto-collapse.tsx +23 -0
- package/template/components/sidebar-auto-open.tsx +18 -0
- package/template/components/sidebar-shell.tsx +37 -0
- package/template/components/site-header.tsx +93 -0
- package/template/components/sites-all-client.tsx +154 -0
- package/template/components/sites-board-view.tsx +67 -0
- package/template/components/sites-list-view.tsx +47 -0
- package/template/components/sites-table.tsx +312 -0
- package/template/components/system-banner-slot.tsx +66 -0
- package/template/components/table-properties/column-row.tsx +90 -0
- package/template/components/table-properties/draggable-list.ts +49 -0
- package/template/components/table-properties/drawer-button.tsx +231 -0
- package/template/components/table-properties/drawer.tsx +1102 -0
- package/template/components/table-properties/filter-card.tsx +251 -0
- package/template/components/table-properties/index.ts +22 -0
- package/template/components/table-properties/sort-card.tsx +59 -0
- package/template/components/table-properties/types.ts +124 -0
- package/template/components/task-list-panel.tsx +98 -0
- package/template/components/task-priority-badge.tsx +28 -0
- package/template/components/team-board-view.tsx +114 -0
- package/template/components/team-client.tsx +93 -0
- package/template/components/team-list-view.tsx +62 -0
- package/template/components/team-page-header.tsx +92 -0
- package/template/components/team-table.tsx +525 -0
- package/template/components/templates/list-page.tsx +576 -0
- package/template/components/templates/primary-page-template.tsx +56 -0
- package/template/components/theme-color-sync.tsx +32 -0
- package/template/components/theme-provider.tsx +71 -0
- package/template/components/tinted-icon-disc.tsx +53 -0
- package/template/components/ui/ai-thinking-surface.tsx +121 -0
- package/template/components/ui/avatar.tsx +1 -0
- package/template/components/ui/badge.tsx +1 -0
- package/template/components/ui/banner.tsx +1 -0
- package/template/components/ui/breadcrumb.tsx +1 -0
- package/template/components/ui/button.tsx +1 -0
- package/template/components/ui/calendar.tsx +1 -0
- package/template/components/ui/card.tsx +1 -0
- package/template/components/ui/chart.tsx +1 -0
- package/template/components/ui/checkbox.tsx +1 -0
- package/template/components/ui/coach-mark.tsx +1 -0
- package/template/components/ui/collapsible.tsx +1 -0
- package/template/components/ui/command.tsx +1 -0
- package/template/components/ui/date-picker-field.tsx +1 -0
- package/template/components/ui/dialog.tsx +1 -0
- package/template/components/ui/dot-pattern.tsx +159 -0
- package/template/components/ui/drag-handle-grip.tsx +1 -0
- package/template/components/ui/drawer.tsx +1 -0
- package/template/components/ui/dropdown-menu.tsx +1 -0
- package/template/components/ui/field.tsx +1 -0
- package/template/components/ui/form.tsx +1 -0
- package/template/components/ui/input-group.tsx +1 -0
- package/template/components/ui/input-mask.tsx +1 -0
- package/template/components/ui/input.tsx +1 -0
- package/template/components/ui/kbd.tsx +1 -0
- package/template/components/ui/label.tsx +1 -0
- package/template/components/ui/leo-icon.tsx +726 -0
- package/template/components/ui/payment-card-fields.tsx +1 -0
- package/template/components/ui/popover.tsx +1 -0
- package/template/components/ui/radio-group.tsx +1 -0
- package/template/components/ui/select.tsx +1 -0
- package/template/components/ui/selection-tile-grid.tsx +1 -0
- package/template/components/ui/separator.tsx +1 -0
- package/template/components/ui/sheet.tsx +1 -0
- package/template/components/ui/sidebar.tsx +1 -0
- package/template/components/ui/skeleton.tsx +1 -0
- package/template/components/ui/sonner.tsx +1 -0
- package/template/components/ui/status-badge.tsx +1 -0
- package/template/components/ui/table.tsx +1 -0
- package/template/components/ui/tabs.tsx +1 -0
- package/template/components/ui/textarea.tsx +1 -0
- package/template/components/ui/tip.tsx +1 -0
- package/template/components/ui/toggle-group.tsx +1 -0
- package/template/components/ui/toggle-switch.tsx +1 -0
- package/template/components/ui/toggle.tsx +1 -0
- package/template/components/ui/tooltip.tsx +1 -0
- package/template/components/ui/view-segmented-control.tsx +1 -0
- package/template/components.json +27 -0
- package/template/contexts/chart-variant-context.tsx +35 -0
- package/template/contexts/command-menu-context.tsx +28 -0
- package/template/contexts/dashboard-view-context.tsx +35 -0
- package/template/contexts/product-context.tsx +38 -0
- package/template/contexts/system-banner-context.tsx +127 -0
- package/template/docs/command-menu-pattern.md +45 -0
- package/template/docs/data-views-pattern.md +160 -0
- package/template/ecosystem.config.cjs +20 -0
- package/template/eslint.config.mjs +18 -0
- package/template/fontawesome-subset.manifest.json +190 -0
- package/template/hooks/.gitkeep +0 -0
- package/template/hooks/use-app-theme.ts +1 -0
- package/template/hooks/use-coach-mark.ts +1 -0
- package/template/hooks/use-mobile.ts +1 -0
- package/template/hooks/use-mod-key-label.ts +1 -0
- package/template/lib/.gitkeep +0 -0
- package/template/lib/ask-leo-route-context.ts +133 -0
- package/template/lib/chart-keyboard-selection.test.ts +20 -0
- package/template/lib/chart-keyboard-selection.ts +17 -0
- package/template/lib/chart-line-dash.ts +16 -0
- package/template/lib/coach-mark-registry.ts +68 -0
- package/template/lib/command-menu-config.ts +127 -0
- package/template/lib/command-menu-search-data.ts +44 -0
- package/template/lib/conditional-rule-match.ts +32 -0
- package/template/lib/dashboard-customize-coach-mark.ts +18 -0
- package/template/lib/dashboard-layout-merge.ts +63 -0
- package/template/lib/data-list-display-options.ts +35 -0
- package/template/lib/data-list-persistence.ts +280 -0
- package/template/lib/data-list-view-surface.ts +58 -0
- package/template/lib/data-list-view.ts +29 -0
- package/template/lib/data-view-dashboard-storage.ts +101 -0
- package/template/lib/date-filter.ts +8 -0
- package/template/lib/dev-log.test.ts +28 -0
- package/template/lib/dev-log.ts +8 -0
- package/template/lib/editable-target.ts +10 -0
- package/template/lib/floating-sheet-panel.ts +72 -0
- package/template/lib/initials-from-name.ts +7 -0
- package/template/lib/list-page-table-properties.ts +52 -0
- package/template/lib/list-status-badges.ts +168 -0
- package/template/lib/logo-dev.ts +12 -0
- package/template/lib/mock/compliance-kpi.ts +61 -0
- package/template/lib/mock/compliance.ts +146 -0
- package/template/lib/mock/dashboard.ts +105 -0
- package/template/lib/mock/navigation.tsx +231 -0
- package/template/lib/mock/placements-kpi.ts +134 -0
- package/template/lib/mock/placements.ts +183 -0
- package/template/lib/mock/question-bank-kpi.ts +61 -0
- package/template/lib/mock/question-bank.ts +142 -0
- package/template/lib/mock/sites-directory.ts +16 -0
- package/template/lib/mock/sites-kpi.ts +25 -0
- package/template/lib/mock/team-kpi.ts +60 -0
- package/template/lib/mock/team.ts +118 -0
- package/template/lib/motion-ui.ts +17 -0
- package/template/lib/placement-board-card-layout.ts +79 -0
- package/template/lib/placement-lifecycle.ts +5 -0
- package/template/lib/row-height.ts +10 -0
- package/template/lib/stock-portrait.ts +11 -0
- package/template/lib/utils.test.ts +13 -0
- package/template/lib/utils.ts +1 -0
- package/template/next.config.mjs +15 -0
- package/template/package.json +83 -0
- package/template/postcss.config.mjs +8 -0
- package/template/public/.gitkeep +0 -0
- package/template/public/Illustration/Rotation.svg +74 -0
- package/template/public/avatars/user.svg +11 -0
- package/template/public/favicon/favicon.ico +0 -0
- package/template/public/favicon.ico +0 -0
- package/template/public/logos/exxat-one.svg +36 -0
- package/template/public/logos/exxat-prism.svg +39 -0
- package/template/public/mock-schools/emory.svg +4 -0
- package/template/public/mock-schools/rush.svg +4 -0
- package/template/scripts/fontawesome-subset-audit.mjs +190 -0
- package/template/scripts/pm2-startup-macos.sh +13 -0
- package/template/skills-lock.json +10 -0
- package/template/stores/app-store.ts +33 -0
- package/template/tests/setup.ts +1 -0
- package/template/tsconfig.json +35 -0
- package/template/types/react-payment-inputs.d.ts +19 -0
- package/template/vitest.config.ts +18 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kitId": "d9bd5774e0",
|
|
3
|
+
"generatedAt": "2026-04-23T07:50:58.982Z",
|
|
4
|
+
"sourcePaths": [
|
|
5
|
+
"apps/web/{app,components,lib,contexts,hooks}",
|
|
6
|
+
"packages/ui/src"
|
|
7
|
+
],
|
|
8
|
+
"stylesDetected": [
|
|
9
|
+
"duotone",
|
|
10
|
+
"light",
|
|
11
|
+
"solid"
|
|
12
|
+
],
|
|
13
|
+
"duotoneNote": "Icons used as fa-duotone fa-solid … require Duotone + Solid in Kit settings (e.g. star-christmas).",
|
|
14
|
+
"iconCount": 166,
|
|
15
|
+
"icons": [
|
|
16
|
+
"arrow-down",
|
|
17
|
+
"arrow-down-az",
|
|
18
|
+
"arrow-down-to-line",
|
|
19
|
+
"arrow-left",
|
|
20
|
+
"arrow-left-to-line",
|
|
21
|
+
"arrow-right",
|
|
22
|
+
"arrow-right-from-bracket",
|
|
23
|
+
"arrow-right-to-line",
|
|
24
|
+
"arrow-rotate-right",
|
|
25
|
+
"arrow-trend-down",
|
|
26
|
+
"arrow-trend-up",
|
|
27
|
+
"arrow-up",
|
|
28
|
+
"arrow-up-arrow-down",
|
|
29
|
+
"arrow-up-az",
|
|
30
|
+
"arrow-up-right",
|
|
31
|
+
"arrow-up-right-from-square",
|
|
32
|
+
"arrows-rotate",
|
|
33
|
+
"arrows-up-down",
|
|
34
|
+
"ban",
|
|
35
|
+
"bell",
|
|
36
|
+
"book-open",
|
|
37
|
+
"books",
|
|
38
|
+
"border-all",
|
|
39
|
+
"box-archive",
|
|
40
|
+
"briefcase",
|
|
41
|
+
"building",
|
|
42
|
+
"bullseye",
|
|
43
|
+
"calendar",
|
|
44
|
+
"calendar-check",
|
|
45
|
+
"calendar-clock",
|
|
46
|
+
"calendar-day",
|
|
47
|
+
"calendar-days",
|
|
48
|
+
"calendar-week",
|
|
49
|
+
"calendar-xmark",
|
|
50
|
+
"certificate",
|
|
51
|
+
"chart-area",
|
|
52
|
+
"chart-bar",
|
|
53
|
+
"chart-column",
|
|
54
|
+
"chart-line",
|
|
55
|
+
"chart-mixed",
|
|
56
|
+
"chart-pie",
|
|
57
|
+
"check",
|
|
58
|
+
"chevron-down",
|
|
59
|
+
"chevron-left",
|
|
60
|
+
"chevron-right",
|
|
61
|
+
"chevron-up",
|
|
62
|
+
"chevrons-left",
|
|
63
|
+
"chevrons-right",
|
|
64
|
+
"circle",
|
|
65
|
+
"circle-1",
|
|
66
|
+
"circle-2",
|
|
67
|
+
"circle-3",
|
|
68
|
+
"circle-check",
|
|
69
|
+
"circle-dot",
|
|
70
|
+
"circle-exclamation",
|
|
71
|
+
"circle-half-stroke",
|
|
72
|
+
"circle-info",
|
|
73
|
+
"circle-notch",
|
|
74
|
+
"circle-play",
|
|
75
|
+
"circle-question",
|
|
76
|
+
"circle-user",
|
|
77
|
+
"circle-xmark",
|
|
78
|
+
"clipboard-check",
|
|
79
|
+
"clipboard-list",
|
|
80
|
+
"clock",
|
|
81
|
+
"clock-rotate-left",
|
|
82
|
+
"comments",
|
|
83
|
+
"copy",
|
|
84
|
+
"credit-card",
|
|
85
|
+
"database",
|
|
86
|
+
"down-to-line",
|
|
87
|
+
"download",
|
|
88
|
+
"ellipsis",
|
|
89
|
+
"ellipsis-vertical",
|
|
90
|
+
"envelope",
|
|
91
|
+
"envelope-open",
|
|
92
|
+
"eye",
|
|
93
|
+
"eye-slash",
|
|
94
|
+
"file",
|
|
95
|
+
"file-chart-column",
|
|
96
|
+
"file-check",
|
|
97
|
+
"file-csv",
|
|
98
|
+
"file-excel",
|
|
99
|
+
"file-lines",
|
|
100
|
+
"file-pdf",
|
|
101
|
+
"file-pen",
|
|
102
|
+
"file-signature",
|
|
103
|
+
"filter",
|
|
104
|
+
"flag",
|
|
105
|
+
"folder",
|
|
106
|
+
"folder-tree",
|
|
107
|
+
"font",
|
|
108
|
+
"gear",
|
|
109
|
+
"graduation-cap",
|
|
110
|
+
"grid-2",
|
|
111
|
+
"grip-dots-vertical",
|
|
112
|
+
"hashtag",
|
|
113
|
+
"headset",
|
|
114
|
+
"hospital",
|
|
115
|
+
"hourglass-half",
|
|
116
|
+
"house-laptop",
|
|
117
|
+
"layer-group",
|
|
118
|
+
"link",
|
|
119
|
+
"list",
|
|
120
|
+
"list-check",
|
|
121
|
+
"list-ol",
|
|
122
|
+
"location-dot",
|
|
123
|
+
"magnifying-glass",
|
|
124
|
+
"map-location",
|
|
125
|
+
"maximize",
|
|
126
|
+
"microphone",
|
|
127
|
+
"minus",
|
|
128
|
+
"moon",
|
|
129
|
+
"note-sticky",
|
|
130
|
+
"octagon-xmark",
|
|
131
|
+
"palette",
|
|
132
|
+
"paper-plane-top",
|
|
133
|
+
"paperclip",
|
|
134
|
+
"pen",
|
|
135
|
+
"pen-field",
|
|
136
|
+
"pen-ruler",
|
|
137
|
+
"pen-to-square",
|
|
138
|
+
"phone",
|
|
139
|
+
"play",
|
|
140
|
+
"plug",
|
|
141
|
+
"plus",
|
|
142
|
+
"robot",
|
|
143
|
+
"rocket-launch",
|
|
144
|
+
"rotate",
|
|
145
|
+
"rotate-left",
|
|
146
|
+
"route",
|
|
147
|
+
"share-nodes",
|
|
148
|
+
"shield-check",
|
|
149
|
+
"sidebar",
|
|
150
|
+
"sigma",
|
|
151
|
+
"signal",
|
|
152
|
+
"sitemap",
|
|
153
|
+
"sliders",
|
|
154
|
+
"spinner",
|
|
155
|
+
"spinner-third",
|
|
156
|
+
"square-plus",
|
|
157
|
+
"star",
|
|
158
|
+
"star-christmas",
|
|
159
|
+
"stethoscope",
|
|
160
|
+
"sun",
|
|
161
|
+
"sun-bright",
|
|
162
|
+
"table",
|
|
163
|
+
"table-columns",
|
|
164
|
+
"table-list",
|
|
165
|
+
"tag",
|
|
166
|
+
"text-width",
|
|
167
|
+
"thumbtack-slash",
|
|
168
|
+
"trash",
|
|
169
|
+
"triangle-exclamation",
|
|
170
|
+
"up-to-line",
|
|
171
|
+
"user",
|
|
172
|
+
"user-check",
|
|
173
|
+
"user-doctor",
|
|
174
|
+
"user-gear",
|
|
175
|
+
"user-graduate",
|
|
176
|
+
"user-magnifying-glass",
|
|
177
|
+
"user-nurse",
|
|
178
|
+
"user-plus",
|
|
179
|
+
"user-tie",
|
|
180
|
+
"users",
|
|
181
|
+
"xmark"
|
|
182
|
+
],
|
|
183
|
+
"kitSteps": [
|
|
184
|
+
"Open https://fontawesome.com/kits and select this kit.",
|
|
185
|
+
"Settings → Icon Selection → By Icon → add every name from `icons` (search in FA).",
|
|
186
|
+
"Settings → Icon Selection → By Style → enable only: Light, Solid, and Duotone if duotone icons are used.",
|
|
187
|
+
"Save the kit, then verify the app (hard refresh). Missing icons show as empty squares.",
|
|
188
|
+
"Re-run `pnpm fa:subset-audit` after adding icons and commit the updated manifest."
|
|
189
|
+
]
|
|
190
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../../packages/ui/src/hooks/use-app-theme"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../../packages/ui/src/hooks/use-coach-mark"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../../packages/ui/src/hooks/use-mobile"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../../packages/ui/src/hooks/use-mod-key-label"
|
|
File without changes
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route-derived defaults for Ask Leo when no page calls `useAskLeoPageContext`.
|
|
3
|
+
* Keeps titles and starters aligned with primary nav (not raw URL segments).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface AskLeoRouteContextPayload {
|
|
7
|
+
title: string
|
|
8
|
+
description?: string
|
|
9
|
+
suggestions?: string[]
|
|
10
|
+
data?: Record<string, unknown>
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Fallback starters when a page provides no `suggestions`. */
|
|
14
|
+
export const ASK_LEO_GENERIC_SUGGESTIONS = [
|
|
15
|
+
"Which students are at risk of non-compliance?",
|
|
16
|
+
"Show me placements ending this month",
|
|
17
|
+
"Summarize placement progress",
|
|
18
|
+
"Compare this cycle vs. last cycle",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
export function getAskLeoRouteContext(pathname: string | null): AskLeoRouteContextPayload {
|
|
22
|
+
if (!pathname || pathname === "/") {
|
|
23
|
+
return {
|
|
24
|
+
title: "Dashboard",
|
|
25
|
+
description: "Overview of metrics, charts, and AI insights.",
|
|
26
|
+
suggestions: [
|
|
27
|
+
"What changed in my key metrics this week?",
|
|
28
|
+
"Summarize tasks and insights I should act on",
|
|
29
|
+
"Explain the trend on the main placement chart",
|
|
30
|
+
],
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (pathname.startsWith("/dashboard")) {
|
|
35
|
+
return {
|
|
36
|
+
title: "Dashboard",
|
|
37
|
+
description: "Overview of metrics, charts, and AI insights.",
|
|
38
|
+
suggestions: [
|
|
39
|
+
"What changed in my key metrics this week?",
|
|
40
|
+
"Summarize tasks and insights I should act on",
|
|
41
|
+
"Which chart should I look at first for placement health?",
|
|
42
|
+
],
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (pathname.startsWith("/data-list")) {
|
|
47
|
+
return {
|
|
48
|
+
title: "Placements",
|
|
49
|
+
description: "List, filter, and export placement records — table, board, and dashboard views.",
|
|
50
|
+
suggestions: [
|
|
51
|
+
"Which placements end in the next 30 days?",
|
|
52
|
+
"Summarize placements by site for this lifecycle tab",
|
|
53
|
+
"What filters would narrow this list to at-risk students?",
|
|
54
|
+
],
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (pathname.startsWith("/team")) {
|
|
59
|
+
return {
|
|
60
|
+
title: "Team",
|
|
61
|
+
description: "Directory and workload for coordinators and faculty.",
|
|
62
|
+
suggestions: [
|
|
63
|
+
"Who owns the most active placements?",
|
|
64
|
+
"Summarize team workload by program",
|
|
65
|
+
],
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (pathname.startsWith("/compliance")) {
|
|
70
|
+
return {
|
|
71
|
+
title: "Compliance",
|
|
72
|
+
description: "Compliance tracking and outstanding requirements.",
|
|
73
|
+
suggestions: [
|
|
74
|
+
"List items due this week",
|
|
75
|
+
"Which students have outstanding compliance tasks?",
|
|
76
|
+
],
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (pathname.startsWith("/question-bank")) {
|
|
81
|
+
return {
|
|
82
|
+
title: "Question bank",
|
|
83
|
+
description: "Assessment and question library.",
|
|
84
|
+
suggestions: [
|
|
85
|
+
"Suggest questions for a clinical reasoning quiz",
|
|
86
|
+
"How do I filter by difficulty or topic?",
|
|
87
|
+
],
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (pathname.startsWith("/rotations")) {
|
|
92
|
+
return {
|
|
93
|
+
title: "Rotations",
|
|
94
|
+
description: "Rotation schedules and capacity.",
|
|
95
|
+
suggestions: [
|
|
96
|
+
"Summarize rotation blocks for this term",
|
|
97
|
+
"Which sites have open capacity?",
|
|
98
|
+
],
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (pathname.startsWith("/settings")) {
|
|
103
|
+
return {
|
|
104
|
+
title: "Settings",
|
|
105
|
+
description: "Appearance, banner, and guided tours for this browser.",
|
|
106
|
+
suggestions: [
|
|
107
|
+
"How do I reset onboarding tours?",
|
|
108
|
+
"Where is high contrast configured?",
|
|
109
|
+
],
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (pathname.startsWith("/help")) {
|
|
114
|
+
return {
|
|
115
|
+
title: "Get help",
|
|
116
|
+
description: "Exxat Help Center and support resources.",
|
|
117
|
+
suggestions: [
|
|
118
|
+
"Where do I find training articles?",
|
|
119
|
+
"How do I contact support?",
|
|
120
|
+
],
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const last = pathname.split("/").filter(Boolean).pop() ?? "this page"
|
|
125
|
+
const title = last
|
|
126
|
+
.replace(/[-_]/g, " ")
|
|
127
|
+
.replace(/\b\w/g, (c) => c.toUpperCase())
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
title,
|
|
131
|
+
suggestions: ASK_LEO_GENERIC_SUGGESTIONS,
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest"
|
|
2
|
+
|
|
3
|
+
import { CHART_KBD_ACTIVE_BAR, CHART_KBD_ACTIVE_PIE_SHAPE } from "./chart-keyboard-selection"
|
|
4
|
+
|
|
5
|
+
describe("chart-keyboard-selection", () => {
|
|
6
|
+
it("exports bar active styling for Recharts", () => {
|
|
7
|
+
expect(CHART_KBD_ACTIVE_BAR).toMatchObject({
|
|
8
|
+
stroke: "var(--ring)",
|
|
9
|
+
strokeWidth: 2,
|
|
10
|
+
fillOpacity: 1,
|
|
11
|
+
})
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
it("exports pie active shape for Recharts", () => {
|
|
15
|
+
expect(CHART_KBD_ACTIVE_PIE_SHAPE).toMatchObject({
|
|
16
|
+
stroke: "var(--ring)",
|
|
17
|
+
strokeWidth: 3,
|
|
18
|
+
})
|
|
19
|
+
})
|
|
20
|
+
})
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyboard selection styling for Recharts — matches `charts-overview` (dashboard gallery)
|
|
3
|
+
* so Data view dashboards use the same ring-on-active pattern instead of opacity-only dimming.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/** Passed to `<Bar activeBar={…} activeIndex={…} />` */
|
|
7
|
+
export const CHART_KBD_ACTIVE_BAR = {
|
|
8
|
+
stroke: "var(--ring)",
|
|
9
|
+
strokeWidth: 2,
|
|
10
|
+
fillOpacity: 1,
|
|
11
|
+
} as const
|
|
12
|
+
|
|
13
|
+
/** Passed to `<Pie activeShape={…} activeIndex={…} />` (see DonutChartContent) */
|
|
14
|
+
export const CHART_KBD_ACTIVE_PIE_SHAPE = {
|
|
15
|
+
strokeWidth: 3,
|
|
16
|
+
stroke: "var(--ring)",
|
|
17
|
+
} as const
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-series stroke dash patterns for multi-line Recharts — supplements hue (WCAG 1.4.1).
|
|
3
|
+
* Index 0 = solid; later series use distinct patterns so lines stay distinguishable in grayscale / CVD.
|
|
4
|
+
*/
|
|
5
|
+
export const CHART_LINE_STROKE_DASH = [
|
|
6
|
+
undefined,
|
|
7
|
+
"6 4",
|
|
8
|
+
"2 3",
|
|
9
|
+
"10 3 2 3",
|
|
10
|
+
"8 4 2 4 2 4",
|
|
11
|
+
] as const
|
|
12
|
+
|
|
13
|
+
export function chartLineStrokeDash(seriesIndex: number): string | undefined {
|
|
14
|
+
const i = ((seriesIndex % CHART_LINE_STROKE_DASH.length) + CHART_LINE_STROKE_DASH.length) % CHART_LINE_STROKE_DASH.length
|
|
15
|
+
return CHART_LINE_STROKE_DASH[i] as string | undefined
|
|
16
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coach Mark Registry — central definition of all coach mark flows.
|
|
3
|
+
*
|
|
4
|
+
* Used by:
|
|
5
|
+
* • Settings page to list/reset/preview flows
|
|
6
|
+
* • Individual pages to look up their flow steps
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface CoachMarkFlowDef {
|
|
10
|
+
/** Unique flow ID — matches the key in localStorage */
|
|
11
|
+
id: string
|
|
12
|
+
/** Human-readable name shown in settings */
|
|
13
|
+
name: string
|
|
14
|
+
/** Short description of what the tour covers */
|
|
15
|
+
description: string
|
|
16
|
+
/** Which page this flow runs on */
|
|
17
|
+
page: string
|
|
18
|
+
/** Page URL (for "Preview" navigation) */
|
|
19
|
+
pageUrl: string
|
|
20
|
+
/** Number of steps */
|
|
21
|
+
stepCount: number
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const COACH_MARK_FLOWS: CoachMarkFlowDef[] = [
|
|
25
|
+
{
|
|
26
|
+
id: "dashboard-tour",
|
|
27
|
+
name: "Dashboard Tour",
|
|
28
|
+
description:
|
|
29
|
+
"Introduces the dashboard — key metrics, AI insights, Ask Leo, and view switching.",
|
|
30
|
+
page: "Dashboard",
|
|
31
|
+
pageUrl: "/dashboard",
|
|
32
|
+
stepCount: 4,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: "placements-views-tour",
|
|
36
|
+
name: "Views & Properties Tour",
|
|
37
|
+
description:
|
|
38
|
+
"Walks through view tabs, customisation, adding views, search, filters, and the Properties panel.",
|
|
39
|
+
page: "Placements",
|
|
40
|
+
pageUrl: "/data-list",
|
|
41
|
+
stepCount: 6,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: "placements-dashboard-customize",
|
|
45
|
+
name: "Customize dashboard (Placements)",
|
|
46
|
+
description:
|
|
47
|
+
"Highlights Edit layout on the Data view dashboard toolbar — drag widgets, chart types, and width.",
|
|
48
|
+
page: "Placements",
|
|
49
|
+
pageUrl: "/data-list",
|
|
50
|
+
stepCount: 1,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: "team-dashboard-customize",
|
|
54
|
+
name: "Customize dashboard (Team)",
|
|
55
|
+
description: "Same as Placements — Edit layout for the Team Data dashboard.",
|
|
56
|
+
page: "Team",
|
|
57
|
+
pageUrl: "/team",
|
|
58
|
+
stepCount: 1,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: "compliance-dashboard-customize",
|
|
62
|
+
name: "Customize dashboard (Compliance)",
|
|
63
|
+
description: "Same as Placements — Edit layout for the Compliance Data dashboard.",
|
|
64
|
+
page: "Compliance",
|
|
65
|
+
pageUrl: "/compliance",
|
|
66
|
+
stepCount: 1,
|
|
67
|
+
},
|
|
68
|
+
]
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command palette (⌘K) — types, static groups, and `buildCommandMenuConfig()`.
|
|
3
|
+
* Optional **`dataGroups`** can be passed from the app shell when you want searchable row data.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export type CommandMenuItem = {
|
|
7
|
+
id: string
|
|
8
|
+
label: string
|
|
9
|
+
/** cmdk filter keywords */
|
|
10
|
+
keywords?: string
|
|
11
|
+
/** Font Awesome classes for link rows */
|
|
12
|
+
icon?: string
|
|
13
|
+
/** Navigate to this in-app route */
|
|
14
|
+
href?: string
|
|
15
|
+
/** If set, opens Ask Leo with this prompt (no navigation) */
|
|
16
|
+
askLeoPrompt?: string
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type CommandMenuGroup = {
|
|
20
|
+
id: string
|
|
21
|
+
heading: string
|
|
22
|
+
items: CommandMenuItem[]
|
|
23
|
+
/**
|
|
24
|
+
* When true, this group is not rendered until the user types a non-empty search.
|
|
25
|
+
* Use for large row indexes (e.g. placements) so the palette does not list every record on open.
|
|
26
|
+
*/
|
|
27
|
+
searchOnly?: boolean
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export type CommandMenuConfig = {
|
|
31
|
+
/** cmdk accessible name */
|
|
32
|
+
commandLabel: string
|
|
33
|
+
dialogTitle: string
|
|
34
|
+
dialogDescription: string
|
|
35
|
+
inputPlaceholder: string
|
|
36
|
+
inputAriaLabel: string
|
|
37
|
+
emptyMessage: string
|
|
38
|
+
closeMenuAriaLabel: string
|
|
39
|
+
groups: CommandMenuGroup[]
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const COMMAND_MENU_SHELL: Omit<CommandMenuConfig, "groups"> = {
|
|
43
|
+
commandLabel: "Command menu",
|
|
44
|
+
dialogTitle: "Search",
|
|
45
|
+
dialogDescription:
|
|
46
|
+
"Search pages and components, or use AI suggestions. Use arrow keys to move through results, Enter to open, Escape to close.",
|
|
47
|
+
inputPlaceholder: "Search or ask Leo anything…",
|
|
48
|
+
inputAriaLabel: "Search pages, components, or ask Leo",
|
|
49
|
+
emptyMessage: "No results found.",
|
|
50
|
+
closeMenuAriaLabel: "Close command menu",
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** AI prompts, navigation, library, and patterns — fixed product chrome (not row data). */
|
|
54
|
+
const STATIC_COMMAND_GROUPS: CommandMenuGroup[] = [
|
|
55
|
+
{
|
|
56
|
+
id: "ai",
|
|
57
|
+
heading: "AI suggestions",
|
|
58
|
+
items: [
|
|
59
|
+
{
|
|
60
|
+
id: "ai-compliance",
|
|
61
|
+
label: "Which students are at risk of non-compliance?",
|
|
62
|
+
keywords: "leo ai assistant compliance students risk",
|
|
63
|
+
askLeoPrompt: "Which students are at risk of non-compliance?",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: "ai-placements-month",
|
|
67
|
+
label: "Show me placements ending this month",
|
|
68
|
+
keywords: "leo ai placements calendar month",
|
|
69
|
+
askLeoPrompt: "Show me placements ending this month",
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
id: "ai-summarize",
|
|
73
|
+
label: "Summarize placement progress",
|
|
74
|
+
keywords: "leo ai summary placements progress",
|
|
75
|
+
askLeoPrompt: "Summarize placement progress",
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: "ai-compare-cycle",
|
|
79
|
+
label: "Compare this cycle vs. last cycle",
|
|
80
|
+
keywords: "leo ai compare cycle trend",
|
|
81
|
+
askLeoPrompt: "Compare this cycle vs. last cycle",
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: "navigation",
|
|
87
|
+
heading: "Navigation",
|
|
88
|
+
items: [
|
|
89
|
+
{ id: "nav-dashboard", icon: "fa-light fa-grid-2", label: "Dashboard", href: "/dashboard" },
|
|
90
|
+
{
|
|
91
|
+
id: "nav-question-bank",
|
|
92
|
+
icon: "fa-light fa-books",
|
|
93
|
+
label: "Question bank",
|
|
94
|
+
href: "/question-bank",
|
|
95
|
+
keywords: "assessment items exam quiz",
|
|
96
|
+
},
|
|
97
|
+
{ id: "nav-placements", icon: "fa-light fa-user-graduate", label: "Placements", href: "/data-list" },
|
|
98
|
+
{ id: "nav-rotations", icon: "fa-light fa-arrows-rotate", label: "Rotations", href: "/rotations" },
|
|
99
|
+
{ id: "nav-team", icon: "fa-light fa-users", label: "Team", href: "/team" },
|
|
100
|
+
{ id: "nav-compliance", icon: "fa-light fa-shield-check", label: "Compliance", href: "/compliance" },
|
|
101
|
+
{ id: "nav-settings", icon: "fa-light fa-gear", label: "Settings", href: "/settings" },
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
]
|
|
105
|
+
|
|
106
|
+
export type BuildCommandMenuConfigOptions = {
|
|
107
|
+
/**
|
|
108
|
+
* Searchable row groups from your data layer (mock or API). Omitted or empty = no data rows.
|
|
109
|
+
* Order: inserted after AI suggestions, before Navigation / Components / Patterns.
|
|
110
|
+
*/
|
|
111
|
+
dataGroups?: CommandMenuGroup[]
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Merge shell copy + static product groups with optional **`dataGroups`** from the app.
|
|
116
|
+
*/
|
|
117
|
+
export function buildCommandMenuConfig(
|
|
118
|
+
options: BuildCommandMenuConfigOptions = {},
|
|
119
|
+
): CommandMenuConfig {
|
|
120
|
+
const { dataGroups = [] } = options
|
|
121
|
+
const [aiGroup, ...staticRest] = STATIC_COMMAND_GROUPS
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
...COMMAND_MENU_SHELL,
|
|
125
|
+
groups: [aiGroup, ...dataGroups, ...staticRest],
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Searchable ⌘K rows from mock/API data. Wire new sources here — not in `command-menu-config.ts`.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { CommandMenuGroup, CommandMenuItem } from "@/lib/command-menu-config"
|
|
6
|
+
import { ALL_PLACEMENTS } from "@/lib/mock/placements"
|
|
7
|
+
|
|
8
|
+
function placementSearchItems(): CommandMenuItem[] {
|
|
9
|
+
return ALL_PLACEMENTS.map((p) => {
|
|
10
|
+
const nameParts = p.student.trim().split(/\s+/)
|
|
11
|
+
return {
|
|
12
|
+
id: `placement-${p.id}`,
|
|
13
|
+
label: `${p.student} — ${p.internship}`,
|
|
14
|
+
icon: "fa-light fa-user-graduate",
|
|
15
|
+
href: "/data-list",
|
|
16
|
+
keywords: [
|
|
17
|
+
p.student,
|
|
18
|
+
...nameParts,
|
|
19
|
+
p.program,
|
|
20
|
+
p.site,
|
|
21
|
+
p.internship,
|
|
22
|
+
p.specialization,
|
|
23
|
+
p.email,
|
|
24
|
+
p.supervisor,
|
|
25
|
+
p.status,
|
|
26
|
+
p.compliance,
|
|
27
|
+
]
|
|
28
|
+
.filter(Boolean)
|
|
29
|
+
.join(" "),
|
|
30
|
+
}
|
|
31
|
+
})
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Placements (student names, sites, programs, …) — passed as `dataGroups` in the app layout. */
|
|
35
|
+
export function getCommandMenuSearchDataGroups(): CommandMenuGroup[] {
|
|
36
|
+
return [
|
|
37
|
+
{
|
|
38
|
+
id: "placements",
|
|
39
|
+
heading: "Placements",
|
|
40
|
+
items: placementSearchItems(),
|
|
41
|
+
searchOnly: true,
|
|
42
|
+
},
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ConditionalRule } from "@/components/table-properties/types"
|
|
2
|
+
|
|
3
|
+
/** First matching conditional rule background for a row (same logic as DataTable cells). */
|
|
4
|
+
export function getConditionalRowBackground<T extends Record<string, unknown>>(
|
|
5
|
+
row: T,
|
|
6
|
+
rules: ConditionalRule[] | undefined,
|
|
7
|
+
): string | undefined {
|
|
8
|
+
if (!rules?.length) return undefined
|
|
9
|
+
for (const rule of rules) {
|
|
10
|
+
const cellVal = String(row[rule.fieldKey as keyof T] ?? "")
|
|
11
|
+
const v = cellVal.trim()
|
|
12
|
+
switch (rule.operator) {
|
|
13
|
+
case "is":
|
|
14
|
+
if (rule.values.length > 0 && rule.values.includes(v)) return rule.bgColor
|
|
15
|
+
break
|
|
16
|
+
case "is_not":
|
|
17
|
+
if (rule.values.length > 0 && !rule.values.includes(v)) return rule.bgColor
|
|
18
|
+
break
|
|
19
|
+
case "contains":
|
|
20
|
+
if (rule.values.length > 0 && rule.values.some(val => v.toLowerCase().includes(val.toLowerCase())))
|
|
21
|
+
return rule.bgColor
|
|
22
|
+
break
|
|
23
|
+
case "not_contains":
|
|
24
|
+
if (rule.values.length > 0 && !rule.values.some(val => v.toLowerCase().includes(val.toLowerCase())))
|
|
25
|
+
return rule.bgColor
|
|
26
|
+
break
|
|
27
|
+
default:
|
|
28
|
+
break
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return undefined
|
|
32
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared coach-mark step for **Data** view dashboard — Edit layout (Placements, Team, Compliance).
|
|
3
|
+
* Targets the toolbar pen-ruler control (`aria-label="Edit dashboard layout"`).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { CoachMarkStep } from "@/hooks/use-coach-mark"
|
|
7
|
+
|
|
8
|
+
export const DASHBOARD_CUSTOMIZE_COACH_STEPS: CoachMarkStep[] = [
|
|
9
|
+
{
|
|
10
|
+
id: "dashboard-customize-edit",
|
|
11
|
+
target: "[aria-label='Edit dashboard layout']",
|
|
12
|
+
side: "bottom",
|
|
13
|
+
align: "end",
|
|
14
|
+
title: "Customize your dashboard",
|
|
15
|
+
description:
|
|
16
|
+
"Turn on Edit layout to drag widgets, change chart types, resize to full width, and show or hide cards. Changes save automatically for this hub.",
|
|
17
|
+
},
|
|
18
|
+
]
|