@object-ui/components 3.1.5 → 3.3.1

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 (495) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +21 -1
  3. package/dist/index.css +6339 -2
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +31896 -31523
  6. package/dist/index.umd.cjs +40 -40
  7. package/dist/{src → packages/components/src}/custom/empty.d.ts +12 -1
  8. package/dist/{src → packages/components/src}/custom/mobile-dialog-content.d.ts +1 -1
  9. package/dist/{src → packages/components/src}/renderers/action/action-bar.d.ts +12 -1
  10. package/dist/{src → packages/components/src}/ui/accordion.d.ts +1 -1
  11. package/dist/{src → packages/components/src}/ui/alert-dialog.d.ts +1 -1
  12. package/dist/packages/components/src/ui/aspect-ratio.d.ts +10 -0
  13. package/dist/{src → packages/components/src}/ui/avatar.d.ts +1 -1
  14. package/dist/{src → packages/components/src}/ui/button.d.ts +1 -1
  15. package/dist/packages/components/src/ui/chart.d.ts +56 -0
  16. package/dist/{src → packages/components/src}/ui/checkbox.d.ts +1 -1
  17. package/dist/{src → packages/components/src}/ui/collapsible.d.ts +8 -1
  18. package/dist/{src → packages/components/src}/ui/command.d.ts +2 -2
  19. package/dist/{src → packages/components/src}/ui/context-menu.d.ts +1 -1
  20. package/dist/{src → packages/components/src}/ui/dialog.d.ts +1 -1
  21. package/dist/{src → packages/components/src}/ui/drawer.d.ts +6 -10
  22. package/dist/{src → packages/components/src}/ui/dropdown-menu.d.ts +1 -1
  23. package/dist/{src → packages/components/src}/ui/form.d.ts +2 -2
  24. package/dist/{src → packages/components/src}/ui/hover-card.d.ts +1 -1
  25. package/dist/{src → packages/components/src}/ui/label.d.ts +1 -1
  26. package/dist/{src → packages/components/src}/ui/menubar.d.ts +1 -1
  27. package/dist/{src → packages/components/src}/ui/navigation-menu.d.ts +1 -1
  28. package/dist/{src → packages/components/src}/ui/popover.d.ts +1 -1
  29. package/dist/{src → packages/components/src}/ui/progress.d.ts +1 -1
  30. package/dist/{src → packages/components/src}/ui/radio-group.d.ts +1 -1
  31. package/dist/packages/components/src/ui/resizable.d.ts +7 -0
  32. package/dist/{src → packages/components/src}/ui/scroll-area.d.ts +1 -1
  33. package/dist/{src → packages/components/src}/ui/select.d.ts +1 -1
  34. package/dist/{src → packages/components/src}/ui/separator.d.ts +1 -1
  35. package/dist/{src → packages/components/src}/ui/sheet.d.ts +1 -2
  36. package/dist/{src → packages/components/src}/ui/sidebar.d.ts +1 -8
  37. package/dist/{src → packages/components/src}/ui/slider.d.ts +1 -1
  38. package/dist/{src → packages/components/src}/ui/switch.d.ts +1 -1
  39. package/dist/{src → packages/components/src}/ui/tabs.d.ts +1 -1
  40. package/dist/{src → packages/components/src}/ui/toast.d.ts +1 -1
  41. package/dist/{src → packages/components/src}/ui/toggle-group.d.ts +1 -1
  42. package/dist/{src → packages/components/src}/ui/toggle.d.ts +1 -1
  43. package/dist/{src → packages/components/src}/ui/tooltip.d.ts +1 -1
  44. package/package.json +68 -20
  45. package/.turbo/turbo-build.log +0 -64
  46. package/README_SHADCN_SYNC.md +0 -281
  47. package/TESTING.md +0 -335
  48. package/dist/src/ui/aspect-ratio.d.ts +0 -3
  49. package/dist/src/ui/chart.d.ts +0 -68
  50. package/dist/src/ui/resizable.d.ts +0 -14
  51. package/docs/FilterBuilder.md +0 -268
  52. package/metadata/Chart.component.yml +0 -30
  53. package/metadata/FilterBuilder.component.yml +0 -39
  54. package/metadata/GridLayout.component.yml +0 -27
  55. package/metadata/Menu.component.yml +0 -31
  56. package/metadata/ObjectForm.component.yml +0 -34
  57. package/metadata/ObjectGrid.component.yml +0 -72
  58. package/metadata/Page.component.yml +0 -24
  59. package/postcss.config.js +0 -14
  60. package/shadcn-components.json +0 -440
  61. package/src/SchemaRenderer.tsx +0 -28
  62. package/src/__tests__/PageRendererRegions.test.tsx +0 -668
  63. package/src/__tests__/README.md +0 -124
  64. package/src/__tests__/__snapshots__/snapshot-critical.test.tsx.snap +0 -811
  65. package/src/__tests__/__snapshots__/snapshot.test.tsx.snap +0 -327
  66. package/src/__tests__/accessibility.test.tsx +0 -137
  67. package/src/__tests__/action-bar.test.tsx +0 -206
  68. package/src/__tests__/api-consistency.test.tsx +0 -596
  69. package/src/__tests__/basic-renderers.test.tsx +0 -255
  70. package/src/__tests__/color-contrast.test.tsx +0 -212
  71. package/src/__tests__/complex-disclosure-renderers.test.tsx +0 -302
  72. package/src/__tests__/compliance.test.tsx +0 -72
  73. package/src/__tests__/config-field-renderer.test.tsx +0 -307
  74. package/src/__tests__/config-panel-renderer.test.tsx +0 -580
  75. package/src/__tests__/config-primitives.test.tsx +0 -106
  76. package/src/__tests__/edge-cases.test.tsx +0 -285
  77. package/src/__tests__/feedback-overlay-renderers.test.tsx +0 -349
  78. package/src/__tests__/filter-builder.test.tsx +0 -409
  79. package/src/__tests__/form-renderers.test.tsx +0 -364
  80. package/src/__tests__/layout-data-renderers.test.tsx +0 -340
  81. package/src/__tests__/mobile-accessibility.test.tsx +0 -120
  82. package/src/__tests__/navigation-overlay.test.tsx +0 -370
  83. package/src/__tests__/snapshot-critical.test.tsx +0 -317
  84. package/src/__tests__/snapshot.test.tsx +0 -205
  85. package/src/__tests__/test-utils.tsx +0 -190
  86. package/src/__tests__/use-config-draft.test.tsx +0 -295
  87. package/src/__tests__/view-compliance.test.tsx +0 -153
  88. package/src/__tests__/wcag-audit.test.tsx +0 -493
  89. package/src/custom/action-param-dialog.tsx +0 -264
  90. package/src/custom/button-group.tsx +0 -91
  91. package/src/custom/combobox.tsx +0 -104
  92. package/src/custom/config-field-renderer.tsx +0 -276
  93. package/src/custom/config-panel-renderer.tsx +0 -306
  94. package/src/custom/config-row.tsx +0 -50
  95. package/src/custom/date-picker.tsx +0 -61
  96. package/src/custom/empty.tsx +0 -112
  97. package/src/custom/field.tsx +0 -81
  98. package/src/custom/filter-builder.tsx +0 -418
  99. package/src/custom/index.ts +0 -21
  100. package/src/custom/input-group.tsx +0 -53
  101. package/src/custom/item.tsx +0 -201
  102. package/src/custom/kbd.tsx +0 -36
  103. package/src/custom/mobile-dialog-content.tsx +0 -67
  104. package/src/custom/native-select.tsx +0 -33
  105. package/src/custom/navigation-overlay.tsx +0 -334
  106. package/src/custom/section-header.tsx +0 -68
  107. package/src/custom/sort-builder.tsx +0 -129
  108. package/src/custom/spinner.tsx +0 -26
  109. package/src/custom/view-skeleton.tsx +0 -243
  110. package/src/custom/view-states.tsx +0 -153
  111. package/src/debug/DebugPanel.tsx +0 -313
  112. package/src/debug/__tests__/DebugPanel.test.tsx +0 -134
  113. package/src/debug/index.ts +0 -10
  114. package/src/hooks/use-config-draft.ts +0 -127
  115. package/src/hooks/use-mobile.tsx +0 -27
  116. package/src/index.css +0 -131
  117. package/src/index.ts +0 -47
  118. package/src/lib/use-sync-external-store-shim.ts +0 -10
  119. package/src/lib/use-sync-external-store-with-selector-shim.ts +0 -90
  120. package/src/lib/utils.tsx +0 -35
  121. package/src/new-components.test.ts +0 -73
  122. package/src/renderers/action/action-bar.tsx +0 -221
  123. package/src/renderers/action/action-button.tsx +0 -158
  124. package/src/renderers/action/action-group.tsx +0 -270
  125. package/src/renderers/action/action-icon.tsx +0 -150
  126. package/src/renderers/action/action-menu.tsx +0 -203
  127. package/src/renderers/action/index.ts +0 -19
  128. package/src/renderers/action/resolve-icon.ts +0 -35
  129. package/src/renderers/basic/button-group.tsx +0 -79
  130. package/src/renderers/basic/div.tsx +0 -60
  131. package/src/renderers/basic/html.tsx +0 -43
  132. package/src/renderers/basic/icon.tsx +0 -89
  133. package/src/renderers/basic/image.tsx +0 -49
  134. package/src/renderers/basic/index.ts +0 -18
  135. package/src/renderers/basic/navigation-menu.tsx +0 -81
  136. package/src/renderers/basic/pagination.tsx +0 -109
  137. package/src/renderers/basic/separator.tsx +0 -57
  138. package/src/renderers/basic/span.tsx +0 -63
  139. package/src/renderers/basic/text.tsx +0 -52
  140. package/src/renderers/complex/README-KANBAN.md +0 -208
  141. package/src/renderers/complex/TIMELINE.md +0 -353
  142. package/src/renderers/complex/__tests__/data-table-airtable-ux.test.tsx +0 -239
  143. package/src/renderers/complex/__tests__/data-table-batch-editing.test.tsx +0 -275
  144. package/src/renderers/complex/__tests__/data-table-cell-renderer.test.tsx +0 -120
  145. package/src/renderers/complex/__tests__/data-table-editing.test.tsx +0 -221
  146. package/src/renderers/complex/__tests__/data-table.test.ts +0 -76
  147. package/src/renderers/complex/carousel.tsx +0 -69
  148. package/src/renderers/complex/data-table.tsx +0 -1243
  149. package/src/renderers/complex/filter-builder.tsx +0 -77
  150. package/src/renderers/complex/index.ts +0 -16
  151. package/src/renderers/complex/resizable.tsx +0 -66
  152. package/src/renderers/complex/scroll-area.tsx +0 -58
  153. package/src/renderers/complex/table.tsx +0 -95
  154. package/src/renderers/data-display/alert.tsx +0 -46
  155. package/src/renderers/data-display/avatar.tsx +0 -38
  156. package/src/renderers/data-display/badge.tsx +0 -55
  157. package/src/renderers/data-display/breadcrumb.tsx +0 -61
  158. package/src/renderers/data-display/index.ts +0 -18
  159. package/src/renderers/data-display/kbd.tsx +0 -50
  160. package/src/renderers/data-display/list.tsx +0 -75
  161. package/src/renderers/data-display/statistic.tsx +0 -95
  162. package/src/renderers/data-display/table.tsx +0 -78
  163. package/src/renderers/data-display/tree-view.tsx +0 -176
  164. package/src/renderers/disclosure/accordion.tsx +0 -69
  165. package/src/renderers/disclosure/collapsible.tsx +0 -53
  166. package/src/renderers/disclosure/index.ts +0 -11
  167. package/src/renderers/disclosure/toggle-group.tsx +0 -79
  168. package/src/renderers/feedback/empty.tsx +0 -49
  169. package/src/renderers/feedback/index.ts +0 -16
  170. package/src/renderers/feedback/loading.tsx +0 -78
  171. package/src/renderers/feedback/progress.tsx +0 -29
  172. package/src/renderers/feedback/skeleton.tsx +0 -31
  173. package/src/renderers/feedback/sonner.tsx +0 -56
  174. package/src/renderers/feedback/spinner.tsx +0 -55
  175. package/src/renderers/feedback/toast.tsx +0 -59
  176. package/src/renderers/feedback/toaster.tsx +0 -23
  177. package/src/renderers/form/button.tsx +0 -103
  178. package/src/renderers/form/calendar.tsx +0 -34
  179. package/src/renderers/form/checkbox.tsx +0 -71
  180. package/src/renderers/form/combobox.tsx +0 -48
  181. package/src/renderers/form/command.tsx +0 -58
  182. package/src/renderers/form/date-picker.tsx +0 -84
  183. package/src/renderers/form/file-upload.tsx +0 -184
  184. package/src/renderers/form/form.tsx +0 -533
  185. package/src/renderers/form/index.ts +0 -26
  186. package/src/renderers/form/input-otp.tsx +0 -51
  187. package/src/renderers/form/input.tsx +0 -121
  188. package/src/renderers/form/label.tsx +0 -45
  189. package/src/renderers/form/radio-group.tsx +0 -63
  190. package/src/renderers/form/select.tsx +0 -94
  191. package/src/renderers/form/slider.tsx +0 -61
  192. package/src/renderers/form/switch.tsx +0 -48
  193. package/src/renderers/form/textarea.tsx +0 -76
  194. package/src/renderers/form/toggle.tsx +0 -42
  195. package/src/renderers/index.ts +0 -18
  196. package/src/renderers/layout/aspect-ratio.tsx +0 -51
  197. package/src/renderers/layout/card.tsx +0 -85
  198. package/src/renderers/layout/container.tsx +0 -122
  199. package/src/renderers/layout/flex.tsx +0 -132
  200. package/src/renderers/layout/grid.tsx +0 -178
  201. package/src/renderers/layout/index.ts +0 -19
  202. package/src/renderers/layout/page.tsx +0 -466
  203. package/src/renderers/layout/semantic.tsx +0 -48
  204. package/src/renderers/layout/stack.tsx +0 -132
  205. package/src/renderers/layout/tabs.tsx +0 -97
  206. package/src/renderers/navigation/header-bar.tsx +0 -118
  207. package/src/renderers/navigation/index.ts +0 -10
  208. package/src/renderers/navigation/sidebar.tsx +0 -208
  209. package/src/renderers/overlay/alert-dialog.tsx +0 -72
  210. package/src/renderers/overlay/context-menu.tsx +0 -100
  211. package/src/renderers/overlay/dialog.tsx +0 -77
  212. package/src/renderers/overlay/drawer.tsx +0 -77
  213. package/src/renderers/overlay/dropdown-menu.tsx +0 -99
  214. package/src/renderers/overlay/hover-card.tsx +0 -55
  215. package/src/renderers/overlay/index.ts +0 -18
  216. package/src/renderers/overlay/menubar.tsx +0 -76
  217. package/src/renderers/overlay/popover.tsx +0 -56
  218. package/src/renderers/overlay/sheet.tsx +0 -77
  219. package/src/renderers/overlay/tooltip.tsx +0 -67
  220. package/src/renderers/placeholders.tsx +0 -107
  221. package/src/stories/CRMApp.stories.tsx +0 -706
  222. package/src/stories/ConfigPanel.stories.tsx +0 -232
  223. package/src/stories/Guide.mdx +0 -55
  224. package/src/stories/MockedData.stories.tsx +0 -121
  225. package/src/stories/assets/accessibility.png +0 -0
  226. package/src/stories/assets/accessibility.svg +0 -1
  227. package/src/stories/assets/addon-library.png +0 -0
  228. package/src/stories/assets/assets.png +0 -0
  229. package/src/stories/assets/avif-test-image.avif +0 -0
  230. package/src/stories/assets/context.png +0 -0
  231. package/src/stories/assets/discord.svg +0 -1
  232. package/src/stories/assets/docs.png +0 -0
  233. package/src/stories/assets/figma-plugin.png +0 -0
  234. package/src/stories/assets/github.svg +0 -1
  235. package/src/stories/assets/share.png +0 -0
  236. package/src/stories/assets/styling.png +0 -0
  237. package/src/stories/assets/testing.png +0 -0
  238. package/src/stories/assets/theming.png +0 -0
  239. package/src/stories/assets/tutorials.svg +0 -1
  240. package/src/stories/assets/youtube.svg +0 -1
  241. package/src/stories/button.css +0 -30
  242. package/src/stories/header.css +0 -32
  243. package/src/stories/page.css +0 -68
  244. package/src/stories-json/Accessibility.mdx +0 -297
  245. package/src/stories-json/EdgeCases.stories.tsx +0 -160
  246. package/src/stories-json/GettingStarted.mdx +0 -89
  247. package/src/stories-json/Introduction.mdx +0 -127
  248. package/src/stories-json/accordion.stories.tsx +0 -43
  249. package/src/stories-json/aggrid.stories.tsx +0 -103
  250. package/src/stories-json/alert.stories.tsx +0 -39
  251. package/src/stories-json/aspect-ratio.stories.tsx +0 -34
  252. package/src/stories-json/avatar.stories.tsx +0 -38
  253. package/src/stories-json/badge.stories.tsx +0 -53
  254. package/src/stories-json/breadcrumb.stories.tsx +0 -30
  255. package/src/stories-json/button-group.stories.tsx +0 -43
  256. package/src/stories-json/button.stories.tsx +0 -73
  257. package/src/stories-json/calendar.stories.tsx +0 -85
  258. package/src/stories-json/card.stories.tsx +0 -48
  259. package/src/stories-json/carousel.stories.tsx +0 -33
  260. package/src/stories-json/charts.stories.tsx +0 -195
  261. package/src/stories-json/chatbot.stories.tsx +0 -248
  262. package/src/stories-json/code-editor.stories.tsx +0 -92
  263. package/src/stories-json/collapsible.stories.tsx +0 -40
  264. package/src/stories-json/controls.stories.tsx +0 -36
  265. package/src/stories-json/crm-live-data.stories.tsx +0 -154
  266. package/src/stories-json/dashboard.stories.tsx +0 -318
  267. package/src/stories-json/data-table.stories.tsx +0 -136
  268. package/src/stories-json/data_display_extras.stories.tsx +0 -102
  269. package/src/stories-json/date-picker.stories.tsx +0 -28
  270. package/src/stories-json/detail-view.stories.tsx +0 -258
  271. package/src/stories-json/dialog.stories.tsx +0 -43
  272. package/src/stories-json/feedback_extras.stories.tsx +0 -40
  273. package/src/stories-json/feedback_others.stories.tsx +0 -46
  274. package/src/stories-json/form-variants.stories.tsx +0 -210
  275. package/src/stories-json/form_advanced.stories.tsx +0 -117
  276. package/src/stories-json/form_extras.stories.tsx +0 -123
  277. package/src/stories-json/grid.stories.tsx +0 -56
  278. package/src/stories-json/icon.stories.tsx +0 -36
  279. package/src/stories-json/input.stories.tsx +0 -52
  280. package/src/stories-json/kanban.stories.tsx +0 -295
  281. package/src/stories-json/layout_extended.stories.tsx +0 -76
  282. package/src/stories-json/layout_flex.stories.tsx +0 -107
  283. package/src/stories-json/list-view.stories.tsx +0 -97
  284. package/src/stories-json/markdown.stories.tsx +0 -129
  285. package/src/stories-json/menus.stories.tsx +0 -63
  286. package/src/stories-json/metric-card.stories.tsx +0 -143
  287. package/src/stories-json/navigation-menu.stories.tsx +0 -37
  288. package/src/stories-json/object-aggrid-advanced.stories.tsx +0 -389
  289. package/src/stories-json/object-aggrid.stories.tsx +0 -252
  290. package/src/stories-json/object-form.stories.tsx +0 -130
  291. package/src/stories-json/object-gantt.stories.tsx +0 -114
  292. package/src/stories-json/object-grid.stories.tsx +0 -315
  293. package/src/stories-json/object-map.stories.tsx +0 -116
  294. package/src/stories-json/object-view.stories.tsx +0 -118
  295. package/src/stories-json/overlay_extras.stories.tsx +0 -113
  296. package/src/stories-json/overlay_others.stories.tsx +0 -76
  297. package/src/stories-json/page.stories.tsx +0 -55
  298. package/src/stories-json/reports.stories.tsx +0 -163
  299. package/src/stories-json/resizable.stories.tsx +0 -44
  300. package/src/stories-json/select.stories.tsx +0 -34
  301. package/src/stories-json/separator.stories.tsx +0 -41
  302. package/src/stories-json/sidebar.stories.tsx +0 -147
  303. package/src/stories-json/statistic.stories.tsx +0 -44
  304. package/src/stories-json/tabs.stories.tsx +0 -51
  305. package/src/stories-json/timeline.stories.tsx +0 -188
  306. package/src/stories-json/typography.stories.tsx +0 -45
  307. package/src/types/config-panel.ts +0 -101
  308. package/src/ui/accordion.tsx +0 -66
  309. package/src/ui/alert-dialog.tsx +0 -149
  310. package/src/ui/alert.tsx +0 -67
  311. package/src/ui/aspect-ratio.tsx +0 -15
  312. package/src/ui/avatar.tsx +0 -58
  313. package/src/ui/badge.tsx +0 -44
  314. package/src/ui/breadcrumb.tsx +0 -123
  315. package/src/ui/button.tsx +0 -66
  316. package/src/ui/calendar.tsx +0 -221
  317. package/src/ui/card.tsx +0 -87
  318. package/src/ui/carousel.tsx +0 -270
  319. package/src/ui/chart.tsx +0 -367
  320. package/src/ui/checkbox.tsx +0 -38
  321. package/src/ui/collapsible.tsx +0 -19
  322. package/src/ui/command.tsx +0 -161
  323. package/src/ui/context-menu.tsx +0 -208
  324. package/src/ui/dialog.tsx +0 -147
  325. package/src/ui/drawer.tsx +0 -126
  326. package/src/ui/dropdown-menu.tsx +0 -208
  327. package/src/ui/form.tsx +0 -186
  328. package/src/ui/hover-card.tsx +0 -37
  329. package/src/ui/index.ts +0 -56
  330. package/src/ui/input-otp.tsx +0 -79
  331. package/src/ui/input.tsx +0 -30
  332. package/src/ui/label.tsx +0 -34
  333. package/src/ui/menubar.tsx +0 -264
  334. package/src/ui/navigation-menu.tsx +0 -136
  335. package/src/ui/pagination.tsx +0 -125
  336. package/src/ui/popover.tsx +0 -39
  337. package/src/ui/progress.tsx +0 -36
  338. package/src/ui/radio-group.tsx +0 -52
  339. package/src/ui/resizable.tsx +0 -53
  340. package/src/ui/scroll-area.tsx +0 -56
  341. package/src/ui/select.tsx +0 -168
  342. package/src/ui/separator.tsx +0 -39
  343. package/src/ui/sheet.tsx +0 -151
  344. package/src/ui/sidebar.tsx +0 -866
  345. package/src/ui/skeleton.tsx +0 -23
  346. package/src/ui/slider.tsx +0 -40
  347. package/src/ui/sonner.tsx +0 -53
  348. package/src/ui/switch.tsx +0 -37
  349. package/src/ui/table.tsx +0 -125
  350. package/src/ui/tabs.tsx +0 -63
  351. package/src/ui/textarea.tsx +0 -30
  352. package/src/ui/toast.tsx +0 -137
  353. package/src/ui/toggle-group.tsx +0 -69
  354. package/src/ui/toggle.tsx +0 -53
  355. package/src/ui/tooltip.tsx +0 -38
  356. package/src/ui/typography.tsx +0 -85
  357. package/tsconfig.json +0 -19
  358. package/vite.config.ts +0 -70
  359. package/vitest.config.ts +0 -5
  360. /package/dist/{src → packages/components/src}/SchemaRenderer.d.ts +0 -0
  361. /package/dist/{src → packages/components/src}/custom/action-param-dialog.d.ts +0 -0
  362. /package/dist/{src → packages/components/src}/custom/button-group.d.ts +0 -0
  363. /package/dist/{src → packages/components/src}/custom/combobox.d.ts +0 -0
  364. /package/dist/{src → packages/components/src}/custom/config-field-renderer.d.ts +0 -0
  365. /package/dist/{src → packages/components/src}/custom/config-panel-renderer.d.ts +0 -0
  366. /package/dist/{src → packages/components/src}/custom/config-row.d.ts +0 -0
  367. /package/dist/{src → packages/components/src}/custom/date-picker.d.ts +0 -0
  368. /package/dist/{src → packages/components/src}/custom/field.d.ts +0 -0
  369. /package/dist/{src → packages/components/src}/custom/filter-builder.d.ts +0 -0
  370. /package/dist/{src → packages/components/src}/custom/index.d.ts +0 -0
  371. /package/dist/{src → packages/components/src}/custom/input-group.d.ts +0 -0
  372. /package/dist/{src → packages/components/src}/custom/item.d.ts +0 -0
  373. /package/dist/{src → packages/components/src}/custom/kbd.d.ts +0 -0
  374. /package/dist/{src → packages/components/src}/custom/native-select.d.ts +0 -0
  375. /package/dist/{src → packages/components/src}/custom/navigation-overlay.d.ts +0 -0
  376. /package/dist/{src → packages/components/src}/custom/section-header.d.ts +0 -0
  377. /package/dist/{src → packages/components/src}/custom/sort-builder.d.ts +0 -0
  378. /package/dist/{src → packages/components/src}/custom/spinner.d.ts +0 -0
  379. /package/dist/{src → packages/components/src}/custom/view-skeleton.d.ts +0 -0
  380. /package/dist/{src → packages/components/src}/custom/view-states.d.ts +0 -0
  381. /package/dist/{src → packages/components/src}/debug/DebugPanel.d.ts +0 -0
  382. /package/dist/{src → packages/components/src}/debug/index.d.ts +0 -0
  383. /package/dist/{src → packages/components/src}/hooks/use-config-draft.d.ts +0 -0
  384. /package/dist/{src → packages/components/src}/hooks/use-mobile.d.ts +0 -0
  385. /package/dist/{src → packages/components/src}/index.d.ts +0 -0
  386. /package/dist/{src → packages/components/src}/lib/use-sync-external-store-shim.d.ts +0 -0
  387. /package/dist/{src → packages/components/src}/lib/use-sync-external-store-with-selector-shim.d.ts +0 -0
  388. /package/dist/{src → packages/components/src}/lib/utils.d.ts +0 -0
  389. /package/dist/{src → packages/components/src}/renderers/action/action-button.d.ts +0 -0
  390. /package/dist/{src → packages/components/src}/renderers/action/action-group.d.ts +0 -0
  391. /package/dist/{src → packages/components/src}/renderers/action/action-icon.d.ts +0 -0
  392. /package/dist/{src → packages/components/src}/renderers/action/action-menu.d.ts +0 -0
  393. /package/dist/{src → packages/components/src}/renderers/action/index.d.ts +0 -0
  394. /package/dist/{src → packages/components/src}/renderers/action/resolve-icon.d.ts +0 -0
  395. /package/dist/{src → packages/components/src}/renderers/basic/button-group.d.ts +0 -0
  396. /package/dist/{src → packages/components/src}/renderers/basic/div.d.ts +0 -0
  397. /package/dist/{src → packages/components/src}/renderers/basic/html.d.ts +0 -0
  398. /package/dist/{src → packages/components/src}/renderers/basic/icon.d.ts +0 -0
  399. /package/dist/{src → packages/components/src}/renderers/basic/image.d.ts +0 -0
  400. /package/dist/{src → packages/components/src}/renderers/basic/index.d.ts +0 -0
  401. /package/dist/{src → packages/components/src}/renderers/basic/navigation-menu.d.ts +0 -0
  402. /package/dist/{src → packages/components/src}/renderers/basic/pagination.d.ts +0 -0
  403. /package/dist/{src → packages/components/src}/renderers/basic/separator.d.ts +0 -0
  404. /package/dist/{src → packages/components/src}/renderers/basic/span.d.ts +0 -0
  405. /package/dist/{src → packages/components/src}/renderers/basic/text.d.ts +0 -0
  406. /package/dist/{src → packages/components/src}/renderers/complex/carousel.d.ts +0 -0
  407. /package/dist/{src → packages/components/src}/renderers/complex/data-table.d.ts +0 -0
  408. /package/dist/{src → packages/components/src}/renderers/complex/filter-builder.d.ts +0 -0
  409. /package/dist/{src → packages/components/src}/renderers/complex/index.d.ts +0 -0
  410. /package/dist/{src → packages/components/src}/renderers/complex/resizable.d.ts +0 -0
  411. /package/dist/{src → packages/components/src}/renderers/complex/scroll-area.d.ts +0 -0
  412. /package/dist/{src → packages/components/src}/renderers/complex/table.d.ts +0 -0
  413. /package/dist/{src → packages/components/src}/renderers/data-display/alert.d.ts +0 -0
  414. /package/dist/{src → packages/components/src}/renderers/data-display/avatar.d.ts +0 -0
  415. /package/dist/{src → packages/components/src}/renderers/data-display/badge.d.ts +0 -0
  416. /package/dist/{src → packages/components/src}/renderers/data-display/breadcrumb.d.ts +0 -0
  417. /package/dist/{src → packages/components/src}/renderers/data-display/index.d.ts +0 -0
  418. /package/dist/{src → packages/components/src}/renderers/data-display/kbd.d.ts +0 -0
  419. /package/dist/{src → packages/components/src}/renderers/data-display/list.d.ts +0 -0
  420. /package/dist/{src → packages/components/src}/renderers/data-display/statistic.d.ts +0 -0
  421. /package/dist/{src → packages/components/src}/renderers/data-display/table.d.ts +0 -0
  422. /package/dist/{src → packages/components/src}/renderers/data-display/tree-view.d.ts +0 -0
  423. /package/dist/{src → packages/components/src}/renderers/disclosure/accordion.d.ts +0 -0
  424. /package/dist/{src → packages/components/src}/renderers/disclosure/collapsible.d.ts +0 -0
  425. /package/dist/{src → packages/components/src}/renderers/disclosure/index.d.ts +0 -0
  426. /package/dist/{src → packages/components/src}/renderers/disclosure/toggle-group.d.ts +0 -0
  427. /package/dist/{src → packages/components/src}/renderers/feedback/empty.d.ts +0 -0
  428. /package/dist/{src → packages/components/src}/renderers/feedback/index.d.ts +0 -0
  429. /package/dist/{src → packages/components/src}/renderers/feedback/loading.d.ts +0 -0
  430. /package/dist/{src → packages/components/src}/renderers/feedback/progress.d.ts +0 -0
  431. /package/dist/{src → packages/components/src}/renderers/feedback/skeleton.d.ts +0 -0
  432. /package/dist/{src → packages/components/src}/renderers/feedback/sonner.d.ts +0 -0
  433. /package/dist/{src → packages/components/src}/renderers/feedback/spinner.d.ts +0 -0
  434. /package/dist/{src → packages/components/src}/renderers/feedback/toast.d.ts +0 -0
  435. /package/dist/{src → packages/components/src}/renderers/feedback/toaster.d.ts +0 -0
  436. /package/dist/{src → packages/components/src}/renderers/form/button.d.ts +0 -0
  437. /package/dist/{src → packages/components/src}/renderers/form/calendar.d.ts +0 -0
  438. /package/dist/{src → packages/components/src}/renderers/form/checkbox.d.ts +0 -0
  439. /package/dist/{src → packages/components/src}/renderers/form/combobox.d.ts +0 -0
  440. /package/dist/{src → packages/components/src}/renderers/form/command.d.ts +0 -0
  441. /package/dist/{src → packages/components/src}/renderers/form/date-picker.d.ts +0 -0
  442. /package/dist/{src → packages/components/src}/renderers/form/file-upload.d.ts +0 -0
  443. /package/dist/{src → packages/components/src}/renderers/form/form.d.ts +0 -0
  444. /package/dist/{src → packages/components/src}/renderers/form/index.d.ts +0 -0
  445. /package/dist/{src → packages/components/src}/renderers/form/input-otp.d.ts +0 -0
  446. /package/dist/{src → packages/components/src}/renderers/form/input.d.ts +0 -0
  447. /package/dist/{src → packages/components/src}/renderers/form/label.d.ts +0 -0
  448. /package/dist/{src → packages/components/src}/renderers/form/radio-group.d.ts +0 -0
  449. /package/dist/{src → packages/components/src}/renderers/form/select.d.ts +0 -0
  450. /package/dist/{src → packages/components/src}/renderers/form/slider.d.ts +0 -0
  451. /package/dist/{src → packages/components/src}/renderers/form/switch.d.ts +0 -0
  452. /package/dist/{src → packages/components/src}/renderers/form/textarea.d.ts +0 -0
  453. /package/dist/{src → packages/components/src}/renderers/form/toggle.d.ts +0 -0
  454. /package/dist/{src → packages/components/src}/renderers/index.d.ts +0 -0
  455. /package/dist/{src → packages/components/src}/renderers/layout/aspect-ratio.d.ts +0 -0
  456. /package/dist/{src → packages/components/src}/renderers/layout/card.d.ts +0 -0
  457. /package/dist/{src → packages/components/src}/renderers/layout/container.d.ts +0 -0
  458. /package/dist/{src → packages/components/src}/renderers/layout/flex.d.ts +0 -0
  459. /package/dist/{src → packages/components/src}/renderers/layout/grid.d.ts +0 -0
  460. /package/dist/{src → packages/components/src}/renderers/layout/index.d.ts +0 -0
  461. /package/dist/{src → packages/components/src}/renderers/layout/page.d.ts +0 -0
  462. /package/dist/{src → packages/components/src}/renderers/layout/semantic.d.ts +0 -0
  463. /package/dist/{src → packages/components/src}/renderers/layout/stack.d.ts +0 -0
  464. /package/dist/{src → packages/components/src}/renderers/layout/tabs.d.ts +0 -0
  465. /package/dist/{src → packages/components/src}/renderers/navigation/header-bar.d.ts +0 -0
  466. /package/dist/{src → packages/components/src}/renderers/navigation/index.d.ts +0 -0
  467. /package/dist/{src → packages/components/src}/renderers/navigation/sidebar.d.ts +0 -0
  468. /package/dist/{src → packages/components/src}/renderers/overlay/alert-dialog.d.ts +0 -0
  469. /package/dist/{src → packages/components/src}/renderers/overlay/context-menu.d.ts +0 -0
  470. /package/dist/{src → packages/components/src}/renderers/overlay/dialog.d.ts +0 -0
  471. /package/dist/{src → packages/components/src}/renderers/overlay/drawer.d.ts +0 -0
  472. /package/dist/{src → packages/components/src}/renderers/overlay/dropdown-menu.d.ts +0 -0
  473. /package/dist/{src → packages/components/src}/renderers/overlay/hover-card.d.ts +0 -0
  474. /package/dist/{src → packages/components/src}/renderers/overlay/index.d.ts +0 -0
  475. /package/dist/{src → packages/components/src}/renderers/overlay/menubar.d.ts +0 -0
  476. /package/dist/{src → packages/components/src}/renderers/overlay/popover.d.ts +0 -0
  477. /package/dist/{src → packages/components/src}/renderers/overlay/sheet.d.ts +0 -0
  478. /package/dist/{src → packages/components/src}/renderers/overlay/tooltip.d.ts +0 -0
  479. /package/dist/{src → packages/components/src}/renderers/placeholders.d.ts +0 -0
  480. /package/dist/{src → packages/components/src}/types/config-panel.d.ts +0 -0
  481. /package/dist/{src → packages/components/src}/ui/alert.d.ts +0 -0
  482. /package/dist/{src → packages/components/src}/ui/badge.d.ts +0 -0
  483. /package/dist/{src → packages/components/src}/ui/breadcrumb.d.ts +0 -0
  484. /package/dist/{src → packages/components/src}/ui/calendar.d.ts +0 -0
  485. /package/dist/{src → packages/components/src}/ui/card.d.ts +0 -0
  486. /package/dist/{src → packages/components/src}/ui/carousel.d.ts +0 -0
  487. /package/dist/{src → packages/components/src}/ui/index.d.ts +0 -0
  488. /package/dist/{src → packages/components/src}/ui/input-otp.d.ts +0 -0
  489. /package/dist/{src → packages/components/src}/ui/input.d.ts +0 -0
  490. /package/dist/{src → packages/components/src}/ui/pagination.d.ts +0 -0
  491. /package/dist/{src → packages/components/src}/ui/skeleton.d.ts +0 -0
  492. /package/dist/{src → packages/components/src}/ui/sonner.d.ts +0 -0
  493. /package/dist/{src → packages/components/src}/ui/table.d.ts +0 -0
  494. /package/dist/{src → packages/components/src}/ui/textarea.d.ts +0 -0
  495. /package/dist/{src → packages/components/src}/ui/typography.d.ts +0 -0
