@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,145 +1,150 @@
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
+ "use client"
10
+
1
11
  import * as React from "react"
2
12
  import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
3
- import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react"
13
+ import { Check, ChevronRight, Circle } from "lucide-react"
4
14
 
5
15
  import { cn } from "../lib/utils"
6
16
 
7
- function DropdownMenu({
8
- ...props
9
- }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
10
- return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />
11
- }
17
+ const DropdownMenu = DropdownMenuPrimitive.Root
12
18
 
13
- function DropdownMenuPortal({
14
- ...props
15
- }: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
16
- return (
17
- <DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />
18
- )
19
- }
19
+ const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger
20
20
 
21
- function DropdownMenuTrigger({
22
- ...props
23
- }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {
24
- return (
25
- <DropdownMenuPrimitive.Trigger
26
- data-slot="dropdown-menu-trigger"
27
- {...props}
28
- />
29
- )
30
- }
21
+ const DropdownMenuGroup = DropdownMenuPrimitive.Group
31
22
 
32
- function DropdownMenuContent({
33
- className,
34
- sideOffset = 4,
35
- ...props
36
- }: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {
37
- return (
38
- <DropdownMenuPrimitive.Portal>
39
- <DropdownMenuPrimitive.Content
40
- data-slot="dropdown-menu-content"
41
- sideOffset={sideOffset}
42
- className={cn(
43
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
44
- className
45
- )}
46
- {...props}
47
- />
48
- </DropdownMenuPrimitive.Portal>
49
- )
50
- }
23
+ const DropdownMenuPortal = DropdownMenuPrimitive.Portal
51
24
 
52
- function DropdownMenuGroup({
53
- ...props
54
- }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {
55
- return (
56
- <DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />
57
- )
58
- }
25
+ const DropdownMenuSub = DropdownMenuPrimitive.Sub
59
26
 
60
- function DropdownMenuItem({
61
- className,
62
- inset,
63
- variant = "default",
64
- ...props
65
- }: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
66
- inset?: boolean
67
- variant?: "default" | "destructive"
68
- }) {
69
- return (
70
- <DropdownMenuPrimitive.Item
71
- data-slot="dropdown-menu-item"
72
- data-inset={inset}
73
- data-variant={variant}
74
- className={cn(
75
- "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
76
- className
77
- )}
78
- {...props}
79
- />
80
- )
81
- }
27
+ const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup
82
28
 
83
- function DropdownMenuCheckboxItem({
84
- className,
85
- children,
86
- checked,
87
- ...props
88
- }: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {
89
- return (
90
- <DropdownMenuPrimitive.CheckboxItem
91
- data-slot="dropdown-menu-checkbox-item"
29
+ const DropdownMenuSubTrigger = React.forwardRef<
30
+ React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,
31
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {
32
+ inset?: boolean
33
+ }
34
+ >(({ className, inset, children, ...props }, ref) => (
35
+ <DropdownMenuPrimitive.SubTrigger
36
+ ref={ref}
37
+ className={cn(
38
+ "flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
39
+ inset && "pl-8",
40
+ className
41
+ )}
42
+ {...props}
43
+ >
44
+ {children}
45
+ <ChevronRight className="ml-auto" />
46
+ </DropdownMenuPrimitive.SubTrigger>
47
+ ))
48
+ DropdownMenuSubTrigger.displayName =
49
+ DropdownMenuPrimitive.SubTrigger.displayName
50
+
51
+ const DropdownMenuSubContent = React.forwardRef<
52
+ React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
53
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>
54
+ >(({ className, ...props }, ref) => (
55
+ <DropdownMenuPrimitive.SubContent
56
+ ref={ref}
57
+ className={cn(
58
+ "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]",
59
+ className
60
+ )}
61
+ {...props}
62
+ />
63
+ ))
64
+ DropdownMenuSubContent.displayName =
65
+ DropdownMenuPrimitive.SubContent.displayName
66
+
67
+ const DropdownMenuContent = React.forwardRef<
68
+ React.ElementRef<typeof DropdownMenuPrimitive.Content>,
69
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>
70
+ >(({ className, sideOffset = 4, ...props }, ref) => (
71
+ <DropdownMenuPrimitive.Portal>
72
+ <DropdownMenuPrimitive.Content
73
+ ref={ref}
74
+ sideOffset={sideOffset}
92
75
  className={cn(
93
- "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
76
+ "z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]",
94
77
  className
95
78
  )}
96
- checked={checked}
97
- {...props}
98
- >
99
- <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
100
- <DropdownMenuPrimitive.ItemIndicator>
101
- <CheckIcon className="size-4" />
102
- </DropdownMenuPrimitive.ItemIndicator>
103
- </span>
104
- {children}
105
- </DropdownMenuPrimitive.CheckboxItem>
106
- )
107
- }
108
-
109
- function DropdownMenuRadioGroup({
110
- ...props
111
- }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {
112
- return (
113
- <DropdownMenuPrimitive.RadioGroup
114
- data-slot="dropdown-menu-radio-group"
115
79
  {...props}
116
80
  />
117
- )
118
- }
81
+ </DropdownMenuPrimitive.Portal>
82
+ ))
83
+ DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
119
84
 
120
- function DropdownMenuRadioItem({
121
- className,
122
- children,
123
- ...props
124
- }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {
125
- return (
126
- <DropdownMenuPrimitive.RadioItem
127
- data-slot="dropdown-menu-radio-item"
128
- className={cn(
129
- "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
130
- className
131
- )}
132
- {...props}
133
- >
134
- <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
135
- <DropdownMenuPrimitive.ItemIndicator>
136
- <CircleIcon className="size-2 fill-current" />
137
- </DropdownMenuPrimitive.ItemIndicator>
138
- </span>
139
- {children}
140
- </DropdownMenuPrimitive.RadioItem>
141
- )
142
- }
85
+ const DropdownMenuItem = React.forwardRef<
86
+ React.ElementRef<typeof DropdownMenuPrimitive.Item>,
87
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {
88
+ inset?: boolean
89
+ }
90
+ >(({ className, inset, ...props }, ref) => (
91
+ <DropdownMenuPrimitive.Item
92
+ ref={ref}
93
+ className={cn(
94
+ "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
95
+ inset && "pl-8",
96
+ className
97
+ )}
98
+ {...props}
99
+ />
100
+ ))
101
+ DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName
102
+
103
+ const DropdownMenuCheckboxItem = React.forwardRef<
104
+ React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,
105
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>
106
+ >(({ className, children, checked, ...props }, ref) => (
107
+ <DropdownMenuPrimitive.CheckboxItem
108
+ ref={ref}
109
+ className={cn(
110
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
111
+ className
112
+ )}
113
+ checked={checked}
114
+ {...props}
115
+ >
116
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
117
+ <DropdownMenuPrimitive.ItemIndicator>
118
+ <Check className="h-4 w-4" />
119
+ </DropdownMenuPrimitive.ItemIndicator>
120
+ </span>
121
+ {children}
122
+ </DropdownMenuPrimitive.CheckboxItem>
123
+ ))
124
+ DropdownMenuCheckboxItem.displayName =
125
+ DropdownMenuPrimitive.CheckboxItem.displayName
126
+
127
+ const DropdownMenuRadioItem = React.forwardRef<
128
+ React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,
129
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>
130
+ >(({ className, children, ...props }, ref) => (
131
+ <DropdownMenuPrimitive.RadioItem
132
+ ref={ref}
133
+ className={cn(
134
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
135
+ className
136
+ )}
137
+ {...props}
138
+ >
139
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
140
+ <DropdownMenuPrimitive.ItemIndicator>
141
+ <Circle className="h-2 w-2 fill-current" />
142
+ </DropdownMenuPrimitive.ItemIndicator>
143
+ </span>
144
+ {children}
145
+ </DropdownMenuPrimitive.RadioItem>
146
+ ))
147
+ DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName
143
148
 
144
149
  const DropdownMenuLabel = React.forwardRef<
145
150
  React.ElementRef<typeof DropdownMenuPrimitive.Label>,
@@ -149,10 +154,9 @@ const DropdownMenuLabel = React.forwardRef<
149
154
  >(({ className, inset, ...props }, ref) => (
150
155
  <DropdownMenuPrimitive.Label
151
156
  ref={ref}
152
- data-slot="dropdown-menu-label"
153
- data-inset={inset}
154
157
  className={cn(
155
- "px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",
158
+ "px-2 py-1.5 text-sm font-semibold",
159
+ inset && "pl-8",
156
160
  className
157
161
  )}
158
162
  {...props}
@@ -166,89 +170,39 @@ const DropdownMenuSeparator = React.forwardRef<
166
170
  >(({ className, ...props }, ref) => (
167
171
  <DropdownMenuPrimitive.Separator
168
172
  ref={ref}
169
- data-slot="dropdown-menu-separator"
170
- className={cn("bg-border -mx-1 my-1 h-px", className)}
173
+ className={cn("-mx-1 my-1 h-px bg-muted", className)}
171
174
  {...props}
172
175
  />
173
176
  ))
174
177
  DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName
175
178
 
176
- function DropdownMenuShortcut({
179
+ const DropdownMenuShortcut = ({
177
180
  className,
178
181
  ...props
179
- }: React.ComponentProps<"span">) {
182
+ }: React.HTMLAttributes<HTMLSpanElement>) => {
180
183
  return (
181
184
  <span
182
- data-slot="dropdown-menu-shortcut"
183
- className={cn(
184
- "text-muted-foreground ml-auto text-xs tracking-widest",
185
- className
186
- )}
187
- {...props}
188
- />
189
- )
190
- }
191
-
192
- function DropdownMenuSub({
193
- ...props
194
- }: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {
195
- return <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} />
196
- }
197
-
198
- function DropdownMenuSubTrigger({
199
- className,
200
- inset,
201
- children,
202
- ...props
203
- }: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {
204
- inset?: boolean
205
- }) {
206
- return (
207
- <DropdownMenuPrimitive.SubTrigger
208
- data-slot="dropdown-menu-sub-trigger"
209
- data-inset={inset}
210
- className={cn(
211
- "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
212
- className
213
- )}
214
- {...props}
215
- >
216
- {children}
217
- <ChevronRightIcon className="ml-auto size-4" />
218
- </DropdownMenuPrimitive.SubTrigger>
219
- )
220
- }
221
-
222
- function DropdownMenuSubContent({
223
- className,
224
- ...props
225
- }: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {
226
- return (
227
- <DropdownMenuPrimitive.SubContent
228
- data-slot="dropdown-menu-sub-content"
229
- className={cn(
230
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",
231
- className
232
- )}
185
+ className={cn("ml-auto text-xs tracking-widest opacity-60", className)}
233
186
  {...props}
234
187
  />
235
188
  )
236
189
  }
190
+ DropdownMenuShortcut.displayName = "DropdownMenuShortcut"
237
191
 
238
192
  export {
239
193
  DropdownMenu,
240
- DropdownMenuPortal,
241
194
  DropdownMenuTrigger,
242
195
  DropdownMenuContent,
243
- DropdownMenuGroup,
244
- DropdownMenuLabel,
245
196
  DropdownMenuItem,
246
197
  DropdownMenuCheckboxItem,
247
- DropdownMenuRadioGroup,
248
198
  DropdownMenuRadioItem,
199
+ DropdownMenuLabel,
249
200
  DropdownMenuSeparator,
250
201
  DropdownMenuShortcut,
202
+ DropdownMenuGroup,
203
+ DropdownMenuPortal,
251
204
  DropdownMenuSub,
252
- DropdownMenuSubTrigger,
253
205
  DropdownMenuSubContent,
206
+ DropdownMenuSubTrigger,
207
+ DropdownMenuRadioGroup,
254
208
  }
package/src/ui/form.tsx CHANGED
@@ -1,13 +1,20 @@
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
  "use client"
2
10
 
3
11
  import * as React from "react"
4
- import type * as LabelPrimitive from "@radix-ui/react-label"
12
+ import * as LabelPrimitive from "@radix-ui/react-label"
5
13
  import { Slot } from "@radix-ui/react-slot"
6
14
  import {
7
15
  Controller,
8
16
  FormProvider,
9
17
  useFormContext,
10
- useFormState,
11
18
  type ControllerProps,
12
19
  type FieldPath,
13
20
  type FieldValues,
@@ -20,18 +27,16 @@ const Form = FormProvider
20
27
 
21
28
  type FormFieldContextValue<
22
29
  TFieldValues extends FieldValues = FieldValues,
23
- TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
30
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
24
31
  > = {
25
32
  name: TName
26
33
  }
27
34
 
28
- const FormFieldContext = React.createContext<FormFieldContextValue>(
29
- {} as FormFieldContextValue
30
- )
35
+ const FormFieldContext = React.createContext<FormFieldContextValue | null>(null)
31
36
 
32
37
  const FormField = <
33
38
  TFieldValues extends FieldValues = FieldValues,
34
- TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
39
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
35
40
  >({
36
41
  ...props
37
42
  }: ControllerProps<TFieldValues, TName>) => {
@@ -45,14 +50,18 @@ const FormField = <
45
50
  const useFormField = () => {
46
51
  const fieldContext = React.useContext(FormFieldContext)
47
52
  const itemContext = React.useContext(FormItemContext)
48
- const { getFieldState } = useFormContext()
49
- const formState = useFormState({ name: fieldContext.name })
50
- const fieldState = getFieldState(fieldContext.name, formState)
53
+ const { getFieldState, formState } = useFormContext()
51
54
 
52
55
  if (!fieldContext) {
53
56
  throw new Error("useFormField should be used within <FormField>")
54
57
  }
55
58
 
59
+ if (!itemContext) {
60
+ throw new Error("useFormField should be used within <FormItem>")
61
+ }
62
+
63
+ const fieldState = getFieldState(fieldContext.name, formState)
64
+
56
65
  const { id } = itemContext
57
66
 
58
67
  return {
@@ -69,47 +78,48 @@ type FormItemContextValue = {
69
78
  id: string
70
79
  }
71
80
 
72
- const FormItemContext = React.createContext<FormItemContextValue>(
73
- {} as FormItemContextValue
74
- )
81
+ const FormItemContext = React.createContext<FormItemContextValue | null>(null)
75
82
 
76
- function FormItem({ className, ...props }: React.ComponentProps<"div">) {
83
+ const FormItem = React.forwardRef<
84
+ HTMLDivElement,
85
+ React.HTMLAttributes<HTMLDivElement>
86
+ >(({ className, ...props }, ref) => {
77
87
  const id = React.useId()
78
88
 
79
89
  return (
80
90
  <FormItemContext.Provider value={{ id }}>
81
- <div
82
- data-slot="form-item"
83
- className={cn("grid gap-2", className)}
84
- {...props}
85
- />
91
+ <div ref={ref} className={cn("space-y-2", className)} {...props} />
86
92
  </FormItemContext.Provider>
87
93
  )
88
- }
94
+ })
95
+ FormItem.displayName = "FormItem"
89
96
 
90
- function FormLabel({
91
- className,
92
- ...props
93
- }: React.ComponentProps<typeof LabelPrimitive.Root>) {
97
+ const FormLabel = React.forwardRef<
98
+ React.ElementRef<typeof LabelPrimitive.Root>,
99
+ React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>
100
+ >(({ className, ...props }, ref) => {
94
101
  const { error, formItemId } = useFormField()
95
102
 
96
103
  return (
97
104
  <Label
98
- data-slot="form-label"
99
- data-error={!!error}
100
- className={cn("data-[error=true]:text-destructive", className)}
105
+ ref={ref}
106
+ className={cn(error && "text-destructive", className)}
101
107
  htmlFor={formItemId}
102
108
  {...props}
103
109
  />
104
110
  )
105
- }
111
+ })
112
+ FormLabel.displayName = "FormLabel"
106
113
 
107
- function FormControl({ ...props }: React.ComponentProps<typeof Slot>) {
114
+ const FormControl = React.forwardRef<
115
+ React.ElementRef<typeof Slot>,
116
+ React.ComponentPropsWithoutRef<typeof Slot>
117
+ >(({ ...props }, ref) => {
108
118
  const { error, formItemId, formDescriptionId, formMessageId } = useFormField()
109
119
 
110
120
  return (
111
121
  <Slot
112
- data-slot="form-control"
122
+ ref={ref}
113
123
  id={formItemId}
114
124
  aria-describedby={
115
125
  !error
@@ -120,24 +130,32 @@ function FormControl({ ...props }: React.ComponentProps<typeof Slot>) {
120
130
  {...props}
121
131
  />
122
132
  )
123
- }
133
+ })
134
+ FormControl.displayName = "FormControl"
124
135
 
125
- function FormDescription({ className, ...props }: React.ComponentProps<"p">) {
136
+ const FormDescription = React.forwardRef<
137
+ HTMLParagraphElement,
138
+ React.HTMLAttributes<HTMLParagraphElement>
139
+ >(({ className, ...props }, ref) => {
126
140
  const { formDescriptionId } = useFormField()
127
141
 
128
142
  return (
129
143
  <p
130
- data-slot="form-description"
144
+ ref={ref}
131
145
  id={formDescriptionId}
132
- className={cn("text-muted-foreground text-sm", className)}
146
+ className={cn("text-sm text-muted-foreground", className)}
133
147
  {...props}
134
148
  />
135
149
  )
136
- }
150
+ })
151
+ FormDescription.displayName = "FormDescription"
137
152
 
138
- function FormMessage({ className, ...props }: React.ComponentProps<"p">) {
153
+ const FormMessage = React.forwardRef<
154
+ HTMLParagraphElement,
155
+ React.HTMLAttributes<HTMLParagraphElement>
156
+ >(({ className, children, ...props }, ref) => {
139
157
  const { error, formMessageId } = useFormField()
140
- const body = error ? String(error?.message ?? "") : props.children
158
+ const body = error ? String(error?.message ?? "") : children
141
159
 
142
160
  if (!body) {
143
161
  return null
@@ -145,15 +163,16 @@ function FormMessage({ className, ...props }: React.ComponentProps<"p">) {
145
163
 
146
164
  return (
147
165
  <p
148
- data-slot="form-message"
166
+ ref={ref}
149
167
  id={formMessageId}
150
- className={cn("text-destructive text-sm", className)}
168
+ className={cn("text-sm font-medium text-destructive", className)}
151
169
  {...props}
152
170
  >
153
171
  {body}
154
172
  </p>
155
173
  )
156
- }
174
+ })
175
+ FormMessage.displayName = "FormMessage"
157
176
 
158
177
  export {
159
178
  useFormField,
@@ -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
  "use client"
2
10
 
3
11
  import * as React from "react"
@@ -5,40 +13,25 @@ import * as HoverCardPrimitive from "@radix-ui/react-hover-card"
5
13
 
6
14
  import { cn } from "../lib/utils"
7
15
 
8
- function HoverCard({
9
- ...props
10
- }: React.ComponentProps<typeof HoverCardPrimitive.Root>) {
11
- return <HoverCardPrimitive.Root data-slot="hover-card" {...props} />
12
- }
16
+ const HoverCard = HoverCardPrimitive.Root
13
17
 
14
- function HoverCardTrigger({
15
- ...props
16
- }: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {
17
- return (
18
- <HoverCardPrimitive.Trigger data-slot="hover-card-trigger" {...props} />
19
- )
20
- }
18
+ const HoverCardTrigger = HoverCardPrimitive.Trigger
21
19
 
22
- function HoverCardContent({
23
- className,
24
- align = "center",
25
- sideOffset = 4,
26
- ...props
27
- }: React.ComponentProps<typeof HoverCardPrimitive.Content>) {
28
- return (
29
- <HoverCardPrimitive.Portal data-slot="hover-card-portal">
30
- <HoverCardPrimitive.Content
31
- data-slot="hover-card-content"
32
- align={align}
33
- sideOffset={sideOffset}
34
- className={cn(
35
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-64 origin-(--radix-hover-card-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden",
36
- className
37
- )}
38
- {...props}
39
- />
40
- </HoverCardPrimitive.Portal>
41
- )
42
- }
20
+ const HoverCardContent = React.forwardRef<
21
+ React.ElementRef<typeof HoverCardPrimitive.Content>,
22
+ React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>
23
+ >(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
24
+ <HoverCardPrimitive.Content
25
+ ref={ref}
26
+ align={align}
27
+ sideOffset={sideOffset}
28
+ className={cn(
29
+ "z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-hover-card-content-transform-origin]",
30
+ className
31
+ )}
32
+ {...props}
33
+ />
34
+ ))
35
+ HoverCardContent.displayName = HoverCardPrimitive.Content.displayName
43
36
 
44
37
  export { HoverCard, HoverCardTrigger, HoverCardContent }