@object-ui/components 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +47 -0
- package/CHANGELOG.md +10 -0
- package/README.md +32 -1
- package/README_SHADCN_SYNC.md +281 -0
- package/TESTING.md +335 -0
- package/dist/index.css +1 -1
- package/dist/index.js +45067 -34357
- package/dist/index.umd.cjs +54 -42
- package/dist/src/SchemaRenderer.d.ts +3 -0
- package/dist/src/{ui → custom}/button-group.d.ts +1 -1
- package/dist/src/custom/combobox.d.ts +22 -0
- package/dist/src/custom/date-picker.d.ts +15 -0
- package/dist/src/custom/field.d.ts +19 -0
- package/dist/src/{ui → custom}/filter-builder.d.ts +7 -0
- package/dist/src/custom/index.d.ts +12 -0
- package/dist/src/custom/input-group.d.ts +14 -0
- package/dist/src/{ui → custom}/item.d.ts +8 -1
- package/dist/src/{ui → custom}/kbd.d.ts +7 -0
- package/dist/src/custom/native-select.d.ts +12 -0
- package/dist/src/custom/sort-builder.d.ts +22 -0
- package/dist/src/custom/spinner.d.ts +10 -0
- package/dist/src/hooks/use-mobile.d.ts +7 -0
- package/dist/src/index.d.ts +5 -1
- package/dist/src/renderers/basic/button-group.d.ts +8 -0
- package/dist/src/renderers/basic/div.d.ts +7 -0
- package/dist/src/renderers/basic/html.d.ts +7 -0
- package/dist/src/renderers/basic/icon.d.ts +7 -0
- package/dist/src/renderers/basic/image.d.ts +7 -0
- package/dist/src/renderers/basic/navigation-menu.d.ts +8 -0
- package/dist/src/renderers/basic/pagination.d.ts +8 -0
- package/dist/src/renderers/basic/separator.d.ts +7 -0
- package/dist/src/renderers/basic/span.d.ts +7 -0
- package/dist/src/renderers/basic/text.d.ts +7 -0
- package/dist/src/renderers/complex/carousel.d.ts +7 -0
- package/dist/src/renderers/complex/data-table.d.ts +7 -0
- package/dist/src/renderers/complex/filter-builder.d.ts +7 -0
- package/dist/src/renderers/complex/resizable.d.ts +7 -0
- package/dist/src/renderers/complex/scroll-area.d.ts +7 -0
- package/dist/src/renderers/complex/table.d.ts +7 -0
- package/dist/src/renderers/data-display/alert.d.ts +7 -0
- package/dist/src/renderers/data-display/avatar.d.ts +7 -0
- package/dist/src/renderers/data-display/badge.d.ts +7 -0
- package/dist/src/renderers/data-display/breadcrumb.d.ts +8 -0
- package/dist/src/renderers/data-display/kbd.d.ts +8 -0
- package/dist/src/renderers/data-display/list.d.ts +7 -0
- package/dist/src/renderers/data-display/statistic.d.ts +7 -0
- package/dist/src/renderers/data-display/table.d.ts +8 -0
- package/dist/src/renderers/data-display/tree-view.d.ts +7 -0
- package/dist/src/renderers/disclosure/accordion.d.ts +7 -0
- package/dist/src/renderers/disclosure/collapsible.d.ts +7 -0
- package/dist/src/renderers/disclosure/toggle-group.d.ts +8 -0
- package/dist/src/renderers/feedback/empty.d.ts +8 -0
- package/dist/src/renderers/feedback/loading.d.ts +7 -0
- package/dist/src/renderers/feedback/progress.d.ts +7 -0
- package/dist/src/renderers/feedback/skeleton.d.ts +7 -0
- package/dist/src/renderers/feedback/sonner.d.ts +8 -0
- package/dist/src/renderers/feedback/spinner.d.ts +8 -0
- package/dist/src/renderers/feedback/toast.d.ts +8 -0
- package/dist/src/renderers/feedback/toaster.d.ts +7 -0
- package/dist/src/renderers/form/button.d.ts +7 -0
- package/dist/src/renderers/form/calendar.d.ts +7 -0
- package/dist/src/renderers/form/checkbox.d.ts +7 -0
- package/dist/src/renderers/form/combobox.d.ts +8 -0
- package/dist/src/renderers/form/command.d.ts +8 -0
- package/dist/src/renderers/form/date-picker.d.ts +7 -0
- package/dist/src/renderers/form/file-upload.d.ts +7 -0
- package/dist/src/renderers/form/form.d.ts +7 -0
- package/dist/src/renderers/form/input-otp.d.ts +7 -0
- package/dist/src/renderers/form/input.d.ts +7 -0
- package/dist/src/renderers/form/label.d.ts +7 -0
- package/dist/src/renderers/form/radio-group.d.ts +7 -0
- package/dist/src/renderers/form/select.d.ts +7 -0
- package/dist/src/renderers/form/slider.d.ts +7 -0
- package/dist/src/renderers/form/switch.d.ts +7 -0
- package/dist/src/renderers/form/textarea.d.ts +7 -0
- package/dist/src/renderers/form/toggle.d.ts +7 -0
- package/dist/src/renderers/layout/aspect-ratio.d.ts +8 -0
- package/dist/src/renderers/layout/card.d.ts +7 -0
- package/dist/src/renderers/layout/container.d.ts +7 -0
- package/dist/src/renderers/layout/flex.d.ts +7 -0
- package/dist/src/renderers/layout/grid.d.ts +7 -0
- package/dist/src/renderers/layout/page.d.ts +1 -1
- package/dist/src/renderers/layout/semantic.d.ts +7 -0
- package/dist/src/renderers/layout/stack.d.ts +7 -0
- package/dist/src/renderers/layout/tabs.d.ts +7 -0
- package/dist/src/renderers/navigation/header-bar.d.ts +7 -0
- package/dist/src/renderers/navigation/sidebar.d.ts +7 -0
- package/dist/src/renderers/overlay/alert-dialog.d.ts +7 -0
- package/dist/src/renderers/overlay/context-menu.d.ts +7 -0
- package/dist/src/renderers/overlay/dialog.d.ts +7 -0
- package/dist/src/renderers/overlay/drawer.d.ts +7 -0
- package/dist/src/renderers/overlay/dropdown-menu.d.ts +7 -0
- package/dist/src/renderers/overlay/hover-card.d.ts +7 -0
- package/dist/src/renderers/overlay/menubar.d.ts +8 -0
- package/dist/src/renderers/overlay/popover.d.ts +7 -0
- package/dist/src/renderers/overlay/sheet.d.ts +7 -0
- package/dist/src/renderers/overlay/tooltip.d.ts +7 -0
- package/dist/src/renderers/placeholders.d.ts +9 -0
- package/dist/src/ui/accordion.d.ts +11 -4
- package/dist/src/ui/alert-dialog.d.ts +24 -11
- package/dist/src/ui/alert.d.ts +11 -5
- package/dist/src/ui/aspect-ratio.d.ts +8 -1
- package/dist/src/ui/avatar.d.ts +10 -3
- package/dist/src/ui/badge.d.ts +10 -3
- package/dist/src/ui/breadcrumb.d.ts +23 -8
- package/dist/src/ui/button.d.ts +10 -5
- package/dist/src/ui/calendar.d.ts +8 -1
- package/dist/src/ui/card.d.ts +14 -8
- package/dist/src/ui/carousel.d.ts +12 -6
- package/dist/src/ui/chart.d.ts +62 -0
- package/dist/src/ui/checkbox.d.ts +8 -1
- package/dist/src/ui/collapsible.d.ts +10 -3
- package/dist/src/ui/command.d.ts +85 -16
- package/dist/src/ui/context-menu.d.ts +21 -12
- package/dist/src/ui/dialog.d.ts +24 -13
- package/dist/src/ui/drawer.d.ts +26 -10
- package/dist/src/ui/dropdown-menu.d.ts +27 -18
- package/dist/src/ui/form.d.ts +13 -7
- package/dist/src/ui/hover-card.d.ts +10 -3
- package/dist/src/ui/index.d.ts +10 -11
- package/dist/src/ui/input-otp.d.ts +37 -7
- package/dist/src/ui/input.d.ts +7 -0
- package/dist/src/ui/label.d.ts +9 -1
- package/dist/src/ui/menubar.d.ts +26 -17
- package/dist/src/ui/navigation-menu.d.ts +16 -11
- package/dist/src/ui/pagination.d.ts +32 -10
- package/dist/src/ui/popover.d.ts +11 -5
- package/dist/src/ui/progress.d.ts +8 -1
- package/dist/src/ui/radio-group.d.ts +9 -2
- package/dist/src/ui/resizable.d.ts +12 -8
- package/dist/src/ui/scroll-area.d.ts +9 -2
- package/dist/src/ui/select.d.ts +18 -13
- package/dist/src/ui/separator.d.ts +7 -0
- package/dist/src/ui/sheet.d.ts +30 -11
- package/dist/src/ui/sidebar.d.ts +41 -38
- package/dist/src/ui/skeleton.d.ts +8 -1
- package/dist/src/ui/slider.d.ts +8 -1
- package/dist/src/ui/sonner.d.ts +2 -1
- package/dist/src/ui/switch.d.ts +9 -2
- package/dist/src/ui/table.d.ts +15 -8
- package/dist/src/ui/tabs.d.ts +8 -1
- package/dist/src/ui/textarea.d.ts +8 -1
- package/dist/src/ui/toast.d.ts +22 -0
- package/dist/src/ui/toggle-group.d.ts +15 -5
- package/dist/src/ui/toggle.d.ts +11 -1
- package/dist/src/ui/tooltip.d.ts +11 -4
- package/dist/src/ui/typography.d.ts +21 -0
- package/metadata/ObjectGrid.component.yml +72 -0
- package/package.json +35 -13
- package/postcss.config.js +9 -1
- package/shadcn-components.json +315 -0
- package/src/SchemaRenderer.tsx +28 -0
- package/src/__tests__/PageRendererRegions.test.tsx +59 -0
- package/src/__tests__/README.md +124 -0
- package/src/__tests__/Registry.test.ts +21 -0
- package/src/__tests__/basic-renderers.test.tsx +255 -0
- package/src/__tests__/complex-disclosure-renderers.test.tsx +302 -0
- package/src/__tests__/feedback-overlay-renderers.test.tsx +349 -0
- package/src/__tests__/form-renderers.test.tsx +364 -0
- package/src/__tests__/layout-data-renderers.test.tsx +340 -0
- package/src/__tests__/test-utils.tsx +190 -0
- package/src/{ui → custom}/button-group.tsx +9 -1
- package/src/custom/combobox.tsx +104 -0
- package/src/custom/date-picker.tsx +61 -0
- package/src/{ui → custom}/empty.tsx +8 -0
- package/src/custom/field.tsx +81 -0
- package/src/{ui → custom}/filter-builder.tsx +11 -3
- package/src/custom/index.ts +12 -0
- package/src/custom/input-group.tsx +53 -0
- package/src/{ui → custom}/item.tsx +9 -1
- package/src/{ui → custom}/kbd.tsx +8 -0
- package/src/custom/native-select.tsx +33 -0
- package/src/custom/sort-builder.tsx +129 -0
- package/src/custom/spinner.tsx +26 -0
- package/src/hooks/use-mobile.tsx +8 -0
- package/src/index.css +105 -54
- package/src/index.test.ts +8 -0
- package/src/index.ts +22 -1
- package/src/lib/utils.tsx +8 -0
- package/src/new-components.test.ts +8 -9
- package/src/renderers/basic/button-group.tsx +79 -0
- package/src/renderers/basic/div.tsx +21 -2
- package/src/renderers/basic/html.tsx +9 -0
- package/src/renderers/basic/icon.tsx +67 -3
- package/src/renderers/basic/image.tsx +13 -1
- package/src/renderers/basic/index.ts +11 -0
- package/src/renderers/basic/navigation-menu.tsx +81 -0
- package/src/renderers/basic/pagination.tsx +109 -0
- package/src/renderers/basic/separator.tsx +10 -1
- package/src/renderers/basic/span.tsx +21 -2
- package/src/renderers/basic/text.tsx +12 -2
- package/src/renderers/complex/__tests__/data-table.test.ts +8 -0
- package/src/renderers/complex/carousel.tsx +12 -3
- package/src/renderers/complex/data-table.tsx +150 -96
- package/src/renderers/complex/filter-builder.tsx +10 -1
- package/src/renderers/complex/index.ts +9 -3
- package/src/renderers/complex/resizable.tsx +10 -1
- package/src/renderers/complex/scroll-area.tsx +33 -7
- package/src/renderers/complex/table.tsx +11 -2
- package/src/renderers/data-display/alert.tsx +9 -0
- package/src/renderers/data-display/avatar.tsx +9 -0
- package/src/renderers/data-display/badge.tsx +9 -0
- package/src/renderers/data-display/breadcrumb.tsx +60 -0
- package/src/renderers/data-display/index.ts +12 -0
- package/src/renderers/data-display/kbd.tsx +50 -0
- package/src/renderers/data-display/list.tsx +29 -49
- package/src/renderers/data-display/statistic.tsx +45 -48
- package/src/renderers/data-display/table.tsx +78 -0
- package/src/renderers/data-display/tree-view.tsx +32 -37
- package/src/renderers/disclosure/accordion.tsx +9 -0
- package/src/renderers/disclosure/collapsible.tsx +9 -0
- package/src/renderers/disclosure/index.ts +9 -0
- package/src/renderers/disclosure/toggle-group.tsx +79 -0
- package/src/renderers/feedback/empty.tsx +49 -0
- package/src/renderers/feedback/index.ts +12 -0
- package/src/renderers/feedback/loading.tsx +10 -1
- package/src/renderers/feedback/progress.tsx +9 -0
- package/src/renderers/feedback/skeleton.tsx +9 -0
- package/src/renderers/feedback/sonner.tsx +56 -0
- package/src/renderers/feedback/spinner.tsx +55 -0
- package/src/renderers/feedback/toast.tsx +59 -0
- package/src/renderers/feedback/toaster.tsx +14 -17
- package/src/renderers/form/button.tsx +43 -1
- package/src/renderers/form/calendar.tsx +9 -0
- package/src/renderers/form/checkbox.tsx +46 -16
- package/src/renderers/form/combobox.tsx +48 -0
- package/src/renderers/form/command.tsx +58 -0
- package/src/renderers/form/date-picker.tsx +11 -2
- package/src/renderers/form/file-upload.tsx +11 -2
- package/src/renderers/form/form.tsx +104 -18
- package/src/renderers/form/index.ts +10 -0
- package/src/renderers/form/input-otp.tsx +35 -15
- package/src/renderers/form/input.tsx +92 -50
- package/src/renderers/form/label.tsx +9 -0
- package/src/renderers/form/radio-group.tsx +9 -0
- package/src/renderers/form/select.tsx +43 -15
- package/src/renderers/form/slider.tsx +17 -1
- package/src/renderers/form/switch.tsx +9 -0
- package/src/renderers/form/textarea.tsx +58 -27
- package/src/renderers/form/toggle.tsx +11 -45
- package/src/renderers/index.ts +8 -0
- package/src/renderers/layout/aspect-ratio.tsx +51 -0
- package/src/renderers/layout/card.tsx +18 -2
- package/src/renderers/layout/container.tsx +21 -12
- package/src/renderers/layout/flex.tsx +17 -8
- package/src/renderers/layout/grid.tsx +31 -8
- package/src/renderers/layout/index.ts +9 -0
- package/src/renderers/layout/page.tsx +44 -24
- package/src/renderers/layout/semantic.tsx +9 -0
- package/src/renderers/layout/stack.tsx +18 -9
- package/src/renderers/layout/tabs.tsx +51 -17
- package/src/renderers/navigation/header-bar.tsx +10 -1
- package/src/renderers/navigation/index.ts +8 -0
- package/src/renderers/navigation/sidebar.tsx +13 -0
- package/src/renderers/overlay/alert-dialog.tsx +9 -0
- package/src/renderers/overlay/context-menu.tsx +10 -1
- package/src/renderers/overlay/dialog.tsx +9 -0
- package/src/renderers/overlay/drawer.tsx +9 -0
- package/src/renderers/overlay/dropdown-menu.tsx +9 -0
- package/src/renderers/overlay/hover-card.tsx +9 -0
- package/src/renderers/overlay/index.ts +9 -0
- package/src/renderers/overlay/menubar.tsx +76 -0
- package/src/renderers/overlay/popover.tsx +9 -0
- package/src/renderers/overlay/sheet.tsx +9 -0
- package/src/renderers/overlay/tooltip.tsx +9 -0
- package/src/renderers/placeholders.tsx +107 -0
- package/src/stories/CRMApp.stories.tsx +706 -0
- package/src/stories/Guide.mdx +55 -0
- package/src/stories/Introduction.mdx +34 -0
- package/src/stories/MockedData.stories.tsx +71 -0
- package/src/stories/assets/accessibility.png +0 -0
- package/src/stories/assets/accessibility.svg +1 -0
- package/src/stories/assets/addon-library.png +0 -0
- package/src/stories/assets/assets.png +0 -0
- package/src/stories/assets/avif-test-image.avif +0 -0
- package/src/stories/assets/context.png +0 -0
- package/src/stories/assets/discord.svg +1 -0
- package/src/stories/assets/docs.png +0 -0
- package/src/stories/assets/figma-plugin.png +0 -0
- package/src/stories/assets/github.svg +1 -0
- package/src/stories/assets/share.png +0 -0
- package/src/stories/assets/styling.png +0 -0
- package/src/stories/assets/testing.png +0 -0
- package/src/stories/assets/theming.png +0 -0
- package/src/stories/assets/tutorials.svg +1 -0
- package/src/stories/assets/youtube.svg +1 -0
- package/src/stories/button.css +30 -0
- package/src/stories/header.css +32 -0
- package/src/stories/page.css +68 -0
- package/src/stories-json/accordion.stories.tsx +43 -0
- package/src/stories-json/aggrid.stories.tsx +103 -0
- package/src/stories-json/alert.stories.tsx +39 -0
- package/src/stories-json/aspect-ratio.stories.tsx +34 -0
- package/src/stories-json/avatar.stories.tsx +38 -0
- package/src/stories-json/badge.stories.tsx +53 -0
- package/src/stories-json/breadcrumb.stories.tsx +30 -0
- package/src/stories-json/button-group.stories.tsx +43 -0
- package/src/stories-json/button.stories.tsx +73 -0
- package/src/stories-json/calendar.stories.tsx +85 -0
- package/src/stories-json/card.stories.tsx +48 -0
- package/src/stories-json/carousel.stories.tsx +33 -0
- package/src/stories-json/charts.stories.tsx +195 -0
- package/src/stories-json/chatbot.stories.tsx +248 -0
- package/src/stories-json/code-editor.stories.tsx +92 -0
- package/src/stories-json/collapsible.stories.tsx +40 -0
- package/src/stories-json/controls.stories.tsx +36 -0
- package/src/stories-json/dashboard.stories.tsx +318 -0
- package/src/stories-json/data-table.stories.tsx +60 -0
- package/src/stories-json/data_display_extras.stories.tsx +102 -0
- package/src/stories-json/date-picker.stories.tsx +28 -0
- package/src/stories-json/detail-view.stories.tsx +258 -0
- package/src/stories-json/dialog.stories.tsx +43 -0
- package/src/stories-json/feedback_extras.stories.tsx +40 -0
- package/src/stories-json/feedback_others.stories.tsx +46 -0
- package/src/stories-json/form_advanced.stories.tsx +117 -0
- package/src/stories-json/form_extras.stories.tsx +123 -0
- package/src/stories-json/grid.stories.tsx +56 -0
- package/src/stories-json/icon.stories.tsx +36 -0
- package/src/stories-json/input.stories.tsx +52 -0
- package/src/stories-json/kanban.stories.tsx +295 -0
- package/src/stories-json/layout_extended.stories.tsx +76 -0
- package/src/stories-json/layout_flex.stories.tsx +107 -0
- package/src/stories-json/list-view.stories.tsx +97 -0
- package/src/stories-json/markdown.stories.tsx +129 -0
- package/src/stories-json/menus.stories.tsx +63 -0
- package/src/stories-json/metric-card.stories.tsx +143 -0
- package/src/stories-json/navigation-menu.stories.tsx +37 -0
- package/src/stories-json/object-aggrid.stories.tsx +252 -0
- package/src/stories-json/object-form.stories.tsx +130 -0
- package/src/stories-json/object-gantt.stories.tsx +114 -0
- package/src/stories-json/object-grid.stories.tsx +157 -0
- package/src/stories-json/object-map.stories.tsx +116 -0
- package/src/stories-json/object-view.stories.tsx +118 -0
- package/src/stories-json/overlay_extras.stories.tsx +113 -0
- package/src/stories-json/overlay_others.stories.tsx +76 -0
- package/src/stories-json/page.stories.tsx +55 -0
- package/src/stories-json/reports.stories.tsx +163 -0
- package/src/stories-json/resizable.stories.tsx +44 -0
- package/src/stories-json/select.stories.tsx +34 -0
- package/src/stories-json/separator.stories.tsx +41 -0
- package/src/stories-json/sidebar.stories.tsx +147 -0
- package/src/stories-json/statistic.stories.tsx +44 -0
- package/src/stories-json/tabs.stories.tsx +51 -0
- package/src/stories-json/timeline.stories.tsx +188 -0
- package/src/stories-json/typography.stories.tsx +45 -0
- package/src/ui/accordion.tsx +55 -53
- package/src/ui/alert-dialog.tsx +111 -117
- package/src/ui/alert.tsx +46 -57
- package/src/ui/aspect-ratio.tsx +9 -5
- package/src/ui/avatar.tsx +49 -42
- package/src/ui/badge.tsx +18 -20
- package/src/ui/breadcrumb.tsx +89 -75
- package/src/ui/button.tsx +38 -37
- package/src/ui/calendar.tsx +37 -53
- package/src/ui/card.tsx +59 -110
- package/src/ui/carousel.tsx +144 -113
- package/src/ui/chart.tsx +367 -0
- package/src/ui/checkbox.tsx +28 -22
- package/src/ui/collapsible.tsx +13 -25
- package/src/ui/command.tsx +114 -135
- package/src/ui/context-menu.tsx +77 -116
- package/src/ui/dialog.tsx +102 -113
- package/src/ui/drawer.tsx +90 -99
- package/src/ui/dropdown-menu.tsx +142 -188
- package/src/ui/form.tsx +59 -40
- package/src/ui/hover-card.tsx +26 -33
- package/src/ui/index.ts +11 -11
- package/src/ui/input-otp.tsx +53 -55
- package/src/ui/input.tsx +21 -15
- package/src/ui/label.tsx +25 -15
- package/src/ui/menubar.tsx +196 -206
- package/src/ui/navigation-menu.tsx +104 -136
- package/src/ui/pagination.tsx +94 -96
- package/src/ui/popover.tsx +29 -38
- package/src/ui/progress.tsx +29 -34
- package/src/ui/radio-group.tsx +27 -20
- package/src/ui/resizable.tsx +40 -42
- package/src/ui/scroll-area.tsx +46 -48
- package/src/ui/select.tsx +140 -160
- package/src/ui/separator.tsx +10 -2
- package/src/ui/sheet.tsx +118 -107
- package/src/ui/sidebar.tsx +471 -418
- package/src/ui/skeleton.tsx +14 -11
- package/src/ui/slider.tsx +27 -54
- package/src/ui/sonner.tsx +29 -19
- package/src/ui/switch.tsx +27 -21
- package/src/ui/table.tsx +102 -97
- package/src/ui/tabs.tsx +14 -37
- package/src/ui/textarea.tsx +16 -4
- package/src/ui/toast.tsx +137 -0
- package/src/ui/toggle-group.tsx +37 -55
- package/src/ui/toggle.tsx +30 -27
- package/src/ui/tooltip.tsx +29 -52
- package/src/ui/typography.tsx +85 -0
- package/tsconfig.json +2 -1
- package/vite.config.ts +20 -2
- package/vitest.config.ts +5 -0
- package/dist/src/index.test.d.ts +0 -1
- package/dist/src/new-components.test.d.ts +0 -1
- package/dist/src/renderers/complex/__tests__/data-table.test.d.ts +0 -0
- package/dist/src/renderers/complex/calendar-view.d.ts +0 -1
- package/dist/src/renderers/complex/chatbot.d.ts +0 -1
- package/dist/src/renderers/complex/chatbot.test.d.ts +0 -1
- package/dist/src/renderers/complex/timeline.d.ts +0 -1
- package/dist/src/ui/calendar-view.d.ts +0 -21
- package/dist/src/ui/chatbot.d.ts +0 -36
- package/dist/src/ui/field.d.ts +0 -24
- package/dist/src/ui/input-group.d.ts +0 -16
- package/dist/src/ui/spinner.d.ts +0 -3
- package/dist/src/ui/timeline.d.ts +0 -25
- package/metadata/ObjectTable.component.yml +0 -41
- package/src/renderers/complex/calendar-view.tsx +0 -219
- package/src/renderers/complex/chatbot.test.ts +0 -44
- package/src/renderers/complex/chatbot.tsx +0 -185
- package/src/renderers/complex/timeline.tsx +0 -466
- package/src/ui/calendar-view.tsx +0 -503
- package/src/ui/chatbot.tsx +0 -240
- package/src/ui/field.tsx +0 -246
- package/src/ui/input-group.tsx +0 -170
- package/src/ui/spinner.tsx +0 -38
- package/src/ui/timeline.tsx +0 -266
- package/tailwind.config.js +0 -75
- /package/dist/src/{ui → custom}/empty.d.ts +0 -0
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
1
9
|
import { ComponentRegistry } from '@object-ui/core';
|
|
2
10
|
import type { FileUploadSchema } from '@object-ui/types';
|
|
3
11
|
import { Label, Button } from '../../ui';
|
|
@@ -87,7 +95,7 @@ ComponentRegistry.register('file-upload',
|
|
|
87
95
|
<div
|
|
88
96
|
onClick={handleClick}
|
|
89
97
|
className={cn(
|
|
90
|
-
"relative overflow-hidden cursor-pointer rounded-lg border-2 border-dashed transition-all duration-300 min-h-[120px] flex flex-col items-center justify-center p-6 gap-3",
|
|
98
|
+
"relative overflow-hidden cursor-pointer rounded-lg border-2 border-dashed transition-all duration-300 min-h-[120px] flex flex-col items-center justify-center p-4 sm:p-6 gap-3",
|
|
91
99
|
isUploading
|
|
92
100
|
? "border-cyan-400 bg-cyan-950/30"
|
|
93
101
|
: "border-slate-700 bg-slate-900/50 hover:bg-slate-900 hover:border-cyan-500/50 hover:shadow-[0_0_20px_-5px_rgba(6,182,212,0.3)]"
|
|
@@ -133,7 +141,7 @@ ComponentRegistry.register('file-upload',
|
|
|
133
141
|
|
|
134
142
|
<div className="flex items-center gap-3 z-10">
|
|
135
143
|
<CheckCircle2 className="w-4 h-4 text-emerald-500 rounded-full" />
|
|
136
|
-
<span className="truncate max-w-[200px] text-muted-foreground group-hover/file:text-foreground font-mono text-xs transition-colors">{file.name}</span>
|
|
144
|
+
<span className="truncate max-w-[150px] sm:max-w-[200px] md:max-w-[300px] text-muted-foreground group-hover/file:text-foreground font-mono text-xs transition-colors">{file.name}</span>
|
|
137
145
|
</div>
|
|
138
146
|
|
|
139
147
|
<Button
|
|
@@ -157,6 +165,7 @@ ComponentRegistry.register('file-upload',
|
|
|
157
165
|
);
|
|
158
166
|
},
|
|
159
167
|
{
|
|
168
|
+
namespace: 'ui',
|
|
160
169
|
label: 'File Upload',
|
|
161
170
|
inputs: [
|
|
162
171
|
{ name: 'label', type: 'string', label: 'Label' },
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
1
9
|
import { ComponentRegistry } from '@object-ui/core';
|
|
2
10
|
import type { FormSchema, FormField as FormFieldConfig, ValidationRule, FieldCondition, SelectOption } from '@object-ui/types';
|
|
3
11
|
import { useForm } from 'react-hook-form';
|
|
@@ -6,6 +14,7 @@ import { Button } from '../../ui/button';
|
|
|
6
14
|
import { Input } from '../../ui/input';
|
|
7
15
|
import { Textarea } from '../../ui/textarea';
|
|
8
16
|
import { Checkbox } from '../../ui/checkbox';
|
|
17
|
+
import { Switch } from '../../ui/switch';
|
|
9
18
|
import {
|
|
10
19
|
Select,
|
|
11
20
|
SelectTrigger,
|
|
@@ -28,10 +37,12 @@ ComponentRegistry.register('form',
|
|
|
28
37
|
submitLabel = 'Submit',
|
|
29
38
|
cancelLabel = 'Cancel',
|
|
30
39
|
showCancel = false,
|
|
40
|
+
showSubmit = true,
|
|
31
41
|
layout = 'vertical',
|
|
32
42
|
columns = 1,
|
|
33
43
|
onSubmit: onSubmitProp,
|
|
34
44
|
onChange: onChangeProp,
|
|
45
|
+
onCancel: onCancelProp,
|
|
35
46
|
resetOnSubmit = false,
|
|
36
47
|
validationMode = 'onSubmit',
|
|
37
48
|
disabled = false,
|
|
@@ -46,6 +57,11 @@ ComponentRegistry.register('form',
|
|
|
46
57
|
const [isSubmitting, setIsSubmitting] = React.useState(false);
|
|
47
58
|
const [submitError, setSubmitError] = React.useState<string | null>(null);
|
|
48
59
|
|
|
60
|
+
// React to defaultValues changes
|
|
61
|
+
React.useEffect(() => {
|
|
62
|
+
form.reset(defaultValues);
|
|
63
|
+
}, [defaultValues]);
|
|
64
|
+
|
|
49
65
|
// Watch for form changes - only track changes when onAction is available
|
|
50
66
|
React.useEffect(() => {
|
|
51
67
|
if (onAction) {
|
|
@@ -65,12 +81,34 @@ ComponentRegistry.register('form',
|
|
|
65
81
|
setIsSubmitting(true);
|
|
66
82
|
setSubmitError(null);
|
|
67
83
|
|
|
84
|
+
// Defensive check: If data is an Event, use getValues()
|
|
85
|
+
let formData = data;
|
|
86
|
+
// Check for Event-like properties
|
|
87
|
+
const isEvent = data && (
|
|
88
|
+
(data as any).nativeEvent ||
|
|
89
|
+
typeof (data as any).preventDefault === 'function' ||
|
|
90
|
+
typeof (data as any).stopPropagation === 'function' ||
|
|
91
|
+
(data as any).target ||
|
|
92
|
+
(data as any).bubbles
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
if (isEvent) {
|
|
96
|
+
// This should not happen with RHF handleSubmit, but just in case
|
|
97
|
+
formData = form.getValues();
|
|
98
|
+
} else if (!formData || Object.keys(formData).length === 0) {
|
|
99
|
+
// Fallback: if data is empty check getValues(), in case RHF failed to pass it for some reason
|
|
100
|
+
const values = form.getValues();
|
|
101
|
+
if (values && Object.keys(values).length > 0) {
|
|
102
|
+
formData = values;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
68
106
|
try {
|
|
69
107
|
if (onAction) {
|
|
70
108
|
const result = await onAction({
|
|
71
109
|
type: 'form_submit',
|
|
72
|
-
data,
|
|
73
|
-
formData:
|
|
110
|
+
data: formData,
|
|
111
|
+
formData: formData,
|
|
74
112
|
}) as any;
|
|
75
113
|
|
|
76
114
|
// Check if submission returned an error
|
|
@@ -81,7 +119,7 @@ ComponentRegistry.register('form',
|
|
|
81
119
|
}
|
|
82
120
|
|
|
83
121
|
if (onSubmitProp && typeof onSubmitProp === 'function') {
|
|
84
|
-
await onSubmitProp(
|
|
122
|
+
await onSubmitProp(formData);
|
|
85
123
|
}
|
|
86
124
|
|
|
87
125
|
if (resetOnSubmit) {
|
|
@@ -109,6 +147,11 @@ ComponentRegistry.register('form',
|
|
|
109
147
|
// Handle cancel
|
|
110
148
|
const handleCancel = () => {
|
|
111
149
|
form.reset();
|
|
150
|
+
|
|
151
|
+
if (onCancelProp && typeof onCancelProp === 'function') {
|
|
152
|
+
onCancelProp();
|
|
153
|
+
}
|
|
154
|
+
|
|
112
155
|
if (onAction) {
|
|
113
156
|
onAction({
|
|
114
157
|
type: 'form_cancel',
|
|
@@ -118,21 +161,32 @@ ComponentRegistry.register('form',
|
|
|
118
161
|
};
|
|
119
162
|
|
|
120
163
|
// Determine grid classes based on columns (explicit classes for Tailwind JIT)
|
|
164
|
+
// Mobile-first: 1 column on mobile, 2 on sm, then md/lg for larger values
|
|
121
165
|
const gridColsClass =
|
|
122
166
|
columns === 1 ? '' :
|
|
123
|
-
columns === 2 ? '
|
|
124
|
-
columns === 3 ? 'md:grid-cols-3' :
|
|
125
|
-
'md:grid-cols-4';
|
|
167
|
+
columns === 2 ? 'sm:grid-cols-2' :
|
|
168
|
+
columns === 3 ? 'sm:grid-cols-2 md:grid-cols-3' :
|
|
169
|
+
'sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4';
|
|
126
170
|
|
|
127
171
|
const gridClass = columns > 1
|
|
128
172
|
? cn('grid gap-4', gridColsClass)
|
|
129
173
|
: 'space-y-4';
|
|
130
174
|
|
|
131
|
-
// Extract designer-related props
|
|
175
|
+
// Extract designer-related props and conflicting handlers
|
|
132
176
|
const {
|
|
133
177
|
'data-obj-id': dataObjId,
|
|
134
178
|
'data-obj-type': dataObjType,
|
|
135
|
-
style,
|
|
179
|
+
style,
|
|
180
|
+
onSubmit: _ignoredOnSubmit, // Prevent overwriting our handleSubmit
|
|
181
|
+
onChange: _ignoredOnChange, // Prevent overwriting our onChange
|
|
182
|
+
// Extract schema props that should not be spread to DOM (handled separately by schema destructuring above)
|
|
183
|
+
submitLabel: _submitLabel,
|
|
184
|
+
cancelLabel: _cancelLabel,
|
|
185
|
+
showSubmit: _showSubmit,
|
|
186
|
+
showCancel: _showCancel,
|
|
187
|
+
resetOnSubmit: _resetOnSubmit,
|
|
188
|
+
defaultValues: _defaultValues,
|
|
189
|
+
inputType: _inputType,
|
|
136
190
|
...formProps
|
|
137
191
|
} = props;
|
|
138
192
|
|
|
@@ -232,6 +286,9 @@ ComponentRegistry.register('form',
|
|
|
232
286
|
{/* Render the actual field component based on type */}
|
|
233
287
|
{renderFieldComponent(type, {
|
|
234
288
|
...fieldProps,
|
|
289
|
+
// specialized fields needs raw metadata, but we should traverse down if it exists
|
|
290
|
+
// field is the field configuration loop variable
|
|
291
|
+
field: (field as any).field || field,
|
|
235
292
|
...formField,
|
|
236
293
|
inputType: fieldProps.inputType,
|
|
237
294
|
options: fieldProps.options,
|
|
@@ -264,6 +321,7 @@ ComponentRegistry.register('form',
|
|
|
264
321
|
{cancelLabel}
|
|
265
322
|
</Button>
|
|
266
323
|
)}
|
|
324
|
+
{showSubmit && (
|
|
267
325
|
<Button
|
|
268
326
|
type="submit"
|
|
269
327
|
disabled={isSubmitting || disabled}
|
|
@@ -271,6 +329,7 @@ ComponentRegistry.register('form',
|
|
|
271
329
|
{isSubmitting && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
|
|
272
330
|
{submitLabel}
|
|
273
331
|
</Button>
|
|
332
|
+
)}
|
|
274
333
|
</div>
|
|
275
334
|
)}
|
|
276
335
|
</form>
|
|
@@ -278,6 +337,7 @@ ComponentRegistry.register('form',
|
|
|
278
337
|
);
|
|
279
338
|
},
|
|
280
339
|
{
|
|
340
|
+
namespace: 'ui',
|
|
281
341
|
label: 'Form',
|
|
282
342
|
inputs: [
|
|
283
343
|
{
|
|
@@ -363,26 +423,52 @@ interface RenderFieldProps {
|
|
|
363
423
|
}
|
|
364
424
|
|
|
365
425
|
function renderFieldComponent(type: string, props: RenderFieldProps) {
|
|
426
|
+
// 1. Try to resolve specialized field widget from registry first
|
|
427
|
+
// We prioritize registry components (e.g., 'field.currency', 'field.date')
|
|
428
|
+
const RegisteredComponent = ComponentRegistry.get(type);
|
|
429
|
+
|
|
430
|
+
if (RegisteredComponent) {
|
|
431
|
+
// For specialized fields (e.g. fields package), they expect 'field' prop.
|
|
432
|
+
// Ensure we pass all props.
|
|
433
|
+
// Also pass 'schema' for standard renderers that expect it
|
|
434
|
+
return <RegisteredComponent schema={props} {...props} />;
|
|
435
|
+
}
|
|
436
|
+
|
|
366
437
|
const { inputType, options = [], placeholder, ...fieldProps } = props;
|
|
367
438
|
|
|
368
439
|
switch (type) {
|
|
369
440
|
case 'input':
|
|
370
|
-
|
|
371
|
-
|
|
441
|
+
if (inputType === 'file') {
|
|
442
|
+
// File inputs cannot be controlled with value prop
|
|
443
|
+
const { value, ...fileProps } = fieldProps;
|
|
444
|
+
return <Input type="file" placeholder={placeholder} {...fileProps} />;
|
|
445
|
+
}
|
|
446
|
+
return <Input type={inputType || 'text'} placeholder={placeholder} {...fieldProps} value={fieldProps.value ?? ''} />;
|
|
447
|
+
|
|
372
448
|
case 'textarea':
|
|
373
|
-
return <Textarea placeholder={placeholder} {...fieldProps} />;
|
|
449
|
+
return <Textarea placeholder={placeholder} {...fieldProps} value={fieldProps.value ?? ''} />;
|
|
374
450
|
|
|
375
451
|
case 'checkbox': {
|
|
376
452
|
// For checkbox, we need to handle the value differently
|
|
377
453
|
const { value, onChange, ...checkboxProps } = fieldProps;
|
|
378
454
|
return (
|
|
379
|
-
<
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
455
|
+
<Checkbox
|
|
456
|
+
checked={value}
|
|
457
|
+
onCheckedChange={onChange}
|
|
458
|
+
{...checkboxProps}
|
|
459
|
+
/>
|
|
460
|
+
);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
case 'switch': {
|
|
464
|
+
// For switch, we need to handle the value differently (same as checkbox)
|
|
465
|
+
const { value, onChange, ...switchProps } = fieldProps;
|
|
466
|
+
return (
|
|
467
|
+
<Switch
|
|
468
|
+
checked={value}
|
|
469
|
+
onCheckedChange={onChange}
|
|
470
|
+
{...switchProps}
|
|
471
|
+
/>
|
|
386
472
|
);
|
|
387
473
|
}
|
|
388
474
|
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
1
9
|
import './form';
|
|
2
10
|
import './button';
|
|
3
11
|
import './label';
|
|
@@ -14,3 +22,5 @@ import './input-otp';
|
|
|
14
22
|
import './calendar';
|
|
15
23
|
import './date-picker';
|
|
16
24
|
import './file-upload';
|
|
25
|
+
import './combobox';
|
|
26
|
+
import './command';
|
|
@@ -1,24 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
1
9
|
import { ComponentRegistry } from '@object-ui/core';
|
|
2
10
|
import type { InputOTPSchema } from '@object-ui/types';
|
|
3
11
|
import { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator } from '../../ui';
|
|
4
12
|
|
|
5
13
|
ComponentRegistry.register('input-otp',
|
|
6
|
-
({ schema, className, ...props }: { schema: InputOTPSchema; className?: string; [key: string]: any }) =>
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
({ schema, className, onChange, value, ...props }: { schema: InputOTPSchema; className?: string; [key: string]: any }) => {
|
|
15
|
+
const length = schema.maxLength || 6;
|
|
16
|
+
const slots = Array.from({ length });
|
|
17
|
+
|
|
18
|
+
const handleChange = (val: string) => {
|
|
19
|
+
if (onChange) {
|
|
20
|
+
onChange(val);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<InputOTP
|
|
26
|
+
maxLength={length}
|
|
27
|
+
className={className}
|
|
28
|
+
value={value ?? schema.value}
|
|
29
|
+
onChange={handleChange}
|
|
30
|
+
{...props}
|
|
31
|
+
>
|
|
32
|
+
<InputOTPGroup>
|
|
33
|
+
{slots.map((_, i) => (
|
|
34
|
+
<InputOTPSlot key={i} index={i} />
|
|
35
|
+
))}
|
|
36
|
+
</InputOTPGroup>
|
|
37
|
+
</InputOTP>
|
|
38
|
+
);
|
|
39
|
+
},
|
|
21
40
|
{
|
|
41
|
+
namespace: 'ui',
|
|
22
42
|
label: 'Input OTP',
|
|
23
43
|
inputs: [
|
|
24
44
|
{ name: 'maxLength', type: 'number', label: 'Max Length', defaultValue: 6 },
|
|
@@ -1,61 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
1
9
|
import React from 'react';
|
|
2
10
|
import { ComponentRegistry } from '@object-ui/core';
|
|
3
11
|
import type { InputSchema } from '@object-ui/types';
|
|
4
12
|
import { Input, Label } from '../../ui';
|
|
5
13
|
import { cn } from '../../lib/utils';
|
|
6
14
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
const InputRenderer = ({ schema, className, onChange, value, ...props }: { schema: InputSchema; className?: string; onChange?: (val: any) => void; value?: any; [key: string]: any }) => {
|
|
16
|
+
// Handle change for both raw inputs and form-bound inputs
|
|
17
|
+
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
18
|
+
if (onChange) {
|
|
19
|
+
onChange(e.target.value);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
// Extract designer-related props to apply to the wrapper
|
|
24
|
+
// These props are injected by SchemaRenderer for designer interaction
|
|
25
|
+
const {
|
|
26
|
+
'data-obj-id': dataObjId,
|
|
27
|
+
'data-obj-type': dataObjType,
|
|
28
|
+
style,
|
|
29
|
+
...inputProps
|
|
30
|
+
} = props;
|
|
16
31
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
style
|
|
23
|
-
|
|
24
|
-
|
|
32
|
+
return (
|
|
33
|
+
<div
|
|
34
|
+
className={cn("grid w-full items-center gap-1.5", schema.wrapperClass)}
|
|
35
|
+
data-obj-id={dataObjId}
|
|
36
|
+
data-obj-type={dataObjType}
|
|
37
|
+
style={style}
|
|
38
|
+
>
|
|
39
|
+
{schema.label && <Label htmlFor={schema.id} className={cn(schema.required && "text-destructive after:content-['*'] after:ml-0.5")}>{schema.label}</Label>}
|
|
40
|
+
<Input
|
|
41
|
+
type={schema.inputType || 'text'}
|
|
42
|
+
id={schema.id}
|
|
43
|
+
name={schema.name}
|
|
44
|
+
placeholder={schema.placeholder}
|
|
45
|
+
className={className}
|
|
46
|
+
required={schema.required}
|
|
47
|
+
disabled={schema.disabled}
|
|
48
|
+
readOnly={schema.readOnly}
|
|
49
|
+
value={value ?? schema.value ?? ''} // Controlled if value provided
|
|
50
|
+
defaultValue={value === undefined ? schema.defaultValue : undefined}
|
|
51
|
+
onChange={handleChange}
|
|
52
|
+
min={schema.min}
|
|
53
|
+
max={schema.max}
|
|
54
|
+
step={schema.step}
|
|
55
|
+
maxLength={schema.maxLength}
|
|
56
|
+
pattern={schema.pattern}
|
|
57
|
+
{...inputProps}
|
|
58
|
+
/>
|
|
59
|
+
{schema.description && <p className="text-sm text-muted-foreground">{schema.description}</p>}
|
|
60
|
+
{schema.error && <p className="text-sm font-medium text-destructive">{schema.error}</p>}
|
|
61
|
+
</div>
|
|
62
|
+
);
|
|
63
|
+
};
|
|
25
64
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
className={cn("grid w-full items-center gap-1.5", schema.wrapperClass)}
|
|
29
|
-
data-obj-id={dataObjId}
|
|
30
|
-
data-obj-type={dataObjType}
|
|
31
|
-
style={style}
|
|
32
|
-
>
|
|
33
|
-
{schema.label && <Label htmlFor={schema.id} className={cn(schema.required && "text-destructive after:content-['*'] after:ml-0.5")}>{schema.label}</Label>}
|
|
34
|
-
<Input
|
|
35
|
-
type={schema.inputType || 'text'}
|
|
36
|
-
id={schema.id}
|
|
37
|
-
name={schema.name}
|
|
38
|
-
placeholder={schema.placeholder}
|
|
39
|
-
className={className}
|
|
40
|
-
required={schema.required}
|
|
41
|
-
disabled={schema.disabled}
|
|
42
|
-
readOnly={schema.readOnly}
|
|
43
|
-
value={value ?? schema.value ?? ''} // Controlled if value provided
|
|
44
|
-
defaultValue={value === undefined ? schema.defaultValue : undefined}
|
|
45
|
-
onChange={handleChange}
|
|
46
|
-
min={schema.min}
|
|
47
|
-
max={schema.max}
|
|
48
|
-
step={schema.step}
|
|
49
|
-
maxLength={schema.maxLength}
|
|
50
|
-
pattern={schema.pattern}
|
|
51
|
-
{...inputProps}
|
|
52
|
-
/>
|
|
53
|
-
{schema.description && <p className="text-sm text-muted-foreground">{schema.description}</p>}
|
|
54
|
-
{schema.error && <p className="text-sm font-medium text-destructive">{schema.error}</p>}
|
|
55
|
-
</div>
|
|
56
|
-
);
|
|
57
|
-
},
|
|
58
|
-
{
|
|
65
|
+
ComponentRegistry.register('input', InputRenderer, {
|
|
66
|
+
namespace: 'ui',
|
|
59
67
|
label: 'Input Field',
|
|
60
68
|
inputs: [
|
|
61
69
|
{ name: 'label', type: 'string', label: 'Label' },
|
|
@@ -77,3 +85,37 @@ ComponentRegistry.register('input',
|
|
|
77
85
|
}
|
|
78
86
|
}
|
|
79
87
|
);
|
|
88
|
+
|
|
89
|
+
ComponentRegistry.register('email',
|
|
90
|
+
(props: any) => <InputRenderer {...props} schema={{ ...props.schema, inputType: 'email' }} />,
|
|
91
|
+
{
|
|
92
|
+
namespace: 'ui',
|
|
93
|
+
label: 'Email Input',
|
|
94
|
+
icon: 'mail',
|
|
95
|
+
inputs: [
|
|
96
|
+
{ name: 'label', type: 'string', label: 'Label' },
|
|
97
|
+
{ name: 'name', type: 'string', label: 'Field Name' },
|
|
98
|
+
{ name: 'placeholder', type: 'string', label: 'Placeholder' },
|
|
99
|
+
{ name: 'required', type: 'boolean', label: 'Required' },
|
|
100
|
+
{ name: 'disabled', type: 'boolean', label: 'Disabled' },
|
|
101
|
+
{ name: 'description', type: 'string', label: 'Description' }
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
ComponentRegistry.register('password',
|
|
107
|
+
(props: any) => <InputRenderer {...props} schema={{ ...props.schema, inputType: 'password' }} />,
|
|
108
|
+
{
|
|
109
|
+
namespace: 'ui',
|
|
110
|
+
label: 'Password Input',
|
|
111
|
+
icon: 'lock',
|
|
112
|
+
inputs: [
|
|
113
|
+
{ name: 'label', type: 'string', label: 'Label' },
|
|
114
|
+
{ name: 'name', type: 'string', label: 'Field Name' },
|
|
115
|
+
{ name: 'placeholder', type: 'string', label: 'Placeholder' },
|
|
116
|
+
{ name: 'required', type: 'boolean', label: 'Required' },
|
|
117
|
+
{ name: 'disabled', type: 'boolean', label: 'Disabled' },
|
|
118
|
+
{ name: 'description', type: 'string', label: 'Description' }
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
);
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
1
9
|
import { ComponentRegistry } from '@object-ui/core';
|
|
2
10
|
import type { LabelSchema } from '@object-ui/types';
|
|
3
11
|
import { Label } from '../../ui';
|
|
@@ -24,6 +32,7 @@ ComponentRegistry.register('label',
|
|
|
24
32
|
);
|
|
25
33
|
},
|
|
26
34
|
{
|
|
35
|
+
namespace: 'ui',
|
|
27
36
|
label: 'Label',
|
|
28
37
|
inputs: [
|
|
29
38
|
{ name: 'text', type: 'string', label: 'Text', required: true },
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
1
9
|
import { ComponentRegistry } from '@object-ui/core';
|
|
2
10
|
import type { RadioGroupSchema } from '@object-ui/types';
|
|
3
11
|
import { RadioGroup, RadioGroupItem, Label } from '../../ui';
|
|
@@ -30,6 +38,7 @@ ComponentRegistry.register('radio-group',
|
|
|
30
38
|
);
|
|
31
39
|
},
|
|
32
40
|
{
|
|
41
|
+
namespace: 'ui',
|
|
33
42
|
label: 'Radio Group',
|
|
34
43
|
inputs: [
|
|
35
44
|
{ name: 'defaultValue', type: 'string', label: 'Default Value' },
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
1
9
|
import { ComponentRegistry } from '@object-ui/core';
|
|
2
10
|
import type { SelectSchema } from '@object-ui/types';
|
|
3
11
|
import {
|
|
@@ -8,44 +16,64 @@ import {
|
|
|
8
16
|
SelectItem,
|
|
9
17
|
Label
|
|
10
18
|
} from '../../ui';
|
|
19
|
+
import { cn } from '../../lib/utils';
|
|
20
|
+
import React from 'react';
|
|
21
|
+
|
|
22
|
+
const SelectRenderer = ({ schema, className, onChange, value, ...props }: { schema: SelectSchema; className?: string; onChange?: (val: any) => void; value?: any; [key: string]: any }) => {
|
|
23
|
+
// Extract designer-related props
|
|
24
|
+
const {
|
|
25
|
+
'data-obj-id': dataObjId,
|
|
26
|
+
'data-obj-type': dataObjType,
|
|
27
|
+
style,
|
|
28
|
+
...selectProps
|
|
29
|
+
} = props;
|
|
11
30
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
'data-obj-type': dataObjType,
|
|
18
|
-
style,
|
|
19
|
-
...selectProps
|
|
20
|
-
} = props;
|
|
31
|
+
const handleValueChange = (newValue: string) => {
|
|
32
|
+
if (onChange) {
|
|
33
|
+
onChange(newValue);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
21
36
|
|
|
22
|
-
|
|
37
|
+
return (
|
|
23
38
|
<div
|
|
24
|
-
className={
|
|
39
|
+
className={cn("grid w-full items-center gap-1.5", schema.wrapperClass)}
|
|
25
40
|
data-obj-id={dataObjId}
|
|
26
41
|
data-obj-type={dataObjType}
|
|
27
42
|
style={style}
|
|
28
43
|
>
|
|
29
|
-
{schema.label && <Label>{schema.label}</Label>}
|
|
30
|
-
<Select
|
|
44
|
+
{schema.label && <Label className={cn(schema.required && "text-destructive after:content-['*'] after:ml-0.5")}>{schema.label}</Label>}
|
|
45
|
+
<Select
|
|
46
|
+
defaultValue={value === undefined ? schema.defaultValue : undefined}
|
|
47
|
+
value={value ?? schema.value}
|
|
48
|
+
onValueChange={handleValueChange}
|
|
49
|
+
disabled={schema.disabled}
|
|
50
|
+
required={schema.required}
|
|
51
|
+
name={schema.name}
|
|
52
|
+
{...selectProps}
|
|
53
|
+
>
|
|
31
54
|
<SelectTrigger className={className}>
|
|
32
55
|
<SelectValue placeholder={schema.placeholder} />
|
|
33
56
|
</SelectTrigger>
|
|
34
57
|
<SelectContent>
|
|
35
58
|
{schema.options?.map((opt) => (
|
|
36
|
-
<SelectItem key={opt.value} value={opt.value}>{opt.label}</SelectItem>
|
|
59
|
+
<SelectItem key={opt.value} value={opt.value} disabled={opt.disabled}>{opt.label}</SelectItem>
|
|
37
60
|
))}
|
|
38
61
|
</SelectContent>
|
|
39
62
|
</Select>
|
|
40
63
|
</div>
|
|
41
64
|
);
|
|
42
|
-
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
ComponentRegistry.register('select', SelectRenderer,
|
|
43
68
|
{
|
|
69
|
+
namespace: 'ui',
|
|
44
70
|
label: 'Select',
|
|
45
71
|
inputs: [
|
|
46
72
|
{ name: 'label', type: 'string', label: 'Label' },
|
|
47
73
|
{ name: 'placeholder', type: 'string', label: 'Placeholder' },
|
|
48
74
|
{ name: 'defaultValue', type: 'string', label: 'Default Value' },
|
|
75
|
+
{ name: 'required', type: 'boolean', label: 'Required' },
|
|
76
|
+
{ name: 'disabled', type: 'boolean', label: 'Disabled' },
|
|
49
77
|
{
|
|
50
78
|
name: 'options',
|
|
51
79
|
type: 'array',
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
1
9
|
import { ComponentRegistry } from '@object-ui/core';
|
|
2
10
|
import type { SliderSchema } from '@object-ui/types';
|
|
3
11
|
import { Slider } from '../../ui';
|
|
@@ -12,9 +20,16 @@ ComponentRegistry.register('slider',
|
|
|
12
20
|
...sliderProps
|
|
13
21
|
} = props;
|
|
14
22
|
|
|
23
|
+
// Ensure defaultValue is an array for backward compatibility
|
|
24
|
+
const defaultValue = Array.isArray(schema.defaultValue)
|
|
25
|
+
? schema.defaultValue
|
|
26
|
+
: schema.defaultValue !== undefined
|
|
27
|
+
? [schema.defaultValue]
|
|
28
|
+
: undefined;
|
|
29
|
+
|
|
15
30
|
return (
|
|
16
31
|
<Slider
|
|
17
|
-
defaultValue={
|
|
32
|
+
defaultValue={defaultValue}
|
|
18
33
|
max={schema.max}
|
|
19
34
|
min={schema.min}
|
|
20
35
|
step={schema.step}
|
|
@@ -26,6 +41,7 @@ ComponentRegistry.register('slider',
|
|
|
26
41
|
);
|
|
27
42
|
},
|
|
28
43
|
{
|
|
44
|
+
namespace: 'ui',
|
|
29
45
|
label: 'Slider',
|
|
30
46
|
inputs: [
|
|
31
47
|
{ name: 'defaultValue', type: 'array', label: 'Default Value', defaultValue: [50] },
|