@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
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
type ListPageBoardCardLayout = "stack" | "row";
|
|
5
|
+
type ListPageBoardCardProps = {
|
|
6
|
+
layout?: ListPageBoardCardLayout;
|
|
7
|
+
/** `row` only — avatar / icon column. */
|
|
8
|
+
leading?: React.ReactNode;
|
|
9
|
+
/** `row` only — status + chevron, etc. */
|
|
10
|
+
rowEnd?: React.ReactNode;
|
|
11
|
+
/**
|
|
12
|
+
* `row` only — flex shell for the card (default `flex flex-row items-start gap-3`).
|
|
13
|
+
* Use e.g. `flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-4` for compliance-style rows.
|
|
14
|
+
*/
|
|
15
|
+
rowContainerClassName?: string;
|
|
16
|
+
/** Entire card is clickable (e.g. open detail) — enables pointer + hover shadow. */
|
|
17
|
+
onClick?: () => void;
|
|
18
|
+
/**
|
|
19
|
+
* Same hover/cursor as `onClick` when the parent uses `<Link>` or `button` instead of Card click
|
|
20
|
+
* (avoids nested interactive targets and keeps keyboard focus on the link).
|
|
21
|
+
*/
|
|
22
|
+
interactive?: boolean;
|
|
23
|
+
className?: string;
|
|
24
|
+
style?: React.CSSProperties;
|
|
25
|
+
/** Subtle brand ring — e.g. newly created row. */
|
|
26
|
+
isNew?: boolean;
|
|
27
|
+
children: React.ReactNode;
|
|
28
|
+
};
|
|
29
|
+
declare function ListPageBoardCard({ layout, leading, rowEnd, rowContainerClassName, onClick, interactive, className, style, isNew, children, }: ListPageBoardCardProps): react_jsx_runtime.JSX.Element;
|
|
30
|
+
/** Preferred public name — same component as `ListPageBoardCard`. */
|
|
31
|
+
declare const HubRecordCard: typeof ListPageBoardCard;
|
|
32
|
+
declare function ListPageBoardCardHeader({ className, children, }: {
|
|
33
|
+
className?: string;
|
|
34
|
+
children: React.ReactNode;
|
|
35
|
+
}): react_jsx_runtime.JSX.Element;
|
|
36
|
+
/**
|
|
37
|
+
* Level 1 — Primary title (dominant text on the card).
|
|
38
|
+
*/
|
|
39
|
+
declare function ListPageBoardCardTitleRow({ title, titleClassName, trailing, }: {
|
|
40
|
+
title: React.ReactNode;
|
|
41
|
+
/** Extra classes on the title (e.g. line-clamp from `lineClampClass`). */
|
|
42
|
+
titleClassName?: string;
|
|
43
|
+
/** End-aligned: avatar, icon, etc. */
|
|
44
|
+
trailing?: React.ReactNode;
|
|
45
|
+
}): react_jsx_runtime.JSX.Element;
|
|
46
|
+
/** Initials avatar — Radix `Avatar` + `--avatar-initials-*` tokens (same as tables / placement board). */
|
|
47
|
+
declare function ListPageBoardCardAvatar({ initials, className, }: {
|
|
48
|
+
initials: string;
|
|
49
|
+
className?: string;
|
|
50
|
+
}): react_jsx_runtime.JSX.Element;
|
|
51
|
+
/**
|
|
52
|
+
* Level 2 — Status / metadata chips (below title, above primary body).
|
|
53
|
+
*/
|
|
54
|
+
declare function ListPageBoardCardBadgeRow({ children }: {
|
|
55
|
+
children: React.ReactNode;
|
|
56
|
+
}): react_jsx_runtime.JSX.Element;
|
|
57
|
+
/**
|
|
58
|
+
* Level 3 — Main facts: compose with `BoardCardIconRow`, `BoardCardTwoLineBlock`, etc.
|
|
59
|
+
*/
|
|
60
|
+
declare function ListPageBoardCardBody({ className, children, }: {
|
|
61
|
+
className?: string;
|
|
62
|
+
children: React.ReactNode;
|
|
63
|
+
}): react_jsx_runtime.JSX.Element;
|
|
64
|
+
/**
|
|
65
|
+
* Level 4 — Optional muted supporting line (caption, hint, extra context).
|
|
66
|
+
*/
|
|
67
|
+
declare function ListPageBoardCardSecondary({ className, children, }: {
|
|
68
|
+
className?: string;
|
|
69
|
+
children: React.ReactNode;
|
|
70
|
+
}): react_jsx_runtime.JSX.Element;
|
|
71
|
+
|
|
72
|
+
export { HubRecordCard, ListPageBoardCard, ListPageBoardCardAvatar, ListPageBoardCardBadgeRow, ListPageBoardCardBody, ListPageBoardCardHeader, type ListPageBoardCardLayout, type ListPageBoardCardProps, ListPageBoardCardSecondary, ListPageBoardCardTitleRow };
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import 'lucide-react';
|
|
3
|
+
import { Avatar as Avatar$1 } from 'radix-ui';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
import { clsx } from 'clsx';
|
|
6
|
+
import { twMerge } from 'tailwind-merge';
|
|
7
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
function cn(...inputs) {
|
|
10
|
+
return twMerge(clsx(inputs));
|
|
11
|
+
}
|
|
12
|
+
var avatarRootVariants = cva(
|
|
13
|
+
"group/avatar relative flex shrink-0 overflow-hidden select-none",
|
|
14
|
+
{
|
|
15
|
+
variants: {
|
|
16
|
+
size: {
|
|
17
|
+
sm: "size-6",
|
|
18
|
+
default: "size-8",
|
|
19
|
+
lg: "size-10"
|
|
20
|
+
},
|
|
21
|
+
shape: {
|
|
22
|
+
circle: "rounded-full",
|
|
23
|
+
square: "rounded-none",
|
|
24
|
+
"rounded-sm": "rounded-sm",
|
|
25
|
+
"rounded-md": "rounded-md",
|
|
26
|
+
"rounded-lg": "rounded-lg",
|
|
27
|
+
"rounded-xl": "rounded-xl"
|
|
28
|
+
},
|
|
29
|
+
variant: {
|
|
30
|
+
default: "",
|
|
31
|
+
ring: "ring-2 ring-ring",
|
|
32
|
+
"ring-offset": "ring-2 ring-ring ring-offset-2 ring-offset-background",
|
|
33
|
+
group: "ring-2 ring-background"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
defaultVariants: {
|
|
37
|
+
size: "default",
|
|
38
|
+
shape: "circle",
|
|
39
|
+
variant: "default"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
var AVATAR_INSET_AFTER = {
|
|
44
|
+
circle: "after:rounded-full",
|
|
45
|
+
square: "after:rounded-none",
|
|
46
|
+
"rounded-sm": "after:rounded-sm",
|
|
47
|
+
"rounded-md": "after:rounded-md",
|
|
48
|
+
"rounded-lg": "after:rounded-lg",
|
|
49
|
+
"rounded-xl": "after:rounded-xl"
|
|
50
|
+
};
|
|
51
|
+
cn(
|
|
52
|
+
"aspect-square size-full object-cover",
|
|
53
|
+
"group-data-[shape=circle]/avatar:rounded-full",
|
|
54
|
+
"group-data-[shape=square]/avatar:rounded-none",
|
|
55
|
+
"group-data-[shape=rounded-sm]/avatar:rounded-sm",
|
|
56
|
+
"group-data-[shape=rounded-md]/avatar:rounded-md",
|
|
57
|
+
"group-data-[shape=rounded-lg]/avatar:rounded-lg",
|
|
58
|
+
"group-data-[shape=rounded-xl]/avatar:rounded-xl"
|
|
59
|
+
);
|
|
60
|
+
var avatarFallbackShape = cn(
|
|
61
|
+
"flex size-full items-center justify-center bg-muted text-sm text-muted-foreground",
|
|
62
|
+
"group-data-[shape=circle]/avatar:rounded-full",
|
|
63
|
+
"group-data-[shape=square]/avatar:rounded-none",
|
|
64
|
+
"group-data-[shape=rounded-sm]/avatar:rounded-sm",
|
|
65
|
+
"group-data-[shape=rounded-md]/avatar:rounded-md",
|
|
66
|
+
"group-data-[shape=rounded-lg]/avatar:rounded-lg",
|
|
67
|
+
"group-data-[shape=rounded-xl]/avatar:rounded-xl",
|
|
68
|
+
"group-data-[size=sm]/avatar:text-xs"
|
|
69
|
+
);
|
|
70
|
+
function Avatar({
|
|
71
|
+
className,
|
|
72
|
+
size = "default",
|
|
73
|
+
shape = "circle",
|
|
74
|
+
variant = "default",
|
|
75
|
+
insetBorder = false,
|
|
76
|
+
...props
|
|
77
|
+
}) {
|
|
78
|
+
const shapeKey = shape ?? "circle";
|
|
79
|
+
const insetClass = insetBorder && cn(
|
|
80
|
+
"after:pointer-events-none after:absolute after:inset-0 after:border after:border-border after:mix-blend-darken dark:after:mix-blend-lighten",
|
|
81
|
+
AVATAR_INSET_AFTER[shapeKey]
|
|
82
|
+
);
|
|
83
|
+
return /* @__PURE__ */ jsx(
|
|
84
|
+
Avatar$1.Root,
|
|
85
|
+
{
|
|
86
|
+
"data-slot": "avatar",
|
|
87
|
+
"data-size": size,
|
|
88
|
+
"data-shape": shape,
|
|
89
|
+
className: cn(avatarRootVariants({ size, shape, variant }), insetClass, className),
|
|
90
|
+
...props
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
function AvatarFallback({
|
|
95
|
+
className,
|
|
96
|
+
...props
|
|
97
|
+
}) {
|
|
98
|
+
return /* @__PURE__ */ jsx(
|
|
99
|
+
Avatar$1.Fallback,
|
|
100
|
+
{
|
|
101
|
+
"data-slot": "avatar-fallback",
|
|
102
|
+
className: cn(avatarFallbackShape, className),
|
|
103
|
+
...props
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
function AvatarInitials({
|
|
108
|
+
initials,
|
|
109
|
+
decorative = true,
|
|
110
|
+
fallbackClassName,
|
|
111
|
+
className,
|
|
112
|
+
...avatarProps
|
|
113
|
+
}) {
|
|
114
|
+
return /* @__PURE__ */ jsx(Avatar, { className, ...avatarProps, children: /* @__PURE__ */ jsx(
|
|
115
|
+
AvatarFallback,
|
|
116
|
+
{
|
|
117
|
+
"aria-hidden": decorative ? true : void 0,
|
|
118
|
+
className: cn(
|
|
119
|
+
"border-0 bg-[var(--avatar-initials-bg)] font-semibold text-[var(--avatar-initials-fg)]",
|
|
120
|
+
fallbackClassName
|
|
121
|
+
),
|
|
122
|
+
children: initials
|
|
123
|
+
}
|
|
124
|
+
) });
|
|
125
|
+
}
|
|
126
|
+
function Card({
|
|
127
|
+
className,
|
|
128
|
+
size = "default",
|
|
129
|
+
...props
|
|
130
|
+
}) {
|
|
131
|
+
return /* @__PURE__ */ jsx(
|
|
132
|
+
"div",
|
|
133
|
+
{
|
|
134
|
+
"data-slot": "card",
|
|
135
|
+
"data-size": size,
|
|
136
|
+
className: cn(
|
|
137
|
+
"group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground ring-1 ring-foreground/10 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
|
|
138
|
+
className
|
|
139
|
+
),
|
|
140
|
+
...props
|
|
141
|
+
}
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
function CardHeader({ className, ...props }) {
|
|
145
|
+
return /* @__PURE__ */ jsx(
|
|
146
|
+
"div",
|
|
147
|
+
{
|
|
148
|
+
"data-slot": "card-header",
|
|
149
|
+
className: cn(
|
|
150
|
+
"group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3",
|
|
151
|
+
className
|
|
152
|
+
),
|
|
153
|
+
...props
|
|
154
|
+
}
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
function CardTitle({ className, ...props }) {
|
|
158
|
+
return /* @__PURE__ */ jsx(
|
|
159
|
+
"div",
|
|
160
|
+
{
|
|
161
|
+
"data-slot": "card-title",
|
|
162
|
+
className: cn(
|
|
163
|
+
"font-sans text-base leading-snug font-medium group-data-[size=sm]/card:text-sm",
|
|
164
|
+
className
|
|
165
|
+
),
|
|
166
|
+
...props
|
|
167
|
+
}
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
function ListPageBoardCard({
|
|
171
|
+
layout = "stack",
|
|
172
|
+
leading,
|
|
173
|
+
rowEnd,
|
|
174
|
+
rowContainerClassName,
|
|
175
|
+
onClick,
|
|
176
|
+
interactive = false,
|
|
177
|
+
className,
|
|
178
|
+
style,
|
|
179
|
+
isNew,
|
|
180
|
+
children
|
|
181
|
+
}) {
|
|
182
|
+
const isRow = layout === "row";
|
|
183
|
+
const isInteractive = Boolean(onClick) || interactive;
|
|
184
|
+
const rowShell = rowContainerClassName ?? "flex flex-row items-start gap-3";
|
|
185
|
+
return /* @__PURE__ */ jsx(
|
|
186
|
+
Card,
|
|
187
|
+
{
|
|
188
|
+
size: "sm",
|
|
189
|
+
className: cn(
|
|
190
|
+
"w-full min-w-0 transition-shadow",
|
|
191
|
+
!isRow && "gap-1",
|
|
192
|
+
isRow && cn("!gap-0", rowShell, "px-4 py-3"),
|
|
193
|
+
isInteractive && "cursor-pointer hover:shadow-md",
|
|
194
|
+
isNew && "ring-brand/30",
|
|
195
|
+
className
|
|
196
|
+
),
|
|
197
|
+
style,
|
|
198
|
+
onClick,
|
|
199
|
+
children: isRow ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
200
|
+
leading,
|
|
201
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children }),
|
|
202
|
+
rowEnd
|
|
203
|
+
] }) : children
|
|
204
|
+
}
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
var HubRecordCard = ListPageBoardCard;
|
|
208
|
+
function ListPageBoardCardHeader({
|
|
209
|
+
className,
|
|
210
|
+
children
|
|
211
|
+
}) {
|
|
212
|
+
return /* @__PURE__ */ jsx(CardHeader, { className: cn("gap-2 pb-2", className), children });
|
|
213
|
+
}
|
|
214
|
+
function ListPageBoardCardTitleRow({
|
|
215
|
+
title,
|
|
216
|
+
titleClassName,
|
|
217
|
+
trailing
|
|
218
|
+
}) {
|
|
219
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-start justify-between gap-2", children: [
|
|
220
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsx(
|
|
221
|
+
CardTitle,
|
|
222
|
+
{
|
|
223
|
+
className: cn(
|
|
224
|
+
"break-words text-sm font-semibold leading-snug text-foreground",
|
|
225
|
+
titleClassName
|
|
226
|
+
),
|
|
227
|
+
children: title
|
|
228
|
+
}
|
|
229
|
+
) }),
|
|
230
|
+
trailing
|
|
231
|
+
] });
|
|
232
|
+
}
|
|
233
|
+
function ListPageBoardCardAvatar({
|
|
234
|
+
initials,
|
|
235
|
+
className
|
|
236
|
+
}) {
|
|
237
|
+
return /* @__PURE__ */ jsx(
|
|
238
|
+
AvatarInitials,
|
|
239
|
+
{
|
|
240
|
+
initials,
|
|
241
|
+
className: cn("size-7 shrink-0 text-xs", className),
|
|
242
|
+
fallbackClassName: "text-xs"
|
|
243
|
+
}
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
function ListPageBoardCardBadgeRow({ children }) {
|
|
247
|
+
return /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-wrap items-center gap-1.5", children });
|
|
248
|
+
}
|
|
249
|
+
function ListPageBoardCardBody({
|
|
250
|
+
className,
|
|
251
|
+
children
|
|
252
|
+
}) {
|
|
253
|
+
return /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-2", className), children });
|
|
254
|
+
}
|
|
255
|
+
function ListPageBoardCardSecondary({
|
|
256
|
+
className,
|
|
257
|
+
children
|
|
258
|
+
}) {
|
|
259
|
+
return /* @__PURE__ */ jsx("p", { className: cn("text-xs text-muted-foreground leading-snug", className), children });
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export { HubRecordCard, ListPageBoardCard, ListPageBoardCardAvatar, ListPageBoardCardBadgeRow, ListPageBoardCardBody, ListPageBoardCardHeader, ListPageBoardCardSecondary, ListPageBoardCardTitleRow };
|
|
263
|
+
//# sourceMappingURL=list-page-board-card.js.map
|
|
264
|
+
//# sourceMappingURL=list-page-board-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/avatar.tsx","../../../src/components/ui/card.tsx","../../../src/components/data-views/list-page-board-card.tsx"],"names":["AvatarPrimitive","jsx","jsxs"],"mappings":"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","file":"list-page-board-card.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Check, Plus } from \"lucide-react\"\nimport { Avatar as AvatarPrimitive } from \"radix-ui\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Badge } from \"./badge\"\n\n/** Maps to Shadcn Studio avatar demos (shape / ring / stack). Uses theme tokens only. */\nconst avatarRootVariants = cva(\n \"group/avatar relative flex shrink-0 overflow-hidden select-none\",\n {\n variants: {\n size: {\n sm: \"size-6\",\n default: \"size-8\",\n lg: \"size-10\",\n },\n shape: {\n circle: \"rounded-full\",\n square: \"rounded-none\",\n \"rounded-sm\": \"rounded-sm\",\n \"rounded-md\": \"rounded-md\",\n \"rounded-lg\": \"rounded-lg\",\n \"rounded-xl\": \"rounded-xl\",\n },\n variant: {\n default: \"\",\n ring: \"ring-2 ring-ring\",\n \"ring-offset\": \"ring-2 ring-ring ring-offset-2 ring-offset-background\",\n group: \"ring-2 ring-background\",\n },\n },\n defaultVariants: {\n size: \"default\",\n shape: \"circle\",\n variant: \"default\",\n },\n }\n)\n\nconst AVATAR_INSET_AFTER: Record<NonNullable<VariantProps<typeof avatarRootVariants>[\"shape\"]>, string> = {\n circle: \"after:rounded-full\",\n square: \"after:rounded-none\",\n \"rounded-sm\": \"after:rounded-sm\",\n \"rounded-md\": \"after:rounded-md\",\n \"rounded-lg\": \"after:rounded-lg\",\n \"rounded-xl\": \"after:rounded-xl\",\n}\n\nconst avatarImageShape = cn(\n \"aspect-square size-full object-cover\",\n \"group-data-[shape=circle]/avatar:rounded-full\",\n \"group-data-[shape=square]/avatar:rounded-none\",\n \"group-data-[shape=rounded-sm]/avatar:rounded-sm\",\n \"group-data-[shape=rounded-md]/avatar:rounded-md\",\n \"group-data-[shape=rounded-lg]/avatar:rounded-lg\",\n \"group-data-[shape=rounded-xl]/avatar:rounded-xl\"\n)\n\nconst avatarFallbackShape = cn(\n \"flex size-full items-center justify-center bg-muted text-sm text-muted-foreground\",\n \"group-data-[shape=circle]/avatar:rounded-full\",\n \"group-data-[shape=square]/avatar:rounded-none\",\n \"group-data-[shape=rounded-sm]/avatar:rounded-sm\",\n \"group-data-[shape=rounded-md]/avatar:rounded-md\",\n \"group-data-[shape=rounded-lg]/avatar:rounded-lg\",\n \"group-data-[shape=rounded-xl]/avatar:rounded-xl\",\n \"group-data-[size=sm]/avatar:text-xs\"\n)\n\ntype AvatarProps = React.ComponentProps<typeof AvatarPrimitive.Root> &\n VariantProps<typeof avatarRootVariants> & {\n /**\n * Subtle inner hairline on the avatar edge (token `border-border`).\n * Default **false** — full-bleed circle for photos/logos (Shadcn Studio–style profile look).\n */\n insetBorder?: boolean\n }\n\nfunction Avatar({\n className,\n size = \"default\",\n shape = \"circle\",\n variant = \"default\",\n insetBorder = false,\n ...props\n}: AvatarProps) {\n const shapeKey = shape ?? \"circle\"\n const insetClass =\n insetBorder &&\n cn(\n \"after:pointer-events-none after:absolute after:inset-0 after:border after:border-border after:mix-blend-darken dark:after:mix-blend-lighten\",\n AVATAR_INSET_AFTER[shapeKey]\n )\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n data-shape={shape}\n className={cn(avatarRootVariants({ size, shape, variant }), insetClass, className)}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n referrerPolicy = \"no-referrer\",\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n referrerPolicy={referrerPolicy}\n className={cn(avatarImageShape, className)}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(avatarFallbackShape, className)}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"absolute end-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\n/**\n * A row of avatars with an overflow counter — **never overlapping**.\n *\n * Overlapping face piles (Slack / GitHub style) have known UX problems in\n * dense product chrome: ring-on-background contrast is fragile in dark mode,\n * click targets stack, and screen readers announce ambiguous groupings.\n * `AvatarGroup` therefore renders children side-by-side with a small inline\n * gap. See `.cursor/rules/exxat-person-identity-display.mdc` (MUST NOT —\n * overlapping avatars) and the `PageHeader` collaboration variant which\n * uses the same gapped row.\n */\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"group/avatar-group flex items-center gap-1.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n \"relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3\",\n className\n )}\n {...props}\n />\n )\n}\n\n// ── Shadcn Studio–style compositions (tokens + a11y checklist: sr-only status, meaningful alt on image) ──\n\ntype AvatarShape = NonNullable<VariantProps<typeof avatarRootVariants>[\"shape\"]>\ntype AvatarVariant = NonNullable<VariantProps<typeof avatarRootVariants>[\"variant\"]>\ntype AvatarSize = NonNullable<VariantProps<typeof avatarRootVariants>[\"size\"]>\n\ntype AvatarInitialsProps = Omit<AvatarProps, \"children\"> & {\n initials: string\n /** When true, initials are hidden from accessibility tree (pair with visible name). Default true. */\n decorative?: boolean\n /** Extra classes on `AvatarFallback` (e.g. font weight). */\n fallbackClassName?: string\n}\n\n/** Initials-only chip using `--avatar-initials-bg` / `--avatar-initials-fg` (Exxat tokens). */\nfunction AvatarInitials({\n initials,\n decorative = true,\n fallbackClassName,\n className,\n ...avatarProps\n}: AvatarInitialsProps) {\n return (\n <Avatar className={className} {...avatarProps}>\n <AvatarFallback\n aria-hidden={decorative ? true : undefined}\n className={cn(\n \"border-0 bg-[var(--avatar-initials-bg)] font-semibold text-[var(--avatar-initials-fg)]\",\n fallbackClassName\n )}\n >\n {initials}\n </AvatarFallback>\n </Avatar>\n )\n}\n\ntype AvatarStatusTone = \"online\" | \"busy\" | \"away\"\n\nconst avatarStatusDot: Record<AvatarStatusTone, string> = {\n online: \"bg-emerald-600 dark:bg-emerald-400\",\n busy: \"bg-destructive\",\n away: \"bg-amber-600 dark:bg-amber-400\",\n}\n\n/** Presence dot (Studio avatars 7–9). Wraps a single `Avatar`. */\nfunction AvatarStatus({\n children,\n status,\n label,\n className,\n position = \"bottom-end\",\n}: {\n children: React.ReactNode\n status: AvatarStatusTone\n /** Announced to screen readers (e.g. \"Busy\"). */\n label: string\n className?: string\n /** `bottom-end` matches `AvatarBadge`; `top-end` matches some Studio away demos. */\n position?: \"bottom-end\" | \"top-end\"\n}) {\n const pos =\n position === \"top-end\"\n ? \"-top-0.5 -end-0.5 bottom-auto start-auto\"\n : \"-end-0.5 -bottom-0.5 top-auto start-auto\"\n return (\n <span className={cn(\"relative inline-flex w-fit shrink-0\", className)}>\n {children}\n <span\n className={cn(\n \"pointer-events-none absolute z-10 size-3 rounded-full border-2 border-background\",\n pos,\n avatarStatusDot[status]\n )}\n aria-hidden\n />\n <span className=\"sr-only\">{label}</span>\n </span>\n )\n}\n\n/** Numeric badge overlay (Studio avatar 11). */\nfunction AvatarNotificationCount({\n children,\n count,\n className,\n badgeClassName,\n}: {\n children: React.ReactNode\n count: number | string\n className?: string\n badgeClassName?: string\n}) {\n return (\n <span className={cn(\"relative inline-flex w-fit shrink-0\", className)}>\n {children}\n <Badge\n className={cn(\n \"absolute -top-2.5 -end-2.5 z-10 h-5 min-w-5 justify-center px-1 tabular-nums\",\n badgeClassName\n )}\n >\n {count}\n </Badge>\n </span>\n )\n}\n\n/** Verified check overlay (Studio avatar 12) — primary token fill. */\nfunction AvatarVerified({\n children,\n label = \"Verified\",\n className,\n}: {\n children: React.ReactNode\n label?: string\n className?: string\n}) {\n return (\n <span className={cn(\"relative inline-flex w-fit shrink-0\", className)}>\n {children}\n <span className=\"pointer-events-none absolute -top-1.5 -end-1.5 z-10 inline-flex size-4 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-sm\">\n <Check className=\"size-2.5\" strokeWidth={3} aria-hidden />\n <span className=\"sr-only\">{label}</span>\n </span>\n </span>\n )\n}\n\n/** Leo assistant mark — centralized; same icon treatment as Ask Leo sidebar. */\nfunction AvatarLeoAssistant({\n className,\n size = \"sm\",\n ...props\n}: Omit<AvatarProps, \"children\" | \"shape\">) {\n return (\n <Avatar size={size} shape=\"circle\" insetBorder={false} className={className} {...props}>\n <AvatarFallback className=\"bg-brand/15 p-0\">\n <span className=\"sr-only\">Leo</span>\n <i\n className=\"fa-duotone fa-solid fa-star-christmas text-xs text-brand\"\n aria-hidden=\"true\"\n />\n </AvatarFallback>\n </Avatar>\n )\n}\n\n/** “Add profile” affordance (Studio avatar 10). `onClick` on the button. */\nfunction AvatarPlusAction({\n children,\n actionLabel,\n onClick,\n className,\n buttonClassName,\n}: {\n children: React.ReactNode\n actionLabel: string\n onClick?: () => void\n className?: string\n buttonClassName?: string\n}) {\n return (\n <span className={cn(\"relative inline-flex w-fit shrink-0\", className)}>\n {children}\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"focus-visible:ring-ring/50 absolute -end-1 -bottom-1 z-10 inline-flex size-7 cursor-pointer items-center justify-center rounded-full bg-background shadow-sm ring-1 ring-border focus-visible:ring-[3px] focus-visible:outline-none\",\n buttonClassName\n )}\n >\n <Plus className=\"size-4 text-muted-foreground\" aria-hidden />\n <span className=\"sr-only\">{actionLabel}</span>\n </button>\n </span>\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n AvatarInitials,\n AvatarStatus,\n AvatarNotificationCount,\n AvatarVerified,\n AvatarPlusAction,\n AvatarLeoAssistant,\n avatarRootVariants,\n}\nexport type {\n AvatarProps,\n AvatarInitialsProps,\n AvatarShape,\n AvatarVariant,\n AvatarSize,\n AvatarStatusTone,\n}\n","/**\n * Card — surface component\n *\n * ── SPACING SYSTEM (do not override) ────────────────────────────────────────\n * Card owns all vertical rhythm:\n * py-4 → 16px top + 16px bottom padding on the card itself\n * gap-4 → 16px gap between CardHeader, CardContent, and CardFooter\n *\n * Rules:\n * ✗ Never add pb-X / pt-X to CardContent or CardHeader\n * ✗ Never add h-full / flex / flex-col to the Card wrapper\n * ✗ Never add flex-1 / min-h-0 to CardContent\n * ✗ Never add shrink-0 / pb-2 to CardHeader\n * ✓ For scrollable list content (Activity, Tasks): add overflow-auto only\n * ✓ For equal-height grid pairs in MixView: handle at grid cell level\n *\n * ── GLOW TREATMENT ──────────────────────────────────────────────────────────\n * Only two approved uses — see full spec in key-metrics.tsx GLOW GUIDELINE:\n * 1. AI surfaces (Insights card, Ask Leo responses) → opacity 0.12–0.16\n * 2. Hero sections (Key Metrics KPI band, onboarding) → opacity 0.18–0.24\n * Always pair with overflow-hidden on the Card.\n * Never add glow to: Tasks, Activity, Learn, Charts, nav elements.\n *\n * ── FOOTER PATTERN ──────────────────────────────────────────────────────────\n * Use CardFooter for card-level CTA actions (e.g. \"View all tasks\", \"Ask Leo\").\n * CardFooter renders with border-t + bg-muted/50 automatically.\n * Do not put primary workflow actions in CardFooter — use CardHeader CardAction.\n *\n * ── SIZE VARIANT ────────────────────────────────────────────────────────────\n * size=\"sm\" → tighter spacing (py-3, gap-3, px-3). Use inside compact grids.\n * size=\"default\" (implicit) → standard spacing described above.\n */\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n \"group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground ring-1 ring-foreground/10 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n \"font-sans text-base leading-snug font-medium group-data-[size=sm]/card:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-4 group-data-[size=sm]/card:px-3\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/card:p-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","\"use client\"\n\n/**\n * ListPageBoardCard — single board-card shell for all list hubs (Placements, Team, Compliance, …).\n *\n * Information hierarchy (top → bottom):\n * 1. **Title row** — `ListPageBoardCardTitleRow` — primary label (`text-sm font-semibold`), optional `trailing` (`ListPageBoardCardAvatar` initials chip, same as Placements).\n * 2. **Badge row** — `ListPageBoardCardBadgeRow` — optional status / tags (`flex-wrap`).\n * 3. **Body** — `ListPageBoardCardBody` — primary facts: icon rows, two-line blocks (`BoardCardIconRow` / `BoardCardTwoLineBlock` from board-card-primitives).\n * 4. **Secondary** — `ListPageBoardCardSecondary` — optional muted supporting line (`text-xs text-muted-foreground`).\n *\n * Styling matches **`BoardPlacementCard`**: `Card` `size=\"sm\"`, ring, hover shadow, optional **new** ring accent.\n *\n * **Interaction:** Pass **`onClick`** (e.g. `BoardPlacementCard`) or **`interactive`** when the card is\n * wrapped in `<Link>` / router navigation so hover/cursor match placement board tiles.\n *\n * **Layouts:**\n * - **`stack`** (default) — kanban / grid tile: compose with `ListPageBoardCardHeader`, title row, body.\n * - **`row`** — full-width list row: optional **`leading`**, **`children`** as main column, optional **`rowEnd`**.\n * Use **`rowContainerClassName`** for responsive shells (e.g. `flex-col sm:flex-row`).\n */\n\nimport * as React from \"react\"\nimport { AvatarInitials } from \"../ui/avatar\"\nimport { cn } from \"../../lib/utils\"\nimport { Card, CardHeader, CardTitle } from \"../ui/card\"\n\nexport type ListPageBoardCardLayout = \"stack\" | \"row\"\n\nexport type ListPageBoardCardProps = {\n layout?: ListPageBoardCardLayout\n /** `row` only — avatar / icon column. */\n leading?: React.ReactNode\n /** `row` only — status + chevron, etc. */\n rowEnd?: React.ReactNode\n /**\n * `row` only — flex shell for the card (default `flex flex-row items-start gap-3`).\n * Use e.g. `flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-4` for compliance-style rows.\n */\n rowContainerClassName?: string\n /** Entire card is clickable (e.g. open detail) — enables pointer + hover shadow. */\n onClick?: () => void\n /**\n * Same hover/cursor as `onClick` when the parent uses `<Link>` or `button` instead of Card click\n * (avoids nested interactive targets and keeps keyboard focus on the link).\n */\n interactive?: boolean\n className?: string\n style?: React.CSSProperties\n /** Subtle brand ring — e.g. newly created row. */\n isNew?: boolean\n children: React.ReactNode\n}\n\nexport function ListPageBoardCard({\n layout = \"stack\",\n leading,\n rowEnd,\n rowContainerClassName,\n onClick,\n interactive = false,\n className,\n style,\n isNew,\n children,\n}: ListPageBoardCardProps) {\n const isRow = layout === \"row\"\n const isInteractive = Boolean(onClick) || interactive\n const rowShell = rowContainerClassName ?? \"flex flex-row items-start gap-3\"\n\n return (\n <Card\n size=\"sm\"\n className={cn(\n \"w-full min-w-0 transition-shadow\",\n !isRow && \"gap-1\",\n isRow && cn(\"!gap-0\", rowShell, \"px-4 py-3\"),\n isInteractive && \"cursor-pointer hover:shadow-md\",\n isNew && \"ring-brand/30\",\n className,\n )}\n style={style}\n onClick={onClick}\n >\n {isRow ? (\n <>\n {leading}\n <div className=\"min-w-0 flex-1\">{children}</div>\n {rowEnd}\n </>\n ) : (\n children\n )}\n </Card>\n )\n}\n\n/** Preferred public name — same component as `ListPageBoardCard`. */\nexport const HubRecordCard = ListPageBoardCard\n\nexport function ListPageBoardCardHeader({\n className,\n children,\n}: {\n className?: string\n children: React.ReactNode\n}) {\n return <CardHeader className={cn(\"gap-2 pb-2\", className)}>{children}</CardHeader>\n}\n\n/**\n * Level 1 — Primary title (dominant text on the card).\n */\nexport function ListPageBoardCardTitleRow({\n title,\n titleClassName,\n trailing,\n}: {\n title: React.ReactNode\n /** Extra classes on the title (e.g. line-clamp from `lineClampClass`). */\n titleClassName?: string\n /** End-aligned: avatar, icon, etc. */\n trailing?: React.ReactNode\n}) {\n return (\n <div className=\"flex min-w-0 items-start justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <CardTitle\n className={cn(\n \"break-words text-sm font-semibold leading-snug text-foreground\",\n titleClassName,\n )}\n >\n {title}\n </CardTitle>\n </div>\n {trailing}\n </div>\n )\n}\n\n/** Initials avatar — Radix `Avatar` + `--avatar-initials-*` tokens (same as tables / placement board). */\nexport function ListPageBoardCardAvatar({\n initials,\n className,\n}: {\n initials: string\n className?: string\n}) {\n return (\n <AvatarInitials\n initials={initials}\n className={cn(\"size-7 shrink-0 text-xs\", className)}\n fallbackClassName=\"text-xs\"\n />\n )\n}\n\n/**\n * Level 2 — Status / metadata chips (below title, above primary body).\n */\nexport function ListPageBoardCardBadgeRow({ children }: { children: React.ReactNode }) {\n return <div className=\"flex min-w-0 flex-wrap items-center gap-1.5\">{children}</div>\n}\n\n/**\n * Level 3 — Main facts: compose with `BoardCardIconRow`, `BoardCardTwoLineBlock`, etc.\n */\nexport function ListPageBoardCardBody({\n className,\n children,\n}: {\n className?: string\n children: React.ReactNode\n}) {\n return <div className={cn(\"flex flex-col gap-2\", className)}>{children}</div>\n}\n\n/**\n * Level 4 — Optional muted supporting line (caption, hint, extra context).\n */\nexport function ListPageBoardCardSecondary({\n className,\n children,\n}: {\n className?: string\n children: React.ReactNode\n}) {\n return (\n <p className={cn(\"text-xs text-muted-foreground leading-snug\", className)}>{children}</p>\n )\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
type ListPageBoardColumnDef<T> = {
|
|
5
|
+
id: string;
|
|
6
|
+
label: string;
|
|
7
|
+
/** Shown beside the title on larger breakpoints */
|
|
8
|
+
description?: string;
|
|
9
|
+
/** First matching column wins; columns should be mutually exclusive for most domains. */
|
|
10
|
+
filter: (row: T) => boolean;
|
|
11
|
+
};
|
|
12
|
+
type ListPageBoardTemplateProps<T> = {
|
|
13
|
+
columns: ListPageBoardColumnDef<T>[];
|
|
14
|
+
rows: T[];
|
|
15
|
+
getRowKey: (row: T) => string | number;
|
|
16
|
+
renderCard: (row: T) => React.ReactNode;
|
|
17
|
+
/** Tailwind classes for the count pill, keyed by column `id` */
|
|
18
|
+
columnCountBadgeClassName?: Record<string, string>;
|
|
19
|
+
/** Copy when a column has no rows */
|
|
20
|
+
emptyColumnLabel?: string;
|
|
21
|
+
};
|
|
22
|
+
declare function ListPageBoardTemplate<T>({ columns, rows, getRowKey, renderCard, columnCountBadgeClassName, emptyColumnLabel, }: ListPageBoardTemplateProps<T>): react_jsx_runtime.JSX.Element;
|
|
23
|
+
|
|
24
|
+
export { type ListPageBoardColumnDef, ListPageBoardTemplate, type ListPageBoardTemplateProps };
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { clsx } from 'clsx';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
5
|
+
import { cva } from 'class-variance-authority';
|
|
6
|
+
import { Slot } from 'radix-ui';
|
|
7
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
function cn(...inputs) {
|
|
10
|
+
return twMerge(clsx(inputs));
|
|
11
|
+
}
|
|
12
|
+
var badgeVariants = cva(
|
|
13
|
+
"group/badge inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-1 text-xs font-medium leading-none whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",
|
|
14
|
+
{
|
|
15
|
+
variants: {
|
|
16
|
+
variant: {
|
|
17
|
+
default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
|
|
18
|
+
secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
|
|
19
|
+
destructive: "bg-destructive/10 text-[var(--chip-destructive)] focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:text-red-100 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",
|
|
20
|
+
outline: "border-border text-foreground [a]:hover:bg-interactive-hover [a]:hover:text-muted-foreground",
|
|
21
|
+
ghost: "hover:bg-interactive-hover hover:text-muted-foreground dark:hover:bg-interactive-hover-subtle",
|
|
22
|
+
link: "text-primary underline-offset-4 hover:underline"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: {
|
|
26
|
+
variant: "default"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
function Badge({
|
|
31
|
+
className,
|
|
32
|
+
variant = "default",
|
|
33
|
+
asChild = false,
|
|
34
|
+
...props
|
|
35
|
+
}) {
|
|
36
|
+
const Comp = asChild ? Slot.Root : "span";
|
|
37
|
+
return /* @__PURE__ */ jsx(
|
|
38
|
+
Comp,
|
|
39
|
+
{
|
|
40
|
+
"data-slot": "badge",
|
|
41
|
+
"data-variant": variant,
|
|
42
|
+
className: cn(badgeVariants({ variant }), className),
|
|
43
|
+
...props
|
|
44
|
+
}
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
function BoardNewCardPlaceholder({ position }) {
|
|
48
|
+
return /* @__PURE__ */ jsxs(
|
|
49
|
+
"button",
|
|
50
|
+
{
|
|
51
|
+
type: "button",
|
|
52
|
+
className: cn(
|
|
53
|
+
"flex w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-border bg-background/50 py-2 text-xs font-medium text-muted-foreground transition-colors",
|
|
54
|
+
"hover:border-input hover:bg-muted/40 hover:text-foreground",
|
|
55
|
+
position === "above" ? "mb-2" : "mt-2"
|
|
56
|
+
),
|
|
57
|
+
children: [
|
|
58
|
+
/* @__PURE__ */ jsx("i", { className: "fa-light fa-plus text-xs", "aria-hidden": "true" }),
|
|
59
|
+
"New card"
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
function ListPageBoardColumnHeader({
|
|
65
|
+
label,
|
|
66
|
+
description,
|
|
67
|
+
count,
|
|
68
|
+
badgeClassName
|
|
69
|
+
}) {
|
|
70
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-border px-3 py-2.5", children: [
|
|
71
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
|
|
72
|
+
/* @__PURE__ */ jsx("span", { className: "truncate text-sm font-semibold text-foreground", children: label }),
|
|
73
|
+
description ? /* @__PURE__ */ jsx("span", { className: "hidden text-xs text-muted-foreground sm:inline", children: description }) : null
|
|
74
|
+
] }),
|
|
75
|
+
/* @__PURE__ */ jsx(
|
|
76
|
+
Badge,
|
|
77
|
+
{
|
|
78
|
+
variant: "outline",
|
|
79
|
+
className: cn(
|
|
80
|
+
"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",
|
|
81
|
+
badgeClassName
|
|
82
|
+
),
|
|
83
|
+
"aria-label": `${count} ${count === 1 ? "item" : "items"}`,
|
|
84
|
+
children: count
|
|
85
|
+
}
|
|
86
|
+
)
|
|
87
|
+
] });
|
|
88
|
+
}
|
|
89
|
+
function ListPageBoardTemplate({
|
|
90
|
+
columns,
|
|
91
|
+
rows,
|
|
92
|
+
getRowKey,
|
|
93
|
+
renderCard,
|
|
94
|
+
columnCountBadgeClassName = {},
|
|
95
|
+
emptyColumnLabel = "No items"
|
|
96
|
+
}) {
|
|
97
|
+
const grouped = React.useMemo(() => {
|
|
98
|
+
const map = {};
|
|
99
|
+
for (const col of columns) map[col.id] = [];
|
|
100
|
+
for (const row of rows) {
|
|
101
|
+
for (const col of columns) {
|
|
102
|
+
if (col.filter(row)) {
|
|
103
|
+
map[col.id].push(row);
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return map;
|
|
109
|
+
}, [columns, rows]);
|
|
110
|
+
return /* @__PURE__ */ jsx("div", { className: "flex min-h-0 flex-1 gap-3 overflow-x-auto px-4 pb-6 pt-2 lg:px-6", children: columns.map((col) => /* @__PURE__ */ jsxs(
|
|
111
|
+
"div",
|
|
112
|
+
{
|
|
113
|
+
className: "flex w-72 shrink-0 flex-col overflow-hidden rounded-xl border border-border bg-muted/30",
|
|
114
|
+
children: [
|
|
115
|
+
/* @__PURE__ */ jsx(
|
|
116
|
+
ListPageBoardColumnHeader,
|
|
117
|
+
{
|
|
118
|
+
label: col.label,
|
|
119
|
+
description: col.description,
|
|
120
|
+
count: grouped[col.id]?.length ?? 0,
|
|
121
|
+
badgeClassName: columnCountBadgeClassName[col.id]
|
|
122
|
+
}
|
|
123
|
+
),
|
|
124
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col gap-2 overflow-y-auto p-2", children: [
|
|
125
|
+
/* @__PURE__ */ jsx(BoardNewCardPlaceholder, { position: "above" }),
|
|
126
|
+
(grouped[col.id]?.length ?? 0) === 0 ? /* @__PURE__ */ jsx("p", { className: "py-6 text-center text-xs text-muted-foreground", children: emptyColumnLabel }) : grouped[col.id].map((row) => /* @__PURE__ */ jsx(React.Fragment, { children: renderCard(row) }, String(getRowKey(row)))),
|
|
127
|
+
/* @__PURE__ */ jsx(BoardNewCardPlaceholder, { position: "below" })
|
|
128
|
+
] })
|
|
129
|
+
]
|
|
130
|
+
},
|
|
131
|
+
col.id
|
|
132
|
+
)) });
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export { ListPageBoardTemplate };
|
|
136
|
+
//# sourceMappingURL=list-page-board-template.js.map
|
|
137
|
+
//# sourceMappingURL=list-page-board-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/badge.tsx","../../../src/components/data-views/board-card-primitives.tsx","../../../src/components/data-views/list-page-board-template.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"list-page-board-template.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"group/badge inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-1 text-xs font-medium leading-none whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary:\n \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive:\n \"bg-destructive/10 text-[var(--chip-destructive)] focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:text-red-100 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20\",\n outline:\n \"border-border text-foreground [a]:hover:bg-interactive-hover [a]:hover:text-muted-foreground\",\n ghost:\n \"hover:bg-interactive-hover hover:text-muted-foreground dark:hover:bg-interactive-hover-subtle\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","\"use client\"\n\n/**\n * Reusable building blocks for kanban / board cards (icon rows, two-line blocks, placeholders).\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { BoardLineCount } from \"../../lib/data-list-display-options\"\n\nexport function BoardCardIconRow({\n iconClass,\n children,\n}: {\n iconClass: string\n children: React.ReactNode\n}) {\n return (\n <div className=\"flex items-start gap-2\">\n <i\n className={cn(\n `fa-light ${iconClass} text-xs text-muted-foreground mt-0.5 w-4 shrink-0 text-center`,\n )}\n aria-hidden\n />\n <div className=\"min-w-0 flex-1 text-xs leading-snug [&_.text-sm]:text-xs [&_span]:text-xs [&_div]:text-xs\">\n {children}\n </div>\n </div>\n )\n}\n\nexport function BoardCardTwoLineBlock({\n iconClass,\n line1,\n line2,\n line2ClassName,\n}: {\n iconClass: string\n line1: React.ReactNode\n /** Omitted for a single-line row (same icon + primary alignment as Placements). */\n line2?: React.ReactNode\n /** Override default muted line-2 (e.g. badges / rich cells). */\n line2ClassName?: string\n}) {\n const showLine2 = line2 !== undefined && line2 !== null\n return (\n <div className=\"flex items-start gap-2\">\n <i\n className={cn(\n `fa-light ${iconClass} text-xs text-muted-foreground mt-0.5 w-4 shrink-0 text-center`,\n )}\n aria-hidden\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-xs font-medium text-foreground leading-tight\">{line1}</div>\n {showLine2 ? (\n <div\n className={cn(\n \"mt-0.5 min-w-0 leading-tight\",\n line2ClassName ?? \"truncate text-xs text-muted-foreground\",\n )}\n >\n {line2}\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n\nexport function lineClampClass(n: BoardLineCount): string {\n const base = \"min-w-0 overflow-hidden break-words\"\n if (n === 1) return cn(base, \"line-clamp-1\")\n if (n === 2) return cn(base, \"line-clamp-2\")\n return cn(base, \"line-clamp-3\")\n}\n\nexport function BoardNewCardPlaceholder({ position }: { position: \"above\" | \"below\" }) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-border bg-background/50 py-2 text-xs font-medium text-muted-foreground transition-colors\",\n \"hover:border-input hover:bg-muted/40 hover:text-foreground\",\n position === \"above\" ? \"mb-2\" : \"mt-2\",\n )}\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n New card\n </button>\n )\n}\n","\"use client\"\n\n/**\n * ListPageBoardTemplate — reusable kanban shell for list pages (Team, custom hubs).\n *\n * - Columns are defined with predicates; each row is placed in the **first** matching column.\n * - Cards are rendered by the caller (`renderCard`) — compose **`ListPageBoardCard`** + primitives (`BoardCardTwoLineBlock`, etc.).\n * - Placements keeps richer column headers (search, menus); this template is for simpler hubs.\n *\n * @see `docs/data-views-pattern.md` — board primitives\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Badge } from \"../ui/badge\"\nimport { BoardNewCardPlaceholder } from \"./board-card-primitives\"\n\nexport type ListPageBoardColumnDef<T> = {\n id: string\n label: string\n /** Shown beside the title on larger breakpoints */\n description?: string\n /** First matching column wins; columns should be mutually exclusive for most domains. */\n filter: (row: T) => boolean\n}\n\nexport type ListPageBoardTemplateProps<T> = {\n columns: ListPageBoardColumnDef<T>[]\n rows: T[]\n getRowKey: (row: T) => string | number\n renderCard: (row: T) => React.ReactNode\n /** Tailwind classes for the count pill, keyed by column `id` */\n columnCountBadgeClassName?: Record<string, string>\n /** Copy when a column has no rows */\n emptyColumnLabel?: string\n}\n\nfunction ListPageBoardColumnHeader({\n label,\n description,\n count,\n badgeClassName,\n}: {\n label: string\n description?: string\n count: number\n badgeClassName?: string\n}) {\n return (\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate text-sm font-semibold text-foreground\">{label}</span>\n {description ? (\n <span className=\"hidden text-xs text-muted-foreground sm:inline\">{description}</span>\n ) : null}\n </div>\n <Badge\n variant=\"outline\"\n className={cn(\n \"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\",\n badgeClassName,\n )}\n aria-label={`${count} ${count === 1 ? \"item\" : \"items\"}`}\n >\n {count}\n </Badge>\n </div>\n )\n}\n\nexport function ListPageBoardTemplate<T>({\n columns,\n rows,\n getRowKey,\n renderCard,\n columnCountBadgeClassName = {},\n emptyColumnLabel = \"No items\",\n}: ListPageBoardTemplateProps<T>) {\n const grouped = React.useMemo(() => {\n const map: Record<string, T[]> = {}\n for (const col of columns) map[col.id] = []\n for (const row of rows) {\n for (const col of columns) {\n if (col.filter(row)) {\n map[col.id].push(row)\n break\n }\n }\n }\n return map\n }, [columns, rows])\n\n return (\n <div className=\"flex min-h-0 flex-1 gap-3 overflow-x-auto px-4 pb-6 pt-2 lg:px-6\">\n {columns.map(col => (\n <div\n key={col.id}\n className=\"flex w-72 shrink-0 flex-col overflow-hidden rounded-xl border border-border bg-muted/30\"\n >\n <ListPageBoardColumnHeader\n label={col.label}\n description={col.description}\n count={grouped[col.id]?.length ?? 0}\n badgeClassName={columnCountBadgeClassName[col.id]}\n />\n\n <div className=\"flex flex-1 flex-col gap-2 overflow-y-auto p-2\">\n <BoardNewCardPlaceholder position=\"above\" />\n\n {(grouped[col.id]?.length ?? 0) === 0 ? (\n <p className=\"py-6 text-center text-xs text-muted-foreground\">{emptyColumnLabel}</p>\n ) : (\n grouped[col.id]!.map(row => <React.Fragment key={String(getRowKey(row))}>{renderCard(row)}</React.Fragment>)\n )}\n\n <BoardNewCardPlaceholder position=\"below\" />\n </div>\n </div>\n ))}\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { DataListViewType } from '../../lib/data-list-view.js';
|
|
4
|
+
import { c as DataListViewRenderKind } from '../../data-list-view-registry-CyBoBML4.js';
|
|
5
|
+
|
|
6
|
+
type ListPageConnectedViewRenderers = Partial<Record<DataListViewRenderKind, React.ReactNode | (() => React.ReactNode)>>;
|
|
7
|
+
interface ListPageConnectedViewBodyProps {
|
|
8
|
+
view: DataListViewType;
|
|
9
|
+
/** Human-readable hub name for the not-configured state. */
|
|
10
|
+
hubLabel?: string;
|
|
11
|
+
renderers: ListPageConnectedViewRenderers;
|
|
12
|
+
}
|
|
13
|
+
declare function ListPageViewNotConfigured({ view, hubLabel, }: {
|
|
14
|
+
view: DataListViewType;
|
|
15
|
+
hubLabel?: string;
|
|
16
|
+
}): react_jsx_runtime.JSX.Element;
|
|
17
|
+
declare function ListPageConnectedViewBody({ view, hubLabel, renderers, }: ListPageConnectedViewBodyProps): react_jsx_runtime.JSX.Element;
|
|
18
|
+
|
|
19
|
+
export { ListPageConnectedViewBody, type ListPageConnectedViewBodyProps, type ListPageConnectedViewRenderers, ListPageViewNotConfigured };
|