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
|
@@ -1,443 +0,0 @@
|
|
|
1
|
-
import * as React from "react"
|
|
2
|
-
import type { Control, FieldPath, FieldValues } from "react-hook-form"
|
|
3
|
-
|
|
4
|
-
import { Button } from "@/components/ui/button"
|
|
5
|
-
import { FormInput, type FormInputProps } from "@/components/form/form-input"
|
|
6
|
-
import { FormTextarea, type FormTextareaProps } from "@/components/form/form-textarea"
|
|
7
|
-
import { FormSelect, type FormSelectProps } from "@/components/form/form-select"
|
|
8
|
-
import { FormAsyncSelect, type FormAsyncSelectProps } from "@/components/form/form-async-select"
|
|
9
|
-
import { FormSwitch, type FormSwitchProps } from "@/components/form/form-switch"
|
|
10
|
-
import { FormNumberInput, type FormNumberInputProps } from "@/components/form/form-number-input"
|
|
11
|
-
import { FormPhoneInput, type FormPhoneInputProps } from "@/components/form/form-phone-input"
|
|
12
|
-
import { FormDateInput, type FormDateInputProps } from "@/components/form/form-date-input"
|
|
13
|
-
import {
|
|
14
|
-
FormDateRangeInput,
|
|
15
|
-
type FormDateRangeInputProps,
|
|
16
|
-
} from "@/components/form/form-date-range-input"
|
|
17
|
-
import { cn } from "@/lib/utils"
|
|
18
|
-
|
|
19
|
-
export type FormBuilderLayout = "grid" | "stack"
|
|
20
|
-
export type FormBuilderDensity = "compact" | "default" | "comfortable"
|
|
21
|
-
|
|
22
|
-
export type FormBuilderFieldRenderContext<TFieldValues extends FieldValues> = {
|
|
23
|
-
control: Control<TFieldValues>
|
|
24
|
-
disabled?: boolean
|
|
25
|
-
readOnly?: boolean
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
type BaseFormBuilderField = {
|
|
29
|
-
id: string
|
|
30
|
-
hidden?: boolean
|
|
31
|
-
className?: string
|
|
32
|
-
colSpan?: 1 | 2 | 3 | 4 | "full"
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export type FormBuilderCustomField<TFieldValues extends FieldValues> = BaseFormBuilderField & {
|
|
36
|
-
type: "custom"
|
|
37
|
-
render: (context: FormBuilderFieldRenderContext<TFieldValues>) => React.ReactNode
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export type FormBuilderInputField<
|
|
41
|
-
TFieldValues extends FieldValues,
|
|
42
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
43
|
-
> = BaseFormBuilderField & {
|
|
44
|
-
type: "input"
|
|
45
|
-
props: Omit<FormInputProps<TFieldValues, TName>, "control">
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export type FormBuilderTextareaField<
|
|
49
|
-
TFieldValues extends FieldValues,
|
|
50
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
51
|
-
> = BaseFormBuilderField & {
|
|
52
|
-
type: "textarea"
|
|
53
|
-
props: Omit<FormTextareaProps<TFieldValues, TName>, "control">
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export type FormBuilderSelectField<
|
|
57
|
-
TFieldValues extends FieldValues,
|
|
58
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
59
|
-
> = BaseFormBuilderField & {
|
|
60
|
-
type: "select"
|
|
61
|
-
props: Omit<FormSelectProps<TFieldValues, TName>, "control">
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export type FormBuilderAsyncSelectField<
|
|
65
|
-
TFieldValues extends FieldValues,
|
|
66
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
67
|
-
> = BaseFormBuilderField & {
|
|
68
|
-
type: "async-select"
|
|
69
|
-
props: Omit<FormAsyncSelectProps<TFieldValues, TName>, "control">
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export type FormBuilderSwitchField<
|
|
73
|
-
TFieldValues extends FieldValues,
|
|
74
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
75
|
-
> = BaseFormBuilderField & {
|
|
76
|
-
type: "switch"
|
|
77
|
-
props: Omit<FormSwitchProps<TFieldValues, TName>, "control">
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export type FormBuilderNumberField<
|
|
81
|
-
TFieldValues extends FieldValues,
|
|
82
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
83
|
-
> = BaseFormBuilderField & {
|
|
84
|
-
type: "number"
|
|
85
|
-
props: Omit<FormNumberInputProps<TFieldValues, TName>, "control">
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export type FormBuilderPhoneField<
|
|
89
|
-
TFieldValues extends FieldValues,
|
|
90
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
91
|
-
> = BaseFormBuilderField & {
|
|
92
|
-
type: "phone"
|
|
93
|
-
props: Omit<FormPhoneInputProps<TFieldValues, TName>, "control">
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export type FormBuilderDateField<
|
|
97
|
-
TFieldValues extends FieldValues,
|
|
98
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
99
|
-
> = BaseFormBuilderField & {
|
|
100
|
-
type: "date"
|
|
101
|
-
props: Omit<FormDateInputProps<TFieldValues, TName>, "control">
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export type FormBuilderDateRangeField<
|
|
105
|
-
TFieldValues extends FieldValues,
|
|
106
|
-
TFromName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
107
|
-
TToName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
108
|
-
> = BaseFormBuilderField & {
|
|
109
|
-
type: "date-range"
|
|
110
|
-
props: Omit<FormDateRangeInputProps<TFieldValues, TFromName, TToName>, "control">
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export type FormBuilderField<TFieldValues extends FieldValues> =
|
|
114
|
-
| FormBuilderCustomField<TFieldValues>
|
|
115
|
-
| FormBuilderInputField<TFieldValues>
|
|
116
|
-
| FormBuilderTextareaField<TFieldValues>
|
|
117
|
-
| FormBuilderSelectField<TFieldValues>
|
|
118
|
-
| FormBuilderAsyncSelectField<TFieldValues>
|
|
119
|
-
| FormBuilderSwitchField<TFieldValues>
|
|
120
|
-
| FormBuilderNumberField<TFieldValues>
|
|
121
|
-
| FormBuilderPhoneField<TFieldValues>
|
|
122
|
-
| FormBuilderDateField<TFieldValues>
|
|
123
|
-
| FormBuilderDateRangeField<TFieldValues>
|
|
124
|
-
|
|
125
|
-
export type FormBuilderSection<TFieldValues extends FieldValues> = {
|
|
126
|
-
id: string
|
|
127
|
-
title?: React.ReactNode
|
|
128
|
-
description?: React.ReactNode
|
|
129
|
-
actions?: React.ReactNode
|
|
130
|
-
hidden?: boolean
|
|
131
|
-
className?: string
|
|
132
|
-
fields: FormBuilderField<TFieldValues>[]
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
export type FormBuilderProps<TFieldValues extends FieldValues> = Omit<
|
|
136
|
-
React.ComponentProps<"form">,
|
|
137
|
-
"children"
|
|
138
|
-
> & {
|
|
139
|
-
control: Control<TFieldValues>
|
|
140
|
-
fields?: FormBuilderField<TFieldValues>[]
|
|
141
|
-
sections?: FormBuilderSection<TFieldValues>[]
|
|
142
|
-
layout?: FormBuilderLayout
|
|
143
|
-
density?: FormBuilderDensity
|
|
144
|
-
columns?: 1 | 2 | 3 | 4
|
|
145
|
-
disabled?: boolean
|
|
146
|
-
readOnly?: boolean
|
|
147
|
-
footer?: React.ReactNode
|
|
148
|
-
submitLabel?: React.ReactNode
|
|
149
|
-
resetLabel?: React.ReactNode
|
|
150
|
-
onResetClick?: () => void
|
|
151
|
-
isSubmitting?: boolean
|
|
152
|
-
sectionClassName?: string
|
|
153
|
-
fieldClassName?: string
|
|
154
|
-
footerClassName?: string
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const densityClassName: Record<FormBuilderDensity, string> = {
|
|
158
|
-
compact: "gap-3",
|
|
159
|
-
default: "gap-4",
|
|
160
|
-
comfortable: "gap-6",
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
const columnsClassName: Record<1 | 2 | 3 | 4, string> = {
|
|
164
|
-
1: "grid-cols-1",
|
|
165
|
-
2: "grid-cols-1 md:grid-cols-2",
|
|
166
|
-
3: "grid-cols-1 md:grid-cols-2 xl:grid-cols-3",
|
|
167
|
-
4: "grid-cols-1 md:grid-cols-2 xl:grid-cols-4",
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
const colSpanClassName: Record<NonNullable<BaseFormBuilderField["colSpan"]>, string> = {
|
|
171
|
-
1: "col-span-1",
|
|
172
|
-
2: "md:col-span-2",
|
|
173
|
-
3: "xl:col-span-3",
|
|
174
|
-
4: "xl:col-span-4",
|
|
175
|
-
full: "col-span-full",
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
type FieldPresetOptions<TProps> = BaseFormBuilderField & {
|
|
179
|
-
props: TProps
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
function splitFieldOptions<TProps>(options: FieldPresetOptions<TProps>) {
|
|
183
|
-
const { id, hidden, className, colSpan, props } = options
|
|
184
|
-
return { base: { id, hidden, className, colSpan }, props }
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
function inputField<
|
|
188
|
-
TFieldValues extends FieldValues,
|
|
189
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
190
|
-
>(options: FieldPresetOptions<FormBuilderInputField<TFieldValues, TName>["props"]>): FormBuilderInputField<TFieldValues, TName> {
|
|
191
|
-
const { base, props } = splitFieldOptions(options)
|
|
192
|
-
return { ...base, type: "input", props }
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
function textareaField<
|
|
196
|
-
TFieldValues extends FieldValues,
|
|
197
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
198
|
-
>(options: FieldPresetOptions<FormBuilderTextareaField<TFieldValues, TName>["props"]>): FormBuilderTextareaField<TFieldValues, TName> {
|
|
199
|
-
const { base, props } = splitFieldOptions(options)
|
|
200
|
-
return { ...base, type: "textarea", props }
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
function selectField<
|
|
204
|
-
TFieldValues extends FieldValues,
|
|
205
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
206
|
-
>(options: FieldPresetOptions<FormBuilderSelectField<TFieldValues, TName>["props"]>): FormBuilderSelectField<TFieldValues, TName> {
|
|
207
|
-
const { base, props } = splitFieldOptions(options)
|
|
208
|
-
return { ...base, type: "select", props }
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
function asyncSelectField<
|
|
212
|
-
TFieldValues extends FieldValues,
|
|
213
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
214
|
-
>(options: FieldPresetOptions<FormBuilderAsyncSelectField<TFieldValues, TName>["props"]>): FormBuilderAsyncSelectField<TFieldValues, TName> {
|
|
215
|
-
const { base, props } = splitFieldOptions(options)
|
|
216
|
-
return { ...base, type: "async-select", props }
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
function switchField<
|
|
220
|
-
TFieldValues extends FieldValues,
|
|
221
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
222
|
-
>(options: FieldPresetOptions<FormBuilderSwitchField<TFieldValues, TName>["props"]>): FormBuilderSwitchField<TFieldValues, TName> {
|
|
223
|
-
const { base, props } = splitFieldOptions(options)
|
|
224
|
-
return { ...base, type: "switch", props }
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
function numberField<
|
|
228
|
-
TFieldValues extends FieldValues,
|
|
229
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
230
|
-
>(options: FieldPresetOptions<FormBuilderNumberField<TFieldValues, TName>["props"]>): FormBuilderNumberField<TFieldValues, TName> {
|
|
231
|
-
const { base, props } = splitFieldOptions(options)
|
|
232
|
-
return { ...base, type: "number", props }
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
function phoneField<
|
|
236
|
-
TFieldValues extends FieldValues,
|
|
237
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
238
|
-
>(options: FieldPresetOptions<FormBuilderPhoneField<TFieldValues, TName>["props"]>): FormBuilderPhoneField<TFieldValues, TName> {
|
|
239
|
-
const { base, props } = splitFieldOptions(options)
|
|
240
|
-
return { ...base, type: "phone", props }
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
function dateField<
|
|
244
|
-
TFieldValues extends FieldValues,
|
|
245
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
246
|
-
>(options: FieldPresetOptions<FormBuilderDateField<TFieldValues, TName>["props"]>): FormBuilderDateField<TFieldValues, TName> {
|
|
247
|
-
const { base, props } = splitFieldOptions(options)
|
|
248
|
-
return { ...base, type: "date", props }
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
function dateRangeField<
|
|
252
|
-
TFieldValues extends FieldValues,
|
|
253
|
-
TFromName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
254
|
-
TToName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
255
|
-
>(options: FieldPresetOptions<FormBuilderDateRangeField<TFieldValues, TFromName, TToName>["props"]>): FormBuilderDateRangeField<TFieldValues, TFromName, TToName> {
|
|
256
|
-
const { base, props } = splitFieldOptions(options)
|
|
257
|
-
return { ...base, type: "date-range", props }
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
function customField<TFieldValues extends FieldValues>(
|
|
261
|
-
options: BaseFormBuilderField & Pick<FormBuilderCustomField<TFieldValues>, "render">
|
|
262
|
-
): FormBuilderCustomField<TFieldValues> {
|
|
263
|
-
const { id, hidden, className, colSpan, render } = options
|
|
264
|
-
return { id, hidden, className, colSpan, type: "custom", render }
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
function formSection<TFieldValues extends FieldValues>(
|
|
268
|
-
section: FormBuilderSection<TFieldValues>
|
|
269
|
-
): FormBuilderSection<TFieldValues> {
|
|
270
|
-
return section
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
function renderFormBuilderField<TFieldValues extends FieldValues>(
|
|
274
|
-
field: FormBuilderField<TFieldValues>,
|
|
275
|
-
context: FormBuilderFieldRenderContext<TFieldValues>
|
|
276
|
-
) {
|
|
277
|
-
const FormInputComponent = FormInput as unknown as React.ComponentType<Record<string, unknown>>
|
|
278
|
-
const FormSelectComponent = FormSelect as unknown as React.ComponentType<Record<string, unknown>>
|
|
279
|
-
|
|
280
|
-
switch (field.type) {
|
|
281
|
-
case "custom":
|
|
282
|
-
return field.render(context)
|
|
283
|
-
case "input":
|
|
284
|
-
return React.createElement(FormInputComponent, {
|
|
285
|
-
control: context.control,
|
|
286
|
-
disabled: context.disabled,
|
|
287
|
-
readOnly: context.readOnly,
|
|
288
|
-
...(field.props as Omit<FormInputProps<TFieldValues, FieldPath<TFieldValues>>, "control">),
|
|
289
|
-
})
|
|
290
|
-
case "textarea":
|
|
291
|
-
return <FormTextarea control={context.control} disabled={context.disabled} readOnly={context.readOnly} {...field.props} />
|
|
292
|
-
case "select":
|
|
293
|
-
return React.createElement(FormSelectComponent, {
|
|
294
|
-
control: context.control,
|
|
295
|
-
disabled: context.disabled,
|
|
296
|
-
...(field.props as Omit<FormSelectProps<TFieldValues, FieldPath<TFieldValues>>, "control">),
|
|
297
|
-
})
|
|
298
|
-
case "async-select":
|
|
299
|
-
return <FormAsyncSelect control={context.control} disabled={context.disabled} {...field.props} />
|
|
300
|
-
case "switch":
|
|
301
|
-
return <FormSwitch control={context.control} disabled={context.disabled} {...field.props} />
|
|
302
|
-
case "number":
|
|
303
|
-
return <FormNumberInput control={context.control} disabled={context.disabled} readOnly={context.readOnly} {...field.props} />
|
|
304
|
-
case "phone":
|
|
305
|
-
return <FormPhoneInput control={context.control} disabled={context.disabled} readOnly={context.readOnly} {...field.props} />
|
|
306
|
-
case "date":
|
|
307
|
-
return <FormDateInput control={context.control} disabled={context.disabled} readOnly={context.readOnly} {...field.props} />
|
|
308
|
-
case "date-range":
|
|
309
|
-
return (
|
|
310
|
-
<FormDateRangeInput
|
|
311
|
-
control={context.control}
|
|
312
|
-
fromInputProps={{ disabled: context.disabled, readOnly: context.readOnly }}
|
|
313
|
-
toInputProps={{ disabled: context.disabled, readOnly: context.readOnly }}
|
|
314
|
-
{...field.props}
|
|
315
|
-
/>
|
|
316
|
-
)
|
|
317
|
-
default:
|
|
318
|
-
return null
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
function normalizeSections<TFieldValues extends FieldValues>({
|
|
323
|
-
fields,
|
|
324
|
-
sections,
|
|
325
|
-
}: Pick<FormBuilderProps<TFieldValues>, "fields" | "sections">): FormBuilderSection<TFieldValues>[] {
|
|
326
|
-
if (sections?.length) return sections
|
|
327
|
-
return [{ id: "default", fields: fields ?? [] }]
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
function FormBuilder<TFieldValues extends FieldValues>({
|
|
331
|
-
className,
|
|
332
|
-
control,
|
|
333
|
-
fields,
|
|
334
|
-
sections,
|
|
335
|
-
layout = "grid",
|
|
336
|
-
density = "default",
|
|
337
|
-
columns = 2,
|
|
338
|
-
disabled,
|
|
339
|
-
readOnly,
|
|
340
|
-
footer,
|
|
341
|
-
submitLabel,
|
|
342
|
-
resetLabel,
|
|
343
|
-
onResetClick,
|
|
344
|
-
isSubmitting,
|
|
345
|
-
sectionClassName,
|
|
346
|
-
fieldClassName,
|
|
347
|
-
footerClassName,
|
|
348
|
-
...props
|
|
349
|
-
}: FormBuilderProps<TFieldValues>) {
|
|
350
|
-
const normalizedSections = normalizeSections({ fields, sections })
|
|
351
|
-
const context = React.useMemo(
|
|
352
|
-
() => ({ control, disabled, readOnly }),
|
|
353
|
-
[control, disabled, readOnly]
|
|
354
|
-
)
|
|
355
|
-
|
|
356
|
-
return (
|
|
357
|
-
<form data-slot="form-builder" className={cn("grid", densityClassName[density], className)} {...props}>
|
|
358
|
-
{normalizedSections
|
|
359
|
-
.filter((section) => !section.hidden)
|
|
360
|
-
.map((section) => (
|
|
361
|
-
<section
|
|
362
|
-
key={section.id}
|
|
363
|
-
data-slot="form-builder-section"
|
|
364
|
-
className={cn("grid gap-4", section.className, sectionClassName)}
|
|
365
|
-
>
|
|
366
|
-
{(section.title || section.description || section.actions) && (
|
|
367
|
-
<div
|
|
368
|
-
data-slot="form-builder-section-header"
|
|
369
|
-
className="flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between"
|
|
370
|
-
>
|
|
371
|
-
<div className="min-w-0 space-y-1">
|
|
372
|
-
{section.title && <h2 className="text-base font-semibold leading-none tracking-tight">{section.title}</h2>}
|
|
373
|
-
{section.description && <p className="text-sm text-muted-foreground">{section.description}</p>}
|
|
374
|
-
</div>
|
|
375
|
-
{section.actions && <div className="flex shrink-0 flex-wrap items-center gap-2">{section.actions}</div>}
|
|
376
|
-
</div>
|
|
377
|
-
)}
|
|
378
|
-
|
|
379
|
-
<div
|
|
380
|
-
data-slot="form-builder-fields"
|
|
381
|
-
data-layout={layout}
|
|
382
|
-
className={cn(
|
|
383
|
-
"grid",
|
|
384
|
-
densityClassName[density],
|
|
385
|
-
layout === "grid" ? columnsClassName[columns] : "grid-cols-1"
|
|
386
|
-
)}
|
|
387
|
-
>
|
|
388
|
-
{section.fields
|
|
389
|
-
.filter((field) => !field.hidden)
|
|
390
|
-
.map((field) => (
|
|
391
|
-
<div
|
|
392
|
-
key={field.id}
|
|
393
|
-
data-slot="form-builder-field"
|
|
394
|
-
className={cn(
|
|
395
|
-
field.colSpan && colSpanClassName[field.colSpan],
|
|
396
|
-
field.className,
|
|
397
|
-
fieldClassName
|
|
398
|
-
)}
|
|
399
|
-
>
|
|
400
|
-
{renderFormBuilderField(field, context)}
|
|
401
|
-
</div>
|
|
402
|
-
))}
|
|
403
|
-
</div>
|
|
404
|
-
</section>
|
|
405
|
-
))}
|
|
406
|
-
|
|
407
|
-
{(footer || submitLabel || resetLabel) && (
|
|
408
|
-
<div data-slot="form-builder-footer" className={cn("flex flex-wrap items-center justify-end gap-2", footerClassName)}>
|
|
409
|
-
{footer ?? (
|
|
410
|
-
<>
|
|
411
|
-
{resetLabel && (
|
|
412
|
-
<Button type="button" variant="outline" disabled={disabled || isSubmitting} onClick={onResetClick}>
|
|
413
|
-
{resetLabel}
|
|
414
|
-
</Button>
|
|
415
|
-
)}
|
|
416
|
-
{submitLabel && (
|
|
417
|
-
<Button type="submit" disabled={disabled || isSubmitting}>
|
|
418
|
-
{submitLabel}
|
|
419
|
-
</Button>
|
|
420
|
-
)}
|
|
421
|
-
</>
|
|
422
|
-
)}
|
|
423
|
-
</div>
|
|
424
|
-
)}
|
|
425
|
-
</form>
|
|
426
|
-
)
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
export {
|
|
430
|
-
FormBuilder,
|
|
431
|
-
asyncSelectField,
|
|
432
|
-
customField,
|
|
433
|
-
dateField,
|
|
434
|
-
dateRangeField,
|
|
435
|
-
formSection,
|
|
436
|
-
inputField,
|
|
437
|
-
numberField,
|
|
438
|
-
phoneField,
|
|
439
|
-
renderFormBuilderField,
|
|
440
|
-
selectField,
|
|
441
|
-
switchField,
|
|
442
|
-
textareaField,
|
|
443
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { ComponentDemoMock } from "../types"
|
|
2
|
-
|
|
3
|
-
export const emptyStateMock: ComponentDemoMock = {
|
|
4
|
-
code: `import { EmptyState } from "tembro"
|
|
5
|
-
|
|
6
|
-
export function Example() {
|
|
7
|
-
return (
|
|
8
|
-
<EmptyState
|
|
9
|
-
title="No results yet"
|
|
10
|
-
description="Create your first item to unlock actions and charts."
|
|
11
|
-
actionLabel="Create item"
|
|
12
|
-
onAction={() => {
|
|
13
|
-
console.log("Create action triggered")
|
|
14
|
-
}}
|
|
15
|
-
/>
|
|
16
|
-
)
|
|
17
|
-
}`,
|
|
18
|
-
highlights: ["No-content user messaging", "Built-in action callback", "Lightweight onboarding placeholder", "Reusable for any resource list"],
|
|
19
|
-
scenarios: [
|
|
20
|
-
{ title: "First launch", description: "Guide users to create first entity in a clean state." },
|
|
21
|
-
{ title: "Filtered empty", description: "Tell users what changed filters removed all items." },
|
|
22
|
-
{ title: "Error fallback", description: "Use with loading and retry controls when data fetch fails." },
|
|
23
|
-
],
|
|
24
|
-
capabilityNotes: [
|
|
25
|
-
"Always provide a clear next action to recover from empty state.",
|
|
26
|
-
"Keep titles short and outcome oriented.",
|
|
27
|
-
"Prefer one primary action + short explanation for fastest user decision.",
|
|
28
|
-
],
|
|
29
|
-
}
|
|
30
|
-
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import * as React from "react"
|
|
2
|
-
|
|
3
|
-
import { Badge, Button, EmptyState } from "@/index"
|
|
4
|
-
|
|
5
|
-
import type { ComponentDemoProps } from "../types"
|
|
6
|
-
|
|
7
|
-
const panelClass =
|
|
8
|
-
"rounded-[22px] border border-[color:var(--aui-divider)] bg-[color:var(--aui-page-bg)] p-5"
|
|
9
|
-
|
|
10
|
-
export function EmptyStateShowcase({ mode }: ComponentDemoProps) {
|
|
11
|
-
const [actionCount, setActionCount] = React.useState(0)
|
|
12
|
-
const [showEmptyFeedback, setShowEmptyFeedback] = React.useState(true)
|
|
13
|
-
|
|
14
|
-
return (
|
|
15
|
-
<div className="space-y-5">
|
|
16
|
-
<section className="rounded-[24px] border border-[color:var(--aui-divider)] bg-[color:var(--aui-page-bg)] p-5 sm:p-6">
|
|
17
|
-
<div className="flex flex-col gap-6 xl:flex-row xl:items-start xl:justify-between">
|
|
18
|
-
<div className="max-w-xl">
|
|
19
|
-
<p className="text-xs font-semibold uppercase tracking-[0.26em] aui-text-muted">No-content state</p>
|
|
20
|
-
<h3 className="mt-3 text-2xl font-semibold tracking-tight aui-text-strong">Empty state should unblock the next step</h3>
|
|
21
|
-
<p className="mt-3 max-w-lg text-sm leading-6 aui-text-muted">
|
|
22
|
-
The preview should show a clear title, short explanation, and one meaningful next action. Empty state is not decorative whitespace.
|
|
23
|
-
</p>
|
|
24
|
-
</div>
|
|
25
|
-
<div className="flex flex-wrap gap-2">
|
|
26
|
-
<Badge variant="outline" className="rounded-full">No data</Badge>
|
|
27
|
-
<Badge variant="outline" className="rounded-full">One next action</Badge>
|
|
28
|
-
</div>
|
|
29
|
-
</div>
|
|
30
|
-
</section>
|
|
31
|
-
|
|
32
|
-
{showEmptyFeedback ? (
|
|
33
|
-
<EmptyState
|
|
34
|
-
title="No results found"
|
|
35
|
-
description="There is nothing to show yet. Create one item to continue."
|
|
36
|
-
actionLabel="Create first item"
|
|
37
|
-
onAction={() => setActionCount((value) => value + 1)}
|
|
38
|
-
/>
|
|
39
|
-
) : (
|
|
40
|
-
<EmptyState title="Empty state intentionally hidden" description="Use a custom fallback only when needed." />
|
|
41
|
-
)}
|
|
42
|
-
|
|
43
|
-
<div className="grid gap-4 xl:grid-cols-[0.9fr_1.1fr]">
|
|
44
|
-
<section className={panelClass}>
|
|
45
|
-
<p className="text-sm font-medium aui-text-muted">Interaction count</p>
|
|
46
|
-
<p className="mt-3 text-2xl font-semibold tracking-tight aui-text-strong">{actionCount}</p>
|
|
47
|
-
<p className="mt-2 text-sm leading-6 aui-text-muted">Use the primary CTA only for the most direct recovery path.</p>
|
|
48
|
-
</section>
|
|
49
|
-
{mode === "playground" ? (
|
|
50
|
-
<section className={panelClass}>
|
|
51
|
-
<p className="text-sm font-medium aui-text-muted">Preview controls</p>
|
|
52
|
-
<div className="mt-4 flex flex-wrap gap-2">
|
|
53
|
-
<Button size="sm" variant={showEmptyFeedback ? "default" : "outline"} onClick={() => setShowEmptyFeedback((value) => !value)}>
|
|
54
|
-
Toggle feedback
|
|
55
|
-
</Button>
|
|
56
|
-
<Button size="sm" variant="outline" onClick={() => setActionCount(0)}>
|
|
57
|
-
Reset actions
|
|
58
|
-
</Button>
|
|
59
|
-
</div>
|
|
60
|
-
</section>
|
|
61
|
-
) : null}
|
|
62
|
-
</div>
|
|
63
|
-
</div>
|
|
64
|
-
)
|
|
65
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import type { ComponentDemoMock } from "../types"
|
|
2
|
-
|
|
3
|
-
export const formBuilderMock: ComponentDemoMock = {
|
|
4
|
-
code: `import { useForm } from "react-hook-form"
|
|
5
|
-
import {
|
|
6
|
-
FormBuilder,
|
|
7
|
-
formSection,
|
|
8
|
-
inputField,
|
|
9
|
-
phoneField,
|
|
10
|
-
switchField,
|
|
11
|
-
textareaField,
|
|
12
|
-
} from "tembro"
|
|
13
|
-
|
|
14
|
-
type DemoValues = {
|
|
15
|
-
workspace: string
|
|
16
|
-
ownerPhone: string
|
|
17
|
-
notes: string
|
|
18
|
-
isLive: boolean
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const sections = [
|
|
22
|
-
formSection<DemoValues>({
|
|
23
|
-
id: "main",
|
|
24
|
-
title: "Workspace settings",
|
|
25
|
-
description: "Field schema, sections and disabled/readOnly behavior all live in FormBuilder config.",
|
|
26
|
-
fields: [
|
|
27
|
-
inputField<DemoValues>({ id: "workspace", props: { name: "workspace", label: "Workspace name", required: true } }),
|
|
28
|
-
phoneField<DemoValues>({ id: "ownerPhone", props: { name: "ownerPhone", label: "Owner phone" } }),
|
|
29
|
-
textareaField<DemoValues>({ id: "notes", colSpan: "full", props: { name: "notes", label: "Notes", rows: 3 } }),
|
|
30
|
-
switchField<DemoValues>({
|
|
31
|
-
id: "isLive",
|
|
32
|
-
colSpan: "full",
|
|
33
|
-
props: { name: "isLive", label: "Publish workspace", description: "Toggle public availability" },
|
|
34
|
-
}),
|
|
35
|
-
],
|
|
36
|
-
}),
|
|
37
|
-
]
|
|
38
|
-
|
|
39
|
-
export function Example() {
|
|
40
|
-
const form = useForm<DemoValues>({
|
|
41
|
-
defaultValues: {
|
|
42
|
-
workspace: "Azamat UI",
|
|
43
|
-
ownerPhone: "+998 90 123 45 67",
|
|
44
|
-
notes: "Connected form sections with submit and reset lifecycle.",
|
|
45
|
-
isLive: true,
|
|
46
|
-
},
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
return (
|
|
50
|
-
<FormBuilder
|
|
51
|
-
control={form.control}
|
|
52
|
-
sections={sections}
|
|
53
|
-
columns={1}
|
|
54
|
-
submitLabel="Save"
|
|
55
|
-
resetLabel="Reset"
|
|
56
|
-
disabled={false}
|
|
57
|
-
readOnly={false}
|
|
58
|
-
/>
|
|
59
|
-
)
|
|
60
|
-
}`
|
|
61
|
-
,
|
|
62
|
-
htmlCode: `<form><label for="workspace">Workspace</label><input id="workspace" value="Azamat UI" /></form>`,
|
|
63
|
-
cliCommand: "npx tembro add form-builder",
|
|
64
|
-
highlights: ["Field schema", "Sections and presets", "submitLabel / resetLabel wiring", "Disabled/readOnly passthrough", "Reusable field helpers"],
|
|
65
|
-
relatedBlockSlugs: ["settings-form", "crm-dashboard"],
|
|
66
|
-
scenarios: [
|
|
67
|
-
{ title: "Field schema validation", description: "Use typed `formSection` and helper fields for deterministic layout." },
|
|
68
|
-
{ title: "Submit + reset", description: "Pass submitLabel/resetLabel and rely on RHF formState for disabled transitions." },
|
|
69
|
-
{ title: "Custom render", description: "Inject custom field-level props through helper factories." },
|
|
70
|
-
{ title: "Read-only mode", description: "Toggle readOnly for inspect-only workflows without changing schema." },
|
|
71
|
-
],
|
|
72
|
-
capabilityNotes: [
|
|
73
|
-
"`sections` gives a single source of truth for layout and required validations.",
|
|
74
|
-
"Use `fields` for precise schema-driven field composition.",
|
|
75
|
-
"Expose submit and reset labels directly from component props so UX can match product language.",
|
|
76
|
-
"Combine `disabled` + `readOnly` for different page states like locked records and review modes.",
|
|
77
|
-
],
|
|
78
|
-
}
|
|
79
|
-
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import * as React from "react"
|
|
2
|
-
import { useForm } from "react-hook-form"
|
|
3
|
-
|
|
4
|
-
import { Button } from "@/index"
|
|
5
|
-
import { FormBuilder, formSection, inputField, phoneField, switchField, textareaField } from "@/components/patterns/form-builder"
|
|
6
|
-
|
|
7
|
-
import type { ComponentDemoProps } from "../types"
|
|
8
|
-
|
|
9
|
-
type DemoValues = {
|
|
10
|
-
workspace: string
|
|
11
|
-
ownerPhone: string
|
|
12
|
-
notes: string
|
|
13
|
-
isLive: boolean
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function FormBuilderShowcase({ mode }: ComponentDemoProps) {
|
|
17
|
-
const form = useForm<DemoValues>({
|
|
18
|
-
defaultValues: {
|
|
19
|
-
workspace: "Azamat UI",
|
|
20
|
-
ownerPhone: "+998 90 123 45 67",
|
|
21
|
-
notes: "Connected sections and submit/reset wiring.",
|
|
22
|
-
isLive: true,
|
|
23
|
-
},
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
const sections = React.useMemo(
|
|
27
|
-
() => [
|
|
28
|
-
formSection<DemoValues>({
|
|
29
|
-
id: "main",
|
|
30
|
-
title: "Workspace settings",
|
|
31
|
-
description: "Schema-driven form builder with explicit submit and reset controls.",
|
|
32
|
-
fields: [
|
|
33
|
-
inputField<DemoValues>({ id: "workspace", props: { name: "workspace", label: "Workspace", required: true } }),
|
|
34
|
-
phoneField<DemoValues>({ id: "ownerPhone", props: { name: "ownerPhone", label: "Owner phone" } }),
|
|
35
|
-
textareaField<DemoValues>({ id: "notes", colSpan: "full", props: { name: "notes", label: "Notes", rows: 3 } }),
|
|
36
|
-
switchField<DemoValues>({
|
|
37
|
-
id: "isLive",
|
|
38
|
-
colSpan: "full",
|
|
39
|
-
props: { name: "isLive", label: "Publish workspace", description: "Visible only when record is active." },
|
|
40
|
-
}),
|
|
41
|
-
],
|
|
42
|
-
}),
|
|
43
|
-
],
|
|
44
|
-
[]
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
return (
|
|
48
|
-
<div className="space-y-4">
|
|
49
|
-
<FormBuilder control={form.control} sections={sections} columns={1} submitLabel={mode === "playground" ? "Save workspace" : undefined} />
|
|
50
|
-
<Button type="button" variant="outline" onClick={() => form.reset()}>
|
|
51
|
-
Reset form
|
|
52
|
-
</Button>
|
|
53
|
-
</div>
|
|
54
|
-
)
|
|
55
|
-
}
|