@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
@@ -0,0 +1,129 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
9
+ import * as React from "react"
10
+ import { X, Plus, Trash2 } from "lucide-react"
11
+
12
+ import { cn } from "../lib/utils"
13
+ import { Button } from "../ui/button"
14
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../ui/select"
15
+
16
+ export interface SortItem {
17
+ id: string;
18
+ field: string;
19
+ order: 'asc' | 'desc';
20
+ }
21
+
22
+ export interface SortBuilderProps {
23
+ fields?: Array<{
24
+ value: string
25
+ label: string
26
+ }>;
27
+ value?: SortItem[];
28
+ onChange?: (value: SortItem[]) => void;
29
+ className?: string;
30
+ }
31
+
32
+ export function SortBuilder({
33
+ fields = [],
34
+ value = [],
35
+ onChange,
36
+ className,
37
+ }: SortBuilderProps) {
38
+ // Use internal state initialization prop changes
39
+ const [items, setItems] = React.useState<SortItem[]>(value || []);
40
+
41
+ React.useEffect(() => {
42
+ if (value && JSON.stringify(value) !== JSON.stringify(items)) {
43
+ setItems(value);
44
+ }
45
+ }, [value]);
46
+
47
+ const handleChange = (newItems: SortItem[]) => {
48
+ setItems(newItems);
49
+ onChange?.(newItems);
50
+ };
51
+
52
+ const addItem = () => {
53
+ const newItem: SortItem = {
54
+ id: crypto.randomUUID(),
55
+ field: fields[0]?.value || "",
56
+ order: 'asc',
57
+ };
58
+ handleChange([...items, newItem]);
59
+ };
60
+
61
+ const updateItem = (id: string, updates: Partial<SortItem>) => {
62
+ handleChange(items.map(item => item.id === id ? { ...item, ...updates } : item));
63
+ };
64
+
65
+ const removeItem = (id: string) => {
66
+ handleChange(items.filter(item => item.id !== id));
67
+ };
68
+
69
+ return (
70
+ <div className={cn("space-y-3", className)}>
71
+ <div className="space-y-2">
72
+ {items.map((item, index) => (
73
+ <div key={item.id} className="flex items-center gap-2">
74
+ <span className="text-sm font-medium w-16 text-muted-foreground">
75
+ {index === 0 ? "Sort by" : "Then by"}
76
+ </span>
77
+ <div className="flex-1">
78
+ <Select
79
+ value={item.field}
80
+ onValueChange={(val) => updateItem(item.id, { field: val })}
81
+ >
82
+ <SelectTrigger className="h-9">
83
+ <SelectValue placeholder="Select field" />
84
+ </SelectTrigger>
85
+ <SelectContent>
86
+ {fields.map(f => (
87
+ <SelectItem key={f.value} value={f.value}>{f.label}</SelectItem>
88
+ ))}
89
+ </SelectContent>
90
+ </Select>
91
+ </div>
92
+ <div className="w-28">
93
+ <Select
94
+ value={item.order}
95
+ onValueChange={(val) => updateItem(item.id, { order: val as 'asc' | 'desc' })}
96
+ >
97
+ <SelectTrigger className="h-9">
98
+ <SelectValue />
99
+ </SelectTrigger>
100
+ <SelectContent>
101
+ <SelectItem value="asc">A -&gt; Z</SelectItem>
102
+ <SelectItem value="desc">Z -&gt; A</SelectItem>
103
+ </SelectContent>
104
+ </Select>
105
+ </div>
106
+ <Button
107
+ variant="ghost"
108
+ size="icon-sm"
109
+ className="h-9 w-9 shrink-0"
110
+ onClick={() => removeItem(item.id)}
111
+ >
112
+ <X className="h-4 w-4" />
113
+ </Button>
114
+ </div>
115
+ ))}
116
+ </div>
117
+ <Button
118
+ variant="outline"
119
+ size="sm"
120
+ onClick={addItem}
121
+ className="h-8"
122
+ disabled={fields.length === 0}
123
+ >
124
+ <Plus className="h-3 w-3 mr-2" />
125
+ Add sort
126
+ </Button>
127
+ </div>
128
+ );
129
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
9
+ import * as React from "react"
10
+ import { cn } from "../lib/utils"
11
+ import { Loader2 } from "lucide-react"
12
+
13
+ function Spinner({ className, ...props }: React.ComponentProps<"div">) {
14
+ return (
15
+ <div
16
+ role="status"
17
+ aria-label="Loading"
18
+ className={cn("flex items-center justify-center", className)}
19
+ {...props}
20
+ >
21
+ <Loader2 className="animate-spin text-muted-foreground w-full h-full min-w-4 min-h-4" />
22
+ </div>
23
+ )
24
+ }
25
+
26
+ export { Spinner }
@@ -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 * as React from "react"
2
10
 
3
11
  const MOBILE_BREAKPOINT = 768
package/src/index.css CHANGED
@@ -1,76 +1,127 @@
1
- @tailwind base;
2
- @tailwind components;
3
- @tailwind utilities;
1
+ @import 'tailwindcss';
2
+
3
+ /* Scan sources for Tailwind classes */
4
+ @source '../src/**/*.{ts,tsx}';
5
+
6
+ /* Tailwind plugin for animations */
7
+ @plugin 'tailwindcss-animate';
8
+
9
+ /* Define theme colors for Tailwind 4 */
10
+ @theme {
11
+ /* Border radius tokens */
12
+ --radius-lg: var(--radius);
13
+ --radius-md: calc(var(--radius) - 2px);
14
+ --radius-sm: calc(var(--radius) - 4px);
15
+
16
+ /* Color tokens mapped to CSS variables */
17
+ --color-border: hsl(var(--border));
18
+ --color-input: hsl(var(--input));
19
+ --color-ring: hsl(var(--ring));
20
+ --color-background: hsl(var(--background));
21
+ --color-foreground: hsl(var(--foreground));
22
+ --color-primary: hsl(var(--primary));
23
+ --color-primary-foreground: hsl(var(--primary-foreground));
24
+ --color-secondary: hsl(var(--secondary));
25
+ --color-secondary-foreground: hsl(var(--secondary-foreground));
26
+ --color-destructive: hsl(var(--destructive));
27
+ --color-destructive-foreground: hsl(var(--destructive-foreground));
28
+ --color-muted: hsl(var(--muted));
29
+ --color-muted-foreground: hsl(var(--muted-foreground));
30
+ --color-accent: hsl(var(--accent));
31
+ --color-accent-foreground: hsl(var(--accent-foreground));
32
+ --color-popover: hsl(var(--popover));
33
+ --color-popover-foreground: hsl(var(--popover-foreground));
34
+ --color-card: hsl(var(--card));
35
+ --color-card-foreground: hsl(var(--card-foreground));
36
+
37
+ /* Chart colors */
38
+ --color-chart-1: hsl(var(--chart-1));
39
+ --color-chart-2: hsl(var(--chart-2));
40
+ --color-chart-3: hsl(var(--chart-3));
41
+ --color-chart-4: hsl(var(--chart-4));
42
+ --color-chart-5: hsl(var(--chart-5));
43
+ }
44
+
45
+ /* CSS custom properties for theme */
46
+ :root {
47
+ --background: 0 0% 100%;
48
+ --foreground: 222.2 84% 4.9%;
49
+
50
+ --card: 0 0% 100%;
51
+ --card-foreground: 222.2 84% 4.9%;
4
52
 
5
- @layer base {
6
- :root {
7
- --background: 0 0% 100%;
8
- --foreground: 222.2 84% 4.9%;
53
+ --popover: 0 0% 100%;
54
+ --popover-foreground: 222.2 84% 4.9%;
9
55
 
10
- --card: 0 0% 100%;
11
- --card-foreground: 222.2 84% 4.9%;
56
+ --primary: 222.2 47.4% 11.2%;
57
+ --primary-foreground: 210 40% 98%;
12
58
 
13
- --popover: 0 0% 100%;
14
- --popover-foreground: 222.2 84% 4.9%;
59
+ --secondary: 210 40% 96.1%;
60
+ --secondary-foreground: 222.2 47.4% 11.2%;
15
61
 
16
- --primary: 222.2 47.4% 11.2%;
17
- --primary-foreground: 210 40% 98%;
62
+ --muted: 210 40% 96.1%;
63
+ --muted-foreground: 215.4 16.3% 46.9%;
18
64
 
19
- --secondary: 210 40% 96.1%;
20
- --secondary-foreground: 222.2 47.4% 11.2%;
65
+ --accent: 210 40% 96.1%;
66
+ --accent-foreground: 222.2 47.4% 11.2%;
21
67
 
22
- --muted: 210 40% 96.1%;
23
- --muted-foreground: 215.4 16.3% 46.9%;
68
+ --destructive: 0 84.2% 60.2%;
69
+ --destructive-foreground: 210 40% 98%;
24
70
 
25
- --accent: 210 40% 96.1%;
26
- --accent-foreground: 222.2 47.4% 11.2%;
71
+ --border: 214.3 31.8% 91.4%;
72
+ --input: 214.3 31.8% 91.4%;
73
+ --ring: 222.2 84% 4.9%;
27
74
 
28
- --destructive: 0 84.2% 60.2%;
29
- --destructive-foreground: 210 40% 98%;
75
+ --radius: 0.5rem;
30
76
 
31
- --border: 214.3 31.8% 91.4%;
32
- --input: 214.3 31.8% 91.4%;
33
- --ring: 222.2 84% 4.9%;
77
+ --chart-1: 12 76% 61%;
78
+ --chart-2: 173 58% 39%;
79
+ --chart-3: 197 37% 24%;
80
+ --chart-4: 43 74% 66%;
81
+ --chart-5: 27 87% 67%;
82
+ }
83
+
84
+ .dark {
85
+ --background: 222.2 84% 4.9%;
86
+ --foreground: 210 40% 98%;
34
87
 
35
- --radius: 0.5rem;
36
- }
88
+ --card: 222.2 84% 4.9%;
89
+ --card-foreground: 210 40% 98%;
37
90
 
38
- .dark {
39
- --background: 222.2 84% 4.9%;
40
- --foreground: 210 40% 98%;
91
+ --popover: 222.2 84% 4.9%;
92
+ --popover-foreground: 210 40% 98%;
41
93
 
42
- --card: 222.2 84% 4.9%;
43
- --card-foreground: 210 40% 98%;
94
+ --primary: 210 40% 98%;
95
+ --primary-foreground: 222.2 47.4% 11.2%;
44
96
 
45
- --popover: 222.2 84% 4.9%;
46
- --popover-foreground: 210 40% 98%;
97
+ --secondary: 217.2 32.6% 17.5%;
98
+ --secondary-foreground: 210 40% 98%;
47
99
 
48
- --primary: 210 40% 98%;
49
- --primary-foreground: 222.2 47.4% 11.2%;
100
+ --muted: 217.2 32.6% 17.5%;
101
+ --muted-foreground: 215 20.2% 65.1%;
50
102
 
51
- --secondary: 217.2 32.6% 17.5%;
52
- --secondary-foreground: 210 40% 98%;
103
+ --accent: 217.2 32.6% 17.5%;
104
+ --accent-foreground: 210 40% 98%;
53
105
 
54
- --muted: 217.2 32.6% 17.5%;
55
- --muted-foreground: 215 20.2% 65.1%;
106
+ --destructive: 0 62.8% 30.6%;
107
+ --destructive-foreground: 210 40% 98%;
56
108
 
57
- --accent: 217.2 32.6% 17.5%;
58
- --accent-foreground: 210 40% 98%;
109
+ --border: 217.2 32.6% 17.5%;
110
+ --input: 217.2 32.6% 17.5%;
111
+ --ring: 212.7 26.8% 83.9%;
59
112
 
60
- --destructive: 0 62.8% 30.6%;
61
- --destructive-foreground: 210 40% 98%;
113
+ --chart-1: 220 70% 50%;
114
+ --chart-2: 160 60% 45%;
115
+ --chart-3: 30 80% 55%;
116
+ --chart-4: 280 65% 60%;
117
+ --chart-5: 340 75% 55%;
118
+ }
62
119
 
63
- --border: 217.2 32.6% 17.5%;
64
- --input: 217.2 32.6% 17.5%;
65
- --ring: 212.7 26.8% 83.9%;
66
- }
120
+ * {
121
+ border-color: hsl(var(--border));
67
122
  }
68
123
 
69
- @layer base {
70
- * {
71
- @apply border-border;
72
- }
73
- body {
74
- @apply bg-background text-foreground;
75
- }
124
+ body {
125
+ background-color: hsl(var(--background));
126
+ color: hsl(var(--foreground));
76
127
  }
package/src/index.test.ts CHANGED
@@ -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 { describe, it, expect } from 'vitest';
2
10
 
3
11
  describe('components', () => {
package/src/index.ts CHANGED
@@ -1,10 +1,31 @@
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 './index.css';
2
10
 
3
11
  // Register all ObjectUI renderers (side-effects)
4
12
  import './renderers';
5
13
 
6
14
  // Export utils
7
- export * from './lib/utils';
15
+ export { cn } from './lib/utils';
16
+ export { renderChildren } from './lib/utils';
17
+
18
+ // Export placeholder registration
19
+ export { registerPlaceholders } from './renderers/placeholders';
8
20
 
9
21
  // Export raw Shadcn UI components
10
22
  export * from './ui';
23
+ export * from './custom';
24
+
25
+ // Export an init function to ensure components are registered
26
+ // This is a workaround for bundlers that might tree-shake side-effect imports
27
+ export function initializeComponents() {
28
+ // This function exists to ensure the import side-effects above are executed
29
+ // Simply importing this module should register all components
30
+ return true;
31
+ }
package/src/lib/utils.tsx CHANGED
@@ -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 { clsx, type ClassValue } from "clsx"
2
10
  import { twMerge } from "tailwind-merge"
3
11
  import { SchemaRenderer } from "@object-ui/react"
@@ -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 { describe, it, expect, beforeAll } from 'vitest';
2
10
  import { ComponentRegistry } from '@object-ui/core';
3
11
 
@@ -62,13 +70,4 @@ describe('New Components Registration', () => {
62
70
  expect(component?.label).toBe('Loading');
63
71
  });
64
72
  });
65
-
66
- describe('Complex Components', () => {
67
- it('should register timeline component', () => {
68
- const component = ComponentRegistry.getConfig('timeline');
69
- expect(component).toBeDefined();
70
- expect(component?.label).toBe('Timeline');
71
- expect(component?.category).toBe('data-display');
72
- });
73
- });
74
73
  });
@@ -0,0 +1,79 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
9
+ import { ComponentRegistry } from '@object-ui/core';
10
+ import type { ButtonGroupSchema } from '@object-ui/types';
11
+ import { Button } from '../../ui';
12
+ import { cn } from '../../lib/utils';
13
+
14
+ ComponentRegistry.register('button-group',
15
+ ({ schema, ...props }: { schema: ButtonGroupSchema; [key: string]: any }) => {
16
+ const {
17
+ 'data-obj-id': dataObjId,
18
+ 'data-obj-type': dataObjType,
19
+ style,
20
+ ...buttonGroupProps
21
+ } = props;
22
+
23
+ return (
24
+ <div
25
+ className={cn('flex flex-wrap sm:inline-flex rounded-md shadow-sm', schema.className)}
26
+ role="group"
27
+ {...buttonGroupProps}
28
+ {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
29
+ >
30
+ {schema.buttons?.map((button, idx) => (
31
+ <Button
32
+ key={idx}
33
+ variant={button.variant || schema.variant}
34
+ size={button.size || schema.size}
35
+ className={cn(
36
+ 'rounded-none',
37
+ idx === 0 && 'rounded-l-md',
38
+ idx === (schema.buttons?.length || 0) - 1 && 'rounded-r-md',
39
+ idx > 0 && '-ml-px',
40
+ button.className
41
+ )}
42
+ >
43
+ {button.label}
44
+ </Button>
45
+ ))}
46
+ </div>
47
+ );
48
+ },
49
+ {
50
+ namespace: 'ui',
51
+ label: 'Button Group',
52
+ inputs: [
53
+ {
54
+ name: 'variant',
55
+ type: 'enum',
56
+ enum: ['default', 'destructive', 'outline', 'secondary', 'ghost', 'link'],
57
+ defaultValue: 'default',
58
+ label: 'Variant'
59
+ },
60
+ {
61
+ name: 'size',
62
+ type: 'enum',
63
+ enum: ['default', 'sm', 'lg', 'icon'],
64
+ defaultValue: 'default',
65
+ label: 'Size'
66
+ },
67
+ { name: 'className', type: 'string', label: 'CSS Class' }
68
+ ],
69
+ defaultProps: {
70
+ variant: 'default',
71
+ size: 'default',
72
+ buttons: [
73
+ { label: 'Left' },
74
+ { label: 'Middle' },
75
+ { label: 'Right' }
76
+ ]
77
+ }
78
+ }
79
+ );
@@ -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 { DivSchema } from '@object-ui/types';
3
11
  import { renderChildren } from '../../lib/utils';
@@ -5,6 +13,16 @@ import { forwardRef } from 'react';
5
13
 
6
14
  const DivRenderer = forwardRef<HTMLDivElement, { schema: DivSchema; className?: string; [key: string]: any }>(
7
15
  ({ schema, className, ...props }, ref) => {
16
+ // Deprecation warning
17
+ if (process.env.NODE_ENV !== 'production') {
18
+ console.warn(
19
+ '[ObjectUI] The "div" component is deprecated. Please use Shadcn components instead:\n' +
20
+ ' - For containers: use "card", "flex", or semantic layout components\n' +
21
+ ' - For simple wrappers: use layout components like "container", "stack", or "grid"\n' +
22
+ 'See documentation at https://www.objectui.org/docs/components for alternatives.'
23
+ );
24
+ }
25
+
8
26
  // Extract designer-related props
9
27
  const {
10
28
  'data-obj-id': dataObjId,
@@ -30,12 +48,13 @@ const DivRenderer = forwardRef<HTMLDivElement, { schema: DivSchema; className?:
30
48
  ComponentRegistry.register('div',
31
49
  DivRenderer,
32
50
  {
33
- label: 'Container',
51
+ namespace: 'ui',
52
+ label: 'Container (Deprecated)',
34
53
  inputs: [
35
54
  { name: 'className', type: 'string', label: 'CSS Class' }
36
55
  ],
37
56
  defaultProps: {
38
- className: 'p-4 border border-dashed border-gray-300 rounded min-h-[100px]'
57
+ className: 'p-2 sm:p-4 border border-dashed border-gray-300 rounded min-h-[100px]'
39
58
  }
40
59
  }
41
60
  );
@@ -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 React from 'react';
2
10
  import { ComponentRegistry } from '@object-ui/core';
3
11
  import type { HtmlSchema } from '@object-ui/types';
@@ -26,6 +34,7 @@ ComponentRegistry.register('html',
26
34
  );
27
35
  },
28
36
  {
37
+ namespace: 'ui',
29
38
  label: 'HTML Content',
30
39
  inputs: [
31
40
  { name: 'html', type: 'string', label: 'HTML', description: 'Raw HTML content' }
@@ -1,24 +1,88 @@
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 { IconSchema } from '@object-ui/types';
3
11
  import { icons } from 'lucide-react';
4
12
  import React, { forwardRef } from 'react';
13
+ import { cn } from '../../lib/utils';
14
+
15
+ // Convert kebab-case to PascalCase for Lucide icon names
16
+ // e.g., "arrow-right" -> "ArrowRight", "home" -> "Home"
17
+ function toPascalCase(str: string): string {
18
+ return str
19
+ .split('-')
20
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
21
+ .join('');
22
+ }
23
+
24
+ // Map of renamed icons in lucide-react (from old name to new name)
25
+ const iconNameMap: Record<string, string> = {
26
+ 'Home': 'House', // "Home" was renamed to "House" in lucide-react's icons object
27
+ };
5
28
 
6
29
  const IconRenderer = forwardRef<SVGSVGElement, { schema: IconSchema; className?: string; [key: string]: any }>(
7
30
  ({ schema, className, ...props }, ref) => {
8
- const Icon = (icons as any)[schema.name || schema.icon];
9
- if (!Icon) return null;
10
- return <Icon ref={ref} className={className} {...props} />;
31
+ // Extract designer-related props
32
+ const {
33
+ 'data-obj-id': dataObjId,
34
+ 'data-obj-type': dataObjType,
35
+ style,
36
+ ...iconProps
37
+ } = props;
38
+
39
+ // Convert icon name to PascalCase for Lucide lookup
40
+ const iconName = toPascalCase(schema.name);
41
+ // Apply icon name mapping for renamed icons
42
+ const mappedIconName = iconNameMap[iconName] || iconName;
43
+ const Icon = (icons as any)[mappedIconName];
44
+
45
+ if (!Icon) {
46
+ console.warn(`Icon "${schema.name}" (lookup: "${iconName}"${mappedIconName !== iconName ? ` -> "${mappedIconName}"` : ''}) not found in lucide-react`);
47
+ return null;
48
+ }
49
+
50
+ // Build size style
51
+ const sizeStyle = schema.size ? { width: schema.size, height: schema.size } : undefined;
52
+
53
+ // Merge classNames: schema color, schema className, prop className
54
+ const mergedClassName = cn(
55
+ schema.color,
56
+ schema.className,
57
+ className
58
+ );
59
+
60
+ return (
61
+ <Icon
62
+ ref={ref}
63
+ className={mergedClassName}
64
+ style={{ ...sizeStyle, ...style }}
65
+ {...iconProps}
66
+ // Apply designer props
67
+ {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType }}
68
+ />
69
+ );
11
70
  }
12
71
  );
13
72
 
73
+ IconRenderer.displayName = 'IconRenderer';
74
+
14
75
  ComponentRegistry.register('icon',
15
76
  IconRenderer,
16
77
  {
78
+ namespace: 'ui',
17
79
  label: 'Icon',
18
80
  icon: 'smile',
19
81
  category: 'basic',
20
82
  inputs: [
21
83
  { name: 'name', type: 'string', label: 'Icon Name', defaultValue: 'smile' },
84
+ { name: 'size', type: 'number', label: 'Size (px)' },
85
+ { name: 'color', type: 'string', label: 'Color Class' },
22
86
  { name: 'className', type: 'string', label: 'CSS Class' }
23
87
  ]
24
88
  }