@@ -1,302 +0,0 @@
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 { describe, it, expect, beforeAll } from 'vitest';
10
- import { ComponentRegistry } from '@object-ui/core';
11
- import {
12
- renderComponent,
13
- validateComponentRegistration,
14
- checkDOMStructure,
15
- } from './test-utils';
16
-
17
- // Import renderers to ensure registration
18
- beforeAll(async () => {
19
- await import('../renderers');
20
- }, 30000); // Increase timeout to 30 seconds for heavy renderer imports
21
-
22
- /**
23
- * Comprehensive tests for disclosure renderer components
24
- */
25
- describe('Disclosure Renderers - Display Issue Detection', () => {
26
- describe('Accordion Renderer', () => {
27
- it('should be properly registered', () => {
28
- const validation = validateComponentRegistration('accordion');
29
- expect(validation.isRegistered).toBe(true);
30
- });
31
-
32
- it('should render accordion with items', () => {
33
- const { container } = renderComponent({
34
- type: 'accordion',
35
- items: [
36
- {
37
- title: 'Section 1',
38
- content: 'Content 1',
39
- },
40
- {
41
- title: 'Section 2',
42
- content: 'Content 2',
43
- },
44
- ],
45
- });
46
-
47
- expect(container.textContent).toContain('Section 1');
48
- expect(container.textContent).toContain('Section 2');
49
- });
50
-
51
- it('should not have structural issues', () => {
52
- const { container } = renderComponent({
53
- type: 'accordion',
54
- items: [{ title: 'Test', content: 'Content' }],
55
- });
56
-
57
- const domCheck = checkDOMStructure(container);
58
- expect(domCheck.hasContent).toBe(true);
59
- });
60
- });
61
-
62
- describe('Collapsible Renderer', () => {
63
- it('should be properly registered', () => {
64
- const validation = validateComponentRegistration('collapsible');
65
- expect(validation.isRegistered).toBe(true);
66
- });
67
-
68
- it('should render collapsible component', () => {
69
- const { container } = renderComponent({
70
- type: 'collapsible',
71
- trigger: { type: 'button', label: 'Toggle' },
72
- body: [{ type: 'text', content: 'Hidden content' }],
73
- });
74
-
75
- expect(container.textContent).toContain('Toggle');
76
- });
77
- });
78
-
79
- describe('Toggle Group Renderer', () => {
80
- it('should be properly registered', () => {
81
- const validation = validateComponentRegistration('toggle-group');
82
- expect(validation.isRegistered).toBe(true);
83
- });
84
-
85
- it('should render toggle group with items', () => {
86
- const { container } = renderComponent({
87
- type: 'toggle-group',
88
- selectionType: 'single',
89
- items: [
90
- { value: 'bold', label: 'Bold' },
91
- { value: 'italic', label: 'Italic' },
92
- ],
93
- });
94
-
95
- expect(container).toBeDefined();
96
- });
97
- });
98
- });
99
-
100
- /**
101
- * Comprehensive tests for complex renderer components
102
- */
103
- describe('Complex Renderers - Display Issue Detection', () => {
104
- describe('Data Table Renderer', () => {
105
- it('should be properly registered', () => {
106
- const validation = validateComponentRegistration('data-table');
107
- expect(validation.isRegistered).toBe(true);
108
- expect(validation.hasDefaultProps).toBe(true);
109
- });
110
-
111
- it('should render table with data', () => {
112
- const { container } = renderComponent({
113
- type: 'data-table',
114
- columns: [
115
- { id: 'name', header: 'Name' },
116
- { id: 'age', header: 'Age' },
117
- ],
118
- data: [
119
- { name: 'John', age: 30 },
120
- { name: 'Jane', age: 25 },
121
- ],
122
- });
123
-
124
- expect(container.textContent).toContain('Name');
125
- expect(container.textContent).toContain('Age');
126
- });
127
-
128
- it('should use table semantics', () => {
129
- const { container } = renderComponent({
130
- type: 'data-table',
131
- columns: [{ id: 'col1', header: 'Column 1' }],
132
- data: [{ col1: 'Data' }],
133
- });
134
-
135
- const table = container.querySelector('table');
136
- expect(table || container.querySelector('[role="table"]')).toBeTruthy();
137
- });
138
-
139
- it('should not have excessive nesting', () => {
140
- const { container } = renderComponent({
141
- type: 'data-table',
142
- columns: [{ id: 'col1', header: 'Test' }],
143
- data: [{ col1: 'Value' }],
144
- });
145
-
146
- const domCheck = checkDOMStructure(container);
147
- // Tables can be nested but not excessively
148
- expect(domCheck.nestedDepth).toBeLessThan(25);
149
- });
150
- });
151
-
152
- describe('Carousel Renderer', () => {
153
- it('should be properly registered', () => {
154
- const validation = validateComponentRegistration('carousel');
155
- expect(validation.isRegistered).toBe(true);
156
- });
157
-
158
- it('should render carousel with items', () => {
159
- const { container } = renderComponent({
160
- type: 'carousel',
161
- items: [
162
- { type: 'div', body: [{ type: 'text', content: 'Slide 1' }] },
163
- { type: 'div', body: [{ type: 'text', content: 'Slide 2' }] },
164
- ],
165
- });
166
-
167
- // Carousel should render
168
- expect(container).toBeDefined();
169
- });
170
- });
171
-
172
- describe('Scroll Area Renderer', () => {
173
- it('should be properly registered', () => {
174
- const validation = validateComponentRegistration('scroll-area');
175
- expect(validation.isRegistered).toBe(true);
176
- });
177
-
178
- it('should render scrollable area', () => {
179
- const { container } = renderComponent({
180
- type: 'scroll-area',
181
- children: [{ type: 'text', content: 'Scrollable content' }],
182
- });
183
-
184
- // ScrollArea renders content
185
-
186
- expect(container.textContent).toContain('Scrollable content');
187
- });
188
- });
189
-
190
- describe('Resizable Renderer', () => {
191
- it('should be properly registered', () => {
192
- const validation = validateComponentRegistration('resizable');
193
- expect(validation.isRegistered).toBe(true);
194
- });
195
-
196
- it('should render resizable panels', () => {
197
- const { container } = renderComponent({
198
- type: 'resizable',
199
- panels: [
200
- { content: { type: 'text', content: 'Panel 1' } },
201
- { content: { type: 'text', content: 'Panel 2' } },
202
- ],
203
- });
204
-
205
- expect(container).toBeDefined();
206
- });
207
- });
208
-
209
- describe('Filter Builder Renderer', () => {
210
- it('should be properly registered', () => {
211
- const validation = validateComponentRegistration('filter-builder');
212
- expect(validation.isRegistered).toBe(true);
213
- });
214
-
215
- it('should render filter builder', () => {
216
- const { container } = renderComponent({
217
- type: 'filter-builder',
218
- fields: [
219
- { name: 'name', label: 'Name', type: 'text' },
220
- { name: 'age', label: 'Age', type: 'number' },
221
- ],
222
- });
223
-
224
- expect(container).toBeDefined();
225
- });
226
- });
227
-
228
- describe('Table Renderer', () => {
229
- it('should be properly registered', () => {
230
- const validation = validateComponentRegistration('table');
231
- expect(validation.isRegistered).toBe(true);
232
- });
233
-
234
- it('should render basic table', () => {
235
- const { container } = renderComponent({
236
- type: 'table',
237
- head: {
238
- rows: [
239
- {
240
- cells: [
241
- { type: 'text', content: 'Header 1' },
242
- { type: 'text', content: 'Header 2' },
243
- ],
244
- },
245
- ],
246
- },
247
- body: {
248
- rows: [
249
- {
250
- cells: [
251
- { type: 'text', content: 'Cell 1' },
252
- { type: 'text', content: 'Cell 2' },
253
- ],
254
- },
255
- ],
256
- },
257
- });
258
-
259
- const table = container.querySelector('table');
260
- expect(table).toBeTruthy();
261
- });
262
- });
263
- });
264
-
265
- /**
266
- * Cross-cutting concerns: Tests that apply to all components
267
- */
268
- describe('All Renderers - Cross-Cutting Concerns', () => {
269
- it('should not render components with excessive DOM nesting', () => {
270
- const components = ['div', 'container', 'flex', 'grid'];
271
-
272
- components.forEach(type => {
273
- if (ComponentRegistry.has(type)) {
274
- const { container } = renderComponent({
275
- type,
276
- body: [{ type: 'text', content: 'Test' }],
277
- });
278
-
279
- const domCheck = checkDOMStructure(container);
280
- expect(domCheck.nestedDepth).toBeLessThan(20);
281
- }
282
- });
283
- });
284
-
285
- it('should handle className prop for custom styling', () => {
286
- const components = ['button', 'input', 'div', 'text'];
287
-
288
- components.forEach(type => {
289
- if (ComponentRegistry.has(type)) {
290
- const { container } = renderComponent({
291
- type,
292
- className: 'custom-class',
293
- label: 'Test',
294
- content: 'Test',
295
- });
296
-
297
- // Should render without errors
298
- expect(container).toBeDefined();
299
- }
300
- });
301
- });
302
- });
@@ -1,72 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { render } from '@testing-library/react';
3
- import React from 'react';
4
- import { ComponentRegistry } from '@object-ui/core';
5
-
6
- // Ensure all components are registered
7
- import '../index';
8
-
9
- describe('Component Compliance', () => {
10
- const components = ComponentRegistry.getAllConfigs();
11
-
12
- it('should have components registered', () => {
13
- expect(components.length).toBeGreaterThan(0);
14
- });
15
-
16
- components.forEach((config) => {
17
- describe(`Component: ${config.type}`, () => {
18
- it('should have valid metadata', () => {
19
- expect(config.type).toBeDefined();
20
- expect(config.component).toBeDefined();
21
- // namespace is optional but good practice
22
- // expect(config.namespace).toBeDefined();
23
- });
24
-
25
- it('should define inputs if it has any', () => {
26
- if (config.inputs) {
27
- expect(Array.isArray(config.inputs)).toBe(true);
28
- config.inputs?.forEach((input) => {
29
- expect(input.name).toBeDefined();
30
- expect(input.type).toBeDefined();
31
- });
32
- }
33
- });
34
-
35
- it('should render generic component without crashing', () => {
36
- const Cmp = config.component as React.ComponentType<any>;
37
-
38
- // Skip components that are known to require specific parents or context
39
- // for now, we just try to render them with a basic schema
40
- const schema = {
41
- type: config.type,
42
- id: 'test-id',
43
- className: 'test-class',
44
- props: {
45
- ...config.defaultProps
46
- }
47
- };
48
-
49
- try {
50
- // We wrap in a try-catch for now because some components might strictly require context
51
- // But ideally, renderers should be robust.
52
- // For now, we prefer to shallow render or just check it is a valid function/class
53
- expect(Cmp).toBeDefined();
54
-
55
- /*
56
- Full rendering is risky because of dependencies (e.g. Hooks, Context).
57
- So we will just verify the sanity of the registration for now.
58
- If we want to render, we need a wrapper provider.
59
- */
60
- } catch (e) {
61
- // console.warn(`Render failed for ${config.type}`, e);
62
- }
63
- });
64
-
65
- it('should accept className prop if rendered', () => {
66
- // This is a static check on the 'inputs' metadata to ensure className is exposed?
67
- // No, className is on the BaseSchema, not necessarily in 'inputs' array (which is for Designer).
68
- // But checks that component implementation uses 'cn' are hard to do at runtime without rendering.
69
- });
70
- });
71
- });
72
- });
@@ -1,307 +0,0 @@
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 { describe, it, expect, vi } from 'vitest';
10
- import { render, screen, fireEvent } from '@testing-library/react';
11
- import { ConfigFieldRenderer } from '../custom/config-field-renderer';
12
- import type { ConfigField } from '../types/config-panel';
13
-
14
- const defaultDraft = { name: 'Test', enabled: true, theme: 'dark', count: 5 };
15
-
16
- describe('ConfigFieldRenderer', () => {
17
- describe('input type', () => {
18
- const field: ConfigField = { key: 'name', label: 'Name', type: 'input', placeholder: 'Enter name' };
19
-
20
- it('should render input with label', () => {
21
- render(<ConfigFieldRenderer field={field} value="Test" onChange={vi.fn()} draft={defaultDraft} />);
22
- expect(screen.getByText('Name')).toBeDefined();
23
- expect(screen.getByTestId('config-field-name')).toBeDefined();
24
- });
25
-
26
- it('should display current value', () => {
27
- render(<ConfigFieldRenderer field={field} value="Hello" onChange={vi.fn()} draft={defaultDraft} />);
28
- expect((screen.getByTestId('config-field-name') as HTMLInputElement).value).toBe('Hello');
29
- });
30
-
31
- it('should call onChange on input', () => {
32
- const onChange = vi.fn();
33
- render(<ConfigFieldRenderer field={field} value="" onChange={onChange} draft={defaultDraft} />);
34
- fireEvent.change(screen.getByTestId('config-field-name'), { target: { value: 'New' } });
35
- expect(onChange).toHaveBeenCalledWith('New');
36
- });
37
-
38
- it('should use defaultValue when value is undefined', () => {
39
- const fieldWithDefault: ConfigField = { key: 'name', label: 'Name', type: 'input', defaultValue: 'Default' };
40
- render(<ConfigFieldRenderer field={fieldWithDefault} value={undefined} onChange={vi.fn()} draft={defaultDraft} />);
41
- expect((screen.getByTestId('config-field-name') as HTMLInputElement).value).toBe('Default');
42
- });
43
- });
44
-
45
- describe('switch type', () => {
46
- const field: ConfigField = { key: 'enabled', label: 'Enabled', type: 'switch' };
47
-
48
- it('should render switch with label', () => {
49
- render(<ConfigFieldRenderer field={field} value={true} onChange={vi.fn()} draft={defaultDraft} />);
50
- expect(screen.getByText('Enabled')).toBeDefined();
51
- expect(screen.getByTestId('config-field-enabled')).toBeDefined();
52
- });
53
-
54
- it('should toggle on click', () => {
55
- const onChange = vi.fn();
56
- render(<ConfigFieldRenderer field={field} value={false} onChange={onChange} draft={defaultDraft} />);
57
- fireEvent.click(screen.getByTestId('config-field-enabled'));
58
- expect(onChange).toHaveBeenCalledWith(true);
59
- });
60
- });
61
-
62
- describe('checkbox type', () => {
63
- const field: ConfigField = { key: 'checked', label: 'Active', type: 'checkbox' };
64
-
65
- it('should render checkbox with label', () => {
66
- render(<ConfigFieldRenderer field={field} value={false} onChange={vi.fn()} draft={defaultDraft} />);
67
- expect(screen.getByText('Active')).toBeDefined();
68
- expect(screen.getByTestId('config-field-checked')).toBeDefined();
69
- });
70
-
71
- it('should toggle on click', () => {
72
- const onChange = vi.fn();
73
- render(<ConfigFieldRenderer field={field} value={false} onChange={onChange} draft={defaultDraft} />);
74
- fireEvent.click(screen.getByTestId('config-field-checked'));
75
- expect(onChange).toHaveBeenCalledWith(true);
76
- });
77
- });
78
-
79
- describe('select type', () => {
80
- const field: ConfigField = {
81
- key: 'theme',
82
- label: 'Theme',
83
- type: 'select',
84
- options: [
85
- { value: 'light', label: 'Light' },
86
- { value: 'dark', label: 'Dark' },
87
- { value: 'auto', label: 'Auto' },
88
- ],
89
- };
90
-
91
- it('should render select trigger with label', () => {
92
- render(<ConfigFieldRenderer field={field} value="dark" onChange={vi.fn()} draft={defaultDraft} />);
93
- expect(screen.getByText('Theme')).toBeDefined();
94
- expect(screen.getByTestId('config-field-theme')).toBeDefined();
95
- });
96
- });
97
-
98
- describe('slider type', () => {
99
- const field: ConfigField = {
100
- key: 'count',
101
- label: 'Count',
102
- type: 'slider',
103
- min: 1,
104
- max: 10,
105
- step: 1,
106
- };
107
-
108
- it('should render slider with label and value display', () => {
109
- render(<ConfigFieldRenderer field={field} value={5} onChange={vi.fn()} draft={defaultDraft} />);
110
- expect(screen.getByText('Count')).toBeDefined();
111
- expect(screen.getByText('5')).toBeDefined();
112
- });
113
- });
114
-
115
- describe('color type', () => {
116
- const field: ConfigField = { key: 'bgColor', label: 'Background', type: 'color' };
117
-
118
- it('should render color picker', () => {
119
- render(<ConfigFieldRenderer field={field} value="#ff0000" onChange={vi.fn()} draft={defaultDraft} />);
120
- expect(screen.getByText('Background')).toBeDefined();
121
- const input = screen.getByTestId('config-field-bgColor') as HTMLInputElement;
122
- expect(input.type).toBe('color');
123
- expect(input.value).toBe('#ff0000');
124
- });
125
-
126
- it('should call onChange on color change', () => {
127
- const onChange = vi.fn();
128
- render(<ConfigFieldRenderer field={field} value="#ff0000" onChange={onChange} draft={defaultDraft} />);
129
- fireEvent.change(screen.getByTestId('config-field-bgColor'), { target: { value: '#00ff00' } });
130
- expect(onChange).toHaveBeenCalledWith('#00ff00');
131
- });
132
- });
133
-
134
- describe('icon-group type', () => {
135
- const field: ConfigField = {
136
- key: 'size',
137
- label: 'Size',
138
- type: 'icon-group',
139
- options: [
140
- { value: 'sm', label: 'Small' },
141
- { value: 'md', label: 'Medium' },
142
- { value: 'lg', label: 'Large' },
143
- ],
144
- };
145
-
146
- it('should render icon group buttons', () => {
147
- render(<ConfigFieldRenderer field={field} value="md" onChange={vi.fn()} draft={defaultDraft} />);
148
- expect(screen.getByText('Size')).toBeDefined();
149
- expect(screen.getByTitle('Small')).toBeDefined();
150
- expect(screen.getByTitle('Medium')).toBeDefined();
151
- expect(screen.getByTitle('Large')).toBeDefined();
152
- });
153
-
154
- it('should call onChange when button clicked', () => {
155
- const onChange = vi.fn();
156
- render(<ConfigFieldRenderer field={field} value="sm" onChange={onChange} draft={defaultDraft} />);
157
- fireEvent.click(screen.getByTitle('Large'));
158
- expect(onChange).toHaveBeenCalledWith('lg');
159
- });
160
- });
161
-
162
- describe('custom type', () => {
163
- it('should render custom content via render prop', () => {
164
- const field: ConfigField = {
165
- key: 'custom',
166
- label: 'Custom',
167
- type: 'custom',
168
- render: (value, onChange) => (
169
- <div data-testid="custom-render">
170
- <span>Custom: {value}</span>
171
- <button onClick={() => onChange('updated')}>Update</button>
172
- </div>
173
- ),
174
- };
175
- const onChange = vi.fn();
176
- render(<ConfigFieldRenderer field={field} value="initial" onChange={onChange} draft={defaultDraft} />);
177
- expect(screen.getByTestId('custom-render')).toBeDefined();
178
- expect(screen.getByText('Custom: initial')).toBeDefined();
179
- fireEvent.click(screen.getByText('Update'));
180
- expect(onChange).toHaveBeenCalledWith('updated');
181
- });
182
-
183
- it('should return null for custom type without render', () => {
184
- const field: ConfigField = { key: 'empty', label: 'Empty', type: 'custom' };
185
- const { container } = render(<ConfigFieldRenderer field={field} value={null} onChange={vi.fn()} draft={defaultDraft} />);
186
- expect(container.innerHTML).toBe('');
187
- });
188
- });
189
-
190
- describe('visibility', () => {
191
- it('should hide field when visibleWhen returns false', () => {
192
- const field: ConfigField = {
193
- key: 'hidden',
194
- label: 'Hidden',
195
- type: 'input',
196
- visibleWhen: () => false,
197
- };
198
- const { container } = render(<ConfigFieldRenderer field={field} value="" onChange={vi.fn()} draft={defaultDraft} />);
199
- expect(container.innerHTML).toBe('');
200
- });
201
-
202
- it('should show field when visibleWhen returns true', () => {
203
- const field: ConfigField = {
204
- key: 'visible',
205
- label: 'Visible',
206
- type: 'input',
207
- visibleWhen: (draft) => draft.enabled === true,
208
- };
209
- render(<ConfigFieldRenderer field={field} value="" onChange={vi.fn()} draft={defaultDraft} />);
210
- expect(screen.getByText('Visible')).toBeDefined();
211
- });
212
-
213
- it('should evaluate visibleWhen against draft', () => {
214
- const field: ConfigField = {
215
- key: 'conditional',
216
- label: 'Conditional',
217
- type: 'input',
218
- visibleWhen: (draft) => draft.theme === 'dark',
219
- };
220
- const { container: hidden } = render(
221
- <ConfigFieldRenderer field={field} value="" onChange={vi.fn()} draft={{ ...defaultDraft, theme: 'light' }} />,
222
- );
223
- expect(hidden.innerHTML).toBe('');
224
-
225
- render(<ConfigFieldRenderer field={field} value="" onChange={vi.fn()} draft={{ ...defaultDraft, theme: 'dark' }} />);
226
- expect(screen.getByText('Conditional')).toBeDefined();
227
- });
228
- });
229
-
230
- describe('field-picker type', () => {
231
- it('should render as clickable config row', () => {
232
- const field: ConfigField = { key: 'field', label: 'Select Field', type: 'field-picker', placeholder: 'Choose...' };
233
- render(<ConfigFieldRenderer field={field} value={undefined} onChange={vi.fn()} draft={defaultDraft} />);
234
- expect(screen.getByText('Select Field')).toBeDefined();
235
- expect(screen.getByText('Choose...')).toBeDefined();
236
- });
237
- });
238
-
239
- describe('filter/sort types', () => {
240
- it('should render filter with FilterBuilder', () => {
241
- const field: ConfigField = {
242
- key: 'filter',
243
- label: 'Filters',
244
- type: 'filter',
245
- fields: [
246
- { value: 'name', label: 'Name' },
247
- { value: 'status', label: 'Status' },
248
- ],
249
- };
250
- render(<ConfigFieldRenderer field={field} value={undefined} onChange={vi.fn()} draft={defaultDraft} />);
251
- expect(screen.getByText('Filters')).toBeDefined();
252
- expect(screen.getByTestId('config-field-filter')).toBeDefined();
253
- // FilterBuilder renders 'Where' label and 'Add filter' button
254
- expect(screen.getByText('Add filter')).toBeDefined();
255
- });
256
-
257
- it('should render sort with SortBuilder', () => {
258
- const field: ConfigField = {
259
- key: 'sort',
260
- label: 'Sorting',
261
- type: 'sort',
262
- fields: [
263
- { value: 'name', label: 'Name' },
264
- { value: 'date', label: 'Date' },
265
- ],
266
- };
267
- render(<ConfigFieldRenderer field={field} value={undefined} onChange={vi.fn()} draft={defaultDraft} />);
268
- expect(screen.getByText('Sorting')).toBeDefined();
269
- expect(screen.getByTestId('config-field-sort')).toBeDefined();
270
- // SortBuilder renders 'Add sort' button
271
- expect(screen.getByText('Add sort')).toBeDefined();
272
- });
273
- });
274
-
275
- describe('helpText rendering', () => {
276
- it('should render helpText below field when provided', () => {
277
- const field: ConfigField = {
278
- key: 'width',
279
- label: 'Width',
280
- type: 'input',
281
- helpText: 'Available for drawer, modal, and split modes',
282
- };
283
- render(<ConfigFieldRenderer field={field} value="" onChange={vi.fn()} draft={defaultDraft} />);
284
- expect(screen.getByText('Available for drawer, modal, and split modes')).toBeDefined();
285
- });
286
-
287
- it('should not render helpText paragraph when not provided', () => {
288
- const field: ConfigField = { key: 'name', label: 'Name', type: 'input' };
289
- const { container } = render(<ConfigFieldRenderer field={field} value="" onChange={vi.fn()} draft={defaultDraft} />);
290
- expect(container.querySelectorAll('p').length).toBe(0);
291
- });
292
-
293
- it('should render helpText for custom field type', () => {
294
- const React = require('react');
295
- const field: ConfigField = {
296
- key: 'custom',
297
- label: 'Custom',
298
- type: 'custom',
299
- helpText: 'Custom help text',
300
- render: (value, onChange) => React.createElement('div', { 'data-testid': 'custom-content' }, 'Custom'),
301
- };
302
- render(<ConfigFieldRenderer field={field} value="" onChange={vi.fn()} draft={defaultDraft} />);
303
- expect(screen.getByText('Custom help text')).toBeDefined();
304
- expect(screen.getByTestId('custom-content')).toBeDefined();
305
- });
306
- });
307
- });