@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,50 @@
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 { KbdSchema } from '@object-ui/types';
11
+ import { cn } from '../../lib/utils';
12
+
13
+ ComponentRegistry.register('kbd',
14
+ ({ schema, ...props }: { schema: KbdSchema; [key: string]: any }) => {
15
+ const {
16
+ 'data-obj-id': dataObjId,
17
+ 'data-obj-type': dataObjType,
18
+ style,
19
+ ...kbdProps
20
+ } = props;
21
+
22
+ const keys = Array.isArray(schema.keys) ? schema.keys : [schema.keys || schema.label || 'K'];
23
+
24
+ return (
25
+ <div className={cn('inline-flex flex-wrap gap-1', schema.className)}>
26
+ {keys.map((key, idx) => (
27
+ <kbd
28
+ key={idx}
29
+ className="pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[10px] font-medium text-muted-foreground opacity-100"
30
+ {...kbdProps}
31
+ {...(idx === 0 ? { 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style } : {})}
32
+ >
33
+ {key}
34
+ </kbd>
35
+ ))}
36
+ </div>
37
+ );
38
+ },
39
+ {
40
+ namespace: 'ui',
41
+ label: 'Keyboard Key',
42
+ inputs: [
43
+ { name: 'label', type: 'string', label: 'Label' },
44
+ { name: 'className', type: 'string', label: 'CSS Class' }
45
+ ],
46
+ defaultProps: {
47
+ label: 'K'
48
+ }
49
+ }
50
+ );
@@ -1,68 +1,47 @@
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 { ListSchema } from '@object-ui/types';
3
- import { renderChildren } from '../../lib/utils';
4
- import { cn } from '../../lib/utils';
5
- import { ChevronRight, Hexagon, Terminal } from 'lucide-react';
11
+ import { useDataScope } from '@object-ui/react';
12
+ import { renderChildren, cn } from '../../lib/utils';
6
13
 
