@exxatdesignux/ui 0.2.19 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +662 -7
- package/bin/sync-extras.mjs +116 -29
- package/consumer-extras/README.md +42 -7
- package/consumer-extras/cursor-rules/exxat-accessibility.mdc +39 -0
- package/consumer-extras/cursor-rules/exxat-board-cards.mdc +26 -0
- package/consumer-extras/cursor-rules/exxat-breadcrumbs-no-back.mdc +21 -0
- package/consumer-extras/cursor-rules/exxat-card-vs-list-rows.mdc +21 -0
- package/consumer-extras/cursor-rules/exxat-centralized-list-dataset.mdc +44 -0
- package/consumer-extras/cursor-rules/exxat-collaboration-access.mdc +32 -0
- package/consumer-extras/cursor-rules/exxat-command-menu.mdc +22 -0
- package/consumer-extras/cursor-rules/exxat-dashboard-view-charts.mdc +53 -0
- package/consumer-extras/cursor-rules/exxat-data-tables.mdc +43 -0
- package/consumer-extras/cursor-rules/exxat-dedicated-search-surfaces.mdc +25 -0
- package/consumer-extras/cursor-rules/exxat-drawer-vs-dialog.mdc +22 -0
- package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +56 -0
- package/consumer-extras/cursor-rules/exxat-fontawesome-icons.mdc +31 -0
- package/consumer-extras/cursor-rules/exxat-kbd-shortcuts.mdc +100 -0
- package/consumer-extras/cursor-rules/exxat-kpi-flat-band.mdc +28 -0
- package/consumer-extras/cursor-rules/exxat-kpi-max-four.mdc +21 -0
- package/consumer-extras/cursor-rules/exxat-kpi-trends.mdc +31 -0
- package/consumer-extras/cursor-rules/exxat-library-hub-header.mdc +28 -0
- package/consumer-extras/cursor-rules/exxat-list-page-connected-views.mdc +24 -0
- package/consumer-extras/cursor-rules/exxat-list-page-view-shells.mdc +31 -0
- package/consumer-extras/cursor-rules/exxat-mono-ids.mdc +30 -0
- package/consumer-extras/cursor-rules/exxat-no-slds-leakage.mdc +78 -0
- package/consumer-extras/cursor-rules/exxat-no-toast.mdc +25 -0
- package/consumer-extras/cursor-rules/exxat-page-vs-drawer.mdc +23 -0
- package/consumer-extras/cursor-rules/exxat-person-identity-display.mdc +47 -0
- package/consumer-extras/cursor-rules/exxat-primary-nav-secondary-panel.mdc +52 -0
- package/consumer-extras/cursor-rules/exxat-reuse-before-custom.mdc +34 -0
- package/consumer-extras/cursor-rules/exxat-table-properties-drawer.mdc +77 -0
- package/consumer-extras/cursor-rules/exxat-token-discipline.mdc +103 -0
- package/consumer-extras/cursor-skills/exxat-accessibility/SKILL.md +1 -1
- package/consumer-extras/cursor-skills/exxat-board-cards/SKILL.md +3 -3
- package/consumer-extras/cursor-skills/exxat-centralized-list-dataset/SKILL.md +5 -16
- package/consumer-extras/cursor-skills/exxat-collaboration-access/SKILL.md +3 -3
- package/consumer-extras/cursor-skills/exxat-dedicated-search-surfaces/SKILL.md +2 -2
- package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +19 -34
- package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +1 -1
- package/consumer-extras/cursor-skills/exxat-kpi-flat-band/SKILL.md +1 -1
- package/consumer-extras/cursor-skills/exxat-list-page-view-shells/SKILL.md +1 -1
- package/consumer-extras/cursor-skills/exxat-mono-ids/SKILL.md +4 -4
- package/consumer-extras/cursor-skills/exxat-primary-nav-secondary-panel/SKILL.md +10 -12
- package/consumer-extras/cursor-skills/exxat-token-economy/SKILL.md +277 -0
- package/consumer-extras/handbook/HANDBOOK.md +187 -0
- package/consumer-extras/handbook/glossary.md +58 -0
- package/consumer-extras/handbook/reference-implementations.md +153 -0
- package/consumer-extras/handbook/voice-and-tone.md +262 -0
- package/consumer-extras/patterns/collaboration-access-pattern.md +7 -7
- package/consumer-extras/patterns/command-menu-pattern.md +1 -1
- package/consumer-extras/patterns/consumer-upgrade-checklist.md +0 -20
- package/consumer-extras/patterns/data-views-pattern.md +31 -66
- package/consumer-extras/patterns/kpi-flat-band-pattern.md +2 -2
- package/consumer-extras/patterns/shell-surface-elevation-pattern.md +3 -5
- package/dist/components/data-table/filter-date-calendar.d.ts +10 -0
- package/dist/components/data-table/filter-date-calendar.js +280 -0
- package/dist/components/data-table/filter-date-calendar.js.map +1 -0
- package/dist/components/data-table/filter-text-value-input.d.ts +15 -0
- package/dist/components/data-table/filter-text-value-input.js +561 -0
- package/dist/components/data-table/filter-text-value-input.js.map +1 -0
- package/dist/components/data-table/index.d.ts +45 -0
- package/dist/components/data-table/index.js +3085 -0
- package/dist/components/data-table/index.js.map +1 -0
- package/dist/components/data-table/pagination.d.ts +28 -0
- package/dist/components/data-table/pagination.js +3264 -0
- package/dist/components/data-table/pagination.js.map +1 -0
- package/dist/components/data-table/types.d.ts +84 -0
- package/dist/components/data-table/types.js +3 -0
- package/dist/components/data-table/types.js.map +1 -0
- package/dist/components/data-table/use-table-state.d.ts +116 -0
- package/dist/components/data-table/use-table-state.js +670 -0
- package/dist/components/data-table/use-table-state.js.map +1 -0
- package/dist/components/data-views/board-card-primitives.d.ts +22 -0
- package/dist/components/data-views/board-card-primitives.js +84 -0
- package/dist/components/data-views/board-card-primitives.js.map +1 -0
- package/dist/components/data-views/data-row-list.d.ts +33 -0
- package/dist/components/data-views/data-row-list.js +106 -0
- package/dist/components/data-views/data-row-list.js.map +1 -0
- package/dist/components/data-views/finder-panel-view.d.ts +54 -0
- package/dist/components/data-views/finder-panel-view.js +388 -0
- package/dist/components/data-views/finder-panel-view.js.map +1 -0
- package/dist/components/data-views/folder-grid-view.d.ts +22 -0
- package/dist/components/data-views/folder-grid-view.js +58 -0
- package/dist/components/data-views/folder-grid-view.js.map +1 -0
- package/dist/components/data-views/hub-table.d.ts +173 -0
- package/dist/components/data-views/hub-table.js +5783 -0
- package/dist/components/data-views/hub-table.js.map +1 -0
- package/dist/components/data-views/index.d.ts +27 -0
- package/dist/components/data-views/index.js +6797 -0
- package/dist/components/data-views/index.js.map +1 -0
- package/dist/components/data-views/list-page-board-card.d.ts +72 -0
- package/dist/components/data-views/list-page-board-card.js +264 -0
- package/dist/components/data-views/list-page-board-card.js.map +1 -0
- package/dist/components/data-views/list-page-board-template.d.ts +24 -0
- package/dist/components/data-views/list-page-board-template.js +137 -0
- package/dist/components/data-views/list-page-board-template.js.map +1 -0
- package/dist/components/data-views/list-page-connected-view-body.d.ts +19 -0
- package/dist/components/data-views/list-page-connected-view-body.js +116 -0
- package/dist/components/data-views/list-page-connected-view-body.js.map +1 -0
- package/dist/components/data-views/list-page-split-details-placeholder.d.ts +14 -0
- package/dist/components/data-views/list-page-split-details-placeholder.js +38 -0
- package/dist/components/data-views/list-page-split-details-placeholder.js.map +1 -0
- package/dist/components/data-views/list-page-split-hub-chrome.d.ts +17 -0
- package/dist/components/data-views/list-page-split-hub-chrome.js +54 -0
- package/dist/components/data-views/list-page-split-hub-chrome.js.map +1 -0
- package/dist/components/data-views/list-page-split-hub-tokens.d.ts +12 -0
- package/dist/components/data-views/list-page-split-hub-tokens.js +8 -0
- package/dist/components/data-views/list-page-split-hub-tokens.js.map +1 -0
- package/dist/components/data-views/list-page-tree-column-header.d.ts +15 -0
- package/dist/components/data-views/list-page-tree-column-header.js +22 -0
- package/dist/components/data-views/list-page-tree-column-header.js.map +1 -0
- package/dist/components/data-views/list-page-tree-panel-shell.d.ts +25 -0
- package/dist/components/data-views/list-page-tree-panel-shell.js +146 -0
- package/dist/components/data-views/list-page-tree-panel-shell.js.map +1 -0
- package/dist/components/data-views/os-folder-glyph.d.ts +35 -0
- package/dist/components/data-views/os-folder-glyph.js +104 -0
- package/dist/components/data-views/os-folder-glyph.js.map +1 -0
- package/dist/components/data-views/outline-tree-menu.d.ts +36 -0
- package/dist/components/data-views/outline-tree-menu.js +131 -0
- package/dist/components/data-views/outline-tree-menu.js.map +1 -0
- package/dist/components/table-properties/column-row.d.ts +22 -0
- package/dist/components/table-properties/column-row.js +153 -0
- package/dist/components/table-properties/column-row.js.map +1 -0
- package/dist/components/table-properties/draggable-list.d.ts +24 -0
- package/dist/components/table-properties/draggable-list.js +53 -0
- package/dist/components/table-properties/draggable-list.js.map +1 -0
- package/dist/components/table-properties/drawer-button.d.ts +110 -0
- package/dist/components/table-properties/drawer-button.js +2748 -0
- package/dist/components/table-properties/drawer-button.js.map +1 -0
- package/dist/components/table-properties/drawer.d.ts +100 -0
- package/dist/components/table-properties/drawer.js +2595 -0
- package/dist/components/table-properties/drawer.js.map +1 -0
- package/dist/components/table-properties/filter-card.d.ts +24 -0
- package/dist/components/table-properties/filter-card.js +854 -0
- package/dist/components/table-properties/filter-card.js.map +1 -0
- package/dist/components/table-properties/index.d.ts +14 -0
- package/dist/components/table-properties/index.js +2768 -0
- package/dist/components/table-properties/index.js.map +1 -0
- package/dist/components/table-properties/sort-card.d.ts +20 -0
- package/dist/components/table-properties/sort-card.js +102 -0
- package/dist/components/table-properties/sort-card.js.map +1 -0
- package/dist/components/templates/dedicated-search-landing-template.d.ts +21 -0
- package/dist/components/templates/dedicated-search-landing-template.js +254 -0
- package/dist/components/templates/dedicated-search-landing-template.js.map +1 -0
- package/dist/components/templates/dedicated-search-results-template.d.ts +15 -0
- package/dist/components/templates/dedicated-search-results-template.js +16 -0
- package/dist/components/templates/dedicated-search-results-template.js.map +1 -0
- package/dist/components/templates/index.d.ts +9 -0
- package/dist/components/templates/index.js +2720 -0
- package/dist/components/templates/index.js.map +1 -0
- package/dist/components/templates/list-page.d.ts +83 -0
- package/dist/components/templates/list-page.js +2433 -0
- package/dist/components/templates/list-page.js.map +1 -0
- package/dist/components/templates/nested-secondary-panel-shell.d.ts +20 -0
- package/dist/components/templates/nested-secondary-panel-shell.js +54 -0
- package/dist/components/templates/nested-secondary-panel-shell.js.map +1 -0
- package/dist/components/ui/accordion.d.ts +10 -0
- package/dist/components/ui/accordion.js +74 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/components/ui/alert-dialog.d.ts +37 -0
- package/dist/components/ui/alert-dialog.js +201 -0
- package/dist/components/ui/alert-dialog.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +84 -0
- package/dist/components/ui/avatar.js +328 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.d.ts +13 -0
- package/dist/components/ui/badge.js +49 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/banner.d.ts +62 -0
- package/dist/components/ui/banner.js +364 -0
- package/dist/components/ui/banner.js.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts +14 -0
- package/dist/components/ui/breadcrumb.js +114 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/components/ui/button.d.ts +16 -0
- package/dist/components/ui/button.js +59 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/calendar.d.ts +13 -0
- package/dist/components/ui/calendar.js +238 -0
- package/dist/components/ui/calendar.js.map +1 -0
- package/dist/components/ui/card.d.ts +14 -0
- package/dist/components/ui/card.js +102 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/chart.d.ts +58 -0
- package/dist/components/ui/chart.js +292 -0
- package/dist/components/ui/chart.js.map +1 -0
- package/dist/components/ui/checkbox.d.ts +23 -0
- package/dist/components/ui/checkbox.js +155 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/coach-mark.d.ts +27 -0
- package/dist/components/ui/coach-mark.js +306 -0
- package/dist/components/ui/coach-mark.js.map +1 -0
- package/dist/components/ui/collapsible.d.ts +8 -0
- package/dist/components/ui/collapsible.js +35 -0
- package/dist/components/ui/collapsible.js.map +1 -0
- package/dist/components/ui/command.d.ts +36 -0
- package/dist/components/ui/command.js +274 -0
- package/dist/components/ui/command.js.map +1 -0
- package/dist/components/ui/context-menu.d.ts +32 -0
- package/dist/components/ui/context-menu.js +245 -0
- package/dist/components/ui/context-menu.js.map +1 -0
- package/dist/components/ui/date-picker-field.d.ts +38 -0
- package/dist/components/ui/date-picker-field.js +550 -0
- package/dist/components/ui/date-picker-field.js.map +1 -0
- package/dist/components/ui/dialog.d.ts +22 -0
- package/dist/components/ui/dialog.js +200 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/dot-pattern.d.ts +21 -0
- package/dist/components/ui/dot-pattern.js +139 -0
- package/dist/components/ui/dot-pattern.js.map +1 -0
- package/dist/components/ui/drag-handle-grip.d.ts +10 -0
- package/dist/components/ui/drag-handle-grip.js +15 -0
- package/dist/components/ui/drag-handle-grip.js.map +1 -0
- package/dist/components/ui/drawer.d.ts +16 -0
- package/dist/components/ui/drawer.js +125 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +45 -0
- package/dist/components/ui/dropdown-menu.js +353 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/export-drawer.d.ts +11 -0
- package/dist/components/ui/export-drawer.js +1658 -0
- package/dist/components/ui/export-drawer.js.map +1 -0
- package/dist/components/ui/field.d.ts +30 -0
- package/dist/components/ui/field.js +249 -0
- package/dist/components/ui/field.js.map +1 -0
- package/dist/components/ui/form.d.ts +28 -0
- package/dist/components/ui/form.js +110 -0
- package/dist/components/ui/form.js.map +1 -0
- package/dist/components/ui/hover-card.d.ts +9 -0
- package/dist/components/ui/hover-card.js +43 -0
- package/dist/components/ui/hover-card.js.map +1 -0
- package/dist/components/ui/input-group.d.ts +20 -0
- package/dist/components/ui/input-group.js +219 -0
- package/dist/components/ui/input-group.js.map +1 -0
- package/dist/components/ui/input-mask.d.ts +39 -0
- package/dist/components/ui/input-mask.js +118 -0
- package/dist/components/ui/input-mask.js.map +1 -0
- package/dist/components/ui/input.d.ts +5 -0
- package/dist/components/ui/input.js +30 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/kbd.d.ts +20 -0
- package/dist/components/ui/kbd.js +45 -0
- package/dist/components/ui/kbd.js.map +1 -0
- package/dist/components/ui/key-metrics-context.d.ts +19 -0
- package/dist/components/ui/key-metrics-context.js +26 -0
- package/dist/components/ui/key-metrics-context.js.map +1 -0
- package/dist/components/ui/key-metrics.d.ts +131 -0
- package/dist/components/ui/key-metrics.js +1015 -0
- package/dist/components/ui/key-metrics.js.map +1 -0
- package/dist/components/ui/label.d.ts +6 -0
- package/dist/components/ui/label.js +28 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/list-page-view-frame.d.ts +22 -0
- package/dist/components/ui/list-page-view-frame.js +24 -0
- package/dist/components/ui/list-page-view-frame.js.map +1 -0
- package/dist/components/ui/page-header.d.ts +51 -0
- package/dist/components/ui/page-header.js +372 -0
- package/dist/components/ui/page-header.js.map +1 -0
- package/dist/components/ui/payment-card-fields.d.ts +10 -0
- package/dist/components/ui/payment-card-fields.js +80 -0
- package/dist/components/ui/payment-card-fields.js.map +1 -0
- package/dist/components/ui/popover.d.ts +10 -0
- package/dist/components/ui/popover.js +47 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/components/ui/radio-group.d.ts +29 -0
- package/dist/components/ui/radio-group.js +190 -0
- package/dist/components/ui/radio-group.js.map +1 -0
- package/dist/components/ui/resizable.d.ts +16 -0
- package/dist/components/ui/resizable.js +51 -0
- package/dist/components/ui/resizable.js.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +8 -0
- package/dist/components/ui/scroll-area.js +66 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/select.d.ts +18 -0
- package/dist/components/ui/select.js +186 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/selection-tile-grid.d.ts +52 -0
- package/dist/components/ui/selection-tile-grid.js +347 -0
- package/dist/components/ui/selection-tile-grid.js.map +1 -0
- package/dist/components/ui/separator.d.ts +7 -0
- package/dist/components/ui/separator.js +33 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/sheet.d.ts +18 -0
- package/dist/components/ui/sheet.js +181 -0
- package/dist/components/ui/sheet.js.map +1 -0
- package/dist/components/ui/sidebar.d.ts +94 -0
- package/dist/components/ui/sidebar.js +805 -0
- package/dist/components/ui/sidebar.js.map +1 -0
- package/dist/components/ui/skeleton.d.ts +5 -0
- package/dist/components/ui/skeleton.js +22 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/slider.d.ts +7 -0
- package/dist/components/ui/slider.js +66 -0
- package/dist/components/ui/slider.js.map +1 -0
- package/dist/components/ui/sonner.d.ts +6 -0
- package/dist/components/ui/sonner.js +38 -0
- package/dist/components/ui/sonner.js.map +1 -0
- package/dist/components/ui/status-badge.d.ts +38 -0
- package/dist/components/ui/status-badge.js +77 -0
- package/dist/components/ui/status-badge.js.map +1 -0
- package/dist/components/ui/table.d.ts +13 -0
- package/dist/components/ui/table.js +115 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.d.ts +15 -0
- package/dist/components/ui/tabs.js +93 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +6 -0
- package/dist/components/ui/textarea.js +25 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/tip.d.ts +12 -0
- package/dist/components/ui/tip.js +61 -0
- package/dist/components/ui/tip.js.map +1 -0
- package/dist/components/ui/toggle-group.d.ts +14 -0
- package/dist/components/ui/toggle-group.js +104 -0
- package/dist/components/ui/toggle-group.js.map +1 -0
- package/dist/components/ui/toggle-switch.d.ts +10 -0
- package/dist/components/ui/toggle-switch.js +33 -0
- package/dist/components/ui/toggle-switch.js.map +1 -0
- package/dist/components/ui/toggle.d.ts +13 -0
- package/dist/components/ui/toggle.js +51 -0
- package/dist/components/ui/toggle.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +10 -0
- package/dist/components/ui/tooltip.js +68 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/components/ui/view-segmented-control.d.ts +31 -0
- package/dist/components/ui/view-segmented-control.js +167 -0
- package/dist/components/ui/view-segmented-control.js.map +1 -0
- package/dist/data-list-view-registry-CyBoBML4.d.ts +73 -0
- package/dist/hooks/use-app-theme.d.ts +24 -0
- package/dist/hooks/use-app-theme.js +286 -0
- package/dist/hooks/use-app-theme.js.map +1 -0
- package/dist/hooks/use-coach-mark.d.ts +86 -0
- package/dist/hooks/use-coach-mark.js +218 -0
- package/dist/hooks/use-coach-mark.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +3 -0
- package/dist/hooks/use-mobile.js +29 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/use-mod-key-label.d.ts +6 -0
- package/dist/hooks/use-mod-key-label.js +25 -0
- package/dist/hooks/use-mod-key-label.js.map +1 -0
- package/dist/index.d.ts +120 -0
- package/dist/index.js +13421 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/compose-refs.d.ts +6 -0
- package/dist/lib/compose-refs.js +17 -0
- package/dist/lib/compose-refs.js.map +1 -0
- package/dist/lib/conditional-rule-match.d.ts +30 -0
- package/dist/lib/conditional-rule-match.js +66 -0
- package/dist/lib/conditional-rule-match.js.map +1 -0
- package/dist/lib/data-list-display-options.d.ts +26 -0
- package/dist/lib/data-list-display-options.js +14 -0
- package/dist/lib/data-list-display-options.js.map +1 -0
- package/dist/lib/data-list-view-registry.d.ts +2 -0
- package/dist/lib/data-list-view-registry.js +102 -0
- package/dist/lib/data-list-view-registry.js.map +1 -0
- package/dist/lib/data-list-view-surface.d.ts +2 -0
- package/dist/lib/data-list-view-surface.js +80 -0
- package/dist/lib/data-list-view-surface.js.map +1 -0
- package/dist/lib/data-list-view.d.ts +21 -0
- package/dist/lib/data-list-view.js +25 -0
- package/dist/lib/data-list-view.js.map +1 -0
- package/dist/lib/date-filter.d.ts +22 -0
- package/dist/lib/date-filter.js +61 -0
- package/dist/lib/date-filter.js.map +1 -0
- package/dist/lib/dev-log.d.ts +8 -0
- package/dist/lib/dev-log.js +10 -0
- package/dist/lib/dev-log.js.map +1 -0
- package/dist/lib/dropdown-menu-surface.d.ts +14 -0
- package/dist/lib/dropdown-menu-surface.js +6 -0
- package/dist/lib/dropdown-menu-surface.js.map +1 -0
- package/dist/lib/editable-target.d.ts +12 -0
- package/dist/lib/editable-target.js +12 -0
- package/dist/lib/editable-target.js.map +1 -0
- package/dist/lib/list-page-table-properties.d.ts +35 -0
- package/dist/lib/list-page-table-properties.js +81 -0
- package/dist/lib/list-page-table-properties.js.map +1 -0
- package/dist/lib/raf-throttle.d.ts +23 -0
- package/dist/lib/raf-throttle.js +27 -0
- package/dist/lib/raf-throttle.js.map +1 -0
- package/dist/lib/row-height.d.ts +16 -0
- package/dist/lib/row-height.js +10 -0
- package/dist/lib/row-height.js.map +1 -0
- package/dist/lib/table-properties-types.d.ts +83 -0
- package/dist/lib/table-properties-types.js +19 -0
- package/dist/lib/table-properties-types.js.map +1 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +11 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +83 -19
- package/src/components/data-table/filter-date-calendar.tsx +38 -0
- package/src/components/data-table/filter-text-value-input.tsx +77 -0
- package/src/components/data-table/index.tsx +1678 -0
- package/src/components/data-table/pagination.tsx +259 -0
- package/src/components/data-table/types.ts +96 -0
- package/src/components/data-table/use-table-state.ts +767 -0
- package/src/components/data-views/board-card-primitives.tsx +93 -0
- package/src/components/data-views/data-row-list.tsx +183 -0
- package/src/components/data-views/finder-panel-view.tsx +405 -0
- package/src/components/data-views/folder-grid-view.tsx +86 -0
- package/src/components/data-views/hub-table.tsx +606 -0
- package/src/components/data-views/index.ts +28 -0
- package/src/components/data-views/list-page-board-card.tsx +192 -0
- package/src/components/data-views/list-page-board-template.tsx +122 -0
- package/src/components/data-views/list-page-connected-view-body.tsx +66 -0
- package/src/components/data-views/list-page-split-details-placeholder.tsx +39 -0
- package/src/components/data-views/list-page-split-hub-chrome.tsx +60 -0
- package/src/components/data-views/list-page-split-hub-tokens.ts +16 -0
- package/src/components/data-views/list-page-tree-column-header.tsx +31 -0
- package/src/components/data-views/list-page-tree-panel-shell.tsx +91 -0
- package/src/components/data-views/os-folder-glyph.tsx +141 -0
- package/src/components/data-views/outline-tree-menu.tsx +157 -0
- package/src/components/table-properties/column-row.tsx +90 -0
- package/src/components/table-properties/draggable-list.ts +54 -0
- package/src/components/table-properties/drawer-button.tsx +300 -0
- package/src/components/table-properties/drawer.tsx +1148 -0
- package/src/components/table-properties/filter-card.tsx +251 -0
- package/src/components/table-properties/index.ts +36 -0
- package/src/components/table-properties/sort-card.tsx +63 -0
- package/src/components/templates/dedicated-search-landing-template.tsx +124 -0
- package/src/components/templates/dedicated-search-results-template.tsx +19 -0
- package/src/components/templates/index.ts +33 -0
- package/src/components/templates/list-page.tsx +602 -0
- package/src/components/templates/nested-secondary-panel-shell.tsx +70 -0
- package/src/components/ui/accordion.tsx +92 -0
- package/src/components/ui/alert-dialog.tsx +221 -0
- package/src/components/ui/avatar.tsx +13 -2
- package/src/components/ui/banner.tsx +2 -2
- package/src/components/ui/button.tsx +4 -4
- package/src/components/ui/calendar.tsx +1 -1
- package/src/components/ui/coach-mark.tsx +1 -1
- package/src/components/ui/context-menu.tsx +291 -0
- package/src/components/ui/date-picker-field.tsx +2 -2
- package/src/components/ui/dot-pattern.tsx +183 -0
- package/src/components/ui/export-drawer.tsx +375 -0
- package/src/components/ui/hover-card.tsx +66 -0
- package/src/components/ui/key-metrics-context.tsx +78 -0
- package/src/components/ui/key-metrics.tsx +1133 -0
- package/src/components/ui/list-page-view-frame.tsx +64 -0
- package/src/components/ui/page-header.tsx +244 -0
- package/src/components/ui/payment-card-fields.tsx +2 -2
- package/src/components/ui/resizable.tsx +68 -0
- package/src/components/ui/scroll-area.tsx +72 -0
- package/src/components/ui/selection-tile-grid.tsx +9 -2
- package/src/components/ui/sidebar.tsx +84 -12
- package/src/components/ui/slider.tsx +83 -0
- package/src/globals.css +2201 -7
- package/src/globals.d.ts +20 -0
- package/src/index.ts +68 -1
- package/src/lib/conditional-rule-match.ts +119 -0
- package/src/lib/data-list-display-options.ts +35 -0
- package/src/lib/data-list-view-registry.ts +104 -0
- package/src/lib/data-list-view-surface.ts +83 -0
- package/src/lib/data-list-view.ts +47 -0
- package/src/lib/dev-log.ts +10 -0
- package/src/lib/editable-target.ts +20 -0
- package/src/lib/list-page-table-properties.ts +48 -0
- package/src/lib/raf-throttle.ts +45 -0
- package/src/lib/row-height.ts +19 -0
- package/src/lib/table-properties-types.ts +98 -0
- package/template/.claude/skills/exxat-ds-skill/SKILL.md +8 -7
- package/template/.cursor/rules/exxat-accessibility.mdc +1 -1
- package/template/.cursor/rules/exxat-command-menu.mdc +2 -2
- package/template/.cursor/rules/exxat-dashboard-view-charts.mdc +7 -7
- package/template/.cursor/rules/exxat-data-tables.mdc +3 -3
- package/template/.cursor/rules/exxat-ds-agents.mdc +2 -2
- package/template/.cursor/rules/exxat-kbd-shortcuts.mdc +7 -7
- package/template/.cursor/rules/exxat-mono-ids.mdc +1 -1
- package/template/.cursor/rules/exxat-page-vs-drawer.mdc +1 -1
- package/template/.cursor/rules/exxat-table-properties-drawer.mdc +1 -1
- package/template/AGENTS.md +135 -103
- package/template/app/(app)/columns/page.tsx +11 -0
- package/template/app/(app)/dashboard/loading.tsx +15 -3
- package/template/app/(app)/dashboard/page.tsx +14 -2
- package/template/app/(app)/layout.tsx +17 -4
- package/template/app/(app)/library/all/page.tsx +11 -0
- package/template/app/(app)/library/find/page.tsx +12 -0
- package/template/app/(app)/{question-bank → library}/layout.tsx +17 -17
- package/template/app/(app)/library/list/page.tsx +12 -0
- package/template/app/(app)/library/new/page.tsx +45 -0
- package/template/app/(app)/library/page.tsx +11 -0
- package/template/app/(app)/loading.tsx +18 -1
- package/template/app/(app)/settings/page.tsx +5 -4
- package/template/app/(app)/tokens-themes/page.tsx +11 -0
- package/template/app/globals.css +14 -16
- package/template/components/ask-leo-composer.tsx +2 -2
- package/template/components/ask-leo-sidebar.tsx +5 -1
- package/template/components/brand-color-picker.tsx +2 -2
- package/template/components/charts-overview.tsx +1 -1
- package/template/components/columns-client.tsx +158 -0
- package/template/components/columns-showcase.tsx +541 -0
- package/template/components/dashboard-report-charts.tsx +1 -1
- package/template/components/dashboard-tabs.tsx +1 -1
- package/template/components/data-table/filter-date-calendar.tsx +1 -38
- package/template/components/data-table/filter-text-value-input.tsx +1 -77
- package/template/components/data-table/index.tsx +1 -1634
- package/template/components/data-table/pagination.tsx +1 -255
- package/template/components/data-table/types.ts +1 -94
- package/template/components/data-table/use-table-state.test.ts +420 -0
- package/template/components/data-table/use-table-state.ts +1 -758
- package/template/components/data-views/board-card-primitives.tsx +1 -93
- package/template/components/data-views/data-row-list.tsx +1 -183
- package/template/components/data-views/finder-panel-view.tsx +1 -405
- package/template/components/data-views/folder-grid-view.tsx +1 -86
- package/template/components/data-views/hub-table.tsx +1 -0
- package/template/components/data-views/index.ts +77 -38
- package/template/components/data-views/{question-bank-folder-tree-branch.tsx → library-folder-tree-branch.tsx} +19 -19
- package/template/components/data-views/list-page-board-card.tsx +1 -192
- package/template/components/data-views/list-page-board-template.tsx +1 -122
- package/template/components/data-views/list-page-connected-view-body.tsx +1 -66
- package/template/components/data-views/list-page-split-details-placeholder.tsx +1 -39
- package/template/components/data-views/list-page-split-hub-chrome.tsx +1 -68
- package/template/components/data-views/list-page-split-hub-tokens.ts +1 -16
- package/template/components/data-views/list-page-tree-column-header.tsx +1 -31
- package/template/components/data-views/list-page-tree-panel-shell.tsx +1 -91
- package/template/components/data-views/list-page-view-frame.tsx +5 -53
- package/template/components/data-views/os-folder-glyph.tsx +1 -129
- package/template/components/data-views/outline-tree-menu.tsx +1 -157
- package/template/components/data-views/table-cells.tsx +673 -0
- package/template/components/export-drawer.test.tsx +71 -0
- package/template/components/export-drawer.tsx +1 -375
- package/template/components/exxat-product-logo.tsx +5 -5
- package/template/components/folder-details-shell.tsx +11 -11
- package/template/components/hub-tree-panel-view.tsx +26 -26
- package/template/components/invite-collaborators-drawer.tsx +3 -3
- package/template/components/key-metrics-ask-leo-bridge.tsx +40 -0
- package/template/components/key-metrics.tsx +1 -1063
- package/template/components/leo-insight-indicator.tsx +2 -2
- package/template/components/{question-bank-board-view.tsx → library-board-view.tsx} +44 -44
- package/template/components/{question-bank-client.tsx → library-client.tsx} +83 -83
- package/template/components/{question-bank-dashboard-charts.tsx → library-dashboard-charts.tsx} +14 -14
- package/template/components/{question-bank-favorite-button.tsx → library-favorite-button.tsx} +7 -7
- package/template/components/{question-bank-hub-client.tsx → library-hub-client.tsx} +44 -44
- package/template/components/{question-bank-new-folder-sheet.tsx → library-new-folder-sheet.tsx} +16 -16
- package/template/components/{question-bank-os-folder-view.tsx → library-os-folder-view.tsx} +31 -31
- package/template/components/{question-bank-page-header.tsx → library-page-header.tsx} +6 -6
- package/template/components/library-panel-activator.tsx +8 -0
- package/template/components/{question-bank-secondary-nav.tsx → library-secondary-nav.tsx} +63 -63
- package/template/components/library-table.tsx +839 -0
- package/template/components/list-hub-status-badge.tsx +2 -2
- package/template/components/{new-question-composer.tsx → new-library-item-form.tsx} +489 -441
- package/template/components/onboarding/index.ts +9 -0
- package/template/components/onboarding/onboarding-01.tsx +1 -1
- package/template/components/onboarding/onboarding-02.tsx +1 -1
- package/template/components/onboarding/onboarding-03.tsx +1 -1
- package/template/components/onboarding/onboarding-04.tsx +1 -1
- package/template/components/page-header.tsx +8 -226
- package/template/components/product-switcher.tsx +3 -4
- package/template/components/product-wordmark.tsx +2 -1
- package/template/components/settings-appearance-card.tsx +3 -4
- package/template/components/settings-client.tsx +15 -59
- package/template/components/settings-form-row.tsx +4 -9
- package/template/components/{app-sidebar-dynamic.tsx → sidebar/app-sidebar-dynamic.tsx} +1 -1
- package/template/components/{app-sidebar.tsx → sidebar/app-sidebar.tsx} +114 -73
- package/template/components/sidebar/index.ts +16 -0
- package/template/components/{secondary-nav.tsx → sidebar/secondary-nav.tsx} +2 -2
- package/template/components/sidebar/secondary-panel.tsx +316 -0
- package/template/components/sidebar/sidebar-auto-collapse.tsx +27 -0
- package/template/components/{sidebar-auto-open.tsx → sidebar/sidebar-auto-open.tsx} +2 -1
- package/template/components/{sidebar-shell.tsx → sidebar/sidebar-shell.tsx} +1 -1
- package/template/components/site-header.tsx +1 -1
- package/template/components/table-properties/column-row.tsx +1 -90
- package/template/components/table-properties/draggable-list.ts +1 -49
- package/template/components/table-properties/drawer-button.tsx +1 -262
- package/template/components/table-properties/drawer.tsx +1 -1166
- package/template/components/table-properties/filter-card.tsx +1 -251
- package/template/components/table-properties/sort-card.tsx +1 -59
- package/template/components/table-properties/types.ts +28 -71
- package/template/components/templates/dedicated-search-landing-template.tsx +1 -124
- package/template/components/templates/dedicated-search-results-template.tsx +1 -19
- package/template/components/templates/discovery-hub-template.tsx +1 -1
- package/template/components/templates/list-page.tsx +1 -608
- package/template/components/templates/nested-secondary-panel-shell.tsx +1 -63
- package/template/components/templates/new-focus-template.tsx +659 -0
- package/template/components/templates/secondary-panel-hub-template.tsx +2 -2
- package/template/components/tokens-secondary-nav.tsx +192 -0
- package/template/components/tokens-themes-client.tsx +476 -0
- package/template/components/tokens-themes-section.tsx +386 -0
- package/template/components/ui/accordion.tsx +1 -0
- package/template/components/ui/alert-dialog.tsx +1 -0
- package/template/components/ui/context-menu.tsx +1 -0
- package/template/components/ui/dot-pattern.tsx +1 -183
- package/template/components/ui/hover-card.tsx +1 -0
- package/template/components/ui/resizable.tsx +1 -68
- package/template/components/ui/scroll-area.tsx +1 -0
- package/template/components/ui/slider.tsx +1 -0
- package/template/docs/HANDBOOK.md +187 -0
- package/template/docs/blueprints/README.md +86 -0
- package/template/docs/blueprints/_template.md +91 -0
- package/template/docs/blueprints/board-card.md +123 -0
- package/template/docs/blueprints/data-table.md +139 -0
- package/template/docs/blueprints/key-metrics.md +128 -0
- package/template/docs/blueprints/list-page-template.md +123 -0
- package/template/docs/blueprints/page-header.md +130 -0
- package/template/docs/collaboration-access-pattern.md +7 -7
- package/template/docs/command-menu-pattern.md +1 -1
- package/template/docs/component-selection-guide.md +224 -0
- package/template/docs/components-audit-2026-05.md +158 -0
- package/template/docs/data-views-pattern.md +31 -66
- package/template/docs/drawer-vs-dialog-pattern.md +1 -3
- package/template/docs/glossary.md +58 -0
- package/template/docs/kpi-flat-band-pattern.md +3 -3
- package/template/docs/kpi-trend-pattern.md +18 -3
- package/template/docs/large-dataset-strategy.md +155 -0
- package/template/docs/library-hub-header-pattern.md +25 -0
- package/template/docs/migrations/0001-brand-deep-alias-stabilization.md +95 -0
- package/template/docs/migrations/0002-exxat-token-namespace.md +154 -0
- package/template/docs/migrations/0003-globals-css-canonical.md +110 -0
- package/template/docs/migrations/README.md +100 -0
- package/template/docs/migrations/_template.md +64 -0
- package/template/docs/reference-implementations.md +151 -0
- package/template/docs/shell-surface-elevation-pattern.md +3 -5
- package/template/docs/token-taxonomy.md +416 -0
- package/template/docs/voice-and-tone.md +262 -0
- package/template/eslint.config.mjs +27 -0
- package/template/hooks/use-secondary-panel-hub-nav.ts +11 -11
- package/template/lib/ask-leo-route-context.ts +6 -18
- package/template/lib/coach-mark-registry.ts +0 -16
- package/template/lib/command-menu-config.ts +5 -13
- package/template/lib/command-menu-search-data.ts +8 -23
- package/template/lib/conditional-rule-match.ts +6 -97
- package/template/lib/data-list-display-options.ts +1 -49
- package/template/lib/data-list-view-registry.ts +1 -104
- package/template/lib/data-list-view-surface.ts +1 -83
- package/template/lib/data-list-view.ts +1 -47
- package/template/lib/data-view-dashboard-storage.ts +35 -38
- package/template/lib/dev-log.ts +1 -8
- package/template/lib/editable-target.ts +1 -10
- package/template/lib/{question-bank-authoring.ts → library-authoring.ts} +89 -88
- package/template/lib/library-dedicated-search.ts +19 -0
- package/template/lib/library-hub-search.ts +90 -0
- package/template/lib/library-nav.ts +477 -0
- package/template/lib/library-recent-searches.ts +22 -0
- package/template/lib/{question-bank-supported-views.ts → library-supported-views.ts} +2 -3
- package/template/lib/list-page-table-properties.ts +1 -48
- package/template/lib/list-status-badges.ts +16 -11
- package/template/lib/mock/dashboard.ts +1 -1
- package/template/lib/mock/{question-bank-folders.ts → library-folders.ts} +30 -30
- package/template/lib/mock/library-header-collaborators.ts +54 -0
- package/template/lib/mock/{question-bank-inspector.ts → library-inspector.ts} +29 -29
- package/template/lib/mock/{question-bank-kpi.ts → library-kpi.ts} +20 -20
- package/template/lib/mock/library.ts +249 -0
- package/template/lib/mock/navigation.tsx +32 -35
- package/template/lib/raf-throttle.ts +1 -45
- package/template/lib/row-height.ts +4 -10
- package/template/lib/sidebar-state-cookie.ts +11 -2
- package/template/lib/table-state-lifecycle.ts +3 -3
- package/template/next.config.mjs +7 -4
- package/template/package.json +1 -0
- package/template/tests/setup.ts +25 -0
- package/consumer-extras/AGENTS.md +0 -76
- package/consumer-extras/cursor-skills/exxat-consumer-app/SKILL.md +0 -37
- package/consumer-extras/cursor-skills/exxat-focused-workflow-page/SKILL.md +0 -57
- package/consumer-extras/patterns/consumer-app-pattern.md +0 -39
- package/consumer-extras/patterns/focused-workflow-page-pattern.md +0 -84
- package/src/components/ui/button-group.tsx +0 -81
- package/src/theme.css +0 -16
- package/src/tokens/README.md +0 -15
- package/src/tokens/base.css +0 -337
- package/src/tokens/high-contrast.css +0 -1195
- package/src/tokens/layers.css +0 -224
- package/src/tokens/tailwind-bridge.css +0 -118
- package/src/tokens/themes.css +0 -201
- package/template/app/(app)/data-list/layout.tsx +0 -43
- package/template/app/(app)/data-list/page.tsx +0 -10
- package/template/app/(app)/examples/focused-workflow/page.tsx +0 -5
- package/template/app/(app)/examples/page.tsx +0 -43
- package/template/app/(app)/question-bank/find/page.tsx +0 -13
- package/template/app/(app)/question-bank/library/page.tsx +0 -12
- package/template/app/(app)/question-bank/list/page.tsx +0 -13
- package/template/app/(app)/question-bank/new/page.tsx +0 -50
- package/template/app/(app)/question-bank/page.tsx +0 -12
- package/template/components/app-route-loading.tsx +0 -14
- package/template/components/dashboard-onboarding-gallery.tsx +0 -13
- package/template/components/dashboard-onboarding.tsx +0 -21
- package/template/components/data-views/list-page-calendar-view.tsx +0 -593
- package/template/components/data-views/list-page-folder-columns-panel.tsx +0 -345
- package/template/components/examples/focused-workflow-showcase.tsx +0 -183
- package/template/components/list-hub-board-view.tsx +0 -68
- package/template/components/list-hub-client.tsx +0 -186
- package/template/components/list-hub-list-view.tsx +0 -36
- package/template/components/list-hub-panel-activator.tsx +0 -8
- package/template/components/list-hub-secondary-nav.tsx +0 -121
- package/template/components/list-hub-table.tsx +0 -336
- package/template/components/question-bank-folder-columns-panel.tsx +0 -104
- package/template/components/question-bank-list-view.tsx +0 -53
- package/template/components/question-bank-panel-activator.tsx +0 -8
- package/template/components/question-bank-table.tsx +0 -729
- package/template/components/secondary-panel/nav-link-rows.tsx +0 -83
- package/template/components/secondary-panel.tsx +0 -220
- package/template/components/secondary-panels/list-hub-panel.tsx +0 -39
- package/template/components/secondary-panels/question-bank-panel.tsx +0 -39
- package/template/components/secondary-panels/registry.tsx +0 -15
- package/template/components/section-cards.tsx +0 -106
- package/template/components/sidebar-auto-collapse.tsx +0 -23
- package/template/components/templates/focused-workflow-layouts.tsx +0 -448
- package/template/components/templates/focused-workflow-page-template.tsx +0 -69
- package/template/components/templates/page-loading-shell.tsx +0 -262
- package/template/components/ui/button-group.tsx +0 -1
- package/template/docs/consumer-app-pattern.md +0 -39
- package/template/docs/focused-workflow-page-pattern.md +0 -84
- package/template/docs/question-bank-hub-header-pattern.md +0 -25
- package/template/lib/list-hub-nav.ts +0 -121
- package/template/lib/mock/list-hub-directory.ts +0 -27
- package/template/lib/mock/list-hub-kpi.ts +0 -27
- package/template/lib/mock/question-bank-header-collaborators.ts +0 -54
- package/template/lib/mock/question-bank.ts +0 -249
- package/template/lib/page-loading-variant.ts +0 -40
- package/template/lib/question-bank-dedicated-search.ts +0 -19
- package/template/lib/question-bank-hub-search.ts +0 -90
- package/template/lib/question-bank-nav.ts +0 -477
- package/template/lib/question-bank-recent-searches.ts +0 -22
- /package/template/components/{getting-started.tsx → onboarding/getting-started.tsx} +0 -0
- /package/template/components/{nav-documents.tsx → sidebar/nav-documents.tsx} +0 -0
- /package/template/components/{nav-main.tsx → sidebar/nav-main.tsx} +0 -0
- /package/template/components/{nav-secondary.tsx → sidebar/nav-secondary.tsx} +0 -0
- /package/template/components/{nav-user.tsx → sidebar/nav-user.tsx} +0 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import 'lucide-react';
|
|
3
|
+
import { Slot, Separator as Separator$1, Tooltip as Tooltip$1, 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 } from 'react/jsx-runtime';
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
|
|
10
|
+
function cn(...inputs) {
|
|
11
|
+
return twMerge(clsx(inputs));
|
|
12
|
+
}
|
|
13
|
+
var avatarRootVariants = cva(
|
|
14
|
+
"group/avatar relative flex shrink-0 overflow-hidden select-none",
|
|
15
|
+
{
|
|
16
|
+
variants: {
|
|
17
|
+
size: {
|
|
18
|
+
sm: "size-6",
|
|
19
|
+
default: "size-8",
|
|
20
|
+
lg: "size-10"
|
|
21
|
+
},
|
|
22
|
+
shape: {
|
|
23
|
+
circle: "rounded-full",
|
|
24
|
+
square: "rounded-none",
|
|
25
|
+
"rounded-sm": "rounded-sm",
|
|
26
|
+
"rounded-md": "rounded-md",
|
|
27
|
+
"rounded-lg": "rounded-lg",
|
|
28
|
+
"rounded-xl": "rounded-xl"
|
|
29
|
+
},
|
|
30
|
+
variant: {
|
|
31
|
+
default: "",
|
|
32
|
+
ring: "ring-2 ring-ring",
|
|
33
|
+
"ring-offset": "ring-2 ring-ring ring-offset-2 ring-offset-background",
|
|
34
|
+
group: "ring-2 ring-background"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
defaultVariants: {
|
|
38
|
+
size: "default",
|
|
39
|
+
shape: "circle",
|
|
40
|
+
variant: "default"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
var AVATAR_INSET_AFTER = {
|
|
45
|
+
circle: "after:rounded-full",
|
|
46
|
+
square: "after:rounded-none",
|
|
47
|
+
"rounded-sm": "after:rounded-sm",
|
|
48
|
+
"rounded-md": "after:rounded-md",
|
|
49
|
+
"rounded-lg": "after:rounded-lg",
|
|
50
|
+
"rounded-xl": "after:rounded-xl"
|
|
51
|
+
};
|
|
52
|
+
var avatarImageShape = cn(
|
|
53
|
+
"aspect-square size-full object-cover",
|
|
54
|
+
"group-data-[shape=circle]/avatar:rounded-full",
|
|
55
|
+
"group-data-[shape=square]/avatar:rounded-none",
|
|
56
|
+
"group-data-[shape=rounded-sm]/avatar:rounded-sm",
|
|
57
|
+
"group-data-[shape=rounded-md]/avatar:rounded-md",
|
|
58
|
+
"group-data-[shape=rounded-lg]/avatar:rounded-lg",
|
|
59
|
+
"group-data-[shape=rounded-xl]/avatar:rounded-xl"
|
|
60
|
+
);
|
|
61
|
+
var avatarFallbackShape = cn(
|
|
62
|
+
"flex size-full items-center justify-center bg-muted text-sm text-muted-foreground",
|
|
63
|
+
"group-data-[shape=circle]/avatar:rounded-full",
|
|
64
|
+
"group-data-[shape=square]/avatar:rounded-none",
|
|
65
|
+
"group-data-[shape=rounded-sm]/avatar:rounded-sm",
|
|
66
|
+
"group-data-[shape=rounded-md]/avatar:rounded-md",
|
|
67
|
+
"group-data-[shape=rounded-lg]/avatar:rounded-lg",
|
|
68
|
+
"group-data-[shape=rounded-xl]/avatar:rounded-xl",
|
|
69
|
+
"group-data-[size=sm]/avatar:text-xs"
|
|
70
|
+
);
|
|
71
|
+
function Avatar({
|
|
72
|
+
className,
|
|
73
|
+
size = "default",
|
|
74
|
+
shape = "circle",
|
|
75
|
+
variant = "default",
|
|
76
|
+
insetBorder = false,
|
|
77
|
+
...props
|
|
78
|
+
}) {
|
|
79
|
+
const shapeKey = shape ?? "circle";
|
|
80
|
+
const insetClass = insetBorder && cn(
|
|
81
|
+
"after:pointer-events-none after:absolute after:inset-0 after:border after:border-border after:mix-blend-darken dark:after:mix-blend-lighten",
|
|
82
|
+
AVATAR_INSET_AFTER[shapeKey]
|
|
83
|
+
);
|
|
84
|
+
return /* @__PURE__ */ jsx(
|
|
85
|
+
Avatar$1.Root,
|
|
86
|
+
{
|
|
87
|
+
"data-slot": "avatar",
|
|
88
|
+
"data-size": size,
|
|
89
|
+
"data-shape": shape,
|
|
90
|
+
className: cn(avatarRootVariants({ size, shape, variant }), insetClass, className),
|
|
91
|
+
...props
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
function AvatarImage({
|
|
96
|
+
className,
|
|
97
|
+
referrerPolicy = "no-referrer",
|
|
98
|
+
...props
|
|
99
|
+
}) {
|
|
100
|
+
return /* @__PURE__ */ jsx(
|
|
101
|
+
Avatar$1.Image,
|
|
102
|
+
{
|
|
103
|
+
"data-slot": "avatar-image",
|
|
104
|
+
referrerPolicy,
|
|
105
|
+
className: cn(avatarImageShape, className),
|
|
106
|
+
...props
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
function AvatarFallback({
|
|
111
|
+
className,
|
|
112
|
+
...props
|
|
113
|
+
}) {
|
|
114
|
+
return /* @__PURE__ */ jsx(
|
|
115
|
+
Avatar$1.Fallback,
|
|
116
|
+
{
|
|
117
|
+
"data-slot": "avatar-fallback",
|
|
118
|
+
className: cn(avatarFallbackShape, className),
|
|
119
|
+
...props
|
|
120
|
+
}
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
var buttonVariants = cva(
|
|
124
|
+
"group/button inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
125
|
+
{
|
|
126
|
+
variants: {
|
|
127
|
+
variant: {
|
|
128
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/80",
|
|
129
|
+
outline: "border-input bg-background hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:bg-input/15 dark:hover:bg-input/25",
|
|
130
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
|
|
131
|
+
ghost: "hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:hover:bg-interactive-hover-subtle",
|
|
132
|
+
destructive: "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
|
|
133
|
+
link: "text-primary underline-offset-4 hover:underline"
|
|
134
|
+
},
|
|
135
|
+
size: {
|
|
136
|
+
default: "h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pe-2.5 has-data-[icon=inline-start]:ps-2.5",
|
|
137
|
+
xs: "h-6 gap-1 px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 [&_svg:not([class*='size-'])]:size-3",
|
|
138
|
+
sm: "h-8 gap-1 px-3 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-2 has-data-[icon=inline-start]:ps-2 [&_svg:not([class*='size-'])]:size-3.5",
|
|
139
|
+
lg: "h-10 gap-1.5 px-4 has-data-[icon=inline-end]:pe-3.5 has-data-[icon=inline-start]:ps-3.5",
|
|
140
|
+
icon: "size-9",
|
|
141
|
+
"icon-xs": "size-6 in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
|
|
142
|
+
"icon-sm": "size-8 in-data-[slot=button-group]:rounded-lg",
|
|
143
|
+
"icon-lg": "size-10"
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
defaultVariants: {
|
|
147
|
+
variant: "default",
|
|
148
|
+
size: "default"
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
);
|
|
152
|
+
var Button = React.forwardRef(({ className, variant = "default", size = "default", asChild = false, ...props }, ref) => {
|
|
153
|
+
const Comp = asChild ? Slot.Root : "button";
|
|
154
|
+
return /* @__PURE__ */ jsx(
|
|
155
|
+
Comp,
|
|
156
|
+
{
|
|
157
|
+
ref,
|
|
158
|
+
"data-slot": "button",
|
|
159
|
+
"data-variant": variant,
|
|
160
|
+
"data-size": size,
|
|
161
|
+
className: cn(buttonVariants({ variant, size }), className),
|
|
162
|
+
...props
|
|
163
|
+
}
|
|
164
|
+
);
|
|
165
|
+
});
|
|
166
|
+
Button.displayName = "Button";
|
|
167
|
+
function Separator({
|
|
168
|
+
className,
|
|
169
|
+
orientation = "horizontal",
|
|
170
|
+
decorative = true,
|
|
171
|
+
...props
|
|
172
|
+
}) {
|
|
173
|
+
return /* @__PURE__ */ jsx(
|
|
174
|
+
Separator$1.Root,
|
|
175
|
+
{
|
|
176
|
+
"data-slot": "separator",
|
|
177
|
+
decorative,
|
|
178
|
+
orientation,
|
|
179
|
+
className: cn(
|
|
180
|
+
"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch",
|
|
181
|
+
className
|
|
182
|
+
),
|
|
183
|
+
...props
|
|
184
|
+
}
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
function Tooltip({
|
|
188
|
+
...props
|
|
189
|
+
}) {
|
|
190
|
+
return /* @__PURE__ */ jsx(Tooltip$1.Root, { "data-slot": "tooltip", ...props });
|
|
191
|
+
}
|
|
192
|
+
function TooltipTrigger({
|
|
193
|
+
className,
|
|
194
|
+
...props
|
|
195
|
+
}) {
|
|
196
|
+
return /* @__PURE__ */ jsx(
|
|
197
|
+
Tooltip$1.Trigger,
|
|
198
|
+
{
|
|
199
|
+
"data-slot": "tooltip-trigger",
|
|
200
|
+
suppressHydrationWarning: true,
|
|
201
|
+
className: cn("cursor-pointer", className),
|
|
202
|
+
...props
|
|
203
|
+
}
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
function TooltipContent({
|
|
207
|
+
className,
|
|
208
|
+
sideOffset = 0,
|
|
209
|
+
children,
|
|
210
|
+
...props
|
|
211
|
+
}) {
|
|
212
|
+
return /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsxs(
|
|
213
|
+
Tooltip$1.Content,
|
|
214
|
+
{
|
|
215
|
+
"data-slot": "tooltip-content",
|
|
216
|
+
sideOffset,
|
|
217
|
+
className: cn(
|
|
218
|
+
"z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pe-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
|
|
219
|
+
className
|
|
220
|
+
),
|
|
221
|
+
...props,
|
|
222
|
+
children: [
|
|
223
|
+
children,
|
|
224
|
+
/* @__PURE__ */ jsx(Tooltip$1.Arrow, { className: "z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground" })
|
|
225
|
+
]
|
|
226
|
+
}
|
|
227
|
+
) });
|
|
228
|
+
}
|
|
229
|
+
function PageHeaderCollaborationAccess({
|
|
230
|
+
people,
|
|
231
|
+
limit,
|
|
232
|
+
onOpenCollaborators,
|
|
233
|
+
addCollaboratorLabel
|
|
234
|
+
}) {
|
|
235
|
+
if (people.length === 0) {
|
|
236
|
+
return /* @__PURE__ */ jsx(
|
|
237
|
+
"div",
|
|
238
|
+
{
|
|
239
|
+
role: "group",
|
|
240
|
+
"aria-label": "People with access",
|
|
241
|
+
className: "flex shrink-0 items-center",
|
|
242
|
+
children: /* @__PURE__ */ jsxs(
|
|
243
|
+
Button,
|
|
244
|
+
{
|
|
245
|
+
type: "button",
|
|
246
|
+
variant: "outline",
|
|
247
|
+
size: "lg",
|
|
248
|
+
onClick: onOpenCollaborators,
|
|
249
|
+
disabled: !onOpenCollaborators,
|
|
250
|
+
children: [
|
|
251
|
+
/* @__PURE__ */ jsx("i", { className: "fa-light fa-user-plus", "aria-hidden": "true" }),
|
|
252
|
+
addCollaboratorLabel
|
|
253
|
+
]
|
|
254
|
+
}
|
|
255
|
+
)
|
|
256
|
+
}
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
const visible = people.slice(0, limit);
|
|
260
|
+
const overflow = Math.max(0, people.length - visible.length);
|
|
261
|
+
const names = people.map((p) => p.name).join(", ");
|
|
262
|
+
return /* @__PURE__ */ jsx(
|
|
263
|
+
"div",
|
|
264
|
+
{
|
|
265
|
+
role: "group",
|
|
266
|
+
"aria-label": names ? `People with access: ${names}` : "People with access",
|
|
267
|
+
className: "flex shrink-0 items-center gap-2 sm:gap-2.5",
|
|
268
|
+
children: /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-1.5", children: [
|
|
269
|
+
visible.map((c) => /* @__PURE__ */ jsxs(Tooltip, { children: [
|
|
270
|
+
/* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
|
|
271
|
+
"button",
|
|
272
|
+
{
|
|
273
|
+
type: "button",
|
|
274
|
+
className: "relative shrink-0 rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
275
|
+
"aria-label": `Open collaborators \u2014 ${c.name}`,
|
|
276
|
+
onClick: onOpenCollaborators,
|
|
277
|
+
disabled: !onOpenCollaborators,
|
|
278
|
+
children: /* @__PURE__ */ jsxs(Avatar, { size: "sm", shape: "circle", className: "pointer-events-none", children: [
|
|
279
|
+
c.imageUrl ? /* @__PURE__ */ jsx(AvatarImage, { src: c.imageUrl, alt: "", referrerPolicy: "no-referrer" }) : null,
|
|
280
|
+
/* @__PURE__ */ jsx(AvatarFallback, { className: "text-xs font-semibold", children: (c.initials ?? c.name.slice(0, 2)).toUpperCase() })
|
|
281
|
+
] })
|
|
282
|
+
}
|
|
283
|
+
) }),
|
|
284
|
+
/* @__PURE__ */ jsx(TooltipContent, { side: "bottom", children: c.name })
|
|
285
|
+
] }, c.id)),
|
|
286
|
+
overflow > 0 && /* @__PURE__ */ jsxs(
|
|
287
|
+
"button",
|
|
288
|
+
{
|
|
289
|
+
type: "button",
|
|
290
|
+
className: "flex size-6 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold tabular-nums text-muted-foreground ring-1 ring-border/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
291
|
+
"aria-label": `Open collaborators \u2014 ${overflow} more people with access`,
|
|
292
|
+
onClick: onOpenCollaborators,
|
|
293
|
+
disabled: !onOpenCollaborators,
|
|
294
|
+
children: [
|
|
295
|
+
"+",
|
|
296
|
+
overflow
|
|
297
|
+
]
|
|
298
|
+
}
|
|
299
|
+
)
|
|
300
|
+
] })
|
|
301
|
+
}
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
function PageHeader({
|
|
305
|
+
title,
|
|
306
|
+
subtitle,
|
|
307
|
+
variant = "default",
|
|
308
|
+
accessInfo,
|
|
309
|
+
collaborators,
|
|
310
|
+
collaboratorDisplayLimit = 3,
|
|
311
|
+
onCollaboratorsOpen,
|
|
312
|
+
addCollaboratorLabel = "Add collaborator",
|
|
313
|
+
actions,
|
|
314
|
+
className,
|
|
315
|
+
showTitleBlock = true
|
|
316
|
+
}) {
|
|
317
|
+
const isCollaboration = variant === "collaboration";
|
|
318
|
+
const showAccess = Boolean(isCollaboration && accessInfo);
|
|
319
|
+
const showCollaborationAccess = isCollaboration;
|
|
320
|
+
const showActionsColumn = Boolean(actions) || showCollaborationAccess;
|
|
321
|
+
const showCollaboratorActionsSeparator = showCollaborationAccess && Boolean(actions);
|
|
322
|
+
return /* @__PURE__ */ jsxs(
|
|
323
|
+
"div",
|
|
324
|
+
{
|
|
325
|
+
className: cn(
|
|
326
|
+
"flex flex-col gap-1 px-4 pt-2 pb-4 lg:px-6",
|
|
327
|
+
"sm:flex-row sm:items-end sm:gap-4",
|
|
328
|
+
showTitleBlock ? "sm:justify-between" : "sm:justify-end",
|
|
329
|
+
className
|
|
330
|
+
),
|
|
331
|
+
children: [
|
|
332
|
+
/* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-col gap-0.5", !showTitleBlock && "sr-only"), children: [
|
|
333
|
+
/* @__PURE__ */ jsx(
|
|
334
|
+
"h1",
|
|
335
|
+
{
|
|
336
|
+
className: "text-2xl font-semibold tracking-tight leading-tight text-foreground",
|
|
337
|
+
style: { fontFamily: "var(--font-heading)" },
|
|
338
|
+
suppressHydrationWarning: true,
|
|
339
|
+
children: title
|
|
340
|
+
}
|
|
341
|
+
),
|
|
342
|
+
showAccess && /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs leading-snug text-muted-foreground", children: accessInfo }),
|
|
343
|
+
subtitle && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground leading-none", children: subtitle })
|
|
344
|
+
] }),
|
|
345
|
+
showActionsColumn && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2 sm:gap-3 shrink-0 sm:ms-auto sm:justify-end", children: [
|
|
346
|
+
showCollaborationAccess ? /* @__PURE__ */ jsx(
|
|
347
|
+
PageHeaderCollaborationAccess,
|
|
348
|
+
{
|
|
349
|
+
people: collaborators ?? [],
|
|
350
|
+
limit: collaboratorDisplayLimit,
|
|
351
|
+
onOpenCollaborators: onCollaboratorsOpen,
|
|
352
|
+
addCollaboratorLabel
|
|
353
|
+
}
|
|
354
|
+
) : null,
|
|
355
|
+
showCollaboratorActionsSeparator ? /* @__PURE__ */ jsx(
|
|
356
|
+
Separator,
|
|
357
|
+
{
|
|
358
|
+
orientation: "vertical",
|
|
359
|
+
decorative: true,
|
|
360
|
+
className: "h-8 shrink-0"
|
|
361
|
+
}
|
|
362
|
+
) : null,
|
|
363
|
+
actions
|
|
364
|
+
] })
|
|
365
|
+
]
|
|
366
|
+
}
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
export { PageHeader };
|
|
371
|
+
//# sourceMappingURL=page-header.js.map
|
|
372
|
+
//# sourceMappingURL=page-header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/avatar.tsx","../../../src/components/ui/button.tsx","../../../src/components/ui/separator.tsx","../../../src/components/ui/tooltip.tsx","../../../src/components/ui/page-header.tsx"],"names":["AvatarPrimitive","cva","jsx","SeparatorPrimitive","TooltipPrimitive","jsxs"],"mappings":"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","file":"page-header.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","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 buttonVariants = cva(\n \"group/button inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-input bg-background hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:bg-input/15 dark:hover:bg-input/25\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:hover:bg-interactive-hover-subtle\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pe-2.5 has-data-[icon=inline-start]:ps-2.5\",\n xs: \"h-6 gap-1 px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 px-3 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-2 has-data-[icon=inline-start]:ps-2 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-10 gap-1.5 px-4 has-data-[icon=inline-end]:pe-3.5 has-data-[icon=inline-start]:ps-3.5\",\n icon: \"size-9\",\n \"icon-xs\":\n \"size-6 in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-8 in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst Button = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }\n>(({ className, variant = \"default\", size = \"default\", asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n ref={ref}\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n />\n )\n})\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return (\n <TooltipPrimitive.Trigger\n data-slot=\"tooltip-trigger\"\n suppressHydrationWarning\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n )\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pe-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","\"use client\"\n\n/**\n * PageHeader — Full-width content area header.\n *\n * Sits at the top of a page's main content, BELOW the breadcrumb / topbar.\n * Uses Ivy Presto (Adobe Fonts) for the title via the `--font-heading`\n * CSS variable.\n *\n * **Variant `collaboration`** — optional access line + collaborator faces\n * (or **Add collaborator** when the roster is empty) ahead of the primary\n * `actions` slot. The full **Invite people** flow lives in the consuming\n * page's `actions` overflow menu — this primitive only renders the face row.\n *\n * WCAG 2.1 AA:\n * - `<h1>` landmark — one per page (WCAG 1.3.1)\n * - Sufficient colour contrast >= 4.5:1 on title + subtitle (SC 1.4.3)\n * - Face row: `role=\"group\"` + aggregate `aria-label`; each face has a\n * `Tooltip` name (SC 4.1.2)\n *\n * Promotion note: this file lived at `apps/web/components/page-header.tsx`\n * until 2026-05-20. It moved into `@exxatdesignux/ui` so other apps (and\n * future docs sites) can compose hub headers without duplicating the\n * collaboration variant, h1 styling, or face-row a11y wiring. The\n * `CollaboratorAccessRole` union is duplicated here as a narrow string\n * literal so the primitive stays free of `apps/web/lib/` couplings — the\n * authoritative role labels / icons / capability helpers continue to live\n * in `apps/web/lib/collaborator-access.ts`.\n */\n\nimport * as React from \"react\"\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"./avatar\"\nimport { Button } from \"./button\"\nimport { Separator } from \"./separator\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\"\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Library access role for shared hubs. Mirrors\n * `apps/web/lib/collaborator-access.ts > CollaboratorAccessRole` — kept\n * structurally identical so the apps/web type and this type are mutually\n * assignable wherever consumers pass collaborator rosters to `PageHeader`.\n */\nexport type PageHeaderCollaboratorAccessRole =\n | \"owner\"\n | \"editor\"\n | \"commenter\"\n | \"viewer\"\n\nexport type PageHeaderVariant = \"default\" | \"collaboration\"\n\nexport interface PageHeaderCollaborator {\n id: string\n name: string\n imageUrl?: string | null\n initials?: string\n email?: string\n access?: PageHeaderCollaboratorAccessRole\n /** Org / directory role tags (e.g. Faculty, Program coordinator). */\n roles?: string[]\n}\n\nexport interface PageHeaderProps {\n /** Primary page title — rendered as `<h1>` in Ivy Presto serif. */\n title: string\n /** Short descriptor or date shown below the title (and below `accessInfo` when set). */\n subtitle?: React.ReactNode\n /** Layout preset — `collaboration` enables access line + face row ahead of `actions`. */\n variant?: PageHeaderVariant\n /**\n * Role / access copy or badges — rendered between the title and subtitle\n * when `variant=\"collaboration\"` (e.g. lock icon + \"Editors can modify\").\n */\n accessInfo?: React.ReactNode\n /** People with access — shown as a horizontal row of faces when `variant=\"collaboration\"`. */\n collaborators?: PageHeaderCollaborator[]\n /** Max faces before a `+N` chip — default 3. */\n collaboratorDisplayLimit?: number\n /** Opens the invite collaborators sheet when a face, overflow chip, or empty-state CTA is activated. */\n onCollaboratorsOpen?: () => void\n /** Label for the empty-roster header control — default `\"Add collaborator\"`. */\n addCollaboratorLabel?: string\n /** Optional slot for right-aligned actions (buttons, selectors, etc.). */\n actions?: React.ReactNode\n /** Extra className for the outer wrapper. */\n className?: string\n /** When false, the title + subtitle are visually hidden (actions remain). */\n showTitleBlock?: boolean\n}\n\nfunction PageHeaderCollaborationAccess({\n people,\n limit,\n onOpenCollaborators,\n addCollaboratorLabel,\n}: {\n people: PageHeaderCollaborator[]\n limit: number\n onOpenCollaborators?: () => void\n addCollaboratorLabel: string\n}) {\n if (people.length === 0) {\n return (\n <div\n role=\"group\"\n aria-label=\"People with access\"\n className=\"flex shrink-0 items-center\"\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"lg\"\n onClick={onOpenCollaborators}\n disabled={!onOpenCollaborators}\n >\n <i className=\"fa-light fa-user-plus\" aria-hidden=\"true\" />\n {addCollaboratorLabel}\n </Button>\n </div>\n )\n }\n\n const visible = people.slice(0, limit)\n const overflow = Math.max(0, people.length - visible.length)\n const names = people.map((p) => p.name).join(\", \")\n\n return (\n <div\n role=\"group\"\n aria-label={names ? `People with access: ${names}` : \"People with access\"}\n className=\"flex shrink-0 items-center gap-2 sm:gap-2.5\"\n >\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {visible.map((c) => (\n <Tooltip key={c.id}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"relative shrink-0 rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n aria-label={`Open collaborators — ${c.name}`}\n onClick={onOpenCollaborators}\n disabled={!onOpenCollaborators}\n >\n <Avatar size=\"sm\" shape=\"circle\" className=\"pointer-events-none\">\n {c.imageUrl ? (\n <AvatarImage src={c.imageUrl} alt=\"\" referrerPolicy=\"no-referrer\" />\n ) : null}\n <AvatarFallback className=\"text-xs font-semibold\">\n {(c.initials ?? c.name.slice(0, 2)).toUpperCase()}\n </AvatarFallback>\n </Avatar>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{c.name}</TooltipContent>\n </Tooltip>\n ))}\n {overflow > 0 && (\n <button\n type=\"button\"\n className=\"flex size-6 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold tabular-nums text-muted-foreground ring-1 ring-border/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n aria-label={`Open collaborators — ${overflow} more people with access`}\n onClick={onOpenCollaborators}\n disabled={!onOpenCollaborators}\n >\n +{overflow}\n </button>\n )}\n </div>\n </div>\n )\n}\n\nexport function PageHeader({\n title,\n subtitle,\n variant = \"default\",\n accessInfo,\n collaborators,\n collaboratorDisplayLimit = 3,\n onCollaboratorsOpen,\n addCollaboratorLabel = \"Add collaborator\",\n actions,\n className,\n showTitleBlock = true,\n}: PageHeaderProps) {\n const isCollaboration = variant === \"collaboration\"\n const showAccess = Boolean(isCollaboration && accessInfo)\n const showCollaborationAccess = isCollaboration\n const showActionsColumn = Boolean(actions) || showCollaborationAccess\n const showCollaboratorActionsSeparator =\n showCollaborationAccess && Boolean(actions)\n\n return (\n <div\n className={cn(\n \"flex flex-col gap-1 px-4 pt-2 pb-4 lg:px-6\",\n \"sm:flex-row sm:items-end sm:gap-4\",\n showTitleBlock ? \"sm:justify-between\" : \"sm:justify-end\",\n className,\n )}\n >\n {/* Title block — hidden visually when showTitleBlock is false; keep h1 for a11y. */}\n <div className={cn(\"flex min-w-0 flex-col gap-0.5\", !showTitleBlock && \"sr-only\")}>\n <h1\n className=\"text-2xl font-semibold tracking-tight leading-tight text-foreground\"\n style={{ fontFamily: \"var(--font-heading)\" }}\n suppressHydrationWarning\n >\n {title}\n </h1>\n {showAccess && (\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs leading-snug text-muted-foreground\">\n {accessInfo}\n </div>\n )}\n {subtitle && (\n <p className=\"text-sm text-muted-foreground leading-none\">{subtitle}</p>\n )}\n </div>\n\n {showActionsColumn && (\n <div className=\"flex flex-wrap items-center gap-2 sm:gap-3 shrink-0 sm:ms-auto sm:justify-end\">\n {showCollaborationAccess ? (\n <PageHeaderCollaborationAccess\n people={collaborators ?? []}\n limit={collaboratorDisplayLimit}\n onOpenCollaborators={onCollaboratorsOpen}\n addCollaboratorLabel={addCollaboratorLabel}\n />\n ) : null}\n {showCollaboratorActionsSeparator ? (\n <Separator\n orientation=\"vertical\"\n decorative\n className=\"h-8 shrink-0\"\n />\n ) : null}\n {actions}\n </div>\n )}\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
export { CardImages } from 'react-payment-inputs/images';
|
|
3
|
+
export { usePaymentInputs } from 'react-payment-inputs';
|
|
4
|
+
|
|
5
|
+
/** Stacked number + expiry/CVC (Studio 06). Single hook — do not split across separate roots. */
|
|
6
|
+
declare function PaymentCardFieldsGroup({ className }: {
|
|
7
|
+
className?: string;
|
|
8
|
+
}): react_jsx_runtime.JSX.Element;
|
|
9
|
+
|
|
10
|
+
export { PaymentCardFieldsGroup };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { CreditCard } from 'lucide-react';
|
|
4
|
+
import { usePaymentInputs } from 'react-payment-inputs';
|
|
5
|
+
export { usePaymentInputs } from 'react-payment-inputs';
|
|
6
|
+
import images from 'react-payment-inputs/images';
|
|
7
|
+
import { clsx } from 'clsx';
|
|
8
|
+
import { twMerge } from 'tailwind-merge';
|
|
9
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
10
|
+
|
|
11
|
+
function cn(...inputs) {
|
|
12
|
+
return twMerge(clsx(inputs));
|
|
13
|
+
}
|
|
14
|
+
var Input = React.forwardRef(
|
|
15
|
+
function Input2({ className, type, ...props }, ref) {
|
|
16
|
+
return /* @__PURE__ */ jsx(
|
|
17
|
+
"input",
|
|
18
|
+
{
|
|
19
|
+
ref,
|
|
20
|
+
type,
|
|
21
|
+
"data-slot": "input",
|
|
22
|
+
className: cn(
|
|
23
|
+
"h-8 w-full min-w-0 rounded-md border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
|
|
24
|
+
className
|
|
25
|
+
),
|
|
26
|
+
...props
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
function PaymentCardFieldsGroup({ className }) {
|
|
32
|
+
const id = React.useId();
|
|
33
|
+
const { meta, getCardNumberProps, getExpiryDateProps, getCVCProps, getCardImageProps } = usePaymentInputs();
|
|
34
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("w-full max-w-xs space-y-0", className), children: [
|
|
35
|
+
/* @__PURE__ */ jsxs("div", { className: "relative focus-within:z-1", children: [
|
|
36
|
+
/* @__PURE__ */ jsx(
|
|
37
|
+
Input,
|
|
38
|
+
{
|
|
39
|
+
...getCardNumberProps(),
|
|
40
|
+
id: `card-number-${id}`,
|
|
41
|
+
className: "peer rounded-b-none pe-11 shadow-none"
|
|
42
|
+
}
|
|
43
|
+
),
|
|
44
|
+
/* @__PURE__ */ jsxs("div", { className: "text-muted-foreground pointer-events-none absolute inset-y-0 end-0 flex items-center justify-center pe-3 peer-disabled:opacity-50", children: [
|
|
45
|
+
meta.cardType ? /* @__PURE__ */ jsx(
|
|
46
|
+
"svg",
|
|
47
|
+
{
|
|
48
|
+
className: "w-6 overflow-hidden",
|
|
49
|
+
...getCardImageProps({
|
|
50
|
+
images
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
) : /* @__PURE__ */ jsx(CreditCard, { className: "size-4", "aria-hidden": true }),
|
|
54
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Card network" })
|
|
55
|
+
] })
|
|
56
|
+
] }),
|
|
57
|
+
/* @__PURE__ */ jsxs("div", { className: "-mt-px flex", children: [
|
|
58
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1 focus-within:z-1", children: /* @__PURE__ */ jsx(
|
|
59
|
+
Input,
|
|
60
|
+
{
|
|
61
|
+
...getExpiryDateProps(),
|
|
62
|
+
id: `card-expiry-${id}`,
|
|
63
|
+
className: "rounded-t-none rounded-e-none shadow-none"
|
|
64
|
+
}
|
|
65
|
+
) }),
|
|
66
|
+
/* @__PURE__ */ jsx("div", { className: "-ms-px min-w-0 flex-1 focus-within:z-1", children: /* @__PURE__ */ jsx(
|
|
67
|
+
Input,
|
|
68
|
+
{
|
|
69
|
+
...getCVCProps(),
|
|
70
|
+
id: `card-cvc-${id}`,
|
|
71
|
+
className: "rounded-t-none rounded-s-none shadow-none"
|
|
72
|
+
}
|
|
73
|
+
) })
|
|
74
|
+
] })
|
|
75
|
+
] });
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { PaymentCardFieldsGroup };
|
|
79
|
+
//# sourceMappingURL=payment-card-fields.js.map
|
|
80
|
+
//# sourceMappingURL=payment-card-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/input.tsx","../../../src/components/ui/payment-card-fields.tsx"],"names":["Input","React2","jsx"],"mappings":";;;;;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACDA,IAAM,KAAA,GAAc,KAAA,CAAA,UAAA;AAAA,EAClB,SAASA,OAAM,EAAE,SAAA,EAAW,MAAM,GAAG,KAAA,IAAS,GAAA,EAAK;AACjD,IAAA,uBACE,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA,EAAU,OAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,4nBAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;ACAO,SAAS,sBAAA,CAAuB,EAAE,SAAA,EAAU,EAA2B;AAC5E,EAAA,MAAM,KAAWC,KAAA,CAAA,KAAA,EAAM;AACvB,EAAA,MAAM,EAAE,IAAA,EAAM,kBAAA,EAAoB,oBAAoB,WAAA,EAAa,iBAAA,KACjE,gBAAA,EAAiB;AAEnB,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,2BAAA,EAA6B,SAAS,CAAA,EACvD,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACE,GAAG,kBAAA,EAAmB;AAAA,UACvB,EAAA,EAAI,eAAe,EAAE,CAAA,CAAA;AAAA,UACrB,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mIAAA,EACZ,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,2BACJA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,qBAAA;AAAA,YACT,GAAG,iBAAA,CAAkB;AAAA,cACpB;AAAA,aACD;AAAA;AAAA,4BAGHA,GAAAA,CAAC,cAAW,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC,CAAA;AAAA,wBAE7CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAU,QAAA,EAAA,cAAA,EAAY;AAAA,OAAA,EACxC;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACE,GAAG,kBAAA,EAAmB;AAAA,UACvB,EAAA,EAAI,eAAe,EAAE,CAAA,CAAA;AAAA,UACrB,SAAA,EAAU;AAAA;AAAA,OACZ,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CACb,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACE,GAAG,WAAA,EAAY;AAAA,UAChB,EAAA,EAAI,YAAY,EAAE,CAAA,CAAA;AAAA,UAClB,SAAA,EAAU;AAAA;AAAA,OACZ,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"payment-card-fields.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\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n function Input({ className, type, ...props }, ref) {\n return (\n <input\n ref={ref}\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-8 w-full min-w-0 rounded-md border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n },\n)\n\nexport { Input }\n","\"use client\"\n\n/**\n * Credit card inputs — matches Shadcn Studio input-mask 03–06 (`react-payment-inputs` + `Input`).\n * One `usePaymentInputs()` instance drives number + expiry + CVC; use this group (or `usePaymentInputs` yourself in a parent).\n */\n\nimport * as React from \"react\"\nimport { CreditCard } from \"lucide-react\"\nimport { usePaymentInputs } from \"react-payment-inputs\"\nimport images, { type CardImages } from \"react-payment-inputs/images\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Input } from \"./input\"\n\nexport { usePaymentInputs } from \"react-payment-inputs\"\nexport type { CardImages }\n\n/** Stacked number + expiry/CVC (Studio 06). Single hook — do not split across separate roots. */\nexport function PaymentCardFieldsGroup({ className }: { className?: string }) {\n const id = React.useId()\n const { meta, getCardNumberProps, getExpiryDateProps, getCVCProps, getCardImageProps } =\n usePaymentInputs()\n\n return (\n <div className={cn(\"w-full max-w-xs space-y-0\", className)}>\n <div className=\"relative focus-within:z-1\">\n <Input\n {...getCardNumberProps()}\n id={`card-number-${id}`}\n className=\"peer rounded-b-none pe-11 shadow-none\"\n />\n <div className=\"text-muted-foreground pointer-events-none absolute inset-y-0 end-0 flex items-center justify-center pe-3 peer-disabled:opacity-50\">\n {meta.cardType ? (\n <svg\n className=\"w-6 overflow-hidden\"\n {...getCardImageProps({\n images: images as unknown as CardImages,\n })}\n />\n ) : (\n <CreditCard className=\"size-4\" aria-hidden />\n )}\n <span className=\"sr-only\">Card network</span>\n </div>\n </div>\n <div className=\"-mt-px flex\">\n <div className=\"min-w-0 flex-1 focus-within:z-1\">\n <Input\n {...getExpiryDateProps()}\n id={`card-expiry-${id}`}\n className=\"rounded-t-none rounded-e-none shadow-none\"\n />\n </div>\n <div className=\"-ms-px min-w-0 flex-1 focus-within:z-1\">\n <Input\n {...getCVCProps()}\n id={`card-cvc-${id}`}\n className=\"rounded-t-none rounded-s-none shadow-none\"\n />\n </div>\n </div>\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Popover as Popover$1 } from 'radix-ui';
|
|
4
|
+
|
|
5
|
+
declare function Popover({ ...props }: React.ComponentProps<typeof Popover$1.Root>): react_jsx_runtime.JSX.Element;
|
|
6
|
+
declare function PopoverTrigger({ className, ...props }: React.ComponentProps<typeof Popover$1.Trigger>): react_jsx_runtime.JSX.Element;
|
|
7
|
+
declare function PopoverAnchor({ ...props }: React.ComponentProps<typeof Popover$1.Anchor>): react_jsx_runtime.JSX.Element;
|
|
8
|
+
declare function PopoverContent({ className, align, sideOffset, ...props }: React.ComponentProps<typeof Popover$1.Content>): react_jsx_runtime.JSX.Element;
|
|
9
|
+
|
|
10
|
+
export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Popover as Popover$1 } from 'radix-ui';
|
|
3
|
+
import { clsx } from 'clsx';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
5
|
+
import { jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function cn(...inputs) {
|
|
8
|
+
return twMerge(clsx(inputs));
|
|
9
|
+
}
|
|
10
|
+
function Popover({ ...props }) {
|
|
11
|
+
return /* @__PURE__ */ jsx(Popover$1.Root, { ...props });
|
|
12
|
+
}
|
|
13
|
+
function PopoverTrigger({ className, ...props }) {
|
|
14
|
+
return /* @__PURE__ */ jsx(Popover$1.Trigger, { className: cn("cursor-pointer", className), ...props });
|
|
15
|
+
}
|
|
16
|
+
function PopoverAnchor({ ...props }) {
|
|
17
|
+
return /* @__PURE__ */ jsx(Popover$1.Anchor, { ...props });
|
|
18
|
+
}
|
|
19
|
+
function PopoverContent({
|
|
20
|
+
className,
|
|
21
|
+
align = "start",
|
|
22
|
+
sideOffset = 4,
|
|
23
|
+
...props
|
|
24
|
+
}) {
|
|
25
|
+
return /* @__PURE__ */ jsx(Popover$1.Portal, { children: /* @__PURE__ */ jsx(
|
|
26
|
+
Popover$1.Content,
|
|
27
|
+
{
|
|
28
|
+
"data-slot": "popover-content",
|
|
29
|
+
align,
|
|
30
|
+
sideOffset,
|
|
31
|
+
className: cn(
|
|
32
|
+
"z-50 rounded-lg border border-border bg-popover shadow-md outline-none",
|
|
33
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
34
|
+
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
35
|
+
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
36
|
+
"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2",
|
|
37
|
+
"data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2",
|
|
38
|
+
className
|
|
39
|
+
),
|
|
40
|
+
...props
|
|
41
|
+
}
|
|
42
|
+
) });
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };
|
|
46
|
+
//# sourceMappingURL=popover.js.map
|
|
47
|
+
//# sourceMappingURL=popover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/popover.tsx"],"names":["PopoverPrimitive"],"mappings":";;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACCA,SAAS,OAAA,CAAQ,EAAE,GAAG,KAAA,EAAM,EAAuD;AACjF,EAAA,uBAAO,GAAA,CAACA,SAAA,CAAiB,IAAA,EAAjB,EAAuB,GAAG,KAAA,EAAO,CAAA;AAC3C;AAEA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,GAAG,OAAM,EAA0D;AACtG,EAAA,uBAAO,GAAA,CAACA,SAAA,CAAiB,OAAA,EAAjB,EAAyB,SAAA,EAAW,GAAG,gBAAA,EAAkB,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAC1F;AAEA,SAAS,aAAA,CAAc,EAAE,GAAG,KAAA,EAAM,EAAyD;AACzF,EAAA,uBAAO,GAAA,CAACA,SAAA,CAAiB,MAAA,EAAjB,EAAyB,GAAG,KAAA,EAAO,CAAA;AAC7C;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,SAAA;AAAA,EACA,KAAA,GAAQ,OAAA;AAAA,EACR,UAAA,GAAa,CAAA;AAAA,EACb,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,uBACE,GAAA,CAACA,SAAA,CAAiB,MAAA,EAAjB,EACC,QAAA,kBAAA,GAAA;AAAA,IAACA,SAAA,CAAiB,OAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,KAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,wEAAA;AAAA,QACA,8DAAA;AAAA,QACA,4DAAA;AAAA,QACA,8DAAA;AAAA,QACA,+EAAA;AAAA,QACA,+EAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN,EACF,CAAA;AAEJ","file":"popover.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 { Popover as PopoverPrimitive } from \"radix-ui\"\nimport { cn } from \"../../lib/utils\"\n\nfunction Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root {...props} />\n}\n\nfunction PopoverTrigger({ className, ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger className={cn(\"cursor-pointer\", className)} {...props} />\n}\n\nfunction PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 rounded-lg border border-border bg-popover shadow-md outline-none\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2\",\n \"data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger }\n"]}
|