@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,190 @@
|
|
|
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 { render, RenderOptions } from '@testing-library/react';
|
|
10
|
+
import { ComponentRegistry } from '@object-ui/core';
|
|
11
|
+
import type { SchemaNode } from '@object-ui/types';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Test utility for rendering components from schema
|
|
15
|
+
*/
|
|
16
|
+
export function renderComponent(schema: SchemaNode, options?: RenderOptions) {
|
|
17
|
+
const Component = ComponentRegistry.get(schema.type);
|
|
18
|
+
|
|
19
|
+
if (!Component) {
|
|
20
|
+
throw new Error(`Component "${schema.type}" is not registered`);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return render(<Component schema={schema} />, options);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Check if a component has proper accessibility attributes
|
|
28
|
+
*/
|
|
29
|
+
export function checkAccessibility(element: HTMLElement): {
|
|
30
|
+
hasRole: boolean;
|
|
31
|
+
hasAriaLabel: boolean;
|
|
32
|
+
hasAriaDescribedBy: boolean;
|
|
33
|
+
issues: string[];
|
|
34
|
+
} {
|
|
35
|
+
const issues: string[] = [];
|
|
36
|
+
const hasRole = element.hasAttribute('role');
|
|
37
|
+
const hasAriaLabel = element.hasAttribute('aria-label') || element.hasAttribute('aria-labelledby');
|
|
38
|
+
const hasAriaDescribedBy = element.hasAttribute('aria-describedby');
|
|
39
|
+
|
|
40
|
+
// Check for interactive elements without labels
|
|
41
|
+
if (
|
|
42
|
+
element.tagName === 'BUTTON' ||
|
|
43
|
+
element.tagName === 'A' ||
|
|
44
|
+
element.getAttribute('role') === 'button'
|
|
45
|
+
) {
|
|
46
|
+
if (!element.textContent?.trim() && !hasAriaLabel) {
|
|
47
|
+
issues.push('Interactive element missing accessible label');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Check for form inputs without labels
|
|
52
|
+
if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT') {
|
|
53
|
+
const id = element.getAttribute('id');
|
|
54
|
+
const doc = element.ownerDocument || document;
|
|
55
|
+
const hasAssociatedLabel =
|
|
56
|
+
!!element.closest('label') ||
|
|
57
|
+
(!!id && !!doc.querySelector(`label[for="${id}"]`));
|
|
58
|
+
const hasLabel = hasAriaLabel || hasAssociatedLabel;
|
|
59
|
+
if (!hasLabel) {
|
|
60
|
+
issues.push('Form element missing label association');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
hasRole,
|
|
66
|
+
hasAriaLabel,
|
|
67
|
+
hasAriaDescribedBy,
|
|
68
|
+
issues,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Check DOM structure for common issues
|
|
74
|
+
*/
|
|
75
|
+
export function checkDOMStructure(container: HTMLElement): {
|
|
76
|
+
hasContent: boolean;
|
|
77
|
+
isEmpty: boolean;
|
|
78
|
+
hasChildren: boolean;
|
|
79
|
+
nestedDepth: number;
|
|
80
|
+
issues: string[];
|
|
81
|
+
} {
|
|
82
|
+
const issues: string[] = [];
|
|
83
|
+
const hasContent = container.textContent !== null && container.textContent.trim().length > 0;
|
|
84
|
+
const isEmpty = container.children.length === 0 && !hasContent;
|
|
85
|
+
const hasChildren = container.children.length > 0;
|
|
86
|
+
|
|
87
|
+
// Calculate nesting depth
|
|
88
|
+
let maxDepth = 0;
|
|
89
|
+
function getDepth(el: Element, depth = 0): number {
|
|
90
|
+
if (el.children.length === 0) return depth;
|
|
91
|
+
let max = depth;
|
|
92
|
+
for (const child of Array.from(el.children)) {
|
|
93
|
+
max = Math.max(max, getDepth(child, depth + 1));
|
|
94
|
+
}
|
|
95
|
+
return max;
|
|
96
|
+
}
|
|
97
|
+
maxDepth = getDepth(container);
|
|
98
|
+
|
|
99
|
+
// Check for excessive nesting (potential performance issue)
|
|
100
|
+
if (maxDepth > 20) {
|
|
101
|
+
issues.push(`Excessive DOM nesting detected: ${maxDepth} levels`);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Check for empty elements
|
|
105
|
+
if (isEmpty) {
|
|
106
|
+
issues.push('Component renders empty content');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
hasContent,
|
|
111
|
+
isEmpty,
|
|
112
|
+
hasChildren,
|
|
113
|
+
nestedDepth: maxDepth,
|
|
114
|
+
issues,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Validate component registration
|
|
120
|
+
*/
|
|
121
|
+
export function validateComponentRegistration(componentType: string): {
|
|
122
|
+
isRegistered: boolean;
|
|
123
|
+
hasConfig: boolean;
|
|
124
|
+
hasRenderer: boolean;
|
|
125
|
+
hasLabel: boolean;
|
|
126
|
+
hasInputs: boolean;
|
|
127
|
+
hasDefaultProps: boolean;
|
|
128
|
+
config: ReturnType<typeof ComponentRegistry.getConfig>;
|
|
129
|
+
} {
|
|
130
|
+
const isRegistered = ComponentRegistry.has(componentType);
|
|
131
|
+
const renderer = ComponentRegistry.get(componentType);
|
|
132
|
+
const config = ComponentRegistry.getConfig(componentType);
|
|
133
|
+
|
|
134
|
+
return {
|
|
135
|
+
isRegistered,
|
|
136
|
+
hasConfig: !!config,
|
|
137
|
+
hasRenderer: !!renderer,
|
|
138
|
+
hasLabel: !!config?.label,
|
|
139
|
+
hasInputs: !!config?.inputs && config.inputs.length > 0,
|
|
140
|
+
hasDefaultProps: !!config?.defaultProps,
|
|
141
|
+
config,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Get all display issues for a rendered component
|
|
147
|
+
*/
|
|
148
|
+
export function getAllDisplayIssues(container: HTMLElement): string[] {
|
|
149
|
+
const issues: string[] = [];
|
|
150
|
+
|
|
151
|
+
// Check DOM structure
|
|
152
|
+
const domCheck = checkDOMStructure(container);
|
|
153
|
+
issues.push(...domCheck.issues);
|
|
154
|
+
|
|
155
|
+
// Check accessibility for all interactive elements
|
|
156
|
+
const buttons = container.querySelectorAll('button, a, [role="button"], input, textarea, select');
|
|
157
|
+
buttons.forEach((element) => {
|
|
158
|
+
const a11yCheck = checkAccessibility(element as HTMLElement);
|
|
159
|
+
issues.push(...a11yCheck.issues);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// Check for missing keys in lists
|
|
163
|
+
const lists = container.querySelectorAll('[role="list"], ul, ol');
|
|
164
|
+
lists.forEach((list) => {
|
|
165
|
+
const items = list.children;
|
|
166
|
+
if (items.length > 0) {
|
|
167
|
+
// This is a simplified check - in React, keys are not in the DOM
|
|
168
|
+
// but we can check for duplicate content which might indicate missing keys
|
|
169
|
+
const contents = Array.from(items).map(item => item.textContent);
|
|
170
|
+
const contentCounts = new Map<string, number>();
|
|
171
|
+
contents.forEach(content => {
|
|
172
|
+
contentCounts.set(content || '', (contentCounts.get(content || '') || 0) + 1);
|
|
173
|
+
});
|
|
174
|
+
const hasDuplicates = Array.from(contentCounts.values()).some(count => count > 1);
|
|
175
|
+
if (hasDuplicates) {
|
|
176
|
+
issues.push(`Potential duplicate list items detected`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// Check for images without alt text
|
|
182
|
+
const images = container.querySelectorAll('img');
|
|
183
|
+
images.forEach((img) => {
|
|
184
|
+
if (!img.hasAttribute('alt')) {
|
|
185
|
+
issues.push('Image missing alt attribute');
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
return issues;
|
|
190
|
+
}
|
|
@@ -1,8 +1,16 @@
|
|
|
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 { Slot } from "@radix-ui/react-slot"
|
|
2
10
|
import { cva, type VariantProps } from "class-variance-authority"
|
|
3
11
|
|
|
4
12
|
import { cn } from "../lib/utils"
|
|
5
|
-
import { Separator } from "
|
|
13
|
+
import { Separator } from "../ui/separator"
|
|
6
14
|
|
|
7
15
|
const buttonGroupVariants = cva(
|
|
8
16
|
"flex w-fit items-stretch [&>*]:focus-visible:z-10 [&>*]:focus-visible:relative [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md has-[>[data-slot=button-group]]:gap-2",
|
|
@@ -0,0 +1,104 @@
|
|
|
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
|
+
"use client"
|
|
10
|
+
|
|
11
|
+
import * as React from "react"
|
|
12
|
+
import { Check, ChevronsUpDown } from "lucide-react"
|
|
13
|
+
|
|
14
|
+
import { cn } from "../lib/utils"
|
|
15
|
+
import { Button } from "../ui/button"
|
|
16
|
+
import {
|
|
17
|
+
Command,
|
|
18
|
+
CommandEmpty,
|
|
19
|
+
CommandGroup,
|
|
20
|
+
CommandInput,
|
|
21
|
+
CommandItem,
|
|
22
|
+
CommandList,
|
|
23
|
+
} from "../ui/command"
|
|
24
|
+
import {
|
|
25
|
+
Popover,
|
|
26
|
+
PopoverContent,
|
|
27
|
+
PopoverTrigger,
|
|
28
|
+
} from "../ui/popover"
|
|
29
|
+
|
|
30
|
+
export interface ComboboxOption {
|
|
31
|
+
value: string
|
|
32
|
+
label: string
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface ComboboxProps {
|
|
36
|
+
options: ComboboxOption[]
|
|
37
|
+
value?: string
|
|
38
|
+
onValueChange?: (value: string) => void
|
|
39
|
+
placeholder?: string
|
|
40
|
+
searchPlaceholder?: string
|
|
41
|
+
emptyText?: string
|
|
42
|
+
className?: string
|
|
43
|
+
disabled?: boolean
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function Combobox({
|
|
47
|
+
options,
|
|
48
|
+
value,
|
|
49
|
+
onValueChange,
|
|
50
|
+
placeholder = "Select option...",
|
|
51
|
+
searchPlaceholder = "Search...",
|
|
52
|
+
emptyText = "No option found.",
|
|
53
|
+
className,
|
|
54
|
+
disabled,
|
|
55
|
+
}: ComboboxProps) {
|
|
56
|
+
const [open, setOpen] = React.useState(false)
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
<Popover open={open} onOpenChange={setOpen}>
|
|
60
|
+
<PopoverTrigger asChild>
|
|
61
|
+
<Button
|
|
62
|
+
variant="outline"
|
|
63
|
+
role="combobox"
|
|
64
|
+
aria-expanded={open}
|
|
65
|
+
className={cn("w-[200px] justify-between", className)}
|
|
66
|
+
disabled={disabled}
|
|
67
|
+
>
|
|
68
|
+
{value
|
|
69
|
+
? options.find((option) => option.value === value)?.label
|
|
70
|
+
: placeholder}
|
|
71
|
+
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
|
72
|
+
</Button>
|
|
73
|
+
</PopoverTrigger>
|
|
74
|
+
<PopoverContent className="w-[200px] p-0">
|
|
75
|
+
<Command>
|
|
76
|
+
<CommandInput placeholder={searchPlaceholder} />
|
|
77
|
+
<CommandList>
|
|
78
|
+
<CommandEmpty>{emptyText}</CommandEmpty>
|
|
79
|
+
<CommandGroup>
|
|
80
|
+
{options.map((option) => (
|
|
81
|
+
<CommandItem
|
|
82
|
+
key={option.value}
|
|
83
|
+
value={option.value}
|
|
84
|
+
onSelect={(currentValue) => {
|
|
85
|
+
onValueChange?.(currentValue === value ? "" : currentValue)
|
|
86
|
+
setOpen(false)
|
|
87
|
+
}}
|
|
88
|
+
>
|
|
89
|
+
<Check
|
|
90
|
+
className={cn(
|
|
91
|
+
"mr-2 h-4 w-4",
|
|
92
|
+
value === option.value ? "opacity-100" : "opacity-0"
|
|
93
|
+
)}
|
|
94
|
+
/>
|
|
95
|
+
{option.label}
|
|
96
|
+
</CommandItem>
|
|
97
|
+
))}
|
|
98
|
+
</CommandGroup>
|
|
99
|
+
</CommandList>
|
|
100
|
+
</Command>
|
|
101
|
+
</PopoverContent>
|
|
102
|
+
</Popover>
|
|
103
|
+
)
|
|
104
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
"use client"
|
|
10
|
+
|
|
11
|
+
import * as React from "react"
|
|
12
|
+
import { CalendarIcon } from "lucide-react"
|
|
13
|
+
import { format } from "date-fns"
|
|
14
|
+
|
|
15
|
+
import { cn } from "../lib/utils"
|
|
16
|
+
import { Button } from "../ui/button"
|
|
17
|
+
import { Calendar } from "../ui/calendar"
|
|
18
|
+
import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover"
|
|
19
|
+
|
|
20
|
+
export interface DatePickerProps {
|
|
21
|
+
date?: Date
|
|
22
|
+
onDateChange?: (date: Date | undefined) => void
|
|
23
|
+
placeholder?: string
|
|
24
|
+
className?: string
|
|
25
|
+
disabled?: boolean
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function DatePicker({
|
|
29
|
+
date,
|
|
30
|
+
onDateChange,
|
|
31
|
+
placeholder = "Pick a date",
|
|
32
|
+
className,
|
|
33
|
+
disabled,
|
|
34
|
+
}: DatePickerProps) {
|
|
35
|
+
return (
|
|
36
|
+
<Popover>
|
|
37
|
+
<PopoverTrigger asChild>
|
|
38
|
+
<Button
|
|
39
|
+
variant={"outline"}
|
|
40
|
+
className={cn(
|
|
41
|
+
"w-[280px] justify-start text-left font-normal",
|
|
42
|
+
!date && "text-muted-foreground",
|
|
43
|
+
className
|
|
44
|
+
)}
|
|
45
|
+
disabled={disabled}
|
|
46
|
+
>
|
|
47
|
+
<CalendarIcon className="mr-2 h-4 w-4" />
|
|
48
|
+
{date ? format(date, "PPP") : <span>{placeholder}</span>}
|
|
49
|
+
</Button>
|
|
50
|
+
</PopoverTrigger>
|
|
51
|
+
<PopoverContent className="w-auto p-0">
|
|
52
|
+
<Calendar
|
|
53
|
+
mode="single"
|
|
54
|
+
selected={date}
|
|
55
|
+
onSelect={onDateChange}
|
|
56
|
+
initialFocus
|
|
57
|
+
/>
|
|
58
|
+
</PopoverContent>
|
|
59
|
+
</Popover>
|
|
60
|
+
)
|
|
61
|
+
}
|
|
@@ -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 { cva, type VariantProps } from "class-variance-authority"
|
|
2
10
|
|
|
3
11
|
import { cn } from "../lib/utils"
|
|
@@ -0,0 +1,81 @@
|
|
|
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 * as React from "react"
|
|
10
|
+
import { Slot } from "@radix-ui/react-slot"
|
|
11
|
+
import { cva, type VariantProps } from "class-variance-authority"
|
|
12
|
+
|
|
13
|
+
import { cn } from "../lib/utils"
|
|
14
|
+
import { Label } from "../ui/label"
|
|
15
|
+
|
|
16
|
+
const fieldVariants = cva("space-y-2")
|
|
17
|
+
|
|
18
|
+
export interface FieldProps
|
|
19
|
+
extends React.HTMLAttributes<HTMLDivElement>,
|
|
20
|
+
VariantProps<typeof fieldVariants> {
|
|
21
|
+
label?: React.ReactNode
|
|
22
|
+
description?: React.ReactNode
|
|
23
|
+
error?: React.ReactNode
|
|
24
|
+
required?: boolean
|
|
25
|
+
htmlFor?: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const Field = React.forwardRef<HTMLDivElement, FieldProps>(
|
|
29
|
+
({ className, label, description, error, required, htmlFor, children, ...props }, ref) => {
|
|
30
|
+
const id = React.useId()
|
|
31
|
+
const fieldId = htmlFor || id
|
|
32
|
+
const descriptionId = `${fieldId}-description`
|
|
33
|
+
const errorId = `${fieldId}-error`
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<div ref={ref} className={cn(fieldVariants(), className)} {...props}>
|
|
37
|
+
{label && (
|
|
38
|
+
<Label
|
|
39
|
+
htmlFor={fieldId}
|
|
40
|
+
className={cn(error && "text-destructive", required && "after:content-['*'] after:ml-0.5 after:text-destructive")}
|
|
41
|
+
>
|
|
42
|
+
{label}
|
|
43
|
+
</Label>
|
|
44
|
+
)}
|
|
45
|
+
|
|
46
|
+
<Slot
|
|
47
|
+
id={fieldId}
|
|
48
|
+
aria-describedby={
|
|
49
|
+
[description && descriptionId, error && errorId]
|
|
50
|
+
.filter(Boolean)
|
|
51
|
+
.join(" ") || undefined
|
|
52
|
+
}
|
|
53
|
+
aria-invalid={!!error}
|
|
54
|
+
>
|
|
55
|
+
{children}
|
|
56
|
+
</Slot>
|
|
57
|
+
|
|
58
|
+
{description && !error && (
|
|
59
|
+
<p
|
|
60
|
+
id={descriptionId}
|
|
61
|
+
className="text-[0.8rem] text-muted-foreground"
|
|
62
|
+
>
|
|
63
|
+
{description}
|
|
64
|
+
</p>
|
|
65
|
+
)}
|
|
66
|
+
|
|
67
|
+
{error && (
|
|
68
|
+
<p
|
|
69
|
+
id={errorId}
|
|
70
|
+
className="text-[0.8rem] font-medium text-destructive"
|
|
71
|
+
>
|
|
72
|
+
{error}
|
|
73
|
+
</p>
|
|
74
|
+
)}
|
|
75
|
+
</div>
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
)
|
|
79
|
+
Field.displayName = "Field"
|
|
80
|
+
|
|
81
|
+
export { Field }
|
|
@@ -1,12 +1,20 @@
|
|
|
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
|
"use client"
|
|
2
10
|
|
|
3
11
|
import * as React from "react"
|
|
4
12
|
import { X, Plus, Trash2 } from "lucide-react"
|
|
5
13
|
|
|
6
14
|
import { cn } from "../lib/utils"
|
|
7
|
-
import { Button } from "
|
|
8
|
-
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "
|
|
9
|
-
import { Input } from "
|
|
15
|
+
import { Button } from "../ui/button"
|
|
16
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../ui/select"
|
|
17
|
+
import { Input } from "../ui/input"
|
|
10
18
|
|
|
11
19
|
export interface FilterCondition {
|
|
12
20
|
id: string
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './button-group';
|
|
2
|
+
export * from './combobox';
|
|
3
|
+
export * from './date-picker';
|
|
4
|
+
export * from './empty';
|
|
5
|
+
export * from './field';
|
|
6
|
+
export * from './filter-builder';
|
|
7
|
+
export * from './input-group';
|
|
8
|
+
export * from './item';
|
|
9
|
+
export * from './kbd';
|
|
10
|
+
export * from './native-select';
|
|
11
|
+
export * from './spinner';
|
|
12
|
+
export * from './sort-builder';
|
|
@@ -0,0 +1,53 @@
|
|
|
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 * as React from "react"
|
|
10
|
+
import { cn } from "../lib/utils"
|
|
11
|
+
import { Input } from "../ui/input"
|
|
12
|
+
import { Button } from "../ui/button"
|
|
13
|
+
|
|
14
|
+
export interface InputGroupProps extends React.ComponentProps<"div"> {
|
|
15
|
+
startContent?: React.ReactNode
|
|
16
|
+
endContent?: React.ReactNode
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(
|
|
20
|
+
({ className, startContent, endContent, children, ...props }, ref) => {
|
|
21
|
+
return (
|
|
22
|
+
<div
|
|
23
|
+
ref={ref}
|
|
24
|
+
className={cn(
|
|
25
|
+
"flex w-full items-center rounded-md border border-input bg-transparent ring-offset-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2",
|
|
26
|
+
"has-[[data-invalid]]:border-destructive",
|
|
27
|
+
className
|
|
28
|
+
)}
|
|
29
|
+
{...props}
|
|
30
|
+
>
|
|
31
|
+
{startContent && (
|
|
32
|
+
<div className="flex items-center px-3 text-muted-foreground bg-muted/50 border-r h-full self-stretch rounded-l-md">
|
|
33
|
+
{startContent}
|
|
34
|
+
</div>
|
|
35
|
+
)}
|
|
36
|
+
|
|
37
|
+
{/* We need to process children to remove their default borders/rings if they are Inputs */}
|
|
38
|
+
<div className="flex-1 relative [&_input]:border-0 [&_input]:shadow-none [&_input]:focus-visible:ring-0 [&_input]:bg-transparent">
|
|
39
|
+
{children}
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
{endContent && (
|
|
43
|
+
<div className="flex items-center px-3 text-muted-foreground bg-muted/50 border-l h-full self-stretch rounded-r-md">
|
|
44
|
+
{endContent}
|
|
45
|
+
</div>
|
|
46
|
+
)}
|
|
47
|
+
</div>
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
InputGroup.displayName = "InputGroup"
|
|
52
|
+
|
|
53
|
+
export { InputGroup }
|
|
@@ -1,9 +1,17 @@
|
|
|
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 * as React from "react"
|
|
2
10
|
import { Slot } from "@radix-ui/react-slot"
|
|
3
11
|
import { cva, type VariantProps } from "class-variance-authority"
|
|
4
12
|
|
|
5
13
|
import { cn } from "../lib/utils"
|
|
6
|
-
import { Separator } from "
|
|
14
|
+
import { Separator } from "../ui/separator"
|
|
7
15
|
|
|
8
16
|
function ItemGroup({ className, ...props }: React.ComponentProps<"div">) {
|
|
9
17
|
return (
|
|
@@ -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 { cn } from "../lib/utils"
|
|
2
10
|
|
|
3
11
|
function Kbd({ className, ...props }: React.ComponentProps<"kbd">) {
|
|
@@ -0,0 +1,33 @@
|
|
|
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 * as React from "react"
|
|
10
|
+
import { cn } from "../lib/utils"
|
|
11
|
+
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
13
|
+
export interface NativeSelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {}
|
|
14
|
+
|
|
15
|
+
const NativeSelect = React.forwardRef<HTMLSelectElement, NativeSelectProps>(
|
|
16
|
+
({ className, children, ...props }, ref) => {
|
|
17
|
+
return (
|
|
18
|
+
<select
|
|
19
|
+
className={cn(
|
|
20
|
+
"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
|
|
21
|
+
className
|
|
22
|
+
)}
|
|
23
|
+
ref={ref}
|
|
24
|
+
{...props}
|
|
25
|
+
>
|
|
26
|
+
{children}
|
|
27
|
+
</select>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
)
|
|
31
|
+
NativeSelect.displayName = "NativeSelect"
|
|
32
|
+
|
|
33
|
+
export { NativeSelect }
|