@object-ui/components 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (423) hide show
  1. package/.turbo/turbo-build.log +47 -0
  2. package/CHANGELOG.md +10 -0
  3. package/README.md +32 -1
  4. package/README_SHADCN_SYNC.md +281 -0
  5. package/TESTING.md +335 -0
  6. package/dist/index.css +1 -1
  7. package/dist/index.js +45067 -34357
  8. package/dist/index.umd.cjs +54 -42
  9. package/dist/src/SchemaRenderer.d.ts +3 -0
  10. package/dist/src/{ui → custom}/button-group.d.ts +1 -1
  11. package/dist/src/custom/combobox.d.ts +22 -0
  12. package/dist/src/custom/date-picker.d.ts +15 -0
  13. package/dist/src/custom/field.d.ts +19 -0
  14. package/dist/src/{ui → custom}/filter-builder.d.ts +7 -0
  15. package/dist/src/custom/index.d.ts +12 -0
  16. package/dist/src/custom/input-group.d.ts +14 -0
  17. package/dist/src/{ui → custom}/item.d.ts +8 -1
  18. package/dist/src/{ui → custom}/kbd.d.ts +7 -0
  19. package/dist/src/custom/native-select.d.ts +12 -0
  20. package/dist/src/custom/sort-builder.d.ts +22 -0
  21. package/dist/src/custom/spinner.d.ts +10 -0
  22. package/dist/src/hooks/use-mobile.d.ts +7 -0
  23. package/dist/src/index.d.ts +5 -1
  24. package/dist/src/renderers/basic/button-group.d.ts +8 -0
  25. package/dist/src/renderers/basic/div.d.ts +7 -0
  26. package/dist/src/renderers/basic/html.d.ts +7 -0
  27. package/dist/src/renderers/basic/icon.d.ts +7 -0
  28. package/dist/src/renderers/basic/image.d.ts +7 -0
  29. package/dist/src/renderers/basic/navigation-menu.d.ts +8 -0
  30. package/dist/src/renderers/basic/pagination.d.ts +8 -0
  31. package/dist/src/renderers/basic/separator.d.ts +7 -0
  32. package/dist/src/renderers/basic/span.d.ts +7 -0
  33. package/dist/src/renderers/basic/text.d.ts +7 -0
  34. package/dist/src/renderers/complex/carousel.d.ts +7 -0
  35. package/dist/src/renderers/complex/data-table.d.ts +7 -0
  36. package/dist/src/renderers/complex/filter-builder.d.ts +7 -0
  37. package/dist/src/renderers/complex/resizable.d.ts +7 -0
  38. package/dist/src/renderers/complex/scroll-area.d.ts +7 -0
  39. package/dist/src/renderers/complex/table.d.ts +7 -0
  40. package/dist/src/renderers/data-display/alert.d.ts +7 -0
  41. package/dist/src/renderers/data-display/avatar.d.ts +7 -0
  42. package/dist/src/renderers/data-display/badge.d.ts +7 -0
  43. package/dist/src/renderers/data-display/breadcrumb.d.ts +8 -0
  44. package/dist/src/renderers/data-display/kbd.d.ts +8 -0
  45. package/dist/src/renderers/data-display/list.d.ts +7 -0
  46. package/dist/src/renderers/data-display/statistic.d.ts +7 -0
  47. package/dist/src/renderers/data-display/table.d.ts +8 -0
  48. package/dist/src/renderers/data-display/tree-view.d.ts +7 -0
  49. package/dist/src/renderers/disclosure/accordion.d.ts +7 -0
  50. package/dist/src/renderers/disclosure/collapsible.d.ts +7 -0
  51. package/dist/src/renderers/disclosure/toggle-group.d.ts +8 -0
  52. package/dist/src/renderers/feedback/empty.d.ts +8 -0
  53. package/dist/src/renderers/feedback/loading.d.ts +7 -0
  54. package/dist/src/renderers/feedback/progress.d.ts +7 -0
  55. package/dist/src/renderers/feedback/skeleton.d.ts +7 -0
  56. package/dist/src/renderers/feedback/sonner.d.ts +8 -0
  57. package/dist/src/renderers/feedback/spinner.d.ts +8 -0
  58. package/dist/src/renderers/feedback/toast.d.ts +8 -0
  59. package/dist/src/renderers/feedback/toaster.d.ts +7 -0
  60. package/dist/src/renderers/form/button.d.ts +7 -0
  61. package/dist/src/renderers/form/calendar.d.ts +7 -0
  62. package/dist/src/renderers/form/checkbox.d.ts +7 -0
  63. package/dist/src/renderers/form/combobox.d.ts +8 -0
  64. package/dist/src/renderers/form/command.d.ts +8 -0
  65. package/dist/src/renderers/form/date-picker.d.ts +7 -0
  66. package/dist/src/renderers/form/file-upload.d.ts +7 -0
  67. package/dist/src/renderers/form/form.d.ts +7 -0
  68. package/dist/src/renderers/form/input-otp.d.ts +7 -0
  69. package/dist/src/renderers/form/input.d.ts +7 -0
  70. package/dist/src/renderers/form/label.d.ts +7 -0
  71. package/dist/src/renderers/form/radio-group.d.ts +7 -0
  72. package/dist/src/renderers/form/select.d.ts +7 -0
  73. package/dist/src/renderers/form/slider.d.ts +7 -0
  74. package/dist/src/renderers/form/switch.d.ts +7 -0
  75. package/dist/src/renderers/form/textarea.d.ts +7 -0
  76. package/dist/src/renderers/form/toggle.d.ts +7 -0
  77. package/dist/src/renderers/layout/aspect-ratio.d.ts +8 -0
  78. package/dist/src/renderers/layout/card.d.ts +7 -0
  79. package/dist/src/renderers/layout/container.d.ts +7 -0
  80. package/dist/src/renderers/layout/flex.d.ts +7 -0
  81. package/dist/src/renderers/layout/grid.d.ts +7 -0
  82. package/dist/src/renderers/layout/page.d.ts +1 -1
  83. package/dist/src/renderers/layout/semantic.d.ts +7 -0
  84. package/dist/src/renderers/layout/stack.d.ts +7 -0
  85. package/dist/src/renderers/layout/tabs.d.ts +7 -0
  86. package/dist/src/renderers/navigation/header-bar.d.ts +7 -0
  87. package/dist/src/renderers/navigation/sidebar.d.ts +7 -0
  88. package/dist/src/renderers/overlay/alert-dialog.d.ts +7 -0
  89. package/dist/src/renderers/overlay/context-menu.d.ts +7 -0
  90. package/dist/src/renderers/overlay/dialog.d.ts +7 -0
  91. package/dist/src/renderers/overlay/drawer.d.ts +7 -0
  92. package/dist/src/renderers/overlay/dropdown-menu.d.ts +7 -0
  93. package/dist/src/renderers/overlay/hover-card.d.ts +7 -0
  94. package/dist/src/renderers/overlay/menubar.d.ts +8 -0
  95. package/dist/src/renderers/overlay/popover.d.ts +7 -0
  96. package/dist/src/renderers/overlay/sheet.d.ts +7 -0
  97. package/dist/src/renderers/overlay/tooltip.d.ts +7 -0
  98. package/dist/src/renderers/placeholders.d.ts +9 -0
  99. package/dist/src/ui/accordion.d.ts +11 -4
  100. package/dist/src/ui/alert-dialog.d.ts +24 -11
  101. package/dist/src/ui/alert.d.ts +11 -5
  102. package/dist/src/ui/aspect-ratio.d.ts +8 -1
  103. package/dist/src/ui/avatar.d.ts +10 -3
  104. package/dist/src/ui/badge.d.ts +10 -3
  105. package/dist/src/ui/breadcrumb.d.ts +23 -8
  106. package/dist/src/ui/button.d.ts +10 -5
  107. package/dist/src/ui/calendar.d.ts +8 -1
  108. package/dist/src/ui/card.d.ts +14 -8
  109. package/dist/src/ui/carousel.d.ts +12 -6
  110. package/dist/src/ui/chart.d.ts +62 -0
  111. package/dist/src/ui/checkbox.d.ts +8 -1
  112. package/dist/src/ui/collapsible.d.ts +10 -3
  113. package/dist/src/ui/command.d.ts +85 -16
  114. package/dist/src/ui/context-menu.d.ts +21 -12
  115. package/dist/src/ui/dialog.d.ts +24 -13
  116. package/dist/src/ui/drawer.d.ts +26 -10
  117. package/dist/src/ui/dropdown-menu.d.ts +27 -18
  118. package/dist/src/ui/form.d.ts +13 -7
  119. package/dist/src/ui/hover-card.d.ts +10 -3
  120. package/dist/src/ui/index.d.ts +10 -11
  121. package/dist/src/ui/input-otp.d.ts +37 -7
  122. package/dist/src/ui/input.d.ts +7 -0
  123. package/dist/src/ui/label.d.ts +9 -1
  124. package/dist/src/ui/menubar.d.ts +26 -17
  125. package/dist/src/ui/navigation-menu.d.ts +16 -11
  126. package/dist/src/ui/pagination.d.ts +32 -10
  127. package/dist/src/ui/popover.d.ts +11 -5
  128. package/dist/src/ui/progress.d.ts +8 -1
  129. package/dist/src/ui/radio-group.d.ts +9 -2
  130. package/dist/src/ui/resizable.d.ts +12 -8
  131. package/dist/src/ui/scroll-area.d.ts +9 -2
  132. package/dist/src/ui/select.d.ts +18 -13
  133. package/dist/src/ui/separator.d.ts +7 -0
  134. package/dist/src/ui/sheet.d.ts +30 -11
  135. package/dist/src/ui/sidebar.d.ts +41 -38
  136. package/dist/src/ui/skeleton.d.ts +8 -1
  137. package/dist/src/ui/slider.d.ts +8 -1
  138. package/dist/src/ui/sonner.d.ts +2 -1
  139. package/dist/src/ui/switch.d.ts +9 -2
  140. package/dist/src/ui/table.d.ts +15 -8
  141. package/dist/src/ui/tabs.d.ts +8 -1
  142. package/dist/src/ui/textarea.d.ts +8 -1
  143. package/dist/src/ui/toast.d.ts +22 -0
  144. package/dist/src/ui/toggle-group.d.ts +15 -5
  145. package/dist/src/ui/toggle.d.ts +11 -1
  146. package/dist/src/ui/tooltip.d.ts +11 -4
  147. package/dist/src/ui/typography.d.ts +21 -0
  148. package/metadata/ObjectGrid.component.yml +72 -0
  149. package/package.json +35 -13
  150. package/postcss.config.js +9 -1
  151. package/shadcn-components.json +315 -0
  152. package/src/SchemaRenderer.tsx +28 -0
  153. package/src/__tests__/PageRendererRegions.test.tsx +59 -0
  154. package/src/__tests__/README.md +124 -0
  155. package/src/__tests__/Registry.test.ts +21 -0
  156. package/src/__tests__/basic-renderers.test.tsx +255 -0
  157. package/src/__tests__/complex-disclosure-renderers.test.tsx +302 -0
  158. package/src/__tests__/feedback-overlay-renderers.test.tsx +349 -0
  159. package/src/__tests__/form-renderers.test.tsx +364 -0
  160. package/src/__tests__/layout-data-renderers.test.tsx +340 -0
  161. package/src/__tests__/test-utils.tsx +190 -0
  162. package/src/{ui → custom}/button-group.tsx +9 -1
  163. package/src/custom/combobox.tsx +104 -0
  164. package/src/custom/date-picker.tsx +61 -0
  165. package/src/{ui → custom}/empty.tsx +8 -0
  166. package/src/custom/field.tsx +81 -0
  167. package/src/{ui → custom}/filter-builder.tsx +11 -3
  168. package/src/custom/index.ts +12 -0
  169. package/src/custom/input-group.tsx +53 -0
  170. package/src/{ui → custom}/item.tsx +9 -1
  171. package/src/{ui → custom}/kbd.tsx +8 -0
  172. package/src/custom/native-select.tsx +33 -0
  173. package/src/custom/sort-builder.tsx +129 -0
  174. package/src/custom/spinner.tsx +26 -0
  175. package/src/hooks/use-mobile.tsx +8 -0
  176. package/src/index.css +105 -54
  177. package/src/index.test.ts +8 -0
  178. package/src/index.ts +22 -1
  179. package/src/lib/utils.tsx +8 -0
  180. package/src/new-components.test.ts +8 -9
  181. package/src/renderers/basic/button-group.tsx +79 -0
  182. package/src/renderers/basic/div.tsx +21 -2
  183. package/src/renderers/basic/html.tsx +9 -0
  184. package/src/renderers/basic/icon.tsx +67 -3
  185. package/src/renderers/basic/image.tsx +13 -1
  186. package/src/renderers/basic/index.ts +11 -0
  187. package/src/renderers/basic/navigation-menu.tsx +81 -0
  188. package/src/renderers/basic/pagination.tsx +109 -0
  189. package/src/renderers/basic/separator.tsx +10 -1
  190. package/src/renderers/basic/span.tsx +21 -2
  191. package/src/renderers/basic/text.tsx +12 -2
  192. package/src/renderers/complex/__tests__/data-table.test.ts +8 -0
  193. package/src/renderers/complex/carousel.tsx +12 -3
  194. package/src/renderers/complex/data-table.tsx +150 -96
  195. package/src/renderers/complex/filter-builder.tsx +10 -1
  196. package/src/renderers/complex/index.ts +9 -3
  197. package/src/renderers/complex/resizable.tsx +10 -1
  198. package/src/renderers/complex/scroll-area.tsx +33 -7
  199. package/src/renderers/complex/table.tsx +11 -2
  200. package/src/renderers/data-display/alert.tsx +9 -0
  201. package/src/renderers/data-display/avatar.tsx +9 -0
  202. package/src/renderers/data-display/badge.tsx +9 -0
  203. package/src/renderers/data-display/breadcrumb.tsx +60 -0
  204. package/src/renderers/data-display/index.ts +12 -0
  205. package/src/renderers/data-display/kbd.tsx +50 -0
  206. package/src/renderers/data-display/list.tsx +29 -49
  207. package/src/renderers/data-display/statistic.tsx +45 -48
  208. package/src/renderers/data-display/table.tsx +78 -0
  209. package/src/renderers/data-display/tree-view.tsx +32 -37
  210. package/src/renderers/disclosure/accordion.tsx +9 -0
  211. package/src/renderers/disclosure/collapsible.tsx +9 -0
  212. package/src/renderers/disclosure/index.ts +9 -0
  213. package/src/renderers/disclosure/toggle-group.tsx +79 -0
  214. package/src/renderers/feedback/empty.tsx +49 -0
  215. package/src/renderers/feedback/index.ts +12 -0
  216. package/src/renderers/feedback/loading.tsx +10 -1
  217. package/src/renderers/feedback/progress.tsx +9 -0
  218. package/src/renderers/feedback/skeleton.tsx +9 -0
  219. package/src/renderers/feedback/sonner.tsx +56 -0
  220. package/src/renderers/feedback/spinner.tsx +55 -0
  221. package/src/renderers/feedback/toast.tsx +59 -0
  222. package/src/renderers/feedback/toaster.tsx +14 -17
  223. package/src/renderers/form/button.tsx +43 -1
  224. package/src/renderers/form/calendar.tsx +9 -0
  225. package/src/renderers/form/checkbox.tsx +46 -16
  226. package/src/renderers/form/combobox.tsx +48 -0
  227. package/src/renderers/form/command.tsx +58 -0
  228. package/src/renderers/form/date-picker.tsx +11 -2
  229. package/src/renderers/form/file-upload.tsx +11 -2
  230. package/src/renderers/form/form.tsx +104 -18
  231. package/src/renderers/form/index.ts +10 -0
  232. package/src/renderers/form/input-otp.tsx +35 -15
  233. package/src/renderers/form/input.tsx +92 -50
  234. package/src/renderers/form/label.tsx +9 -0
  235. package/src/renderers/form/radio-group.tsx +9 -0
  236. package/src/renderers/form/select.tsx +43 -15
  237. package/src/renderers/form/slider.tsx +17 -1
  238. package/src/renderers/form/switch.tsx +9 -0
  239. package/src/renderers/form/textarea.tsx +58 -27
  240. package/src/renderers/form/toggle.tsx +11 -45
  241. package/src/renderers/index.ts +8 -0
  242. package/src/renderers/layout/aspect-ratio.tsx +51 -0
  243. package/src/renderers/layout/card.tsx +18 -2
  244. package/src/renderers/layout/container.tsx +21 -12
  245. package/src/renderers/layout/flex.tsx +17 -8
  246. package/src/renderers/layout/grid.tsx +31 -8
  247. package/src/renderers/layout/index.ts +9 -0
  248. package/src/renderers/layout/page.tsx +44 -24
  249. package/src/renderers/layout/semantic.tsx +9 -0
  250. package/src/renderers/layout/stack.tsx +18 -9
  251. package/src/renderers/layout/tabs.tsx +51 -17
  252. package/src/renderers/navigation/header-bar.tsx +10 -1
  253. package/src/renderers/navigation/index.ts +8 -0
  254. package/src/renderers/navigation/sidebar.tsx +13 -0
  255. package/src/renderers/overlay/alert-dialog.tsx +9 -0
  256. package/src/renderers/overlay/context-menu.tsx +10 -1
  257. package/src/renderers/overlay/dialog.tsx +9 -0
  258. package/src/renderers/overlay/drawer.tsx +9 -0
  259. package/src/renderers/overlay/dropdown-menu.tsx +9 -0
  260. package/src/renderers/overlay/hover-card.tsx +9 -0
  261. package/src/renderers/overlay/index.ts +9 -0
  262. package/src/renderers/overlay/menubar.tsx +76 -0
  263. package/src/renderers/overlay/popover.tsx +9 -0
  264. package/src/renderers/overlay/sheet.tsx +9 -0
  265. package/src/renderers/overlay/tooltip.tsx +9 -0
  266. package/src/renderers/placeholders.tsx +107 -0
  267. package/src/stories/CRMApp.stories.tsx +706 -0
  268. package/src/stories/Guide.mdx +55 -0
  269. package/src/stories/Introduction.mdx +34 -0
  270. package/src/stories/MockedData.stories.tsx +71 -0
  271. package/src/stories/assets/accessibility.png +0 -0
  272. package/src/stories/assets/accessibility.svg +1 -0
  273. package/src/stories/assets/addon-library.png +0 -0
  274. package/src/stories/assets/assets.png +0 -0
  275. package/src/stories/assets/avif-test-image.avif +0 -0
  276. package/src/stories/assets/context.png +0 -0
  277. package/src/stories/assets/discord.svg +1 -0
  278. package/src/stories/assets/docs.png +0 -0
  279. package/src/stories/assets/figma-plugin.png +0 -0
  280. package/src/stories/assets/github.svg +1 -0
  281. package/src/stories/assets/share.png +0 -0
  282. package/src/stories/assets/styling.png +0 -0
  283. package/src/stories/assets/testing.png +0 -0
  284. package/src/stories/assets/theming.png +0 -0
  285. package/src/stories/assets/tutorials.svg +1 -0
  286. package/src/stories/assets/youtube.svg +1 -0
  287. package/src/stories/button.css +30 -0
  288. package/src/stories/header.css +32 -0
  289. package/src/stories/page.css +68 -0
  290. package/src/stories-json/accordion.stories.tsx +43 -0
  291. package/src/stories-json/aggrid.stories.tsx +103 -0
  292. package/src/stories-json/alert.stories.tsx +39 -0
  293. package/src/stories-json/aspect-ratio.stories.tsx +34 -0
  294. package/src/stories-json/avatar.stories.tsx +38 -0
  295. package/src/stories-json/badge.stories.tsx +53 -0
  296. package/src/stories-json/breadcrumb.stories.tsx +30 -0
  297. package/src/stories-json/button-group.stories.tsx +43 -0
  298. package/src/stories-json/button.stories.tsx +73 -0
  299. package/src/stories-json/calendar.stories.tsx +85 -0
  300. package/src/stories-json/card.stories.tsx +48 -0
  301. package/src/stories-json/carousel.stories.tsx +33 -0
  302. package/src/stories-json/charts.stories.tsx +195 -0
  303. package/src/stories-json/chatbot.stories.tsx +248 -0
  304. package/src/stories-json/code-editor.stories.tsx +92 -0
  305. package/src/stories-json/collapsible.stories.tsx +40 -0
  306. package/src/stories-json/controls.stories.tsx +36 -0
  307. package/src/stories-json/dashboard.stories.tsx +318 -0
  308. package/src/stories-json/data-table.stories.tsx +60 -0
  309. package/src/stories-json/data_display_extras.stories.tsx +102 -0
  310. package/src/stories-json/date-picker.stories.tsx +28 -0
  311. package/src/stories-json/detail-view.stories.tsx +258 -0
  312. package/src/stories-json/dialog.stories.tsx +43 -0
  313. package/src/stories-json/feedback_extras.stories.tsx +40 -0
  314. package/src/stories-json/feedback_others.stories.tsx +46 -0
  315. package/src/stories-json/form_advanced.stories.tsx +117 -0
  316. package/src/stories-json/form_extras.stories.tsx +123 -0
  317. package/src/stories-json/grid.stories.tsx +56 -0
  318. package/src/stories-json/icon.stories.tsx +36 -0
  319. package/src/stories-json/input.stories.tsx +52 -0
  320. package/src/stories-json/kanban.stories.tsx +295 -0
  321. package/src/stories-json/layout_extended.stories.tsx +76 -0
  322. package/src/stories-json/layout_flex.stories.tsx +107 -0
  323. package/src/stories-json/list-view.stories.tsx +97 -0
  324. package/src/stories-json/markdown.stories.tsx +129 -0
  325. package/src/stories-json/menus.stories.tsx +63 -0
  326. package/src/stories-json/metric-card.stories.tsx +143 -0
  327. package/src/stories-json/navigation-menu.stories.tsx +37 -0
  328. package/src/stories-json/object-aggrid.stories.tsx +252 -0
  329. package/src/stories-json/object-form.stories.tsx +130 -0
  330. package/src/stories-json/object-gantt.stories.tsx +114 -0
  331. package/src/stories-json/object-grid.stories.tsx +157 -0
  332. package/src/stories-json/object-map.stories.tsx +116 -0
  333. package/src/stories-json/object-view.stories.tsx +118 -0
  334. package/src/stories-json/overlay_extras.stories.tsx +113 -0
  335. package/src/stories-json/overlay_others.stories.tsx +76 -0
  336. package/src/stories-json/page.stories.tsx +55 -0
  337. package/src/stories-json/reports.stories.tsx +163 -0
  338. package/src/stories-json/resizable.stories.tsx +44 -0
  339. package/src/stories-json/select.stories.tsx +34 -0
  340. package/src/stories-json/separator.stories.tsx +41 -0
  341. package/src/stories-json/sidebar.stories.tsx +147 -0
  342. package/src/stories-json/statistic.stories.tsx +44 -0
  343. package/src/stories-json/tabs.stories.tsx +51 -0
  344. package/src/stories-json/timeline.stories.tsx +188 -0
  345. package/src/stories-json/typography.stories.tsx +45 -0
  346. package/src/ui/accordion.tsx +55 -53
  347. package/src/ui/alert-dialog.tsx +111 -117
  348. package/src/ui/alert.tsx +46 -57
  349. package/src/ui/aspect-ratio.tsx +9 -5
  350. package/src/ui/avatar.tsx +49 -42
  351. package/src/ui/badge.tsx +18 -20
  352. package/src/ui/breadcrumb.tsx +89 -75
  353. package/src/ui/button.tsx +38 -37
  354. package/src/ui/calendar.tsx +37 -53
  355. package/src/ui/card.tsx +59 -110
  356. package/src/ui/carousel.tsx +144 -113
  357. package/src/ui/chart.tsx +367 -0
  358. package/src/ui/checkbox.tsx +28 -22
  359. package/src/ui/collapsible.tsx +13 -25
  360. package/src/ui/command.tsx +114 -135
  361. package/src/ui/context-menu.tsx +77 -116
  362. package/src/ui/dialog.tsx +102 -113
  363. package/src/ui/drawer.tsx +90 -99
  364. package/src/ui/dropdown-menu.tsx +142 -188
  365. package/src/ui/form.tsx +59 -40
  366. package/src/ui/hover-card.tsx +26 -33
  367. package/src/ui/index.ts +11 -11
  368. package/src/ui/input-otp.tsx +53 -55
  369. package/src/ui/input.tsx +21 -15
  370. package/src/ui/label.tsx +25 -15
  371. package/src/ui/menubar.tsx +196 -206
  372. package/src/ui/navigation-menu.tsx +104 -136
  373. package/src/ui/pagination.tsx +94 -96
  374. package/src/ui/popover.tsx +29 -38
  375. package/src/ui/progress.tsx +29 -34
  376. package/src/ui/radio-group.tsx +27 -20
  377. package/src/ui/resizable.tsx +40 -42
  378. package/src/ui/scroll-area.tsx +46 -48
  379. package/src/ui/select.tsx +140 -160
  380. package/src/ui/separator.tsx +10 -2
  381. package/src/ui/sheet.tsx +118 -107
  382. package/src/ui/sidebar.tsx +471 -418
  383. package/src/ui/skeleton.tsx +14 -11
  384. package/src/ui/slider.tsx +27 -54
  385. package/src/ui/sonner.tsx +29 -19
  386. package/src/ui/switch.tsx +27 -21
  387. package/src/ui/table.tsx +102 -97
  388. package/src/ui/tabs.tsx +14 -37
  389. package/src/ui/textarea.tsx +16 -4
  390. package/src/ui/toast.tsx +137 -0
  391. package/src/ui/toggle-group.tsx +37 -55
  392. package/src/ui/toggle.tsx +30 -27
  393. package/src/ui/tooltip.tsx +29 -52
  394. package/src/ui/typography.tsx +85 -0
  395. package/tsconfig.json +2 -1
  396. package/vite.config.ts +20 -2
  397. package/vitest.config.ts +5 -0
  398. package/dist/src/index.test.d.ts +0 -1
  399. package/dist/src/new-components.test.d.ts +0 -1
  400. package/dist/src/renderers/complex/__tests__/data-table.test.d.ts +0 -0
  401. package/dist/src/renderers/complex/calendar-view.d.ts +0 -1
  402. package/dist/src/renderers/complex/chatbot.d.ts +0 -1
  403. package/dist/src/renderers/complex/chatbot.test.d.ts +0 -1
  404. package/dist/src/renderers/complex/timeline.d.ts +0 -1
  405. package/dist/src/ui/calendar-view.d.ts +0 -21
  406. package/dist/src/ui/chatbot.d.ts +0 -36
  407. package/dist/src/ui/field.d.ts +0 -24
  408. package/dist/src/ui/input-group.d.ts +0 -16
  409. package/dist/src/ui/spinner.d.ts +0 -3
  410. package/dist/src/ui/timeline.d.ts +0 -25
  411. package/metadata/ObjectTable.component.yml +0 -41
  412. package/src/renderers/complex/calendar-view.tsx +0 -219
  413. package/src/renderers/complex/chatbot.test.ts +0 -44
  414. package/src/renderers/complex/chatbot.tsx +0 -185
  415. package/src/renderers/complex/timeline.tsx +0 -466
  416. package/src/ui/calendar-view.tsx +0 -503
  417. package/src/ui/chatbot.tsx +0 -240
  418. package/src/ui/field.tsx +0 -246
  419. package/src/ui/input-group.tsx +0 -170
  420. package/src/ui/spinner.tsx +0 -38
  421. package/src/ui/timeline.tsx +0 -266
  422. package/tailwind.config.js +0 -75
  423. /package/dist/src/{ui → custom}/empty.d.ts +0 -0
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import { ComponentRegistry } from '@object-ui/core';
2
10
  import type { FileUploadSchema } from '@object-ui/types';
