@exxatdesignux/ui 0.2.18 → 0.3.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 +69 -1
- package/bin/sync-extras.mjs +116 -29
- package/consumer-extras/README.md +43 -4
- 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 +41 -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-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-question-bank-hub-header.mdc +28 -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 +2 -2
- package/consumer-extras/cursor-skills/exxat-centralized-list-dataset/SKILL.md +1 -1
- package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +9 -9
- package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +1 -1
- package/consumer-extras/handbook/HANDBOOK.md +185 -0
- package/consumer-extras/handbook/glossary.md +57 -0
- package/consumer-extras/handbook/reference-implementations.md +126 -0
- package/consumer-extras/handbook/voice-and-tone.md +262 -0
- package/consumer-extras/patterns/command-menu-pattern.md +1 -1
- package/consumer-extras/patterns/data-views-pattern.md +14 -14
- 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 +167 -0
- package/dist/components/data-views/hub-table.js +5561 -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 +6575 -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 +13324 -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 -18
- 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 +255 -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 +498 -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/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 +494 -151
- 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/.cursor/rules/exxat-command-menu.mdc +1 -1
- package/template/.cursor/rules/exxat-dashboard-view-charts.mdc +3 -3
- package/template/.cursor/rules/exxat-data-tables.mdc +1 -1
- package/template/.cursor/rules/exxat-ds-agents.mdc +2 -2
- package/template/.cursor/rules/exxat-kbd-shortcuts.mdc +2 -2
- package/template/.cursor/rules/exxat-table-properties-drawer.mdc +1 -1
- package/template/AGENTS.md +84 -20
- package/template/app/(app)/examples/page.tsx +0 -1
- package/template/app/(app)/layout.tsx +17 -4
- package/template/app/(app)/question-bank/layout.tsx +1 -1
- package/template/app/(app)/question-bank/new/page.tsx +11 -24
- package/template/app/globals.css +13 -1972
- 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/compliance-table.tsx +240 -384
- 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-view-dashboard-charts-compliance.tsx +2 -2
- package/template/components/data-view-dashboard-charts-team.tsx +2 -2
- package/template/components/data-view-dashboard-charts.tsx +2 -2
- 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 +42 -1
- 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 -0
- 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 -60
- 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/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/hub-tree-panel-view.tsx +2 -2
- 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/new-placement-back-btn.tsx +1 -1
- package/template/components/new-placement-form.tsx +63 -189
- package/template/components/new-question-composer.tsx +432 -402
- 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/placement-board-card.tsx +71 -83
- package/template/components/placements-board-view.tsx +3 -10
- package/template/components/placements-client.tsx +10 -42
- package/template/components/placements-list-view.tsx +22 -69
- package/template/components/placements-table-columns.tsx +8 -438
- package/template/components/placements-table.tsx +588 -1296
- package/template/components/product-switcher.tsx +1 -1
- package/template/components/product-wordmark.tsx +2 -1
- package/template/components/question-bank-client.tsx +4 -1
- package/template/components/question-bank-hub-client.tsx +1 -1
- package/template/components/question-bank-new-folder-sheet.tsx +2 -2
- package/template/components/question-bank-secondary-nav.tsx +3 -3
- package/template/components/question-bank-table.tsx +294 -526
- package/template/components/rotations-empty-state.tsx +1 -1
- package/template/components/rotations-panel-activator.tsx +1 -1
- package/template/components/settings-appearance-card.tsx +1 -1
- package/template/components/{app-sidebar-dynamic.tsx → sidebar/app-sidebar-dynamic.tsx} +1 -1
- package/template/components/{app-sidebar.tsx → sidebar/app-sidebar.tsx} +4 -4
- package/template/components/sidebar/index.ts +16 -0
- package/template/components/{secondary-nav.tsx → sidebar/secondary-nav.tsx} +2 -2
- package/template/components/{secondary-panel.tsx → sidebar/secondary-panel.tsx} +6 -3
- package/template/components/{sidebar-auto-collapse.tsx → sidebar/sidebar-auto-collapse.tsx} +6 -2
- package/template/components/{sidebar-shell.tsx → sidebar/sidebar-shell.tsx} +1 -1
- package/template/components/site-header.tsx +1 -1
- package/template/components/{sites-all-client.tsx → sites-client.tsx} +1 -1
- package/template/components/sites-table.tsx +124 -257
- 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 -249
- package/template/components/table-properties/drawer.tsx +1 -1105
- 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/team-table.tsx +242 -382
- 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/list-page.tsx +1 -584
- package/template/components/templates/nested-secondary-panel-shell.tsx +1 -62
- package/template/components/templates/new-focus-template.tsx +659 -0
- package/template/components/templates/secondary-panel-hub-template.tsx +1 -1
- 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/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/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 +14 -14
- 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/token-taxonomy.md +416 -0
- package/template/eslint.config.mjs +27 -0
- package/template/hooks/use-secondary-panel-hub-nav.ts +1 -1
- package/template/lib/command-menu-config.ts +0 -1
- package/template/lib/compliance-supported-views.ts +10 -0
- package/template/lib/conditional-rule-match.ts +6 -97
- package/template/lib/data-list-display-options.ts +1 -35
- package/template/lib/data-list-view-registry.ts +1 -0
- package/template/lib/data-list-view-surface.ts +1 -69
- package/template/lib/data-list-view.ts +1 -38
- package/template/lib/dev-log.ts +1 -8
- package/template/lib/editable-target.ts +1 -10
- package/template/lib/hub-connected-view-renderers.ts +58 -0
- package/template/lib/list-hub-supported-views.ts +10 -0
- package/template/lib/list-page-table-properties.ts +1 -52
- package/template/lib/mock/navigation.tsx +0 -8
- package/template/lib/mock/placements.ts +0 -7
- package/template/lib/placement-board-card-layout.ts +41 -41
- package/template/lib/placements-supported-views.ts +12 -0
- package/template/lib/question-bank-supported-views.ts +12 -0
- 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/sites-supported-views.ts +10 -0
- package/template/lib/team-supported-views.ts +10 -0
- package/template/package.json +1 -0
- package/template/tests/setup.ts +25 -0
- package/src/theme.css +0 -1132
- package/template/app/(app)/data-list/[id]/page.tsx +0 -44
- package/template/app/(app)/data-list/new/page.tsx +0 -34
- package/template/app/(app)/data-list/page.tsx +0 -10
- package/template/components/compliance-list-view.tsx +0 -54
- package/template/components/dashboard-onboarding-gallery.tsx +0 -13
- package/template/components/dashboard-onboarding.tsx +0 -21
- package/template/components/question-bank-list-view.tsx +0 -53
- package/template/components/section-cards.tsx +0 -106
- package/template/components/sites-list-view.tsx +0 -42
- package/template/components/team-list-view.tsx +0 -59
- package/template/lib/placement-lifecycle.ts +0 -5
- /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
- /package/template/components/{sidebar-auto-open.tsx → sidebar/sidebar-auto-open.tsx} +0 -0
|
@@ -1,192 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* ListPageBoardCard — single board-card shell for all list hubs (Placements, Team, Compliance, …).
|
|
5
|
-
*
|
|
6
|
-
* Information hierarchy (top → bottom):
|
|
7
|
-
* 1. **Title row** — `ListPageBoardCardTitleRow` — primary label (`text-sm font-semibold`), optional `trailing` (`ListPageBoardCardAvatar` initials chip, same as Placements).
|
|
8
|
-
* 2. **Badge row** — `ListPageBoardCardBadgeRow` — optional status / tags (`flex-wrap`).
|
|
9
|
-
* 3. **Body** — `ListPageBoardCardBody` — primary facts: icon rows, two-line blocks (`BoardCardIconRow` / `BoardCardTwoLineBlock` from board-card-primitives).
|
|
10
|
-
* 4. **Secondary** — `ListPageBoardCardSecondary` — optional muted supporting line (`text-xs text-muted-foreground`).
|
|
11
|
-
*
|
|
12
|
-
* Styling matches **`BoardPlacementCard`**: `Card` `size="sm"`, ring, hover shadow, optional **new** ring accent.
|
|
13
|
-
*
|
|
14
|
-
* **Interaction:** Pass **`onClick`** (e.g. `BoardPlacementCard`) or **`interactive`** when the card is
|
|
15
|
-
* wrapped in `<Link>` / router navigation so hover/cursor match placement board tiles.
|
|
16
|
-
*
|
|
17
|
-
* **Layouts:**
|
|
18
|
-
* - **`stack`** (default) — kanban / grid tile: compose with `ListPageBoardCardHeader`, title row, body.
|
|
19
|
-
* - **`row`** — full-width list row: optional **`leading`**, **`children`** as main column, optional **`rowEnd`**.
|
|
20
|
-
* Use **`rowContainerClassName`** for responsive shells (e.g. `flex-col sm:flex-row`).
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import * as React from "react"
|
|
24
|
-
import { AvatarInitials } from "@/components/ui/avatar"
|
|
25
|
-
import { cn } from "@/lib/utils"
|
|
26
|
-
import { Card, CardHeader, CardTitle } from "@/components/ui/card"
|
|
27
|
-
|
|
28
|
-
export type ListPageBoardCardLayout = "stack" | "row"
|
|
29
|
-
|
|
30
|
-
export type ListPageBoardCardProps = {
|
|
31
|
-
layout?: ListPageBoardCardLayout
|
|
32
|
-
/** `row` only — avatar / icon column. */
|
|
33
|
-
leading?: React.ReactNode
|
|
34
|
-
/** `row` only — status + chevron, etc. */
|
|
35
|
-
rowEnd?: React.ReactNode
|
|
36
|
-
/**
|
|
37
|
-
* `row` only — flex shell for the card (default `flex flex-row items-start gap-3`).
|
|
38
|
-
* Use e.g. `flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-4` for compliance-style rows.
|
|
39
|
-
*/
|
|
40
|
-
rowContainerClassName?: string
|
|
41
|
-
/** Entire card is clickable (e.g. open detail) — enables pointer + hover shadow. */
|
|
42
|
-
onClick?: () => void
|
|
43
|
-
/**
|
|
44
|
-
* Same hover/cursor as `onClick` when the parent uses `<Link>` or `button` instead of Card click
|
|
45
|
-
* (avoids nested interactive targets and keeps keyboard focus on the link).
|
|
46
|
-
*/
|
|
47
|
-
interactive?: boolean
|
|
48
|
-
className?: string
|
|
49
|
-
style?: React.CSSProperties
|
|
50
|
-
/** Subtle brand ring — e.g. newly created row. */
|
|
51
|
-
isNew?: boolean
|
|
52
|
-
children: React.ReactNode
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export function ListPageBoardCard({
|
|
56
|
-
layout = "stack",
|
|
57
|
-
leading,
|
|
58
|
-
rowEnd,
|
|
59
|
-
rowContainerClassName,
|
|
60
|
-
onClick,
|
|
61
|
-
interactive = false,
|
|
62
|
-
className,
|
|
63
|
-
style,
|
|
64
|
-
isNew,
|
|
65
|
-
children,
|
|
66
|
-
}: ListPageBoardCardProps) {
|
|
67
|
-
const isRow = layout === "row"
|
|
68
|
-
const isInteractive = Boolean(onClick) || interactive
|
|
69
|
-
const rowShell = rowContainerClassName ?? "flex flex-row items-start gap-3"
|
|
70
|
-
|
|
71
|
-
return (
|
|
72
|
-
<Card
|
|
73
|
-
size="sm"
|
|
74
|
-
className={cn(
|
|
75
|
-
"w-full min-w-0 transition-shadow",
|
|
76
|
-
!isRow && "gap-1",
|
|
77
|
-
isRow && cn("!gap-0", rowShell, "px-4 py-3"),
|
|
78
|
-
isInteractive && "cursor-pointer hover:shadow-md",
|
|
79
|
-
isNew && "ring-brand/30",
|
|
80
|
-
className,
|
|
81
|
-
)}
|
|
82
|
-
style={style}
|
|
83
|
-
onClick={onClick}
|
|
84
|
-
>
|
|
85
|
-
{isRow ? (
|
|
86
|
-
<>
|
|
87
|
-
{leading}
|
|
88
|
-
<div className="min-w-0 flex-1">{children}</div>
|
|
89
|
-
{rowEnd}
|
|
90
|
-
</>
|
|
91
|
-
) : (
|
|
92
|
-
children
|
|
93
|
-
)}
|
|
94
|
-
</Card>
|
|
95
|
-
)
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/** Preferred public name — same component as `ListPageBoardCard`. */
|
|
99
|
-
export const HubRecordCard = ListPageBoardCard
|
|
100
|
-
|
|
101
|
-
export function ListPageBoardCardHeader({
|
|
102
|
-
className,
|
|
103
|
-
children,
|
|
104
|
-
}: {
|
|
105
|
-
className?: string
|
|
106
|
-
children: React.ReactNode
|
|
107
|
-
}) {
|
|
108
|
-
return <CardHeader className={cn("gap-2 pb-2", className)}>{children}</CardHeader>
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Level 1 — Primary title (dominant text on the card).
|
|
113
|
-
*/
|
|
114
|
-
export function ListPageBoardCardTitleRow({
|
|
115
|
-
title,
|
|
116
|
-
titleClassName,
|
|
117
|
-
trailing,
|
|
118
|
-
}: {
|
|
119
|
-
title: React.ReactNode
|
|
120
|
-
/** Extra classes on the title (e.g. line-clamp from `lineClampClass`). */
|
|
121
|
-
titleClassName?: string
|
|
122
|
-
/** End-aligned: avatar, icon, etc. */
|
|
123
|
-
trailing?: React.ReactNode
|
|
124
|
-
}) {
|
|
125
|
-
return (
|
|
126
|
-
<div className="flex min-w-0 items-start justify-between gap-2">
|
|
127
|
-
<div className="min-w-0 flex-1">
|
|
128
|
-
<CardTitle
|
|
129
|
-
className={cn(
|
|
130
|
-
"break-words text-sm font-semibold leading-snug text-foreground",
|
|
131
|
-
titleClassName,
|
|
132
|
-
)}
|
|
133
|
-
>
|
|
134
|
-
{title}
|
|
135
|
-
</CardTitle>
|
|
136
|
-
</div>
|
|
137
|
-
{trailing}
|
|
138
|
-
</div>
|
|
139
|
-
)
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/** Initials avatar — Radix `Avatar` + `--avatar-initials-*` tokens (same as tables / placement board). */
|
|
143
|
-
export function ListPageBoardCardAvatar({
|
|
144
|
-
initials,
|
|
145
|
-
className,
|
|
146
|
-
}: {
|
|
147
|
-
initials: string
|
|
148
|
-
className?: string
|
|
149
|
-
}) {
|
|
150
|
-
return (
|
|
151
|
-
<AvatarInitials
|
|
152
|
-
initials={initials}
|
|
153
|
-
className={cn("size-7 shrink-0 text-xs", className)}
|
|
154
|
-
fallbackClassName="text-xs"
|
|
155
|
-
/>
|
|
156
|
-
)
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Level 2 — Status / metadata chips (below title, above primary body).
|
|
161
|
-
*/
|
|
162
|
-
export function ListPageBoardCardBadgeRow({ children }: { children: React.ReactNode }) {
|
|
163
|
-
return <div className="flex min-w-0 flex-wrap items-center gap-1.5">{children}</div>
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Level 3 — Main facts: compose with `BoardCardIconRow`, `BoardCardTwoLineBlock`, etc.
|
|
168
|
-
*/
|
|
169
|
-
export function ListPageBoardCardBody({
|
|
170
|
-
className,
|
|
171
|
-
children,
|
|
172
|
-
}: {
|
|
173
|
-
className?: string
|
|
174
|
-
children: React.ReactNode
|
|
175
|
-
}) {
|
|
176
|
-
return <div className={cn("flex flex-col gap-2", className)}>{children}</div>
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Level 4 — Optional muted supporting line (caption, hint, extra context).
|
|
181
|
-
*/
|
|
182
|
-
export function ListPageBoardCardSecondary({
|
|
183
|
-
className,
|
|
184
|
-
children,
|
|
185
|
-
}: {
|
|
186
|
-
className?: string
|
|
187
|
-
children: React.ReactNode
|
|
188
|
-
}) {
|
|
189
|
-
return (
|
|
190
|
-
<p className={cn("text-xs text-muted-foreground leading-snug", className)}>{children}</p>
|
|
191
|
-
)
|
|
192
|
-
}
|
|
1
|
+
export * from "@exxatdesignux/ui/components/data-views/list-page-board-card"
|
|
@@ -1,122 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* ListPageBoardTemplate — reusable kanban shell for list pages (Team, custom hubs).
|
|
5
|
-
*
|
|
6
|
-
* - Columns are defined with predicates; each row is placed in the **first** matching column.
|
|
7
|
-
* - Cards are rendered by the caller (`renderCard`) — compose **`ListPageBoardCard`** + primitives (`BoardCardTwoLineBlock`, etc.).
|
|
8
|
-
* - Placements keeps richer column headers (search, menus); this template is for simpler hubs.
|
|
9
|
-
*
|
|
10
|
-
* @see `docs/data-views-pattern.md` — board primitives
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import * as React from "react"
|
|
14
|
-
import { cn } from "@/lib/utils"
|
|
15
|
-
import { Badge } from "@/components/ui/badge"
|
|
16
|
-
import { BoardNewCardPlaceholder } from "@/components/data-views/board-card-primitives"
|
|
17
|
-
|
|
18
|
-
export type ListPageBoardColumnDef<T> = {
|
|
19
|
-
id: string
|
|
20
|
-
label: string
|
|
21
|
-
/** Shown beside the title on larger breakpoints */
|
|
22
|
-
description?: string
|
|
23
|
-
/** First matching column wins; columns should be mutually exclusive for most domains. */
|
|
24
|
-
filter: (row: T) => boolean
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export type ListPageBoardTemplateProps<T> = {
|
|
28
|
-
columns: ListPageBoardColumnDef<T>[]
|
|
29
|
-
rows: T[]
|
|
30
|
-
getRowKey: (row: T) => string | number
|
|
31
|
-
renderCard: (row: T) => React.ReactNode
|
|
32
|
-
/** Tailwind classes for the count pill, keyed by column `id` */
|
|
33
|
-
columnCountBadgeClassName?: Record<string, string>
|
|
34
|
-
/** Copy when a column has no rows */
|
|
35
|
-
emptyColumnLabel?: string
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function ListPageBoardColumnHeader({
|
|
39
|
-
label,
|
|
40
|
-
description,
|
|
41
|
-
count,
|
|
42
|
-
badgeClassName,
|
|
43
|
-
}: {
|
|
44
|
-
label: string
|
|
45
|
-
description?: string
|
|
46
|
-
count: number
|
|
47
|
-
badgeClassName?: string
|
|
48
|
-
}) {
|
|
49
|
-
return (
|
|
50
|
-
<div className="flex items-center justify-between border-b border-border px-3 py-2.5">
|
|
51
|
-
<div className="flex min-w-0 items-center gap-2">
|
|
52
|
-
<span className="truncate text-sm font-semibold text-foreground">{label}</span>
|
|
53
|
-
{description ? (
|
|
54
|
-
<span className="hidden text-xs text-muted-foreground sm:inline">{description}</span>
|
|
55
|
-
) : null}
|
|
56
|
-
</div>
|
|
57
|
-
<Badge
|
|
58
|
-
variant="outline"
|
|
59
|
-
className={cn(
|
|
60
|
-
"inline-flex h-6 min-w-6 shrink-0 items-center justify-center border-0 bg-muted/70 px-2 text-xs font-semibold tabular-nums text-foreground",
|
|
61
|
-
badgeClassName,
|
|
62
|
-
)}
|
|
63
|
-
aria-label={`${count} ${count === 1 ? "item" : "items"}`}
|
|
64
|
-
>
|
|
65
|
-
{count}
|
|
66
|
-
</Badge>
|
|
67
|
-
</div>
|
|
68
|
-
)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export function ListPageBoardTemplate<T>({
|
|
72
|
-
columns,
|
|
73
|
-
rows,
|
|
74
|
-
getRowKey,
|
|
75
|
-
renderCard,
|
|
76
|
-
columnCountBadgeClassName = {},
|
|
77
|
-
emptyColumnLabel = "No items",
|
|
78
|
-
}: ListPageBoardTemplateProps<T>) {
|
|
79
|
-
const grouped = React.useMemo(() => {
|
|
80
|
-
const map: Record<string, T[]> = {}
|
|
81
|
-
for (const col of columns) map[col.id] = []
|
|
82
|
-
for (const row of rows) {
|
|
83
|
-
for (const col of columns) {
|
|
84
|
-
if (col.filter(row)) {
|
|
85
|
-
map[col.id].push(row)
|
|
86
|
-
break
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return map
|
|
91
|
-
}, [columns, rows])
|
|
92
|
-
|
|
93
|
-
return (
|
|
94
|
-
<div className="flex min-h-0 flex-1 gap-3 overflow-x-auto px-4 pb-6 pt-2 lg:px-6">
|
|
95
|
-
{columns.map(col => (
|
|
96
|
-
<div
|
|
97
|
-
key={col.id}
|
|
98
|
-
className="flex w-72 shrink-0 flex-col overflow-hidden rounded-xl border border-border bg-muted/30"
|
|
99
|
-
>
|
|
100
|
-
<ListPageBoardColumnHeader
|
|
101
|
-
label={col.label}
|
|
102
|
-
description={col.description}
|
|
103
|
-
count={grouped[col.id]?.length ?? 0}
|
|
104
|
-
badgeClassName={columnCountBadgeClassName[col.id]}
|
|
105
|
-
/>
|
|
106
|
-
|
|
107
|
-
<div className="flex flex-1 flex-col gap-2 overflow-y-auto p-2">
|
|
108
|
-
<BoardNewCardPlaceholder position="above" />
|
|
109
|
-
|
|
110
|
-
{(grouped[col.id]?.length ?? 0) === 0 ? (
|
|
111
|
-
<p className="py-6 text-center text-xs text-muted-foreground">{emptyColumnLabel}</p>
|
|
112
|
-
) : (
|
|
113
|
-
grouped[col.id]!.map(row => <React.Fragment key={String(getRowKey(row))}>{renderCard(row)}</React.Fragment>)
|
|
114
|
-
)}
|
|
115
|
-
|
|
116
|
-
<BoardNewCardPlaceholder position="below" />
|
|
117
|
-
</div>
|
|
118
|
-
</div>
|
|
119
|
-
))}
|
|
120
|
-
</div>
|
|
121
|
-
)
|
|
122
|
-
}
|
|
1
|
+
export * from "@exxatdesignux/ui/components/data-views/list-page-board-template"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "@exxatdesignux/ui/components/data-views/list-page-connected-view-body"
|
|
@@ -1,39 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import * as React from "react"
|
|
4
|
-
import { cn } from "@/lib/utils"
|
|
5
|
-
|
|
6
|
-
export interface ListPageSplitDetailsPlaceholderProps {
|
|
7
|
-
title?: string
|
|
8
|
-
description?: React.ReactNode
|
|
9
|
-
className?: string
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Empty right pane for split hubs — flat `bg-card` to match Miller / tree columns.
|
|
14
|
-
*/
|
|
15
|
-
export function ListPageSplitDetailsPlaceholder({
|
|
16
|
-
title = "Nothing selected",
|
|
17
|
-
description,
|
|
18
|
-
className,
|
|
19
|
-
}: ListPageSplitDetailsPlaceholderProps) {
|
|
20
|
-
return (
|
|
21
|
-
<div
|
|
22
|
-
className={cn(
|
|
23
|
-
"flex h-full min-h-0 flex-col items-center justify-center bg-card px-6 py-10 text-center",
|
|
24
|
-
className,
|
|
25
|
-
)}
|
|
26
|
-
>
|
|
27
|
-
<div className="mb-4 flex size-14 items-center justify-center rounded-2xl border border-dashed border-border/70 bg-card">
|
|
28
|
-
<i
|
|
29
|
-
className="fa-light fa-sidebar text-[1.65rem] leading-none text-muted-foreground/70"
|
|
30
|
-
aria-hidden="true"
|
|
31
|
-
/>
|
|
32
|
-
</div>
|
|
33
|
-
<p className="text-sm font-medium text-foreground">{title}</p>
|
|
34
|
-
{description ? (
|
|
35
|
-
<div className="mt-1.5 max-w-[16rem] text-xs leading-relaxed text-muted-foreground">{description}</div>
|
|
36
|
-
) : null}
|
|
37
|
-
</div>
|
|
38
|
-
)
|
|
39
|
-
}
|
|
1
|
+
export * from "@exxatdesignux/ui/components/data-views/list-page-split-details-placeholder"
|
|
@@ -1,60 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Shared **centered** chrome for list-hub split surfaces (finder / tree / multi-column explorers).
|
|
5
|
-
*
|
|
6
|
-
* Composes `ListPageViewFrame` (gutter + max width) with a single bordered card + fixed viewport
|
|
7
|
-
* height so panel and tree views match across routes (`AGENTS.md` §4.5).
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import * as React from "react"
|
|
11
|
-
import { cn } from "@/lib/utils"
|
|
12
|
-
import {
|
|
13
|
-
ListPageViewFrame,
|
|
14
|
-
LIST_PAGE_VIEW_FRAME_GUTTER,
|
|
15
|
-
LIST_PAGE_VIEW_FRAME_MAX_WIDE,
|
|
16
|
-
} from "@/components/data-views/list-page-view-frame"
|
|
17
|
-
|
|
18
|
-
/** Default height band for split views under `ListPageTemplate` + toolbar. */
|
|
19
|
-
export const LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE: React.CSSProperties = {
|
|
20
|
-
height: "calc(100vh - 280px)",
|
|
21
|
-
minHeight: 420,
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const SURFACE_CLASS =
|
|
25
|
-
"flex min-h-0 flex-1 flex-col overflow-hidden rounded-xl border border-border bg-card"
|
|
26
|
-
|
|
27
|
-
export interface ListPageSplitHubChromeProps {
|
|
28
|
-
children: React.ReactNode
|
|
29
|
-
"aria-label"?: string
|
|
30
|
-
gutterClassName?: string
|
|
31
|
-
maxWidthClassName?: string
|
|
32
|
-
/** Override default split viewport height / min-height */
|
|
33
|
-
surfaceStyle?: React.CSSProperties
|
|
34
|
-
surfaceClassName?: string
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function ListPageSplitHubChrome({
|
|
38
|
-
children,
|
|
39
|
-
"aria-label": ariaLabel,
|
|
40
|
-
gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,
|
|
41
|
-
maxWidthClassName = LIST_PAGE_VIEW_FRAME_MAX_WIDE,
|
|
42
|
-
surfaceStyle,
|
|
43
|
-
surfaceClassName,
|
|
44
|
-
}: ListPageSplitHubChromeProps) {
|
|
45
|
-
return (
|
|
46
|
-
<ListPageViewFrame
|
|
47
|
-
gutterClassName={gutterClassName}
|
|
48
|
-
maxWidthClassName={maxWidthClassName}
|
|
49
|
-
className="flex min-h-0 flex-1 flex-col"
|
|
50
|
-
>
|
|
51
|
-
<div
|
|
52
|
-
className={cn(SURFACE_CLASS, surfaceClassName)}
|
|
53
|
-
style={{ ...LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE, ...surfaceStyle }}
|
|
54
|
-
aria-label={ariaLabel}
|
|
55
|
-
>
|
|
56
|
-
{children}
|
|
57
|
-
</div>
|
|
58
|
-
</ListPageViewFrame>
|
|
59
|
-
)
|
|
60
|
-
}
|
|
1
|
+
export * from "@exxatdesignux/ui/components/data-views/list-page-split-hub-chrome"
|
|
@@ -1,16 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Shared layout tokens for list-hub split surfaces (Miller columns, tree + details).
|
|
3
|
-
* Keeps Question bank panel / tree and generic `FinderPanelView` visually aligned.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/** `ResizableHandle` between miller / tree columns — matches Question bank panel. */
|
|
7
|
-
export const LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS =
|
|
8
|
-
"w-1 bg-border/40 hover:bg-brand/20 transition-colors"
|
|
9
|
-
|
|
10
|
-
/** Primary column stack (scope list, folder list, record list, …). */
|
|
11
|
-
export const LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS =
|
|
12
|
-
"flex min-h-0 min-w-0 flex-col bg-card"
|
|
13
|
-
|
|
14
|
-
/** Right-hand inspector / detail column shell. */
|
|
15
|
-
export const LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS =
|
|
16
|
-
"flex min-h-0 min-w-0 flex-col bg-card"
|
|
1
|
+
export * from "@exxatdesignux/ui/components/data-views/list-page-split-hub-tokens"
|
|
@@ -1,31 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import * as React from "react"
|
|
4
|
-
import { cn } from "@/lib/utils"
|
|
5
|
-
|
|
6
|
-
export interface ListPageTreeColumnHeaderProps {
|
|
7
|
-
title: string
|
|
8
|
-
/** Right side (e.g. icon buttons) — keep touch targets ≥ 24px */
|
|
9
|
-
trailing?: React.ReactNode
|
|
10
|
-
className?: string
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Shared left-column header for tree / outline surfaces — matches Question bank “Questions” bar.
|
|
15
|
-
*/
|
|
16
|
-
export function ListPageTreeColumnHeader({
|
|
17
|
-
title,
|
|
18
|
-
trailing,
|
|
19
|
-
className,
|
|
20
|
-
}: ListPageTreeColumnHeaderProps) {
|
|
21
|
-
return (
|
|
22
|
-
<div className={cn("shrink-0 border-b border-border/50 bg-card px-3 py-2", className)}>
|
|
23
|
-
<div className="flex h-9 items-center justify-between gap-2">
|
|
24
|
-
<h3 className="min-w-0 flex-1 truncate text-sm font-medium text-foreground">{title}</h3>
|
|
25
|
-
{trailing ? (
|
|
26
|
-
<div className="flex shrink-0 items-center gap-0.5">{trailing}</div>
|
|
27
|
-
) : null}
|
|
28
|
-
</div>
|
|
29
|
-
</div>
|
|
30
|
-
)
|
|
31
|
-
}
|
|
1
|
+
export * from "@exxatdesignux/ui/components/data-views/list-page-tree-column-header"
|
|
@@ -1,91 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Generic two-pane layout: scrollable **tree / outline** column + **details** column,
|
|
5
|
-
* with persisted split sizes (`ResizablePanelGroup` `id`) and shared **split hub chrome**
|
|
6
|
-
* (`ListPageSplitHubChrome`) so tree views match finder / folder panels across the app.
|
|
7
|
-
*
|
|
8
|
-
* Domain hubs pass `tree` and `details` nodes; this module stays entity-agnostic.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import * as React from "react"
|
|
12
|
-
import {
|
|
13
|
-
ResizableHandle,
|
|
14
|
-
ResizablePanel,
|
|
15
|
-
ResizablePanelGroup,
|
|
16
|
-
} from "@/components/ui/resizable"
|
|
17
|
-
import { ListPageSplitHubChrome } from "@/components/data-views/list-page-split-hub-chrome"
|
|
18
|
-
import {
|
|
19
|
-
LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS,
|
|
20
|
-
LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS,
|
|
21
|
-
LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS,
|
|
22
|
-
} from "@/components/data-views/list-page-split-hub-tokens"
|
|
23
|
-
import {
|
|
24
|
-
LIST_PAGE_VIEW_FRAME_GUTTER,
|
|
25
|
-
LIST_PAGE_VIEW_FRAME_MAX_WIDE,
|
|
26
|
-
} from "@/components/data-views/list-page-view-frame"
|
|
27
|
-
|
|
28
|
-
export interface ListPageTreePanelShellProps {
|
|
29
|
-
/** Stable id for `react-resizable-panels` layout persistence (per hub / route). */
|
|
30
|
-
resizableGroupId: string
|
|
31
|
-
/** Left column (tree chrome + body). */
|
|
32
|
-
tree: React.ReactNode
|
|
33
|
-
/** Right column (detail / inspector). */
|
|
34
|
-
details: React.ReactNode
|
|
35
|
-
/** Accessible name for the split surface, e.g. “Curriculum tree and details”. */
|
|
36
|
-
ariaLabel: string
|
|
37
|
-
treePanelId?: string
|
|
38
|
-
detailsPanelId?: string
|
|
39
|
-
treeDefaultSize?: string
|
|
40
|
-
treeMinSize?: string
|
|
41
|
-
treeMaxSize?: string
|
|
42
|
-
detailsDefaultSize?: string
|
|
43
|
-
detailsMinSize?: string
|
|
44
|
-
gutterClassName?: string
|
|
45
|
-
maxWidthClassName?: string
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export function ListPageTreePanelShell({
|
|
49
|
-
resizableGroupId,
|
|
50
|
-
tree,
|
|
51
|
-
details,
|
|
52
|
-
ariaLabel,
|
|
53
|
-
treePanelId = "tree",
|
|
54
|
-
detailsPanelId = "details",
|
|
55
|
-
treeDefaultSize = "40%",
|
|
56
|
-
treeMinSize = "20%",
|
|
57
|
-
treeMaxSize = "60%",
|
|
58
|
-
detailsDefaultSize = "60%",
|
|
59
|
-
detailsMinSize = "30%",
|
|
60
|
-
gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,
|
|
61
|
-
maxWidthClassName = LIST_PAGE_VIEW_FRAME_MAX_WIDE,
|
|
62
|
-
}: ListPageTreePanelShellProps) {
|
|
63
|
-
return (
|
|
64
|
-
<ListPageSplitHubChrome
|
|
65
|
-
aria-label={ariaLabel}
|
|
66
|
-
gutterClassName={gutterClassName}
|
|
67
|
-
maxWidthClassName={maxWidthClassName}
|
|
68
|
-
>
|
|
69
|
-
<ResizablePanelGroup id={resizableGroupId} direction="horizontal" className="h-full min-h-0 w-full flex-1">
|
|
70
|
-
<ResizablePanel
|
|
71
|
-
id={treePanelId}
|
|
72
|
-
defaultSize={treeDefaultSize}
|
|
73
|
-
minSize={treeMinSize}
|
|
74
|
-
maxSize={treeMaxSize}
|
|
75
|
-
className={LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS}
|
|
76
|
-
>
|
|
77
|
-
{tree}
|
|
78
|
-
</ResizablePanel>
|
|
79
|
-
<ResizableHandle withHandle className={LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS} />
|
|
80
|
-
<ResizablePanel
|
|
81
|
-
id={detailsPanelId}
|
|
82
|
-
defaultSize={detailsDefaultSize}
|
|
83
|
-
minSize={detailsMinSize}
|
|
84
|
-
className={LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS}
|
|
85
|
-
>
|
|
86
|
-
{details}
|
|
87
|
-
</ResizablePanel>
|
|
88
|
-
</ResizablePanelGroup>
|
|
89
|
-
</ListPageSplitHubChrome>
|
|
90
|
-
)
|
|
91
|
-
}
|
|
1
|
+
export * from "@exxatdesignux/ui/components/data-views/list-page-tree-panel-shell"
|
|
@@ -1,53 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* **MUST** be used instead of ad-hoc `mx-4 lg:mx-6` + `mx-auto max-w-*` pairs on each page — see
|
|
8
|
-
* `AGENTS.md` §4.5 and `.cursor/rules/exxat-list-page-view-shells.mdc`.
|
|
9
|
-
*
|
|
10
|
-
* **MUST NOT** wrap `DataTable` when its toolbar already applies the same inset (avoid double gutter);
|
|
11
|
-
* use this for **non-table** view branches or **sections below** the shared toolbar.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import * as React from "react"
|
|
15
|
-
import { cn } from "@/lib/utils"
|
|
16
|
-
|
|
17
|
-
/** Default horizontal rhythm for view bodies under `ListPageTemplate` (matches `FolderGridView`). */
|
|
18
|
-
export const LIST_PAGE_VIEW_FRAME_GUTTER = "mx-4 mb-6 lg:mx-6"
|
|
19
|
-
|
|
20
|
-
/** Typical max width for icon grids / dense tile views on ultra-wide monitors. */
|
|
21
|
-
export const LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID = "max-w-6xl"
|
|
22
|
-
|
|
23
|
-
/** Slightly wider shell when a view includes toolbar + breadcrumbs + grid (e.g. OS folder explorer). */
|
|
24
|
-
export const LIST_PAGE_VIEW_FRAME_MAX_WIDE = "max-w-7xl"
|
|
25
|
-
|
|
26
|
-
export interface ListPageViewFrameProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
27
|
-
children: React.ReactNode
|
|
28
|
-
/**
|
|
29
|
-
* When set, children are wrapped in `mx-auto w-full min-w-0` + this max-width so the block stays
|
|
30
|
-
* centered inside the primary page column.
|
|
31
|
-
*/
|
|
32
|
-
maxWidthClassName?: string
|
|
33
|
-
/** Override outer gutter; default `LIST_PAGE_VIEW_FRAME_GUTTER`. */
|
|
34
|
-
gutterClassName?: string
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function ListPageViewFrame({
|
|
38
|
-
children,
|
|
39
|
-
className,
|
|
40
|
-
maxWidthClassName,
|
|
41
|
-
gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,
|
|
42
|
-
...rest
|
|
43
|
-
}: ListPageViewFrameProps) {
|
|
44
|
-
return (
|
|
45
|
-
<div className={cn(gutterClassName, className)} {...rest}>
|
|
46
|
-
{maxWidthClassName ? (
|
|
47
|
-
<div className={cn("mx-auto w-full min-w-0", maxWidthClassName)}>{children}</div>
|
|
48
|
-
) : (
|
|
49
|
-
children
|
|
50
|
-
)}
|
|
51
|
-
</div>
|
|
52
|
-
)
|
|
53
|
-
}
|
|
1
|
+
// ListPageViewFrame was promoted to `@exxatdesignux/ui` on 2026-05-20.
|
|
2
|
+
// This shim keeps every existing
|
|
3
|
+
// `import … from "@/components/data-views/list-page-view-frame"` site
|
|
4
|
+
// working — including the `data-views/index.ts` barrel re-export.
|
|
5
|
+
export * from "@exxatdesignux/ui/components/list-page-view-frame"
|