tembro 2.0.4 → 2.0.5
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-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 +6 -4
- package/dist/components/data-table/data-table.js +87 -79
- 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 +10 -1
- package/dist/components/display/carousel.js +68 -23
- 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/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.js +278 -217
- package/dist/components/form/form-select.cjs +1 -1
- package/dist/components/form/form-select.js +47 -33
- 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 +11 -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/simple-select.cjs +1 -1
- package/dist/components/inputs/simple-select.d.ts +2 -1
- package/dist/components/inputs/simple-select.js +32 -16
- 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/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/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 +20 -34
- 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 +13 -13
- 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/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 +149 -383
- package/dist/showcase/render-registry-preview.cjs +1 -1
- package/dist/showcase/render-registry-preview.js +163 -195
- 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-toolbar.tsx +71 -50
- package/packages/cli/vendor/src/components/data-table/data-table.tsx +65 -53
- 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 +88 -2
- 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/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 +118 -11
- package/packages/cli/vendor/src/components/form/form-select.tsx +26 -3
- 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 +126 -82
- package/packages/cli/vendor/src/components/inputs/combobox.tsx +66 -9
- package/packages/cli/vendor/src/components/inputs/simple-select.tsx +52 -24
- 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/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/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 +31 -46
- 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 +11 -11
- 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/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 +3 -178
- package/packages/cli/vendor/src/showcase/render-registry-preview.tsx +18 -51
- 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
|
@@ -15,15 +15,19 @@ export type ComboboxOption<TValue extends string = string> = {
|
|
|
15
15
|
hidden?: boolean
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export type ComboboxProps<TValue extends string = string> = React.ComponentProps<"div"> & {
|
|
18
|
+
export type ComboboxProps<TValue extends string = string> = React.ComponentProps<"div"> & {
|
|
19
19
|
value?: TValue
|
|
20
20
|
options: ComboboxOption<TValue>[]
|
|
21
21
|
onValueChange?: (value: TValue | undefined, option?: ComboboxOption<TValue>) => void
|
|
22
22
|
placeholder?: React.ReactNode
|
|
23
23
|
searchPlaceholder?: string
|
|
24
|
-
emptyLabel?: React.ReactNode
|
|
25
|
-
disabled?: boolean
|
|
24
|
+
emptyLabel?: React.ReactNode
|
|
25
|
+
disabled?: boolean
|
|
26
26
|
invalid?: boolean
|
|
27
|
+
clearable?: boolean
|
|
28
|
+
allowDeselect?: boolean
|
|
29
|
+
showSelectedDescription?: boolean
|
|
30
|
+
onSearchChange?: (value: string) => void
|
|
27
31
|
triggerClassName?: string
|
|
28
32
|
contentClassName?: string
|
|
29
33
|
optionClassName?: string
|
|
@@ -36,9 +40,13 @@ function Combobox<TValue extends string = string>({
|
|
|
36
40
|
onValueChange,
|
|
37
41
|
placeholder = "Select option",
|
|
38
42
|
searchPlaceholder = "Search...",
|
|
39
|
-
emptyLabel = "No option found",
|
|
43
|
+
emptyLabel = "No option found",
|
|
40
44
|
disabled = false,
|
|
41
45
|
invalid,
|
|
46
|
+
clearable = false,
|
|
47
|
+
allowDeselect = false,
|
|
48
|
+
showSelectedDescription = true,
|
|
49
|
+
onSearchChange,
|
|
42
50
|
triggerClassName,
|
|
43
51
|
contentClassName,
|
|
44
52
|
optionClassName,
|
|
@@ -58,7 +66,16 @@ function Combobox<TValue extends string = string>({
|
|
|
58
66
|
|
|
59
67
|
return (
|
|
60
68
|
<div data-slot="combobox" className={cn("grid w-full gap-2", className)} {...props}>
|
|
61
|
-
<Popover
|
|
69
|
+
<Popover
|
|
70
|
+
open={open}
|
|
71
|
+
onOpenChange={(nextOpen) => {
|
|
72
|
+
setOpen(nextOpen)
|
|
73
|
+
if (!nextOpen) {
|
|
74
|
+
setSearch("")
|
|
75
|
+
onSearchChange?.("")
|
|
76
|
+
}
|
|
77
|
+
}}
|
|
78
|
+
>
|
|
62
79
|
<PopoverTrigger
|
|
63
80
|
render={
|
|
64
81
|
<Button
|
|
@@ -71,9 +88,40 @@ function Combobox<TValue extends string = string>({
|
|
|
71
88
|
/>
|
|
72
89
|
}
|
|
73
90
|
>
|
|
74
|
-
<span className={cn("min-w-0 flex-1
|
|
75
|
-
{selectedOption
|
|
91
|
+
<span className={cn("min-w-0 flex-1", !selectedOption && "text-muted-foreground")}>
|
|
92
|
+
{selectedOption ? (
|
|
93
|
+
<span className="flex min-w-0 flex-col items-start">
|
|
94
|
+
<span className="truncate font-medium">{selectedOption.label}</span>
|
|
95
|
+
{showSelectedDescription && selectedOption.description ? (
|
|
96
|
+
<span className="truncate text-[11px] text-muted-foreground">{selectedOption.description}</span>
|
|
97
|
+
) : null}
|
|
98
|
+
</span>
|
|
99
|
+
) : (
|
|
100
|
+
<span className="truncate font-normal">{placeholder}</span>
|
|
101
|
+
)}
|
|
76
102
|
</span>
|
|
103
|
+
{clearable && selectedOption && !disabled ? (
|
|
104
|
+
<span
|
|
105
|
+
role="button"
|
|
106
|
+
tabIndex={0}
|
|
107
|
+
aria-label="Clear value"
|
|
108
|
+
className="inline-flex size-6 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted/55 hover:text-foreground"
|
|
109
|
+
onClick={(event) => {
|
|
110
|
+
event.preventDefault()
|
|
111
|
+
event.stopPropagation()
|
|
112
|
+
onValueChange?.(undefined, undefined)
|
|
113
|
+
}}
|
|
114
|
+
onKeyDown={(event) => {
|
|
115
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
116
|
+
event.preventDefault()
|
|
117
|
+
event.stopPropagation()
|
|
118
|
+
onValueChange?.(undefined, undefined)
|
|
119
|
+
}
|
|
120
|
+
}}
|
|
121
|
+
>
|
|
122
|
+
×
|
|
123
|
+
</span>
|
|
124
|
+
) : null}
|
|
77
125
|
<ChevronDownIcon className="size-4 opacity-60" />
|
|
78
126
|
</PopoverTrigger>
|
|
79
127
|
<PopoverContent
|
|
@@ -83,7 +131,15 @@ function Combobox<TValue extends string = string>({
|
|
|
83
131
|
>
|
|
84
132
|
<div className="relative mb-2">
|
|
85
133
|
<SearchIcon className="pointer-events-none absolute left-2 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" />
|
|
86
|
-
<Input
|
|
134
|
+
<Input
|
|
135
|
+
value={search}
|
|
136
|
+
onChange={(event) => {
|
|
137
|
+
setSearch(event.target.value)
|
|
138
|
+
onSearchChange?.(event.target.value)
|
|
139
|
+
}}
|
|
140
|
+
placeholder={searchPlaceholder}
|
|
141
|
+
className={cn("h-9 pl-8", searchClassName)}
|
|
142
|
+
/>
|
|
87
143
|
</div>
|
|
88
144
|
<div className="max-h-64 overflow-y-auto">
|
|
89
145
|
{filteredOptions.length ? filteredOptions.map((option) => {
|
|
@@ -99,7 +155,8 @@ function Combobox<TValue extends string = string>({
|
|
|
99
155
|
optionClassName
|
|
100
156
|
)}
|
|
101
157
|
onClick={() => {
|
|
102
|
-
|
|
158
|
+
const nextValue = allowDeselect && active ? undefined : option.value
|
|
159
|
+
onValueChange?.(nextValue, nextValue ? option : undefined)
|
|
103
160
|
setOpen(false)
|
|
104
161
|
}}
|
|
105
162
|
>
|
|
@@ -32,10 +32,11 @@ export type SimpleSelectProps = Omit<
|
|
|
32
32
|
size?: "sm" | "default" | "lg"
|
|
33
33
|
clearable?: boolean
|
|
34
34
|
searchable?: boolean
|
|
35
|
-
loading?: boolean
|
|
36
|
-
loadingLabel?: React.ReactNode
|
|
37
|
-
disabled?: boolean
|
|
38
|
-
|
|
35
|
+
loading?: boolean
|
|
36
|
+
loadingLabel?: React.ReactNode
|
|
37
|
+
disabled?: boolean
|
|
38
|
+
showSelectedDescription?: boolean
|
|
39
|
+
triggerClassName?: string
|
|
39
40
|
contentClassName?: string
|
|
40
41
|
itemClassName?: string
|
|
41
42
|
searchClassName?: string
|
|
@@ -63,23 +64,34 @@ function SimpleSelect({
|
|
|
63
64
|
size = "default",
|
|
64
65
|
clearable = false,
|
|
65
66
|
searchable = false,
|
|
66
|
-
loading = false,
|
|
67
|
-
loadingLabel = "Loading options...",
|
|
68
|
-
disabled = false,
|
|
69
|
-
|
|
67
|
+
loading = false,
|
|
68
|
+
loadingLabel = "Loading options...",
|
|
69
|
+
disabled = false,
|
|
70
|
+
showSelectedDescription = true,
|
|
71
|
+
triggerClassName,
|
|
70
72
|
contentClassName,
|
|
71
73
|
itemClassName,
|
|
72
|
-
searchClassName,
|
|
73
|
-
renderOption,
|
|
74
|
-
invalid,
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
searchClassName,
|
|
75
|
+
renderOption,
|
|
76
|
+
invalid,
|
|
77
|
+
onOpenChange,
|
|
78
|
+
...props
|
|
79
|
+
}: SimpleSelectProps) {
|
|
77
80
|
const [search, setSearch] = React.useState("")
|
|
78
81
|
const selectedOption = options.find((option) => option.value === value)
|
|
79
82
|
const filteredOptions = options.filter((option) => optionMatchesSearch(option, search))
|
|
80
83
|
|
|
81
84
|
return (
|
|
82
|
-
<Select
|
|
85
|
+
<Select
|
|
86
|
+
value={value}
|
|
87
|
+
onValueChange={(val) => onValueChange?.(val as string)}
|
|
88
|
+
disabled={disabled || loading}
|
|
89
|
+
onOpenChange={(open, eventDetails) => {
|
|
90
|
+
if (!open) setSearch("")
|
|
91
|
+
onOpenChange?.(open, eventDetails)
|
|
92
|
+
}}
|
|
93
|
+
{...props}
|
|
94
|
+
>
|
|
83
95
|
<SelectTrigger
|
|
84
96
|
size={size}
|
|
85
97
|
aria-invalid={invalid || undefined}
|
|
@@ -88,12 +100,22 @@ function SimpleSelect({
|
|
|
88
100
|
triggerClassName
|
|
89
101
|
)}
|
|
90
102
|
>
|
|
91
|
-
<SelectValue placeholder={placeholder}>
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
103
|
+
<SelectValue placeholder={placeholder}>
|
|
104
|
+
{selectedOption ? (
|
|
105
|
+
<span className="flex min-w-0 flex-col items-start">
|
|
106
|
+
<span className="truncate">{selectedOption.label}</span>
|
|
107
|
+
{showSelectedDescription && selectedOption.description ? (
|
|
108
|
+
<span className="truncate text-[11px] font-medium text-muted-foreground">{selectedOption.description}</span>
|
|
109
|
+
) : null}
|
|
110
|
+
</span>
|
|
111
|
+
) : null}
|
|
112
|
+
</SelectValue>
|
|
113
|
+
{loading ? <LoaderCircleIcon className="size-4 animate-spin text-muted-foreground" /> : null}
|
|
114
|
+
{clearable && value && !disabled && !loading ? (
|
|
115
|
+
<span
|
|
116
|
+
role="button"
|
|
117
|
+
tabIndex={0}
|
|
118
|
+
aria-label={clearLabel}
|
|
97
119
|
className="ml-1 rounded-[var(--radius-sm)] border border-border/65 p-1 text-muted-foreground transition-colors hover:border-border hover:bg-muted/55 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
98
120
|
onClick={(event) => {
|
|
99
121
|
event.preventDefault()
|
|
@@ -102,11 +124,17 @@ function SimpleSelect({
|
|
|
102
124
|
}}
|
|
103
125
|
onMouseDown={stopInteractivePropagation}
|
|
104
126
|
onDoubleClick={stopInteractivePropagation}
|
|
127
|
+
onKeyDown={(event) => {
|
|
128
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
129
|
+
event.preventDefault()
|
|
130
|
+
onValueChange?.(undefined)
|
|
131
|
+
}
|
|
132
|
+
}}
|
|
105
133
|
>
|
|
106
|
-
<XIcon className="size-3.5" />
|
|
107
|
-
</
|
|
108
|
-
) : null}
|
|
109
|
-
</SelectTrigger>
|
|
134
|
+
<XIcon className="size-3.5" />
|
|
135
|
+
</span>
|
|
136
|
+
) : null}
|
|
137
|
+
</SelectTrigger>
|
|
110
138
|
<SelectContent
|
|
111
139
|
className={cn(
|
|
112
140
|
"w-(--anchor-width)",
|
|
@@ -36,6 +36,9 @@ export type AppSidebarProps = React.ComponentProps<"aside"> & {
|
|
|
36
36
|
footer?: React.ReactNode
|
|
37
37
|
items?: AppSidebarNavItem[]
|
|
38
38
|
collapsed?: boolean
|
|
39
|
+
width?: React.CSSProperties["width"]
|
|
40
|
+
collapsedWidth?: React.CSSProperties["width"]
|
|
41
|
+
mobileWidth?: React.CSSProperties["width"]
|
|
39
42
|
collapsedRail?: React.ReactNode
|
|
40
43
|
railItems?: AppSidebarNavItem[]
|
|
41
44
|
footerAccount?: AppSidebarFooterAccount
|
|
@@ -63,6 +66,23 @@ export type AppSidebarProps = React.ComponentProps<"aside"> & {
|
|
|
63
66
|
}
|
|
64
67
|
|
|
65
68
|
const DEFAULT_APP_SIDEBAR_BREAKPOINT = 1024
|
|
69
|
+
const DEFAULT_SIDEBAR_WIDTH = "18rem"
|
|
70
|
+
const DEFAULT_COLLAPSED_SIDEBAR_WIDTH = "4.75rem"
|
|
71
|
+
const DEFAULT_MOBILE_SIDEBAR_WIDTH = "min(88vw, 22rem)"
|
|
72
|
+
|
|
73
|
+
function getSidebarInteractiveClassName({
|
|
74
|
+
active,
|
|
75
|
+
disabled,
|
|
76
|
+
}: {
|
|
77
|
+
active?: boolean
|
|
78
|
+
disabled?: boolean
|
|
79
|
+
}) {
|
|
80
|
+
return cn(
|
|
81
|
+
"border-[color:transparent] text-foreground/80 hover:border-[color:var(--aui-divider)] hover:bg-[color:color-mix(in_oklch,var(--card),var(--primary)_4%)] hover:text-foreground focus-visible:border-[color:var(--aui-control-border-strong,var(--border))] focus-visible:bg-[color:color-mix(in_oklch,var(--card),var(--primary)_6%)] focus-visible:text-foreground focus-visible:shadow-[0_0_0_3px_color-mix(in_oklch,var(--primary),transparent_86%)]",
|
|
82
|
+
active && "border-[color:color-mix(in_oklch,var(--primary),transparent_76%)] bg-[color:color-mix(in_oklch,var(--primary),transparent_91%)] text-foreground shadow-[inset_0_1px_0_rgba(255,255,255,0.08)]",
|
|
83
|
+
disabled && "hover:border-transparent hover:bg-transparent hover:text-foreground/80"
|
|
84
|
+
)
|
|
85
|
+
}
|
|
66
86
|
|
|
67
87
|
function hasVisibleSidebarChildren(item: AppSidebarNavItem) {
|
|
68
88
|
return item.items?.some((child) => !child.hidden) ?? false
|
|
@@ -101,6 +121,7 @@ function SidebarLeafItem({
|
|
|
101
121
|
"data-depth": String(depth),
|
|
102
122
|
className: cn(
|
|
103
123
|
"flex min-h-9 items-center gap-2 rounded-lg border border-transparent px-2.5 text-sm font-medium outline-none transition-[background-color,border-color,color,box-shadow] data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50",
|
|
124
|
+
getSidebarInteractiveClassName({ active: item.active, disabled: item.disabled }),
|
|
104
125
|
collapsed && "justify-center px-2"
|
|
105
126
|
),
|
|
106
127
|
}
|
|
@@ -257,6 +278,7 @@ function SidebarTree({
|
|
|
257
278
|
data-slot="app-sidebar-group-trigger"
|
|
258
279
|
className={cn(
|
|
259
280
|
"flex min-h-9 list-none items-center gap-2 rounded-lg border border-transparent text-sm font-medium outline-none transition-[background-color,border-color,color,box-shadow]",
|
|
281
|
+
getSidebarInteractiveClassName({ active }),
|
|
260
282
|
collapsed ? "justify-center px-2" : "px-2.5"
|
|
261
283
|
)}
|
|
262
284
|
>
|
|
@@ -312,6 +334,7 @@ function SidebarActionButton({
|
|
|
312
334
|
data-disabled={item.disabled || undefined}
|
|
313
335
|
className={cn(
|
|
314
336
|
"flex min-h-9 items-center gap-2 rounded-lg border border-transparent px-2.5 text-sm font-medium outline-none transition-[background-color,border-color,color,box-shadow] data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50",
|
|
337
|
+
getSidebarInteractiveClassName({ active: item.active, disabled: item.disabled }),
|
|
315
338
|
collapsed && "justify-center px-2"
|
|
316
339
|
)}
|
|
317
340
|
disabled={item.disabled}
|
|
@@ -350,6 +373,7 @@ function SidebarFooterAccount({
|
|
|
350
373
|
data-slot="app-sidebar-account"
|
|
351
374
|
className={cn(
|
|
352
375
|
"flex w-full items-center gap-3 rounded-[min(var(--radius-xl),16px)] border border-transparent text-left transition-[background-color,border-color,color,box-shadow]",
|
|
376
|
+
getSidebarInteractiveClassName({}),
|
|
353
377
|
collapsed ? "justify-center px-2 py-2.5" : "px-3 py-2.5"
|
|
354
378
|
)}
|
|
355
379
|
onClick={() => {
|
|
@@ -397,10 +421,13 @@ function SidebarFooterAccount({
|
|
|
397
421
|
|
|
398
422
|
function SidebarSurface({
|
|
399
423
|
className,
|
|
424
|
+
style,
|
|
400
425
|
header,
|
|
401
426
|
footer,
|
|
402
427
|
items = [],
|
|
403
428
|
collapsed = false,
|
|
429
|
+
width = DEFAULT_SIDEBAR_WIDTH,
|
|
430
|
+
collapsedWidth = DEFAULT_COLLAPSED_SIDEBAR_WIDTH,
|
|
404
431
|
collapsedRail,
|
|
405
432
|
railItems = [],
|
|
406
433
|
footerAccount,
|
|
@@ -438,6 +465,11 @@ function SidebarSurface({
|
|
|
438
465
|
data-collapsed={collapsed || undefined}
|
|
439
466
|
data-mobile={mobile || undefined}
|
|
440
467
|
className={cn("flex h-full min-h-0 flex-col overflow-hidden", className)}
|
|
468
|
+
style={{
|
|
469
|
+
width: collapsed ? collapsedWidth : width,
|
|
470
|
+
minWidth: collapsed ? collapsedWidth : width,
|
|
471
|
+
...style,
|
|
472
|
+
}}
|
|
441
473
|
{...props}
|
|
442
474
|
>
|
|
443
475
|
{(header || showMobileHeader) && (
|
|
@@ -565,6 +597,9 @@ function AppSidebar({
|
|
|
565
597
|
footer,
|
|
566
598
|
items = [],
|
|
567
599
|
collapsed = false,
|
|
600
|
+
width = DEFAULT_SIDEBAR_WIDTH,
|
|
601
|
+
collapsedWidth = DEFAULT_COLLAPSED_SIDEBAR_WIDTH,
|
|
602
|
+
mobileWidth = DEFAULT_MOBILE_SIDEBAR_WIDTH,
|
|
568
603
|
collapsedRail,
|
|
569
604
|
railItems = [],
|
|
570
605
|
footerAccount,
|
|
@@ -634,6 +669,8 @@ function AppSidebar({
|
|
|
634
669
|
footer,
|
|
635
670
|
items,
|
|
636
671
|
collapsed,
|
|
672
|
+
width,
|
|
673
|
+
collapsedWidth,
|
|
637
674
|
collapsedRail,
|
|
638
675
|
railItems,
|
|
639
676
|
footerAccount,
|
|
@@ -703,11 +740,15 @@ function AppSidebar({
|
|
|
703
740
|
aria-modal="true"
|
|
704
741
|
aria-label={typeof mobileTitle === "string" ? mobileTitle : "Navigation"}
|
|
705
742
|
className={cn(
|
|
706
|
-
"fixed inset-y-0 left-0 z-50
|
|
743
|
+
"fixed inset-y-0 left-0 z-50 max-w-[22rem] border-r border-[color:var(--aui-divider)] bg-[color:var(--aui-page-bg)] shadow-2xl transition-transform duration-200 ease-out",
|
|
707
744
|
mobileOpen ? "translate-x-0" : "-translate-x-full",
|
|
708
745
|
mobilePanelClassName,
|
|
709
746
|
className
|
|
710
747
|
)}
|
|
748
|
+
style={{
|
|
749
|
+
width: mobileWidth,
|
|
750
|
+
minWidth: mobileWidth,
|
|
751
|
+
}}
|
|
711
752
|
/>
|
|
712
753
|
</div>
|
|
713
754
|
</>
|
|
@@ -18,6 +18,7 @@ export type BreadcrumbsProps = React.ComponentProps<"nav"> & {
|
|
|
18
18
|
maxItems?: number
|
|
19
19
|
collapseLabel?: React.ReactNode
|
|
20
20
|
separator?: React.ReactNode
|
|
21
|
+
wrap?: boolean
|
|
21
22
|
renderLink?: (props: React.ComponentProps<"a"> & { item: BreadcrumbItem; [key: `data-${string}`]: string | boolean | undefined }) => React.ReactNode
|
|
22
23
|
}
|
|
23
24
|
|
|
@@ -44,6 +45,7 @@ function Breadcrumbs({
|
|
|
44
45
|
maxItems,
|
|
45
46
|
collapseLabel = "…",
|
|
46
47
|
separator = <ChevronRightIcon className="size-3.5" />,
|
|
48
|
+
wrap = false,
|
|
47
49
|
renderLink,
|
|
48
50
|
...props
|
|
49
51
|
}: BreadcrumbsProps) {
|
|
@@ -54,11 +56,15 @@ function Breadcrumbs({
|
|
|
54
56
|
|
|
55
57
|
return (
|
|
56
58
|
<nav
|
|
57
|
-
data-slot="breadcrumbs"
|
|
58
|
-
aria-label="Breadcrumb"
|
|
59
|
-
className={cn(
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
data-slot="breadcrumbs"
|
|
60
|
+
aria-label="Breadcrumb"
|
|
61
|
+
className={cn(
|
|
62
|
+
"flex min-w-0 items-center gap-1 overflow-x-auto text-sm text-muted-foreground",
|
|
63
|
+
wrap ? "flex-wrap" : "whitespace-nowrap",
|
|
64
|
+
className
|
|
65
|
+
)}
|
|
66
|
+
{...props}
|
|
67
|
+
>
|
|
62
68
|
{resolvedItems.map((item, index) => {
|
|
63
69
|
const isCollapsed = item.key === "__collapsed__"
|
|
64
70
|
const isLast = index === resolvedItems.length - 1
|
|
@@ -76,7 +82,7 @@ function Breadcrumbs({
|
|
|
76
82
|
item,
|
|
77
83
|
href: item.href,
|
|
78
84
|
"data-slot": "breadcrumbs-link",
|
|
79
|
-
className: "truncate transition-colors hover:text-foreground",
|
|
85
|
+
className: "truncate rounded-[var(--radius-sm)] px-1 py-0.5 transition-colors hover:bg-accent/55 hover:text-foreground",
|
|
80
86
|
onClick: () => item.onSelect?.(),
|
|
81
87
|
children: (
|
|
82
88
|
<span className="inline-flex min-w-0 items-center gap-1.5">
|
|
@@ -88,7 +94,7 @@ function Breadcrumbs({
|
|
|
88
94
|
<a
|
|
89
95
|
href={item.href}
|
|
90
96
|
data-slot="breadcrumbs-link"
|
|
91
|
-
className="truncate transition-colors hover:text-foreground"
|
|
97
|
+
className="truncate rounded-[var(--radius-sm)] px-1 py-0.5 transition-colors hover:bg-accent/55 hover:text-foreground"
|
|
92
98
|
onClick={() => item.onSelect?.()}
|
|
93
99
|
>
|
|
94
100
|
<span className="inline-flex min-w-0 items-center gap-1.5">
|
|
@@ -101,7 +107,10 @@ function Breadcrumbs({
|
|
|
101
107
|
<span
|
|
102
108
|
data-slot="breadcrumbs-current"
|
|
103
109
|
aria-current={isCurrent ? (item.currentLabel ?? "page") : undefined}
|
|
104
|
-
className={cn(
|
|
110
|
+
className={cn(
|
|
111
|
+
"inline-flex min-w-0 items-center gap-1.5 truncate rounded-[var(--radius-sm)] px-1 py-0.5",
|
|
112
|
+
isCurrent && "bg-accent/45 font-medium text-foreground"
|
|
113
|
+
)}
|
|
105
114
|
>
|
|
106
115
|
{item.icon ? <span className="shrink-0">{item.icon}</span> : null}
|
|
107
116
|
<span className="truncate">{item.label}</span>
|
|
@@ -17,16 +17,23 @@ export type StatCardTrend = {
|
|
|
17
17
|
label?: React.ReactNode
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
export type StatCardProps = React.ComponentProps<typeof Card> & {
|
|
20
|
+
export type StatCardProps = React.ComponentProps<typeof Card> & {
|
|
21
21
|
title?: React.ReactNode
|
|
22
22
|
value?: React.ReactNode
|
|
23
|
-
description?: React.ReactNode
|
|
24
|
-
icon?: React.ReactNode
|
|
25
|
-
action?: React.ReactNode
|
|
26
|
-
trend?: StatCardTrend
|
|
27
|
-
footer?: React.ReactNode
|
|
28
|
-
helperText?: React.ReactNode
|
|
29
|
-
|
|
23
|
+
description?: React.ReactNode
|
|
24
|
+
icon?: React.ReactNode
|
|
25
|
+
action?: React.ReactNode
|
|
26
|
+
trend?: StatCardTrend
|
|
27
|
+
footer?: React.ReactNode
|
|
28
|
+
helperText?: React.ReactNode
|
|
29
|
+
comparisonItems?: Array<{
|
|
30
|
+
label: React.ReactNode
|
|
31
|
+
value: React.ReactNode
|
|
32
|
+
change?: React.ReactNode
|
|
33
|
+
trend?: StatCardTrend["tone"] | "neutral"
|
|
34
|
+
}>
|
|
35
|
+
comparisonColumns?: 2 | 3 | 4
|
|
36
|
+
loading?: boolean
|
|
30
37
|
valuePrefix?: React.ReactNode
|
|
31
38
|
valueSuffix?: React.ReactNode
|
|
32
39
|
contentClassName?: string
|
|
@@ -59,11 +66,13 @@ function StatCard({
|
|
|
59
66
|
value,
|
|
60
67
|
description,
|
|
61
68
|
icon,
|
|
62
|
-
action,
|
|
63
|
-
trend,
|
|
64
|
-
footer,
|
|
65
|
-
helperText,
|
|
66
|
-
|
|
69
|
+
action,
|
|
70
|
+
trend,
|
|
71
|
+
footer,
|
|
72
|
+
helperText,
|
|
73
|
+
comparisonItems,
|
|
74
|
+
comparisonColumns = 2,
|
|
75
|
+
loading = false,
|
|
67
76
|
valuePrefix,
|
|
68
77
|
valueSuffix,
|
|
69
78
|
contentClassName,
|
|
@@ -99,22 +108,53 @@ function StatCard({
|
|
|
99
108
|
</div>
|
|
100
109
|
</CardHeader>
|
|
101
110
|
|
|
102
|
-
{(description || trend || helperText || footer) && (
|
|
103
|
-
<CardContent className={cn("space-y-2", contentClassName)}>
|
|
104
|
-
{(description || trend) && (
|
|
105
|
-
<div className="flex flex-wrap items-center gap-2 text-sm">
|
|
111
|
+
{(description || trend || helperText || footer || comparisonItems?.length) && (
|
|
112
|
+
<CardContent className={cn("space-y-2", contentClassName)}>
|
|
113
|
+
{(description || trend) && (
|
|
114
|
+
<div className="flex flex-wrap items-center gap-2 text-sm">
|
|
106
115
|
{trend && (
|
|
107
116
|
<Badge variant="ghost" tone={trend.tone === "muted" || trend.tone === "default" ? "neutral" : trend.tone} size="sm" className={cn("font-medium", trendClassName[trend.tone ?? "default"])}>
|
|
108
117
|
{trend.value}
|
|
109
118
|
</Badge>
|
|
110
119
|
)}
|
|
111
120
|
{trend?.label ? <span className="text-muted-foreground">{trend.label}</span> : null}
|
|
112
|
-
{description && <span className="text-muted-foreground">{description}</span>}
|
|
113
|
-
</div>
|
|
114
|
-
)}
|
|
115
|
-
{
|
|
116
|
-
|
|
117
|
-
|
|
121
|
+
{description && <span className="text-muted-foreground">{description}</span>}
|
|
122
|
+
</div>
|
|
123
|
+
)}
|
|
124
|
+
{comparisonItems?.length ? (
|
|
125
|
+
<div
|
|
126
|
+
data-slot="stat-card-comparison"
|
|
127
|
+
className={cn(
|
|
128
|
+
"grid gap-3 pt-1",
|
|
129
|
+
comparisonColumns === 2 && "grid-cols-2",
|
|
130
|
+
comparisonColumns === 3 && "grid-cols-3",
|
|
131
|
+
comparisonColumns === 4 && "grid-cols-2 sm:grid-cols-4"
|
|
132
|
+
)}
|
|
133
|
+
>
|
|
134
|
+
{comparisonItems.map((item, index) => (
|
|
135
|
+
<div key={index} className="min-w-0 space-y-1">
|
|
136
|
+
<p className="truncate text-[11px] font-medium uppercase tracking-[0.16em] text-muted-foreground">
|
|
137
|
+
{item.label}
|
|
138
|
+
</p>
|
|
139
|
+
<div className="flex flex-wrap items-center gap-2">
|
|
140
|
+
<span className="text-base font-semibold text-foreground">{item.value}</span>
|
|
141
|
+
{item.change ? (
|
|
142
|
+
<Badge
|
|
143
|
+
variant="ghost"
|
|
144
|
+
tone={item.trend === "neutral" ? "neutral" : item.trend === "default" ? "neutral" : item.trend}
|
|
145
|
+
size="sm"
|
|
146
|
+
>
|
|
147
|
+
{item.change}
|
|
148
|
+
</Badge>
|
|
149
|
+
) : null}
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
))}
|
|
153
|
+
</div>
|
|
154
|
+
) : null}
|
|
155
|
+
{helperText ? <p className="text-xs leading-5 text-muted-foreground">{helperText}</p> : null}
|
|
156
|
+
{footer}
|
|
157
|
+
</CardContent>
|
|
118
158
|
)}
|
|
119
159
|
</>
|
|
120
160
|
)}
|
|
@@ -10,10 +10,11 @@ export type CalendarSchedulerEvent = {
|
|
|
10
10
|
tone?: "default" | "success" | "warning" | "danger"
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
export type CalendarSchedulerProps = React.ComponentProps<"div"> & {
|
|
14
|
-
events: CalendarSchedulerEvent[]
|
|
15
|
-
days?: string[]
|
|
16
|
-
|
|
13
|
+
export type CalendarSchedulerProps = React.ComponentProps<"div"> & {
|
|
14
|
+
events: CalendarSchedulerEvent[]
|
|
15
|
+
days?: string[]
|
|
16
|
+
empty?: React.ReactNode
|
|
17
|
+
}
|
|
17
18
|
|
|
18
19
|
const toneClassName = {
|
|
19
20
|
default: "border-border bg-muted",
|
|
@@ -22,24 +23,33 @@ const toneClassName = {
|
|
|
22
23
|
danger: "border-red-200 bg-red-50 text-red-700 dark:border-red-900 dark:bg-red-950 dark:text-red-300",
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
function CalendarScheduler({ events, days, className, ...props }: CalendarSchedulerProps) {
|
|
26
|
-
const visibleDays = days ?? Array.from(new Set(events.map((event) => event.date)))
|
|
27
|
-
|
|
28
|
-
return (
|
|
29
|
-
<div data-slot="calendar-scheduler" className={cn("grid gap-3", className)} {...props}>
|
|
30
|
-
{visibleDays.map((day) => (
|
|
31
|
-
<section key={day} className="rounded-xl border bg-card p-
|
|
32
|
-
<div className="mb-
|
|
33
|
-
|
|
34
|
-
{events.filter((event) => event.date === day).
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
26
|
+
function CalendarScheduler({ events, days, empty = "No events scheduled.", className, ...props }: CalendarSchedulerProps) {
|
|
27
|
+
const visibleDays = days ?? Array.from(new Set(events.map((event) => event.date)))
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<div data-slot="calendar-scheduler" className={cn("grid gap-3", className)} {...props}>
|
|
31
|
+
{visibleDays.map((day) => (
|
|
32
|
+
<section key={day} className="rounded-[var(--aui-card-radius,var(--radius-xl))] border border-[color:var(--aui-card-border,var(--border))] bg-card p-4 shadow-[var(--aui-card-shadow,var(--aui-control-shadow,none))]">
|
|
33
|
+
<div className="mb-3 flex items-center justify-between gap-3">
|
|
34
|
+
<div className="text-sm font-semibold text-foreground">{day}</div>
|
|
35
|
+
<div className="text-xs text-muted-foreground">{events.filter((event) => event.date === day).length} items</div>
|
|
36
|
+
</div>
|
|
37
|
+
<div className="grid gap-2">
|
|
38
|
+
{events.filter((event) => event.date === day).length === 0 ? (
|
|
39
|
+
<div className="rounded-[var(--radius-md)] border border-dashed border-[color:var(--aui-card-border,var(--border))] px-3 py-4 text-sm text-muted-foreground">
|
|
40
|
+
{empty}
|
|
41
|
+
</div>
|
|
42
|
+
) : (
|
|
43
|
+
events.filter((event) => event.date === day).map((event) => (
|
|
44
|
+
<div key={event.id} className={cn("rounded-[var(--radius-md)] border px-3 py-2.5 text-sm shadow-sm", toneClassName[event.tone ?? "default"])}>
|
|
45
|
+
<div className="font-medium">{event.title}</div>
|
|
46
|
+
{event.time && <div className="mt-1 text-xs opacity-70">{event.time}</div>}
|
|
47
|
+
</div>
|
|
48
|
+
))
|
|
49
|
+
)}
|
|
50
|
+
</div>
|
|
51
|
+
</section>
|
|
52
|
+
))}
|
|
43
53
|
</div>
|
|
44
54
|
)
|
|
45
55
|
}
|