@object-ui/components 0.3.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 (295) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/LICENSE +21 -0
  3. package/README.md +170 -0
  4. package/dist/index.css +1 -0
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.js +46186 -0
  7. package/dist/index.umd.cjs +92 -0
  8. package/dist/src/hooks/use-mobile.d.ts +1 -0
  9. package/dist/src/index.d.ts +2 -0
  10. package/dist/src/index.test.d.ts +1 -0
  11. package/dist/src/lib/utils.d.ts +4 -0
  12. package/dist/src/new-components.test.d.ts +1 -0
  13. package/dist/src/renderers/basic/div.d.ts +1 -0
  14. package/dist/src/renderers/basic/html.d.ts +1 -0
  15. package/dist/src/renderers/basic/icon.d.ts +1 -0
  16. package/dist/src/renderers/basic/image.d.ts +1 -0
  17. package/dist/src/renderers/basic/index.d.ts +0 -0
  18. package/dist/src/renderers/basic/separator.d.ts +1 -0
  19. package/dist/src/renderers/basic/span.d.ts +1 -0
  20. package/dist/src/renderers/basic/text.d.ts +1 -0
  21. package/dist/src/renderers/complex/__tests__/data-table.test.d.ts +0 -0
  22. package/dist/src/renderers/complex/calendar-view.d.ts +1 -0
  23. package/dist/src/renderers/complex/carousel.d.ts +1 -0
  24. package/dist/src/renderers/complex/chatbot.d.ts +1 -0
  25. package/dist/src/renderers/complex/chatbot.test.d.ts +1 -0
  26. package/dist/src/renderers/complex/data-table.d.ts +1 -0
  27. package/dist/src/renderers/complex/filter-builder.d.ts +1 -0
  28. package/dist/src/renderers/complex/index.d.ts +0 -0
  29. package/dist/src/renderers/complex/resizable.d.ts +1 -0
  30. package/dist/src/renderers/complex/scroll-area.d.ts +1 -0
  31. package/dist/src/renderers/complex/table.d.ts +1 -0
  32. package/dist/src/renderers/complex/timeline.d.ts +1 -0
  33. package/dist/src/renderers/data-display/alert.d.ts +1 -0
  34. package/dist/src/renderers/data-display/avatar.d.ts +1 -0
  35. package/dist/src/renderers/data-display/badge.d.ts +1 -0
  36. package/dist/src/renderers/data-display/index.d.ts +0 -0
  37. package/dist/src/renderers/data-display/list.d.ts +1 -0
  38. package/dist/src/renderers/data-display/statistic.d.ts +1 -0
  39. package/dist/src/renderers/data-display/tree-view.d.ts +1 -0
  40. package/dist/src/renderers/disclosure/accordion.d.ts +1 -0
  41. package/dist/src/renderers/disclosure/collapsible.d.ts +1 -0
  42. package/dist/src/renderers/disclosure/index.d.ts +0 -0
  43. package/dist/src/renderers/feedback/index.d.ts +0 -0
  44. package/dist/src/renderers/feedback/loading.d.ts +1 -0
  45. package/dist/src/renderers/feedback/progress.d.ts +1 -0
  46. package/dist/src/renderers/feedback/skeleton.d.ts +1 -0
  47. package/dist/src/renderers/feedback/toaster.d.ts +1 -0
  48. package/dist/src/renderers/form/button.d.ts +1 -0
  49. package/dist/src/renderers/form/calendar.d.ts +1 -0
  50. package/dist/src/renderers/form/checkbox.d.ts +1 -0
  51. package/dist/src/renderers/form/date-picker.d.ts +1 -0
  52. package/dist/src/renderers/form/file-upload.d.ts +1 -0
  53. package/dist/src/renderers/form/form.d.ts +1 -0
  54. package/dist/src/renderers/form/index.d.ts +0 -0
  55. package/dist/src/renderers/form/input-otp.d.ts +1 -0
  56. package/dist/src/renderers/form/input.d.ts +1 -0
  57. package/dist/src/renderers/form/label.d.ts +1 -0
  58. package/dist/src/renderers/form/radio-group.d.ts +1 -0
  59. package/dist/src/renderers/form/select.d.ts +1 -0
  60. package/dist/src/renderers/form/slider.d.ts +1 -0
  61. package/dist/src/renderers/form/switch.d.ts +1 -0
  62. package/dist/src/renderers/form/textarea.d.ts +1 -0
  63. package/dist/src/renderers/form/toggle.d.ts +1 -0
  64. package/dist/src/renderers/index.d.ts +0 -0
  65. package/dist/src/renderers/layout/card.d.ts +1 -0
  66. package/dist/src/renderers/layout/container.d.ts +1 -0
  67. package/dist/src/renderers/layout/flex.d.ts +1 -0
  68. package/dist/src/renderers/layout/grid.d.ts +1 -0
  69. package/dist/src/renderers/layout/index.d.ts +0 -0
  70. package/dist/src/renderers/layout/page.d.ts +7 -0
  71. package/dist/src/renderers/layout/semantic.d.ts +1 -0
  72. package/dist/src/renderers/layout/stack.d.ts +1 -0
  73. package/dist/src/renderers/layout/tabs.d.ts +1 -0
  74. package/dist/src/renderers/navigation/header-bar.d.ts +1 -0
  75. package/dist/src/renderers/navigation/index.d.ts +0 -0
  76. package/dist/src/renderers/navigation/sidebar.d.ts +1 -0
  77. package/dist/src/renderers/overlay/alert-dialog.d.ts +1 -0
  78. package/dist/src/renderers/overlay/context-menu.d.ts +1 -0
  79. package/dist/src/renderers/overlay/dialog.d.ts +1 -0
  80. package/dist/src/renderers/overlay/drawer.d.ts +1 -0
  81. package/dist/src/renderers/overlay/dropdown-menu.d.ts +1 -0
  82. package/dist/src/renderers/overlay/hover-card.d.ts +1 -0
  83. package/dist/src/renderers/overlay/index.d.ts +0 -0
  84. package/dist/src/renderers/overlay/popover.d.ts +1 -0
  85. package/dist/src/renderers/overlay/sheet.d.ts +1 -0
  86. package/dist/src/renderers/overlay/tooltip.d.ts +1 -0
  87. package/dist/src/ui/accordion.d.ts +7 -0
  88. package/dist/src/ui/alert-dialog.d.ts +14 -0
  89. package/dist/src/ui/alert.d.ts +9 -0
  90. package/dist/src/ui/aspect-ratio.d.ts +3 -0
  91. package/dist/src/ui/avatar.d.ts +6 -0
  92. package/dist/src/ui/badge.d.ts +9 -0
  93. package/dist/src/ui/breadcrumb.d.ts +11 -0
  94. package/dist/src/ui/button-group.d.ts +11 -0
  95. package/dist/src/ui/button.d.ts +13 -0
  96. package/dist/src/ui/calendar-view.d.ts +21 -0
  97. package/dist/src/ui/calendar.d.ts +8 -0
  98. package/dist/src/ui/card.d.ts +9 -0
  99. package/dist/src/ui/carousel.d.ts +19 -0
  100. package/dist/src/ui/chatbot.d.ts +36 -0
  101. package/dist/src/ui/checkbox.d.ts +4 -0
  102. package/dist/src/ui/collapsible.d.ts +5 -0
  103. package/dist/src/ui/command.d.ts +18 -0
  104. package/dist/src/ui/context-menu.d.ts +25 -0
  105. package/dist/src/ui/dialog.d.ts +15 -0
  106. package/dist/src/ui/drawer.d.ts +13 -0
  107. package/dist/src/ui/dropdown-menu.d.ts +25 -0
  108. package/dist/src/ui/empty.d.ts +11 -0
  109. package/dist/src/ui/field.d.ts +24 -0
  110. package/dist/src/ui/filter-builder.d.ts +31 -0
  111. package/dist/src/ui/form.d.ts +24 -0
  112. package/dist/src/ui/hover-card.d.ts +6 -0
  113. package/dist/src/ui/index.d.ts +56 -0
  114. package/dist/src/ui/input-group.d.ts +16 -0
  115. package/dist/src/ui/input-otp.d.ts +11 -0
  116. package/dist/src/ui/input.d.ts +3 -0
  117. package/dist/src/ui/item.d.ts +23 -0
  118. package/dist/src/ui/kbd.d.ts +3 -0
  119. package/dist/src/ui/label.d.ts +4 -0
  120. package/dist/src/ui/menubar.d.ts +26 -0
  121. package/dist/src/ui/navigation-menu.d.ts +14 -0
  122. package/dist/src/ui/pagination.d.ts +13 -0
  123. package/dist/src/ui/popover.d.ts +7 -0
  124. package/dist/src/ui/progress.d.ts +4 -0
  125. package/dist/src/ui/radio-group.d.ts +5 -0
  126. package/dist/src/ui/resizable.d.ts +10 -0
  127. package/dist/src/ui/scroll-area.d.ts +5 -0
  128. package/dist/src/ui/select.d.ts +15 -0
  129. package/dist/src/ui/separator.d.ts +4 -0
  130. package/dist/src/ui/sheet.d.ts +13 -0
  131. package/dist/src/ui/sidebar.d.ts +69 -0
  132. package/dist/src/ui/skeleton.d.ts +2 -0
  133. package/dist/src/ui/slider.d.ts +4 -0
  134. package/dist/src/ui/sonner.d.ts +3 -0
  135. package/dist/src/ui/spinner.d.ts +3 -0
  136. package/dist/src/ui/switch.d.ts +4 -0
  137. package/dist/src/ui/table.d.ts +10 -0
  138. package/dist/src/ui/tabs.d.ts +7 -0
  139. package/dist/src/ui/textarea.d.ts +3 -0
  140. package/dist/src/ui/timeline.d.ts +25 -0
  141. package/dist/src/ui/toggle-group.d.ts +9 -0
  142. package/dist/src/ui/toggle.d.ts +9 -0
  143. package/dist/src/ui/tooltip.d.ts +7 -0
  144. package/docs/FilterBuilder.md +268 -0
  145. package/metadata/Chart.component.yml +30 -0
  146. package/metadata/FilterBuilder.component.yml +39 -0
  147. package/metadata/GridLayout.component.yml +27 -0
  148. package/metadata/Menu.component.yml +31 -0
  149. package/metadata/ObjectForm.component.yml +34 -0
  150. package/metadata/ObjectTable.component.yml +41 -0
  151. package/metadata/Page.component.yml +24 -0
  152. package/package.json +87 -0
  153. package/postcss.config.js +6 -0
  154. package/src/hooks/use-mobile.tsx +19 -0
  155. package/src/index.css +76 -0
  156. package/src/index.test.ts +7 -0
  157. package/src/index.ts +10 -0
  158. package/src/lib/utils.tsx +27 -0
  159. package/src/new-components.test.ts +74 -0
  160. package/src/renderers/basic/div.tsx +41 -0
  161. package/src/renderers/basic/html.tsx +34 -0
  162. package/src/renderers/basic/icon.tsx +25 -0
  163. package/src/renderers/basic/image.tsx +37 -0
  164. package/src/renderers/basic/index.ts +7 -0
  165. package/src/renderers/basic/separator.tsx +48 -0
  166. package/src/renderers/basic/span.tsx +44 -0
  167. package/src/renderers/basic/text.tsx +42 -0
  168. package/src/renderers/complex/README-KANBAN.md +208 -0
  169. package/src/renderers/complex/TIMELINE.md +353 -0
  170. package/src/renderers/complex/__tests__/data-table.test.ts +52 -0
  171. package/src/renderers/complex/calendar-view.tsx +219 -0
  172. package/src/renderers/complex/carousel.tsx +60 -0
  173. package/src/renderers/complex/chatbot.test.ts +44 -0
  174. package/src/renderers/complex/chatbot.tsx +185 -0
  175. package/src/renderers/complex/data-table.tsx +650 -0
  176. package/src/renderers/complex/filter-builder.tsx +68 -0
  177. package/src/renderers/complex/index.ts +10 -0
  178. package/src/renderers/complex/resizable.tsx +54 -0
  179. package/src/renderers/complex/scroll-area.tsx +32 -0
  180. package/src/renderers/complex/table.tsx +86 -0
  181. package/src/renderers/complex/timeline.tsx +466 -0
  182. package/src/renderers/data-display/alert.tsx +37 -0
  183. package/src/renderers/data-display/avatar.tsx +29 -0
  184. package/src/renderers/data-display/badge.tsx +46 -0
  185. package/src/renderers/data-display/index.ts +6 -0
  186. package/src/renderers/data-display/list.tsx +95 -0
  187. package/src/renderers/data-display/statistic.tsx +98 -0
  188. package/src/renderers/data-display/tree-view.tsx +180 -0
  189. package/src/renderers/disclosure/accordion.tsx +60 -0
  190. package/src/renderers/disclosure/collapsible.tsx +44 -0
  191. package/src/renderers/disclosure/index.ts +2 -0
  192. package/src/renderers/feedback/index.ts +4 -0
  193. package/src/renderers/feedback/loading.tsx +69 -0
  194. package/src/renderers/feedback/progress.tsx +20 -0
  195. package/src/renderers/feedback/skeleton.tsx +22 -0
  196. package/src/renderers/feedback/toaster.tsx +26 -0
  197. package/src/renderers/form/button.tsx +61 -0
  198. package/src/renderers/form/calendar.tsx +25 -0
  199. package/src/renderers/form/checkbox.tsx +41 -0
  200. package/src/renderers/form/date-picker.tsx +75 -0
  201. package/src/renderers/form/file-upload.tsx +175 -0
  202. package/src/renderers/form/form.tsx +417 -0
  203. package/src/renderers/form/index.ts +16 -0
  204. package/src/renderers/form/input-otp.tsx +31 -0
  205. package/src/renderers/form/input.tsx +79 -0
  206. package/src/renderers/form/label.tsx +36 -0
  207. package/src/renderers/form/radio-group.tsx +54 -0
  208. package/src/renderers/form/select.tsx +66 -0
  209. package/src/renderers/form/slider.tsx +45 -0
  210. package/src/renderers/form/switch.tsx +39 -0
  211. package/src/renderers/form/textarea.tsx +45 -0
  212. package/src/renderers/form/toggle.tsx +76 -0
  213. package/src/renderers/index.ts +9 -0
  214. package/src/renderers/layout/card.tsx +69 -0
  215. package/src/renderers/layout/container.tsx +113 -0
  216. package/src/renderers/layout/flex.tsx +123 -0
  217. package/src/renderers/layout/grid.tsx +155 -0
  218. package/src/renderers/layout/index.ts +10 -0
  219. package/src/renderers/layout/page.tsx +82 -0
  220. package/src/renderers/layout/semantic.tsx +39 -0
  221. package/src/renderers/layout/stack.tsx +123 -0
  222. package/src/renderers/layout/tabs.tsx +63 -0
  223. package/src/renderers/navigation/header-bar.tsx +50 -0
  224. package/src/renderers/navigation/index.ts +2 -0
  225. package/src/renderers/navigation/sidebar.tsx +189 -0
  226. package/src/renderers/overlay/alert-dialog.tsx +63 -0
  227. package/src/renderers/overlay/context-menu.tsx +91 -0
  228. package/src/renderers/overlay/dialog.tsx +68 -0
  229. package/src/renderers/overlay/drawer.tsx +68 -0
  230. package/src/renderers/overlay/dropdown-menu.tsx +90 -0
  231. package/src/renderers/overlay/hover-card.tsx +46 -0
  232. package/src/renderers/overlay/index.ts +9 -0
  233. package/src/renderers/overlay/popover.tsx +47 -0
  234. package/src/renderers/overlay/sheet.tsx +68 -0
  235. package/src/renderers/overlay/tooltip.tsx +58 -0
  236. package/src/ui/accordion.tsx +64 -0
  237. package/src/ui/alert-dialog.tsx +155 -0
  238. package/src/ui/alert.tsx +78 -0
  239. package/src/ui/aspect-ratio.tsx +11 -0
  240. package/src/ui/avatar.tsx +51 -0
  241. package/src/ui/badge.tsx +46 -0
  242. package/src/ui/breadcrumb.tsx +109 -0
  243. package/src/ui/button-group.tsx +83 -0
  244. package/src/ui/button.tsx +65 -0
  245. package/src/ui/calendar-view.tsx +503 -0
  246. package/src/ui/calendar.tsx +237 -0
  247. package/src/ui/card.tsx +138 -0
  248. package/src/ui/carousel.tsx +239 -0
  249. package/src/ui/chatbot.tsx +240 -0
  250. package/src/ui/checkbox.tsx +32 -0
  251. package/src/ui/collapsible.tsx +31 -0
  252. package/src/ui/command.tsx +182 -0
  253. package/src/ui/context-menu.tsx +247 -0
  254. package/src/ui/dialog.tsx +141 -0
  255. package/src/ui/drawer.tsx +135 -0
  256. package/src/ui/dropdown-menu.tsx +254 -0
  257. package/src/ui/empty.tsx +104 -0
  258. package/src/ui/field.tsx +246 -0
  259. package/src/ui/filter-builder.tsx +359 -0
  260. package/src/ui/form.tsx +167 -0
  261. package/src/ui/hover-card.tsx +44 -0
  262. package/src/ui/index.ts +56 -0
  263. package/src/ui/input-group.tsx +170 -0
  264. package/src/ui/input-otp.tsx +81 -0
  265. package/src/ui/input.tsx +24 -0
  266. package/src/ui/item.tsx +193 -0
  267. package/src/ui/kbd.tsx +28 -0
  268. package/src/ui/label.tsx +24 -0
  269. package/src/ui/menubar.tsx +274 -0
  270. package/src/ui/navigation-menu.tsx +168 -0
  271. package/src/ui/pagination.tsx +127 -0
  272. package/src/ui/popover.tsx +48 -0
  273. package/src/ui/progress.tsx +41 -0
  274. package/src/ui/radio-group.tsx +45 -0
  275. package/src/ui/resizable.tsx +55 -0
  276. package/src/ui/scroll-area.tsx +58 -0
  277. package/src/ui/select.tsx +188 -0
  278. package/src/ui/separator.tsx +31 -0
  279. package/src/ui/sheet.tsx +137 -0
  280. package/src/ui/sidebar.tsx +726 -0
  281. package/src/ui/skeleton.tsx +20 -0
  282. package/src/ui/slider.tsx +63 -0
  283. package/src/ui/sonner.tsx +43 -0
  284. package/src/ui/spinner.tsx +38 -0
  285. package/src/ui/switch.tsx +31 -0
  286. package/src/ui/table.tsx +120 -0
  287. package/src/ui/tabs.tsx +86 -0
  288. package/src/ui/textarea.tsx +18 -0
  289. package/src/ui/timeline.tsx +266 -0
  290. package/src/ui/toggle-group.tsx +87 -0
  291. package/src/ui/toggle.tsx +50 -0
  292. package/src/ui/tooltip.tsx +61 -0
  293. package/tailwind.config.js +75 -0
  294. package/tsconfig.json +18 -0
  295. package/vite.config.ts +44 -0
