@exxatdesignux/ui 0.2.19 → 0.4.0
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/CHANGELOG.md +662 -7
- package/bin/sync-extras.mjs +116 -29
- package/consumer-extras/README.md +42 -7
- package/consumer-extras/cursor-rules/exxat-accessibility.mdc +39 -0
- package/consumer-extras/cursor-rules/exxat-board-cards.mdc +26 -0
- package/consumer-extras/cursor-rules/exxat-breadcrumbs-no-back.mdc +21 -0
- package/consumer-extras/cursor-rules/exxat-card-vs-list-rows.mdc +21 -0
- package/consumer-extras/cursor-rules/exxat-centralized-list-dataset.mdc +44 -0
- package/consumer-extras/cursor-rules/exxat-collaboration-access.mdc +32 -0
- package/consumer-extras/cursor-rules/exxat-command-menu.mdc +22 -0
- package/consumer-extras/cursor-rules/exxat-dashboard-view-charts.mdc +53 -0
- package/consumer-extras/cursor-rules/exxat-data-tables.mdc +43 -0
- package/consumer-extras/cursor-rules/exxat-dedicated-search-surfaces.mdc +25 -0
- package/consumer-extras/cursor-rules/exxat-drawer-vs-dialog.mdc +22 -0
- package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +56 -0
- package/consumer-extras/cursor-rules/exxat-fontawesome-icons.mdc +31 -0
- package/consumer-extras/cursor-rules/exxat-kbd-shortcuts.mdc +100 -0
- package/consumer-extras/cursor-rules/exxat-kpi-flat-band.mdc +28 -0
- package/consumer-extras/cursor-rules/exxat-kpi-max-four.mdc +21 -0
- package/consumer-extras/cursor-rules/exxat-kpi-trends.mdc +31 -0
- package/consumer-extras/cursor-rules/exxat-library-hub-header.mdc +28 -0
- package/consumer-extras/cursor-rules/exxat-list-page-connected-views.mdc +24 -0
- package/consumer-extras/cursor-rules/exxat-list-page-view-shells.mdc +31 -0
- package/consumer-extras/cursor-rules/exxat-mono-ids.mdc +30 -0
- package/consumer-extras/cursor-rules/exxat-no-slds-leakage.mdc +78 -0
- package/consumer-extras/cursor-rules/exxat-no-toast.mdc +25 -0
- package/consumer-extras/cursor-rules/exxat-page-vs-drawer.mdc +23 -0
- package/consumer-extras/cursor-rules/exxat-person-identity-display.mdc +47 -0
- package/consumer-extras/cursor-rules/exxat-primary-nav-secondary-panel.mdc +52 -0
- package/consumer-extras/cursor-rules/exxat-reuse-before-custom.mdc +34 -0
- package/consumer-extras/cursor-rules/exxat-table-properties-drawer.mdc +77 -0
- package/consumer-extras/cursor-rules/exxat-token-discipline.mdc +103 -0
- package/consumer-extras/cursor-skills/exxat-accessibility/SKILL.md +1 -1
- package/consumer-extras/cursor-skills/exxat-board-cards/SKILL.md +3 -3
- package/consumer-extras/cursor-skills/exxat-centralized-list-dataset/SKILL.md +5 -16
- package/consumer-extras/cursor-skills/exxat-collaboration-access/SKILL.md +3 -3
- package/consumer-extras/cursor-skills/exxat-dedicated-search-surfaces/SKILL.md +2 -2
- package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +19 -34
- package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +1 -1
- package/consumer-extras/cursor-skills/exxat-kpi-flat-band/SKILL.md +1 -1
- package/consumer-extras/cursor-skills/exxat-list-page-view-shells/SKILL.md +1 -1
- package/consumer-extras/cursor-skills/exxat-mono-ids/SKILL.md +4 -4
- package/consumer-extras/cursor-skills/exxat-primary-nav-secondary-panel/SKILL.md +10 -12
- package/consumer-extras/cursor-skills/exxat-token-economy/SKILL.md +277 -0
- package/consumer-extras/handbook/HANDBOOK.md +187 -0
- package/consumer-extras/handbook/glossary.md +58 -0
- package/consumer-extras/handbook/reference-implementations.md +153 -0
- package/consumer-extras/handbook/voice-and-tone.md +262 -0
- package/consumer-extras/patterns/collaboration-access-pattern.md +7 -7
- package/consumer-extras/patterns/command-menu-pattern.md +1 -1
- package/consumer-extras/patterns/consumer-upgrade-checklist.md +0 -20
- package/consumer-extras/patterns/data-views-pattern.md +31 -66
- package/consumer-extras/patterns/kpi-flat-band-pattern.md +2 -2
- package/consumer-extras/patterns/shell-surface-elevation-pattern.md +3 -5
- package/dist/components/data-table/filter-date-calendar.d.ts +10 -0
- package/dist/components/data-table/filter-date-calendar.js +280 -0
- package/dist/components/data-table/filter-date-calendar.js.map +1 -0
- package/dist/components/data-table/filter-text-value-input.d.ts +15 -0
- package/dist/components/data-table/filter-text-value-input.js +561 -0
- package/dist/components/data-table/filter-text-value-input.js.map +1 -0
- package/dist/components/data-table/index.d.ts +45 -0
- package/dist/components/data-table/index.js +3085 -0
- package/dist/components/data-table/index.js.map +1 -0
- package/dist/components/data-table/pagination.d.ts +28 -0
- package/dist/components/data-table/pagination.js +3264 -0
- package/dist/components/data-table/pagination.js.map +1 -0
- package/dist/components/data-table/types.d.ts +84 -0
- package/dist/components/data-table/types.js +3 -0
- package/dist/components/data-table/types.js.map +1 -0
- package/dist/components/data-table/use-table-state.d.ts +116 -0
- package/dist/components/data-table/use-table-state.js +670 -0
- package/dist/components/data-table/use-table-state.js.map +1 -0
- package/dist/components/data-views/board-card-primitives.d.ts +22 -0
- package/dist/components/data-views/board-card-primitives.js +84 -0
- package/dist/components/data-views/board-card-primitives.js.map +1 -0
- package/dist/components/data-views/data-row-list.d.ts +33 -0
- package/dist/components/data-views/data-row-list.js +106 -0
- package/dist/components/data-views/data-row-list.js.map +1 -0
- package/dist/components/data-views/finder-panel-view.d.ts +54 -0
- package/dist/components/data-views/finder-panel-view.js +388 -0
- package/dist/components/data-views/finder-panel-view.js.map +1 -0
- package/dist/components/data-views/folder-grid-view.d.ts +22 -0
- package/dist/components/data-views/folder-grid-view.js +58 -0
- package/dist/components/data-views/folder-grid-view.js.map +1 -0
- package/dist/components/data-views/hub-table.d.ts +173 -0
- package/dist/components/data-views/hub-table.js +5783 -0
- package/dist/components/data-views/hub-table.js.map +1 -0
- package/dist/components/data-views/index.d.ts +27 -0
- package/dist/components/data-views/index.js +6797 -0
- package/dist/components/data-views/index.js.map +1 -0
- package/dist/components/data-views/list-page-board-card.d.ts +72 -0
- package/dist/components/data-views/list-page-board-card.js +264 -0
- package/dist/components/data-views/list-page-board-card.js.map +1 -0
- package/dist/components/data-views/list-page-board-template.d.ts +24 -0
- package/dist/components/data-views/list-page-board-template.js +137 -0
- package/dist/components/data-views/list-page-board-template.js.map +1 -0
- package/dist/components/data-views/list-page-connected-view-body.d.ts +19 -0
- package/dist/components/data-views/list-page-connected-view-body.js +116 -0
- package/dist/components/data-views/list-page-connected-view-body.js.map +1 -0
- package/dist/components/data-views/list-page-split-details-placeholder.d.ts +14 -0
- package/dist/components/data-views/list-page-split-details-placeholder.js +38 -0
- package/dist/components/data-views/list-page-split-details-placeholder.js.map +1 -0
- package/dist/components/data-views/list-page-split-hub-chrome.d.ts +17 -0
- package/dist/components/data-views/list-page-split-hub-chrome.js +54 -0
- package/dist/components/data-views/list-page-split-hub-chrome.js.map +1 -0
- package/dist/components/data-views/list-page-split-hub-tokens.d.ts +12 -0
- package/dist/components/data-views/list-page-split-hub-tokens.js +8 -0
- package/dist/components/data-views/list-page-split-hub-tokens.js.map +1 -0
- package/dist/components/data-views/list-page-tree-column-header.d.ts +15 -0
- package/dist/components/data-views/list-page-tree-column-header.js +22 -0
- package/dist/components/data-views/list-page-tree-column-header.js.map +1 -0
- package/dist/components/data-views/list-page-tree-panel-shell.d.ts +25 -0
- package/dist/components/data-views/list-page-tree-panel-shell.js +146 -0
- package/dist/components/data-views/list-page-tree-panel-shell.js.map +1 -0
- package/dist/components/data-views/os-folder-glyph.d.ts +35 -0
- package/dist/components/data-views/os-folder-glyph.js +104 -0
- package/dist/components/data-views/os-folder-glyph.js.map +1 -0
- package/dist/components/data-views/outline-tree-menu.d.ts +36 -0
- package/dist/components/data-views/outline-tree-menu.js +131 -0
- package/dist/components/data-views/outline-tree-menu.js.map +1 -0
- package/dist/components/table-properties/column-row.d.ts +22 -0
- package/dist/components/table-properties/column-row.js +153 -0
- package/dist/components/table-properties/column-row.js.map +1 -0
- package/dist/components/table-properties/draggable-list.d.ts +24 -0
- package/dist/components/table-properties/draggable-list.js +53 -0
- package/dist/components/table-properties/draggable-list.js.map +1 -0
- package/dist/components/table-properties/drawer-button.d.ts +110 -0
- package/dist/components/table-properties/drawer-button.js +2748 -0
- package/dist/components/table-properties/drawer-button.js.map +1 -0
- package/dist/components/table-properties/drawer.d.ts +100 -0
- package/dist/components/table-properties/drawer.js +2595 -0
- package/dist/components/table-properties/drawer.js.map +1 -0
- package/dist/components/table-properties/filter-card.d.ts +24 -0
- package/dist/components/table-properties/filter-card.js +854 -0
- package/dist/components/table-properties/filter-card.js.map +1 -0
- package/dist/components/table-properties/index.d.ts +14 -0
- package/dist/components/table-properties/index.js +2768 -0
- package/dist/components/table-properties/index.js.map +1 -0
- package/dist/components/table-properties/sort-card.d.ts +20 -0
- package/dist/components/table-properties/sort-card.js +102 -0
- package/dist/components/table-properties/sort-card.js.map +1 -0
- package/dist/components/templates/dedicated-search-landing-template.d.ts +21 -0
- package/dist/components/templates/dedicated-search-landing-template.js +254 -0
- package/dist/components/templates/dedicated-search-landing-template.js.map +1 -0
- package/dist/components/templates/dedicated-search-results-template.d.ts +15 -0
- package/dist/components/templates/dedicated-search-results-template.js +16 -0
- package/dist/components/templates/dedicated-search-results-template.js.map +1 -0
- package/dist/components/templates/index.d.ts +9 -0
- package/dist/components/templates/index.js +2720 -0
- package/dist/components/templates/index.js.map +1 -0
- package/dist/components/templates/list-page.d.ts +83 -0
- package/dist/components/templates/list-page.js +2433 -0
- package/dist/components/templates/list-page.js.map +1 -0
- package/dist/components/templates/nested-secondary-panel-shell.d.ts +20 -0
- package/dist/components/templates/nested-secondary-panel-shell.js +54 -0
- package/dist/components/templates/nested-secondary-panel-shell.js.map +1 -0
- package/dist/components/ui/accordion.d.ts +10 -0
- package/dist/components/ui/accordion.js +74 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/components/ui/alert-dialog.d.ts +37 -0
- package/dist/components/ui/alert-dialog.js +201 -0
- package/dist/components/ui/alert-dialog.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +84 -0
- package/dist/components/ui/avatar.js +328 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.d.ts +13 -0
- package/dist/components/ui/badge.js +49 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/banner.d.ts +62 -0
- package/dist/components/ui/banner.js +364 -0
- package/dist/components/ui/banner.js.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts +14 -0
- package/dist/components/ui/breadcrumb.js +114 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/components/ui/button.d.ts +16 -0
- package/dist/components/ui/button.js +59 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/calendar.d.ts +13 -0
- package/dist/components/ui/calendar.js +238 -0
- package/dist/components/ui/calendar.js.map +1 -0
- package/dist/components/ui/card.d.ts +14 -0
- package/dist/components/ui/card.js +102 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/chart.d.ts +58 -0
- package/dist/components/ui/chart.js +292 -0
- package/dist/components/ui/chart.js.map +1 -0
- package/dist/components/ui/checkbox.d.ts +23 -0
- package/dist/components/ui/checkbox.js +155 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/coach-mark.d.ts +27 -0
- package/dist/components/ui/coach-mark.js +306 -0
- package/dist/components/ui/coach-mark.js.map +1 -0
- package/dist/components/ui/collapsible.d.ts +8 -0
- package/dist/components/ui/collapsible.js +35 -0
- package/dist/components/ui/collapsible.js.map +1 -0
- package/dist/components/ui/command.d.ts +36 -0
- package/dist/components/ui/command.js +274 -0
- package/dist/components/ui/command.js.map +1 -0
- package/dist/components/ui/context-menu.d.ts +32 -0
- package/dist/components/ui/context-menu.js +245 -0
- package/dist/components/ui/context-menu.js.map +1 -0
- package/dist/components/ui/date-picker-field.d.ts +38 -0
- package/dist/components/ui/date-picker-field.js +550 -0
- package/dist/components/ui/date-picker-field.js.map +1 -0
- package/dist/components/ui/dialog.d.ts +22 -0
- package/dist/components/ui/dialog.js +200 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/dot-pattern.d.ts +21 -0
- package/dist/components/ui/dot-pattern.js +139 -0
- package/dist/components/ui/dot-pattern.js.map +1 -0
- package/dist/components/ui/drag-handle-grip.d.ts +10 -0
- package/dist/components/ui/drag-handle-grip.js +15 -0
- package/dist/components/ui/drag-handle-grip.js.map +1 -0
- package/dist/components/ui/drawer.d.ts +16 -0
- package/dist/components/ui/drawer.js +125 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +45 -0
- package/dist/components/ui/dropdown-menu.js +353 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/export-drawer.d.ts +11 -0
- package/dist/components/ui/export-drawer.js +1658 -0
- package/dist/components/ui/export-drawer.js.map +1 -0
- package/dist/components/ui/field.d.ts +30 -0
- package/dist/components/ui/field.js +249 -0
- package/dist/components/ui/field.js.map +1 -0
- package/dist/components/ui/form.d.ts +28 -0
- package/dist/components/ui/form.js +110 -0
- package/dist/components/ui/form.js.map +1 -0
- package/dist/components/ui/hover-card.d.ts +9 -0
- package/dist/components/ui/hover-card.js +43 -0
- package/dist/components/ui/hover-card.js.map +1 -0
- package/dist/components/ui/input-group.d.ts +20 -0
- package/dist/components/ui/input-group.js +219 -0
- package/dist/components/ui/input-group.js.map +1 -0
- package/dist/components/ui/input-mask.d.ts +39 -0
- package/dist/components/ui/input-mask.js +118 -0
- package/dist/components/ui/input-mask.js.map +1 -0
- package/dist/components/ui/input.d.ts +5 -0
- package/dist/components/ui/input.js +30 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/kbd.d.ts +20 -0
- package/dist/components/ui/kbd.js +45 -0
- package/dist/components/ui/kbd.js.map +1 -0
- package/dist/components/ui/key-metrics-context.d.ts +19 -0
- package/dist/components/ui/key-metrics-context.js +26 -0
- package/dist/components/ui/key-metrics-context.js.map +1 -0
- package/dist/components/ui/key-metrics.d.ts +131 -0
- package/dist/components/ui/key-metrics.js +1015 -0
- package/dist/components/ui/key-metrics.js.map +1 -0
- package/dist/components/ui/label.d.ts +6 -0
- package/dist/components/ui/label.js +28 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/list-page-view-frame.d.ts +22 -0
- package/dist/components/ui/list-page-view-frame.js +24 -0
- package/dist/components/ui/list-page-view-frame.js.map +1 -0
- package/dist/components/ui/page-header.d.ts +51 -0
- package/dist/components/ui/page-header.js +372 -0
- package/dist/components/ui/page-header.js.map +1 -0
- package/dist/components/ui/payment-card-fields.d.ts +10 -0
- package/dist/components/ui/payment-card-fields.js +80 -0
- package/dist/components/ui/payment-card-fields.js.map +1 -0
- package/dist/components/ui/popover.d.ts +10 -0
- package/dist/components/ui/popover.js +47 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/components/ui/radio-group.d.ts +29 -0
- package/dist/components/ui/radio-group.js +190 -0
- package/dist/components/ui/radio-group.js.map +1 -0
- package/dist/components/ui/resizable.d.ts +16 -0
- package/dist/components/ui/resizable.js +51 -0
- package/dist/components/ui/resizable.js.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +8 -0
- package/dist/components/ui/scroll-area.js +66 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/select.d.ts +18 -0
- package/dist/components/ui/select.js +186 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/selection-tile-grid.d.ts +52 -0
- package/dist/components/ui/selection-tile-grid.js +347 -0
- package/dist/components/ui/selection-tile-grid.js.map +1 -0
- package/dist/components/ui/separator.d.ts +7 -0
- package/dist/components/ui/separator.js +33 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/sheet.d.ts +18 -0
- package/dist/components/ui/sheet.js +181 -0
- package/dist/components/ui/sheet.js.map +1 -0
- package/dist/components/ui/sidebar.d.ts +94 -0
- package/dist/components/ui/sidebar.js +805 -0
- package/dist/components/ui/sidebar.js.map +1 -0
- package/dist/components/ui/skeleton.d.ts +5 -0
- package/dist/components/ui/skeleton.js +22 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/slider.d.ts +7 -0
- package/dist/components/ui/slider.js +66 -0
- package/dist/components/ui/slider.js.map +1 -0
- package/dist/components/ui/sonner.d.ts +6 -0
- package/dist/components/ui/sonner.js +38 -0
- package/dist/components/ui/sonner.js.map +1 -0
- package/dist/components/ui/status-badge.d.ts +38 -0
- package/dist/components/ui/status-badge.js +77 -0
- package/dist/components/ui/status-badge.js.map +1 -0
- package/dist/components/ui/table.d.ts +13 -0
- package/dist/components/ui/table.js +115 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.d.ts +15 -0
- package/dist/components/ui/tabs.js +93 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +6 -0
- package/dist/components/ui/textarea.js +25 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/tip.d.ts +12 -0
- package/dist/components/ui/tip.js +61 -0
- package/dist/components/ui/tip.js.map +1 -0
- package/dist/components/ui/toggle-group.d.ts +14 -0
- package/dist/components/ui/toggle-group.js +104 -0
- package/dist/components/ui/toggle-group.js.map +1 -0
- package/dist/components/ui/toggle-switch.d.ts +10 -0
- package/dist/components/ui/toggle-switch.js +33 -0
- package/dist/components/ui/toggle-switch.js.map +1 -0
- package/dist/components/ui/toggle.d.ts +13 -0
- package/dist/components/ui/toggle.js +51 -0
- package/dist/components/ui/toggle.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +10 -0
- package/dist/components/ui/tooltip.js +68 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/components/ui/view-segmented-control.d.ts +31 -0
- package/dist/components/ui/view-segmented-control.js +167 -0
- package/dist/components/ui/view-segmented-control.js.map +1 -0
- package/dist/data-list-view-registry-CyBoBML4.d.ts +73 -0
- package/dist/hooks/use-app-theme.d.ts +24 -0
- package/dist/hooks/use-app-theme.js +286 -0
- package/dist/hooks/use-app-theme.js.map +1 -0
- package/dist/hooks/use-coach-mark.d.ts +86 -0
- package/dist/hooks/use-coach-mark.js +218 -0
- package/dist/hooks/use-coach-mark.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +3 -0
- package/dist/hooks/use-mobile.js +29 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/use-mod-key-label.d.ts +6 -0
- package/dist/hooks/use-mod-key-label.js +25 -0
- package/dist/hooks/use-mod-key-label.js.map +1 -0
- package/dist/index.d.ts +120 -0
- package/dist/index.js +13421 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/compose-refs.d.ts +6 -0
- package/dist/lib/compose-refs.js +17 -0
- package/dist/lib/compose-refs.js.map +1 -0
- package/dist/lib/conditional-rule-match.d.ts +30 -0
- package/dist/lib/conditional-rule-match.js +66 -0
- package/dist/lib/conditional-rule-match.js.map +1 -0
- package/dist/lib/data-list-display-options.d.ts +26 -0
- package/dist/lib/data-list-display-options.js +14 -0
- package/dist/lib/data-list-display-options.js.map +1 -0
- package/dist/lib/data-list-view-registry.d.ts +2 -0
- package/dist/lib/data-list-view-registry.js +102 -0
- package/dist/lib/data-list-view-registry.js.map +1 -0
- package/dist/lib/data-list-view-surface.d.ts +2 -0
- package/dist/lib/data-list-view-surface.js +80 -0
- package/dist/lib/data-list-view-surface.js.map +1 -0
- package/dist/lib/data-list-view.d.ts +21 -0
- package/dist/lib/data-list-view.js +25 -0
- package/dist/lib/data-list-view.js.map +1 -0
- package/dist/lib/date-filter.d.ts +22 -0
- package/dist/lib/date-filter.js +61 -0
- package/dist/lib/date-filter.js.map +1 -0
- package/dist/lib/dev-log.d.ts +8 -0
- package/dist/lib/dev-log.js +10 -0
- package/dist/lib/dev-log.js.map +1 -0
- package/dist/lib/dropdown-menu-surface.d.ts +14 -0
- package/dist/lib/dropdown-menu-surface.js +6 -0
- package/dist/lib/dropdown-menu-surface.js.map +1 -0
- package/dist/lib/editable-target.d.ts +12 -0
- package/dist/lib/editable-target.js +12 -0
- package/dist/lib/editable-target.js.map +1 -0
- package/dist/lib/list-page-table-properties.d.ts +35 -0
- package/dist/lib/list-page-table-properties.js +81 -0
- package/dist/lib/list-page-table-properties.js.map +1 -0
- package/dist/lib/raf-throttle.d.ts +23 -0
- package/dist/lib/raf-throttle.js +27 -0
- package/dist/lib/raf-throttle.js.map +1 -0
- package/dist/lib/row-height.d.ts +16 -0
- package/dist/lib/row-height.js +10 -0
- package/dist/lib/row-height.js.map +1 -0
- package/dist/lib/table-properties-types.d.ts +83 -0
- package/dist/lib/table-properties-types.js +19 -0
- package/dist/lib/table-properties-types.js.map +1 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +11 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +83 -19
- package/src/components/data-table/filter-date-calendar.tsx +38 -0
- package/src/components/data-table/filter-text-value-input.tsx +77 -0
- package/src/components/data-table/index.tsx +1678 -0
- package/src/components/data-table/pagination.tsx +259 -0
- package/src/components/data-table/types.ts +96 -0
- package/src/components/data-table/use-table-state.ts +767 -0
- package/src/components/data-views/board-card-primitives.tsx +93 -0
- package/src/components/data-views/data-row-list.tsx +183 -0
- package/src/components/data-views/finder-panel-view.tsx +405 -0
- package/src/components/data-views/folder-grid-view.tsx +86 -0
- package/src/components/data-views/hub-table.tsx +606 -0
- package/src/components/data-views/index.ts +28 -0
- package/src/components/data-views/list-page-board-card.tsx +192 -0
- package/src/components/data-views/list-page-board-template.tsx +122 -0
- package/src/components/data-views/list-page-connected-view-body.tsx +66 -0
- package/src/components/data-views/list-page-split-details-placeholder.tsx +39 -0
- package/src/components/data-views/list-page-split-hub-chrome.tsx +60 -0
- package/src/components/data-views/list-page-split-hub-tokens.ts +16 -0
- package/src/components/data-views/list-page-tree-column-header.tsx +31 -0
- package/src/components/data-views/list-page-tree-panel-shell.tsx +91 -0
- package/src/components/data-views/os-folder-glyph.tsx +141 -0
- package/src/components/data-views/outline-tree-menu.tsx +157 -0
- package/src/components/table-properties/column-row.tsx +90 -0
- package/src/components/table-properties/draggable-list.ts +54 -0
- package/src/components/table-properties/drawer-button.tsx +300 -0
- package/src/components/table-properties/drawer.tsx +1148 -0
- package/src/components/table-properties/filter-card.tsx +251 -0
- package/src/components/table-properties/index.ts +36 -0
- package/src/components/table-properties/sort-card.tsx +63 -0
- package/src/components/templates/dedicated-search-landing-template.tsx +124 -0
- package/src/components/templates/dedicated-search-results-template.tsx +19 -0
- package/src/components/templates/index.ts +33 -0
- package/src/components/templates/list-page.tsx +602 -0
- package/src/components/templates/nested-secondary-panel-shell.tsx +70 -0
- package/src/components/ui/accordion.tsx +92 -0
- package/src/components/ui/alert-dialog.tsx +221 -0
- package/src/components/ui/avatar.tsx +13 -2
- package/src/components/ui/banner.tsx +2 -2
- package/src/components/ui/button.tsx +4 -4
- package/src/components/ui/calendar.tsx +1 -1
- package/src/components/ui/coach-mark.tsx +1 -1
- package/src/components/ui/context-menu.tsx +291 -0
- package/src/components/ui/date-picker-field.tsx +2 -2
- package/src/components/ui/dot-pattern.tsx +183 -0
- package/src/components/ui/export-drawer.tsx +375 -0
- package/src/components/ui/hover-card.tsx +66 -0
- package/src/components/ui/key-metrics-context.tsx +78 -0
- package/src/components/ui/key-metrics.tsx +1133 -0
- package/src/components/ui/list-page-view-frame.tsx +64 -0
- package/src/components/ui/page-header.tsx +244 -0
- package/src/components/ui/payment-card-fields.tsx +2 -2
- package/src/components/ui/resizable.tsx +68 -0
- package/src/components/ui/scroll-area.tsx +72 -0
- package/src/components/ui/selection-tile-grid.tsx +9 -2
- package/src/components/ui/sidebar.tsx +84 -12
- package/src/components/ui/slider.tsx +83 -0
- package/src/globals.css +2201 -7
- package/src/globals.d.ts +20 -0
- package/src/index.ts +68 -1
- package/src/lib/conditional-rule-match.ts +119 -0
- package/src/lib/data-list-display-options.ts +35 -0
- package/src/lib/data-list-view-registry.ts +104 -0
- package/src/lib/data-list-view-surface.ts +83 -0
- package/src/lib/data-list-view.ts +47 -0
- package/src/lib/dev-log.ts +10 -0
- package/src/lib/editable-target.ts +20 -0
- package/src/lib/list-page-table-properties.ts +48 -0
- package/src/lib/raf-throttle.ts +45 -0
- package/src/lib/row-height.ts +19 -0
- package/src/lib/table-properties-types.ts +98 -0
- package/template/.claude/skills/exxat-ds-skill/SKILL.md +8 -7
- package/template/.cursor/rules/exxat-accessibility.mdc +1 -1
- package/template/.cursor/rules/exxat-command-menu.mdc +2 -2
- package/template/.cursor/rules/exxat-dashboard-view-charts.mdc +7 -7
- package/template/.cursor/rules/exxat-data-tables.mdc +3 -3
- package/template/.cursor/rules/exxat-ds-agents.mdc +2 -2
- package/template/.cursor/rules/exxat-kbd-shortcuts.mdc +7 -7
- package/template/.cursor/rules/exxat-mono-ids.mdc +1 -1
- package/template/.cursor/rules/exxat-page-vs-drawer.mdc +1 -1
- package/template/.cursor/rules/exxat-table-properties-drawer.mdc +1 -1
- package/template/AGENTS.md +135 -103
- package/template/app/(app)/columns/page.tsx +11 -0
- package/template/app/(app)/dashboard/loading.tsx +15 -3
- package/template/app/(app)/dashboard/page.tsx +14 -2
- package/template/app/(app)/layout.tsx +17 -4
- package/template/app/(app)/library/all/page.tsx +11 -0
- package/template/app/(app)/library/find/page.tsx +12 -0
- package/template/app/(app)/{question-bank → library}/layout.tsx +17 -17
- package/template/app/(app)/library/list/page.tsx +12 -0
- package/template/app/(app)/library/new/page.tsx +45 -0
- package/template/app/(app)/library/page.tsx +11 -0
- package/template/app/(app)/loading.tsx +18 -1
- package/template/app/(app)/settings/page.tsx +5 -4
- package/template/app/(app)/tokens-themes/page.tsx +11 -0
- package/template/app/globals.css +14 -16
- package/template/components/ask-leo-composer.tsx +2 -2
- package/template/components/ask-leo-sidebar.tsx +5 -1
- package/template/components/brand-color-picker.tsx +2 -2
- package/template/components/charts-overview.tsx +1 -1
- package/template/components/columns-client.tsx +158 -0
- package/template/components/columns-showcase.tsx +541 -0
- package/template/components/dashboard-report-charts.tsx +1 -1
- package/template/components/dashboard-tabs.tsx +1 -1
- package/template/components/data-table/filter-date-calendar.tsx +1 -38
- package/template/components/data-table/filter-text-value-input.tsx +1 -77
- package/template/components/data-table/index.tsx +1 -1634
- package/template/components/data-table/pagination.tsx +1 -255
- package/template/components/data-table/types.ts +1 -94
- package/template/components/data-table/use-table-state.test.ts +420 -0
- package/template/components/data-table/use-table-state.ts +1 -758
- package/template/components/data-views/board-card-primitives.tsx +1 -93
- package/template/components/data-views/data-row-list.tsx +1 -183
- package/template/components/data-views/finder-panel-view.tsx +1 -405
- package/template/components/data-views/folder-grid-view.tsx +1 -86
- package/template/components/data-views/hub-table.tsx +1 -0
- package/template/components/data-views/index.ts +77 -38
- package/template/components/data-views/{question-bank-folder-tree-branch.tsx → library-folder-tree-branch.tsx} +19 -19
- package/template/components/data-views/list-page-board-card.tsx +1 -192
- package/template/components/data-views/list-page-board-template.tsx +1 -122
- package/template/components/data-views/list-page-connected-view-body.tsx +1 -66
- package/template/components/data-views/list-page-split-details-placeholder.tsx +1 -39
- package/template/components/data-views/list-page-split-hub-chrome.tsx +1 -68
- package/template/components/data-views/list-page-split-hub-tokens.ts +1 -16
- package/template/components/data-views/list-page-tree-column-header.tsx +1 -31
- package/template/components/data-views/list-page-tree-panel-shell.tsx +1 -91
- package/template/components/data-views/list-page-view-frame.tsx +5 -53
- package/template/components/data-views/os-folder-glyph.tsx +1 -129
- package/template/components/data-views/outline-tree-menu.tsx +1 -157
- package/template/components/data-views/table-cells.tsx +673 -0
- package/template/components/export-drawer.test.tsx +71 -0
- package/template/components/export-drawer.tsx +1 -375
- package/template/components/exxat-product-logo.tsx +5 -5
- package/template/components/folder-details-shell.tsx +11 -11
- package/template/components/hub-tree-panel-view.tsx +26 -26
- package/template/components/invite-collaborators-drawer.tsx +3 -3
- package/template/components/key-metrics-ask-leo-bridge.tsx +40 -0
- package/template/components/key-metrics.tsx +1 -1063
- package/template/components/leo-insight-indicator.tsx +2 -2
- package/template/components/{question-bank-board-view.tsx → library-board-view.tsx} +44 -44
- package/template/components/{question-bank-client.tsx → library-client.tsx} +83 -83
- package/template/components/{question-bank-dashboard-charts.tsx → library-dashboard-charts.tsx} +14 -14
- package/template/components/{question-bank-favorite-button.tsx → library-favorite-button.tsx} +7 -7
- package/template/components/{question-bank-hub-client.tsx → library-hub-client.tsx} +44 -44
- package/template/components/{question-bank-new-folder-sheet.tsx → library-new-folder-sheet.tsx} +16 -16
- package/template/components/{question-bank-os-folder-view.tsx → library-os-folder-view.tsx} +31 -31
- package/template/components/{question-bank-page-header.tsx → library-page-header.tsx} +6 -6
- package/template/components/library-panel-activator.tsx +8 -0
- package/template/components/{question-bank-secondary-nav.tsx → library-secondary-nav.tsx} +63 -63
- package/template/components/library-table.tsx +839 -0
- package/template/components/list-hub-status-badge.tsx +2 -2
- package/template/components/{new-question-composer.tsx → new-library-item-form.tsx} +489 -441
- package/template/components/onboarding/index.ts +9 -0
- package/template/components/onboarding/onboarding-01.tsx +1 -1
- package/template/components/onboarding/onboarding-02.tsx +1 -1
- package/template/components/onboarding/onboarding-03.tsx +1 -1
- package/template/components/onboarding/onboarding-04.tsx +1 -1
- package/template/components/page-header.tsx +8 -226
- package/template/components/product-switcher.tsx +3 -4
- package/template/components/product-wordmark.tsx +2 -1
- package/template/components/settings-appearance-card.tsx +3 -4
- package/template/components/settings-client.tsx +15 -59
- package/template/components/settings-form-row.tsx +4 -9
- package/template/components/{app-sidebar-dynamic.tsx → sidebar/app-sidebar-dynamic.tsx} +1 -1
- package/template/components/{app-sidebar.tsx → sidebar/app-sidebar.tsx} +114 -73
- package/template/components/sidebar/index.ts +16 -0
- package/template/components/{secondary-nav.tsx → sidebar/secondary-nav.tsx} +2 -2
- package/template/components/sidebar/secondary-panel.tsx +316 -0
- package/template/components/sidebar/sidebar-auto-collapse.tsx +27 -0
- package/template/components/{sidebar-auto-open.tsx → sidebar/sidebar-auto-open.tsx} +2 -1
- package/template/components/{sidebar-shell.tsx → sidebar/sidebar-shell.tsx} +1 -1
- package/template/components/site-header.tsx +1 -1
- package/template/components/table-properties/column-row.tsx +1 -90
- package/template/components/table-properties/draggable-list.ts +1 -49
- package/template/components/table-properties/drawer-button.tsx +1 -262
- package/template/components/table-properties/drawer.tsx +1 -1166
- package/template/components/table-properties/filter-card.tsx +1 -251
- package/template/components/table-properties/sort-card.tsx +1 -59
- package/template/components/table-properties/types.ts +28 -71
- package/template/components/templates/dedicated-search-landing-template.tsx +1 -124
- package/template/components/templates/dedicated-search-results-template.tsx +1 -19
- package/template/components/templates/discovery-hub-template.tsx +1 -1
- package/template/components/templates/list-page.tsx +1 -608
- package/template/components/templates/nested-secondary-panel-shell.tsx +1 -63
- package/template/components/templates/new-focus-template.tsx +659 -0
- package/template/components/templates/secondary-panel-hub-template.tsx +2 -2
- package/template/components/tokens-secondary-nav.tsx +192 -0
- package/template/components/tokens-themes-client.tsx +476 -0
- package/template/components/tokens-themes-section.tsx +386 -0
- package/template/components/ui/accordion.tsx +1 -0
- package/template/components/ui/alert-dialog.tsx +1 -0
- package/template/components/ui/context-menu.tsx +1 -0
- package/template/components/ui/dot-pattern.tsx +1 -183
- package/template/components/ui/hover-card.tsx +1 -0
- package/template/components/ui/resizable.tsx +1 -68
- package/template/components/ui/scroll-area.tsx +1 -0
- package/template/components/ui/slider.tsx +1 -0
- package/template/docs/HANDBOOK.md +187 -0
- package/template/docs/blueprints/README.md +86 -0
- package/template/docs/blueprints/_template.md +91 -0
- package/template/docs/blueprints/board-card.md +123 -0
- package/template/docs/blueprints/data-table.md +139 -0
- package/template/docs/blueprints/key-metrics.md +128 -0
- package/template/docs/blueprints/list-page-template.md +123 -0
- package/template/docs/blueprints/page-header.md +130 -0
- package/template/docs/collaboration-access-pattern.md +7 -7
- package/template/docs/command-menu-pattern.md +1 -1
- package/template/docs/component-selection-guide.md +224 -0
- package/template/docs/components-audit-2026-05.md +158 -0
- package/template/docs/data-views-pattern.md +31 -66
- package/template/docs/drawer-vs-dialog-pattern.md +1 -3
- package/template/docs/glossary.md +58 -0
- package/template/docs/kpi-flat-band-pattern.md +3 -3
- package/template/docs/kpi-trend-pattern.md +18 -3
- package/template/docs/large-dataset-strategy.md +155 -0
- package/template/docs/library-hub-header-pattern.md +25 -0
- package/template/docs/migrations/0001-brand-deep-alias-stabilization.md +95 -0
- package/template/docs/migrations/0002-exxat-token-namespace.md +154 -0
- package/template/docs/migrations/0003-globals-css-canonical.md +110 -0
- package/template/docs/migrations/README.md +100 -0
- package/template/docs/migrations/_template.md +64 -0
- package/template/docs/reference-implementations.md +151 -0
- package/template/docs/shell-surface-elevation-pattern.md +3 -5
- package/template/docs/token-taxonomy.md +416 -0
- package/template/docs/voice-and-tone.md +262 -0
- package/template/eslint.config.mjs +27 -0
- package/template/hooks/use-secondary-panel-hub-nav.ts +11 -11
- package/template/lib/ask-leo-route-context.ts +6 -18
- package/template/lib/coach-mark-registry.ts +0 -16
- package/template/lib/command-menu-config.ts +5 -13
- package/template/lib/command-menu-search-data.ts +8 -23
- package/template/lib/conditional-rule-match.ts +6 -97
- package/template/lib/data-list-display-options.ts +1 -49
- package/template/lib/data-list-view-registry.ts +1 -104
- package/template/lib/data-list-view-surface.ts +1 -83
- package/template/lib/data-list-view.ts +1 -47
- package/template/lib/data-view-dashboard-storage.ts +35 -38
- package/template/lib/dev-log.ts +1 -8
- package/template/lib/editable-target.ts +1 -10
- package/template/lib/{question-bank-authoring.ts → library-authoring.ts} +89 -88
- package/template/lib/library-dedicated-search.ts +19 -0
- package/template/lib/library-hub-search.ts +90 -0
- package/template/lib/library-nav.ts +477 -0
- package/template/lib/library-recent-searches.ts +22 -0
- package/template/lib/{question-bank-supported-views.ts → library-supported-views.ts} +2 -3
- package/template/lib/list-page-table-properties.ts +1 -48
- package/template/lib/list-status-badges.ts +16 -11
- package/template/lib/mock/dashboard.ts +1 -1
- package/template/lib/mock/{question-bank-folders.ts → library-folders.ts} +30 -30
- package/template/lib/mock/library-header-collaborators.ts +54 -0
- package/template/lib/mock/{question-bank-inspector.ts → library-inspector.ts} +29 -29
- package/template/lib/mock/{question-bank-kpi.ts → library-kpi.ts} +20 -20
- package/template/lib/mock/library.ts +249 -0
- package/template/lib/mock/navigation.tsx +32 -35
- package/template/lib/raf-throttle.ts +1 -45
- package/template/lib/row-height.ts +4 -10
- package/template/lib/sidebar-state-cookie.ts +11 -2
- package/template/lib/table-state-lifecycle.ts +3 -3
- package/template/next.config.mjs +7 -4
- package/template/package.json +1 -0
- package/template/tests/setup.ts +25 -0
- package/consumer-extras/AGENTS.md +0 -76
- package/consumer-extras/cursor-skills/exxat-consumer-app/SKILL.md +0 -37
- package/consumer-extras/cursor-skills/exxat-focused-workflow-page/SKILL.md +0 -57
- package/consumer-extras/patterns/consumer-app-pattern.md +0 -39
- package/consumer-extras/patterns/focused-workflow-page-pattern.md +0 -84
- package/src/components/ui/button-group.tsx +0 -81
- package/src/theme.css +0 -16
- package/src/tokens/README.md +0 -15
- package/src/tokens/base.css +0 -337
- package/src/tokens/high-contrast.css +0 -1195
- package/src/tokens/layers.css +0 -224
- package/src/tokens/tailwind-bridge.css +0 -118
- package/src/tokens/themes.css +0 -201
- package/template/app/(app)/data-list/layout.tsx +0 -43
- package/template/app/(app)/data-list/page.tsx +0 -10
- package/template/app/(app)/examples/focused-workflow/page.tsx +0 -5
- package/template/app/(app)/examples/page.tsx +0 -43
- package/template/app/(app)/question-bank/find/page.tsx +0 -13
- package/template/app/(app)/question-bank/library/page.tsx +0 -12
- package/template/app/(app)/question-bank/list/page.tsx +0 -13
- package/template/app/(app)/question-bank/new/page.tsx +0 -50
- package/template/app/(app)/question-bank/page.tsx +0 -12
- package/template/components/app-route-loading.tsx +0 -14
- package/template/components/dashboard-onboarding-gallery.tsx +0 -13
- package/template/components/dashboard-onboarding.tsx +0 -21
- package/template/components/data-views/list-page-calendar-view.tsx +0 -593
- package/template/components/data-views/list-page-folder-columns-panel.tsx +0 -345
- package/template/components/examples/focused-workflow-showcase.tsx +0 -183
- package/template/components/list-hub-board-view.tsx +0 -68
- package/template/components/list-hub-client.tsx +0 -186
- package/template/components/list-hub-list-view.tsx +0 -36
- package/template/components/list-hub-panel-activator.tsx +0 -8
- package/template/components/list-hub-secondary-nav.tsx +0 -121
- package/template/components/list-hub-table.tsx +0 -336
- package/template/components/question-bank-folder-columns-panel.tsx +0 -104
- package/template/components/question-bank-list-view.tsx +0 -53
- package/template/components/question-bank-panel-activator.tsx +0 -8
- package/template/components/question-bank-table.tsx +0 -729
- package/template/components/secondary-panel/nav-link-rows.tsx +0 -83
- package/template/components/secondary-panel.tsx +0 -220
- package/template/components/secondary-panels/list-hub-panel.tsx +0 -39
- package/template/components/secondary-panels/question-bank-panel.tsx +0 -39
- package/template/components/secondary-panels/registry.tsx +0 -15
- package/template/components/section-cards.tsx +0 -106
- package/template/components/sidebar-auto-collapse.tsx +0 -23
- package/template/components/templates/focused-workflow-layouts.tsx +0 -448
- package/template/components/templates/focused-workflow-page-template.tsx +0 -69
- package/template/components/templates/page-loading-shell.tsx +0 -262
- package/template/components/ui/button-group.tsx +0 -1
- package/template/docs/consumer-app-pattern.md +0 -39
- package/template/docs/focused-workflow-page-pattern.md +0 -84
- package/template/docs/question-bank-hub-header-pattern.md +0 -25
- package/template/lib/list-hub-nav.ts +0 -121
- package/template/lib/mock/list-hub-directory.ts +0 -27
- package/template/lib/mock/list-hub-kpi.ts +0 -27
- package/template/lib/mock/question-bank-header-collaborators.ts +0 -54
- package/template/lib/mock/question-bank.ts +0 -249
- package/template/lib/page-loading-variant.ts +0 -40
- package/template/lib/question-bank-dedicated-search.ts +0 -19
- package/template/lib/question-bank-hub-search.ts +0 -90
- package/template/lib/question-bank-nav.ts +0 -477
- package/template/lib/question-bank-recent-searches.ts +0 -22
- /package/template/components/{getting-started.tsx → onboarding/getting-started.tsx} +0 -0
- /package/template/components/{nav-documents.tsx → sidebar/nav-documents.tsx} +0 -0
- /package/template/components/{nav-main.tsx → sidebar/nav-main.tsx} +0 -0
- /package/template/components/{nav-secondary.tsx → sidebar/nav-secondary.tsx} +0 -0
- /package/template/components/{nav-user.tsx → sidebar/nav-user.tsx} +0 -0
|
@@ -8,10 +8,10 @@ import type * as React from "react"
|
|
|
8
8
|
import { logoDevUrl } from "@/lib/logo-dev"
|
|
9
9
|
import { stockPortraitUrl } from "@/lib/stock-portrait"
|
|
10
10
|
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
} from "@/lib/
|
|
11
|
+
LIBRARY_ENTRY_PATH,
|
|
12
|
+
LIBRARY_HUB_FIND_PATH,
|
|
13
|
+
LIBRARY_ALL_PATH,
|
|
14
|
+
} from "@/lib/library-nav"
|
|
15
15
|
|
|
16
16
|
// ── Types ─────────────────────────────────────────────────────────────────────
|
|
17
17
|
|
|
@@ -93,53 +93,37 @@ export const NAV_PRIMARY: NavLinkItem[] = [
|
|
|
93
93
|
iconActive: <i className="fa-solid fa-grid-2" aria-hidden="true" />,
|
|
94
94
|
},
|
|
95
95
|
{
|
|
96
|
-
key: "
|
|
97
|
-
title: "
|
|
98
|
-
url:
|
|
99
|
-
icon: <i className="fa-light fa-layer-group" aria-hidden="true" />,
|
|
100
|
-
iconActive: <i className="fa-solid fa-layer-group" aria-hidden="true" />,
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
key: "question-bank",
|
|
104
|
-
title: "Question bank",
|
|
105
|
-
url: QUESTION_BANK_ENTRY_PATH,
|
|
96
|
+
key: "library",
|
|
97
|
+
title: "Library",
|
|
98
|
+
url: LIBRARY_ENTRY_PATH,
|
|
106
99
|
icon: <i className="fa-light fa-books" aria-hidden="true" />,
|
|
107
100
|
iconActive: <i className="fa-solid fa-books" aria-hidden="true" />,
|
|
108
|
-
secondaryPanel: "
|
|
109
|
-
primaryHubChildKey: "
|
|
101
|
+
secondaryPanel: "library",
|
|
102
|
+
primaryHubChildKey: "library-hub",
|
|
110
103
|
children: [
|
|
111
104
|
{
|
|
112
|
-
key: "
|
|
113
|
-
title: "
|
|
114
|
-
url:
|
|
105
|
+
key: "library-hub",
|
|
106
|
+
title: "Library home",
|
|
107
|
+
url: LIBRARY_ENTRY_PATH,
|
|
115
108
|
icon: <i className="fa-light fa-sparkles" aria-hidden="true" />,
|
|
116
109
|
iconActive: <i className="fa-solid fa-sparkles" aria-hidden="true" />,
|
|
117
110
|
},
|
|
118
111
|
{
|
|
119
|
-
key: "
|
|
112
|
+
key: "library-search",
|
|
120
113
|
title: "Search",
|
|
121
|
-
url:
|
|
114
|
+
url: LIBRARY_HUB_FIND_PATH,
|
|
122
115
|
icon: <i className="fa-light fa-magnifying-glass" aria-hidden="true" />,
|
|
123
116
|
iconActive: <i className="fa-solid fa-magnifying-glass" aria-hidden="true" />,
|
|
124
117
|
},
|
|
125
118
|
{
|
|
126
|
-
key: "
|
|
127
|
-
title: "
|
|
128
|
-
url:
|
|
119
|
+
key: "library-all",
|
|
120
|
+
title: "All items",
|
|
121
|
+
url: LIBRARY_ALL_PATH,
|
|
129
122
|
icon: <i className="fa-light fa-table-list" aria-hidden="true" />,
|
|
130
123
|
iconActive: <i className="fa-solid fa-table-list" aria-hidden="true" />,
|
|
131
124
|
},
|
|
132
125
|
],
|
|
133
126
|
},
|
|
134
|
-
{
|
|
135
|
-
key: "data-list",
|
|
136
|
-
title: "List hub",
|
|
137
|
-
url: "/data-list",
|
|
138
|
-
icon: <i className="fa-light fa-table" aria-hidden="true" />,
|
|
139
|
-
iconActive: <i className="fa-solid fa-table" aria-hidden="true" />,
|
|
140
|
-
badge: 24,
|
|
141
|
-
secondaryPanel: "list-hub",
|
|
142
|
-
},
|
|
143
127
|
]
|
|
144
128
|
|
|
145
129
|
// ── Documents section ───────────────────────────────────────────────────────
|
|
@@ -150,10 +134,23 @@ export const NAV_DOCUMENTS: NavLinkItem[] = [
|
|
|
150
134
|
{
|
|
151
135
|
key: "tokens",
|
|
152
136
|
title: "Tokens & themes",
|
|
153
|
-
/**
|
|
154
|
-
|
|
137
|
+
/** Dedicated route (was previously /settings#appearance — split out so the nav target
|
|
138
|
+
* is bookmarkable and there's no active-state collision with Settings). */
|
|
139
|
+
url: "/tokens-themes",
|
|
155
140
|
icon: <i className="fa-light fa-palette" aria-hidden="true" />,
|
|
156
141
|
iconActive: <i className="fa-solid fa-palette" aria-hidden="true" />,
|
|
142
|
+
/** Opens the `tokens` secondary panel — categories live in the rail, not in view tabs.
|
|
143
|
+
* `useAutoPanel("tokens")` inside the hub also collapses the main sidebar
|
|
144
|
+
* (`secondary-panel.tsx#openPanel`) per the Library library pattern. */
|
|
145
|
+
secondaryPanel: "tokens",
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
key: "columns",
|
|
149
|
+
title: "Column types",
|
|
150
|
+
/** DataTable column-pattern showcase — every cell renderer the DS supports. */
|
|
151
|
+
url: "/columns",
|
|
152
|
+
icon: <i className="fa-light fa-table-columns" aria-hidden="true" />,
|
|
153
|
+
iconActive: <i className="fa-solid fa-table-columns" aria-hidden="true" />,
|
|
157
154
|
},
|
|
158
155
|
{
|
|
159
156
|
key: "more",
|
|
@@ -1,45 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Coalesce many calls to `fn` into one per animation frame.
|
|
3
|
-
*
|
|
4
|
-
* Use for high-frequency layout-reading event handlers (scroll, resize,
|
|
5
|
-
* visualViewport, ResizeObserver) where the work must happen in a frame but
|
|
6
|
-
* doing it on every event call (60+/s for resize, hundreds/s for capture
|
|
7
|
-
* scrolls) wastes layout/paint cycles. The returned function exposes
|
|
8
|
-
* `.cancel()` so effect cleanup can drop a pending frame.
|
|
9
|
-
*
|
|
10
|
-
* Pattern:
|
|
11
|
-
* const apply = () => { ...layout reads + setState... }
|
|
12
|
-
* const scheduled = rafThrottle(apply)
|
|
13
|
-
* window.addEventListener("scroll", scheduled, { passive: true, capture: true })
|
|
14
|
-
* return () => {
|
|
15
|
-
* scheduled.cancel()
|
|
16
|
-
* window.removeEventListener("scroll", scheduled, { capture: true })
|
|
17
|
-
* }
|
|
18
|
-
*/
|
|
19
|
-
export function rafThrottle<TArgs extends unknown[]>(
|
|
20
|
-
fn: (...args: TArgs) => void,
|
|
21
|
-
): ((...args: TArgs) => void) & { cancel: () => void } {
|
|
22
|
-
let rafId = 0
|
|
23
|
-
let lastArgs: TArgs | null = null
|
|
24
|
-
|
|
25
|
-
const scheduled = ((...args: TArgs) => {
|
|
26
|
-
lastArgs = args
|
|
27
|
-
if (rafId !== 0) return
|
|
28
|
-
rafId = requestAnimationFrame(() => {
|
|
29
|
-
rafId = 0
|
|
30
|
-
const a = lastArgs
|
|
31
|
-
lastArgs = null
|
|
32
|
-
if (a) fn(...a)
|
|
33
|
-
})
|
|
34
|
-
}) as ((...args: TArgs) => void) & { cancel: () => void }
|
|
35
|
-
|
|
36
|
-
scheduled.cancel = () => {
|
|
37
|
-
if (rafId !== 0) {
|
|
38
|
-
cancelAnimationFrame(rafId)
|
|
39
|
-
rafId = 0
|
|
40
|
-
}
|
|
41
|
-
lastArgs = null
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return scheduled
|
|
45
|
-
}
|
|
1
|
+
export { rafThrottle } from "@exxatdesignux/ui/lib/raf-throttle"
|
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export const ROW_HEIGHT_TILES: readonly { value: RowHeight; label: string; icon: string }[] = [
|
|
7
|
-
{ value: "compact", label: "Compact", icon: "fa-down-to-line" },
|
|
8
|
-
{ value: "default", label: "Default", icon: "fa-arrows-up-down" },
|
|
9
|
-
{ value: "comfortable", label: "Comfortable", icon: "fa-up-to-line" },
|
|
10
|
-
]
|
|
1
|
+
export {
|
|
2
|
+
ROW_HEIGHT_TILES,
|
|
3
|
+
type RowHeight,
|
|
4
|
+
} from "@exxatdesignux/ui/lib/row-height"
|
|
@@ -1,9 +1,18 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Cookie name persisted by `@exxatdesignux/ui` `SidebarProvider` (`setOpen`).
|
|
3
|
+
*
|
|
4
|
+
* Versioned (`_v2`) on 2026-05-21 to drop stale values written by the pre-fix
|
|
5
|
+
* code where incidental layout collapses clobbered the user's preference on
|
|
6
|
+
* every navigation. The legacy `sidebar_state` cookie (without `_v2`) is
|
|
7
|
+
* ignored on the server and actively deleted client-side on first mount.
|
|
8
|
+
*/
|
|
9
|
+
export const SIDEBAR_STATE_COOKIE_NAME = "sidebar_state_v2"
|
|
3
10
|
|
|
4
11
|
/** Read desktop sidebar expanded state for SSR `defaultOpen` (matches client cookie restore). */
|
|
5
12
|
export function sidebarDefaultOpenFromCookie(
|
|
6
13
|
value: string | undefined,
|
|
7
14
|
): boolean {
|
|
15
|
+
// No cookie OR malformed value → default expanded.
|
|
16
|
+
// Only an exact `"false"` from the new cookie counts as a saved collapsed preference.
|
|
8
17
|
return value !== "false"
|
|
9
18
|
}
|
|
@@ -26,7 +26,7 @@ import type { RowHeight } from "@/lib/row-height"
|
|
|
26
26
|
import type { DataListDisplayOptions } from "@/lib/data-list-display-options"
|
|
27
27
|
import type { ActiveFilter, ConditionalRule, SortRule } from "@/components/table-properties/types"
|
|
28
28
|
import type { ViewTab } from "@/components/templates/list-page"
|
|
29
|
-
import {
|
|
29
|
+
import type { DataListViewType } from "@/lib/data-list-view"
|
|
30
30
|
|
|
31
31
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
32
32
|
// Storage key + debounce config
|
|
@@ -139,7 +139,7 @@ export interface TableStatePersistSlice {
|
|
|
139
139
|
// Parsers + validators
|
|
140
140
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
141
141
|
|
|
142
|
-
const VIEW_TYPES: DataListViewType[] =
|
|
142
|
+
const VIEW_TYPES: DataListViewType[] = ["table", "list", "board", "dashboard"]
|
|
143
143
|
|
|
144
144
|
function isViewType(v: unknown): v is DataListViewType {
|
|
145
145
|
return typeof v === "string" && (VIEW_TYPES as string[]).includes(v)
|
|
@@ -388,7 +388,7 @@ export function schedulePageSave(namespace: string, payload: PersistedPageV1): v
|
|
|
388
388
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
389
389
|
|
|
390
390
|
export interface UseTableStateLifecycleOptions<TExtras extends Record<string, unknown> | void = void> {
|
|
391
|
-
/** Storage namespace, e.g. `"placements"`, `"team"`, `"
|
|
391
|
+
/** Storage namespace, e.g. `"placements"`, `"team"`, `"library"`. */
|
|
392
392
|
namespace: string
|
|
393
393
|
/**
|
|
394
394
|
* Sub-key per lifecycle tab. A hub with only one lifecycle should pass a
|
package/template/next.config.mjs
CHANGED
|
@@ -168,10 +168,13 @@ const nextConfig = {
|
|
|
168
168
|
},
|
|
169
169
|
async redirects() {
|
|
170
170
|
return [
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
{ source: "/
|
|
174
|
-
{ source: "/
|
|
171
|
+
// Legacy demo routes (placements, rotations, compliance, sites) were removed.
|
|
172
|
+
// Redirect anything pointing at them to Dashboard rather than 404.
|
|
173
|
+
{ source: "/rotations", destination: "/dashboard", permanent: false },
|
|
174
|
+
{ source: "/compliance", destination: "/dashboard", permanent: false },
|
|
175
|
+
{ source: "/sites/all", destination: "/dashboard", permanent: false },
|
|
176
|
+
{ source: "/sites/all/:path*", destination: "/dashboard", permanent: false },
|
|
177
|
+
{ source: "/examples", destination: "/dashboard", permanent: false },
|
|
175
178
|
]
|
|
176
179
|
},
|
|
177
180
|
}
|
package/template/package.json
CHANGED
package/template/tests/setup.ts
CHANGED
|
@@ -1 +1,26 @@
|
|
|
1
1
|
import "@testing-library/jest-dom/vitest"
|
|
2
|
+
import { vi } from "vitest"
|
|
3
|
+
|
|
4
|
+
// jsdom does not implement window.matchMedia — stub it for tests that use
|
|
5
|
+
// useTableState (which calls useSyncExternalStore with a matchMedia listener)
|
|
6
|
+
Object.defineProperty(window, "matchMedia", {
|
|
7
|
+
writable: true,
|
|
8
|
+
value: (query: string) => ({
|
|
9
|
+
matches: false,
|
|
10
|
+
media: query,
|
|
11
|
+
onchange: null,
|
|
12
|
+
addListener: vi.fn(),
|
|
13
|
+
removeListener: vi.fn(),
|
|
14
|
+
addEventListener: vi.fn(),
|
|
15
|
+
removeEventListener: vi.fn(),
|
|
16
|
+
dispatchEvent: vi.fn(),
|
|
17
|
+
}),
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
// jsdom does not implement ResizeObserver — stub it for components that use
|
|
21
|
+
// Radix UI primitives (Sheet, Tooltip, etc.) which call it internally.
|
|
22
|
+
globalThis.ResizeObserver = class {
|
|
23
|
+
observe = vi.fn()
|
|
24
|
+
unobserve = vi.fn()
|
|
25
|
+
disconnect = vi.fn()
|
|
26
|
+
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
# Exxat DS — consumer app handbook
|
|
2
|
-
|
|
3
|
-
**Purpose:** Guide for **product repositories** that depend on **`@exxatdesignux/ui`** from npm. The monorepo **`apps/web`** app is the full reference implementation; this file is what ships in the package for consumers.
|
|
4
|
-
|
|
5
|
-
**Path after sync:** `docs/exxat-ds/AGENTS-consumer.md` or merge sections into your app handbook via **`exxat-ui sync-extras`**.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 1. How to use this file (for AI agents)
|
|
10
|
-
|
|
11
|
-
1. **Before** upgrading **`@exxatdesignux/ui`**, read **`consumer-upgrade-checklist.md`** and **`CHANGELOG.md`** in the installed package.
|
|
12
|
-
2. **Before** adding a **list / table / board hub**, read **`data-views-pattern.md`** (view registry + connected bodies), **`consumer-app-pattern.md`**, and skill **`exxat-centralized-list-dataset`**.
|
|
13
|
-
3. **Before** a **dedicated form / wizard / settings route**, read **`focused-workflow-page-pattern.md`** and **`exxat-focused-workflow-page`** skill.
|
|
14
|
-
4. **Before** nested **Library / scope** nav, read **`exxat-primary-nav-secondary-panel`** skill and **`shell-surface-elevation-pattern.md`**.
|
|
15
|
-
5. Run **`exxat-ui sync-extras`** after every DS version bump so **`.cursor/skills/exxat-*`** match the tarball.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## 2. What ships in the package
|
|
20
|
-
|
|
21
|
-
| Artifact | Location in npm | Use |
|
|
22
|
-
|----------|-----------------|-----|
|
|
23
|
-
| Components + tokens | `@exxatdesignux/ui` | Import UI, hooks, CSS |
|
|
24
|
-
| Reference app | `node_modules/@exxatdesignux/ui/template/` | Diff / port routes and hub clients |
|
|
25
|
-
| Cursor skills | `consumer-extras/cursor-skills/` → sync to `.cursor/skills/` | AI checklists |
|
|
26
|
-
| Pattern docs | `consumer-extras/patterns/` → sync to `docs/exxat-ds/` | Human + AI narrative |
|
|
27
|
-
|
|
28
|
-
**`sync-extras` does not** modify your product routes — you port intentionally from **`template/`**.
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## 3. List hub stack (centralized)
|
|
33
|
-
|
|
34
|
-
**MUST:**
|
|
35
|
-
|
|
36
|
-
- **`lib/mock/<entity>.ts`** — one row type + seed data.
|
|
37
|
-
- **`lib/<hub>-supported-views.ts`** — allowlist shared by **`ListPageTemplate`** and **`TablePropertiesDrawer`**.
|
|
38
|
-
- **`useTableState`** — **`tableState.rows`** feeds table, list, board, dashboard, folder, panel, tree.
|
|
39
|
-
- **`ListPageConnectedViewBody`** + **`defineHubViewRenderers`** — no silent dashboard fallback.
|
|
40
|
-
- **`ListPageViewFrame`** / **`components/data-views/`** for non-table bodies.
|
|
41
|
-
|
|
42
|
-
**MUST NOT:** Second mock array per view; **`ListPageTemplate`** on a dedicated create/edit URL.
|
|
43
|
-
|
|
44
|
-
**Rule/skill (sync from package):** `exxat-centralized-list-dataset`, `exxat-list-page-connected-views`, `exxat-list-page-view-shells`.
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## 4. Shell elevation
|
|
49
|
-
|
|
50
|
-
| Level | Token |
|
|
51
|
-
|-------|--------|
|
|
52
|
-
| Primary sidebar | `--sidebar` |
|
|
53
|
-
| Secondary panel (Library) | `--secondary-panel-bg` |
|
|
54
|
-
| Page | `--background` |
|
|
55
|
-
|
|
56
|
-
Dark mode secondary panel **MUST** use **`color-mix(… var(--sidebar-accent) …)`**, not light **`--brand-tint`**. See **`shell-surface-elevation-pattern.md`**.
|
|
57
|
-
|
|
58
|
-
---
|
|
59
|
-
|
|
60
|
-
## 5. Consumer app checklist (copy for PRs)
|
|
61
|
-
|
|
62
|
-
- [ ] **`@exxatdesignux/ui`** version recorded; **`exxat-ui sync-extras`** run if skills/docs changed.
|
|
63
|
-
- [ ] Template diff reviewed for new **`template/`** files relevant to this feature.
|
|
64
|
-
- [ ] List hub: **`supportedViewTypes`** aligned; **`ListPageConnectedViewBody`**; **`tableState.rows`** everywhere.
|
|
65
|
-
- [ ] Form/wizard route: **`FocusedWorkflowPageTemplate`** (not list hub shell).
|
|
66
|
-
- [ ] Secondary panel: **`--secondary-panel-bg`** on **`NestedSecondaryPanelShell`**; dark mode spot-checked.
|
|
67
|
-
- [ ] Product switcher: collapsed sidebar opens menu (**`SidebarMenuButton` `tooltip`**, not nested Tooltip + DropdownMenu).
|
|
68
|
-
- [ ] No toast — banners / inline / dialog.
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
## 6. See also
|
|
73
|
-
|
|
74
|
-
- **`consumer-app-pattern.md`**
|
|
75
|
-
- **`consumer-upgrade-checklist.md`**
|
|
76
|
-
- Monorepo **`apps/web/AGENTS.md`** (full product handbook when you have the design-system repo)
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: exxat-consumer-app
|
|
3
|
-
description: Build or upgrade product apps that install @exxatdesignux/ui from npm — sync-extras, diff template/, centralized list hubs, focused workflow routes, shell elevation. Use when working outside the design-system monorepo or after pnpm add @exxatdesignux/ui.
|
|
4
|
-
user-invocable: true
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Exxat DS — consumer app
|
|
8
|
-
|
|
9
|
-
**Pattern:** `consumer-app-pattern.md` (in `docs/exxat-ds/` after sync)
|
|
10
|
-
**Handbook:** `AGENTS-consumer.md` or `consumer-app-pattern.md` parent **`AGENTS.md`** in package extras
|
|
11
|
-
**Upgrade:** `consumer-upgrade-checklist.md`
|
|
12
|
-
|
|
13
|
-
## When this applies
|
|
14
|
-
|
|
15
|
-
- Repo has **`@exxatdesignux/ui`** in **`package.json`**, not the design-system monorepo **`apps/web`**.
|
|
16
|
-
- Task is **porting** a hub, shell, or route from **`node_modules/@exxatdesignux/ui/template/`**.
|
|
17
|
-
|
|
18
|
-
## Checklist
|
|
19
|
-
|
|
20
|
-
- [ ] Read installed **`CHANGELOG.md`**; run **`exxat-ui sync-extras`** after bump.
|
|
21
|
-
- [ ] Diff **`template/`** vs your app for the feature (client, table, mocks, layout).
|
|
22
|
-
- [ ] **List hub:** `lib/<hub>-supported-views.ts` + **`ListPageConnectedViewBody`** + **`defineHubViewRenderers`** + one **`useTableState`** row bag.
|
|
23
|
-
- [ ] **Same** `supportedViewTypes` on **`ListPageTemplate`** and **`TablePropertiesDrawer`**.
|
|
24
|
-
- [ ] **Form/wizard/settings URL:** **`FocusedWorkflowPageTemplate`** — not **`ListPageTemplate`**.
|
|
25
|
-
- [ ] **Secondary panel:** `NestedSecondaryPanelShell` + **`--secondary-panel-bg`**; verify **dark mode** (no light rose panel).
|
|
26
|
-
- [ ] **Product switcher (collapsed):** `DropdownMenuTrigger` → **`SidebarMenuButton`** with **`tooltip=`** — do not nest **`Tooltip`** outside **`DropdownMenuTrigger`**.
|
|
27
|
-
- [ ] CSS: import DS globals; product theme classes on **`<html>`** via **`ProductProvider`** pattern from template.
|
|
28
|
-
|
|
29
|
-
## MUST NOT
|
|
30
|
-
|
|
31
|
-
- Fork **`DataTable`** / view-tab stack when template already has the hub pattern.
|
|
32
|
-
- Import raw **`ENTITY_ROWS`** into folder/board views while the table filters **`useTableState`**.
|
|
33
|
-
- Skip **`exxat-ui sync-extras`** and rely on stale **`.cursor/skills`**.
|
|
34
|
-
|
|
35
|
-
## Pair with
|
|
36
|
-
|
|
37
|
-
- **`exxat-centralized-list-dataset`**, **`exxat-list-page-view-shells`**, **`exxat-focused-workflow-page`**, **`exxat-primary-nav-secondary-panel`**
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: exxat-focused-workflow-page
|
|
3
|
-
description: FocusedWorkflowPageTemplate — dedicated routes for large forms, multi-step wizards, and sectioned settings (single column, steps, sidebar nav). Not list hubs or Miller-column explorers. Use when adding create/edit routes, settings pages, or empty workflow placeholders.
|
|
4
|
-
user-invocable: true
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Exxat DS — focused workflow page
|
|
8
|
-
|
|
9
|
-
**Rule:** `.cursor/rules/exxat-focused-workflow-page.mdc`
|
|
10
|
-
**Doc:** `docs/focused-workflow-page-pattern.md` (app / consumer-extras `patterns/`)
|
|
11
|
-
**Handbook:** `AGENTS.md` §6.4, **§14** checklist
|
|
12
|
-
|
|
13
|
-
## When to use
|
|
14
|
-
|
|
15
|
-
| Use **focused workflow** | Use something else |
|
|
16
|
-
| --- | --- |
|
|
17
|
-
| Own URL; primary create/edit; multi-step wizard; sectioned settings | **List hub** → `ListPageTemplate` + `DataTable` |
|
|
18
|
-
| Large form that should not sit in a drawer | **Quick hub adjunct** → drawer (`ExportDrawer`, `TablePropertiesDrawer`) |
|
|
19
|
-
| | **Blocking confirm** → dialog |
|
|
20
|
-
| | **Finder / folder columns** → `ListPageSplitHubChrome`, `ListPageFolderColumnsPanel` |
|
|
21
|
-
|
|
22
|
-
## Checklist
|
|
23
|
-
|
|
24
|
-
- [ ] Route uses **`FocusedWorkflowPageTemplate`** — not raw `SidebarInset` copy-paste; not **`PrimaryPageTemplate`** / **`ListPageTemplate`**.
|
|
25
|
-
- [ ] **`siteHeader`**: `back` or `breadcrumbs` + `title`; parent trail stays in header, not duplicated in body.
|
|
26
|
-
- [ ] **`maxWidth`**: `md` simple forms · `lg` settings / wide fields · `xl` only when justified.
|
|
27
|
-
- [ ] **One body layout** from `focused-workflow-layouts.tsx`:
|
|
28
|
-
- **`FocusedWorkflowSingleColumn`** — default stack
|
|
29
|
-
- **`FocusedWorkflowStepForm`** + **`FocusedWorkflowWizardFooter`** — wizard
|
|
30
|
-
- **`FocusedWorkflowSidebarSections`** — left section nav (`id` on `<section>` matches `sections[].id`)
|
|
31
|
-
- **`FocusedWorkflowEmptyState`** — not configured / coming soon
|
|
32
|
-
- [ ] **Footers:** **`FocusedWorkflowActionFooter`** or **`FocusedWorkflowWizardFooter`** with **`Shortcut`** + **`<Kbd variant="bare">`** in buttons (**`exxat-kbd-shortcuts.mdc`**).
|
|
33
|
-
- [ ] Domain UI in **`*-composer.tsx`** / **`*-client.tsx`**; keep **`FocusedWorkflow*`** names generic (not product-specific).
|
|
34
|
-
- [ ] Long forms: optional **`beforeSiteHeader={<SidebarAutoCollapse />}`** (see `/question-bank/new`).
|
|
35
|
-
- [ ] **No** **`ListPageTemplate`** view tabs, **no** Miller columns, **no** **`ListPageFolderColumnsPanel`** inside this shell.
|
|
36
|
-
- [ ] **No toast** for outcomes — banners, inline, or dialog (**`exxat-no-toast.mdc`**).
|
|
37
|
-
|
|
38
|
-
## MUST NOT
|
|
39
|
-
|
|
40
|
-
- Ship a **full create/edit wizard** only in a drawer when it needs bookmarkable URL / long focus.
|
|
41
|
-
- Use **`ListPageTemplate`** for a dedicated “new record” route.
|
|
42
|
-
- Name shared templates after one feature (`NewQuestionPageTemplate`, etc.).
|
|
43
|
-
|
|
44
|
-
## Code pointers
|
|
45
|
-
|
|
46
|
-
| Piece | Path |
|
|
47
|
-
| --- | --- |
|
|
48
|
-
| Shell | `components/templates/focused-workflow-page-template.tsx` |
|
|
49
|
-
| Layouts + footers | `components/templates/focused-workflow-layouts.tsx` |
|
|
50
|
-
| Showcase | `components/examples/focused-workflow-showcase.tsx`, `/examples/focused-workflow` |
|
|
51
|
-
| Single column | `app/(app)/question-bank/new/page.tsx` + `new-question-composer.tsx` |
|
|
52
|
-
| Sidebar sections | `app/(app)/settings/page.tsx` + `settings-client.tsx` |
|
|
53
|
-
|
|
54
|
-
## Pair with
|
|
55
|
-
|
|
56
|
-
- **`exxat-page-vs-drawer`**, **`exxat-drawer-vs-dialog`**, **`exxat-kbd-shortcuts`**
|
|
57
|
-
- **`exxat-reuse-before-custom`** — extend layouts before forking shell markup
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# Consumer app pattern (`@exxatdesignux/ui`)
|
|
2
|
-
|
|
3
|
-
> **Audience:** Product repos that **install** the design system from npm — not the `apps/web` monorepo reference app.
|
|
4
|
-
> **Handbook:** `packages/ui/consumer-extras/AGENTS.md` · **Upgrade:** `consumer-upgrade-checklist.md` · **Skill:** `.cursor/skills/exxat-consumer-app/SKILL.md`
|
|
5
|
-
|
|
6
|
-
## Intent
|
|
7
|
-
|
|
8
|
-
A **consumer app** composes **`@exxatdesignux/ui`** primitives and copies **patterns** from the published **`template/`** tree. It does **not** fork parallel table stacks, view routers, or shell tokens.
|
|
9
|
-
|
|
10
|
-
## MUST
|
|
11
|
-
|
|
12
|
-
1. **Install** — `@exxatdesignux/ui` + peers; import DS CSS once (`@exxatdesignux/ui/globals.css` or documented entry).
|
|
13
|
-
2. **Sync extras** — After version bumps: `npx --package=@exxatdesignux/ui@latest exxat-ui sync-extras` → `.cursor/skills/exxat-*` + `docs/exxat-ds/*.md`.
|
|
14
|
-
3. **Diff template** — Compare `node_modules/@exxatdesignux/ui/template/` for new files (layouts, `ListPageConnectedViewBody`, `FocusedWorkflowPageTemplate`, mocks).
|
|
15
|
-
4. **List hubs** — One **`useTableState`** row bag; **`ListPageConnectedViewBody`** + **`defineHubViewRenderers`**; same **`supportedViewTypes`** on **`ListPageTemplate`** and **`TablePropertiesDrawer`**.
|
|
16
|
-
5. **Shell tokens** — Sidebar / secondary panel / page elevation via **`--sidebar`**, **`--secondary-panel-bg`**, **`--background`** — see **`shell-surface-elevation-pattern.md`**.
|
|
17
|
-
6. **Focused workflows** — Dedicated create/edit/settings routes use **`FocusedWorkflowPageTemplate`** — **`focused-workflow-page-pattern.md`**.
|
|
18
|
-
|
|
19
|
-
## MUST NOT
|
|
20
|
-
|
|
21
|
-
- Copy only components without porting **AGENTS**, **rules**, and **pattern docs** when behavior changes.
|
|
22
|
-
- Ship hub view tabs with long **`if (view === "table")`** chains instead of **`ListPageConnectedViewBody`**.
|
|
23
|
-
- Keep a second mock array per view while the grid uses **`useTableState`**.
|
|
24
|
-
- Set secondary panel to **`bg-sidebar`** or light **`--brand-tint`** mixes in dark mode.
|
|
25
|
-
|
|
26
|
-
## Checklist (new consumer feature)
|
|
27
|
-
|
|
28
|
-
- [ ] Read **`consumer-upgrade-checklist.md`** for the installed UI version.
|
|
29
|
-
- [ ] Run **`exxat-ui sync-extras`** if skills/patterns are stale.
|
|
30
|
-
- [ ] Find the closest **`template/`** hub or page; port file names and imports to your app paths.
|
|
31
|
-
- [ ] **List hub:** `lib/<hub>-supported-views.ts`, `lib/data-list-view-registry.ts`, `ListPageConnectedViewBody`, centralized **`tableState.rows`**.
|
|
32
|
-
- [ ] **Form route:** `FocusedWorkflowPageTemplate` + one body layout from **`focused-workflow-layouts.tsx`**.
|
|
33
|
-
- [ ] **Nav + secondary panel:** `secondaryPanel` on nav item, `PANELS` registry, `useAutoPanel` — **`exxat-primary-nav-secondary-panel`** skill.
|
|
34
|
-
- [ ] Re-run **`fa:subset-audit`** when adding Font Awesome glyphs.
|
|
35
|
-
|
|
36
|
-
## See also
|
|
37
|
-
|
|
38
|
-
- Monorepo reference: `apps/web/` (full product demo)
|
|
39
|
-
- **`.cursor/rules/exxat-consumer-app.mdc`** (when working inside a consumer repo that synced rules)
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
# Focused workflow page (dedicated routes)
|
|
2
|
-
|
|
3
|
-
> **Related:** **`AGENTS.md` §6.4** (page vs drawer vs dialog), **§14** (AI checklist), **`docs/drawer-vs-dialog-pattern.md`**, **`.cursor/rules/exxat-page-vs-drawer.mdc`**, **`.cursor/rules/exxat-focused-workflow-page.mdc`**, **`.cursor/skills/exxat-focused-workflow-page/SKILL.md`**.
|
|
4
|
-
|
|
5
|
-
## Intent
|
|
6
|
-
|
|
7
|
-
Use **`FocusedWorkflowPageTemplate`** for **large or multi-step work** on its **own route** — create/edit forms, wizards, and sectioned settings. The shell is **narrower** than list hubs and **does not** use Miller-column / split-panel explorers.
|
|
8
|
-
|
|
9
|
-
| Surface | Use instead |
|
|
10
|
-
| --- | --- |
|
|
11
|
-
| Browsable record hubs (table, board, dashboard tabs) | **`PrimaryPageTemplate`** + **`ListPageTemplate`** |
|
|
12
|
-
| Finder / folder columns / split hub chrome | **`ListPageSplitHubChrome`**, **`ListPageFolderColumnsPanel`** |
|
|
13
|
-
| Quick properties or export beside a grid | **Drawer** (`TablePropertiesDrawer`, `ExportDrawer`) |
|
|
14
|
-
| Blocking confirm on the same route | **Dialog** |
|
|
15
|
-
|
|
16
|
-
## Surface matrix (§6.4)
|
|
17
|
-
|
|
18
|
-
| Need | Drawer | Dialog | **Focused workflow route** |
|
|
19
|
-
| --- | --- | --- | --- |
|
|
20
|
-
| Keep hub visible while acting | Yes | No | No |
|
|
21
|
-
| Own URL / bookmark / history | Rare | No | **Yes** |
|
|
22
|
-
| Multi-step wizard | Cramped | No | **Yes** |
|
|
23
|
-
| Sectioned settings (left nav) | Awkward | No | **Yes** |
|
|
24
|
-
| Short delete confirm | No | **Yes** | Overkill |
|
|
25
|
-
|
|
26
|
-
## Shell
|
|
27
|
-
|
|
28
|
-
**`FocusedWorkflowPageTemplate`** (`components/templates/focused-workflow-page-template.tsx`):
|
|
29
|
-
|
|
30
|
-
- **`SidebarInset`** + **`SiteHeader`** (breadcrumb back link + title).
|
|
31
|
-
- Centered column: **`max-w-3xl` / `max-w-4xl` / `max-w-5xl`** via **`maxWidth`** (`md` | `lg` | `xl`).
|
|
32
|
-
- Default padding: **`FOCUSED_WORKFLOW_CONTENT_PADDING_CLASS`**.
|
|
33
|
-
|
|
34
|
-
Optional **`beforeSiteHeader`** (e.g. **`SidebarAutoCollapse`** on long forms).
|
|
35
|
-
|
|
36
|
-
## Body layouts
|
|
37
|
-
|
|
38
|
-
Import from **`components/templates/focused-workflow-layouts.tsx`**:
|
|
39
|
-
|
|
40
|
-
| Layout | When |
|
|
41
|
-
| --- | --- |
|
|
42
|
-
| **`FocusedWorkflowSingleColumn`** | Default stack — header, form sections, footer actions (e.g. question authoring). |
|
|
43
|
-
| **`FocusedWorkflowStepForm`** + **`FocusedWorkflowWizardFooter`** | Multi-step wizard with progress list and sticky footer (placement-style flows). |
|
|
44
|
-
| **`FocusedWorkflowSidebarSections`** | Sectioned form with **left nav rail** (settings-style); put **`id`** on each `<section>` matching **`sections[].id`**. |
|
|
45
|
-
| **`FocusedWorkflowEmptyState`** | Placeholder / not-yet-configured route body. |
|
|
46
|
-
| **`FocusedWorkflowActionFooter`** | Single-step Cancel (Esc) + primary (Enter) without step chrome. |
|
|
47
|
-
|
|
48
|
-
Keyboard: wizard and action footers pair **`Shortcut`** with inline **`<Kbd variant="bare">`** per **`.cursor/rules/exxat-kbd-shortcuts.mdc`**.
|
|
49
|
-
|
|
50
|
-
## Golden references
|
|
51
|
-
|
|
52
|
-
| Route | Variant |
|
|
53
|
-
| --- | --- |
|
|
54
|
-
| **`/question-bank/new`** | Shell + **`FocusedWorkflowSingleColumn`** + domain composer |
|
|
55
|
-
| **`/settings`** | Shell (`maxWidth="lg"`) + **`FocusedWorkflowSidebarSections`** |
|
|
56
|
-
| **`/examples/focused-workflow`** | Showcase: empty, steps, sidebar (toggle) |
|
|
57
|
-
|
|
58
|
-
## Wiring checklist (implementers)
|
|
59
|
-
|
|
60
|
-
1. **Route** under **`app/(app)/…/page.tsx`** — thin server page; heavy UI in a **client** component.
|
|
61
|
-
2. **`siteHeader`**: **`back`** or **`breadcrumbs`** + **`title`**; avoid duplicating the trail in the body.
|
|
62
|
-
3. Pick **`maxWidth`**: **`md`** for simple forms, **`lg`** for settings / wide fields.
|
|
63
|
-
4. Choose **one** body layout; do **not** nest Miller columns or **`ListPageTemplate`** view tabs inside this shell.
|
|
64
|
-
5. Domain logic stays in **`*-composer.tsx`** / **`*-client.tsx`**; templates stay generic **`FocusedWorkflow*`**.
|
|
65
|
-
6. Run **§14** in **`AGENTS.md`** when reviewing.
|
|
66
|
-
|
|
67
|
-
## AI execution checklist (copy for PRs)
|
|
68
|
-
|
|
69
|
-
- [ ] **`FocusedWorkflowPageTemplate`** on the route — not ad-hoc **`SidebarInset`** / list-hub shell.
|
|
70
|
-
- [ ] Correct body variant: **single column** | **step form** | **sidebar sections** | **empty**.
|
|
71
|
-
- [ ] Wizard/action footers use **`Shortcut`** + bare **`Kbd`** in buttons.
|
|
72
|
-
- [ ] **No** list-hub view tabs, **no** folder-column explorer inside the page.
|
|
73
|
-
- [ ] Template/component names remain **generic** (not tied to one entity).
|
|
74
|
-
- [ ] **§6.5** — no toast for product feedback.
|
|
75
|
-
|
|
76
|
-
## Pair with
|
|
77
|
-
|
|
78
|
-
- **`exxat-page-vs-drawer.mdc`**, **`exxat-drawer-vs-dialog.mdc`**, **`exxat-kbd-shortcuts.mdc`**
|
|
79
|
-
- **`exxat-reuse-before-custom.mdc`** — extend **`focused-workflow-layouts.tsx`** before forking a second shell
|
|
80
|
-
|
|
81
|
-
## See also
|
|
82
|
-
|
|
83
|
-
- **`components/examples/focused-workflow-showcase.tsx`**
|
|
84
|
-
- **`packages/ui/consumer-extras/patterns/focused-workflow-page-pattern.md`** (npm consumers)
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
"use client"
|
|
2
|
-
|
|
3
|
-
import * as React from "react"
|
|
4
|
-
import { cva, type VariantProps } from "class-variance-authority"
|
|
5
|
-
import { Slot } from "radix-ui"
|
|
6
|
-
|
|
7
|
-
import { cn } from "../../lib/utils"
|
|
8
|
-
import { Separator } from "./separator"
|
|
9
|
-
|
|
10
|
-
const buttonGroupVariants = cva(
|
|
11
|
-
"group/button-group flex w-fit items-stretch overflow-hidden rounded-md *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1",
|
|
12
|
-
{
|
|
13
|
-
variants: {
|
|
14
|
-
orientation: {
|
|
15
|
-
horizontal:
|
|
16
|
-
"[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-r-md!",
|
|
17
|
-
vertical:
|
|
18
|
-
"flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-md!",
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
defaultVariants: {
|
|
22
|
-
orientation: "horizontal",
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
function ButtonGroup({
|
|
28
|
-
className,
|
|
29
|
-
orientation,
|
|
30
|
-
...props
|
|
31
|
-
}: React.ComponentProps<"div"> & VariantProps<typeof buttonGroupVariants>) {
|
|
32
|
-
return (
|
|
33
|
-
<div
|
|
34
|
-
role="group"
|
|
35
|
-
data-slot="button-group"
|
|
36
|
-
data-orientation={orientation}
|
|
37
|
-
className={cn(buttonGroupVariants({ orientation }), className)}
|
|
38
|
-
{...props}
|
|
39
|
-
/>
|
|
40
|
-
)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function ButtonGroupText({
|
|
44
|
-
className,
|
|
45
|
-
asChild = false,
|
|
46
|
-
...props
|
|
47
|
-
}: React.ComponentProps<"div"> & {
|
|
48
|
-
asChild?: boolean
|
|
49
|
-
}) {
|
|
50
|
-
const Comp = asChild ? Slot.Root : "div"
|
|
51
|
-
|
|
52
|
-
return (
|
|
53
|
-
<Comp
|
|
54
|
-
className={cn(
|
|
55
|
-
"flex items-center gap-2 rounded-lg border bg-muted px-2.5 text-sm font-medium [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",
|
|
56
|
-
className,
|
|
57
|
-
)}
|
|
58
|
-
{...props}
|
|
59
|
-
/>
|
|
60
|
-
)
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function ButtonGroupSeparator({
|
|
64
|
-
className,
|
|
65
|
-
orientation = "vertical",
|
|
66
|
-
...props
|
|
67
|
-
}: React.ComponentProps<typeof Separator>) {
|
|
68
|
-
return (
|
|
69
|
-
<Separator
|
|
70
|
-
data-slot="button-group-separator"
|
|
71
|
-
orientation={orientation}
|
|
72
|
-
className={cn(
|
|
73
|
-
"relative self-stretch bg-input data-[orientation=horizontal]:mx-px data-[orientation=horizontal]:h-auto data-[orientation=horizontal]:w-auto data-[orientation=vertical]:my-px data-[orientation=vertical]:h-auto",
|
|
74
|
-
className,
|
|
75
|
-
)}
|
|
76
|
-
{...props}
|
|
77
|
-
/>
|
|
78
|
-
)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export { ButtonGroup, ButtonGroupSeparator, ButtonGroupText, buttonGroupVariants }
|