@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
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
|
|
9
|
+
import { ComponentRegistry } from '@object-ui/core';
|
|
10
|
+
import type { KbdSchema } from '@object-ui/types';
|
|
11
|
+
import { cn } from '../../lib/utils';
|
|
12
|
+
|
|
13
|
+
ComponentRegistry.register('kbd',
|
|
14
|
+
({ schema, ...props }: { schema: KbdSchema; [key: string]: any }) => {
|
|
15
|
+
const {
|
|
16
|
+
'data-obj-id': dataObjId,
|
|
17
|
+
'data-obj-type': dataObjType,
|
|
18
|
+
style,
|
|
19
|
+
...kbdProps
|
|
20
|
+
} = props;
|
|
21
|
+
|
|
22
|
+
const keys = Array.isArray(schema.keys) ? schema.keys : [schema.keys || schema.label || 'K'];
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<div className={cn('inline-flex flex-wrap gap-1', schema.className)}>
|
|
26
|
+
{keys.map((key, idx) => (
|
|
27
|
+
<kbd
|
|
28
|
+
key={idx}
|
|
29
|
+
className="pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[10px] font-medium text-muted-foreground opacity-100"
|
|
30
|
+
{...kbdProps}
|
|
31
|
+
{...(idx === 0 ? { 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style } : {})}
|
|
32
|
+
>
|
|
33
|
+
{key}
|
|
34
|
+
</kbd>
|
|
35
|
+
))}
|
|
36
|
+
</div>
|
|
37
|
+
);
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
namespace: 'ui',
|
|
41
|
+
label: 'Keyboard Key',
|
|
42
|
+
inputs: [
|
|
43
|
+
{ name: 'label', type: 'string', label: 'Label' },
|
|
44
|
+
{ name: 'className', type: 'string', label: 'CSS Class' }
|
|
45
|
+
],
|
|
46
|
+
defaultProps: {
|
|
47
|
+
label: 'K'
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
);
|
|
@@ -1,68 +1,47 @@
|
|
|
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 { ListSchema } from '@object-ui/types';
|
|
3
|
-
import {
|
|
4
|
-
import { cn } from '../../lib/utils';
|
|
5
|
-
import { ChevronRight, Hexagon, Terminal } from 'lucide-react';
|
|
11
|
+
import { useDataScope } from '@object-ui/react';
|
|
12
|
+
import { renderChildren, cn } from '../../lib/utils';
|
|
6
13
|
|
|
7
14
|
ComponentRegistry.register('list',
|
|
8
15
|
({ schema, className, ...props }: { schema: ListSchema; className?: string; [key: string]: any }) => {
|
|
9
|
-
//
|
|
10
|
-
const
|
|
16
|
+
// Support data binding
|
|
17
|
+
const boundData = useDataScope(schema.bind);
|
|
18
|
+
const items = boundData || schema.items || [];
|
|
11
19
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
<div className="absolute bottom-0 left-0 w-2 h-2 border-l-2 border-b-2 border-cyan-500/50 rounded-bl-sm" />
|
|
18
|
-
<div className="absolute bottom-0 right-0 w-2 h-2 border-r-2 border-b-2 border-cyan-500/50 rounded-br-sm" />
|
|
20
|
+
// We use 'ol' or 'ul' based on ordered prop
|
|
21
|
+
const ListTag = schema.ordered ? 'ol' : 'ul';
|
|
22
|
+
|
|
23
|
+
// Default styles for ordered/unordered
|
|
24
|
+
const listStyle = schema.ordered ? "list-decimal" : "list-disc";
|
|
19
25
|
|
|
26
|
+
return (
|
|
27
|
+
<div className={cn("space-y-2", schema.wrapperClass)}>
|
|
20
28
|
{schema.title && (
|
|
21
|
-
<
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
{schema.title}
|
|
25
|
-
</h3>
|
|
26
|
-
</div>
|
|
29
|
+
<h3 className="text-lg font-semibold tracking-tight">
|
|
30
|
+
{schema.title}
|
|
31
|
+
</h3>
|
|
27
32
|
)}
|
|
28
33
|
|
|
29
34
|
<ListTag
|
|
30
35
|
className={cn(
|
|
31
|
-
"
|
|
36
|
+
"ml-6 [&>li]:mt-2",
|
|
37
|
+
listStyle,
|
|
32
38
|
className
|
|
33
39
|
)}
|
|
34
40
|
{...props}
|
|
35
41
|
>
|
|
36
|
-
{
|
|
37
|
-
<li
|
|
38
|
-
|
|
39
|
-
className={cn(
|
|
40
|
-
"group flex items-start gap-3 p-2 rounded-sm transition-all duration-300",
|
|
41
|
-
"hover:bg-cyan-950/20 hover:pl-3",
|
|
42
|
-
typeof item === 'object' && item.className
|
|
43
|
-
)}
|
|
44
|
-
>
|
|
45
|
-
{/* Marker Area */}
|
|
46
|
-
<div className="flex-shrink-0 mt-0.5">
|
|
47
|
-
{schema.ordered ? (
|
|
48
|
-
<span className="flex items-center justify-center w-5 h-5 text-[10px] font-mono font-bold text-slate-950 bg-cyan-600 rounded-sm shadow-[0_0_8px_cyan] group-hover:bg-cyan-400 group-hover:scale-110 transition-all">
|
|
49
|
-
{String(index + 1).padStart(2, '0')}
|
|
50
|
-
</span>
|
|
51
|
-
) : (
|
|
52
|
-
<div className="relative flex items-center justify-center w-5 h-5">
|
|
53
|
-
<Hexagon className="w-3 h-3 text-cyan-600 group-hover:text-cyan-400 group-hover:rotate-90 transition-transform duration-500" />
|
|
54
|
-
<div className="absolute inset-0 bg-cyan-500/20 blur-[2px] rounded-full opacity-0 group-hover:opacity-100 transition-opacity" />
|
|
55
|
-
</div>
|
|
56
|
-
)}
|
|
57
|
-
</div>
|
|
58
|
-
|
|
59
|
-
{/* Content Area */}
|
|
60
|
-
<div className="flex-1 text-sm text-slate-400 group-hover:text-cyan-100 font-medium font-sans leading-tight transition-colors">
|
|
61
|
-
{typeof item === 'string' ? item : item.content || renderChildren(item.body)}
|
|
62
|
-
</div>
|
|
63
|
-
|
|
64
|
-
{/* Hover Indicator */}
|
|
65
|
-
<ChevronRight className="w-4 h-4 text-cyan-500/0 -translate-x-2 group-hover:text-cyan-500 group-hover:translate-x-0 transition-all duration-300 opacity-0 group-hover:opacity-100" />
|
|
42
|
+
{items.map((item: any, index: number) => (
|
|
43
|
+
<li key={index} className={cn(typeof item === 'object' && item.className)}>
|
|
44
|
+
{typeof item === 'string' ? item : item.content || renderChildren(item.body)}
|
|
66
45
|
</li>
|
|
67
46
|
))}
|
|
68
47
|
</ListTag>
|
|
@@ -70,6 +49,7 @@ ComponentRegistry.register('list',
|
|
|
70
49
|
);
|
|
71
50
|
},
|
|
72
51
|
{
|
|
52
|
+
namespace: 'ui',
|
|
73
53
|
label: 'List',
|
|
74
54
|
inputs: [
|
|
75
55
|
{ name: 'title', type: 'string', label: 'Title' },
|
|
@@ -1,76 +1,73 @@
|
|
|
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 { StatisticSchema } from '@object-ui/types';
|
|
3
11
|
import { cn } from '../../lib/utils';
|
|
4
12
|
import { TrendingUp, TrendingDown, Minus } from 'lucide-react';
|
|
13
|
+
import * as LucideIcons from 'lucide-react';
|
|
14
|
+
|
|
15
|
+
// Helper to resolve icon
|
|
16
|
+
const getIcon = (name: string) => {
|
|
17
|
+
if (!name) return null;
|
|
18
|
+
const pascalName = name.split('-').map(part => part.charAt(0).toUpperCase() + part.slice(1)).join('');
|
|
19
|
+
// Dynamic icon lookup from Lucide
|
|
20
|
+
const Icon = LucideIcons[pascalName] || LucideIcons[name];
|
|
21
|
+
return Icon;
|
|
22
|
+
};
|
|
5
23
|
|
|
6
24
|
const StatisticRenderer = ({ schema }: { schema: StatisticSchema }) => {
|
|
25
|
+
const Icon = schema.icon ? getIcon(schema.icon) : null;
|
|
26
|
+
|
|
7
27
|
return (
|
|
8
28
|
<div className={cn(
|
|
9
|
-
"group relative flex flex-col p-5 rounded-xl
|
|
10
|
-
"bg-slate-950/40 border border-slate-800/60 backdrop-blur-sm",
|
|
11
|
-
"hover:bg-slate-900/60 hover:border-cyan-500/50 hover:shadow-[0_0_30px_-10px_rgba(6,182,212,0.3)]",
|
|
29
|
+
"group relative flex flex-col p-4 sm:p-5 md:p-6 rounded-xl border bg-card text-card-foreground shadow-sm",
|
|
12
30
|
schema.className
|
|
13
31
|
)}>
|
|
14
|
-
{/*
|
|
15
|
-
<div className="
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
{/* Label */}
|
|
19
|
-
{schema.label && (
|
|
20
|
-
<div className="flex items-center gap-2 mb-2">
|
|
21
|
-
<div className="w-1 h-3 bg-cyan-500 rounded-full shadow-[0_0_8px_cyan]" />
|
|
22
|
-
<p className="text-[10px] font-mono font-bold uppercase tracking-[0.2em] text-cyan-600/80 group-hover:text-cyan-400 transition-colors">
|
|
32
|
+
{/* Label & Header Icon */}
|
|
33
|
+
<div className="flex items-center justify-between mb-2">
|
|
34
|
+
{schema.label && (
|
|
35
|
+
<p className="text-sm font-medium text-muted-foreground">
|
|
23
36
|
{schema.label}
|
|
24
37
|
</p>
|
|
25
|
-
|
|
26
|
-
|
|
38
|
+
)}
|
|
39
|
+
{/* Dynamic icon resolution from Lucide, not component creation during render */}
|
|
40
|
+
{/* eslint-disable-next-line */}
|
|
41
|
+
{Icon && <Icon className="h-4 w-4 text-muted-foreground" />}
|
|
42
|
+
</div>
|
|
27
43
|
|
|
28
44
|
{/* Value Area */}
|
|
29
|
-
<div className="flex items-baseline gap-
|
|
30
|
-
<h3 className=
|
|
31
|
-
"text-4xl font-black tracking-tight text-white transition-all duration-300",
|
|
32
|
-
"drop-shadow-[0_0_10px_rgba(255,255,255,0.3)]",
|
|
33
|
-
"group-hover:scale-110 group-hover:text-cyan-100 group-hover:drop-shadow-[0_0_15px_rgba(6,182,212,0.6)] group-hover:-translate-y-1"
|
|
34
|
-
)}>
|
|
45
|
+
<div className="flex items-baseline gap-2">
|
|
46
|
+
<h3 className="text-2xl font-bold tracking-tight">
|
|
35
47
|
{schema.value}
|
|
36
48
|
</h3>
|
|
49
|
+
</div>
|
|
37
50
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
<div className=
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
schema.trend === 'down' && "text-rose-400 border-rose-500/30 bg-rose-950/30 shadow-[0_0_10px_-4px_rgba(251,113,133,0.5)]",
|
|
44
|
-
schema.trend === 'neutral' && "text-amber-400 border-amber-500/30 bg-amber-950/30 shadow-[0_0_10px_-4px_rgba(251,191,36,0.5)]",
|
|
45
|
-
"group-hover:scale-105"
|
|
46
|
-
)}>
|
|
47
|
-
{schema.trend === 'up' && <TrendingUp className="mr-1 h-3 w-3" />}
|
|
48
|
-
{schema.trend === 'down' && <TrendingDown className="mr-1 h-3 w-3" />}
|
|
51
|
+
{/* Footer / Trend */}
|
|
52
|
+
{(schema.trend || schema.description) && (
|
|
53
|
+
<div className="mt-1 flex items-center text-xs text-muted-foreground">
|
|
54
|
+
{schema.trend === 'up' && <TrendingUp className="mr-1 h-3 w-3 text-emerald-500" />}
|
|
55
|
+
{schema.trend === 'down' && <TrendingDown className="mr-1 h-3 w-3 text-rose-500" />}
|
|
49
56
|
{schema.trend === 'neutral' && <Minus className="mr-1 h-3 w-3" />}
|
|
50
|
-
|
|
57
|
+
<span className={cn(
|
|
58
|
+
schema.trend === 'up' && "text-emerald-500 font-medium",
|
|
59
|
+
schema.trend === 'down' && "text-rose-500 font-medium",
|
|
60
|
+
)}>
|
|
61
|
+
{schema.description}
|
|
62
|
+
</span>
|
|
51
63
|
</div>
|
|
52
|
-
)}
|
|
53
|
-
</div>
|
|
54
|
-
|
|
55
|
-
{/* Footer / Description Text if needed below (optional, mostly handled by trend pill now, but keeping separate if text is long) */}
|
|
56
|
-
{schema.description && !schema.trend && (
|
|
57
|
-
<p className="text-xs text-slate-500 font-mono mt-1 group-hover:text-slate-400 transition-colors">
|
|
58
|
-
{schema.description}
|
|
59
|
-
</p>
|
|
60
64
|
)}
|
|
61
|
-
|
|
62
|
-
{/* Decorative accent corners */}
|
|
63
|
-
<div className="absolute right-0 bottom-0 w-8 h-8 opacity-20 group-hover:opacity-100 transition-opacity">
|
|
64
|
-
<svg viewBox="0 0 24 24" fill="none" className="w-full h-full text-cyan-500" stroke="currentColor" strokeWidth="1">
|
|
65
|
-
<path d="M22 22L12 22L22 12Z" fill="currentColor" fillOpacity="0.2" />
|
|
66
|
-
<path d="M22 17L22 22L17 22" strokeLinecap="round" strokeLinejoin="round" />
|
|
67
|
-
</svg>
|
|
68
|
-
</div>
|
|
69
65
|
</div>
|
|
70
66
|
);
|
|
71
67
|
};
|
|
72
68
|
|
|
73
69
|
ComponentRegistry.register('statistic', StatisticRenderer, {
|
|
70
|
+
namespace: 'ui',
|
|
74
71
|
label: 'Statistic',
|
|
75
72
|
category: 'data-display',
|
|
76
73
|
icon: 'Activity',
|
|
@@ -0,0 +1,78 @@
|
|
|
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
|
+
|
|
9
|
+
import React from 'react';
|
|
10
|
+
import { ComponentRegistry } from '@object-ui/core';
|
|
11
|
+
import { useDataScope } from '@object-ui/react';
|
|
12
|
+
import {
|
|
13
|
+
Table,
|
|
14
|
+
TableBody,
|
|
15
|
+
TableCell,
|
|
16
|
+
TableHead,
|
|
17
|
+
TableHeader,
|
|
18
|
+
TableRow
|
|
19
|
+
} from '../../ui/table';
|
|
20
|
+
import { cn } from '../../lib/utils';
|
|
21
|
+
|
|
22
|
+
export const SimpleTableRenderer = ({ schema, className }: any) => {
|
|
23
|
+
// Try to get data from binding first, then fall back to inline data
|
|
24
|
+
const boundData = useDataScope(schema.bind);
|
|
25
|
+
const data = boundData || schema.data || schema.props?.data || [];
|
|
26
|
+
const columns = schema.columns || schema.props?.columns || [];
|
|
27
|
+
|
|
28
|
+
// If we have data but it's not an array, show error.
|
|
29
|
+
// If data is undefined, we might just be loading or empty.
|
|
30
|
+
if (data && !Array.isArray(data)) {
|
|
31
|
+
return <div className="text-red-500 p-2 border border-red-200 bg-red-50 rounded text-sm">Table data must be an array</div>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const displayData = Array.isArray(data) ? data : [];
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<div className={cn("rounded-md border", className)}>
|
|
38
|
+
<Table>
|
|
39
|
+
<TableHeader>
|
|
40
|
+
<TableRow>
|
|
41
|
+
{columns.map((col: any, index: number) => (
|
|
42
|
+
<TableHead key={col.key || col.accessorKey || index}>
|
|
43
|
+
{col.label || col.header}
|
|
44
|
+
</TableHead>
|
|
45
|
+
))}
|
|
46
|
+
</TableRow>
|
|
47
|
+
</TableHeader>
|
|
48
|
+
<TableBody>
|
|
49
|
+
{displayData.length === 0 ? (
|
|
50
|
+
<TableRow>
|
|
51
|
+
<TableCell colSpan={columns.length} className="h-24 text-center">
|
|
52
|
+
No results.
|
|
53
|
+
</TableCell>
|
|
54
|
+
</TableRow>
|
|
55
|
+
) : (
|
|
56
|
+
displayData.map((row: any, i: number) => (
|
|
57
|
+
<TableRow key={row.id || i}>
|
|
58
|
+
{columns.map((col: any, index: number) => {
|
|
59
|
+
const accessor = col.key || col.accessorKey || '';
|
|
60
|
+
const value = accessor ? row[accessor] : '';
|
|
61
|
+
return (
|
|
62
|
+
<TableCell key={col.key || col.accessorKey || index}>
|
|
63
|
+
{value}
|
|
64
|
+
</TableCell>
|
|
65
|
+
);
|
|
66
|
+
})}
|
|
67
|
+
</TableRow>
|
|
68
|
+
))
|
|
69
|
+
)}
|
|
70
|
+
</TableBody>
|
|
71
|
+
</Table>
|
|
72
|
+
</div>
|
|
73
|
+
);
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
ComponentRegistry.register('table', SimpleTableRenderer, {
|
|
77
|
+
namespace: 'ui'
|
|
78
|
+
});
|
|
@@ -1,17 +1,24 @@
|
|
|
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 { TreeViewSchema, TreeNode } from '@object-ui/types';
|
|
3
11
|
import { ChevronRight, ChevronDown, Folder, File, FolderOpen, CircuitBoard } from 'lucide-react';
|
|
4
12
|
import { useState } from 'react';
|
|
5
13
|
import { cn } from '../../lib/utils';
|
|
14
|
+
import { useDataScope } from '@object-ui/react';
|
|
6
15
|
|
|
7
16
|
const TreeNodeComponent = ({
|
|
8
17
|
node,
|
|
9
|
-
onNodeClick
|
|
10
|
-
isChild = false
|
|
18
|
+
onNodeClick
|
|
11
19
|
}: {
|
|
12
20
|
node: TreeNode;
|
|
13
21
|
onNodeClick?: (node: TreeNode) => void;
|
|
14
|
-
isChild?: boolean;
|
|
15
22
|
}) => {
|
|
16
23
|
const [isOpen, setIsOpen] = useState(false);
|
|
17
24
|
const hasChildren = node.children && node.children.length > 0;
|
|
@@ -29,68 +36,56 @@ const TreeNodeComponent = ({
|
|
|
29
36
|
|
|
30
37
|
return (
|
|
31
38
|
<div className="relative">
|
|
32
|
-
{/* Connecting line for siblings (visual aid, tricky to do perfectly without depth context, so we focus on the left border of the container) */}
|
|
33
|
-
|
|
34
39
|
<div
|
|
35
40
|
className={cn(
|
|
36
|
-
'group flex items-center py-1.5 px-2 rounded-sm cursor-pointer transition-
|
|
37
|
-
'hover:bg-
|
|
38
|
-
isOpen && hasChildren && 'bg-
|
|
41
|
+
'group flex items-center py-1.5 px-2 rounded-sm cursor-pointer transition-colors',
|
|
42
|
+
'hover:bg-accent hover:text-accent-foreground',
|
|
43
|
+
isOpen && hasChildren && 'bg-accent/50'
|
|
39
44
|
)}
|
|
40
45
|
onClick={handleClick}
|
|
41
46
|
>
|
|
42
|
-
{/* Indentation adjustment triggered by parent's padding/margin, not calculated prop here to allow CSS lines */}
|
|
43
|
-
|
|
44
47
|
{hasChildren ? (
|
|
45
48
|
<button
|
|
46
49
|
onClick={handleToggle}
|
|
47
|
-
className="mr-2 p-0.5 h-5 w-5 flex items-center justify-center rounded-sm hover:bg-
|
|
50
|
+
className="mr-2 p-0.5 h-5 w-5 flex items-center justify-center rounded-sm hover:bg-muted text-muted-foreground transition-colors"
|
|
48
51
|
>
|
|
49
52
|
{isOpen ? (
|
|
50
|
-
<ChevronDown className="h-4 w-4
|
|
53
|
+
<ChevronDown className="h-4 w-4" />
|
|
51
54
|
) : (
|
|
52
55
|
<ChevronRight className="h-4 w-4" />
|
|
53
56
|
)}
|
|
54
57
|
</button>
|
|
55
58
|
) : (
|
|
56
59
|
<span className="mr-2 w-5 flex justify-center">
|
|
57
|
-
<div className="w-1 h-1 rounded-full bg-
|
|
60
|
+
<div className="w-1 h-1 rounded-full bg-muted-foreground/50" />
|
|
58
61
|
</span>
|
|
59
62
|
)}
|
|
60
63
|
|
|
61
64
|
{node.icon === 'folder' || hasChildren ? (
|
|
62
65
|
isOpen ?
|
|
63
|
-
<FolderOpen className="h-4 w-4 mr-2 text-
|
|
64
|
-
<Folder className="h-4 w-4 mr-2 text-
|
|
66
|
+
<FolderOpen className="h-4 w-4 mr-2 text-primary" /> :
|
|
67
|
+
<Folder className="h-4 w-4 mr-2 text-muted-foreground group-hover:text-primary transition-colors" />
|
|
65
68
|
) : (
|
|
66
|
-
<File className="h-4 w-4 mr-2 text-
|
|
69
|
+
<File className="h-4 w-4 mr-2 text-muted-foreground group-hover:text-primary transition-colors" />
|
|
67
70
|
)}
|
|
68
71
|
|
|
69
72
|
<span className={cn(
|
|
70
|
-
"text-sm
|
|
71
|
-
isOpen ? "
|
|
73
|
+
"text-sm transition-colors",
|
|
74
|
+
isOpen ? "font-medium text-foreground" : "text-muted-foreground group-hover:text-foreground"
|
|
72
75
|
)}>
|
|
73
76
|
{node.label}
|
|
74
77
|
</span>
|
|
75
78
|
</div>
|
|
76
79
|
|
|
77
|
-
{/* Children Container with Circuit Line */}
|
|
78
80
|
{hasChildren && isOpen && (
|
|
79
|
-
<div className="relative ml-[11px] pl-3 border-l border-
|
|
80
|
-
{/* Decorative little bulb at the junction */}
|
|
81
|
-
<div className="absolute top-0 -left-[1px] -translate-x-1/2 w-1.5 h-1.5 bg-cyan-700/50 rounded-full" />
|
|
82
|
-
|
|
81
|
+
<div className="relative ml-[11px] pl-3 border-l border-border animate-in slide-in-from-left-2 fade-in duration-200">
|
|
83
82
|
{node.children!.map((child) => (
|
|
84
83
|
<TreeNodeComponent
|
|
85
84
|
key={child.id}
|
|
86
85
|
node={child}
|
|
87
86
|
onNodeClick={onNodeClick}
|
|
88
|
-
isChild={true}
|
|
89
87
|
/>
|
|
90
88
|
))}
|
|
91
|
-
|
|
92
|
-
{/* Decorative end cap */}
|
|
93
|
-
<div className="absolute bottom-0 -left-[1px] -translate-x-1/2 w-1 h-1 bg-cyan-800/50 rounded-full" />
|
|
94
89
|
</div>
|
|
95
90
|
)}
|
|
96
91
|
</div>
|
|
@@ -105,25 +100,24 @@ ComponentRegistry.register('tree-view',
|
|
|
105
100
|
}
|
|
106
101
|
};
|
|
107
102
|
|
|
103
|
+
// Support data binding
|
|
104
|
+
const boundData = useDataScope(schema.bind);
|
|
105
|
+
const nodes = boundData || schema.nodes || schema.data || [];
|
|
106
|
+
|
|
108
107
|
return (
|
|
109
108
|
<div className={cn(
|
|
110
|
-
'relative border
|
|
111
|
-
'shadow-lg shadow-primary/5',
|
|
109
|
+
'relative border rounded-lg p-3 bg-card text-card-foreground',
|
|
112
110
|
className
|
|
113
111
|
)}
|
|
114
112
|
{...props}
|
|
115
113
|
>
|
|
116
|
-
{/* Background Grid */}
|
|
117
|
-
<div className="absolute inset-0 bg-[linear-gradient(to_right,hsl(var(--border)/0.1)_1px,transparent_1px),linear-gradient(to_bottom,hsl(var(--border)/0.1)_1px,transparent_1px)] bg-[size:24px_24px] pointer-events-none" />
|
|
118
|
-
|
|
119
114
|
{schema.title && (
|
|
120
|
-
<div className="flex items-center gap-2 mb-3 pb-2 border-b
|
|
121
|
-
<
|
|
122
|
-
<h3 className="text-xs font-bold font-mono uppercase tracking-widest text-primary">{schema.title}</h3>
|
|
115
|
+
<div className="flex items-center gap-2 mb-3 pb-2 border-b">
|
|
116
|
+
<h3 className="text-sm font-semibold">{schema.title}</h3>
|
|
123
117
|
</div>
|
|
124
118
|
)}
|
|
125
|
-
<div className="space-y-1
|
|
126
|
-
{
|
|
119
|
+
<div className="space-y-1">
|
|
120
|
+
{nodes.map((node: TreeNode) => (
|
|
127
121
|
<TreeNodeComponent
|
|
128
122
|
key={node.id}
|
|
129
123
|
node={node}
|
|
@@ -135,6 +129,7 @@ ComponentRegistry.register('tree-view',
|
|
|
135
129
|
);
|
|
136
130
|
},
|
|
137
131
|
{
|
|
132
|
+
namespace: 'ui',
|
|
138
133
|
label: 'Tree View',
|
|
139
134
|
inputs: [
|
|
140
135
|
{ name: 'title', type: 'string', label: 'Title' },
|
|
@@ -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 { AccordionSchema } from '@object-ui/types';
|
|
3
11
|
import {
|
|
@@ -22,6 +30,7 @@ ComponentRegistry.register('accordion',
|
|
|
22
30
|
</Accordion>
|
|
23
31
|
),
|
|
24
32
|
{
|
|
33
|
+
namespace: 'ui',
|
|
25
34
|
label: 'Accordion',
|
|
26
35
|
inputs: [
|
|
27
36
|
{ name: 'accordionType', type: 'enum', enum: ['single', 'multiple'], defaultValue: 'single', label: 'Type' },
|
|
@@ -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 { CollapsibleSchema } from '@object-ui/types';
|
|
3
11
|
import {
|
|
@@ -19,6 +27,7 @@ ComponentRegistry.register('collapsible',
|
|
|
19
27
|
</Collapsible>
|
|
20
28
|
),
|
|
21
29
|
{
|
|
30
|
+
namespace: 'ui',
|
|
22
31
|
label: 'Collapsible',
|
|
23
32
|
inputs: [
|
|
24
33
|
{ name: 'defaultOpen', type: 'boolean', label: 'Default Open' },
|
|
@@ -1,2 +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 './accordion';
|
|
2
10
|
import './collapsible';
|
|
11
|
+
import './toggle-group';
|
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
|
|
9
|
+
import { ComponentRegistry } from '@object-ui/core';
|
|
10
|
+
import type { ToggleGroupSchema } from '@object-ui/types';
|
|
11
|
+
import { ToggleGroup, ToggleGroupItem } from '../../ui/toggle-group';
|
|
12
|
+
|
|
13
|
+
ComponentRegistry.register('toggle-group',
|
|
14
|
+
({ schema, ...props }: { schema: ToggleGroupSchema; [key: string]: any }) => {
|
|
15
|
+
const {
|
|
16
|
+
'data-obj-id': dataObjId,
|
|
17
|
+
'data-obj-type': dataObjType,
|
|
18
|
+
style,
|
|
19
|
+
type, // Extract type to prevent overriding the one we set below
|
|
20
|
+
...toggleGroupProps
|
|
21
|
+
} = props;
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<ToggleGroup
|
|
25
|
+
type={(schema.selectionType || 'single') as any}
|
|
26
|
+
variant={schema.variant}
|
|
27
|
+
size={schema.size}
|
|
28
|
+
value={schema.value as any}
|
|
29
|
+
className={schema.className}
|
|
30
|
+
{...toggleGroupProps}
|
|
31
|
+
{...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
|
|
32
|
+
>
|
|
33
|
+
{schema.items?.map((item, idx) => (
|
|
34
|
+
<ToggleGroupItem key={idx} value={item.value} aria-label={item.label}>
|
|
35
|
+
{item.label}
|
|
36
|
+
</ToggleGroupItem>
|
|
37
|
+
))}
|
|
38
|
+
</ToggleGroup>
|
|
39
|
+
);
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
namespace: 'ui',
|
|
43
|
+
label: 'Toggle Group',
|
|
44
|
+
inputs: [
|
|
45
|
+
{
|
|
46
|
+
name: 'selectionType',
|
|
47
|
+
type: 'enum',
|
|
48
|
+
enum: ['single', 'multiple'],
|
|
49
|
+
defaultValue: 'single',
|
|
50
|
+
label: 'Selection Type'
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'variant',
|
|
54
|
+
type: 'enum',
|
|
55
|
+
enum: ['default', 'outline'],
|
|
56
|
+
defaultValue: 'default',
|
|
57
|
+
label: 'Variant'
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'size',
|
|
61
|
+
type: 'enum',
|
|
62
|
+
enum: ['default', 'sm', 'lg'],
|
|
63
|
+
defaultValue: 'default',
|
|
64
|
+
label: 'Size'
|
|
65
|
+
},
|
|
66
|
+
{ name: 'className', type: 'string', label: 'CSS Class' }
|
|
67
|
+
],
|
|
68
|
+
defaultProps: {
|
|
69
|
+
selectionType: 'single',
|
|
70
|
+
variant: 'default',
|
|
71
|
+
size: 'default',
|
|
72
|
+
items: [
|
|
73
|
+
{ value: 'bold', label: 'Bold' },
|
|
74
|
+
{ value: 'italic', label: 'Italic' },
|
|
75
|
+
{ value: 'underline', label: 'Underline' }
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
);
|