@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,375 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* ExportDrawer — floating right-side drawer with export form.
|
|
5
|
-
*
|
|
6
|
-
* Uses the same Sheet pattern as TablePropertiesDrawer:
|
|
7
|
-
* - showCloseButton={false}, showOverlay={false}
|
|
8
|
-
* - Rounded, floating, inset from viewport edges
|
|
9
|
-
* - Button + Tip from our own component library
|
|
10
|
-
*
|
|
11
|
-
* Form fields (shadcn Form + react-hook-form + zod):
|
|
12
|
-
* • File format CSV · Excel · PDF (SelectionTileGrid radio)
|
|
13
|
-
* • Date range From / To (FilterTextValueInput dateMDY — same as Settings / table filters)
|
|
14
|
-
* • Columns All · Visible only (radio)
|
|
15
|
-
* • Apply active filters (checkbox)
|
|
16
|
-
*
|
|
17
|
-
* WCAG 2.1 AA:
|
|
18
|
-
* ✓ All inputs labelled via FormLabel linked to control id (1.3.1)
|
|
19
|
-
* ✓ Error messages linked via aria-describedby (3.3.1)
|
|
20
|
-
* ✓ Focus returns to trigger on close (2.4.3)
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import * as React from "react"
|
|
24
|
-
import { useForm } from "react-hook-form"
|
|
25
|
-
import { z } from "zod"
|
|
26
|
-
import { zodResolver } from "@hookform/resolvers/zod"
|
|
27
|
-
|
|
28
|
-
import { devLog } from "@/lib/dev-log"
|
|
29
|
-
import { Button } from "@/components/ui/button"
|
|
30
|
-
import { Checkbox } from "@/components/ui/checkbox"
|
|
31
|
-
import { Label } from "@/components/ui/label"
|
|
32
|
-
import { Tip } from "@/components/ui/tip"
|
|
33
|
-
import { Kbd, KbdGroup } from "@/components/ui/kbd"
|
|
34
|
-
import { Shortcut } from "@/components/ui/dropdown-menu"
|
|
35
|
-
import { RadioGroup, RadioGroupItem, RadioGroupLabel } from "@/components/ui/radio-group"
|
|
36
|
-
import { SelectionTileGrid } from "@/components/ui/selection-tile-grid"
|
|
37
|
-
import { FilterTextValueInput } from "@/components/data-table/filter-text-value-input"
|
|
38
|
-
import type { SelectionTileOption } from "@/components/ui/selection-tile-grid"
|
|
39
|
-
import {
|
|
40
|
-
Sheet,
|
|
41
|
-
SheetContent,
|
|
42
|
-
SheetTitle,
|
|
43
|
-
} from "@/components/ui/sheet"
|
|
44
|
-
import {
|
|
45
|
-
Form,
|
|
46
|
-
FormControl,
|
|
47
|
-
FormDescription,
|
|
48
|
-
FormField,
|
|
49
|
-
FormItem,
|
|
50
|
-
FormLabel,
|
|
51
|
-
FormMessage,
|
|
52
|
-
} from "@/components/ui/form"
|
|
53
|
-
|
|
54
|
-
/** Parse full MM/DD/YYYY from masked input; partial/invalid → undefined. */
|
|
55
|
-
function parseMdyToDate(raw: string | undefined): Date | undefined {
|
|
56
|
-
if (!raw?.trim()) return undefined
|
|
57
|
-
const m = raw.trim().match(/^(\d{2})\/(\d{2})\/(\d{4})$/)
|
|
58
|
-
if (!m) return undefined
|
|
59
|
-
const month = Number(m[1])
|
|
60
|
-
const day = Number(m[2])
|
|
61
|
-
const year = Number(m[3])
|
|
62
|
-
if (month < 1 || month > 12 || day < 1 || day > 31) return undefined
|
|
63
|
-
const d = new Date(year, month - 1, day, 12, 0, 0, 0)
|
|
64
|
-
if (d.getFullYear() !== year || d.getMonth() !== month - 1 || d.getDate() !== day) return undefined
|
|
65
|
-
return d
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// ── Validation schema ─────────────────────────────────────────────────────────
|
|
69
|
-
|
|
70
|
-
const EXPORT_FORMAT_OPTIONS: SelectionTileOption<"csv" | "excel" | "pdf">[] = [
|
|
71
|
-
{ value: "csv", label: "CSV", icon: "fa-file-csv" },
|
|
72
|
-
{ value: "excel", label: "Excel", icon: "fa-file-excel" },
|
|
73
|
-
{ value: "pdf", label: "PDF", icon: "fa-file-pdf" },
|
|
74
|
-
]
|
|
75
|
-
|
|
76
|
-
const exportSchema = z
|
|
77
|
-
.object({
|
|
78
|
-
format: z.enum(["csv", "excel", "pdf"]),
|
|
79
|
-
columns: z.enum(["all", "visible"]),
|
|
80
|
-
dateFrom: z.string().optional(),
|
|
81
|
-
dateTo: z.string().optional(),
|
|
82
|
-
includeFilters: z.boolean(),
|
|
83
|
-
})
|
|
84
|
-
.superRefine((data, ctx) => {
|
|
85
|
-
const from = parseMdyToDate(data.dateFrom)
|
|
86
|
-
const to = parseMdyToDate(data.dateTo)
|
|
87
|
-
if (data.dateFrom?.trim() && !from) {
|
|
88
|
-
ctx.addIssue({ code: "custom", message: "Enter a valid from date", path: ["dateFrom"] })
|
|
89
|
-
}
|
|
90
|
-
if (data.dateTo?.trim() && !to) {
|
|
91
|
-
ctx.addIssue({ code: "custom", message: "Enter a valid to date", path: ["dateTo"] })
|
|
92
|
-
}
|
|
93
|
-
if (from && to && to < from) {
|
|
94
|
-
ctx.addIssue({ code: "custom", message: "End date must be after start date", path: ["dateTo"] })
|
|
95
|
-
}
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
type ExportForm = z.infer<typeof exportSchema>
|
|
99
|
-
|
|
100
|
-
// ── Component ─────────────────────────────────────────────────────────────────
|
|
101
|
-
|
|
102
|
-
export interface ExportDrawerProps {
|
|
103
|
-
open: boolean
|
|
104
|
-
onOpenChange: (open: boolean) => void
|
|
105
|
-
totalRows?: number
|
|
106
|
-
visibleColumns?: number
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export function ExportDrawer({
|
|
110
|
-
open,
|
|
111
|
-
onOpenChange,
|
|
112
|
-
totalRows = 0,
|
|
113
|
-
visibleColumns,
|
|
114
|
-
}: ExportDrawerProps) {
|
|
115
|
-
const form = useForm<ExportForm>({
|
|
116
|
-
resolver: zodResolver(exportSchema),
|
|
117
|
-
defaultValues: {
|
|
118
|
-
format: "csv",
|
|
119
|
-
columns: "visible",
|
|
120
|
-
dateFrom: "",
|
|
121
|
-
dateTo: "",
|
|
122
|
-
includeFilters: true,
|
|
123
|
-
},
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
const [isExporting, setIsExporting] = React.useState(false)
|
|
127
|
-
|
|
128
|
-
async function onSubmit(values: ExportForm) {
|
|
129
|
-
setIsExporting(true)
|
|
130
|
-
await new Promise(r => setTimeout(r, 1200))
|
|
131
|
-
devLog("Export:", {
|
|
132
|
-
...values,
|
|
133
|
-
dateFrom: parseMdyToDate(values.dateFrom)?.toISOString(),
|
|
134
|
-
dateTo: parseMdyToDate(values.dateTo)?.toISOString(),
|
|
135
|
-
})
|
|
136
|
-
setIsExporting(false)
|
|
137
|
-
onOpenChange(false)
|
|
138
|
-
form.reset()
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
return (
|
|
142
|
-
<Sheet open={open} onOpenChange={onOpenChange}>
|
|
143
|
-
<SheetContent
|
|
144
|
-
data-slot="export-drawer"
|
|
145
|
-
side="right"
|
|
146
|
-
showCloseButton={false}
|
|
147
|
-
showOverlay={false}
|
|
148
|
-
className="z-[80] w-80 sm:max-w-80 p-0 gap-0 flex flex-col border border-border shadow-xl rounded-xl overflow-hidden"
|
|
149
|
-
style={{ top: "0.5rem", bottom: "0.5rem", right: "0.5rem", height: "calc(100vh - 1rem)" }}
|
|
150
|
-
>
|
|
151
|
-
{/* Header */}
|
|
152
|
-
<div className="flex items-center justify-between gap-3 px-4 pt-5 pb-3">
|
|
153
|
-
<SheetTitle className="text-base font-semibold leading-tight">Export data</SheetTitle>
|
|
154
|
-
<Tip label="Close" side="bottom">
|
|
155
|
-
<Button
|
|
156
|
-
type="button"
|
|
157
|
-
variant="ghost"
|
|
158
|
-
size="icon-sm"
|
|
159
|
-
aria-label="Close"
|
|
160
|
-
onClick={() => onOpenChange(false)}
|
|
161
|
-
>
|
|
162
|
-
<i className="fa-light fa-xmark text-[13px]" aria-hidden="true" />
|
|
163
|
-
</Button>
|
|
164
|
-
</Tip>
|
|
165
|
-
</div>
|
|
166
|
-
|
|
167
|
-
{/* Record count */}
|
|
168
|
-
<p className="px-4 pb-3 text-sm text-muted-foreground -mt-1">
|
|
169
|
-
{totalRows} record{totalRows !== 1 ? "s" : ""} available for export.
|
|
170
|
-
</p>
|
|
171
|
-
|
|
172
|
-
{/* Form body */}
|
|
173
|
-
<Form {...form}>
|
|
174
|
-
<form
|
|
175
|
-
id="export-form"
|
|
176
|
-
onSubmit={form.handleSubmit(onSubmit)}
|
|
177
|
-
className="flex-1 overflow-y-auto"
|
|
178
|
-
>
|
|
179
|
-
<div className="px-4 pb-4 space-y-5">
|
|
180
|
-
|
|
181
|
-
{/* File format */}
|
|
182
|
-
<FormField
|
|
183
|
-
control={form.control}
|
|
184
|
-
name="format"
|
|
185
|
-
render={({ field }) => (
|
|
186
|
-
<FormItem>
|
|
187
|
-
<FormControl>
|
|
188
|
-
<SelectionTileGrid
|
|
189
|
-
sectionLabel="File format"
|
|
190
|
-
options={EXPORT_FORMAT_OPTIONS}
|
|
191
|
-
columns={3}
|
|
192
|
-
value={field.value}
|
|
193
|
-
onValueChange={field.onChange}
|
|
194
|
-
interaction="radio"
|
|
195
|
-
idPrefix="export-fmt"
|
|
196
|
-
itemVariant="outline"
|
|
197
|
-
itemMotion="pop"
|
|
198
|
-
/>
|
|
199
|
-
</FormControl>
|
|
200
|
-
<FormMessage />
|
|
201
|
-
</FormItem>
|
|
202
|
-
)}
|
|
203
|
-
/>
|
|
204
|
-
|
|
205
|
-
{/* Date range */}
|
|
206
|
-
<fieldset className="space-y-2">
|
|
207
|
-
<legend className="text-sm font-medium leading-none mb-2">
|
|
208
|
-
Date range{" "}
|
|
209
|
-
<span className="text-muted-foreground font-normal">(optional)</span>
|
|
210
|
-
</legend>
|
|
211
|
-
<div className="grid grid-cols-2 gap-3">
|
|
212
|
-
<FormField
|
|
213
|
-
control={form.control}
|
|
214
|
-
name="dateFrom"
|
|
215
|
-
render={({ field }) => (
|
|
216
|
-
<FormItem className="gap-1">
|
|
217
|
-
<FormLabel htmlFor="export-date-from" className="text-xs text-muted-foreground">
|
|
218
|
-
From
|
|
219
|
-
</FormLabel>
|
|
220
|
-
<FormControl>
|
|
221
|
-
<FilterTextValueInput
|
|
222
|
-
id="export-date-from"
|
|
223
|
-
mask="dateMDY"
|
|
224
|
-
aria-label="Export from date (optional)"
|
|
225
|
-
placeholder="MM/DD/YYYY"
|
|
226
|
-
value={field.value ?? ""}
|
|
227
|
-
onValueChange={field.onChange}
|
|
228
|
-
className="h-8 text-sm"
|
|
229
|
-
/>
|
|
230
|
-
</FormControl>
|
|
231
|
-
<FormDescription className="text-[11px]">MM/DD/YYYY</FormDescription>
|
|
232
|
-
<FormMessage />
|
|
233
|
-
</FormItem>
|
|
234
|
-
)}
|
|
235
|
-
/>
|
|
236
|
-
<FormField
|
|
237
|
-
control={form.control}
|
|
238
|
-
name="dateTo"
|
|
239
|
-
render={({ field }) => (
|
|
240
|
-
<FormItem className="gap-1">
|
|
241
|
-
<FormLabel htmlFor="export-date-to" className="text-xs text-muted-foreground">
|
|
242
|
-
To
|
|
243
|
-
</FormLabel>
|
|
244
|
-
<FormControl>
|
|
245
|
-
<FilterTextValueInput
|
|
246
|
-
id="export-date-to"
|
|
247
|
-
mask="dateMDY"
|
|
248
|
-
aria-label="Export to date (optional)"
|
|
249
|
-
placeholder="MM/DD/YYYY"
|
|
250
|
-
value={field.value ?? ""}
|
|
251
|
-
onValueChange={field.onChange}
|
|
252
|
-
className="h-8 text-sm"
|
|
253
|
-
/>
|
|
254
|
-
</FormControl>
|
|
255
|
-
<FormDescription className="text-[11px]">MM/DD/YYYY</FormDescription>
|
|
256
|
-
<FormMessage />
|
|
257
|
-
</FormItem>
|
|
258
|
-
)}
|
|
259
|
-
/>
|
|
260
|
-
</div>
|
|
261
|
-
</fieldset>
|
|
262
|
-
|
|
263
|
-
{/* Columns */}
|
|
264
|
-
<FormField
|
|
265
|
-
control={form.control}
|
|
266
|
-
name="columns"
|
|
267
|
-
render={({ field }) => (
|
|
268
|
-
<FormItem>
|
|
269
|
-
<FormLabel className="text-sm font-medium">Columns</FormLabel>
|
|
270
|
-
<FormControl>
|
|
271
|
-
<RadioGroup
|
|
272
|
-
value={field.value}
|
|
273
|
-
onValueChange={field.onChange}
|
|
274
|
-
className="space-y-1.5 mt-1"
|
|
275
|
-
itemVariant="outline"
|
|
276
|
-
itemMotion="pop"
|
|
277
|
-
>
|
|
278
|
-
{([
|
|
279
|
-
{ value: "all", label: "All columns", sub: null },
|
|
280
|
-
{ value: "visible", label: "Visible columns only", sub: visibleColumns !== undefined ? `${visibleColumns} columns` : null },
|
|
281
|
-
] as const).map(opt => (
|
|
282
|
-
<div
|
|
283
|
-
key={opt.value}
|
|
284
|
-
className="flex items-center gap-2.5 rounded-lg border border-border px-3 py-2.5 transition-colors hover:bg-interactive-hover has-[[data-state=checked]]:border-brand has-[[data-state=checked]]:bg-brand/10 cursor-pointer"
|
|
285
|
-
>
|
|
286
|
-
<RadioGroupItem value={opt.value} id={`col-${opt.value}`} />
|
|
287
|
-
<RadioGroupLabel
|
|
288
|
-
htmlFor={`col-${opt.value}`}
|
|
289
|
-
className="min-h-0 flex-1 cursor-pointer py-0 text-sm font-normal leading-none"
|
|
290
|
-
>
|
|
291
|
-
{opt.label}
|
|
292
|
-
{opt.sub && (
|
|
293
|
-
<span className="text-muted-foreground ml-1.5 font-normal">({opt.sub})</span>
|
|
294
|
-
)}
|
|
295
|
-
</RadioGroupLabel>
|
|
296
|
-
</div>
|
|
297
|
-
))}
|
|
298
|
-
</RadioGroup>
|
|
299
|
-
</FormControl>
|
|
300
|
-
<FormMessage />
|
|
301
|
-
</FormItem>
|
|
302
|
-
)}
|
|
303
|
-
/>
|
|
304
|
-
|
|
305
|
-
{/* Include filters */}
|
|
306
|
-
<FormField
|
|
307
|
-
control={form.control}
|
|
308
|
-
name="includeFilters"
|
|
309
|
-
render={({ field }) => (
|
|
310
|
-
<FormItem>
|
|
311
|
-
<div className="flex items-start gap-3 rounded-lg border border-border px-3 py-2.5 transition-colors hover:bg-interactive-hover has-[[data-state=checked]]:border-primary">
|
|
312
|
-
<FormControl>
|
|
313
|
-
<Checkbox
|
|
314
|
-
id="include-filters"
|
|
315
|
-
checked={field.value}
|
|
316
|
-
onCheckedChange={field.onChange}
|
|
317
|
-
className="mt-0.5 shrink-0"
|
|
318
|
-
/>
|
|
319
|
-
</FormControl>
|
|
320
|
-
<div className="min-w-0">
|
|
321
|
-
<Label htmlFor="include-filters" className="text-sm cursor-pointer font-medium leading-none">
|
|
322
|
-
Apply active filters
|
|
323
|
-
</Label>
|
|
324
|
-
<p className="text-xs text-muted-foreground mt-1">
|
|
325
|
-
Export only rows matching current filters
|
|
326
|
-
</p>
|
|
327
|
-
</div>
|
|
328
|
-
</div>
|
|
329
|
-
<FormMessage />
|
|
330
|
-
</FormItem>
|
|
331
|
-
)}
|
|
332
|
-
/>
|
|
333
|
-
|
|
334
|
-
</div>
|
|
335
|
-
</form>
|
|
336
|
-
</Form>
|
|
337
|
-
|
|
338
|
-
{/* Global bindings — only active while the drawer is open (Sheet unmounts content on close) */}
|
|
339
|
-
<Shortcut keys="Enter" disabled={isExporting} onInvoke={() => form.handleSubmit(onSubmit)()} />
|
|
340
|
-
|
|
341
|
-
{/* Footer */}
|
|
342
|
-
<div className="flex items-center gap-2 px-4 py-3 border-t border-border">
|
|
343
|
-
<Button
|
|
344
|
-
type="button"
|
|
345
|
-
variant="outline"
|
|
346
|
-
className="flex-1"
|
|
347
|
-
onClick={() => onOpenChange(false)}
|
|
348
|
-
>
|
|
349
|
-
Cancel
|
|
350
|
-
<KbdGroup className="ml-1.5"><Kbd variant="bare">Esc</Kbd></KbdGroup>
|
|
351
|
-
</Button>
|
|
352
|
-
<Button
|
|
353
|
-
type="submit"
|
|
354
|
-
form="export-form"
|
|
355
|
-
className="flex-1"
|
|
356
|
-
disabled={isExporting}
|
|
357
|
-
>
|
|
358
|
-
{isExporting ? (
|
|
359
|
-
<>
|
|
360
|
-
<i className="fa-light fa-spinner-third fa-spin text-[13px]" aria-hidden="true" />
|
|
361
|
-
Exporting…
|
|
362
|
-
</>
|
|
363
|
-
) : (
|
|
364
|
-
<>
|
|
365
|
-
<i className="fa-light fa-arrow-down-to-line text-[13px]" aria-hidden="true" />
|
|
366
|
-
Export
|
|
367
|
-
<KbdGroup className="ml-1.5"><Kbd variant="bare">⏎</Kbd></KbdGroup>
|
|
368
|
-
</>
|
|
369
|
-
)}
|
|
370
|
-
</Button>
|
|
371
|
-
</div>
|
|
372
|
-
</SheetContent>
|
|
373
|
-
</Sheet>
|
|
374
|
-
)
|
|
375
|
-
}
|
|
1
|
+
export * from "@exxatdesignux/ui/components/export-drawer"
|
|
@@ -129,23 +129,23 @@ function ExxatLogoBase({
|
|
|
129
129
|
<g data-exxat-prefix>
|
|
130
130
|
<path
|
|
131
131
|
d="M196 35.7646L235.626 35.811C239.705 35.8108 250.804 36.0941 254.421 35.6509L254.407 50.8756C240.766 50.8038 227.125 50.8041 213.485 50.877L213.495 74.3467C224.554 74.3448 238.413 74.7338 249.193 74.2652L249.203 89.7182C245.211 89.4232 239.525 89.5845 235.431 89.5872L213.496 89.6342L213.484 113.004L256.078 112.926L256.072 128.097C251.917 127.617 239.134 127.901 234.375 127.929C221.693 128.004 208.639 127.754 196 127.94V35.7646Z"
|
|
132
|
-
className="fill-[
|
|
132
|
+
className="fill-[var(--exxat-color-wordmark-ink-light)] dark:fill-[var(--exxat-color-wordmark-ink-dark)]"
|
|
133
133
|
/>
|
|
134
134
|
<path
|
|
135
135
|
d="M311.843 57.1062C314.843 57.097 327.108 56.8601 329.377 57.2135L329.606 57.8503C329.333 60.3776 324.215 67.3436 322.511 69.9223C317.651 77.1875 312.847 84.4905 308.101 91.8305C309.118 93.8473 311.981 98.1472 313.27 100.2L323.962 117.113C325.904 120.182 329.179 124.459 329.551 127.99C323.658 127.748 316.574 127.94 310.593 127.946C307.782 122.799 304.084 117.694 301.099 112.597C299.196 109.347 296.932 105.769 294.706 102.746C293.772 104.889 290.7 109.57 289.357 111.724C285.993 117.165 282.58 122.576 279.12 127.956C276.595 127.908 261.817 128.243 260.671 127.615C260.249 126.007 261.797 123.527 262.702 122.205C269.332 112.519 275.107 101.261 281.979 91.8322C281.555 91.3258 281.153 90.8019 280.774 90.2617C279.987 89.1263 279.24 87.9296 278.486 86.7642C272.548 77.5965 266.263 68.6263 260.479 59.3668C260.192 58.9075 260.442 57.6507 260.539 57.1068C266.332 57.0478 272.125 57.0656 277.917 57.1596C283.454 64.9372 289.73 74.44 294.84 82.5018C296.784 80.011 299.246 76.0686 301.022 73.3917L311.843 57.1062Z"
|
|
136
|
-
className="fill-[
|
|
136
|
+
className="fill-[var(--exxat-color-wordmark-ink-light)] dark:fill-[var(--exxat-color-wordmark-ink-dark)]"
|
|
137
137
|
/>
|
|
138
138
|
<path
|
|
139
139
|
d="M331.798 57.0712C337.592 57.1185 343.354 57.0072 349.156 57.1749C351.068 59.3357 353.387 63.1655 355.063 65.6344C358.847 71.2087 362.432 77.014 366.36 82.4907C370.845 75.0665 378.273 64.1367 383.331 57.1032C385.626 57.0945 399.689 56.8398 400.866 57.3117C401.39 58.6028 399.759 61.1078 399.008 62.1658C392.221 71.7261 386.21 82.4699 379.267 91.8592C383.35 97.6717 387.268 104.526 391.166 110.532C393.16 113.606 400.626 124.783 400.949 127.559C399.879 128.243 384.096 127.95 382.001 127.951C377.115 119.684 371.356 110.895 366.217 102.718C364.993 105.113 362.366 109.016 360.85 111.436C357.401 116.922 353.992 122.433 350.622 127.968C348.242 127.897 332.898 128.279 332.168 127.57C332.118 126.754 332.069 125.826 332.449 125.099C334.495 121.173 337.285 117.058 339.661 113.307L353.193 91.8005C352.418 90.7063 351.628 89.4998 350.898 88.362C344.705 78.7208 337.866 69.3865 332.081 59.5087C331.713 58.8803 331.753 57.7841 331.798 57.0712Z"
|
|
140
|
-
className="fill-[
|
|
140
|
+
className="fill-[var(--exxat-color-wordmark-ink-light)] dark:fill-[var(--exxat-color-wordmark-ink-dark)]"
|
|
141
141
|
/>
|
|
142
142
|
<path
|
|
143
143
|
d="M430.755 55.7344C443.603 55.2553 459.709 58.3988 463.175 73.143C464.166 77.3587 463.884 82.6952 463.877 87.0408L463.845 105.91C463.857 112.149 463.051 112.645 469.328 113.205C469.057 117.66 469.234 123.628 469.242 128.194C461.169 128.149 448.96 129.818 446.764 119.668C444.471 122.422 443.567 123.605 440.357 125.604C433.884 129.636 423.423 129.934 416.178 128.172C410.382 126.762 405.62 123.519 402.512 118.29C400.527 114.233 400.122 109.477 400.649 105.072C402.505 89.5606 418.762 87.5983 431.172 85.928C435.522 85.237 440.828 84.6483 444.472 82.0073C447.548 79.7708 447.168 76.525 444.97 73.7922C440.68 68.4582 429.516 68.0981 424.356 72.2079C421.359 74.5939 420.834 77.8667 420.5 81.4362C414.437 81.3803 408.373 81.3842 402.31 81.4478C402.503 79.5217 402.653 77.3957 403.031 75.5059C405.774 61.7822 418.095 56.4115 430.755 55.7344ZM420.852 112.903C428.033 116.948 440.992 113.872 444.937 106.311C445.852 104.557 447.932 97.6766 446.702 95.9674L446.344 95.9145C442.708 97.4881 435.913 98.8678 431.795 99.3372C425.343 100.072 411.452 104.687 420.852 112.903Z"
|
|
144
|
-
className="fill-[
|
|
144
|
+
className="fill-[var(--exxat-color-wordmark-ink-light)] dark:fill-[var(--exxat-color-wordmark-ink-dark)]"
|
|
145
145
|
/>
|
|
146
146
|
<path
|
|
147
147
|
d="M479.835 35.8541C485.68 35.8897 491.521 35.8895 497.366 35.853C497.152 42.4806 497.332 50.2661 497.324 56.9807L514.284 56.9509L514.292 72.0978C508.643 72.0524 502.993 72.036 497.341 72.0485L497.313 93.563C497.313 97.0693 496.581 108.123 499.41 110.474C502.231 112.82 510.459 112.62 514.295 112.135L514.279 123.529L514.292 127.437C511.116 127.895 507.911 128.146 504.704 128.188C479.71 128.491 479.891 117.266 479.916 96.9484C479.949 88.6621 479.938 80.3759 479.88 72.09C476.431 72.026 471.882 71.9331 468.516 72.1906C468.292 67.7063 468.488 61.552 468.523 56.9865C469.391 56.999 470.258 56.9979 471.126 56.9829C482.417 56.741 480.091 43.7789 479.835 35.8541Z"
|
|
148
|
-
className="fill-[
|
|
148
|
+
className="fill-[var(--exxat-color-wordmark-ink-light)] dark:fill-[var(--exxat-color-wordmark-ink-dark)]"
|
|
149
149
|
/>
|
|
150
150
|
</g>
|
|
151
151
|
|
|
@@ -120,7 +120,7 @@ function TreeItem({
|
|
|
120
120
|
type="button"
|
|
121
121
|
onClick={() => onSelectItem(folder.id)}
|
|
122
122
|
className={cn(
|
|
123
|
-
"flex min-w-0 flex-1 items-center gap-2 py-1.5
|
|
123
|
+
"flex min-w-0 flex-1 items-center gap-2 py-1.5 pe-3 text-left text-sm transition-colors duration-75",
|
|
124
124
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset",
|
|
125
125
|
!isFolderSelected && "text-foreground",
|
|
126
126
|
)}
|
|
@@ -135,7 +135,7 @@ function TreeItem({
|
|
|
135
135
|
/>
|
|
136
136
|
<span className="truncate leading-tight">{folder.name}</span>
|
|
137
137
|
{hasChildren && (
|
|
138
|
-
<span className="
|
|
138
|
+
<span className="ms-auto shrink-0 text-xs tabular-nums text-muted-foreground">
|
|
139
139
|
{childFolders.length + childQuestions.length}
|
|
140
140
|
</span>
|
|
141
141
|
)}
|
|
@@ -320,7 +320,7 @@ export function InviteCollaboratorsDrawer({
|
|
|
320
320
|
<>
|
|
321
321
|
<i className="fa-light fa-user-plus" aria-hidden="true" />
|
|
322
322
|
Send invite
|
|
323
|
-
<KbdGroup className="
|
|
323
|
+
<KbdGroup className="ms-1.5"><Kbd variant="bare">⏎</Kbd></KbdGroup>
|
|
324
324
|
</>
|
|
325
325
|
)}
|
|
326
326
|
</Button>
|
|
@@ -435,7 +435,7 @@ export function InviteCollaboratorsDrawer({
|
|
|
435
435
|
<DialogFooter className="gap-2 sm:gap-2">
|
|
436
436
|
<Button type="button" variant="outline" onClick={() => setRemoveTarget(null)}>
|
|
437
437
|
Cancel
|
|
438
|
-
<KbdGroup className="
|
|
438
|
+
<KbdGroup className="ms-1.5"><Kbd variant="bare">Esc</Kbd></KbdGroup>
|
|
439
439
|
</Button>
|
|
440
440
|
<Button
|
|
441
441
|
type="button"
|
|
@@ -444,7 +444,7 @@ export function InviteCollaboratorsDrawer({
|
|
|
444
444
|
disabled={!removeTarget || !canRemoveCollaboratorFromRoster(removeTarget, collaborators)}
|
|
445
445
|
>
|
|
446
446
|
Remove
|
|
447
|
-
<KbdGroup className="
|
|
447
|
+
<KbdGroup className="ms-1.5"><Kbd variant="bare">⏎</Kbd></KbdGroup>
|
|
448
448
|
</Button>
|
|
449
449
|
</DialogFooter>
|
|
450
450
|
</DialogContent>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* KeyMetricsAskLeoBridge — adapter that connects the design-system
|
|
5
|
+
* `KeyMetrics` injection points (`KeyMetricsProvider`) to this app's
|
|
6
|
+
* Ask Leo runtime (`useAskLeo` + `AskLeoShortcutKbds`).
|
|
7
|
+
*
|
|
8
|
+
* Lives in `apps/web` because the bridge is app-specific: it ties
|
|
9
|
+
* the design-system primitive to a concrete assistant + keyboard
|
|
10
|
+
* shortcut. Other consumers of `@exxatdesignux/ui` can ship a
|
|
11
|
+
* different bridge (Copilot, ChatGPT, no-AI) without touching the
|
|
12
|
+
* package itself.
|
|
13
|
+
*
|
|
14
|
+
* Mount this just inside `<AskLeoProvider>` in `(app)/layout.tsx` so
|
|
15
|
+
* every `<KeyMetrics />` descendant transparently picks up the
|
|
16
|
+
* "Ask Leo about these metrics" CTA and the `⌘⌥K` tooltip chord.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import * as React from "react"
|
|
20
|
+
|
|
21
|
+
import { AskLeoShortcutKbds, useAskLeo } from "@/components/ask-leo-sidebar"
|
|
22
|
+
import { KeyMetricsProvider } from "@exxatdesignux/ui/components/key-metrics"
|
|
23
|
+
|
|
24
|
+
export function KeyMetricsAskLeoBridge({
|
|
25
|
+
children,
|
|
26
|
+
}: {
|
|
27
|
+
children: React.ReactNode
|
|
28
|
+
}) {
|
|
29
|
+
const { toggle } = useAskLeo()
|
|
30
|
+
const shortcutHint = React.useMemo(() => <AskLeoShortcutKbds />, [])
|
|
31
|
+
const value = React.useMemo(
|
|
32
|
+
() => ({
|
|
33
|
+
defaultInsightAction: toggle,
|
|
34
|
+
shortcutHint,
|
|
35
|
+
defaultActionLabel: "Ask Leo",
|
|
36
|
+
}),
|
|
37
|
+
[toggle, shortcutHint],
|
|
38
|
+
)
|
|
39
|
+
return <KeyMetricsProvider value={value}>{children}</KeyMetricsProvider>
|
|
40
|
+
}
|