tembro 2.0.4 → 2.0.6
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/dist/components/actions/action-menu.cjs +1 -1
- package/dist/components/actions/action-menu.d.ts +13 -1
- package/dist/components/actions/action-menu.js +87 -61
- package/dist/components/actions/button-group.cjs +1 -1
- package/dist/components/actions/button-group.d.ts +9 -1
- package/dist/components/actions/button-group.js +58 -14
- package/dist/components/actions/copy-button.cjs +1 -1
- package/dist/components/actions/copy-button.d.ts +2 -1
- package/dist/components/actions/copy-button.js +13 -11
- package/dist/components/calendar/calendar.cjs +1 -1
- package/dist/components/calendar/calendar.d.ts +14 -1
- package/dist/components/calendar/calendar.js +207 -128
- package/dist/components/calendar/date-picker.cjs +1 -1
- package/dist/components/calendar/date-picker.d.ts +3 -1
- package/dist/components/calendar/date-picker.js +57 -27
- package/dist/components/calendar/date-range-picker.cjs +1 -1
- package/dist/components/calendar/date-range-picker.d.ts +10 -1
- package/dist/components/calendar/date-range-picker.js +149 -64
- package/dist/components/data-table/data-table-pagination.cjs +1 -1
- package/dist/components/data-table/data-table-pagination.js +4 -4
- package/dist/components/data-table/data-table-toolbar.cjs +1 -1
- package/dist/components/data-table/data-table-toolbar.d.ts +5 -1
- package/dist/components/data-table/data-table-toolbar.js +36 -23
- package/dist/components/data-table/data-table.cjs +1 -1
- package/dist/components/data-table/data-table.d.ts +8 -6
- package/dist/components/data-table/data-table.js +89 -80
- package/dist/components/data-table/demo.cjs +1 -1
- package/dist/components/data-table/demo.js +3 -13
- package/dist/components/data-table/index.cjs +1 -1
- package/dist/components/data-table/index.js +5 -5
- package/dist/components/data-table/public.cjs +1 -1
- package/dist/components/data-table/public.d.ts +1 -6
- package/dist/components/data-table/public.js +7 -12
- package/dist/components/display/activity-feed.cjs +1 -1
- package/dist/components/display/activity-feed.d.ts +12 -1
- package/dist/components/display/activity-feed.js +69 -47
- package/dist/components/display/carousel.cjs +1 -1
- package/dist/components/display/carousel.d.ts +16 -1
- package/dist/components/display/carousel.js +71 -26
- package/dist/components/display/code-block.cjs +2 -1
- package/dist/components/display/code-block.d.ts +3 -1
- package/dist/components/display/code-block.js +33 -19
- package/dist/components/display/comparison-card.cjs +1 -1
- package/dist/components/display/comparison-card.d.ts +3 -3
- package/dist/components/display/comparison-card.js +14 -38
- package/dist/components/display/data-state.cjs +1 -1
- package/dist/components/display/data-state.d.ts +12 -2
- package/dist/components/display/data-state.js +80 -42
- package/dist/components/display/demo.cjs +1 -1
- package/dist/components/display/demo.js +1 -5
- package/dist/components/display/index.cjs +1 -1
- package/dist/components/display/index.d.ts +0 -3
- package/dist/components/display/index.js +21 -24
- package/dist/components/display/smart-card.d.ts +1 -1
- package/dist/components/display/status-legend.d.ts +1 -1
- package/dist/components/feedback/alert.cjs +1 -1
- package/dist/components/feedback/alert.d.ts +6 -1
- package/dist/components/feedback/alert.js +49 -19
- package/dist/components/feedback/index.cjs +1 -1
- package/dist/components/feedback/index.d.ts +0 -2
- package/dist/components/feedback/index.js +3 -5
- package/dist/components/filters/demo.cjs +1 -1
- package/dist/components/filters/demo.js +1 -5
- package/dist/components/filters/filter-bar.cjs +1 -1
- package/dist/components/filters/filter-bar.d.ts +15 -1
- package/dist/components/filters/filter-bar.js +94 -50
- package/dist/components/filters/index.cjs +1 -1
- package/dist/components/filters/index.d.ts +0 -1
- package/dist/components/filters/index.js +3 -4
- package/dist/components/form/form-field-shell.cjs +1 -1
- package/dist/components/form/form-field-shell.d.ts +17 -3
- package/dist/components/form/form-field-shell.js +54 -40
- package/dist/components/form/form-input.cjs +1 -1
- package/dist/components/form/form-input.d.ts +3 -4
- package/dist/components/form/form-input.js +285 -224
- package/dist/components/form/form-select.cjs +1 -1
- package/dist/components/form/form-select.d.ts +2 -2
- package/dist/components/form/form-select.js +49 -35
- package/dist/components/form/form-switch.cjs +1 -1
- package/dist/components/form/form-switch.js +79 -66
- package/dist/components/form/form-textarea.cjs +1 -1
- package/dist/components/form/form-textarea.js +59 -48
- package/dist/components/form/index.cjs +1 -1
- package/dist/components/form/index.js +14 -14
- package/dist/components/form/public.cjs +1 -1
- package/dist/components/form/public.d.ts +0 -8
- package/dist/components/form/public.js +7 -15
- package/dist/components/inputs/async-select.cjs +1 -1
- package/dist/components/inputs/async-select.d.ts +14 -2
- package/dist/components/inputs/async-select.js +278 -270
- package/dist/components/inputs/combobox.cjs +1 -1
- package/dist/components/inputs/combobox.d.ts +5 -1
- package/dist/components/inputs/combobox.js +52 -19
- package/dist/components/inputs/search-input.d.ts +3 -0
- package/dist/components/inputs/simple-select.cjs +1 -1
- package/dist/components/inputs/simple-select.d.ts +10 -31
- package/dist/components/inputs/simple-select.js +5 -85
- package/dist/components/layout/app-sidebar.cjs +1 -1
- package/dist/components/layout/app-sidebar.d.ts +4 -1
- package/dist/components/layout/app-sidebar.js +152 -132
- package/dist/components/layout/breadcrumbs.cjs +1 -1
- package/dist/components/layout/breadcrumbs.d.ts +2 -1
- package/dist/components/layout/breadcrumbs.js +10 -10
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.js +3 -3
- package/dist/components/layout/stat-card.cjs +1 -1
- package/dist/components/layout/stat-card.d.ts +8 -1
- package/dist/components/layout/stat-card.js +33 -11
- package/dist/components/modern/calendar-scheduler.cjs +1 -1
- package/dist/components/modern/calendar-scheduler.d.ts +2 -1
- package/dist/components/modern/calendar-scheduler.js +21 -12
- package/dist/components/overlay/alert-dialog.cjs +1 -1
- package/dist/components/overlay/alert-dialog.d.ts +15 -1
- package/dist/components/overlay/alert-dialog.js +102 -27
- package/dist/components/overlay/drawer.cjs +1 -1
- package/dist/components/overlay/drawer.d.ts +4 -1
- package/dist/components/overlay/drawer.js +20 -17
- package/dist/components/patterns/index.cjs +1 -1
- package/dist/components/patterns/index.d.ts +0 -1
- package/dist/components/patterns/index.js +1 -2
- package/dist/components/patterns/public.cjs +1 -1
- package/dist/components/patterns/public.d.ts +0 -1
- package/dist/components/patterns/public.js +1 -2
- package/dist/components/ui/button/index.cjs +1 -1
- package/dist/components/ui/button/index.d.ts +3 -1
- package/dist/components/ui/button/index.js +7 -5
- package/dist/components/ui/card/index.cjs +1 -1
- package/dist/components/ui/card/index.d.ts +13 -2
- package/dist/components/ui/card/index.js +74 -49
- package/dist/components/ui/checkbox/index.cjs +1 -1
- package/dist/components/ui/checkbox/index.d.ts +8 -0
- package/dist/components/ui/checkbox/index.js +16 -14
- package/dist/components/ui/collapse/index.cjs +1 -1
- package/dist/components/ui/collapse/index.d.ts +17 -3
- package/dist/components/ui/collapse/index.js +88 -33
- package/dist/components/ui/dialog/index.cjs +1 -1
- package/dist/components/ui/dialog/index.d.ts +2 -1
- package/dist/components/ui/dialog/index.js +6 -4
- package/dist/components/ui/dropdown-menu/index.cjs +1 -1
- package/dist/components/ui/dropdown-menu/index.d.ts +9 -4
- package/dist/components/ui/dropdown-menu/index.js +87 -62
- package/dist/components/ui/input/index.cjs +1 -1
- package/dist/components/ui/input/index.d.ts +8 -0
- package/dist/components/ui/input/index.js +63 -30
- package/dist/components/ui/select/index.cjs +1 -1
- package/dist/components/ui/select/index.d.ts +33 -1
- package/dist/components/ui/select/index.js +154 -48
- package/dist/index.cjs +1 -1
- package/dist/index.js +137 -156
- package/dist/public-component-surface.cjs +1 -1
- package/dist/public-component-surface.js +0 -15
- package/dist/showcase/component-api-schema.cjs +1 -1
- package/dist/showcase/component-api-schema.js +2 -2
- package/dist/showcase/create-demo.cjs +23 -36
- package/dist/showcase/create-demo.js +15 -16
- package/dist/showcase/fallback.cjs +3 -3
- package/dist/showcase/fallback.js +275 -265
- package/dist/showcase/premium/accordion/showcase.cjs +1 -1
- package/dist/showcase/premium/accordion/showcase.js +36 -5
- package/dist/showcase/premium/action-menu/showcase.cjs +1 -1
- package/dist/showcase/premium/action-menu/showcase.js +26 -8
- package/dist/showcase/premium/activity-feed/showcase.cjs +1 -1
- package/dist/showcase/premium/activity-feed/showcase.js +60 -36
- package/dist/showcase/premium/alert/showcase.cjs +1 -1
- package/dist/showcase/premium/alert/showcase.js +41 -18
- package/dist/showcase/premium/alert-dialog/showcase.cjs +1 -1
- package/dist/showcase/premium/alert-dialog/showcase.js +35 -7
- package/dist/showcase/premium/async-multi-select/mock.cjs +4 -3
- package/dist/showcase/premium/async-multi-select/mock.js +5 -5
- package/dist/showcase/premium/async-multi-select/showcase.cjs +1 -1
- package/dist/showcase/premium/async-multi-select/showcase.js +4 -3
- package/dist/showcase/premium/async-select/mock.cjs +1 -1
- package/dist/showcase/premium/async-select/mock.js +1 -1
- package/dist/showcase/premium/async-select/showcase.cjs +1 -1
- package/dist/showcase/premium/async-select/showcase.js +69 -22
- package/dist/showcase/premium/button/showcase.cjs +1 -1
- package/dist/showcase/premium/button/showcase.js +49 -3
- package/dist/showcase/premium/button-group/showcase.cjs +1 -1
- package/dist/showcase/premium/button-group/showcase.js +53 -29
- package/dist/showcase/premium/calendar/showcase.cjs +1 -1
- package/dist/showcase/premium/calendar/showcase.js +7 -2
- package/dist/showcase/premium/carousel/showcase.cjs +1 -1
- package/dist/showcase/premium/carousel/showcase.js +95 -47
- package/dist/showcase/premium/checkbox/showcase.cjs +1 -1
- package/dist/showcase/premium/checkbox/showcase.js +143 -67
- package/dist/showcase/premium/clearable-input/mock.cjs +4 -3
- package/dist/showcase/premium/clearable-input/mock.js +3 -2
- package/dist/showcase/premium/clearable-input/showcase.cjs +1 -1
- package/dist/showcase/premium/clearable-input/showcase.js +8 -2
- package/dist/showcase/premium/collapse/showcase.cjs +1 -1
- package/dist/showcase/premium/collapse/showcase.js +7 -0
- package/dist/showcase/premium/combobox/showcase.cjs +1 -1
- package/dist/showcase/premium/combobox/showcase.d.ts +2 -1
- package/dist/showcase/premium/combobox/showcase.js +56 -47
- package/dist/showcase/premium/data-table/showcase.cjs +1 -1
- package/dist/showcase/premium/data-table/showcase.js +138 -46
- package/dist/showcase/premium/data-table-parts/showcase.cjs +1 -1
- package/dist/showcase/premium/data-table-parts/showcase.js +16 -14
- package/dist/showcase/premium/date-input/mock.cjs +1 -1
- package/dist/showcase/premium/date-input/mock.js +1 -1
- package/dist/showcase/premium/date-range-picker/showcase.cjs +1 -1
- package/dist/showcase/premium/date-range-picker/showcase.js +32 -1
- package/dist/showcase/premium/dropdown-menu/showcase.cjs +1 -1
- package/dist/showcase/premium/dropdown-menu/showcase.js +88 -54
- package/dist/showcase/premium/form-wrapper/mock.cjs +41 -15
- package/dist/showcase/premium/form-wrapper/mock.js +4 -4
- package/dist/showcase/premium/form-wrapper/showcase.cjs +1 -1
- package/dist/showcase/premium/form-wrapper/showcase.js +77 -28
- package/dist/showcase/premium/index.cjs +1 -1
- package/dist/showcase/premium/index.js +426 -467
- package/dist/showcase/premium/input/mock.cjs +4 -1
- package/dist/showcase/premium/input/mock.js +1 -1
- package/dist/showcase/premium/masked-input/mock.cjs +1 -1
- package/dist/showcase/premium/masked-input/mock.js +1 -1
- package/dist/showcase/premium/money-input/mock.cjs +1 -1
- package/dist/showcase/premium/money-input/mock.js +1 -1
- package/dist/showcase/premium/number-input/mock.cjs +1 -1
- package/dist/showcase/premium/number-input/mock.js +1 -1
- package/dist/showcase/premium/phone-input/mock.cjs +1 -1
- package/dist/showcase/premium/phone-input/mock.js +1 -1
- package/dist/showcase/premium/quantity-input/mock.cjs +1 -1
- package/dist/showcase/premium/quantity-input/mock.js +1 -1
- package/dist/showcase/premium/select/mock.cjs +8 -9
- package/dist/showcase/premium/select/mock.js +1 -1
- package/dist/showcase/premium/select/showcase.cjs +1 -1
- package/dist/showcase/premium/select/showcase.js +76 -86
- package/dist/showcase/premium/simple-select/mock.cjs +1 -1
- package/dist/showcase/premium/simple-select/mock.js +1 -1
- package/dist/showcase/premium/simple-select/showcase.cjs +1 -1
- package/dist/showcase/premium/simple-select/showcase.js +4 -2
- package/dist/showcase/preview-catalog.cjs +7 -10
- package/dist/showcase/preview-catalog.js +7 -7
- package/dist/showcase/registry-quality.cjs +1 -1
- package/dist/showcase/registry-quality.js +0 -23
- package/dist/showcase/registry-specific.cjs +1 -1
- package/dist/showcase/registry-specific.js +153 -383
- package/dist/showcase/render-registry-preview.cjs +1 -1
- package/dist/showcase/render-registry-preview.js +169 -197
- package/dist/showcase/site-data.cjs +1 -1
- package/dist/showcase/site-data.js +197 -941
- package/dist/showcase/supplemental.cjs +1 -1
- package/dist/showcase/supplemental.js +1 -1
- package/dist/showcase/tembro-registry.json.cjs +1 -1
- package/dist/showcase/tembro-registry.json.js +33 -51
- package/package.json +1 -1
- package/packages/cli/dist/index.cjs +2 -2
- package/packages/cli/vendor/src/components/actions/action-menu.tsx +149 -83
- package/packages/cli/vendor/src/components/actions/button-group.tsx +141 -33
- package/packages/cli/vendor/src/components/actions/copy-button.tsx +21 -16
- package/packages/cli/vendor/src/components/calendar/calendar.tsx +223 -88
- package/packages/cli/vendor/src/components/calendar/date-picker.tsx +73 -29
- package/packages/cli/vendor/src/components/calendar/date-range-picker.tsx +154 -49
- package/packages/cli/vendor/src/components/data-table/data-table-pagination.tsx +7 -7
- package/packages/cli/vendor/src/components/data-table/data-table-toolbar.tsx +71 -50
- package/packages/cli/vendor/src/components/data-table/data-table.tsx +86 -73
- package/packages/cli/vendor/src/components/data-table/demo.tsx +2 -12
- package/packages/cli/vendor/src/components/data-table/public.ts +1 -6
- package/packages/cli/vendor/src/components/display/activity-feed.tsx +98 -40
- package/packages/cli/vendor/src/components/display/carousel.tsx +104 -6
- package/packages/cli/vendor/src/components/display/code-block.tsx +58 -26
- package/packages/cli/vendor/src/components/display/comparison-card.tsx +15 -41
- package/packages/cli/vendor/src/components/display/data-state.tsx +119 -50
- package/packages/cli/vendor/src/components/display/demo.tsx +0 -4
- package/packages/cli/vendor/src/components/display/index.ts +0 -3
- package/packages/cli/vendor/src/components/display/smart-card.tsx +1 -1
- package/packages/cli/vendor/src/components/display/status-legend.tsx +1 -1
- package/packages/cli/vendor/src/components/feedback/alert.tsx +86 -28
- package/packages/cli/vendor/src/components/feedback/index.ts +0 -2
- package/packages/cli/vendor/src/components/filters/demo.tsx +0 -1
- package/packages/cli/vendor/src/components/filters/filter-bar.tsx +126 -54
- package/packages/cli/vendor/src/components/filters/index.ts +0 -1
- package/packages/cli/vendor/src/components/form/form-field-shell.tsx +72 -34
- package/packages/cli/vendor/src/components/form/form-input.tsx +127 -23
- package/packages/cli/vendor/src/components/form/form-select.tsx +30 -7
- package/packages/cli/vendor/src/components/form/form-switch.tsx +77 -58
- package/packages/cli/vendor/src/components/form/form-textarea.tsx +65 -51
- package/packages/cli/vendor/src/components/form/public.ts +0 -9
- package/packages/cli/vendor/src/components/inputs/async-select.tsx +138 -91
- package/packages/cli/vendor/src/components/inputs/combobox.tsx +66 -9
- package/packages/cli/vendor/src/components/inputs/search-input.tsx +5 -2
- package/packages/cli/vendor/src/components/inputs/simple-select.tsx +20 -162
- package/packages/cli/vendor/src/components/layout/app-sidebar.tsx +42 -1
- package/packages/cli/vendor/src/components/layout/breadcrumbs.tsx +17 -8
- package/packages/cli/vendor/src/components/layout/stat-card.tsx +63 -23
- package/packages/cli/vendor/src/components/modern/calendar-scheduler.tsx +32 -22
- package/packages/cli/vendor/src/components/overlay/alert-dialog.tsx +148 -24
- package/packages/cli/vendor/src/components/overlay/drawer.tsx +42 -30
- package/packages/cli/vendor/src/components/patterns/index.ts +0 -1
- package/packages/cli/vendor/src/components/patterns/public.ts +0 -1
- package/packages/cli/vendor/src/components/ui/button/index.tsx +27 -17
- package/packages/cli/vendor/src/components/ui/card/index.tsx +95 -25
- package/packages/cli/vendor/src/components/ui/checkbox/index.tsx +22 -5
- package/packages/cli/vendor/src/components/ui/collapse/index.tsx +97 -16
- package/packages/cli/vendor/src/components/ui/dialog/index.tsx +12 -8
- package/packages/cli/vendor/src/components/ui/dropdown-menu/index.tsx +82 -28
- package/packages/cli/vendor/src/components/ui/input/index.tsx +98 -0
- package/packages/cli/vendor/src/components/ui/select/index.tsx +227 -34
- package/packages/cli/vendor/src/public-component-surface.ts +0 -3
- package/packages/cli/vendor/src/showcase/component-api-schema.ts +2 -2
- package/packages/cli/vendor/src/showcase/create-demo.tsx +44 -58
- package/packages/cli/vendor/src/showcase/fallback.tsx +80 -99
- package/packages/cli/vendor/src/showcase/premium/accordion/showcase.tsx +32 -2
- package/packages/cli/vendor/src/showcase/premium/action-menu/showcase.tsx +12 -3
- package/packages/cli/vendor/src/showcase/premium/activity-feed/showcase.tsx +15 -2
- package/packages/cli/vendor/src/showcase/premium/alert/showcase.tsx +32 -17
- package/packages/cli/vendor/src/showcase/premium/alert-dialog/showcase.tsx +28 -3
- package/packages/cli/vendor/src/showcase/premium/async-multi-select/mock.ts +6 -5
- package/packages/cli/vendor/src/showcase/premium/async-multi-select/showcase.tsx +5 -4
- package/packages/cli/vendor/src/showcase/premium/async-select/mock.ts +1 -1
- package/packages/cli/vendor/src/showcase/premium/async-select/showcase.tsx +36 -0
- package/packages/cli/vendor/src/showcase/premium/button/showcase.tsx +26 -5
- package/packages/cli/vendor/src/showcase/premium/button-group/showcase.tsx +20 -3
- package/packages/cli/vendor/src/showcase/premium/calendar/showcase.tsx +5 -0
- package/packages/cli/vendor/src/showcase/premium/carousel/showcase.tsx +33 -5
- package/packages/cli/vendor/src/showcase/premium/checkbox/showcase.tsx +46 -3
- package/packages/cli/vendor/src/showcase/premium/clearable-input/mock.ts +5 -3
- package/packages/cli/vendor/src/showcase/premium/clearable-input/showcase.tsx +5 -2
- package/packages/cli/vendor/src/showcase/premium/collapse/showcase.tsx +4 -0
- package/packages/cli/vendor/src/showcase/premium/combobox/showcase.tsx +8 -0
- package/packages/cli/vendor/src/showcase/premium/data-table/showcase.tsx +77 -27
- package/packages/cli/vendor/src/showcase/premium/data-table-parts/showcase.tsx +14 -14
- package/packages/cli/vendor/src/showcase/premium/date-input/mock.ts +1 -1
- package/packages/cli/vendor/src/showcase/premium/date-range-picker/showcase.tsx +7 -0
- package/packages/cli/vendor/src/showcase/premium/dropdown-menu/showcase.tsx +46 -3
- package/packages/cli/vendor/src/showcase/premium/form-wrapper/mock.ts +70 -44
- package/packages/cli/vendor/src/showcase/premium/form-wrapper/showcase.tsx +129 -12
- package/packages/cli/vendor/src/showcase/premium/index.ts +7 -24
- package/packages/cli/vendor/src/showcase/premium/input/mock.ts +2 -2
- package/packages/cli/vendor/src/showcase/premium/masked-input/mock.ts +1 -1
- package/packages/cli/vendor/src/showcase/premium/money-input/mock.ts +1 -1
- package/packages/cli/vendor/src/showcase/premium/number-input/mock.ts +1 -1
- package/packages/cli/vendor/src/showcase/premium/phone-input/mock.ts +1 -1
- package/packages/cli/vendor/src/showcase/premium/quantity-input/mock.ts +1 -1
- package/packages/cli/vendor/src/showcase/premium/select/mock.ts +1 -1
- package/packages/cli/vendor/src/showcase/premium/select/showcase.tsx +13 -21
- package/packages/cli/vendor/src/showcase/premium/simple-select/mock.ts +1 -1
- package/packages/cli/vendor/src/showcase/premium/simple-select/showcase.tsx +2 -1
- package/packages/cli/vendor/src/showcase/preview-catalog.tsx +7 -7
- package/packages/cli/vendor/src/showcase/registry-quality.ts +4 -28
- package/packages/cli/vendor/src/showcase/registry-specific.tsx +10 -186
- package/packages/cli/vendor/src/showcase/render-registry-preview.tsx +23 -57
- package/packages/cli/vendor/src/showcase/site-data.tsx +2443 -2761
- package/packages/cli/vendor/src/showcase/supplemental.tsx +2 -42
- package/packages/cli/vendor/src/showcase/tembro-registry.json +11 -58
- package/registry.json +11 -61
- package/dist/components/display/entity-card.cjs +0 -1
- package/dist/components/display/entity-card.d.ts +0 -18
- package/dist/components/display/entity-card.js +0 -61
- package/dist/components/display/entity-header.cjs +0 -1
- package/dist/components/display/entity-header.d.ts +0 -13
- package/dist/components/display/entity-header.js +0 -52
- package/dist/components/display/file-card.cjs +0 -1
- package/dist/components/display/file-card.d.ts +0 -14
- package/dist/components/display/file-card.js +0 -59
- package/dist/components/feedback/empty-search-state.cjs +0 -1
- package/dist/components/feedback/empty-search-state.d.ts +0 -11
- package/dist/components/feedback/empty-search-state.js +0 -45
- package/dist/components/feedback/empty-state.cjs +0 -1
- package/dist/components/feedback/empty-state.d.ts +0 -11
- package/dist/components/feedback/empty-state.js +0 -38
- package/dist/components/filters/filter-chips.cjs +0 -1
- package/dist/components/filters/filter-chips.d.ts +0 -18
- package/dist/components/filters/filter-chips.js +0 -61
- package/dist/components/patterns/form-builder-presets.cjs +0 -1
- package/dist/components/patterns/form-builder-presets.d.ts +0 -1
- package/dist/components/patterns/form-builder-presets.js +0 -2
- package/dist/components/patterns/form-builder.cjs +0 -1
- package/dist/components/patterns/form-builder.d.ts +0 -109
- package/dist/components/patterns/form-builder.js +0 -263
- package/dist/showcase/premium/empty-state/index.cjs +0 -1
- package/dist/showcase/premium/empty-state/index.d.ts +0 -2
- package/dist/showcase/premium/empty-state/index.js +0 -3
- package/dist/showcase/premium/empty-state/mock.cjs +0 -14
- package/dist/showcase/premium/empty-state/mock.d.ts +0 -2
- package/dist/showcase/premium/empty-state/mock.js +0 -31
- package/dist/showcase/premium/empty-state/showcase.cjs +0 -1
- package/dist/showcase/premium/empty-state/showcase.d.ts +0 -3
- package/dist/showcase/premium/empty-state/showcase.js +0 -99
- package/dist/showcase/premium/form-builder/index.cjs +0 -1
- package/dist/showcase/premium/form-builder/index.d.ts +0 -2
- package/dist/showcase/premium/form-builder/index.js +0 -3
- package/dist/showcase/premium/form-builder/mock.cjs +0 -57
- package/dist/showcase/premium/form-builder/mock.d.ts +0 -2
- package/dist/showcase/premium/form-builder/mock.js +0 -40
- package/dist/showcase/premium/form-builder/showcase.cjs +0 -1
- package/dist/showcase/premium/form-builder/showcase.d.ts +0 -3
- package/dist/showcase/premium/form-builder/showcase.js +0 -69
- package/packages/cli/vendor/src/components/display/entity-card.tsx +0 -80
- package/packages/cli/vendor/src/components/display/entity-header.tsx +0 -80
- package/packages/cli/vendor/src/components/display/file-card.tsx +0 -61
- package/packages/cli/vendor/src/components/feedback/empty-search-state.tsx +0 -65
- package/packages/cli/vendor/src/components/feedback/empty-state.tsx +0 -56
- package/packages/cli/vendor/src/components/filters/filter-chips.tsx +0 -89
- package/packages/cli/vendor/src/components/patterns/form-builder-presets.ts +0 -13
- package/packages/cli/vendor/src/components/patterns/form-builder.tsx +0 -443
- package/packages/cli/vendor/src/showcase/premium/empty-state/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/premium/empty-state/mock.ts +0 -30
- package/packages/cli/vendor/src/showcase/premium/empty-state/showcase.tsx +0 -65
- package/packages/cli/vendor/src/showcase/premium/form-builder/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/premium/form-builder/mock.ts +0 -79
- package/packages/cli/vendor/src/showcase/premium/form-builder/showcase.tsx +0 -55
|
@@ -20,17 +20,17 @@ import {
|
|
|
20
20
|
|
|
21
21
|
import { createDataTableActionsColumn } from "@/components/data-table/data-table-actions-column"
|
|
22
22
|
import { DataTableBulkActions, type DataTableBulkAction } from "@/components/data-table/data-table-bulk-actions"
|
|
23
|
-
import { DataTableColumnVisibilityMenu } from "@/components/data-table/data-table-column-visibility-menu"
|
|
24
|
-
import { DataTablePagination, type DataTablePaginationProps } from "@/components/data-table/data-table-pagination"
|
|
25
|
-
import { type DataTableRowAction } from "@/components/data-table/data-table-row-actions"
|
|
26
|
-
import { DataTableToolbar, type DataTableToolbarProps } from "@/components/data-table/data-table-toolbar"
|
|
27
|
-
import {
|
|
28
|
-
import { LoadingState, type LoadingStateProps } from "@/components/feedback/loading-state"
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
Table,
|
|
33
|
-
TableBody,
|
|
23
|
+
import { DataTableColumnVisibilityMenu } from "@/components/data-table/data-table-column-visibility-menu"
|
|
24
|
+
import { DataTablePagination, type DataTablePaginationProps } from "@/components/data-table/data-table-pagination"
|
|
25
|
+
import { type DataTableRowAction } from "@/components/data-table/data-table-row-actions"
|
|
26
|
+
import { DataTableToolbar, type DataTableToolbarProps } from "@/components/data-table/data-table-toolbar"
|
|
27
|
+
import { DataState, type DataStateProps } from "@/components/display/data-state"
|
|
28
|
+
import { LoadingState, type LoadingStateProps } from "@/components/feedback/loading-state"
|
|
29
|
+
import { Button } from "@/components/ui/button"
|
|
30
|
+
import { Input, type InputSearchProps } from "@/components/ui/input"
|
|
31
|
+
import {
|
|
32
|
+
Table,
|
|
33
|
+
TableBody,
|
|
34
34
|
TableCell,
|
|
35
35
|
TableHead,
|
|
36
36
|
TableHeader,
|
|
@@ -50,12 +50,12 @@ export type DataTableFeatureConfig = {
|
|
|
50
50
|
export?: boolean
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
export type DataTableSearchConfig = Pick<
|
|
54
|
-
|
|
55
|
-
| "value"
|
|
56
|
-
| "onValueChange"
|
|
57
|
-
| "placeholder"
|
|
58
|
-
| "inputClassName"
|
|
53
|
+
export type DataTableSearchConfig = Pick<
|
|
54
|
+
InputSearchProps,
|
|
55
|
+
| "value"
|
|
56
|
+
| "onValueChange"
|
|
57
|
+
| "placeholder"
|
|
58
|
+
| "inputClassName"
|
|
59
59
|
| "disabled"
|
|
60
60
|
| "clearable"
|
|
61
61
|
| "clearLabel"
|
|
@@ -87,28 +87,30 @@ export type DataTablePaginationConfig = Pick<
|
|
|
87
87
|
onPageSizeChange?: (pageSize: number) => void
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
export type DataTableProps<TData, TValue = unknown> = Omit<
|
|
91
|
-
React.ComponentProps<"div">,
|
|
92
|
-
"children"
|
|
93
|
-
> & {
|
|
90
|
+
export type DataTableProps<TData, TValue = unknown> = Omit<
|
|
91
|
+
React.ComponentProps<"div">,
|
|
92
|
+
"children"
|
|
93
|
+
> & {
|
|
94
94
|
columns: ColumnDef<TData, TValue>[]
|
|
95
95
|
data: TData[]
|
|
96
|
-
title?: React.ReactNode
|
|
97
|
-
description?: React.ReactNode
|
|
98
|
-
features?: DataTableFeatureConfig
|
|
99
|
-
search?: DataTableSearchConfig
|
|
100
|
-
|
|
101
|
-
|
|
96
|
+
title?: React.ReactNode
|
|
97
|
+
description?: React.ReactNode
|
|
98
|
+
features?: DataTableFeatureConfig
|
|
99
|
+
search?: DataTableSearchConfig
|
|
100
|
+
filters?: React.ReactNode | ((context: DataTableActionContext<TData>) => React.ReactNode)
|
|
101
|
+
summary?: React.ReactNode | ((context: DataTableActionContext<TData>) => React.ReactNode)
|
|
102
|
+
toolbarActions?: React.ReactNode | ((context: DataTableActionContext<TData>) => React.ReactNode)
|
|
103
|
+
rowActions?: (row: Row<TData>, original: TData) => DataTableRowAction<TData>[]
|
|
102
104
|
bulkActions?: DataTableBulkAction<TData>[]
|
|
103
105
|
onRefresh?: (context: DataTableActionContext<TData>) => void
|
|
104
|
-
onExport?: (context: DataTableActionContext<TData>) => void
|
|
106
|
+
onExport?: (context: DataTableActionContext<TData>) => void
|
|
105
107
|
refreshLabel?: React.ReactNode
|
|
106
108
|
exportLabel?: React.ReactNode
|
|
107
109
|
getRowId?: (originalRow: TData, index: number, parent?: Row<TData>) => string
|
|
108
110
|
isLoading?: boolean
|
|
109
111
|
isError?: boolean
|
|
110
|
-
emptyState?:
|
|
111
|
-
errorState?:
|
|
112
|
+
emptyState?: Omit<DataStateProps, "status">
|
|
113
|
+
errorState?: Omit<DataStateProps, "status">
|
|
112
114
|
loadingState?: LoadingStateProps
|
|
113
115
|
loadingVariant?: DataTableLoadingVariant
|
|
114
116
|
toolbar?: React.ReactNode | ((table: TanStackTable<TData>) => React.ReactNode)
|
|
@@ -189,11 +191,13 @@ function DataTable<TData, TValue = unknown>({
|
|
|
189
191
|
columns,
|
|
190
192
|
data,
|
|
191
193
|
title,
|
|
192
|
-
description,
|
|
193
|
-
features,
|
|
194
|
-
search,
|
|
195
|
-
|
|
196
|
-
|
|
194
|
+
description,
|
|
195
|
+
features,
|
|
196
|
+
search,
|
|
197
|
+
filters,
|
|
198
|
+
summary,
|
|
199
|
+
toolbarActions,
|
|
200
|
+
rowActions,
|
|
197
201
|
bulkActions,
|
|
198
202
|
onRefresh,
|
|
199
203
|
onExport,
|
|
@@ -259,11 +263,10 @@ function DataTable<TData, TValue = unknown>({
|
|
|
259
263
|
pageSize: paginationConfig.pageSize,
|
|
260
264
|
}
|
|
261
265
|
: undefined
|
|
262
|
-
const manualPagination = Boolean(paginationConfig && paginationConfig.manual !== false)
|
|
263
|
-
const resolvedRowSelection = rowSelection ?? {}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
// TanStack Table returns imperative helpers that React Compiler flags by design.
|
|
266
|
+
const manualPagination = Boolean(paginationConfig && paginationConfig.manual !== false)
|
|
267
|
+
const resolvedRowSelection = rowSelection ?? {}
|
|
268
|
+
|
|
269
|
+
// TanStack Table returns imperative helpers that React Compiler flags by design.
|
|
267
270
|
// eslint-disable-next-line react-hooks/incompatible-library
|
|
268
271
|
const table = useReactTable({
|
|
269
272
|
data,
|
|
@@ -291,18 +294,21 @@ function DataTable<TData, TValue = unknown>({
|
|
|
291
294
|
getExpandedRowModel: getExpandedRowModel(),
|
|
292
295
|
})
|
|
293
296
|
|
|
294
|
-
const rows = table.getRowModel().rows
|
|
295
|
-
const selectedRows = table.getSelectedRowModel().rows.map((row) => row.original)
|
|
296
|
-
const
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
const
|
|
302
|
-
const
|
|
303
|
-
const
|
|
304
|
-
const
|
|
305
|
-
const
|
|
297
|
+
const rows = table.getRowModel().rows
|
|
298
|
+
const selectedRows = table.getSelectedRowModel().rows.map((row) => row.original)
|
|
299
|
+
const selectedRowCount = selectedRows.length
|
|
300
|
+
const actionContext = React.useMemo<DataTableActionContext<TData>>(
|
|
301
|
+
() => ({ table, data, selectedRows }),
|
|
302
|
+
[data, selectedRows, table]
|
|
303
|
+
)
|
|
304
|
+
const visibleColumns = table.getVisibleLeafColumns()
|
|
305
|
+
const visibleColumnCount = Math.max(visibleColumns.length, 1)
|
|
306
|
+
const resolvedToolbar = typeof toolbar === "function" ? toolbar(table) : toolbar
|
|
307
|
+
const resolvedToolbarProps = typeof toolbarProps === "function" ? toolbarProps(table) : toolbarProps
|
|
308
|
+
const resolvedFilters = typeof filters === "function" ? filters(actionContext) : filters
|
|
309
|
+
const resolvedSummary = typeof summary === "function" ? summary(actionContext) : summary
|
|
310
|
+
const shouldShowSearch = Boolean(search && features?.search !== false)
|
|
311
|
+
const shouldShowColumnVisibility = Boolean(features?.columnVisibility && table.getAllLeafColumns().some((column) => column.getCanHide()))
|
|
306
312
|
const shouldShowRefresh = Boolean(features?.refresh && onRefresh)
|
|
307
313
|
const shouldShowExport = Boolean(features?.export && onExport)
|
|
308
314
|
const shouldShowBulkActions = Boolean(features?.bulkActions !== false && bulkActions?.length)
|
|
@@ -310,16 +316,19 @@ function DataTable<TData, TValue = unknown>({
|
|
|
310
316
|
title ||
|
|
311
317
|
description ||
|
|
312
318
|
search ||
|
|
319
|
+
resolvedFilters ||
|
|
320
|
+
resolvedSummary ||
|
|
313
321
|
toolbarActions ||
|
|
314
322
|
shouldShowRefresh ||
|
|
315
323
|
shouldShowExport
|
|
316
324
|
)
|
|
317
325
|
const shouldShowColumnVisibilityInToolbar = shouldShowColumnVisibility && hasPrimaryToolbarContent
|
|
318
326
|
const defaultSearch = shouldShowSearch && search ? (
|
|
319
|
-
<
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
327
|
+
<Input
|
|
328
|
+
type="search"
|
|
329
|
+
value={search.value}
|
|
330
|
+
onValueChange={search.onValueChange}
|
|
331
|
+
placeholder={search.placeholder ?? "Search..."}
|
|
323
332
|
wrapperClassName={search.wrapperClassName ?? search.className}
|
|
324
333
|
inputClassName={search.inputClassName}
|
|
325
334
|
disabled={search.disabled}
|
|
@@ -355,9 +364,11 @@ function DataTable<TData, TValue = unknown>({
|
|
|
355
364
|
/>
|
|
356
365
|
) : undefined
|
|
357
366
|
const hasDefaultToolbarContent = Boolean(
|
|
358
|
-
title ||
|
|
359
|
-
description ||
|
|
367
|
+
title ||
|
|
368
|
+
description ||
|
|
360
369
|
defaultSearch ||
|
|
370
|
+
resolvedFilters ||
|
|
371
|
+
resolvedSummary ||
|
|
361
372
|
toolbarActions ||
|
|
362
373
|
shouldShowColumnVisibilityInToolbar ||
|
|
363
374
|
shouldShowRefresh ||
|
|
@@ -400,26 +411,28 @@ function DataTable<TData, TValue = unknown>({
|
|
|
400
411
|
</TableRow>
|
|
401
412
|
))
|
|
402
413
|
|
|
403
|
-
const stateContent = shouldRenderSkeleton ? null : isLoading ? (
|
|
404
|
-
<LoadingState label="Loading data..." {...loadingState} />
|
|
405
|
-
) : isError ? (
|
|
406
|
-
<
|
|
407
|
-
) : rows.length === 0 ? (
|
|
408
|
-
<
|
|
409
|
-
) : null
|
|
414
|
+
const stateContent = shouldRenderSkeleton ? null : isLoading ? (
|
|
415
|
+
<LoadingState label="Loading data..." {...loadingState} />
|
|
416
|
+
) : isError ? (
|
|
417
|
+
<DataState status="error" title="Could not load data" description="Please try again." variant="plain" {...errorState} />
|
|
418
|
+
) : rows.length === 0 ? (
|
|
419
|
+
<DataState status="empty" variant="plain" {...emptyState} />
|
|
420
|
+
) : null
|
|
410
421
|
|
|
411
422
|
return (
|
|
412
423
|
<div data-slot="data-table" className={cn("grid gap-3", className)} {...props}>
|
|
413
424
|
{hasToolbar &&
|
|
414
425
|
(resolvedToolbar ?? (
|
|
415
|
-
<DataTableToolbar
|
|
416
|
-
title={title}
|
|
417
|
-
description={description}
|
|
418
|
-
search={defaultSearch}
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
426
|
+
<DataTableToolbar
|
|
427
|
+
title={title}
|
|
428
|
+
description={description}
|
|
429
|
+
search={defaultSearch}
|
|
430
|
+
filters={resolvedFilters}
|
|
431
|
+
summary={resolvedSummary}
|
|
432
|
+
actions={defaultActions}
|
|
433
|
+
selectionActions={defaultSelectionActions}
|
|
434
|
+
selectedCount={selectedRowCount}
|
|
435
|
+
totalCount={paginationConfig ? paginationConfig.rowCount ?? data.length : data.length}
|
|
423
436
|
variant="plain"
|
|
424
437
|
{...resolvedToolbarProps}
|
|
425
438
|
/>
|
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createShowcaseDemoRegistry } from "@/showcase/create-demo"
|
|
2
2
|
|
|
3
|
-
export const dataTableShowcaseDemoRegistry = createShowcaseDemoRegistry([
|
|
4
|
-
component("data-table-pagination", "DataTablePagination", "data-table", "Pagination control used by DataTable pages."),
|
|
5
|
-
component("data-table-toolbar", "DataTableToolbar", "data-table", "Toolbar surface for DataTable search, filters and actions."),
|
|
6
|
-
component("data-table-column-visibility-menu", "DataTableColumnVisibilityMenu", "data-table", "Column visibility menu pattern for table views."),
|
|
7
|
-
component("data-table-select-column", "DataTableSelectColumn", "data-table", "Selection column pattern for bulk table workflows."),
|
|
8
|
-
component("data-table-sortable-header", "DataTableSortableHeader", "data-table", "Sortable header trigger with clear visual state."),
|
|
9
|
-
component("data-table-row-actions", "DataTableRowActions", "data-table", "Row action menu for inspect, duplicate and archive operations."),
|
|
10
|
-
component("data-table-actions-column", "DataTableActionsColumn", "data-table", "Reusable actions column for DataTable definitions."),
|
|
11
|
-
component("data-table-bulk-actions", "DataTableBulkActions", "data-table", "Bulk action bar for selected rows."),
|
|
12
|
-
component("data-table-view-presets", "DataTableViewPresets", "data-table", "Saved table view presets for operational dashboards."),
|
|
13
|
-
])
|
|
3
|
+
export const dataTableShowcaseDemoRegistry = createShowcaseDemoRegistry([])
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
export * from "./data-table"
|
|
2
|
-
export * from "./data-table-
|
|
2
|
+
export * from "./data-table-pagination"
|
|
3
3
|
export * from "./data-table-bulk-actions"
|
|
4
4
|
export * from "./data-table-column-visibility-menu"
|
|
5
|
-
export * from "./data-table-pagination"
|
|
6
|
-
export * from "./data-table-row-actions"
|
|
7
|
-
export * from "./data-table-select-column"
|
|
8
5
|
export * from "./data-table-sortable-header"
|
|
9
|
-
export * from "./data-table-toolbar"
|
|
10
6
|
export * from "./data-table-view-presets"
|
|
11
|
-
export * from "./data-table-saved-filters"
|
|
@@ -3,28 +3,39 @@ import * as React from "react"
|
|
|
3
3
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
|
|
4
4
|
import { cn } from "@/lib/utils"
|
|
5
5
|
|
|
6
|
-
export type ActivityFeedItem = {
|
|
6
|
+
export type ActivityFeedItem = {
|
|
7
7
|
id: string
|
|
8
8
|
title: React.ReactNode
|
|
9
9
|
description?: React.ReactNode
|
|
10
10
|
time?: React.ReactNode
|
|
11
11
|
icon?: React.ReactNode
|
|
12
12
|
tone?: "default" | "success" | "warning" | "danger" | "info" | "muted"
|
|
13
|
-
actions?: React.ReactNode
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
actions?: React.ReactNode
|
|
14
|
+
meta?: React.ReactNode
|
|
15
|
+
badge?: React.ReactNode
|
|
16
|
+
unread?: boolean
|
|
17
|
+
hidden?: boolean
|
|
18
|
+
interactive?: boolean
|
|
19
|
+
href?: string
|
|
20
|
+
target?: React.ComponentProps<"a">["target"]
|
|
21
|
+
rel?: React.ComponentProps<"a">["rel"]
|
|
22
|
+
onSelect?: () => void
|
|
23
|
+
className?: string
|
|
24
|
+
}
|
|
17
25
|
|
|
18
|
-
export type ActivityFeedProps = React.ComponentProps<typeof Card> & {
|
|
26
|
+
export type ActivityFeedProps = React.ComponentProps<typeof Card> & {
|
|
19
27
|
title?: React.ReactNode
|
|
20
28
|
description?: React.ReactNode
|
|
21
29
|
actions?: React.ReactNode
|
|
22
30
|
items: ActivityFeedItem[]
|
|
23
31
|
empty?: React.ReactNode
|
|
24
|
-
compact?: boolean
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
32
|
+
compact?: boolean
|
|
33
|
+
density?: "comfortable" | "compact"
|
|
34
|
+
showConnector?: boolean
|
|
35
|
+
connectorClassName?: string
|
|
36
|
+
contentClassName?: string
|
|
37
|
+
itemClassName?: string
|
|
38
|
+
}
|
|
28
39
|
|
|
29
40
|
const toneDotClassName: Record<NonNullable<ActivityFeedItem["tone"]>, string> = {
|
|
30
41
|
default: "bg-primary",
|
|
@@ -41,14 +52,18 @@ function ActivityFeed({
|
|
|
41
52
|
description,
|
|
42
53
|
actions,
|
|
43
54
|
items,
|
|
44
|
-
empty = "No activity yet.",
|
|
45
|
-
compact = false,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
55
|
+
empty = "No activity yet.",
|
|
56
|
+
compact = false,
|
|
57
|
+
density,
|
|
58
|
+
showConnector = true,
|
|
59
|
+
connectorClassName,
|
|
60
|
+
contentClassName,
|
|
61
|
+
itemClassName,
|
|
62
|
+
...props
|
|
63
|
+
}: ActivityFeedProps) {
|
|
64
|
+
const visibleItems = items.filter((item) => !item.hidden)
|
|
65
|
+
const hasHeader = Boolean(title || description || actions)
|
|
66
|
+
const isCompact = density ? density === "compact" : compact
|
|
52
67
|
|
|
53
68
|
return (
|
|
54
69
|
<Card data-slot="activity-feed" className={cn("min-w-0", className)} {...props}>
|
|
@@ -68,28 +83,71 @@ function ActivityFeed({
|
|
|
68
83
|
{visibleItems.length === 0 ? (
|
|
69
84
|
<div className="rounded-lg border border-dashed p-4 text-center text-sm text-muted-foreground">{empty}</div>
|
|
70
85
|
) : (
|
|
71
|
-
visibleItems.map((item, index) =>
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
86
|
+
visibleItems.map((item, index) => {
|
|
87
|
+
const isInteractive = item.interactive ?? Boolean(item.href || item.onSelect)
|
|
88
|
+
const content = (
|
|
89
|
+
<>
|
|
90
|
+
<div className={cn(
|
|
91
|
+
"relative z-10 mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-full border bg-background",
|
|
92
|
+
item.unread && "border-primary/45 bg-primary/8 shadow-[0_0_0_3px_color-mix(in_oklch,var(--primary),transparent_88%)]"
|
|
93
|
+
)}>
|
|
94
|
+
{item.icon ?? <span className={cn("size-2 rounded-full", toneDotClassName[item.tone ?? "default"])} />}
|
|
95
|
+
</div>
|
|
96
|
+
<div className="min-w-0 flex-1 space-y-1">
|
|
97
|
+
<div className="flex min-w-0 items-start justify-between gap-2">
|
|
98
|
+
<div className="min-w-0 space-y-1">
|
|
99
|
+
<div className="min-w-0 text-sm font-medium leading-5 text-foreground">{item.title}</div>
|
|
100
|
+
{item.meta && <div className="text-xs text-muted-foreground">{item.meta}</div>}
|
|
101
|
+
</div>
|
|
102
|
+
<div className="flex shrink-0 items-center gap-2">
|
|
103
|
+
{item.badge}
|
|
104
|
+
{item.time && <div className="text-xs text-muted-foreground">{item.time}</div>}
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
{item.description && <div className="text-sm leading-5 text-muted-foreground">{item.description}</div>}
|
|
108
|
+
{item.actions && <div className="pt-1">{item.actions}</div>}
|
|
109
|
+
</div>
|
|
110
|
+
</>
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
return (
|
|
114
|
+
<div
|
|
115
|
+
key={item.id}
|
|
116
|
+
data-slot="activity-feed-item"
|
|
117
|
+
className={cn("relative flex gap-3 pb-4 last:pb-0", isCompact && "gap-2 pb-3", itemClassName, item.className)}
|
|
118
|
+
>
|
|
119
|
+
{showConnector && index < visibleItems.length - 1 && (
|
|
120
|
+
<div className={cn("absolute left-3 top-7 h-[calc(100%-1.75rem)] w-px bg-border", connectorClassName)} />
|
|
121
|
+
)}
|
|
122
|
+
{item.href ? (
|
|
123
|
+
<a
|
|
124
|
+
href={item.href}
|
|
125
|
+
target={item.target}
|
|
126
|
+
rel={item.rel}
|
|
127
|
+
className={cn(
|
|
128
|
+
"flex min-w-0 flex-1 gap-3 rounded-[var(--radius-lg)] px-2 py-1.5 transition-[background-color,border-color,box-shadow]",
|
|
129
|
+
isInteractive && "hover:bg-muted/35 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40"
|
|
130
|
+
)}
|
|
131
|
+
>
|
|
132
|
+
{content}
|
|
133
|
+
</a>
|
|
134
|
+
) : isInteractive ? (
|
|
135
|
+
<button
|
|
136
|
+
type="button"
|
|
137
|
+
className="flex min-w-0 flex-1 gap-3 rounded-[var(--radius-lg)] px-2 py-1.5 text-left transition-[background-color,border-color,box-shadow] hover:bg-muted/35 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40"
|
|
138
|
+
onClick={item.onSelect}
|
|
139
|
+
>
|
|
140
|
+
{content}
|
|
141
|
+
</button>
|
|
142
|
+
) : (
|
|
143
|
+
<div className="flex min-w-0 flex-1 gap-3 px-2 py-1.5">
|
|
144
|
+
{content}
|
|
145
|
+
</div>
|
|
146
|
+
)}
|
|
147
|
+
</div>
|
|
148
|
+
)})
|
|
149
|
+
)}
|
|
150
|
+
</CardContent>
|
|
93
151
|
</Card>
|
|
94
152
|
)
|
|
95
153
|
}
|
|
@@ -16,6 +16,21 @@ export type CarouselProps = React.ComponentProps<"div"> & {
|
|
|
16
16
|
ariaLabel?: string
|
|
17
17
|
previousLabel?: string
|
|
18
18
|
nextLabel?: string
|
|
19
|
+
swipeThreshold?: number
|
|
20
|
+
autoplay?: boolean
|
|
21
|
+
autoplayInterval?: number
|
|
22
|
+
pauseOnHover?: boolean
|
|
23
|
+
stopAutoplayOnInteraction?: boolean
|
|
24
|
+
showPlaybackControl?: boolean
|
|
25
|
+
playLabel?: string
|
|
26
|
+
pauseLabel?: string
|
|
27
|
+
onAutoplayChange?: (playing: boolean) => void
|
|
28
|
+
viewportClassName?: string
|
|
29
|
+
controlsClassName?: string
|
|
30
|
+
dotsClassName?: string
|
|
31
|
+
arrowClassName?: string
|
|
32
|
+
dotClassName?: string
|
|
33
|
+
activeDotClassName?: string
|
|
19
34
|
}
|
|
20
35
|
|
|
21
36
|
export type CarouselItemProps = React.ComponentProps<"div">
|
|
@@ -38,24 +53,86 @@ function Carousel({
|
|
|
38
53
|
ariaLabel = "Carousel",
|
|
39
54
|
previousLabel = "Previous slide",
|
|
40
55
|
nextLabel = "Next slide",
|
|
56
|
+
swipeThreshold = 44,
|
|
57
|
+
autoplay = false,
|
|
58
|
+
autoplayInterval = 4500,
|
|
59
|
+
pauseOnHover = true,
|
|
60
|
+
stopAutoplayOnInteraction = true,
|
|
61
|
+
showPlaybackControl = false,
|
|
62
|
+
playLabel = "Start autoplay",
|
|
63
|
+
pauseLabel = "Pause autoplay",
|
|
64
|
+
onAutoplayChange,
|
|
65
|
+
viewportClassName,
|
|
66
|
+
controlsClassName,
|
|
67
|
+
dotsClassName,
|
|
68
|
+
arrowClassName,
|
|
69
|
+
dotClassName,
|
|
70
|
+
activeDotClassName,
|
|
41
71
|
className,
|
|
42
72
|
children,
|
|
43
73
|
...props
|
|
44
74
|
}: CarouselProps) {
|
|
45
75
|
const items = React.Children.toArray(children)
|
|
46
76
|
const [internalIndex, setInternalIndex] = React.useState(defaultIndex)
|
|
77
|
+
const touchStartXRef = React.useRef<number | null>(null)
|
|
78
|
+
const [isHovered, setIsHovered] = React.useState(false)
|
|
79
|
+
const [autoplayStopped, setAutoplayStopped] = React.useState(false)
|
|
80
|
+
const [autoplayEnabled, setAutoplayEnabled] = React.useState(autoplay)
|
|
47
81
|
const controlled = index !== undefined
|
|
48
82
|
const activeIndex = clampIndex(controlled ? index : internalIndex, items.length, loop)
|
|
49
83
|
|
|
50
|
-
|
|
84
|
+
React.useEffect(() => {
|
|
85
|
+
setAutoplayEnabled(autoplay)
|
|
86
|
+
}, [autoplay])
|
|
87
|
+
|
|
88
|
+
function setActiveIndex(nextIndex: number, reason: "manual" | "autoplay" = "manual") {
|
|
51
89
|
const resolvedIndex = clampIndex(nextIndex, items.length, loop)
|
|
52
90
|
if (!controlled) setInternalIndex(resolvedIndex)
|
|
91
|
+
if (reason === "manual" && stopAutoplayOnInteraction) {
|
|
92
|
+
setAutoplayStopped(true)
|
|
93
|
+
if (autoplayEnabled) {
|
|
94
|
+
setAutoplayEnabled(false)
|
|
95
|
+
onAutoplayChange?.(false)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
53
98
|
onIndexChange?.(resolvedIndex)
|
|
54
99
|
}
|
|
55
100
|
|
|
56
101
|
const canGoPrevious = loop || activeIndex > 0
|
|
57
102
|
const canGoNext = loop || activeIndex < items.length - 1
|
|
58
103
|
|
|
104
|
+
const handleTouchStart: React.TouchEventHandler<HTMLDivElement> = (event) => {
|
|
105
|
+
touchStartXRef.current = event.touches[0]?.clientX ?? null
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const handleTouchEnd: React.TouchEventHandler<HTMLDivElement> = (event) => {
|
|
109
|
+
if (touchStartXRef.current == null || items.length <= 1) return
|
|
110
|
+
const endX = event.changedTouches[0]?.clientX ?? touchStartXRef.current
|
|
111
|
+
const deltaX = endX - touchStartXRef.current
|
|
112
|
+
touchStartXRef.current = null
|
|
113
|
+
|
|
114
|
+
if (Math.abs(deltaX) < swipeThreshold) return
|
|
115
|
+
if (deltaX > 0 && canGoPrevious) setActiveIndex(activeIndex - 1)
|
|
116
|
+
if (deltaX < 0 && canGoNext) setActiveIndex(activeIndex + 1)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
React.useEffect(() => {
|
|
120
|
+
if (!autoplayEnabled || items.length <= 1 || autoplayStopped) return
|
|
121
|
+
if (pauseOnHover && isHovered) return
|
|
122
|
+
|
|
123
|
+
const timer = window.setInterval(() => {
|
|
124
|
+
if (!loop && activeIndex >= items.length - 1) {
|
|
125
|
+
setActiveIndex(0, "autoplay")
|
|
126
|
+
return
|
|
127
|
+
}
|
|
128
|
+
setActiveIndex(activeIndex + 1, "autoplay")
|
|
129
|
+
}, autoplayInterval)
|
|
130
|
+
|
|
131
|
+
return () => {
|
|
132
|
+
window.clearInterval(timer)
|
|
133
|
+
}
|
|
134
|
+
}, [activeIndex, autoplayEnabled, autoplayInterval, autoplayStopped, isHovered, items.length, loop, pauseOnHover])
|
|
135
|
+
|
|
59
136
|
return (
|
|
60
137
|
<div
|
|
61
138
|
data-slot="carousel"
|
|
@@ -63,6 +140,7 @@ function Carousel({
|
|
|
63
140
|
role="region"
|
|
64
141
|
aria-roledescription="carousel"
|
|
65
142
|
aria-label={ariaLabel}
|
|
143
|
+
tabIndex={keyboard ? 0 : undefined}
|
|
66
144
|
className={cn("grid gap-3", className)}
|
|
67
145
|
onKeyDown={(event) => {
|
|
68
146
|
if (!keyboard || items.length <= 1) return
|
|
@@ -75,13 +153,17 @@ function Carousel({
|
|
|
75
153
|
setActiveIndex(activeIndex + 1)
|
|
76
154
|
}
|
|
77
155
|
}}
|
|
156
|
+
onTouchStart={handleTouchStart}
|
|
157
|
+
onTouchEnd={handleTouchEnd}
|
|
158
|
+
onMouseEnter={() => setIsHovered(true)}
|
|
159
|
+
onMouseLeave={() => setIsHovered(false)}
|
|
78
160
|
{...props}
|
|
79
161
|
>
|
|
80
162
|
<div className={cn(
|
|
81
163
|
"relative overflow-hidden rounded-[var(--aui-card-radius,var(--radius-lg))] border border-[color:var(--aui-card-border,var(--border))] bg-card shadow-[var(--aui-card-shadow,0_12px_32px_rgba(15,23,42,0.08))]",
|
|
82
164
|
variant === "hero" && "min-h-72",
|
|
83
165
|
variant === "minimal" && "rounded-[var(--radius-md)] shadow-none"
|
|
84
|
-
)}>
|
|
166
|
+
, viewportClassName)}>
|
|
85
167
|
<div className="transition-transform duration-300 ease-out" aria-live="polite">
|
|
86
168
|
{items[activeIndex]}
|
|
87
169
|
</div>
|
|
@@ -91,7 +173,7 @@ function Carousel({
|
|
|
91
173
|
type="button"
|
|
92
174
|
variant={variant === "hero" ? "default" : "secondary"}
|
|
93
175
|
size="icon-sm"
|
|
94
|
-
className="absolute left-3 top-1/2 -translate-y-1/2 rounded-full shadow-lg"
|
|
176
|
+
className={cn("absolute left-3 top-1/2 -translate-y-1/2 rounded-full shadow-lg", arrowClassName)}
|
|
95
177
|
disabled={!canGoPrevious}
|
|
96
178
|
aria-label={previousLabel}
|
|
97
179
|
onClick={() => setActiveIndex(activeIndex - 1)}
|
|
@@ -102,7 +184,7 @@ function Carousel({
|
|
|
102
184
|
type="button"
|
|
103
185
|
variant={variant === "hero" ? "default" : "secondary"}
|
|
104
186
|
size="icon-sm"
|
|
105
|
-
className="absolute right-3 top-1/2 -translate-y-1/2 rounded-full shadow-lg"
|
|
187
|
+
className={cn("absolute right-3 top-1/2 -translate-y-1/2 rounded-full shadow-lg", arrowClassName)}
|
|
106
188
|
disabled={!canGoNext}
|
|
107
189
|
aria-label={nextLabel}
|
|
108
190
|
onClick={() => setActiveIndex(activeIndex + 1)}
|
|
@@ -113,7 +195,7 @@ function Carousel({
|
|
|
113
195
|
) : null}
|
|
114
196
|
</div>
|
|
115
197
|
{showDots && items.length > 1 && (
|
|
116
|
-
<div className="flex items-center justify-center gap-2" role="tablist" aria-label={`${ariaLabel} slides`}>
|
|
198
|
+
<div className={cn("flex flex-wrap items-center justify-center gap-2", dotsClassName)} role="tablist" aria-label={`${ariaLabel} slides`}>
|
|
117
199
|
{items.map((_, itemIndex) => (
|
|
118
200
|
<button
|
|
119
201
|
key={itemIndex}
|
|
@@ -123,11 +205,27 @@ function Carousel({
|
|
|
123
205
|
aria-selected={itemIndex === activeIndex}
|
|
124
206
|
className={cn(
|
|
125
207
|
"h-2.5 rounded-full bg-muted-foreground/30 transition-[width,background-color,opacity] hover:bg-muted-foreground/55",
|
|
126
|
-
itemIndex === activeIndex ? "w-7 bg-primary" : "w-2.5"
|
|
208
|
+
itemIndex === activeIndex ? cn("w-7 bg-primary", activeDotClassName) : cn("w-2.5", dotClassName)
|
|
127
209
|
)}
|
|
128
210
|
onClick={() => setActiveIndex(itemIndex)}
|
|
129
211
|
/>
|
|
130
212
|
))}
|
|
213
|
+
{showPlaybackControl ? (
|
|
214
|
+
<Button
|
|
215
|
+
type="button"
|
|
216
|
+
variant="ghost"
|
|
217
|
+
size="sm"
|
|
218
|
+
className={cn("ml-2 rounded-full", controlsClassName)}
|
|
219
|
+
onClick={() => {
|
|
220
|
+
const nextPlaying = !autoplayEnabled
|
|
221
|
+
setAutoplayStopped(false)
|
|
222
|
+
setAutoplayEnabled(nextPlaying)
|
|
223
|
+
onAutoplayChange?.(nextPlaying)
|
|
224
|
+
}}
|
|
225
|
+
>
|
|
226
|
+
{autoplayEnabled ? pauseLabel : playLabel}
|
|
227
|
+
</Button>
|
|
228
|
+
) : null}
|
|
131
229
|
</div>
|
|
132
230
|
)}
|
|
133
231
|
</div>
|