@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,31 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { InputOTPSchema } from '@object-ui/types';
3
+ import { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator } from '../../ui';
4
+
5
+ ComponentRegistry.register('input-otp',
6
+ ({ schema, className, ...props }: { schema: InputOTPSchema; className?: string; [key: string]: any }) => (
7
+ <InputOTP maxLength={schema.length || 6} className={className} {...props}>
8
+ <InputOTPGroup>
9
+ <InputOTPSlot index={0} />
10
+ <InputOTPSlot index={1} />
11
+ <InputOTPSlot index={2} />
12
+ </InputOTPGroup>
13
+ <InputOTPSeparator />
14
+ <InputOTPGroup>
15
+ <InputOTPSlot index={3} />
16
+ <InputOTPSlot index={4} />
17
+ <InputOTPSlot index={5} />
18
+ </InputOTPGroup>
19
+ </InputOTP>
20
+ ),
21
+ {
22
+ label: 'Input OTP',
23
+ inputs: [
24
+ { name: 'maxLength', type: 'number', label: 'Max Length', defaultValue: 6 },
25
+ { name: 'className', type: 'string', label: 'CSS Class' }
26
+ ],
27
+ defaultProps: {
28
+ maxLength: 6
29
+ }
30
+ }
31
+ );
@@ -0,0 +1,79 @@
1
+ import React from 'react';
2
+ import { ComponentRegistry } from '@object-ui/core';
3
+ import type { InputSchema } from '@object-ui/types';
4
+ import { Input, Label } from '../../ui';
5
+ import { cn } from '../../lib/utils';
6
+
7
+ ComponentRegistry.register('input',
8
+ ({ schema, className, onChange, value, ...props }: { schema: InputSchema; className?: string; onChange?: (val: any) => void; value?: any; [key: string]: any }) => {
9
+
10
+ // Handle change for both raw inputs and form-bound inputs
11
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
12
+ if (onChange) {
13
+ onChange(e.target.value);
14
+ }
15
+ };
16
+
17
+ // Extract designer-related props to apply to the wrapper
18
+ // These props are injected by SchemaRenderer for designer interaction
19
+ const {
20
+ 'data-obj-id': dataObjId,
21
+ 'data-obj-type': dataObjType,
22
+ style,
23
+ ...inputProps
24
+ } = props;
25
+
26
+ return (
27
+ <div
28
+ className={cn("grid w-full items-center gap-1.5", schema.wrapperClass)}
29
+ data-obj-id={dataObjId}
30
+ data-obj-type={dataObjType}
31
+ style={style}
32
+ >
33
+ {schema.label && <Label htmlFor={schema.id} className={cn(schema.required && "text-destructive after:content-['*'] after:ml-0.5")}>{schema.label}</Label>}
34
+ <Input
35
+ type={schema.inputType || 'text'}
36
+ id={schema.id}
37
+ name={schema.name}
38
+ placeholder={schema.placeholder}
39
+ className={className}
40
+ required={schema.required}
41
+ disabled={schema.disabled}
42
+ readOnly={schema.readOnly}
43
+ value={value ?? schema.value ?? ''} // Controlled if value provided
44
+ defaultValue={value === undefined ? schema.defaultValue : undefined}
45
+ onChange={handleChange}
46
+ min={schema.min}
47
+ max={schema.max}
48
+ step={schema.step}
49
+ maxLength={schema.maxLength}
50
+ pattern={schema.pattern}
51
+ {...inputProps}
52
+ />
53
+ {schema.description && <p className="text-sm text-muted-foreground">{schema.description}</p>}
54
+ {schema.error && <p className="text-sm font-medium text-destructive">{schema.error}</p>}
55
+ </div>
56
+ );
57
+ },
58
+ {
59
+ label: 'Input Field',
60
+ inputs: [
61
+ { name: 'label', type: 'string', label: 'Label' },
62
+ { name: 'name', type: 'string', label: 'Field Name' },
63
+ { name: 'placeholder', type: 'string', label: 'Placeholder' },
64
+ {
65
+ name: 'inputType',
66
+ type: 'enum',
67
+ label: 'Type',
68
+ enum: ['text', 'email', 'password', 'number', 'tel', 'url', 'date', 'time', 'datetime-local'],
69
+ defaultValue: 'text'
70
+ },
71
+ { name: 'required', type: 'boolean', label: 'Required' },
72
+ { name: 'disabled', type: 'boolean', label: 'Disabled' },
73
+ { name: 'description', type: 'string', label: 'Description' }
74
+ ],
75
+ defaultProps: {
76
+ inputType: 'text'
77
+ }
78
+ }
79
+ );
@@ -0,0 +1,36 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { LabelSchema } from '@object-ui/types';
3
+ import { Label } from '../../ui';
4
+
5
+ ComponentRegistry.register('label',
6
+ ({ schema, className, ...props }: { schema: LabelSchema; className?: string; [key: string]: any }) => {
7
+ // Extract designer-related props
8
+ const {
9
+ 'data-obj-id': dataObjId,
10
+ 'data-obj-type': dataObjType,
11
+ style,
12
+ ...labelProps
13
+ } = props;
14
+
15
+ return (
16
+ <Label
17
+ className={className}
18
+ {...labelProps}
19
+ // Apply designer props
20
+ {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
21
+ >
22
+ {schema.text || schema.label || schema.content}
23
+ </Label>
24
+ );
25
+ },
26
+ {
27
+ label: 'Label',
28
+ inputs: [
29
+ { name: 'text', type: 'string', label: 'Text', required: true },
30
+ { name: 'className', type: 'string', label: 'CSS Class' }
31
+ ],
32
+ defaultProps: {
33
+ text: 'Label Text'
34
+ }
35
+ }
36
+ );
@@ -0,0 +1,54 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { RadioGroupSchema } from '@object-ui/types';
3
+ import { RadioGroup, RadioGroupItem, Label } from '../../ui';
4
+
5
+ ComponentRegistry.register('radio-group',
6
+ ({ schema, className, ...props }: { schema: RadioGroupSchema; className?: string; [key: string]: any }) => {
7
+ // Extract designer-related props
8
+ const {
9
+ 'data-obj-id': dataObjId,
10
+ 'data-obj-type': dataObjType,
11
+ style,
12
+ ...radioProps
13
+ } = props;
14
+
15
+ return (
16
+ <RadioGroup
17
+ defaultValue={schema.defaultValue}
18
+ className={className}
19
+ {...radioProps}
20
+ // Apply designer props to the root element
21
+ {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
22
+ >
23
+ {schema.options?.map((item) => (
24
+ <div key={item.value} className="flex items-center space-x-2">
25
+ <RadioGroupItem value={item.value} id={`${schema.id}-${item.value}`} />
26
+ <Label htmlFor={`${schema.id}-${item.value}`}>{item.label}</Label>
27
+ </div>
28
+ ))}
29
+ </RadioGroup>
30
+ );
31
+ },
32
+ {
33
+ label: 'Radio Group',
34
+ inputs: [
35
+ { name: 'defaultValue', type: 'string', label: 'Default Value' },
36
+ { name: 'id', type: 'string', label: 'Group ID', required: true },
37
+ {
38
+ name: 'options',
39
+ type: 'array',
40
+ label: 'Options',
41
+ description: 'Array of {label, value} objects'
42
+ },
43
+ { name: 'className', type: 'string', label: 'CSS Class' }
44
+ ],
45
+ defaultProps: {
46
+ id: 'radio-group', // Will be made unique by designer's ensureNodeIds
47
+ options: [
48
+ { label: 'Option 1', value: 'option1' },
49
+ { label: 'Option 2', value: 'option2' },
50
+ { label: 'Option 3', value: 'option3' }
51
+ ]
52
+ }
53
+ }
54
+ );
@@ -0,0 +1,66 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { SelectSchema } from '@object-ui/types';
3
+ import {
4
+ Select,
5
+ SelectTrigger,
6
+ SelectValue,
7
+ SelectContent,
8
+ SelectItem,
9
+ Label
10
+ } from '../../ui';
11
+
12
+ ComponentRegistry.register('select',
13
+ ({ schema, className, ...props }: { schema: SelectSchema; className?: string; [key: string]: any }) => {
14
+ // Extract designer-related props
15
+ const {
16
+ 'data-obj-id': dataObjId,
17
+ 'data-obj-type': dataObjType,
18
+ style,
19
+ ...selectProps
20
+ } = props;
21
+
22
+ return (
23
+ <div
24
+ className={`grid w-full max-w-sm items-center gap-1.5 ${schema.wrapperClass || ''}`}
25
+ data-obj-id={dataObjId}
26
+ data-obj-type={dataObjType}
27
+ style={style}
28
+ >
29
+ {schema.label && <Label>{schema.label}</Label>}
30
+ <Select defaultValue={schema.defaultValue} {...selectProps}>
31
+ <SelectTrigger className={className}>
32
+ <SelectValue placeholder={schema.placeholder} />
33
+ </SelectTrigger>
34
+ <SelectContent>
35
+ {schema.options?.map((opt) => (
36
+ <SelectItem key={opt.value} value={opt.value}>{opt.label}</SelectItem>
37
+ ))}
38
+ </SelectContent>
39
+ </Select>
40
+ </div>
41
+ );
42
+ },
43
+ {
44
+ label: 'Select',
45
+ inputs: [
46
+ { name: 'label', type: 'string', label: 'Label' },
47
+ { name: 'placeholder', type: 'string', label: 'Placeholder' },
48
+ { name: 'defaultValue', type: 'string', label: 'Default Value' },
49
+ {
50
+ name: 'options',
51
+ type: 'array',
52
+ label: 'Options',
53
+ description: 'Array of {label, value} objects'
54
+ }
55
+ ],
56
+ defaultProps: {
57
+ label: 'Select an option',
58
+ placeholder: 'Choose...',
59
+ options: [
60
+ { label: 'Option 1', value: 'option1' },
61
+ { label: 'Option 2', value: 'option2' },
62
+ { label: 'Option 3', value: 'option3' }
63
+ ]
64
+ }
65
+ }
66
+ );
@@ -0,0 +1,45 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { SliderSchema } from '@object-ui/types';
3
+ import { Slider } from '../../ui';
4
+
5
+ ComponentRegistry.register('slider',
6
+ ({ schema, className, ...props }: { schema: SliderSchema; className?: string; [key: string]: any }) => {
7
+ // Extract designer-related props
8
+ const {
9
+ 'data-obj-id': dataObjId,
10
+ 'data-obj-type': dataObjType,
11
+ style,
12
+ ...sliderProps
13
+ } = props;
14
+
15
+ return (
16
+ <Slider
17
+ defaultValue={schema.defaultValue}
18
+ max={schema.max}
19
+ min={schema.min}
20
+ step={schema.step}
21
+ className={className}
22
+ {...sliderProps}
23
+ // Apply designer props
24
+ {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
25
+ />
26
+ );
27
+ },
28
+ {
29
+ label: 'Slider',
30
+ inputs: [
31
+ { name: 'defaultValue', type: 'array', label: 'Default Value', defaultValue: [50] },
32
+ { name: 'max', type: 'number', label: 'Max', defaultValue: 100 },
33
+ { name: 'min', type: 'number', label: 'Min', defaultValue: 0 },
34
+ { name: 'step', type: 'number', label: 'Step', defaultValue: 1 },
35
+ { name: 'className', type: 'string', label: 'CSS Class' }
36
+ ],
37
+ defaultProps: {
38
+ defaultValue: [50],
39
+ max: 100,
40
+ min: 0,
41
+ step: 1,
42
+ className: 'w-full'
43
+ }
44
+ }
45
+ );
@@ -0,0 +1,39 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { SwitchSchema } from '@object-ui/types';
3
+ import { Switch, Label } from '../../ui';
4
+
5
+ ComponentRegistry.register('switch',
6
+ ({ schema, className, ...props }: { schema: SwitchSchema; className?: string; [key: string]: any }) => {
7
+ // Extract designer-related props
8
+ const {
9
+ 'data-obj-id': dataObjId,
10
+ 'data-obj-type': dataObjType,
11
+ style,
12
+ ...switchProps
13
+ } = props;
14
+
15
+ return (
16
+ <div
17
+ className={`flex items-center space-x-2 ${schema.wrapperClass || ''}`}
18
+ data-obj-id={dataObjId}
19
+ data-obj-type={dataObjType}
20
+ style={style}
21
+ >
22
+ <Switch id={schema.id} className={className} {...switchProps} />
23
+ <Label htmlFor={schema.id}>{schema.label}</Label>
24
+ </div>
25
+ );
26
+ },
27
+ {
28
+ label: 'Switch',
29
+ inputs: [
30
+ { name: 'label', type: 'string', label: 'Label', required: true },
31
+ { name: 'id', type: 'string', label: 'ID', required: true },
32
+ { name: 'checked', type: 'boolean', label: 'Checked' }
33
+ ],
34
+ defaultProps: {
35
+ label: 'Switch label',
36
+ id: 'switch-field' // Will be made unique by designer's ensureNodeIds
37
+ }
38
+ }
39
+ );
@@ -0,0 +1,45 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { TextareaSchema } from '@object-ui/types';
3
+ import { Textarea, Label } from '../../ui';
4
+
5
+ ComponentRegistry.register('textarea',
6
+ ({ schema, className, ...props }: { schema: TextareaSchema; className?: string; [key: string]: any }) => {
7
+ // Extract designer-related props
8
+ const {
9
+ 'data-obj-id': dataObjId,
10
+ 'data-obj-type': dataObjType,
11
+ style,
12
+ ...inputProps
13
+ } = props;
14
+
15
+ return (
16
+ <div
17
+ className={`grid w-full gap-1.5 ${schema.wrapperClass || ''}`}
18
+ data-obj-id={dataObjId}
19
+ data-obj-type={dataObjType}
20
+ style={style}
21
+ >
22
+ {schema.label && <Label htmlFor={schema.id}>{schema.label}</Label>}
23
+ <Textarea
24
+ id={schema.id}
25
+ placeholder={schema.placeholder}
26
+ className={className}
27
+ {...inputProps}
28
+ />
29
+ </div>
30
+ );
31
+ },
32
+ {
33
+ label: 'Textarea',
34
+ inputs: [
35
+ { name: 'label', type: 'string', label: 'Label' },
36
+ { name: 'placeholder', type: 'string', label: 'Placeholder' },
37
+ { name: 'id', type: 'string', label: 'ID', required: true }
38
+ ],
39
+ defaultProps: {
40
+ label: 'Textarea label',
41
+ placeholder: 'Enter text here...',
42
+ id: 'textarea-field' // Will be made unique by designer's ensureNodeIds
43
+ }
44
+ }
45
+ );
@@ -0,0 +1,76 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { ToggleSchema } from '@object-ui/types';
3
+ import { Toggle, ToggleGroup, ToggleGroupItem } from '../../ui';
4
+ import { renderChildren } from '../../lib/utils';
5
+
6
+ ComponentRegistry.register('toggle',
7
+ ({ schema, ...props }: { schema: ToggleSchema; [key: string]: any }) => (
8
+ <Toggle
9
+ variant={schema.variant}
10
+ size={schema.size}
11
+ pressed={schema.pressed}
12
+ aria-label={schema.ariaLabel}
13
+ {...props}
14
+ >
15
+ {schema.label || renderChildren(schema.children)}
16
+ </Toggle>
17
+ ),
18
+ {
19
+ label: 'Toggle',
20
+ inputs: [
21
+ { name: 'label', type: 'string', label: 'Label' },
22
+ { name: 'pressed', type: 'boolean', label: 'Pressed' },
23
+ { name: 'variant', type: 'enum', enum: ['default', 'outline'], defaultValue: 'default', label: 'Variant' },
24
+ { name: 'size', type: 'enum', enum: ['default', 'sm', 'lg'], defaultValue: 'default', label: 'Size' },
25
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label' }
26
+ ],
27
+ defaultProps: {
28
+ label: 'Toggle',
29
+ variant: 'default',
30
+ size: 'default'
31
+ }
32
+ }
33
+ );
34
+
35
+ ComponentRegistry.register('toggle-group',
36
+ ({ schema, className, ...props }) => (
37
+ <ToggleGroup
38
+ type={schema.groupType || 'single'}
39
+ variant={schema.variant}
40
+ size={schema.size}
41
+ className={className}
42
+ {...props}
43
+ >
44
+ {schema.items?.map((item: any) => (
45
+ <ToggleGroupItem key={item.value} value={item.value} aria-label={item.label}>
46
+ {item.icon || item.label}
47
+ </ToggleGroupItem>
48
+ ))}
49
+ </ToggleGroup>
50
+ ),
51
+ {
52
+ label: 'Toggle Group',
53
+ inputs: [
54
+ { name: 'groupType', type: 'enum', enum: ['single', 'multiple'], defaultValue: 'single', label: 'Type' },
55
+ { name: 'variant', type: 'enum', enum: ['default', 'outline'], defaultValue: 'default', label: 'Variant' },
56
+ { name: 'size', type: 'enum', enum: ['default', 'sm', 'lg'], defaultValue: 'default', label: 'Size' },
57
+ {
58
+ name: 'items',
59
+ type: 'array',
60
+ label: 'Items',
61
+ description: 'Array of {label, value, icon?} objects'
62
+ },
63
+ { name: 'className', type: 'string', label: 'CSS Class' }
64
+ ],
65
+ defaultProps: {
66
+ groupType: 'single',
67
+ variant: 'default',
68
+ size: 'default',
69
+ items: [
70
+ { label: 'A', value: 'a' },
71
+ { label: 'B', value: 'b' },
72
+ { label: 'C', value: 'c' }
73
+ ]
74
+ }
75
+ }
76
+ );
@@ -0,0 +1,9 @@
1
+ import './basic';
2
+ import './form';
3
+ import './layout';
4
+ import './navigation';
5
+ import './data-display';
6
+ import './feedback';
7
+ import './overlay';
8
+ import './disclosure';
9
+ import './complex';
@@ -0,0 +1,69 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { CardSchema } from '@object-ui/types';
3
+ import { renderChildren } from '../../lib/utils';
4
+ import {
5
+ Card,
6
+ CardHeader,
7
+ CardTitle,
8
+ CardDescription,
9
+ CardContent,
10
+ CardFooter
11
+ } from '../../ui';
12
+ import { forwardRef } from 'react';
13
+
14
+ const CardRenderer = forwardRef<HTMLDivElement, { schema: CardSchema; className?: string; [key: string]: any }>(
15
+ ({ schema, className, ...props }, ref) => {
16
+ // Extract designer-related props
17
+ const {
18
+ 'data-obj-id': dataObjId,
19
+ 'data-obj-type': dataObjType,
20
+ style,
21
+ ...cardProps
22
+ } = props;
23
+
24
+ return (
25
+ <Card
26
+ ref={ref}
27
+ className={className}
28
+ {...cardProps}
29
+ // Apply designer props
30
+ {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
31
+ >
32
+ {(schema.title || schema.description || schema.header) && (
33
+ <CardHeader>
34
+ {schema.title && <CardTitle>{schema.title}</CardTitle>}
35
+ {schema.description && <CardDescription>{schema.description}</CardDescription>}
36
+ {schema.header && renderChildren(schema.header)}
37
+ </CardHeader>
38
+ )}
39
+ {(schema.children || schema.body) && <CardContent>{renderChildren(schema.children || schema.body)}</CardContent>}
40
+ {schema.footer && <CardFooter className="flex justify-between">{renderChildren(schema.footer)}</CardFooter>}
41
+ </Card>
42
+ );
43
+ }
44
+ );
45
+
46
+ ComponentRegistry.register('card',
47
+ CardRenderer,
48
+ {
49
+ label: 'Card',
50
+ inputs: [
51
+ { name: 'title', type: 'string', label: 'Title' },
52
+ { name: 'description', type: 'string', label: 'Description' },
53
+ { name: 'className', type: 'string', label: 'CSS Class' }
54
+ ],
55
+ defaultProps: {
56
+ title: 'Card Title',
57
+ description: 'Card description goes here',
58
+ className: 'w-full'
59
+ },
60
+ isContainer: true,
61
+ resizable: true,
62
+ resizeConstraints: {
63
+ width: true,
64
+ height: true,
65
+ minWidth: 200,
66
+ minHeight: 100
67
+ }
68
+ }
69
+ );
@@ -0,0 +1,113 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { ContainerSchema } from '@object-ui/types';
3
+ import { renderChildren } from '../../lib/utils';
4
+ import { cn } from '../../lib/utils';
5
+ import { forwardRef } from 'react';
6
+
7
+ const ContainerRenderer = forwardRef<HTMLDivElement, { schema: ContainerSchema; className?: string; [key: string]: any }>(
8
+ ({ schema, className, ...props }, ref) => {
9
+ const maxWidth = (schema.maxWidth || 'xl') as any;
10
+ const padding = schema.padding || 4;
11
+ const centered = schema.centered !== false; // Default to true
12
+
13
+ const containerClass = cn(
14
+ // Base container
15
+ 'w-full',
16
+ // Max width
17
+ maxWidth === 'sm' && 'max-w-sm',
18
+ maxWidth === 'md' && 'max-w-md',
19
+ maxWidth === 'lg' && 'max-w-lg',
20
+ maxWidth === 'xl' && 'max-w-xl',
21
+ maxWidth === '2xl' && 'max-w-2xl',
22
+ maxWidth === '3xl' && 'max-w-3xl',
23
+ maxWidth === '4xl' && 'max-w-4xl',
24
+ maxWidth === '5xl' && 'max-w-5xl',
25
+ maxWidth === '6xl' && 'max-w-6xl',
26
+ maxWidth === '7xl' && 'max-w-7xl',
27
+ maxWidth === 'full' && 'max-w-full',
28
+ maxWidth === 'screen' && 'max-w-screen-2xl',
29
+ // Centering
30
+ centered && 'mx-auto',
31
+ // Padding
32
+ padding === 0 && 'p-0',
33
+ padding === 1 && 'p-1',
34
+ padding === 2 && 'p-2',
35
+ padding === 3 && 'p-3',
36
+ padding === 4 && 'p-4',
37
+ padding === 5 && 'p-5',
38
+ padding === 6 && 'p-6',
39
+ padding === 7 && 'p-7',
40
+ padding === 8 && 'p-8',
41
+ padding === 10 && 'p-10',
42
+ padding === 12 && 'p-12',
43
+ padding === 16 && 'p-16',
44
+ className
45
+ );
46
+
47
+ // Extract designer-related props
48
+ const {
49
+ 'data-obj-id': dataObjId,
50
+ 'data-obj-type': dataObjType,
51
+ style,
52
+ ...containerProps
53
+ } = props;
54
+
55
+ return (
56
+ <div
57
+ ref={ref}
58
+ className={containerClass}
59
+ {...containerProps}
60
+ // Apply designer props
61
+ {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
62
+ >
63
+ {schema.children && renderChildren(schema.children)}
64
+ </div>
65
+ );
66
+ }
67
+ );
68
+
69
+ ComponentRegistry.register('container',
70
+ ContainerRenderer,
71
+ {
72
+ label: 'Container',
73
+ inputs: [
74
+ {
75
+ name: 'maxWidth',
76
+ type: 'enum',
77
+ enum: ['sm', 'md', 'lg', 'xl', '2xl', '3xl', '4xl', '5xl', '6xl', '7xl', 'full', 'screen'],
78
+ label: 'Max Width',
79
+ defaultValue: 'xl'
80
+ },
81
+ {
82
+ name: 'padding',
83
+ type: 'number',
84
+ label: 'Padding',
85
+ defaultValue: 4,
86
+ description: 'Padding value (0, 1-8, 10, 12, 16)'
87
+ },
88
+ {
89
+ name: 'centered',
90
+ type: 'boolean',
91
+ label: 'Center Horizontally',
92
+ defaultValue: true
93
+ },
94
+ { name: 'className', type: 'string', label: 'CSS Class' }
95
+ ],
96
+ defaultProps: {
97
+ maxWidth: 'xl',
98
+ padding: 4,
99
+ centered: true,
100
+ children: [
101
+ { type: 'text', content: 'Container content goes here' }
102
+ ]
103
+ },
104
+ isContainer: true,
105
+ resizable: true,
106
+ resizeConstraints: {
107
+ width: true,
108
+ height: true,
109
+ minWidth: 200,
110
+ minHeight: 100
111
+ }
112
+ }
113
+ );