7
14
  ComponentRegistry.register('list',
8
15
  ({ schema, className, ...props }: { schema: ListSchema; className?: string; [key: string]: any }) => {
9
- // We use 'ul' for both to control semantics manually with visuals
10
- const ListTag = 'ul';
16
+ // Support data binding
17
+ const boundData = useDataScope(schema.bind);
18
+ const items = boundData || schema.items || [];
11
19
 
12
- return (
13
- <div className={cn("relative p-4 rounded-lg bg-slate-950/30 border border-slate-800/50 backdrop-blur-sm", schema.wrapperClass)}>
14
- {/* Decorative corner accents for container */}
15
- <div className="absolute top-0 left-0 w-2 h-2 border-l-2 border-t-2 border-cyan-500/50 rounded-tl-sm" />
16
- <div className="absolute top-0 right-0 w-2 h-2 border-r-2 border-t-2 border-cyan-500/50 rounded-tr-sm" />
17
- <div className="absolute bottom-0 left-0 w-2 h-2 border-l-2 border-b-2 border-cyan-500/50 rounded-bl-sm" />
18
- <div className="absolute bottom-0 right-0 w-2 h-2 border-r-2 border-b-2 border-cyan-500/50 rounded-br-sm" />
20
+ // We use 'ol' or 'ul' based on ordered prop
21
+ const ListTag = schema.ordered ? 'ol' : 'ul';
22
+
23
+ // Default styles for ordered/unordered
24
+ const listStyle = schema.ordered ? "list-decimal" : "list-disc";
19
25
 
26
+ return (
27
+ <div className={cn("space-y-2", schema.wrapperClass)}>
20
28
  {schema.title && (
21
- <div className="flex items-center gap-2 mb-4 pb-2 border-b border-cyan-900/30">
22
- <Terminal className="w-4 h-4 text-cyan-500" />
23
- <h3 className="text-sm font-bold uppercase tracking-widest text-cyan-400 drop-shadow-[0_0_5px_rgba(6,182,212,0.5)]">
24
- {schema.title}
25
- </h3>
26
- </div>
29
+ <h3 className="text-lg font-semibold tracking-tight">
30
+ {schema.title}
31
+ </h3>
27
32
  )}
28
33
 
29
34
  <ListTag
30
35
  className={cn(
31
- "space-y-1",
36
+ "ml-6 [&>li]:mt-2",
37
+ listStyle,
32
38
  className
33
39
  )}
34
40
  {...props}
35
41
  >
36
- {schema.items?.map((item: any, index: number) => (
37
- <li
38
- key={index}
39
- className={cn(
40
- "group flex items-start gap-3 p-2 rounded-sm transition-all duration-300",
41
- "hover:bg-cyan-950/20 hover:pl-3",
42
- typeof item === 'object' && item.className
43
- )}
44
- >
45
- {/* Marker Area */}
46
- <div className="flex-shrink-0 mt-0.5">
47
- {schema.ordered ? (
48
- <span className="flex items-center justify-center w-5 h-5 text-[10px] font-mono font-bold text-slate-950 bg-cyan-600 rounded-sm shadow-[0_0_8px_cyan] group-hover:bg-cyan-400 group-hover:scale-110 transition-all">
49
- {String(index + 1).padStart(2, '0')}
50
- </span>
51
- ) : (
52
- <div className="relative flex items-center justify-center w-5 h-5">
53
- <Hexagon className="w-3 h-3 text-cyan-600 group-hover:text-cyan-400 group-hover:rotate-90 transition-transform duration-500" />
54
- <div className="absolute inset-0 bg-cyan-500/20 blur-[2px] rounded-full opacity-0 group-hover:opacity-100 transition-opacity" />
55
- </div>
56
- )}
57
- </div>
58
-
59
- {/* Content Area */}
60
- <div className="flex-1 text-sm text-slate-400 group-hover:text-cyan-100 font-medium font-sans leading-tight transition-colors">
61
- {typeof item === 'string' ? item : item.content || renderChildren(item.body)}
62
- </div>
63
-
64
- {/* Hover Indicator */}
65
- <ChevronRight className="w-4 h-4 text-cyan-500/0 -translate-x-2 group-hover:text-cyan-500 group-hover:translate-x-0 transition-all duration-300 opacity-0 group-hover:opacity-100" />
42
+ {items.map((item: any, index: number) => (
43
+ <li key={index} className={cn(typeof item === 'object' && item.className)}>
44
+ {typeof item === 'string' ? item : item.content || renderChildren(item.body)}
66
45
  </li>
67
46
  ))}
68
47
  </ListTag>
@@ -70,6 +49,7 @@ ComponentRegistry.register('list',
70
49
  );
71
50
  },
72
51
  {
52
+ namespace: 'ui',
73
53
  label: 'List',
74
54
  inputs: [
75
55
  { name: 'title', type: 'string', label: 'Title' },
@@ -1,76 +1,73 @@
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 { StatisticSchema } from '@object-ui/types';
3
11
  import { cn } from '../../lib/utils';
4
12
  import { TrendingUp, TrendingDown, Minus } from 'lucide-react';
13
+ import * as LucideIcons from 'lucide-react';
14
+
15
+ // Helper to resolve icon
16
+ const getIcon = (name: string) => {
17
+ if (!name) return null;
18
+ const pascalName = name.split('-').map(part => part.charAt(0).toUpperCase() + part.slice(1)).join('');
19
+ // Dynamic icon lookup from Lucide
20
+ const Icon = LucideIcons[pascalName] || LucideIcons[name];
21
+ return Icon;
22
+ };
5
23
 
6
24
  const StatisticRenderer = ({ schema }: { schema: StatisticSchema }) => {
25
+ const Icon = schema.icon ? getIcon(schema.icon) : null;
26
+
7
27
  return (
8
28
  <div className={cn(
9
- "group relative flex flex-col p-5 rounded-xl transition-all duration-300 overflow-hidden",
10
- "bg-slate-950/40 border border-slate-800/60 backdrop-blur-sm",
11
- "hover:bg-slate-900/60 hover:border-cyan-500/50 hover:shadow-[0_0_30px_-10px_rgba(6,182,212,0.3)]",
29
+ "group relative flex flex-col p-4 sm:p-5 md:p-6 rounded-xl border bg-card text-card-foreground shadow-sm",
12
30
  schema.className
13
31
  )}>
14
- {/* Decorative scanner line */}
15
- <div className="absolute top-0 left-0 w-full h-[1px] bg-linear-to-r from-transparent via-cyan-500/50 to-transparent -translate-x-full group-hover:animate-[shimmer_1.5s_infinite]" />
16
- <div className="absolute inset-0 bg-[url('https://grainy-gradients.vercel.app/noise.svg')] opacity-5 pointer-events-none" />
17
-
18
- {/* Label */}
19
- {schema.label && (
20
- <div className="flex items-center gap-2 mb-2">
21
- <div className="w-1 h-3 bg-cyan-500 rounded-full shadow-[0_0_8px_cyan]" />
22
- <p className="text-[10px] font-mono font-bold uppercase tracking-[0.2em] text-cyan-600/80 group-hover:text-cyan-400 transition-colors">
32
+ {/* Label & Header Icon */}
33
+ <div className="flex items-center justify-between mb-2">
34
+ {schema.label && (
35
+ <p className="text-sm font-medium text-muted-foreground">
23
36
  {schema.label}
24
37
  </p>
25
- </div>
26
- )}
38
+ )}
39
+ {/* Dynamic icon resolution from Lucide, not component creation during render */}
40
+ {/* eslint-disable-next-line */}
41
+ {Icon && <Icon className="h-4 w-4 text-muted-foreground" />}
42
+ </div>
27
43
 
28
44
  {/* Value Area */}
29
- <div className="flex items-baseline gap-3 my-1 relative z-10">
30
- <h3 className={cn(
31
- "text-4xl font-black tracking-tight text-white transition-all duration-300",
32
- "drop-shadow-[0_0_10px_rgba(255,255,255,0.3)]",
33
- "group-hover:scale-110 group-hover:text-cyan-100 group-hover:drop-shadow-[0_0_15px_rgba(6,182,212,0.6)] group-hover:-translate-y-1"
34
- )}>
45
+ <div className="flex items-baseline gap-2">
46
+ <h3 className="text-2xl font-bold tracking-tight">
35
47
  {schema.value}
36
48
  </h3>
49
+ </div>
37
50
 
38
- {/* Trend Indicator */}
39
- {schema.trend && (
40
- <div className={cn(
41
- "flex items-center px-2 py-0.5 rounded-full text-[10px] font-bold border backdrop-blur-md transition-all",
42
- schema.trend === 'up' && "text-emerald-400 border-emerald-500/30 bg-emerald-950/30 shadow-[0_0_10px_-4px_rgba(52,211,153,0.5)]",
43
- schema.trend === 'down' && "text-rose-400 border-rose-500/30 bg-rose-950/30 shadow-[0_0_10px_-4px_rgba(251,113,133,0.5)]",
44
- schema.trend === 'neutral' && "text-amber-400 border-amber-500/30 bg-amber-950/30 shadow-[0_0_10px_-4px_rgba(251,191,36,0.5)]",
45
- "group-hover:scale-105"
46
- )}>
47
- {schema.trend === 'up' && <TrendingUp className="mr-1 h-3 w-3" />}
48
- {schema.trend === 'down' && <TrendingDown className="mr-1 h-3 w-3" />}
51
+ {/* Footer / Trend */}
52
+ {(schema.trend || schema.description) && (
53
+ <div className="mt-1 flex items-center text-xs text-muted-foreground">
54
+ {schema.trend === 'up' && <TrendingUp className="mr-1 h-3 w-3 text-emerald-500" />}
55
+ {schema.trend === 'down' && <TrendingDown className="mr-1 h-3 w-3 text-rose-500" />}
49
56
  {schema.trend === 'neutral' && <Minus className="mr-1 h-3 w-3" />}
50
- {schema.description && <span className="max-w-[100px] truncate">{schema.description}</span>}
57
+ <span className={cn(
58
+ schema.trend === 'up' && "text-emerald-500 font-medium",
59
+ schema.trend === 'down' && "text-rose-500 font-medium",
60
+ )}>
61
+ {schema.description}
62
+ </span>
51
63
  </div>
52
- )}
53
- </div>
54
-
55
- {/* Footer / Description Text if needed below (optional, mostly handled by trend pill now, but keeping separate if text is long) */}
56
- {schema.description && !schema.trend && (
57
- <p className="text-xs text-slate-500 font-mono mt-1 group-hover:text-slate-400 transition-colors">
58
- {schema.description}
59
- </p>
60
64
  )}
61
-
62
- {/* Decorative accent corners */}
63
- <div className="absolute right-0 bottom-0 w-8 h-8 opacity-20 group-hover:opacity-100 transition-opacity">
64
- <svg viewBox="0 0 24 24" fill="none" className="w-full h-full text-cyan-500" stroke="currentColor" strokeWidth="1">
65
- <path d="M22 22L12 22L22 12Z" fill="currentColor" fillOpacity="0.2" />
66
- <path d="M22 17L22 22L17 22" strokeLinecap="round" strokeLinejoin="round" />
67
- </svg>
68
- </div>
69
65
  </div>
70
66
  );
71
67
  };
72
68
 
73
69
  ComponentRegistry.register('statistic', StatisticRenderer, {
70
+ namespace: 'ui',
74
71
  label: 'Statistic',
75
72
  category: 'data-display',
76
73
  icon: 'Activity',
@@ -0,0 +1,78 @@
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 React from 'react';
10
+ import { ComponentRegistry } from '@object-ui/core';
11
+ import { useDataScope } from '@object-ui/react';
12
+ import {
13
+ Table,
14
+ TableBody,
15
+ TableCell,
16
+ TableHead,
17
+ TableHeader,
18
+ TableRow
19
+ } from '../../ui/table';
20
+ import { cn } from '../../lib/utils';
21
+
22
+ export const SimpleTableRenderer = ({ schema, className }: any) => {
23
+ // Try to get data from binding first, then fall back to inline data
24
+ const boundData = useDataScope(schema.bind);
25
+ const data = boundData || schema.data || schema.props?.data || [];
26
+ const columns = schema.columns || schema.props?.columns || [];
27
+
28
+ // If we have data but it's not an array, show error.
29
+ // If data is undefined, we might just be loading or empty.
30
+ if (data && !Array.isArray(data)) {
31
+ return <div className="text-red-500 p-2 border border-red-200 bg-red-50 rounded text-sm">Table data must be an array</div>;
32
+ }
33
+
34
+ const displayData = Array.isArray(data) ? data : [];
35
+
36
+ return (
37
+ <div className={cn("rounded-md border", className)}>
38
+ <Table>
39
+ <TableHeader>
40
+ <TableRow>
41
+ {columns.map((col: any, index: number) => (
42
+ <TableHead key={col.key || col.accessorKey || index}>
43
+ {col.label || col.header}
44
+ </TableHead>
45
+ ))}
46
+ </TableRow>
47
+ </TableHeader>
48
+ <TableBody>
49
+ {displayData.length === 0 ? (
50
+ <TableRow>
51
+ <TableCell colSpan={columns.length} className="h-24 text-center">
52
+ No results.
53
+ </TableCell>
54
+ </TableRow>
55
+ ) : (
56
+ displayData.map((row: any, i: number) => (
57
+ <TableRow key={row.id || i}>
58
+ {columns.map((col: any, index: number) => {
59
+ const accessor = col.key || col.accessorKey || '';
60
+ const value = accessor ? row[accessor] : '';
61
+ return (
62
+ <TableCell key={col.key || col.accessorKey || index}>
63
+ {value}
64
+ </TableCell>
65
+ );
66
+ })}
67
+ </TableRow>
68
+ ))
69
+ )}
70
+ </TableBody>
71
+ </Table>
72
+ </div>
73
+ );
74
+ };
75
+
76
+ ComponentRegistry.register('table', SimpleTableRenderer, {
77
+ namespace: 'ui'
78
+ });
@@ -1,17 +1,24 @@
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 { TreeViewSchema, TreeNode } from '@object-ui/types';
3
11
  import { ChevronRight, ChevronDown, Folder, File, FolderOpen, CircuitBoard } from 'lucide-react';
4
12
  import { useState } from 'react';
5
13
  import { cn } from '../../lib/utils';
14
+ import { useDataScope } from '@object-ui/react';
6
15
 
7
16
  const TreeNodeComponent = ({
8
17
  node,
9
- onNodeClick,
10
- isChild = false
18
+ onNodeClick
11
19
  }: {
12
20
  node: TreeNode;
13
21
  onNodeClick?: (node: TreeNode) => void;
14
- isChild?: boolean;
15
22
  }) => {
16
23
  const [isOpen, setIsOpen] = useState(false);
17
24
  const hasChildren = node.children && node.children.length > 0;
@@ -29,68 +36,56 @@ const TreeNodeComponent = ({
29
36
 
30
37
  return (
31
38
  <div className="relative">
32
- {/* Connecting line for siblings (visual aid, tricky to do perfectly without depth context, so we focus on the left border of the container) */}
33
-
34
39
  <div
35
40
  className={cn(
36
- 'group flex items-center py-1.5 px-2 rounded-sm cursor-pointer transition-all duration-200 border border-transparent',
37
- 'hover:bg-cyan-950/30 hover:border-cyan-500/20 hover:shadow-[inset_0_0_10px_-5px_cyan]',
38
- isOpen && hasChildren && 'bg-slate-900/40' // Active parent state
41
+ 'group flex items-center py-1.5 px-2 rounded-sm cursor-pointer transition-colors',
42
+ 'hover:bg-accent hover:text-accent-foreground',
43
+ isOpen && hasChildren && 'bg-accent/50'
39
44
  )}
40
45
  onClick={handleClick}
41
46
  >
42
- {/* Indentation adjustment triggered by parent's padding/margin, not calculated prop here to allow CSS lines */}
43
-
44
47
  {hasChildren ? (
45
48
  <button
46
49
  onClick={handleToggle}
47
- className="mr-2 p-0.5 h-5 w-5 flex items-center justify-center rounded-sm hover:bg-cyan-500/20 text-cyan-600 transition-colors"
50
+ className="mr-2 p-0.5 h-5 w-5 flex items-center justify-center rounded-sm hover:bg-muted text-muted-foreground transition-colors"
48
51
  >
49
52
  {isOpen ? (
50
- <ChevronDown className="h-4 w-4 drop-shadow-[0_0_5px_cyan]" />
53
+ <ChevronDown className="h-4 w-4" />
51
54
  ) : (
52
55
  <ChevronRight className="h-4 w-4" />
53
56
  )}
54
57
  </button>
55
58
  ) : (
56
59
  <span className="mr-2 w-5 flex justify-center">
57
- <div className="w-1 h-1 rounded-full bg-slate-700/50 group-hover:bg-cyan-500/50" />
60
+ <div className="w-1 h-1 rounded-full bg-muted-foreground/50" />
58
61
  </span>
59
62
  )}
60
63
 
61
64
  {node.icon === 'folder' || hasChildren ? (
62
65
  isOpen ?
63
- <FolderOpen className="h-4 w-4 mr-2 text-cyan-400 drop-shadow-[0_0_5px_rgba(6,182,212,0.5)]" /> :
64
- <Folder className="h-4 w-4 mr-2 text-cyan-600 group-hover:text-cyan-400 transition-colors" />
66
+ <FolderOpen className="h-4 w-4 mr-2 text-primary" /> :
67
+ <Folder className="h-4 w-4 mr-2 text-muted-foreground group-hover:text-primary transition-colors" />
65
68
  ) : (
66
- <File className="h-4 w-4 mr-2 text-slate-500 group-hover:text-cyan-200 transition-colors" />
69
+ <File className="h-4 w-4 mr-2 text-muted-foreground group-hover:text-primary transition-colors" />
67
70
  )}
68
71
 
69
72
  <span className={cn(
70
- "text-sm font-mono tracking-wide transition-colors",
71
- isOpen ? "text-cyan-100 font-bold shadow-cyan-500/20" : "text-slate-400 group-hover:text-cyan-300"
73
+ "text-sm transition-colors",
74
+ isOpen ? "font-medium text-foreground" : "text-muted-foreground group-hover:text-foreground"
72
75
  )}>
73
76
  {node.label}
74
77
  </span>
75
78
  </div>
76
79
 
77
- {/* Children Container with Circuit Line */}
78
80
  {hasChildren && isOpen && (
79
- <div className="relative ml-[11px] pl-3 border-l border-cyan-800/40 animate-in slide-in-from-left-2 fade-in duration-200">
80
- {/* Decorative little bulb at the junction */}
81
- <div className="absolute top-0 -left-[1px] -translate-x-1/2 w-1.5 h-1.5 bg-cyan-700/50 rounded-full" />
82
-
81
+ <div className="relative ml-[11px] pl-3 border-l border-border animate-in slide-in-from-left-2 fade-in duration-200">
83
82
  {node.children!.map((child) => (
84
83
  <TreeNodeComponent
85
84
  key={child.id}
86
85
  node={child}
87
86
  onNodeClick={onNodeClick}
88
- isChild={true}
89
87
  />
90
88
  ))}
91
-
92
- {/* Decorative end cap */}
93
- <div className="absolute bottom-0 -left-[1px] -translate-x-1/2 w-1 h-1 bg-cyan-800/50 rounded-full" />
94
89
  </div>
95
90
  )}
96
91
  </div>
@@ -105,25 +100,24 @@ ComponentRegistry.register('tree-view',
105
100
  }
106
101
  };
107
102
 
103
+ // Support data binding
104
+ const boundData = useDataScope(schema.bind);
105
+ const nodes = boundData || schema.nodes || schema.data || [];
106
+
108
107
  return (
109
108
  <div className={cn(
110
- 'relative border border-border/60 rounded-lg p-3 bg-card/40 backdrop-blur-md overflow-hidden',
111
- 'shadow-lg shadow-primary/5',
109
+ 'relative border rounded-lg p-3 bg-card text-card-foreground',
112
110
  className
113
111
  )}
114
112
  {...props}
115
113
  >
116
- {/* Background Grid */}
117
- <div className="absolute inset-0 bg-[linear-gradient(to_right,hsl(var(--border)/0.1)_1px,transparent_1px),linear-gradient(to_bottom,hsl(var(--border)/0.1)_1px,transparent_1px)] bg-[size:24px_24px] pointer-events-none" />
118
-
119
114
  {schema.title && (
120
- <div className="flex items-center gap-2 mb-3 pb-2 border-b border-primary/20 relative z-10">
121
- <CircuitBoard className="w-4 h-4 text-primary" />
122
- <h3 className="text-xs font-bold font-mono uppercase tracking-widest text-primary">{schema.title}</h3>
115
+ <div className="flex items-center gap-2 mb-3 pb-2 border-b">
116
+ <h3 className="text-sm font-semibold">{schema.title}</h3>
123
117
  </div>
124
118
  )}
125
- <div className="space-y-1 relative z-10">
126
- {schema.nodes?.map((node: TreeNode) => (
119
+ <div className="space-y-1">
120
+ {nodes.map((node: TreeNode) => (
127
121
  <TreeNodeComponent
128
122
  key={node.id}
129
123
  node={node}
@@ -135,6 +129,7 @@ ComponentRegistry.register('tree-view',
135
129
  );
136
130
  },
137
131
  {
132
+ namespace: 'ui',
138
133
  label: 'Tree View',
139
134
  inputs: [
140
135
  { name: 'title', type: 'string', label: 'Title' },
@@ -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 { AccordionSchema } from '@object-ui/types';
3
11
  import {
@@ -22,6 +30,7 @@ ComponentRegistry.register('accordion',
22
30
  </Accordion>
23
31
  ),
24
32
  {
33
+ namespace: 'ui',
25
34
  label: 'Accordion',
26
35
  inputs: [
27
36
  { name: 'accordionType', type: 'enum', enum: ['single', 'multiple'], defaultValue: 'single', label: 'Type' },
@@ -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 { CollapsibleSchema } from '@object-ui/types';
3
11
  import {
@@ -19,6 +27,7 @@ ComponentRegistry.register('collapsible',
19
27
  </Collapsible>
20
28
  ),
21
29
  {
30
+ namespace: 'ui',
22
31
  label: 'Collapsible',
23
32
  inputs: [
24
33
  { name: 'defaultOpen', type: 'boolean', label: 'Default Open' },
@@ -1,2 +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 './accordion';
2
10
  import './collapsible';
11
+ import './toggle-group';
@@ -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 { ToggleGroupSchema } from '@object-ui/types';
11
+ import { ToggleGroup, ToggleGroupItem } from '../../ui/toggle-group';
12
+
13
+ ComponentRegistry.register('toggle-group',
14
+ ({ schema, ...props }: { schema: ToggleGroupSchema; [key: string]: any }) => {
15
+ const {
16
+ 'data-obj-id': dataObjId,
17
+ 'data-obj-type': dataObjType,
18
+ style,
19
+ type, // Extract type to prevent overriding the one we set below
20
+ ...toggleGroupProps
21
+ } = props;
22
+
23
+ return (
24
+ <ToggleGroup
25
+ type={(schema.selectionType || 'single') as any}
26
+ variant={schema.variant}
27
+ size={schema.size}
28
+ value={schema.value as any}
29
+ className={schema.className}
30
+ {...toggleGroupProps}
31
+ {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
32
+ >
33
+ {schema.items?.map((item, idx) => (
34
+ <ToggleGroupItem key={idx} value={item.value} aria-label={item.label}>
35
+ {item.label}
36
+ </ToggleGroupItem>
37
+ ))}
38
+ </ToggleGroup>
39
+ );
40
+ },
41
+ {
42
+ namespace: 'ui',
43
+ label: 'Toggle Group',
44
+ inputs: [
45
+ {
46
+ name: 'selectionType',
47
+ type: 'enum',
48
+ enum: ['single', 'multiple'],
49
+ defaultValue: 'single',
50
+ label: 'Selection Type'
51
+ },
52
+ {
53
+ name: 'variant',
54
+ type: 'enum',
55
+ enum: ['default', 'outline'],
56
+ defaultValue: 'default',
57
+ label: 'Variant'
58
+ },
59
+ {
60
+ name: 'size',
61
+ type: 'enum',
62
+ enum: ['default', 'sm', 'lg'],
63
+ defaultValue: 'default',
64
+ label: 'Size'
65
+ },
66
+ { name: 'className', type: 'string', label: 'CSS Class' }
67
+ ],
68
+ defaultProps: {
69
+ selectionType: 'single',
70
+ variant: 'default',
71
+ size: 'default',
72
+ items: [
73
+ { value: 'bold', label: 'Bold' },
74
+ { value: 'italic', label: 'Italic' },
75
+ { value: 'underline', label: 'Underline' }
76
+ ]
77
+ }
78
+ }
79
+ );