3
11
  import { Label, Button } from '../../ui';
@@ -87,7 +95,7 @@ ComponentRegistry.register('file-upload',
87
95
  <div
88
96
  onClick={handleClick}
89
97
  className={cn(
90
- "relative overflow-hidden cursor-pointer rounded-lg border-2 border-dashed transition-all duration-300 min-h-[120px] flex flex-col items-center justify-center p-6 gap-3",
98
+ "relative overflow-hidden cursor-pointer rounded-lg border-2 border-dashed transition-all duration-300 min-h-[120px] flex flex-col items-center justify-center p-4 sm:p-6 gap-3",
91
99
  isUploading
92
100
  ? "border-cyan-400 bg-cyan-950/30"
93
101
  : "border-slate-700 bg-slate-900/50 hover:bg-slate-900 hover:border-cyan-500/50 hover:shadow-[0_0_20px_-5px_rgba(6,182,212,0.3)]"
@@ -133,7 +141,7 @@ ComponentRegistry.register('file-upload',
133
141
 
134
142
  <div className="flex items-center gap-3 z-10">
135
143
  <CheckCircle2 className="w-4 h-4 text-emerald-500 rounded-full" />
136
- <span className="truncate max-w-[200px] text-muted-foreground group-hover/file:text-foreground font-mono text-xs transition-colors">{file.name}</span>
144
+ <span className="truncate max-w-[150px] sm:max-w-[200px] md:max-w-[300px] text-muted-foreground group-hover/file:text-foreground font-mono text-xs transition-colors">{file.name}</span>
137
145
  </div>
138
146
 
139
147
  <Button
@@ -157,6 +165,7 @@ ComponentRegistry.register('file-upload',
157
165
  );
158
166
  },
159
167
  {
168
+ namespace: 'ui',
160
169
  label: 'File Upload',
161
170
  inputs: [
162
171
  { name: 'label', type: 'string', label: 'Label' },
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import { ComponentRegistry } from '@object-ui/core';
2
10
  import type { FormSchema, FormField as FormFieldConfig, ValidationRule, FieldCondition, SelectOption } from '@object-ui/types';
3
11
  import { useForm } from 'react-hook-form';
@@ -6,6 +14,7 @@ import { Button } from '../../ui/button';
6
14
  import { Input } from '../../ui/input';
7
15
  import { Textarea } from '../../ui/textarea';
8
16
  import { Checkbox } from '../../ui/checkbox';
17
+ import { Switch } from '../../ui/switch';
9
18
  import {
10
19
  Select,
11
20
  SelectTrigger,
@@ -28,10 +37,12 @@ ComponentRegistry.register('form',
28
37
  submitLabel = 'Submit',
29
38
  cancelLabel = 'Cancel',
30
39
  showCancel = false,
40
+ showSubmit = true,
31
41
  layout = 'vertical',
32
42
  columns = 1,
33
43
  onSubmit: onSubmitProp,
34
44
  onChange: onChangeProp,
45
+ onCancel: onCancelProp,
35
46
  resetOnSubmit = false,
36
47
  validationMode = 'onSubmit',
37
48
  disabled = false,
@@ -46,6 +57,11 @@ ComponentRegistry.register('form',
46
57
  const [isSubmitting, setIsSubmitting] = React.useState(false);
47
58
  const [submitError, setSubmitError] = React.useState<string | null>(null);
48
59
 
60
+ // React to defaultValues changes
61
+ React.useEffect(() => {
62
+ form.reset(defaultValues);
63
+ }, [defaultValues]);
64
+
49
65
  // Watch for form changes - only track changes when onAction is available
50
66
  React.useEffect(() => {
51
67
  if (onAction) {
@@ -65,12 +81,34 @@ ComponentRegistry.register('form',
65
81
  setIsSubmitting(true);
66
82
  setSubmitError(null);
67
83
 
84
+ // Defensive check: If data is an Event, use getValues()
85
+ let formData = data;
86
+ // Check for Event-like properties
87
+ const isEvent = data && (
88
+ (data as any).nativeEvent ||
89
+ typeof (data as any).preventDefault === 'function' ||
90
+ typeof (data as any).stopPropagation === 'function' ||
91
+ (data as any).target ||
92
+ (data as any).bubbles
93
+ );
94
+
95
+ if (isEvent) {
96
+ // This should not happen with RHF handleSubmit, but just in case
97
+ formData = form.getValues();
98
+ } else if (!formData || Object.keys(formData).length === 0) {
99
+ // Fallback: if data is empty check getValues(), in case RHF failed to pass it for some reason
100
+ const values = form.getValues();
101
+ if (values && Object.keys(values).length > 0) {
102
+ formData = values;
103
+ }
104
+ }
105
+
68
106
  try {
69
107
  if (onAction) {
70
108
  const result = await onAction({
71
109
  type: 'form_submit',
72
- data,
73
- formData: data,
110
+ data: formData,
111
+ formData: formData,
74
112
  }) as any;
75
113
 
76
114
  // Check if submission returned an error
@@ -81,7 +119,7 @@ ComponentRegistry.register('form',
81
119
  }
82
120
 
83
121
  if (onSubmitProp && typeof onSubmitProp === 'function') {
84
- await onSubmitProp(data);
122
+ await onSubmitProp(formData);
85
123
  }
86
124
 
87
125
  if (resetOnSubmit) {
@@ -109,6 +147,11 @@ ComponentRegistry.register('form',
109
147
  // Handle cancel
110
148
  const handleCancel = () => {
111
149
  form.reset();
150
+
151
+ if (onCancelProp && typeof onCancelProp === 'function') {
152
+ onCancelProp();
153
+ }
154
+
112
155
  if (onAction) {
113
156
  onAction({
114
157
  type: 'form_cancel',
@@ -118,21 +161,32 @@ ComponentRegistry.register('form',
118
161
  };
119
162
 
120
163
  // Determine grid classes based on columns (explicit classes for Tailwind JIT)
164
+ // Mobile-first: 1 column on mobile, 2 on sm, then md/lg for larger values
121
165
  const gridColsClass =
122
166
  columns === 1 ? '' :
123
- columns === 2 ? 'md:grid-cols-2' :
124
- columns === 3 ? 'md:grid-cols-3' :
125
- 'md:grid-cols-4';
167
+ columns === 2 ? 'sm:grid-cols-2' :
168
+ columns === 3 ? 'sm:grid-cols-2 md:grid-cols-3' :
169
+ 'sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4';
126
170
 
127
171
  const gridClass = columns > 1
128
172
  ? cn('grid gap-4', gridColsClass)
129
173
  : 'space-y-4';
130
174
 
131
- // Extract designer-related props
175
+ // Extract designer-related props and conflicting handlers
132
176
  const {
133
177
  'data-obj-id': dataObjId,
134
178
  'data-obj-type': dataObjType,
135
- style,
179
+ style,
180
+ onSubmit: _ignoredOnSubmit, // Prevent overwriting our handleSubmit
181
+ onChange: _ignoredOnChange, // Prevent overwriting our onChange
182
+ // Extract schema props that should not be spread to DOM (handled separately by schema destructuring above)
183
+ submitLabel: _submitLabel,
184
+ cancelLabel: _cancelLabel,
185
+ showSubmit: _showSubmit,
186
+ showCancel: _showCancel,
187
+ resetOnSubmit: _resetOnSubmit,
188
+ defaultValues: _defaultValues,
189
+ inputType: _inputType,
136
190
  ...formProps
137
191
  } = props;
138
192
 
@@ -232,6 +286,9 @@ ComponentRegistry.register('form',
232
286
  {/* Render the actual field component based on type */}
233
287
  {renderFieldComponent(type, {
234
288
  ...fieldProps,
289
+ // specialized fields needs raw metadata, but we should traverse down if it exists
290
+ // field is the field configuration loop variable
291
+ field: (field as any).field || field,
235
292
  ...formField,
236
293
  inputType: fieldProps.inputType,
237
294
  options: fieldProps.options,
@@ -264,6 +321,7 @@ ComponentRegistry.register('form',
264
321
  {cancelLabel}
265
322
  </Button>
266
323
  )}
324
+ {showSubmit && (
267
325
  <Button
268
326
  type="submit"
269
327
  disabled={isSubmitting || disabled}
@@ -271,6 +329,7 @@ ComponentRegistry.register('form',
271
329
  {isSubmitting && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
272
330
  {submitLabel}
273
331
  </Button>
332
+ )}
274
333
  </div>
275
334
  )}
276
335
  </form>
@@ -278,6 +337,7 @@ ComponentRegistry.register('form',
278
337
  );
279
338
  },
280
339
  {
340
+ namespace: 'ui',
281
341
  label: 'Form',
282
342
  inputs: [
283
343
  {
@@ -363,26 +423,52 @@ interface RenderFieldProps {
363
423
  }
364
424
 
365
425
  function renderFieldComponent(type: string, props: RenderFieldProps) {
426
+ // 1. Try to resolve specialized field widget from registry first
427
+ // We prioritize registry components (e.g., 'field.currency', 'field.date')
428
+ const RegisteredComponent = ComponentRegistry.get(type);
429
+
430
+ if (RegisteredComponent) {
431
+ // For specialized fields (e.g. fields package), they expect 'field' prop.
432
+ // Ensure we pass all props.
433
+ // Also pass 'schema' for standard renderers that expect it
434
+ return <RegisteredComponent schema={props} {...props} />;
435
+ }
436
+
366
437
  const { inputType, options = [], placeholder, ...fieldProps } = props;
367
438
 
368
439
  switch (type) {
369
440
  case 'input':
370
- return <Input type={inputType || 'text'} placeholder={placeholder} {...fieldProps} />;
371
-
441
+ if (inputType === 'file') {
442
+ // File inputs cannot be controlled with value prop
443
+ const { value, ...fileProps } = fieldProps;
444
+ return <Input type="file" placeholder={placeholder} {...fileProps} />;
445
+ }
446
+ return <Input type={inputType || 'text'} placeholder={placeholder} {...fieldProps} value={fieldProps.value ?? ''} />;
447
+
372
448
  case 'textarea':
373
- return <Textarea placeholder={placeholder} {...fieldProps} />;
449
+ return <Textarea placeholder={placeholder} {...fieldProps} value={fieldProps.value ?? ''} />;
374
450
 
375
451
  case 'checkbox': {
376
452
  // For checkbox, we need to handle the value differently
377
453
  const { value, onChange, ...checkboxProps } = fieldProps;
378
454
  return (
379
- <div className="flex items-center space-x-2">
380
- <Checkbox
381
- checked={value}
382
- onCheckedChange={onChange}
383
- {...checkboxProps}
384
- />
385
- </div>
455
+ <Checkbox
456
+ checked={value}
457
+ onCheckedChange={onChange}
458
+ {...checkboxProps}
459
+ />
460
+ );
461
+ }
462
+
463
+ case 'switch': {
464
+ // For switch, we need to handle the value differently (same as checkbox)
465
+ const { value, onChange, ...switchProps } = fieldProps;
466
+ return (
467
+ <Switch
468
+ checked={value}
469
+ onCheckedChange={onChange}
470
+ {...switchProps}
471
+ />
386
472
  );
387
473
  }
388
474
 
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import './form';
2
10
  import './button';
3
11
  import './label';
@@ -14,3 +22,5 @@ import './input-otp';
14
22
  import './calendar';
15
23
  import './date-picker';
16
24
  import './file-upload';
25
+ import './combobox';
26
+ import './command';
@@ -1,24 +1,44 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import { ComponentRegistry } from '@object-ui/core';
2
10
  import type { InputOTPSchema } from '@object-ui/types';
3
11
  import { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator } from '../../ui';
4
12
 
5
13
  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
- ),
14
+ ({ schema, className, onChange, value, ...props }: { schema: InputOTPSchema; className?: string; [key: string]: any }) => {
15
+ const length = schema.maxLength || 6;
16
+ const slots = Array.from({ length });
17
+
18
+ const handleChange = (val: string) => {
19
+ if (onChange) {
20
+ onChange(val);
21
+ }
22
+ };
23
+
24
+ return (
25
+ <InputOTP
26
+ maxLength={length}
27
+ className={className}
28
+ value={value ?? schema.value}
29
+ onChange={handleChange}
30
+ {...props}
31
+ >
32
+ <InputOTPGroup>
33
+ {slots.map((_, i) => (
34
+ <InputOTPSlot key={i} index={i} />
35
+ ))}
36
+ </InputOTPGroup>
37
+ </InputOTP>
38
+ );
39
+ },
21
40
  {
41
+ namespace: 'ui',
22
42
  label: 'Input OTP',
23
43
  inputs: [
24
44
  { name: 'maxLength', type: 'number', label: 'Max Length', defaultValue: 6 },
@@ -1,61 +1,69 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import React from 'react';
2
10
  import { ComponentRegistry } from '@object-ui/core';
3
11
  import type { InputSchema } from '@object-ui/types';
4
12
  import { Input, Label } from '../../ui';
5
13
  import { cn } from '../../lib/utils';
6
14
 
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
- };
15
+ const InputRenderer = ({ schema, className, onChange, value, ...props }: { schema: InputSchema; className?: string; onChange?: (val: any) => void; value?: any; [key: string]: any }) => {
16
+ // Handle change for both raw inputs and form-bound inputs
17
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
18
+ if (onChange) {
19
+ onChange(e.target.value);
20
+ }
21
+ };
22
+
23
+ // Extract designer-related props to apply to the wrapper
24
+ // These props are injected by SchemaRenderer for designer interaction
25
+ const {
26
+ 'data-obj-id': dataObjId,
27
+ 'data-obj-type': dataObjType,
28
+ style,
29
+ ...inputProps
30
+ } = props;
16
31
 
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;
32
+ return (
33
+ <div
34
+ className={cn("grid w-full items-center gap-1.5", schema.wrapperClass)}
35
+ data-obj-id={dataObjId}
36
+ data-obj-type={dataObjType}
37
+ style={style}
38
+ >
39
+ {schema.label && <Label htmlFor={schema.id} className={cn(schema.required && "text-destructive after:content-['*'] after:ml-0.5")}>{schema.label}</Label>}
40
+ <Input
41
+ type={schema.inputType || 'text'}
42
+ id={schema.id}
43
+ name={schema.name}
44
+ placeholder={schema.placeholder}
45
+ className={className}
46
+ required={schema.required}
47
+ disabled={schema.disabled}
48
+ readOnly={schema.readOnly}
49
+ value={value ?? schema.value ?? ''} // Controlled if value provided
50
+ defaultValue={value === undefined ? schema.defaultValue : undefined}
51
+ onChange={handleChange}
52
+ min={schema.min}
53
+ max={schema.max}
54
+ step={schema.step}
55
+ maxLength={schema.maxLength}
56
+ pattern={schema.pattern}
57
+ {...inputProps}
58
+ />
59
+ {schema.description && <p className="text-sm text-muted-foreground">{schema.description}</p>}
60
+ {schema.error && <p className="text-sm font-medium text-destructive">{schema.error}</p>}
61
+ </div>
62
+ );
63
+ };
25
64
 
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
- {
65
+ ComponentRegistry.register('input', InputRenderer, {
66
+ namespace: 'ui',
59
67
  label: 'Input Field',
60
68
  inputs: [
61
69
  { name: 'label', type: 'string', label: 'Label' },
@@ -77,3 +85,37 @@ ComponentRegistry.register('input',
77
85
  }
78
86
  }
79
87
  );
88
+
89
+ ComponentRegistry.register('email',
90
+ (props: any) => <InputRenderer {...props} schema={{ ...props.schema, inputType: 'email' }} />,
91
+ {
92
+ namespace: 'ui',
93
+ label: 'Email Input',
94
+ icon: 'mail',
95
+ inputs: [
96
+ { name: 'label', type: 'string', label: 'Label' },
97
+ { name: 'name', type: 'string', label: 'Field Name' },
98
+ { name: 'placeholder', type: 'string', label: 'Placeholder' },
99
+ { name: 'required', type: 'boolean', label: 'Required' },
100
+ { name: 'disabled', type: 'boolean', label: 'Disabled' },
101
+ { name: 'description', type: 'string', label: 'Description' }
102
+ ]
103
+ }
104
+ );
105
+
106
+ ComponentRegistry.register('password',
107
+ (props: any) => <InputRenderer {...props} schema={{ ...props.schema, inputType: 'password' }} />,
108
+ {
109
+ namespace: 'ui',
110
+ label: 'Password Input',
111
+ icon: 'lock',
112
+ inputs: [
113
+ { name: 'label', type: 'string', label: 'Label' },
114
+ { name: 'name', type: 'string', label: 'Field Name' },
115
+ { name: 'placeholder', type: 'string', label: 'Placeholder' },
116
+ { name: 'required', type: 'boolean', label: 'Required' },
117
+ { name: 'disabled', type: 'boolean', label: 'Disabled' },
118
+ { name: 'description', type: 'string', label: 'Description' }
119
+ ]
120
+ }
121
+ );
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import { ComponentRegistry } from '@object-ui/core';
2
10
  import type { LabelSchema } from '@object-ui/types';
3
11
  import { Label } from '../../ui';
@@ -24,6 +32,7 @@ ComponentRegistry.register('label',
24
32
  );
25
33
  },
26
34
  {
35
+ namespace: 'ui',
27
36
  label: 'Label',
28
37
  inputs: [
29
38
  { name: 'text', type: 'string', label: 'Text', required: true },
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import { ComponentRegistry } from '@object-ui/core';
2
10
  import type { RadioGroupSchema } from '@object-ui/types';
3
11
  import { RadioGroup, RadioGroupItem, Label } from '../../ui';
@@ -30,6 +38,7 @@ ComponentRegistry.register('radio-group',
30
38
  );
31
39
  },
32
40
  {
41
+ namespace: 'ui',
33
42
  label: 'Radio Group',
34
43
  inputs: [
35
44
  { name: 'defaultValue', type: 'string', label: 'Default Value' },
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import { ComponentRegistry } from '@object-ui/core';
2
10
  import type { SelectSchema } from '@object-ui/types';
3
11
  import {
@@ -8,44 +16,64 @@ import {
8
16
  SelectItem,
9
17
  Label
10
18
  } from '../../ui';
19
+ import { cn } from '../../lib/utils';
20
+ import React from 'react';
21
+
22
+ const SelectRenderer = ({ schema, className, onChange, value, ...props }: { schema: SelectSchema; className?: string; onChange?: (val: any) => void; value?: any; [key: string]: any }) => {
23
+ // Extract designer-related props
24
+ const {
25
+ 'data-obj-id': dataObjId,
26
+ 'data-obj-type': dataObjType,
27
+ style,
28
+ ...selectProps
29
+ } = props;
11
30
 
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;
31
+ const handleValueChange = (newValue: string) => {
32
+ if (onChange) {
33
+ onChange(newValue);
34
+ }
35
+ };
21
36
 
22
- return (
37
+ return (
23
38
  <div
24
- className={`grid w-full max-w-sm items-center gap-1.5 ${schema.wrapperClass || ''}`}
39
+ className={cn("grid w-full items-center gap-1.5", schema.wrapperClass)}
25
40
  data-obj-id={dataObjId}
26
41
  data-obj-type={dataObjType}
27
42
  style={style}
28
43
  >
29
- {schema.label && <Label>{schema.label}</Label>}
30
- <Select defaultValue={schema.defaultValue} {...selectProps}>
44
+ {schema.label && <Label className={cn(schema.required && "text-destructive after:content-['*'] after:ml-0.5")}>{schema.label}</Label>}
45
+ <Select
46
+ defaultValue={value === undefined ? schema.defaultValue : undefined}
47
+ value={value ?? schema.value}
48
+ onValueChange={handleValueChange}
49
+ disabled={schema.disabled}
50
+ required={schema.required}
51
+ name={schema.name}
52
+ {...selectProps}
53
+ >
31
54
  <SelectTrigger className={className}>
32
55
  <SelectValue placeholder={schema.placeholder} />
33
56
  </SelectTrigger>
34
57
  <SelectContent>
35
58
  {schema.options?.map((opt) => (
36
- <SelectItem key={opt.value} value={opt.value}>{opt.label}</SelectItem>
59
+ <SelectItem key={opt.value} value={opt.value} disabled={opt.disabled}>{opt.label}</SelectItem>
37
60
  ))}
38
61
  </SelectContent>
39
62
  </Select>
40
63
  </div>
41
64
  );
42
- },
65
+ };
66
+
67
+ ComponentRegistry.register('select', SelectRenderer,
43
68
  {
69
+ namespace: 'ui',
44
70
  label: 'Select',
45
71
  inputs: [
46
72
  { name: 'label', type: 'string', label: 'Label' },
47
73
  { name: 'placeholder', type: 'string', label: 'Placeholder' },
48
74
  { name: 'defaultValue', type: 'string', label: 'Default Value' },
75
+ { name: 'required', type: 'boolean', label: 'Required' },
76
+ { name: 'disabled', type: 'boolean', label: 'Disabled' },
49
77
  {
50
78
  name: 'options',
51
79
  type: 'array',
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import { ComponentRegistry } from '@object-ui/core';
2
10
  import type { SliderSchema } from '@object-ui/types';
3
11
  import { Slider } from '../../ui';
@@ -12,9 +20,16 @@ ComponentRegistry.register('slider',
12
20
  ...sliderProps
13
21
  } = props;
14
22
 
23
+ // Ensure defaultValue is an array for backward compatibility
24
+ const defaultValue = Array.isArray(schema.defaultValue)
25
+ ? schema.defaultValue
26
+ : schema.defaultValue !== undefined
27
+ ? [schema.defaultValue]
28
+ : undefined;
29
+
15
30
  return (
16
31
  <Slider
17
- defaultValue={schema.defaultValue}
32
+ defaultValue={defaultValue}
18
33
  max={schema.max}
19
34
  min={schema.min}
20
35
  step={schema.step}
@@ -26,6 +41,7 @@ ComponentRegistry.register('slider',
26
41
  );
27
42
  },
28
43
  {
44
+ namespace: 'ui',
29
45
  label: 'Slider',
30
46
  inputs: [
31
47
  { name: 'defaultValue', type: 'array', label: 'Default Value', defaultValue: [50] },