@object-ui/components 0.3.1 → 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.
Files changed (299) hide show
  1. package/.turbo/turbo-build.log +47 -0
  2. package/README.md +13 -0
  3. package/dist/index.css +1 -1
  4. package/dist/index.js +34610 -24854
  5. package/dist/index.umd.cjs +53 -32
  6. package/dist/src/SchemaRenderer.d.ts +3 -0
  7. package/dist/src/{ui → custom}/button-group.d.ts +1 -1
  8. package/dist/src/custom/field.d.ts +19 -0
  9. package/dist/src/custom/index.d.ts +12 -0
  10. package/dist/src/custom/input-group.d.ts +14 -0
  11. package/dist/src/{ui → custom}/item.d.ts +1 -1
  12. package/dist/src/custom/native-select.d.ts +12 -0
  13. package/dist/src/custom/sort-builder.d.ts +22 -0
  14. package/dist/src/index.d.ts +1 -0
  15. package/dist/src/renderers/data-display/table.d.ts +1 -1
  16. package/dist/src/renderers/layout/page.d.ts +1 -1
  17. package/dist/src/renderers/placeholders.d.ts +1 -1
  18. package/dist/src/ui/accordion.d.ts +4 -4
  19. package/dist/src/ui/alert-dialog.d.ts +17 -11
  20. package/dist/src/ui/alert.d.ts +4 -5
  21. package/dist/src/ui/aspect-ratio.d.ts +1 -1
  22. package/dist/src/ui/avatar.d.ts +3 -3
  23. package/dist/src/ui/badge.d.ts +3 -3
  24. package/dist/src/ui/breadcrumb.d.ts +16 -8
  25. package/dist/src/ui/calendar.d.ts +7 -7
  26. package/dist/src/ui/card.d.ts +7 -8
  27. package/dist/src/ui/carousel.d.ts +5 -6
  28. package/dist/src/ui/chart.d.ts +62 -0
  29. package/dist/src/ui/checkbox.d.ts +1 -1
  30. package/dist/src/ui/collapsible.d.ts +3 -3
  31. package/dist/src/ui/command.d.ts +78 -16
  32. package/dist/src/ui/context-menu.d.ts +14 -12
  33. package/dist/src/ui/dialog.d.ts +17 -13
  34. package/dist/src/ui/drawer.d.ts +19 -10
  35. package/dist/src/ui/dropdown-menu.d.ts +20 -18
  36. package/dist/src/ui/form.d.ts +6 -7
  37. package/dist/src/ui/hover-card.d.ts +3 -3
  38. package/dist/src/ui/index.d.ts +2 -8
  39. package/dist/src/ui/input-otp.d.ts +30 -7
  40. package/dist/src/ui/label.d.ts +2 -1
  41. package/dist/src/ui/menubar.d.ts +19 -17
  42. package/dist/src/ui/navigation-menu.d.ts +9 -11
  43. package/dist/src/ui/pagination.d.ts +25 -10
  44. package/dist/src/ui/popover.d.ts +4 -5
  45. package/dist/src/ui/progress.d.ts +1 -1
  46. package/dist/src/ui/radio-group.d.ts +2 -2
  47. package/dist/src/ui/resizable.d.ts +5 -8
  48. package/dist/src/ui/scroll-area.d.ts +2 -2
  49. package/dist/src/ui/select.d.ts +11 -13
  50. package/dist/src/ui/sheet.d.ts +23 -11
  51. package/dist/src/ui/sidebar.d.ts +27 -29
  52. package/dist/src/ui/skeleton.d.ts +1 -1
  53. package/dist/src/ui/slider.d.ts +1 -1
  54. package/dist/src/ui/sonner.d.ts +2 -1
  55. package/dist/src/ui/switch.d.ts +2 -2
  56. package/dist/src/ui/tabs.d.ts +1 -1
  57. package/dist/src/ui/textarea.d.ts +1 -1
  58. package/dist/src/ui/toast.d.ts +22 -0
  59. package/dist/src/ui/toggle-group.d.ts +8 -3
  60. package/dist/src/ui/toggle.d.ts +4 -1
  61. package/dist/src/ui/tooltip.d.ts +4 -4
  62. package/dist/src/ui/typography.d.ts +21 -0
  63. package/package.json +17 -7
  64. package/shadcn-components.json +52 -47
  65. package/src/SchemaRenderer.tsx +28 -0
  66. package/src/__tests__/PageRendererRegions.test.tsx +59 -0
  67. package/src/__tests__/Registry.test.ts +21 -0
  68. package/src/__tests__/basic-renderers.test.tsx +1 -1
  69. package/src/__tests__/complex-disclosure-renderers.test.tsx +3 -2
  70. package/src/__tests__/feedback-overlay-renderers.test.tsx +1 -1
  71. package/src/__tests__/form-renderers.test.tsx +1 -1
  72. package/src/__tests__/layout-data-renderers.test.tsx +1 -1
  73. package/src/{ui → custom}/button-group.tsx +1 -1
  74. package/src/{ui → custom}/combobox.tsx +3 -3
  75. package/src/{ui → custom}/date-picker.tsx +3 -3
  76. package/src/custom/field.tsx +81 -0
  77. package/src/{ui → custom}/filter-builder.tsx +3 -3
  78. package/src/custom/index.ts +12 -0
  79. package/src/custom/input-group.tsx +53 -0
  80. package/src/{ui → custom}/item.tsx +1 -1
  81. package/src/custom/native-select.tsx +33 -0
  82. package/src/custom/sort-builder.tsx +129 -0
  83. package/src/index.css +20 -1
  84. package/src/index.ts +1 -0
  85. package/src/renderers/basic/button-group.tsx +1 -0
  86. package/src/renderers/basic/div.tsx +12 -1
  87. package/src/renderers/basic/html.tsx +1 -0
  88. package/src/renderers/basic/icon.tsx +1 -0
  89. package/src/renderers/basic/image.tsx +1 -0
  90. package/src/renderers/basic/navigation-menu.tsx +1 -0
  91. package/src/renderers/basic/pagination.tsx +31 -4
  92. package/src/renderers/basic/separator.tsx +1 -0
  93. package/src/renderers/basic/span.tsx +12 -1
  94. package/src/renderers/basic/text.tsx +4 -2
  95. package/src/renderers/complex/carousel.tsx +1 -0
  96. package/src/renderers/complex/data-table.tsx +134 -95
  97. package/src/renderers/complex/filter-builder.tsx +2 -1
  98. package/src/renderers/complex/resizable.tsx +2 -1
  99. package/src/renderers/complex/scroll-area.tsx +25 -7
  100. package/src/renderers/complex/table.tsx +1 -0
  101. package/src/renderers/data-display/alert.tsx +1 -0
  102. package/src/renderers/data-display/avatar.tsx +1 -0
  103. package/src/renderers/data-display/badge.tsx +1 -0
  104. package/src/renderers/data-display/breadcrumb.tsx +1 -0
  105. package/src/renderers/data-display/kbd.tsx +1 -0
  106. package/src/renderers/data-display/list.tsx +21 -49
  107. package/src/renderers/data-display/statistic.tsx +21 -5
  108. package/src/renderers/data-display/table.tsx +21 -11
  109. package/src/renderers/data-display/tree-view.tsx +7 -1
  110. package/src/renderers/disclosure/accordion.tsx +1 -0
  111. package/src/renderers/disclosure/collapsible.tsx +1 -0
  112. package/src/renderers/disclosure/toggle-group.tsx +2 -0
  113. package/src/renderers/feedback/empty.tsx +1 -0
  114. package/src/renderers/feedback/loading.tsx +2 -1
  115. package/src/renderers/feedback/progress.tsx +1 -0
  116. package/src/renderers/feedback/skeleton.tsx +1 -0
  117. package/src/renderers/feedback/sonner.tsx +1 -0
  118. package/src/renderers/feedback/spinner.tsx +1 -0
  119. package/src/renderers/feedback/toast.tsx +1 -0
  120. package/src/renderers/feedback/toaster.tsx +1 -0
  121. package/src/renderers/form/button.tsx +35 -1
  122. package/src/renderers/form/calendar.tsx +1 -0
  123. package/src/renderers/form/checkbox.tsx +38 -16
  124. package/src/renderers/form/combobox.tsx +2 -1
  125. package/src/renderers/form/command.tsx +1 -0
  126. package/src/renderers/form/date-picker.tsx +1 -0
  127. package/src/renderers/form/file-upload.tsx +1 -0
  128. package/src/renderers/form/form.tsx +92 -15
  129. package/src/renderers/form/input-otp.tsx +1 -0
  130. package/src/renderers/form/input.tsx +3 -0
  131. package/src/renderers/form/label.tsx +1 -0
  132. package/src/renderers/form/radio-group.tsx +1 -0
  133. package/src/renderers/form/select.tsx +35 -15
  134. package/src/renderers/form/slider.tsx +1 -0
  135. package/src/renderers/form/switch.tsx +1 -0
  136. package/src/renderers/form/textarea.tsx +50 -27
  137. package/src/renderers/form/toggle.tsx +3 -45
  138. package/src/renderers/layout/aspect-ratio.tsx +2 -1
  139. package/src/renderers/layout/card.tsx +10 -2
  140. package/src/renderers/layout/container.tsx +1 -0
  141. package/src/renderers/layout/flex.tsx +1 -0
  142. package/src/renderers/layout/grid.tsx +23 -8
  143. package/src/renderers/layout/page.tsx +35 -23
  144. package/src/renderers/layout/semantic.tsx +1 -0
  145. package/src/renderers/layout/stack.tsx +2 -1
  146. package/src/renderers/layout/tabs.tsx +43 -17
  147. package/src/renderers/navigation/header-bar.tsx +1 -0
  148. package/src/renderers/navigation/sidebar.tsx +5 -0
  149. package/src/renderers/overlay/alert-dialog.tsx +1 -0
  150. package/src/renderers/overlay/context-menu.tsx +1 -0
  151. package/src/renderers/overlay/dialog.tsx +1 -0
  152. package/src/renderers/overlay/drawer.tsx +1 -0
  153. package/src/renderers/overlay/dropdown-menu.tsx +1 -0
  154. package/src/renderers/overlay/hover-card.tsx +1 -0
  155. package/src/renderers/overlay/menubar.tsx +1 -0
  156. package/src/renderers/overlay/popover.tsx +1 -0
  157. package/src/renderers/overlay/sheet.tsx +1 -0
  158. package/src/renderers/overlay/tooltip.tsx +1 -0
  159. package/src/renderers/placeholders.tsx +2 -2
  160. package/src/stories/CRMApp.stories.tsx +706 -0
  161. package/src/stories/Guide.mdx +55 -0
  162. package/src/stories/Introduction.mdx +34 -0
  163. package/src/stories/MockedData.stories.tsx +71 -0
  164. package/src/stories/assets/accessibility.png +0 -0
  165. package/src/stories/assets/accessibility.svg +1 -0
  166. package/src/stories/assets/addon-library.png +0 -0
  167. package/src/stories/assets/assets.png +0 -0
  168. package/src/stories/assets/avif-test-image.avif +0 -0
  169. package/src/stories/assets/context.png +0 -0
  170. package/src/stories/assets/discord.svg +1 -0
  171. package/src/stories/assets/docs.png +0 -0
  172. package/src/stories/assets/figma-plugin.png +0 -0
  173. package/src/stories/assets/github.svg +1 -0
  174. package/src/stories/assets/share.png +0 -0
  175. package/src/stories/assets/styling.png +0 -0
  176. package/src/stories/assets/testing.png +0 -0
  177. package/src/stories/assets/theming.png +0 -0
  178. package/src/stories/assets/tutorials.svg +1 -0
  179. package/src/stories/assets/youtube.svg +1 -0
  180. package/src/stories/button.css +30 -0
  181. package/src/stories/header.css +32 -0
  182. package/src/stories/page.css +68 -0
  183. package/src/stories-json/accordion.stories.tsx +43 -0
  184. package/src/stories-json/aggrid.stories.tsx +103 -0
  185. package/src/stories-json/alert.stories.tsx +39 -0
  186. package/src/stories-json/aspect-ratio.stories.tsx +34 -0
  187. package/src/stories-json/avatar.stories.tsx +38 -0
  188. package/src/stories-json/badge.stories.tsx +53 -0
  189. package/src/stories-json/breadcrumb.stories.tsx +30 -0
  190. package/src/stories-json/button-group.stories.tsx +43 -0
  191. package/src/stories-json/button.stories.tsx +73 -0
  192. package/src/stories-json/calendar.stories.tsx +85 -0
  193. package/src/stories-json/card.stories.tsx +48 -0
  194. package/src/stories-json/carousel.stories.tsx +33 -0
  195. package/src/stories-json/charts.stories.tsx +195 -0
  196. package/src/stories-json/chatbot.stories.tsx +248 -0
  197. package/src/stories-json/code-editor.stories.tsx +92 -0
  198. package/src/stories-json/collapsible.stories.tsx +40 -0
  199. package/src/stories-json/controls.stories.tsx +36 -0
  200. package/src/stories-json/dashboard.stories.tsx +318 -0
  201. package/src/stories-json/data-table.stories.tsx +60 -0
  202. package/src/stories-json/data_display_extras.stories.tsx +102 -0
  203. package/src/stories-json/date-picker.stories.tsx +28 -0
  204. package/src/stories-json/detail-view.stories.tsx +258 -0
  205. package/src/stories-json/dialog.stories.tsx +43 -0
  206. package/src/stories-json/feedback_extras.stories.tsx +40 -0
  207. package/src/stories-json/feedback_others.stories.tsx +46 -0
  208. package/src/stories-json/form_advanced.stories.tsx +117 -0
  209. package/src/stories-json/form_extras.stories.tsx +123 -0
  210. package/src/stories-json/grid.stories.tsx +56 -0
  211. package/src/stories-json/icon.stories.tsx +36 -0
  212. package/src/stories-json/input.stories.tsx +52 -0
  213. package/src/stories-json/kanban.stories.tsx +295 -0
  214. package/src/stories-json/layout_extended.stories.tsx +76 -0
  215. package/src/stories-json/layout_flex.stories.tsx +107 -0
  216. package/src/stories-json/list-view.stories.tsx +97 -0
  217. package/src/stories-json/markdown.stories.tsx +129 -0
  218. package/src/stories-json/menus.stories.tsx +63 -0
  219. package/src/stories-json/metric-card.stories.tsx +143 -0
  220. package/src/stories-json/navigation-menu.stories.tsx +37 -0
  221. package/src/stories-json/object-aggrid.stories.tsx +252 -0
  222. package/src/stories-json/object-form.stories.tsx +130 -0
  223. package/src/stories-json/object-gantt.stories.tsx +114 -0
  224. package/src/stories-json/object-grid.stories.tsx +157 -0
  225. package/src/stories-json/object-map.stories.tsx +116 -0
  226. package/src/stories-json/object-view.stories.tsx +118 -0
  227. package/src/stories-json/overlay_extras.stories.tsx +113 -0
  228. package/src/stories-json/overlay_others.stories.tsx +76 -0
  229. package/src/stories-json/page.stories.tsx +55 -0
  230. package/src/stories-json/reports.stories.tsx +163 -0
  231. package/src/stories-json/resizable.stories.tsx +44 -0
  232. package/src/stories-json/select.stories.tsx +34 -0
  233. package/src/stories-json/separator.stories.tsx +41 -0
  234. package/src/stories-json/sidebar.stories.tsx +147 -0
  235. package/src/stories-json/statistic.stories.tsx +44 -0
  236. package/src/stories-json/tabs.stories.tsx +51 -0
  237. package/src/stories-json/timeline.stories.tsx +188 -0
  238. package/src/stories-json/typography.stories.tsx +45 -0
  239. package/src/ui/accordion.tsx +47 -53
  240. package/src/ui/alert-dialog.tsx +103 -117
  241. package/src/ui/alert.tsx +35 -36
  242. package/src/ui/aspect-ratio.tsx +1 -5
  243. package/src/ui/avatar.tsx +41 -42
  244. package/src/ui/badge.tsx +6 -15
  245. package/src/ui/breadcrumb.tsx +81 -75
  246. package/src/ui/button.tsx +10 -11
  247. package/src/ui/calendar.tsx +178 -51
  248. package/src/ui/card.tsx +51 -110
  249. package/src/ui/carousel.tsx +136 -113
  250. package/src/ui/chart.tsx +367 -0
  251. package/src/ui/checkbox.tsx +20 -22
  252. package/src/ui/collapsible.tsx +5 -25
  253. package/src/ui/command.tsx +106 -135
  254. package/src/ui/context-menu.tsx +69 -116
  255. package/src/ui/dialog.tsx +94 -113
  256. package/src/ui/drawer.tsx +82 -99
  257. package/src/ui/dropdown-menu.tsx +134 -188
  258. package/src/ui/form.tsx +51 -40
  259. package/src/ui/hover-card.tsx +18 -33
  260. package/src/ui/index.ts +2 -8
  261. package/src/ui/input-otp.tsx +42 -52
  262. package/src/ui/input.tsx +13 -15
  263. package/src/ui/label.tsx +17 -15
  264. package/src/ui/menubar.tsx +188 -206
  265. package/src/ui/navigation-menu.tsx +96 -136
  266. package/src/ui/pagination.tsx +86 -96
  267. package/src/ui/popover.tsx +24 -41
  268. package/src/ui/progress.tsx +21 -22
  269. package/src/ui/radio-group.tsx +19 -20
  270. package/src/ui/resizable.tsx +32 -42
  271. package/src/ui/scroll-area.tsx +38 -48
  272. package/src/ui/select.tsx +129 -157
  273. package/src/ui/separator.tsx +2 -2
  274. package/src/ui/sheet.tsx +110 -107
  275. package/src/ui/sidebar.tsx +442 -408
  276. package/src/ui/skeleton.tsx +6 -11
  277. package/src/ui/slider.tsx +19 -54
  278. package/src/ui/sonner.tsx +19 -1
  279. package/src/ui/switch.tsx +19 -21
  280. package/src/ui/tabs.tsx +6 -37
  281. package/src/ui/textarea.tsx +8 -4
  282. package/src/ui/toast.tsx +137 -0
  283. package/src/ui/toggle-group.tsx +28 -37
  284. package/src/ui/toggle.tsx +19 -19
  285. package/src/ui/tooltip.tsx +21 -52
  286. package/src/ui/typography.tsx +85 -0
  287. package/tsconfig.json +1 -1
  288. package/vite.config.ts +9 -1
  289. package/vitest.config.ts +5 -0
  290. package/ISSUES_FOUND.md +0 -128
  291. /package/dist/src/{ui → custom}/combobox.d.ts +0 -0
  292. /package/dist/src/{ui → custom}/date-picker.d.ts +0 -0
  293. /package/dist/src/{ui → custom}/empty.d.ts +0 -0
  294. /package/dist/src/{ui → custom}/filter-builder.d.ts +0 -0
  295. /package/dist/src/{ui → custom}/kbd.d.ts +0 -0
  296. /package/dist/src/{ui → custom}/spinner.d.ts +0 -0
  297. /package/src/{ui → custom}/empty.tsx +0 -0
  298. /package/src/{ui → custom}/kbd.tsx +0 -0
  299. /package/src/{ui → custom}/spinner.tsx +0 -0