@@ -0,0 +1,123 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { FlexSchema } from '@object-ui/types';
3
+ import { renderChildren } from '../../lib/utils';
4
+ import { cn } from '../../lib/utils';
5
+
6
+ ComponentRegistry.register('flex',
7
+ ({ schema, className, ...props }: { schema: FlexSchema; className?: string; [key: string]: any }) => {
8
+ const direction = schema.direction || 'row';
9
+ const justify = schema.justify || 'start';
10
+ const align = schema.align || 'start';
11
+ const gap = schema.gap || 2;
12
+ const wrap = schema.wrap || false;
13
+
14
+ const flexClass = cn(
15
+ 'flex',
16
+ // Direction
17
+ direction === 'row' && 'flex-row',
18
+ direction === 'col' && 'flex-col',
19
+ direction === 'row-reverse' && 'flex-row-reverse',
20
+ direction === 'col-reverse' && 'flex-col-reverse',
21
+ // Justify content
22
+ justify === 'start' && 'justify-start',
23
+ justify === 'end' && 'justify-end',
24
+ justify === 'center' && 'justify-center',
25
+ justify === 'between' && 'justify-between',
26
+ justify === 'around' && 'justify-around',
27
+ justify === 'evenly' && 'justify-evenly',
28
+ // Align items
29
+ align === 'start' && 'items-start',
30
+ align === 'end' && 'items-end',
31
+ align === 'center' && 'items-center',
32
+ align === 'baseline' && 'items-baseline',
33
+ align === 'stretch' && 'items-stretch',
34
+ // Gap
35
+ gap === 0 && 'gap-0',
36
+ gap === 1 && 'gap-1',
37
+ gap === 2 && 'gap-2',
38
+ gap === 3 && 'gap-3',
39
+ gap === 4 && 'gap-4',
40
+ gap === 5 && 'gap-5',
41
+ gap === 6 && 'gap-6',
42
+ gap === 7 && 'gap-7',
43
+ gap === 8 && 'gap-8',
44
+ // Wrap
45
+ wrap && 'flex-wrap',
46
+ className
47
+ );
48
+
49
+ // Extract designer-related props
50
+ const {
51
+ 'data-obj-id': dataObjId,
52
+ 'data-obj-type': dataObjType,
53
+ style,
54
+ ...flexProps
55
+ } = props;
56
+
57
+ return (
58
+ <div
59
+ className={flexClass}
60
+ {...flexProps}
61
+ // Apply designer props
62
+ data-obj-id={dataObjId}
63
+ data-obj-type={dataObjType}
64
+ style={style}
65
+ >
66
+ {schema.children && renderChildren(schema.children)}
67
+ </div>
68
+ );
69
+ },
70
+ {
71
+ label: 'Flex Layout',
72
+ inputs: [
73
+ {
74
+ name: 'direction',
75
+ type: 'enum',
76
+ enum: ['row', 'col', 'row-reverse', 'col-reverse'],
77
+ label: 'Direction',
78
+ defaultValue: 'row'
79
+ },
80
+ {
81
+ name: 'justify',
82
+ type: 'enum',
83
+ enum: ['start', 'end', 'center', 'between', 'around', 'evenly'],
84
+ label: 'Justify Content',
85
+ defaultValue: 'start'
86
+ },
87
+ {
88
+ name: 'align',
89
+ type: 'enum',
90
+ enum: ['start', 'end', 'center', 'baseline', 'stretch'],
91
+ label: 'Align Items',
92
+ defaultValue: 'start'
93
+ },
94
+ {
95
+ name: 'gap',
96
+ type: 'number',
97
+ label: 'Gap',
98
+ defaultValue: 2,
99
+ description: 'Gap between items (0-8)'
100
+ },
101
+ {
102
+ name: 'wrap',
103
+ type: 'boolean',
104
+ label: 'Wrap',
105
+ defaultValue: false,
106
+ description: 'Allow flex items to wrap'
107
+ },
108
+ { name: 'className', type: 'string', label: 'CSS Class' }
109
+ ],
110
+ defaultProps: {
111
+ direction: 'row',
112
+ justify: 'start',
113
+ align: 'center',
114
+ gap: 2,
115
+ wrap: false,
116
+ children: [
117
+ { type: 'button', label: 'Button 1' },
118
+ { type: 'button', label: 'Button 2' },
119
+ { type: 'button', label: 'Button 3' }
120
+ ]
121
+ }
122
+ }
123
+ );
@@ -0,0 +1,155 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { GridSchema } from '@object-ui/types';
3
+ import { renderChildren } from '../../lib/utils';
4
+ import { cn } from '../../lib/utils';
5
+
6
+ // Helper maps to ensure Tailwind classes are scanned and included
7
+ const GRID_COLS: Record<number, string> = {
8
+ 1: 'grid-cols-1', 2: 'grid-cols-2', 3: 'grid-cols-3', 4: 'grid-cols-4',
9
+ 5: 'grid-cols-5', 6: 'grid-cols-6', 7: 'grid-cols-7', 8: 'grid-cols-8',
10
+ 9: 'grid-cols-9', 10: 'grid-cols-10', 11: 'grid-cols-11', 12: 'grid-cols-12'
11
+ };
12
+
13
+ const GRID_COLS_SM: Record<number, string> = {
14
+ 1: 'sm:grid-cols-1', 2: 'sm:grid-cols-2', 3: 'sm:grid-cols-3', 4: 'sm:grid-cols-4',
15
+ 5: 'sm:grid-cols-5', 6: 'sm:grid-cols-6', 7: 'sm:grid-cols-7', 8: 'sm:grid-cols-8',
16
+ 9: 'sm:grid-cols-9', 10: 'sm:grid-cols-10', 11: 'sm:grid-cols-11', 12: 'sm:grid-cols-12'
17
+ };
18
+
19
+ const GRID_COLS_MD: Record<number, string> = {
20
+ 1: 'md:grid-cols-1', 2: 'md:grid-cols-2', 3: 'md:grid-cols-3', 4: 'md:grid-cols-4',
21
+ 5: 'md:grid-cols-5', 6: 'md:grid-cols-6', 7: 'md:grid-cols-7', 8: 'md:grid-cols-8',
22
+ 9: 'md:grid-cols-9', 10: 'md:grid-cols-10', 11: 'md:grid-cols-11', 12: 'md:grid-cols-12'
23
+ };
24
+
25
+ const GRID_COLS_LG: Record<number, string> = {
26
+ 1: 'lg:grid-cols-1', 2: 'lg:grid-cols-2', 3: 'lg:grid-cols-3', 4: 'lg:grid-cols-4',
27
+ 5: 'lg:grid-cols-5', 6: 'lg:grid-cols-6', 7: 'lg:grid-cols-7', 8: 'lg:grid-cols-8',
28
+ 9: 'lg:grid-cols-9', 10: 'lg:grid-cols-10', 11: 'lg:grid-cols-11', 12: 'lg:grid-cols-12'
29
+ };
30
+
31
+ const GRID_COLS_XL: Record<number, string> = {
32
+ 1: 'xl:grid-cols-1', 2: 'xl:grid-cols-2', 3: 'xl:grid-cols-3', 4: 'xl:grid-cols-4',
33
+ 5: 'xl:grid-cols-5', 6: 'xl:grid-cols-6', 7: 'xl:grid-cols-7', 8: 'xl:grid-cols-8',
34
+ 9: 'xl:grid-cols-9', 10: 'xl:grid-cols-10', 11: 'xl:grid-cols-11', 12: 'xl:grid-cols-12'
35
+ };
36
+
37
+ const GAPS: Record<number, string> = {
38
+ 0: 'gap-0', 1: 'gap-1', 2: 'gap-2', 3: 'gap-3', 4: 'gap-4',
39
+ 5: 'gap-5', 6: 'gap-6', 8: 'gap-8', 10: 'gap-10', 12: 'gap-12'
40
+ };
41
+
42
+ ComponentRegistry.register('grid',
43
+ ({ schema, className, ...props }: { schema: GridSchema & { smColumns?: number, mdColumns?: number, lgColumns?: number, xlColumns?: number }; className?: string; [key: string]: any }) => {
44
+ // Determine columns configuration
45
+ // Supports direct number or responsive object logic if schema allows,
46
+ // but here we primarily handle the flat properties supported by the designer inputs
47
+ const baseCols = typeof schema.columns === 'number' ? schema.columns : 2;
48
+ const smCols = schema.smColumns;
49
+ const mdCols = schema.mdColumns;
50
+ const lgCols = schema.lgColumns;
51
+ const xlCols = schema.xlColumns;
52
+
53
+ const gap = schema.gap ?? 4;
54
+
55
+ // Generate Tailwind grid classes
56
+ const gridClass = cn(
57
+ 'grid',
58
+ // Base columns
59
+ GRID_COLS[baseCols] || 'grid-cols-2',
60
+ // Responsive columns
61
+ smCols && GRID_COLS_SM[smCols],
62
+ mdCols && GRID_COLS_MD[mdCols],
63
+ lgCols && GRID_COLS_LG[lgCols],
64
+ xlCols && GRID_COLS_XL[xlCols],
65
+ // Gap
66
+ GAPS[gap] || 'gap-4',
67
+ className
68
+ );
69
+
70
+ // Extract designer-related props
71
+ const {
72
+ 'data-obj-id': dataObjId,
73
+ 'data-obj-type': dataObjType,
74
+ style,
75
+ ...gridProps
76
+ } = props;
77
+
78
+ return (
79
+ <div
80
+ className={gridClass}
81
+ {...gridProps}
82
+ // Apply designer props
83
+ data-obj-id={dataObjId}
84
+ data-obj-type={dataObjType}
85
+ style={style}
86
+ >
87
+ {schema.children && renderChildren(schema.children)}
88
+ </div>
89
+ );
90
+ },
91
+ {
92
+ label: 'Grid Layout',
93
+ inputs: [
94
+ {
95
+ name: 'columns',
96
+ type: 'number',
97
+ label: 'Base Columns (Mobile)',
98
+ defaultValue: 2,
99
+ description: 'Number of columns on mobile devices'
100
+ },
101
+ {
102
+ name: 'smColumns',
103
+ type: 'number',
104
+ label: 'SM Columns (Tablet)',
105
+ description: 'Columns at sm breakpoint (>640px)'
106
+ },
107
+ {
108
+ name: 'mdColumns',
109
+ type: 'number',
110
+ label: 'MD Columns (Laptop)',
111
+ description: 'Columns at md breakpoint (>768px)'
112
+ },
113
+ {
114
+ name: 'lgColumns',
115
+ type: 'number',
116
+ label: 'LG Columns (Desktop)',
117
+ description: 'Columns at lg breakpoint (>1024px)'
118
+ },
119
+ {
120
+ name: 'xlColumns',
121
+ type: 'number',
122
+ label: 'XL Columns (Wide)',
123
+ description: 'Columns at xl breakpoint (>1280px)'
124
+ },
125
+ {
126
+ name: 'gap',
127
+ type: 'number',
128
+ label: 'Gap',
129
+ defaultValue: 4,
130
+ description: 'Gap between items (0-12)'
131
+ },
132
+ { name: 'className', type: 'string', label: 'CSS Class' }
133
+ ],
134
+ defaultProps: {
135
+ columns: 1,
136
+ mdColumns: 2,
137
+ lgColumns: 4,
138
+ gap: 4,
139
+ children: [
140
+ { type: 'card', title: 'Card 1', description: 'First card' },
141
+ { type: 'card', title: 'Card 2', description: 'Second card' },
142
+ { type: 'card', title: 'Card 3', description: 'Third card' },
143
+ { type: 'card', title: 'Card 4', description: 'Fourth card' }
144
+ ]
145
+ },
146
+ isContainer: true,
147
+ resizable: true,
148
+ resizeConstraints: {
149
+ width: true,
150
+ height: true,
151
+ minWidth: 200,
152
+ minHeight: 100
153
+ }
154
+ }
155
+ );
@@ -0,0 +1,10 @@
1
+ import './card';
2
+ import './tabs';
3
+ import './grid';
4
+ import './flex';
5
+ import './stack';
6
+ import './container';
7
+ import './page';
8
+ import './semantic';
9
+
10
+
@@ -0,0 +1,82 @@
1
+ import React from 'react';
2
+ import { PageSchema } from '@object-ui/types';
3
+ import { SchemaRenderer } from '@object-ui/react';
4
+ import { ComponentRegistry } from '@object-ui/core';
5
+ import { cn } from '../../lib/utils'; // Keep internal import for utils
6
+
7
+ export const PageRenderer: React.FC<{ schema: PageSchema; className?: string; [key: string]: any }> = ({
8
+ schema,
9
+ className,
10
+ ...props
11
+ }) => {
12
+ // Support both body (legacy/playground) and children
13
+ const content = schema.body || schema.children;
14
+ const nodes = Array.isArray(content) ? content : (content ? [content] : []);
15
+
16
+ // Extract designer-related props
17
+ const {
18
+ 'data-obj-id': dataObjId,
19
+ 'data-obj-type': dataObjType,
20
+ style,
21
+ ...pageProps
22
+ } = props;
23
+
24
+ return (
25
+ <div
26
+ className={cn("min-h-full w-full bg-background p-6 md:p-8", className)}
27
+ {...pageProps}
28
+ // Apply designer props
29
+ data-obj-id={dataObjId}
30
+ data-obj-type={dataObjType}
31
+ style={style}
32
+ >
33
+ <div className="mx-auto max-w-7xl space-y-8">
34
+ {(schema.title || schema.description) && (
35
+ <div className="space-y-2">
36
+ {schema.title && (
37
+ <h1 className="text-3xl font-bold tracking-tight text-foreground">
38
+ {schema.title}
39
+ </h1>
40
+ )}
41
+ {schema.description && (
42
+ <p className="text-muted-foreground">
43
+ {schema.description}
44
+ </p>
45
+ )}
46
+ </div>
47
+ )}
48
+
49
+ <div className="space-y-6">
50
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
51
+ {nodes.map((node: any, index: number) => (
52
+ <SchemaRenderer
53
+ key={node?.id || index}
54
+ schema={node}
55
+ />
56
+ ))}
57
+ </div>
58
+ </div>
59
+ </div>
60
+ );
61
+ };
62
+
63
+ ComponentRegistry.register(
64
+ 'page',
65
+ PageRenderer,
66
+ {
67
+ label: 'Page',
68
+ icon: 'Layout',
69
+ category: 'layout',
70
+ inputs: [
71
+ { name: 'title', type: 'string', label: 'Title' },
72
+ { name: 'description', type: 'string', label: 'Description' },
73
+ {
74
+ name: 'body',
75
+ type: 'array',
76
+ label: 'Content',
77
+ // @ts-expect-error - itemType is experimental/extended metadata
78
+ itemType: 'component'
79
+ }
80
+ ]
81
+ }
82
+ );
@@ -0,0 +1,39 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import { renderChildren } from '../../lib/utils';
3
+ import { forwardRef } from 'react';
4
+
5
+ const tags = ['aside', 'main', 'header', 'nav', 'footer', 'section', 'article'] as const;
6
+
7
+ tags.forEach(tag => {
8
+ const Component = forwardRef<HTMLElement, any>(({ schema, className, ...props }, ref) => {
9
+ // Extract designer-related props
10
+ const {
11
+ 'data-obj-id': dataObjId,
12
+ 'data-obj-type': dataObjType,
13
+ style,
14
+ ...restProps
15
+ } = props;
16
+
17
+ const Tag = tag;
18
+
19
+ return (
20
+ <Tag
21
+ ref={ref}
22
+ className={className}
23
+ {...restProps}
24
+ {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
25
+ >
26
+ {renderChildren(schema.children || schema.body)}
27
+ </Tag>
28
+ );
29
+ });
30
+ Component.displayName = `Semantic${tag.charAt(0).toUpperCase() + tag.slice(1)}`;
31
+
32
+ ComponentRegistry.register(tag, Component, {
33
+ label: tag.charAt(0).toUpperCase() + tag.slice(1),
34
+ category: 'layout',
35
+ inputs: [
36
+ { name: 'className', type: 'string', label: 'CSS Class' }
37
+ ]
38
+ });
39
+ });
@@ -0,0 +1,123 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { StackSchema } from '@object-ui/types';
3
+ import { renderChildren } from '../../lib/utils';
4
+ import { cn } from '../../lib/utils';
5
+ import { forwardRef } from 'react';
6
+
7
+ // Stack is essentially a Flex container that defaults to column direction
8
+ const StackRenderer = forwardRef<HTMLDivElement, { schema: StackSchema; className?: string; [key: string]: any }>(
9
+ ({ schema, className, ...props }, ref) => {
10
+ // Default to column for Stack
11
+ const direction = schema.direction || 'col';
12
+ const justify = schema.justify || 'start';
13
+ const align = schema.align || 'stretch'; // Stack items usually stretch
14
+ const gap = schema.gap || 2;
15
+ const wrap = schema.wrap || false;
16
+
17
+ const stackClass = cn(
18
+ 'flex',
19
+ // Direction
20
+ direction === 'row' && 'flex-row',
21
+ direction === 'col' && 'flex-col',
22
+ direction === 'row-reverse' && 'flex-row-reverse',
23
+ direction === 'col-reverse' && 'flex-col-reverse',
24
+ // Justify content
25
+ justify === 'start' && 'justify-start',
26
+ justify === 'end' && 'justify-end',
27
+ justify === 'center' && 'justify-center',
28
+ justify === 'between' && 'justify-between',
29
+ justify === 'around' && 'justify-around',
30
+ justify === 'evenly' && 'justify-evenly',
31
+ // Align items
32
+ align === 'start' && 'items-start',
33
+ align === 'end' && 'items-end',
34
+ align === 'center' && 'items-center',
35
+ align === 'baseline' && 'items-baseline',
36
+ align === 'stretch' && 'items-stretch',
37
+ // Gap
38
+ gap === 0 && 'gap-0',
39
+ gap === 1 && 'gap-1',
40
+ gap === 2 && 'gap-2',
41
+ gap === 3 && 'gap-3',
42
+ gap === 4 && 'gap-4',
43
+ gap === 5 && 'gap-5',
44
+ gap === 6 && 'gap-6',
45
+ gap === 8 && 'gap-8',
46
+ gap === 10 && 'gap-10',
47
+ // Wrap
48
+ wrap && 'flex-wrap',
49
+ className
50
+ );
51
+
52
+ // Extract designer-related props
53
+ const {
54
+ 'data-obj-id': dataObjId,
55
+ 'data-obj-type': dataObjType,
56
+ style,
57
+ ...stackProps
58
+ } = props;
59
+
60
+ return (
61
+ <div
62
+ ref={ref}
63
+ className={stackClass}
64
+ {...stackProps}
65
+ // Apply designer props
66
+ {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
67
+ >
68
+ {schema.children && renderChildren(schema.children)}
69
+ </div>
70
+ );
71
+ }
72
+ );
73
+
74
+ ComponentRegistry.register('stack',
75
+ StackRenderer,
76
+ {
77
+ label: 'Stack',
78
+ inputs: [
79
+ {
80
+ name: 'direction',
81
+ type: 'enum',
82
+ label: 'Direction',
83
+ enum: ['col', 'row', 'col-reverse', 'row-reverse'],
84
+ defaultValue: 'col'
85
+ },
86
+ {
87
+ name: 'gap',
88
+ type: 'number',
89
+ label: 'Gap',
90
+ defaultValue: 2
91
+ },
92
+ {
93
+ name: 'align',
94
+ type: 'enum',
95
+ label: 'Align Items',
96
+ enum: ['start', 'end', 'center', 'stretch', 'baseline'],
97
+ defaultValue: 'stretch'
98
+ },
99
+ {
100
+ name: 'justify',
101
+ type: 'enum',
102
+ label: 'Justify Content',
103
+ enum: ['start', 'end', 'center', 'between', 'around', 'evenly'],
104
+ defaultValue: 'start'
105
+ },
106
+ { name: 'className', type: 'string', label: 'CSS Class' }
107
+ ],
108
+ defaultProps: {
109
+ direction: 'col',
110
+ gap: 2,
111
+ align: 'stretch',
112
+ children: []
113
+ },
114
+ isContainer: true,
115
+ resizable: true,
116
+ resizeConstraints: {
117
+ width: true,
118
+ height: true,
119
+ minWidth: 100,
120
+ minHeight: 50
121
+ }
122
+ }
123
+ );
@@ -0,0 +1,63 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { TabsSchema } from '@object-ui/types';
3
+ import { renderChildren } from '../../lib/utils';
4
+ import {
5
+ Tabs,
6
+ TabsList,
7
+ TabsTrigger,
8
+ TabsContent
9
+ } from '../../ui';
10
+
11
+ ComponentRegistry.register('tabs',
12
+ ({ schema, className, ...props }: { schema: TabsSchema; className?: string; [key: string]: any }) => {
13
+ // Extract designer-related props
14
+ const {
15
+ 'data-obj-id': dataObjId,
16
+ 'data-obj-type': dataObjType,
17
+ style,
18
+ ...tabsProps
19
+ } = props;
20
+
21
+ return (
22
+ <Tabs
23
+ defaultValue={schema.defaultValue}
24
+ className={className}
25
+ {...tabsProps}
26
+ // Apply designer props
27
+ {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
28
+ >
29
+ <TabsList>
30
+ {schema.items?.map((item) => (
31
+ <TabsTrigger key={item.value} value={item.value}>{item.label}</TabsTrigger>
32
+ ))}
33
+ </TabsList>
34
+ {schema.items?.map((item) => (
35
+ <TabsContent key={item.value} value={item.value}>
36
+ {renderChildren((item as any).body)}
37
+ </TabsContent>
38
+ ))}
39
+ </Tabs>
40
+ );
41
+ },
42
+ {
43
+ label: 'Tabs',
44
+ inputs: [
45
+ { name: 'defaultValue', type: 'string', label: 'Default Value', required: true },
46
+ { name: 'className', type: 'string', label: 'CSS Class' },
47
+ {
48
+ name: 'items',
49
+ type: 'array',
50
+ label: 'Items'
51
+ }
52
+ ],
53
+ defaultProps: {
54
+ defaultValue: 'tab1',
55
+ items: [
56
+ { label: 'Tab 1', value: 'tab1', body: [{ type: 'text', content: 'Content for Tab 1' }] },
57
+ { label: 'Tab 2', value: 'tab2', body: [{ type: 'text', content: 'Content for Tab 2' }] },
58
+ { label: 'Tab 3', value: 'tab3', body: [{ type: 'text', content: 'Content for Tab 3' }] }
59
+ ],
60
+ className: 'w-full'
61
+ }
62
+ }
63
+ );
@@ -0,0 +1,50 @@
1
+ import React from 'react';
2
+ import { ComponentRegistry } from '@object-ui/core';
3
+ import type { HeaderBarSchema } from '@object-ui/types';
4
+ import {
5
+ SidebarTrigger,
6
+ Separator,
7
+ Breadcrumb,
8
+ BreadcrumbList,
9
+ BreadcrumbItem,
10
+ BreadcrumbLink,
11
+ BreadcrumbSeparator,
12
+ BreadcrumbPage
13
+ } from '../../ui';
14
+
15
+ ComponentRegistry.register('header-bar',
16
+ ({ schema }: { schema: HeaderBarSchema }) => (
17
+ <header className="flex h-16 shrink-0 items-center gap-2 border-b px-4">
18
+ <SidebarTrigger />
19
+ <Separator orientation="vertical" className="mr-2 h-4" />
20
+ <Breadcrumb>
21
+ <BreadcrumbList>
22
+ {schema.crumbs?.map((crumb: any, idx: number) => (
23
+ <React.Fragment key={idx}>
24
+ <BreadcrumbItem>
25
+ {idx === schema.crumbs.length - 1 ? (
26
+ <BreadcrumbPage>{crumb.label}</BreadcrumbPage>
27
+ ) : (
28
+ <BreadcrumbLink href={crumb.href || '#'}>{crumb.label}</BreadcrumbLink>
29
+ )}
30
+ </BreadcrumbItem>
31
+ {idx < schema.crumbs.length - 1 && <BreadcrumbSeparator />}
32
+ </React.Fragment>
33
+ ))}
34
+ </BreadcrumbList>
35
+ </Breadcrumb>
36
+ </header>
37
+ ),
38
+ {
39
+ label: 'Header Bar',
40
+ inputs: [
41
+ { name: 'crumbs', type: 'array', label: 'Breadcrumbs' }
42
+ ],
43
+ defaultProps: {
44
+ crumbs: [
45
+ { label: 'Home', href: '#' },
46
+ { label: 'Current Page' }
47
+ ]
48
+ }
49
+ }
50
+ );
@@ -0,0 +1,2 @@
1
+ import './sidebar';
2
+ import './header-bar';