@@ -17,9 +17,18 @@ export const PageRenderer: React.FC<{ schema: PageSchema; className?: string; [k
17
17
  className,
18
18
  ...props
19
19
  }) => {
20
- // Support both body (legacy/playground) and children
21
- const content = schema.body || schema.children;
22
- const nodes = Array.isArray(content) ? content : (content ? [content] : []);
20
+ // Support regions (spec compliant), body (legacy), and children
21
+ let nodes: any[] = [];
22
+
23
+ if (schema.regions && schema.regions.length > 0) {
24
+ // If regions are present, flatten their components into the main flow
25
+ // Ideally, we might want a grid layout here, but linear stacking works for simple single-region pages
26
+ nodes = schema.regions.flatMap(r => r.components || []);
27
+ } else {
28
+ // Fallback to direct children/body
29
+ const content = schema.body || schema.children;
30
+ nodes = Array.isArray(content) ? content : (content ? [content] : []);
31
+ }
23
32
 
24
33
  // Extract designer-related props
25
34
  const {
@@ -68,23 +77,26 @@ export const PageRenderer: React.FC<{ schema: PageSchema; className?: string; [k
68
77
  );
69
78
  };
70
79
 
71
- ComponentRegistry.register(
72
- 'page',
73
- PageRenderer,
74
- {
75
- label: 'Page',
76
- icon: 'Layout',
77
- category: 'layout',
78
- inputs: [
79
- { name: 'title', type: 'string', label: 'Title' },
80
- { name: 'description', type: 'string', label: 'Description' },
81
- {
82
- name: 'body',
83
- type: 'array',
84
- label: 'Content',
85
- // @ts-expect-error - itemType is experimental/extended metadata
86
- itemType: 'component'
87
- }
88
- ]
89
- }
90
- );
80
+ const pageMeta: any = {
81
+ namespace: 'ui',
82
+ label: 'Page',
83
+ icon: 'Layout',
84
+ category: 'layout',
85
+ inputs: [
86
+ { name: 'title', type: 'string', label: 'Title' },
87
+ { name: 'description', type: 'string', label: 'Description' },
88
+ {
89
+ name: 'body',
90
+ type: 'array',
91
+ label: 'Content',
92
+ itemType: 'component'
93
+ }
94
+ ]
95
+ };
96
+
97
+ ComponentRegistry.register('page', PageRenderer, pageMeta);
98
+ ComponentRegistry.register('app', PageRenderer, { ...pageMeta, label: 'App Page' });
99
+ ComponentRegistry.register('utility', PageRenderer, { ...pageMeta, label: 'Utility Page' });
100
+ ComponentRegistry.register('home', PageRenderer, { ...pageMeta, label: 'Home Page' });
101
+ ComponentRegistry.register('record', PageRenderer, { ...pageMeta, label: 'Record Page' });
102
+
@@ -38,6 +38,7 @@ tags.forEach(tag => {
38
38
  Component.displayName = `Semantic${tag.charAt(0).toUpperCase() + tag.slice(1)}`;
39
39
 
40
40
  ComponentRegistry.register(tag, Component, {
41
+ namespace: 'ui',
41
42
  label: tag.charAt(0).toUpperCase() + tag.slice(1),
42
43
  category: 'layout',
43
44
  inputs: [
@@ -19,7 +19,7 @@ const StackRenderer = forwardRef<HTMLDivElement, { schema: StackSchema; classNam
19
19
  const direction = schema.direction || 'col';
20
20
  const justify = schema.justify || 'start';
21
21
  const align = schema.align || 'stretch'; // Stack items usually stretch
22
- const gap = schema.gap || 2;
22
+ const gap = schema.gap ?? (schema as any).spacing ?? 2;
23
23
  const wrap = schema.wrap || false;
24
24
 
25
25
  const stackClass = cn(
@@ -82,6 +82,7 @@ const StackRenderer = forwardRef<HTMLDivElement, { schema: StackSchema; classNam
82
82
  ComponentRegistry.register('stack',
83
83
  StackRenderer,
84
84
  {
85
+ namespace: 'ui',
85
86
  label: 'Stack',
86
87
  inputs: [
87
88
  {
@@ -15,39 +15,65 @@ import {
15
15
  TabsTrigger,
16
16
  TabsContent
17
17
  } from '../../ui';
18
+ import { cn } from '../../lib/utils';
19
+ import React from 'react';
18
20
 
19
- ComponentRegistry.register('tabs',
20
- ({ schema, className, ...props }: { schema: TabsSchema; className?: string; [key: string]: any }) => {
21
- // Extract designer-related props
22
- const {
23
- 'data-obj-id': dataObjId,
24
- 'data-obj-type': dataObjType,
25
- style,
26
- ...tabsProps
27
- } = props;
21
+ const TabsRenderer = ({ schema, className, onChange, value, ...props }: { schema: TabsSchema; className?: string; onChange?: (val: string) => void; value?: string; [key: string]: any }) => {
22
+ // Extract designer-related props
23
+ const {
24
+ 'data-obj-id': dataObjId,
25
+ 'data-obj-type': dataObjType,
26
+ style,
27
+ ...tabsProps
28
+ } = props;
28
29
 
29
- return (
30
+ const handleValueChange = (val: string) => {
31
+ if (onChange) {
32
+ onChange(val);
33
+ }
34
+ };
35
+
36
+ const isVertical = schema.orientation === 'vertical';
37
+
38
+ return (
30
39
  <Tabs
31
- defaultValue={schema.defaultValue}
32
- className={className}
40
+ defaultValue={value === undefined ? schema.defaultValue : undefined}
41
+ value={value ?? schema.value}
42
+ onValueChange={handleValueChange}
43
+ orientation={schema.orientation || 'horizontal'}
44
+ className={cn(className, isVertical && "flex gap-2")}
33
45
  {...tabsProps}
34
46
  // Apply designer props
35
47
  {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
36
48
  >
37
- <TabsList>
49
+ <TabsList className={cn(isVertical && "flex-col h-auto items-stretch bg-muted/50 p-1")}>
38
50
  {schema.items?.map((item) => (
39
- <TabsTrigger key={item.value} value={item.value}>{item.label}</TabsTrigger>
51
+ <TabsTrigger
52
+ key={item.value}
53
+ value={item.value}
54
+ disabled={item.disabled}
55
+ className={cn(isVertical && "justify-start")}
56
+ >
57
+ {item.label}
58
+ </TabsTrigger>
40
59
  ))}
41
60
  </TabsList>
42
61
  {schema.items?.map((item) => (
43
- <TabsContent key={item.value} value={item.value}>
44
- {renderChildren((item as any).body)}
62
+ <TabsContent
63
+ key={item.value}
64
+ value={item.value}
65
+ className={cn("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2", isVertical && "mt-0 flex-1")}
66
+ >
67
+ {renderChildren(item.content || (item as any).body)}
45
68
  </TabsContent>
46
69
  ))}
47
70
  </Tabs>
48
71
  );
49
- },
72
+ };
73
+
74
+ ComponentRegistry.register('tabs', TabsRenderer,
50
75
  {
76
+ namespace: 'ui',
51
77
  label: 'Tabs',
52
78
  inputs: [
53
79
  { name: 'defaultValue', type: 'string', label: 'Default Value', required: true },
@@ -44,6 +44,7 @@ ComponentRegistry.register('header-bar',
44
44
  </header>
45
45
  ),
46
46
  {
47
+ namespace: 'ui',
47
48
  label: 'Header Bar',
48
49
  inputs: [
49
50
  { name: 'crumbs', type: 'array', label: 'Breadcrumbs' }
@@ -30,6 +30,7 @@ ComponentRegistry.register('sidebar-provider',
30
30
  <SidebarProvider {...props}>{renderChildren(schema.body)}</SidebarProvider>
31
31
  ),
32
32
  {
33
+ namespace: 'ui',
33
34
  label: 'Sidebar Provider',
34
35
  inputs: [
35
36
  { name: 'defaultOpen', type: 'boolean', label: 'Default Open', defaultValue: true }
@@ -49,6 +50,7 @@ ComponentRegistry.register('sidebar',
49
50
  <Sidebar {...props}>{renderChildren(schema.body)}</Sidebar>
50
51
  ),
51
52
  {
53
+ namespace: 'ui',
52
54
  label: 'Sidebar',
53
55
  inputs: [
54
56
  { name: 'collapsible', type: 'enum', enum: ['offcanvas', 'icon', 'none'], defaultValue: 'icon', label: 'Collapsible' },
@@ -102,6 +104,7 @@ ComponentRegistry.register('sidebar-group',
102
104
  </SidebarGroup>
103
105
  ),
104
106
  {
107
+ namespace: 'ui',
105
108
  label: 'Sidebar Group',
106
109
  inputs: [
107
110
  { name: 'label', type: 'string', label: 'Label' }
@@ -147,6 +150,7 @@ ComponentRegistry.register('sidebar-menu-button',
147
150
  </SidebarMenuButton>
148
151
  ),
149
152
  {
153
+ namespace: 'ui',
150
154
  label: 'Sidebar Menu Button',
151
155
  inputs: [
152
156
  { name: 'active', type: 'boolean', label: 'Active', defaultValue: false },
@@ -191,6 +195,7 @@ ComponentRegistry.register('sidebar-trigger',
191
195
  <SidebarTrigger className={className} {...props} />
192
196
  ),
193
197
  {
198
+ namespace: 'ui',
194
199
  label: 'Sidebar Trigger',
195
200
  inputs: [{ name: 'className', type: 'string', label: 'CSS Class' }]
196
201
  }
@@ -41,6 +41,7 @@ ComponentRegistry.register('alert-dialog',
41
41
  </AlertDialog>
42
42
  ),
43
43
  {
44
+ namespace: 'ui',
44
45
  label: 'Alert Dialog',
45
46
  inputs: [
46
47
  { name: 'title', type: 'string', label: 'Title' },
@@ -70,6 +70,7 @@ ComponentRegistry.register('context-menu',
70
70
  </ContextMenu>
71
71
  )},
72
72
  {
73
+ namespace: 'ui',
73
74
  label: 'Context Menu',
74
75
  inputs: [
75
76
  {
@@ -40,6 +40,7 @@ ComponentRegistry.register('dialog',
40
40
  </Dialog>
41
41
  ),
42
42
  {
43
+ namespace: 'ui',
43
44
  label: 'Dialog',
44
45
  inputs: [
45
46
  { name: 'title', type: 'string', label: 'Title' },
@@ -42,6 +42,7 @@ ComponentRegistry.register('drawer',
42
42
  </Drawer>
43
43
  ),
44
44
  {
45
+ namespace: 'ui',
45
46
  label: 'Drawer',
46
47
  inputs: [
47
48
  { name: 'title', type: 'string', label: 'Title' },
@@ -65,6 +65,7 @@ ComponentRegistry.register('dropdown-menu',
65
65
  </DropdownMenu>
66
66
  ),
67
67
  {
68
+ namespace: 'ui',
68
69
  label: 'Dropdown Menu',
69
70
  inputs: [
70
71
  { name: 'label', type: 'string', label: 'Menu Label' },
@@ -27,6 +27,7 @@ ComponentRegistry.register('hover-card',
27
27
  </HoverCard>
28
28
  ),
29
29
  {
30
+ namespace: 'ui',
30
31
  label: 'Hover Card',
31
32
  inputs: [
32
33
  { name: 'openDelay', type: 'number', label: 'Open Delay' },
@@ -54,6 +54,7 @@ ComponentRegistry.register('menubar',
54
54
  );
55
55
  },
56
56
  {
57
+ namespace: 'ui',
57
58
  label: 'Menubar',
58
59
  inputs: [
59
60
  { name: 'className', type: 'string', label: 'CSS Class' }
@@ -27,6 +27,7 @@ ComponentRegistry.register('popover',
27
27
  </Popover>
28
28
  ),
29
29
  {
30
+ namespace: 'ui',
30
31
  label: 'Popover',
31
32
  inputs: [
32
33
  { name: 'modal', type: 'boolean', label: 'Modal' },
@@ -40,6 +40,7 @@ ComponentRegistry.register('sheet',
40
40
  </Sheet>
41
41
  ),
42
42
  {
43
+ namespace: 'ui',
43
44
  label: 'Sheet',
44
45
  inputs: [
45
46
  { name: 'title', type: 'string', label: 'Title' },
@@ -34,6 +34,7 @@ ComponentRegistry.register('tooltip',
34
34
  </TooltipProvider>
35
35
  ),
36
36
  {
37
+ namespace: 'ui',
37
38
  label: 'Tooltip',
38
39
  inputs: [
39
40
  { name: 'delayDuration', type: 'number', label: 'Delay Duration', defaultValue: 700 },
@@ -11,7 +11,7 @@ import { ComponentRegistry } from '@object-ui/core';
11
11
  import { cn } from '../lib/utils';
12
12
  import { Box, FileQuestion } from 'lucide-react';
13
13
 
14
- export const PlaceholderRenderer = ({ schema, className, ...props }: any) => {
14
+ export const PlaceholderRenderer = ({ schema, className }: any) => {
15
15
  const type = schema.type;
16
16
  const isView = type.startsWith('view:');
17
17
  const isWidget = type.startsWith('widget:');
@@ -46,7 +46,7 @@ export const PlaceholderRenderer = ({ schema, className, ...props }: any) => {
46
46
  const PROTOCOL_COMPONENTS = [
47
47
  // 1. Views (List)
48
48
  'view:grid', 'view:kanban', 'view:map', 'view:calendar', 'view:gantt',
49
- 'view:timeline', 'view:gallery', 'view:spreadsheet',
49
+ 'view:timeline', 'view:gallery',
50
50
 
51
51
  // 2. Views (Form)
52
52
  'view:simple', 'view:wizard', 'view:tabbed', 'view:drawer', 'view:modal', 'view:split',