tembro 2.0.4 → 2.0.6

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 (401) hide show
  1. package/dist/components/actions/action-menu.cjs +1 -1
  2. package/dist/components/actions/action-menu.d.ts +13 -1
  3. package/dist/components/actions/action-menu.js +87 -61
  4. package/dist/components/actions/button-group.cjs +1 -1
  5. package/dist/components/actions/button-group.d.ts +9 -1
  6. package/dist/components/actions/button-group.js +58 -14
  7. package/dist/components/actions/copy-button.cjs +1 -1
  8. package/dist/components/actions/copy-button.d.ts +2 -1
  9. package/dist/components/actions/copy-button.js +13 -11
  10. package/dist/components/calendar/calendar.cjs +1 -1
  11. package/dist/components/calendar/calendar.d.ts +14 -1
  12. package/dist/components/calendar/calendar.js +207 -128
  13. package/dist/components/calendar/date-picker.cjs +1 -1
  14. package/dist/components/calendar/date-picker.d.ts +3 -1
  15. package/dist/components/calendar/date-picker.js +57 -27
  16. package/dist/components/calendar/date-range-picker.cjs +1 -1
  17. package/dist/components/calendar/date-range-picker.d.ts +10 -1
  18. package/dist/components/calendar/date-range-picker.js +149 -64
  19. package/dist/components/data-table/data-table-pagination.cjs +1 -1
  20. package/dist/components/data-table/data-table-pagination.js +4 -4
  21. package/dist/components/data-table/data-table-toolbar.cjs +1 -1
  22. package/dist/components/data-table/data-table-toolbar.d.ts +5 -1
  23. package/dist/components/data-table/data-table-toolbar.js +36 -23
  24. package/dist/components/data-table/data-table.cjs +1 -1
  25. package/dist/components/data-table/data-table.d.ts +8 -6
  26. package/dist/components/data-table/data-table.js +89 -80
  27. package/dist/components/data-table/demo.cjs +1 -1
  28. package/dist/components/data-table/demo.js +3 -13
  29. package/dist/components/data-table/index.cjs +1 -1
  30. package/dist/components/data-table/index.js +5 -5
  31. package/dist/components/data-table/public.cjs +1 -1
  32. package/dist/components/data-table/public.d.ts +1 -6
  33. package/dist/components/data-table/public.js +7 -12
  34. package/dist/components/display/activity-feed.cjs +1 -1
  35. package/dist/components/display/activity-feed.d.ts +12 -1
  36. package/dist/components/display/activity-feed.js +69 -47
  37. package/dist/components/display/carousel.cjs +1 -1
  38. package/dist/components/display/carousel.d.ts +16 -1
  39. package/dist/components/display/carousel.js +71 -26
  40. package/dist/components/display/code-block.cjs +2 -1
  41. package/dist/components/display/code-block.d.ts +3 -1
  42. package/dist/components/display/code-block.js +33 -19
  43. package/dist/components/display/comparison-card.cjs +1 -1
  44. package/dist/components/display/comparison-card.d.ts +3 -3
  45. package/dist/components/display/comparison-card.js +14 -38
  46. package/dist/components/display/data-state.cjs +1 -1
  47. package/dist/components/display/data-state.d.ts +12 -2
  48. package/dist/components/display/data-state.js +80 -42
  49. package/dist/components/display/demo.cjs +1 -1
  50. package/dist/components/display/demo.js +1 -5
  51. package/dist/components/display/index.cjs +1 -1
  52. package/dist/components/display/index.d.ts +0 -3
  53. package/dist/components/display/index.js +21 -24
  54. package/dist/components/display/smart-card.d.ts +1 -1
  55. package/dist/components/display/status-legend.d.ts +1 -1
  56. package/dist/components/feedback/alert.cjs +1 -1
  57. package/dist/components/feedback/alert.d.ts +6 -1
  58. package/dist/components/feedback/alert.js +49 -19
  59. package/dist/components/feedback/index.cjs +1 -1
  60. package/dist/components/feedback/index.d.ts +0 -2
  61. package/dist/components/feedback/index.js +3 -5
  62. package/dist/components/filters/demo.cjs +1 -1
  63. package/dist/components/filters/demo.js +1 -5
  64. package/dist/components/filters/filter-bar.cjs +1 -1
  65. package/dist/components/filters/filter-bar.d.ts +15 -1
  66. package/dist/components/filters/filter-bar.js +94 -50
  67. package/dist/components/filters/index.cjs +1 -1
  68. package/dist/components/filters/index.d.ts +0 -1
  69. package/dist/components/filters/index.js +3 -4
  70. package/dist/components/form/form-field-shell.cjs +1 -1
  71. package/dist/components/form/form-field-shell.d.ts +17 -3
  72. package/dist/components/form/form-field-shell.js +54 -40
  73. package/dist/components/form/form-input.cjs +1 -1
  74. package/dist/components/form/form-input.d.ts +3 -4
  75. package/dist/components/form/form-input.js +285 -224
  76. package/dist/components/form/form-select.cjs +1 -1
  77. package/dist/components/form/form-select.d.ts +2 -2
  78. package/dist/components/form/form-select.js +49 -35
  79. package/dist/components/form/form-switch.cjs +1 -1
  80. package/dist/components/form/form-switch.js +79 -66
  81. package/dist/components/form/form-textarea.cjs +1 -1
  82. package/dist/components/form/form-textarea.js +59 -48
  83. package/dist/components/form/index.cjs +1 -1
  84. package/dist/components/form/index.js +14 -14
  85. package/dist/components/form/public.cjs +1 -1
  86. package/dist/components/form/public.d.ts +0 -8
  87. package/dist/components/form/public.js +7 -15
  88. package/dist/components/inputs/async-select.cjs +1 -1
  89. package/dist/components/inputs/async-select.d.ts +14 -2
  90. package/dist/components/inputs/async-select.js +278 -270
  91. package/dist/components/inputs/combobox.cjs +1 -1
  92. package/dist/components/inputs/combobox.d.ts +5 -1
  93. package/dist/components/inputs/combobox.js +52 -19
  94. package/dist/components/inputs/search-input.d.ts +3 -0
  95. package/dist/components/inputs/simple-select.cjs +1 -1
  96. package/dist/components/inputs/simple-select.d.ts +10 -31
  97. package/dist/components/inputs/simple-select.js +5 -85
  98. package/dist/components/layout/app-sidebar.cjs +1 -1
  99. package/dist/components/layout/app-sidebar.d.ts +4 -1
  100. package/dist/components/layout/app-sidebar.js +152 -132
  101. package/dist/components/layout/breadcrumbs.cjs +1 -1
  102. package/dist/components/layout/breadcrumbs.d.ts +2 -1
  103. package/dist/components/layout/breadcrumbs.js +10 -10
  104. package/dist/components/layout/index.cjs +1 -1
  105. package/dist/components/layout/index.js +3 -3
  106. package/dist/components/layout/stat-card.cjs +1 -1
  107. package/dist/components/layout/stat-card.d.ts +8 -1
  108. package/dist/components/layout/stat-card.js +33 -11
  109. package/dist/components/modern/calendar-scheduler.cjs +1 -1
  110. package/dist/components/modern/calendar-scheduler.d.ts +2 -1
  111. package/dist/components/modern/calendar-scheduler.js +21 -12
  112. package/dist/components/overlay/alert-dialog.cjs +1 -1
  113. package/dist/components/overlay/alert-dialog.d.ts +15 -1
  114. package/dist/components/overlay/alert-dialog.js +102 -27
  115. package/dist/components/overlay/drawer.cjs +1 -1
  116. package/dist/components/overlay/drawer.d.ts +4 -1
  117. package/dist/components/overlay/drawer.js +20 -17
  118. package/dist/components/patterns/index.cjs +1 -1
  119. package/dist/components/patterns/index.d.ts +0 -1
  120. package/dist/components/patterns/index.js +1 -2
  121. package/dist/components/patterns/public.cjs +1 -1
  122. package/dist/components/patterns/public.d.ts +0 -1
  123. package/dist/components/patterns/public.js +1 -2
  124. package/dist/components/ui/button/index.cjs +1 -1
  125. package/dist/components/ui/button/index.d.ts +3 -1
  126. package/dist/components/ui/button/index.js +7 -5
  127. package/dist/components/ui/card/index.cjs +1 -1
  128. package/dist/components/ui/card/index.d.ts +13 -2
  129. package/dist/components/ui/card/index.js +74 -49
  130. package/dist/components/ui/checkbox/index.cjs +1 -1
  131. package/dist/components/ui/checkbox/index.d.ts +8 -0
  132. package/dist/components/ui/checkbox/index.js +16 -14
  133. package/dist/components/ui/collapse/index.cjs +1 -1
  134. package/dist/components/ui/collapse/index.d.ts +17 -3
  135. package/dist/components/ui/collapse/index.js +88 -33
  136. package/dist/components/ui/dialog/index.cjs +1 -1
  137. package/dist/components/ui/dialog/index.d.ts +2 -1
  138. package/dist/components/ui/dialog/index.js +6 -4
  139. package/dist/components/ui/dropdown-menu/index.cjs +1 -1
  140. package/dist/components/ui/dropdown-menu/index.d.ts +9 -4
  141. package/dist/components/ui/dropdown-menu/index.js +87 -62
  142. package/dist/components/ui/input/index.cjs +1 -1
  143. package/dist/components/ui/input/index.d.ts +8 -0
  144. package/dist/components/ui/input/index.js +63 -30
  145. package/dist/components/ui/select/index.cjs +1 -1
  146. package/dist/components/ui/select/index.d.ts +33 -1
  147. package/dist/components/ui/select/index.js +154 -48
  148. package/dist/index.cjs +1 -1
  149. package/dist/index.js +137 -156
  150. package/dist/public-component-surface.cjs +1 -1
  151. package/dist/public-component-surface.js +0 -15
  152. package/dist/showcase/component-api-schema.cjs +1 -1
  153. package/dist/showcase/component-api-schema.js +2 -2
  154. package/dist/showcase/create-demo.cjs +23 -36
  155. package/dist/showcase/create-demo.js +15 -16
  156. package/dist/showcase/fallback.cjs +3 -3
  157. package/dist/showcase/fallback.js +275 -265
  158. package/dist/showcase/premium/accordion/showcase.cjs +1 -1
  159. package/dist/showcase/premium/accordion/showcase.js +36 -5
  160. package/dist/showcase/premium/action-menu/showcase.cjs +1 -1
  161. package/dist/showcase/premium/action-menu/showcase.js +26 -8
  162. package/dist/showcase/premium/activity-feed/showcase.cjs +1 -1
  163. package/dist/showcase/premium/activity-feed/showcase.js +60 -36
  164. package/dist/showcase/premium/alert/showcase.cjs +1 -1
  165. package/dist/showcase/premium/alert/showcase.js +41 -18
  166. package/dist/showcase/premium/alert-dialog/showcase.cjs +1 -1
  167. package/dist/showcase/premium/alert-dialog/showcase.js +35 -7
  168. package/dist/showcase/premium/async-multi-select/mock.cjs +4 -3
  169. package/dist/showcase/premium/async-multi-select/mock.js +5 -5
  170. package/dist/showcase/premium/async-multi-select/showcase.cjs +1 -1
  171. package/dist/showcase/premium/async-multi-select/showcase.js +4 -3
  172. package/dist/showcase/premium/async-select/mock.cjs +1 -1
  173. package/dist/showcase/premium/async-select/mock.js +1 -1
  174. package/dist/showcase/premium/async-select/showcase.cjs +1 -1
  175. package/dist/showcase/premium/async-select/showcase.js +69 -22
  176. package/dist/showcase/premium/button/showcase.cjs +1 -1
  177. package/dist/showcase/premium/button/showcase.js +49 -3
  178. package/dist/showcase/premium/button-group/showcase.cjs +1 -1
  179. package/dist/showcase/premium/button-group/showcase.js +53 -29
  180. package/dist/showcase/premium/calendar/showcase.cjs +1 -1
  181. package/dist/showcase/premium/calendar/showcase.js +7 -2
  182. package/dist/showcase/premium/carousel/showcase.cjs +1 -1
  183. package/dist/showcase/premium/carousel/showcase.js +95 -47
  184. package/dist/showcase/premium/checkbox/showcase.cjs +1 -1
  185. package/dist/showcase/premium/checkbox/showcase.js +143 -67
  186. package/dist/showcase/premium/clearable-input/mock.cjs +4 -3
  187. package/dist/showcase/premium/clearable-input/mock.js +3 -2
  188. package/dist/showcase/premium/clearable-input/showcase.cjs +1 -1
  189. package/dist/showcase/premium/clearable-input/showcase.js +8 -2
  190. package/dist/showcase/premium/collapse/showcase.cjs +1 -1
  191. package/dist/showcase/premium/collapse/showcase.js +7 -0
  192. package/dist/showcase/premium/combobox/showcase.cjs +1 -1
  193. package/dist/showcase/premium/combobox/showcase.d.ts +2 -1
  194. package/dist/showcase/premium/combobox/showcase.js +56 -47
  195. package/dist/showcase/premium/data-table/showcase.cjs +1 -1
  196. package/dist/showcase/premium/data-table/showcase.js +138 -46
  197. package/dist/showcase/premium/data-table-parts/showcase.cjs +1 -1
  198. package/dist/showcase/premium/data-table-parts/showcase.js +16 -14
  199. package/dist/showcase/premium/date-input/mock.cjs +1 -1
  200. package/dist/showcase/premium/date-input/mock.js +1 -1
  201. package/dist/showcase/premium/date-range-picker/showcase.cjs +1 -1
  202. package/dist/showcase/premium/date-range-picker/showcase.js +32 -1
  203. package/dist/showcase/premium/dropdown-menu/showcase.cjs +1 -1
  204. package/dist/showcase/premium/dropdown-menu/showcase.js +88 -54
  205. package/dist/showcase/premium/form-wrapper/mock.cjs +41 -15
  206. package/dist/showcase/premium/form-wrapper/mock.js +4 -4
  207. package/dist/showcase/premium/form-wrapper/showcase.cjs +1 -1
  208. package/dist/showcase/premium/form-wrapper/showcase.js +77 -28
  209. package/dist/showcase/premium/index.cjs +1 -1
  210. package/dist/showcase/premium/index.js +426 -467
  211. package/dist/showcase/premium/input/mock.cjs +4 -1
  212. package/dist/showcase/premium/input/mock.js +1 -1
  213. package/dist/showcase/premium/masked-input/mock.cjs +1 -1
  214. package/dist/showcase/premium/masked-input/mock.js +1 -1
  215. package/dist/showcase/premium/money-input/mock.cjs +1 -1
  216. package/dist/showcase/premium/money-input/mock.js +1 -1
  217. package/dist/showcase/premium/number-input/mock.cjs +1 -1
  218. package/dist/showcase/premium/number-input/mock.js +1 -1
  219. package/dist/showcase/premium/phone-input/mock.cjs +1 -1
  220. package/dist/showcase/premium/phone-input/mock.js +1 -1
  221. package/dist/showcase/premium/quantity-input/mock.cjs +1 -1
  222. package/dist/showcase/premium/quantity-input/mock.js +1 -1
  223. package/dist/showcase/premium/select/mock.cjs +8 -9
  224. package/dist/showcase/premium/select/mock.js +1 -1
  225. package/dist/showcase/premium/select/showcase.cjs +1 -1
  226. package/dist/showcase/premium/select/showcase.js +76 -86
  227. package/dist/showcase/premium/simple-select/mock.cjs +1 -1
  228. package/dist/showcase/premium/simple-select/mock.js +1 -1
  229. package/dist/showcase/premium/simple-select/showcase.cjs +1 -1
  230. package/dist/showcase/premium/simple-select/showcase.js +4 -2
  231. package/dist/showcase/preview-catalog.cjs +7 -10
  232. package/dist/showcase/preview-catalog.js +7 -7
  233. package/dist/showcase/registry-quality.cjs +1 -1
  234. package/dist/showcase/registry-quality.js +0 -23
  235. package/dist/showcase/registry-specific.cjs +1 -1
  236. package/dist/showcase/registry-specific.js +153 -383
  237. package/dist/showcase/render-registry-preview.cjs +1 -1
  238. package/dist/showcase/render-registry-preview.js +169 -197
  239. package/dist/showcase/site-data.cjs +1 -1
  240. package/dist/showcase/site-data.js +197 -941
  241. package/dist/showcase/supplemental.cjs +1 -1
  242. package/dist/showcase/supplemental.js +1 -1
  243. package/dist/showcase/tembro-registry.json.cjs +1 -1
  244. package/dist/showcase/tembro-registry.json.js +33 -51
  245. package/package.json +1 -1
  246. package/packages/cli/dist/index.cjs +2 -2
  247. package/packages/cli/vendor/src/components/actions/action-menu.tsx +149 -83
  248. package/packages/cli/vendor/src/components/actions/button-group.tsx +141 -33
  249. package/packages/cli/vendor/src/components/actions/copy-button.tsx +21 -16
  250. package/packages/cli/vendor/src/components/calendar/calendar.tsx +223 -88
  251. package/packages/cli/vendor/src/components/calendar/date-picker.tsx +73 -29
  252. package/packages/cli/vendor/src/components/calendar/date-range-picker.tsx +154 -49
  253. package/packages/cli/vendor/src/components/data-table/data-table-pagination.tsx +7 -7
  254. package/packages/cli/vendor/src/components/data-table/data-table-toolbar.tsx +71 -50
  255. package/packages/cli/vendor/src/components/data-table/data-table.tsx +86 -73
  256. package/packages/cli/vendor/src/components/data-table/demo.tsx +2 -12
  257. package/packages/cli/vendor/src/components/data-table/public.ts +1 -6
  258. package/packages/cli/vendor/src/components/display/activity-feed.tsx +98 -40
  259. package/packages/cli/vendor/src/components/display/carousel.tsx +104 -6
  260. package/packages/cli/vendor/src/components/display/code-block.tsx +58 -26
  261. package/packages/cli/vendor/src/components/display/comparison-card.tsx +15 -41
  262. package/packages/cli/vendor/src/components/display/data-state.tsx +119 -50
  263. package/packages/cli/vendor/src/components/display/demo.tsx +0 -4
  264. package/packages/cli/vendor/src/components/display/index.ts +0 -3
  265. package/packages/cli/vendor/src/components/display/smart-card.tsx +1 -1
  266. package/packages/cli/vendor/src/components/display/status-legend.tsx +1 -1
  267. package/packages/cli/vendor/src/components/feedback/alert.tsx +86 -28
  268. package/packages/cli/vendor/src/components/feedback/index.ts +0 -2
  269. package/packages/cli/vendor/src/components/filters/demo.tsx +0 -1
  270. package/packages/cli/vendor/src/components/filters/filter-bar.tsx +126 -54
  271. package/packages/cli/vendor/src/components/filters/index.ts +0 -1
  272. package/packages/cli/vendor/src/components/form/form-field-shell.tsx +72 -34
  273. package/packages/cli/vendor/src/components/form/form-input.tsx +127 -23
  274. package/packages/cli/vendor/src/components/form/form-select.tsx +30 -7
  275. package/packages/cli/vendor/src/components/form/form-switch.tsx +77 -58
  276. package/packages/cli/vendor/src/components/form/form-textarea.tsx +65 -51
  277. package/packages/cli/vendor/src/components/form/public.ts +0 -9
  278. package/packages/cli/vendor/src/components/inputs/async-select.tsx +138 -91
  279. package/packages/cli/vendor/src/components/inputs/combobox.tsx +66 -9
  280. package/packages/cli/vendor/src/components/inputs/search-input.tsx +5 -2
  281. package/packages/cli/vendor/src/components/inputs/simple-select.tsx +20 -162
  282. package/packages/cli/vendor/src/components/layout/app-sidebar.tsx +42 -1
  283. package/packages/cli/vendor/src/components/layout/breadcrumbs.tsx +17 -8
  284. package/packages/cli/vendor/src/components/layout/stat-card.tsx +63 -23
  285. package/packages/cli/vendor/src/components/modern/calendar-scheduler.tsx +32 -22
  286. package/packages/cli/vendor/src/components/overlay/alert-dialog.tsx +148 -24
  287. package/packages/cli/vendor/src/components/overlay/drawer.tsx +42 -30
  288. package/packages/cli/vendor/src/components/patterns/index.ts +0 -1
  289. package/packages/cli/vendor/src/components/patterns/public.ts +0 -1
  290. package/packages/cli/vendor/src/components/ui/button/index.tsx +27 -17
  291. package/packages/cli/vendor/src/components/ui/card/index.tsx +95 -25
  292. package/packages/cli/vendor/src/components/ui/checkbox/index.tsx +22 -5
  293. package/packages/cli/vendor/src/components/ui/collapse/index.tsx +97 -16
  294. package/packages/cli/vendor/src/components/ui/dialog/index.tsx +12 -8
  295. package/packages/cli/vendor/src/components/ui/dropdown-menu/index.tsx +82 -28
  296. package/packages/cli/vendor/src/components/ui/input/index.tsx +98 -0
  297. package/packages/cli/vendor/src/components/ui/select/index.tsx +227 -34
  298. package/packages/cli/vendor/src/public-component-surface.ts +0 -3
  299. package/packages/cli/vendor/src/showcase/component-api-schema.ts +2 -2
  300. package/packages/cli/vendor/src/showcase/create-demo.tsx +44 -58
  301. package/packages/cli/vendor/src/showcase/fallback.tsx +80 -99
  302. package/packages/cli/vendor/src/showcase/premium/accordion/showcase.tsx +32 -2
  303. package/packages/cli/vendor/src/showcase/premium/action-menu/showcase.tsx +12 -3
  304. package/packages/cli/vendor/src/showcase/premium/activity-feed/showcase.tsx +15 -2
  305. package/packages/cli/vendor/src/showcase/premium/alert/showcase.tsx +32 -17
  306. package/packages/cli/vendor/src/showcase/premium/alert-dialog/showcase.tsx +28 -3
  307. package/packages/cli/vendor/src/showcase/premium/async-multi-select/mock.ts +6 -5
  308. package/packages/cli/vendor/src/showcase/premium/async-multi-select/showcase.tsx +5 -4
  309. package/packages/cli/vendor/src/showcase/premium/async-select/mock.ts +1 -1
  310. package/packages/cli/vendor/src/showcase/premium/async-select/showcase.tsx +36 -0
  311. package/packages/cli/vendor/src/showcase/premium/button/showcase.tsx +26 -5
  312. package/packages/cli/vendor/src/showcase/premium/button-group/showcase.tsx +20 -3
  313. package/packages/cli/vendor/src/showcase/premium/calendar/showcase.tsx +5 -0
  314. package/packages/cli/vendor/src/showcase/premium/carousel/showcase.tsx +33 -5
  315. package/packages/cli/vendor/src/showcase/premium/checkbox/showcase.tsx +46 -3
  316. package/packages/cli/vendor/src/showcase/premium/clearable-input/mock.ts +5 -3
  317. package/packages/cli/vendor/src/showcase/premium/clearable-input/showcase.tsx +5 -2
  318. package/packages/cli/vendor/src/showcase/premium/collapse/showcase.tsx +4 -0
  319. package/packages/cli/vendor/src/showcase/premium/combobox/showcase.tsx +8 -0
  320. package/packages/cli/vendor/src/showcase/premium/data-table/showcase.tsx +77 -27
  321. package/packages/cli/vendor/src/showcase/premium/data-table-parts/showcase.tsx +14 -14
  322. package/packages/cli/vendor/src/showcase/premium/date-input/mock.ts +1 -1
  323. package/packages/cli/vendor/src/showcase/premium/date-range-picker/showcase.tsx +7 -0
  324. package/packages/cli/vendor/src/showcase/premium/dropdown-menu/showcase.tsx +46 -3
  325. package/packages/cli/vendor/src/showcase/premium/form-wrapper/mock.ts +70 -44
  326. package/packages/cli/vendor/src/showcase/premium/form-wrapper/showcase.tsx +129 -12
  327. package/packages/cli/vendor/src/showcase/premium/index.ts +7 -24
  328. package/packages/cli/vendor/src/showcase/premium/input/mock.ts +2 -2
  329. package/packages/cli/vendor/src/showcase/premium/masked-input/mock.ts +1 -1
  330. package/packages/cli/vendor/src/showcase/premium/money-input/mock.ts +1 -1
  331. package/packages/cli/vendor/src/showcase/premium/number-input/mock.ts +1 -1
  332. package/packages/cli/vendor/src/showcase/premium/phone-input/mock.ts +1 -1
  333. package/packages/cli/vendor/src/showcase/premium/quantity-input/mock.ts +1 -1
  334. package/packages/cli/vendor/src/showcase/premium/select/mock.ts +1 -1
  335. package/packages/cli/vendor/src/showcase/premium/select/showcase.tsx +13 -21
  336. package/packages/cli/vendor/src/showcase/premium/simple-select/mock.ts +1 -1
  337. package/packages/cli/vendor/src/showcase/premium/simple-select/showcase.tsx +2 -1
  338. package/packages/cli/vendor/src/showcase/preview-catalog.tsx +7 -7
  339. package/packages/cli/vendor/src/showcase/registry-quality.ts +4 -28
  340. package/packages/cli/vendor/src/showcase/registry-specific.tsx +10 -186
  341. package/packages/cli/vendor/src/showcase/render-registry-preview.tsx +23 -57
  342. package/packages/cli/vendor/src/showcase/site-data.tsx +2443 -2761
  343. package/packages/cli/vendor/src/showcase/supplemental.tsx +2 -42
  344. package/packages/cli/vendor/src/showcase/tembro-registry.json +11 -58
  345. package/registry.json +11 -61
  346. package/dist/components/display/entity-card.cjs +0 -1
  347. package/dist/components/display/entity-card.d.ts +0 -18
  348. package/dist/components/display/entity-card.js +0 -61
  349. package/dist/components/display/entity-header.cjs +0 -1
  350. package/dist/components/display/entity-header.d.ts +0 -13
  351. package/dist/components/display/entity-header.js +0 -52
  352. package/dist/components/display/file-card.cjs +0 -1
  353. package/dist/components/display/file-card.d.ts +0 -14
  354. package/dist/components/display/file-card.js +0 -59
  355. package/dist/components/feedback/empty-search-state.cjs +0 -1
  356. package/dist/components/feedback/empty-search-state.d.ts +0 -11
  357. package/dist/components/feedback/empty-search-state.js +0 -45
  358. package/dist/components/feedback/empty-state.cjs +0 -1
  359. package/dist/components/feedback/empty-state.d.ts +0 -11
  360. package/dist/components/feedback/empty-state.js +0 -38
  361. package/dist/components/filters/filter-chips.cjs +0 -1
  362. package/dist/components/filters/filter-chips.d.ts +0 -18
  363. package/dist/components/filters/filter-chips.js +0 -61
  364. package/dist/components/patterns/form-builder-presets.cjs +0 -1
  365. package/dist/components/patterns/form-builder-presets.d.ts +0 -1
  366. package/dist/components/patterns/form-builder-presets.js +0 -2
  367. package/dist/components/patterns/form-builder.cjs +0 -1
  368. package/dist/components/patterns/form-builder.d.ts +0 -109
  369. package/dist/components/patterns/form-builder.js +0 -263
  370. package/dist/showcase/premium/empty-state/index.cjs +0 -1
  371. package/dist/showcase/premium/empty-state/index.d.ts +0 -2
  372. package/dist/showcase/premium/empty-state/index.js +0 -3
  373. package/dist/showcase/premium/empty-state/mock.cjs +0 -14
  374. package/dist/showcase/premium/empty-state/mock.d.ts +0 -2
  375. package/dist/showcase/premium/empty-state/mock.js +0 -31
  376. package/dist/showcase/premium/empty-state/showcase.cjs +0 -1
  377. package/dist/showcase/premium/empty-state/showcase.d.ts +0 -3
  378. package/dist/showcase/premium/empty-state/showcase.js +0 -99
  379. package/dist/showcase/premium/form-builder/index.cjs +0 -1
  380. package/dist/showcase/premium/form-builder/index.d.ts +0 -2
  381. package/dist/showcase/premium/form-builder/index.js +0 -3
  382. package/dist/showcase/premium/form-builder/mock.cjs +0 -57
  383. package/dist/showcase/premium/form-builder/mock.d.ts +0 -2
  384. package/dist/showcase/premium/form-builder/mock.js +0 -40
  385. package/dist/showcase/premium/form-builder/showcase.cjs +0 -1
  386. package/dist/showcase/premium/form-builder/showcase.d.ts +0 -3
  387. package/dist/showcase/premium/form-builder/showcase.js +0 -69
  388. package/packages/cli/vendor/src/components/display/entity-card.tsx +0 -80
  389. package/packages/cli/vendor/src/components/display/entity-header.tsx +0 -80
  390. package/packages/cli/vendor/src/components/display/file-card.tsx +0 -61
  391. package/packages/cli/vendor/src/components/feedback/empty-search-state.tsx +0 -65
  392. package/packages/cli/vendor/src/components/feedback/empty-state.tsx +0 -56
  393. package/packages/cli/vendor/src/components/filters/filter-chips.tsx +0 -89
  394. package/packages/cli/vendor/src/components/patterns/form-builder-presets.ts +0 -13
  395. package/packages/cli/vendor/src/components/patterns/form-builder.tsx +0 -443
  396. package/packages/cli/vendor/src/showcase/premium/empty-state/index.ts +0 -2
  397. package/packages/cli/vendor/src/showcase/premium/empty-state/mock.ts +0 -30
  398. package/packages/cli/vendor/src/showcase/premium/empty-state/showcase.tsx +0 -65
  399. package/packages/cli/vendor/src/showcase/premium/form-builder/index.ts +0 -2
  400. package/packages/cli/vendor/src/showcase/premium/form-builder/mock.ts +0 -79
  401. package/packages/cli/vendor/src/showcase/premium/form-builder/showcase.tsx +0 -55
@@ -8,7 +8,7 @@ import {
8
8
  type DateRangeValue,
9
9
  } from "@/components/inputs/date-range-input"
10
10
  import { DateInput, type DateInputProps } from "@/components/inputs/date-input"
11
- import { Input, type InputTextProps } from "@/components/ui/input"
11
+ import { Input, type InputClearableProps, type InputSearchProps, type InputTextProps } from "@/components/ui/input"
12
12
  import { MaskedInput, type MaskedInputProps } from "@/components/inputs/masked-input"
13
13
  import { MoneyInput, type MoneyInputProps } from "@/components/inputs/money-input"
14
14
  import { NumberInput, type NumberInputProps } from "@/components/inputs/number-input"
@@ -18,14 +18,10 @@ import {
18
18
  type PhoneInputProps,
19
19
  } from "@/components/inputs/phone-input"
20
20
  import { QuantityInput, type QuantityInputProps } from "@/components/inputs/quantity-input"
21
- import { SearchInput, type SearchInputProps } from "@/components/inputs/search-input"
22
- import {
23
- ClearableInput,
24
- type ClearableInputProps,
25
- } from "@/components/inputs/clearable-input"
26
21
  import {
27
22
  FormFieldShell,
28
23
  type FormFieldShellControlProps,
24
+ resolveFormFieldIds,
29
25
  } from "@/components/form/form-field-shell"
30
26
 
31
27
  export type FormInputKind =
@@ -75,7 +71,7 @@ export type FormTextInputProps<
75
71
  export type FormInputSearchVariantProps<
76
72
  TFieldValues extends FieldValues = FieldValues,
77
73
  TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
78
- > = Omit<SearchInputProps, "name" | "value" | "defaultValue" | "onValueChange"> &
74
+ > = Omit<InputSearchProps, "name" | "value" | "defaultValue" | "onValueChange" | "kind"> &
79
75
  FormControlledFieldProps<TFieldValues, TName> & {
80
76
  kind: "search"
81
77
  onValueChange?: (value: string) => void
@@ -133,7 +129,7 @@ export type FormInputDateRangeVariantProps<
133
129
  export type FormInputClearableVariantProps<
134
130
  TFieldValues extends FieldValues = FieldValues,
135
131
  TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
136
- > = Omit<ClearableInputProps, "name" | "value" | "defaultValue" | "onValueChange"> &
132
+ > = Omit<InputClearableProps, "name" | "value" | "defaultValue" | "onValueChange" | "kind"> &
137
133
  FormControlledFieldProps<TFieldValues, TName> & {
138
134
  kind: "clearable"
139
135
  emptyValue?: unknown
@@ -198,6 +194,7 @@ function buildShellProps<
198
194
  description: props.description,
199
195
  required: props.required,
200
196
  className: props.className,
197
+ htmlFor: props.id ?? props.name,
201
198
  layout: props.layout,
202
199
  descriptionPosition: props.descriptionPosition,
203
200
  labelAction: props.labelAction,
@@ -230,6 +227,10 @@ function FormInput<
230
227
  rules={props.rules}
231
228
  render={({ field, fieldState }) => {
232
229
  const error = fieldState.error?.message
230
+ const resolvedIds = resolveFormFieldIds(inputId, {
231
+ description: props.description,
232
+ error,
233
+ })
233
234
 
234
235
  if (kind === "search") {
235
236
  const {
@@ -261,9 +262,17 @@ function FormInput<
261
262
  } = props as FormInputSearchVariantProps<TFieldValues, TName>
262
263
 
263
264
  return (
264
- <FormFieldShell {...shellProps} error={error} htmlFor={id ?? inputId}>
265
- <SearchInput
266
- {...searchProps}
265
+ <FormFieldShell
266
+ {...shellProps}
267
+ labelId={resolvedIds.labelId}
268
+ descriptionId={resolvedIds.descriptionId}
269
+ errorId={resolvedIds.errorId}
270
+ error={error}
271
+ htmlFor={id ?? inputId}
272
+ >
273
+ <Input
274
+ {...(searchProps as Omit<InputSearchProps, "kind">)}
275
+ type="search"
267
276
  id={id ?? inputId}
268
277
  name={field.name}
269
278
  ref={field.ref}
@@ -272,6 +281,8 @@ function FormInput<
272
281
  readOnly={props.readOnly}
273
282
  inputClassName={fieldClassName ?? resolvedFieldClassName}
274
283
  aria-invalid={fieldState.invalid || undefined}
284
+ aria-describedby={resolvedIds.describedBy}
285
+ aria-errormessage={error ? resolvedIds.errorId : undefined}
275
286
  onBlur={(event: React.FocusEvent<HTMLInputElement>) => {
276
287
  field.onBlur()
277
288
  onBlur?.(event)
@@ -315,7 +326,14 @@ function FormInput<
315
326
  } = props as FormInputPasswordVariantProps<TFieldValues, TName>
316
327
 
317
328
  return (
318
- <FormFieldShell {...shellProps} error={error} htmlFor={id ?? inputId}>
329
+ <FormFieldShell
330
+ {...shellProps}
331
+ labelId={resolvedIds.labelId}
332
+ descriptionId={resolvedIds.descriptionId}
333
+ errorId={resolvedIds.errorId}
334
+ error={error}
335
+ htmlFor={id ?? inputId}
336
+ >
319
337
  <Input
320
338
  {...(passwordProps as Omit<InputTextInputProps, "kind">)}
321
339
  type="password"
@@ -326,6 +344,8 @@ function FormInput<
326
344
  disabled={disabled}
327
345
  readOnly={props.readOnly}
328
346
  inputClassName={fieldClassName ?? resolvedFieldClassName}
347
+ aria-describedby={resolvedIds.describedBy}
348
+ aria-errormessage={error ? resolvedIds.errorId : undefined}
329
349
  onBlur={(event: React.FocusEvent<HTMLInputElement>) => {
330
350
  field.onBlur()
331
351
  onBlur?.(event)
@@ -372,7 +392,14 @@ function FormInput<
372
392
  } = props as FormInputNumberVariantProps<TFieldValues, TName>
373
393
 
374
394
  return (
375
- <FormFieldShell {...shellProps} error={error} htmlFor={id ?? inputId}>
395
+ <FormFieldShell
396
+ {...shellProps}
397
+ labelId={resolvedIds.labelId}
398
+ descriptionId={resolvedIds.descriptionId}
399
+ errorId={resolvedIds.errorId}
400
+ error={error}
401
+ htmlFor={id ?? inputId}
402
+ >
376
403
  <NumberInput
377
404
  {...numberProps}
378
405
  id={id ?? inputId}
@@ -383,6 +410,8 @@ function FormInput<
383
410
  readOnly={props.readOnly}
384
411
  className={fieldClassName ?? resolvedFieldClassName}
385
412
  aria-invalid={fieldState.invalid || undefined}
413
+ aria-describedby={resolvedIds.describedBy}
414
+ aria-errormessage={error ? resolvedIds.errorId : undefined}
386
415
  onBlur={(event: React.FocusEvent<HTMLInputElement>) => {
387
416
  field.onBlur()
388
417
  onBlur?.(event)
@@ -433,7 +462,14 @@ function FormInput<
433
462
  valueMode === "raw" ? formatPhoneDigits(fieldValue, countryCode, maxDigits) : fieldValue
434
463
 
435
464
  return (
436
- <FormFieldShell {...shellProps} error={error} htmlFor={id ?? inputId}>
465
+ <FormFieldShell
466
+ {...shellProps}
467
+ labelId={resolvedIds.labelId}
468
+ descriptionId={resolvedIds.descriptionId}
469
+ errorId={resolvedIds.errorId}
470
+ error={error}
471
+ htmlFor={id ?? inputId}
472
+ >
437
473
  <PhoneInput
438
474
  {...phoneProps}
439
475
  id={id ?? inputId}
@@ -446,6 +482,8 @@ function FormInput<
446
482
  maxDigits={maxDigits}
447
483
  className={fieldClassName ?? resolvedFieldClassName}
448
484
  aria-invalid={fieldState.invalid || undefined}
485
+ aria-describedby={resolvedIds.describedBy}
486
+ aria-errormessage={error ? resolvedIds.errorId : undefined}
449
487
  onBlur={(event: React.FocusEvent<HTMLInputElement>) => {
450
488
  field.onBlur()
451
489
  onBlur?.(event)
@@ -491,7 +529,14 @@ function FormInput<
491
529
  } = props as FormInputDateVariantProps<TFieldValues, TName>
492
530
 
493
531
  return (
494
- <FormFieldShell {...shellProps} error={error} htmlFor={id ?? inputId}>
532
+ <FormFieldShell
533
+ {...shellProps}
534
+ labelId={resolvedIds.labelId}
535
+ descriptionId={resolvedIds.descriptionId}
536
+ errorId={resolvedIds.errorId}
537
+ error={error}
538
+ htmlFor={id ?? inputId}
539
+ >
495
540
  <DateInput
496
541
  {...dateProps}
497
542
  id={id ?? inputId}
@@ -502,6 +547,8 @@ function FormInput<
502
547
  readOnly={props.readOnly}
503
548
  className={fieldClassName ?? resolvedFieldClassName}
504
549
  aria-invalid={fieldState.invalid || undefined}
550
+ aria-describedby={resolvedIds.describedBy}
551
+ aria-errormessage={error ? resolvedIds.errorId : undefined}
505
552
  onBlur={(event: React.FocusEvent<HTMLInputElement>) => {
506
553
  field.onBlur()
507
554
  onBlur?.(event)
@@ -546,9 +593,17 @@ function FormInput<
546
593
  } = props as FormInputClearableVariantProps<TFieldValues, TName>
547
594
 
548
595
  return (
549
- <FormFieldShell {...shellProps} error={error} htmlFor={id ?? inputId}>
550
- <ClearableInput
551
- {...clearableProps}
596
+ <FormFieldShell
597
+ {...shellProps}
598
+ labelId={resolvedIds.labelId}
599
+ descriptionId={resolvedIds.descriptionId}
600
+ errorId={resolvedIds.errorId}
601
+ error={error}
602
+ htmlFor={id ?? inputId}
603
+ >
604
+ <Input
605
+ {...(clearableProps as Omit<InputClearableProps, "kind">)}
606
+ clearable
552
607
  id={id ?? inputId}
553
608
  name={field.name}
554
609
  ref={field.ref}
@@ -557,6 +612,8 @@ function FormInput<
557
612
  readOnly={props.readOnly}
558
613
  className={fieldClassName ?? resolvedFieldClassName}
559
614
  aria-invalid={fieldState.invalid || undefined}
615
+ aria-describedby={resolvedIds.describedBy}
616
+ aria-errormessage={error ? resolvedIds.errorId : undefined}
560
617
  onBlur={(event: React.FocusEvent<HTMLInputElement>) => {
561
618
  field.onBlur()
562
619
  onBlur?.(event)
@@ -601,7 +658,14 @@ function FormInput<
601
658
  } = props as FormInputMaskedVariantProps<TFieldValues, TName>
602
659
 
603
660
  return (
604
- <FormFieldShell {...shellProps} error={error} htmlFor={id ?? inputId}>
661
+ <FormFieldShell
662
+ {...shellProps}
663
+ labelId={resolvedIds.labelId}
664
+ descriptionId={resolvedIds.descriptionId}
665
+ errorId={resolvedIds.errorId}
666
+ error={error}
667
+ htmlFor={id ?? inputId}
668
+ >
605
669
  <MaskedInput
606
670
  {...maskedProps}
607
671
  id={id ?? inputId}
@@ -612,6 +676,8 @@ function FormInput<
612
676
  readOnly={props.readOnly}
613
677
  className={fieldClassName ?? resolvedFieldClassName}
614
678
  aria-invalid={fieldState.invalid || undefined}
679
+ aria-describedby={resolvedIds.describedBy}
680
+ aria-errormessage={error ? resolvedIds.errorId : undefined}
615
681
  onBlur={(event: React.FocusEvent<HTMLInputElement>) => {
616
682
  field.onBlur()
617
683
  onBlur?.(event)
@@ -657,7 +723,14 @@ function FormInput<
657
723
  } = props as FormInputMoneyVariantProps<TFieldValues, TName>
658
724
 
659
725
  return (
660
- <FormFieldShell {...shellProps} error={error} htmlFor={id ?? inputId}>
726
+ <FormFieldShell
727
+ {...shellProps}
728
+ labelId={resolvedIds.labelId}
729
+ descriptionId={resolvedIds.descriptionId}
730
+ errorId={resolvedIds.errorId}
731
+ error={error}
732
+ htmlFor={id ?? inputId}
733
+ >
661
734
  <MoneyInput
662
735
  {...moneyProps}
663
736
  id={id ?? inputId}
@@ -668,6 +741,8 @@ function FormInput<
668
741
  readOnly={props.readOnly}
669
742
  className={fieldClassName ?? resolvedFieldClassName}
670
743
  aria-invalid={fieldState.invalid || undefined}
744
+ aria-describedby={resolvedIds.describedBy}
745
+ aria-errormessage={error ? resolvedIds.errorId : undefined}
671
746
  onBlur={(event: React.FocusEvent<HTMLInputElement>) => {
672
747
  field.onBlur()
673
748
  onBlur?.(event)
@@ -712,7 +787,14 @@ function FormInput<
712
787
  } = props as FormInputQuantityVariantProps<TFieldValues, TName>
713
788
 
714
789
  return (
715
- <FormFieldShell {...shellProps} error={error} htmlFor={id ?? inputId}>
790
+ <FormFieldShell
791
+ {...shellProps}
792
+ labelId={resolvedIds.labelId}
793
+ descriptionId={resolvedIds.descriptionId}
794
+ errorId={resolvedIds.errorId}
795
+ error={error}
796
+ htmlFor={id ?? inputId}
797
+ >
716
798
  <QuantityInput
717
799
  {...quantityProps}
718
800
  id={id ?? inputId}
@@ -723,6 +805,8 @@ function FormInput<
723
805
  readOnly={props.readOnly}
724
806
  className={fieldClassName ?? resolvedFieldClassName}
725
807
  aria-invalid={fieldState.invalid || undefined}
808
+ aria-describedby={resolvedIds.describedBy}
809
+ aria-errormessage={error ? resolvedIds.errorId : undefined}
726
810
  onBlur={(event: React.FocusEvent<HTMLInputElement>) => {
727
811
  field.onBlur()
728
812
  onBlur?.(event)
@@ -767,7 +851,14 @@ function FormInput<
767
851
  const currentValue = field.value as DateRangeValue | undefined
768
852
 
769
853
  return (
770
- <FormFieldShell {...shellProps} error={error} htmlFor={id ?? inputId}>
854
+ <FormFieldShell
855
+ {...shellProps}
856
+ labelId={resolvedIds.labelId}
857
+ descriptionId={resolvedIds.descriptionId}
858
+ errorId={resolvedIds.errorId}
859
+ error={error}
860
+ htmlFor={id ?? inputId}
861
+ >
771
862
  <DateRangeInput
772
863
  {...rangeProps}
773
864
  id={id ?? inputId}
@@ -780,11 +871,15 @@ function FormInput<
780
871
  ...(rangeProps.fromInputProps ?? {}),
781
872
  disabled,
782
873
  readOnly: props.readOnly,
874
+ "aria-describedby": resolvedIds.describedBy,
875
+ "aria-errormessage": error ? resolvedIds.errorId : undefined,
783
876
  }}
784
877
  toInputProps={{
785
878
  ...(rangeProps.toInputProps ?? {}),
786
879
  disabled,
787
880
  readOnly: props.readOnly,
881
+ "aria-describedby": resolvedIds.describedBy,
882
+ "aria-errormessage": error ? resolvedIds.errorId : undefined,
788
883
  }}
789
884
  onValueChange={(value) => {
790
885
  field.onChange(value)
@@ -831,7 +926,14 @@ function FormInput<
831
926
  } = props as FormTextInputProps<TFieldValues, TName>
832
927
 
833
928
  return (
834
- <FormFieldShell {...shellProps} error={error} htmlFor={id ?? inputId}>
929
+ <FormFieldShell
930
+ {...shellProps}
931
+ labelId={resolvedIds.labelId}
932
+ descriptionId={resolvedIds.descriptionId}
933
+ errorId={resolvedIds.errorId}
934
+ error={error}
935
+ htmlFor={id ?? inputId}
936
+ >
835
937
  <Input
836
938
  {...(inputProps as Omit<InputTextInputProps, "kind">)}
837
939
  id={id ?? inputId}
@@ -852,6 +954,8 @@ function FormInput<
852
954
  onChange?.(event)
853
955
  }}
854
956
  aria-invalid={fieldState.invalid || undefined}
957
+ aria-describedby={resolvedIds.describedBy}
958
+ aria-errormessage={error ? resolvedIds.errorId : undefined}
855
959
  className={fieldClassName ?? resolvedFieldClassName}
856
960
  />
857
961
  </FormFieldShell>
@@ -6,10 +6,11 @@ import {
6
6
  type AsyncSelectOption,
7
7
  type AsyncSelectProps,
8
8
  } from "@/components/inputs/async-select"
9
- import { SimpleSelect, type SimpleSelectProps } from "@/components/inputs/simple-select"
9
+ import { Select, type SelectProps } from "@/components/ui/select"
10
10
  import {
11
11
  FormFieldShell,
12
12
  type FormFieldShellControlProps,
13
+ resolveFormFieldIds,
13
14
  } from "@/components/form/form-field-shell"
14
15
 
15
16
  export type FormSelectKind = "simple" | "async"
@@ -26,7 +27,7 @@ type FormSelectBaseProps<
26
27
  export type FormSimpleSelectProps<
27
28
  TFieldValues extends FieldValues = FieldValues,
28
29
  TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
29
- > = Omit<SimpleSelectProps, "value" | "onValueChange" | "disabled"> &
30
+ > = Omit<SelectProps, "children" | "value" | "onValueChange" | "disabled"> &
30
31
  FormSelectBaseProps<TFieldValues, TName> & {
31
32
  kind?: "simple"
32
33
  emptyValue?: unknown
@@ -68,6 +69,7 @@ function buildShellProps<
68
69
  description: props.description,
69
70
  required: props.required,
70
71
  className: props.className,
72
+ htmlFor: props.name,
71
73
  layout: props.layout,
72
74
  descriptionPosition: props.descriptionPosition,
73
75
  labelAction: props.labelAction,
@@ -101,6 +103,11 @@ function FormSelect<
101
103
  name={props.name}
102
104
  render={({ field, fieldState }) => {
103
105
  const error = fieldState.error?.message
106
+ const controlId = `${props.name}`
107
+ const resolvedIds = resolveFormFieldIds(controlId, {
108
+ description: props.description,
109
+ error,
110
+ })
104
111
 
105
112
  if (kind === "async") {
106
113
  const {
@@ -131,11 +138,19 @@ function FormSelect<
131
138
  } = props as FormSelectAsyncVariantProps<TFieldValues, TName, TValue, TData, TOption>
132
139
 
133
140
  return (
134
- <FormFieldShell {...shellProps} error={error}>
135
- <AsyncSelect<TValue, TData, TOption>
141
+ <FormFieldShell
142
+ {...shellProps}
143
+ labelId={resolvedIds.labelId}
144
+ descriptionId={resolvedIds.descriptionId}
145
+ errorId={resolvedIds.errorId}
146
+ error={error}
147
+ >
148
+ <AsyncSelect<TValue, TData, TOption>
136
149
  {...asyncProps}
137
150
  value={field.value == null || field.value === "" ? undefined : (String(field.value) as TValue)}
138
151
  disabled={disabled || readOnly}
152
+ aria-describedby={resolvedIds.describedBy}
153
+ aria-errormessage={error ? resolvedIds.errorId : undefined}
139
154
  onValueChange={(nextValue, option) => {
140
155
  field.onChange(nextValue ?? emptyValue)
141
156
  onValueChange?.(nextValue, option)
@@ -174,11 +189,19 @@ function FormSelect<
174
189
  } = props as FormSimpleSelectProps<TFieldValues, TName>
175
190
 
176
191
  return (
177
- <FormFieldShell {...shellProps} error={error}>
178
- <SimpleSelect
192
+ <FormFieldShell
193
+ {...shellProps}
194
+ labelId={resolvedIds.labelId}
195
+ descriptionId={resolvedIds.descriptionId}
196
+ errorId={resolvedIds.errorId}
197
+ error={error}
198
+ >
199
+ <Select
179
200
  {...simpleProps}
180
- value={field.value == null ? "" : String(field.value)}
201
+ value={field.value == null ? undefined : String(field.value)}
181
202
  disabled={disabled || readOnly}
203
+ aria-describedby={resolvedIds.describedBy}
204
+ aria-errormessage={error ? resolvedIds.errorId : undefined}
182
205
  onValueChange={(nextValue) => {
183
206
  field.onChange(nextValue || emptyValue)
184
207
  onValueChange?.(nextValue as string)
@@ -1,7 +1,11 @@
1
1
  import * as React from "react"
2
2
  import { Controller, type Control, type FieldPath, type FieldValues } from "react-hook-form"
3
3
 
4
- import { FormFieldShell, type FormFieldShellControlProps } from "@/components/form/form-field-shell"
4
+ import {
5
+ FormFieldShell,
6
+ type FormFieldShellControlProps,
7
+ resolveFormFieldIds,
8
+ } from "@/components/form/form-field-shell"
5
9
  import { Switch } from "@/components/ui/switch"
6
10
  import { cn } from "@/lib/utils"
7
11
 
@@ -47,33 +51,40 @@ function FormSwitch<
47
51
  id,
48
52
  onCheckedChange,
49
53
  ...props
50
- }: FormSwitchProps<TFieldValues, TName>) {
51
- const switchId = id ?? name
52
- const labelContent = label ? (
53
- <label
54
- htmlFor={switchId}
55
- className={cn("text-sm font-medium leading-none", disabled && "opacity-60", labelClassName)}
56
- >
57
- {label}
58
- {required && (requiredIndicator ?? <span className="ml-1 text-destructive">*</span>)}
59
- </label>
60
- ) : null
61
-
62
- return (
63
- <Controller
64
- control={control}
65
- name={name}
66
- render={({ field, fieldState }) => {
67
- const switchControl = (
68
- <Switch
69
- id={switchId}
70
- ref={field.ref}
71
- checked={Boolean(field.value)}
72
- disabled={disabled || readOnly}
73
- aria-invalid={fieldState.invalid || undefined}
74
- className={fieldClassName}
75
- onBlur={field.onBlur}
76
- onCheckedChange={(checked) => {
54
+ }: FormSwitchProps<TFieldValues, TName>) {
55
+ const switchId = id ?? name
56
+
57
+ return (
58
+ <Controller
59
+ control={control}
60
+ name={name}
61
+ render={({ field, fieldState }) => {
62
+ const error = fieldState.error?.message
63
+ const resolvedIds = resolveFormFieldIds(switchId, { description, error })
64
+ const labelContent = label ? (
65
+ <label
66
+ id={resolvedIds.labelId}
67
+ htmlFor={switchId}
68
+ className={cn("text-sm font-medium leading-none", disabled && "opacity-60", labelClassName)}
69
+ >
70
+ {label}
71
+ {required && (requiredIndicator ?? <span className="ml-1 text-destructive">*</span>)}
72
+ </label>
73
+ ) : null
74
+
75
+ const switchControl = (
76
+ <Switch
77
+ id={switchId}
78
+ ref={field.ref}
79
+ checked={Boolean(field.value)}
80
+ disabled={disabled || readOnly}
81
+ aria-invalid={fieldState.invalid || undefined}
82
+ aria-labelledby={label ? resolvedIds.labelId : undefined}
83
+ aria-describedby={resolvedIds.describedBy}
84
+ aria-errormessage={error ? resolvedIds.errorId : undefined}
85
+ className={fieldClassName}
86
+ onBlur={field.onBlur}
87
+ onCheckedChange={(checked) => {
77
88
  field.onChange(checked)
78
89
  onCheckedChange?.(checked)
79
90
  }}
@@ -81,19 +92,22 @@ function FormSwitch<
81
92
  />
82
93
  )
83
94
 
84
- return labelPlacement === "start" ? (
85
- <FormFieldShell
86
- label={label}
87
- description={description}
88
- required={required}
89
- error={fieldState.error?.message}
90
- htmlFor={switchId}
91
- className={className}
92
- layout={layout}
93
- descriptionPosition={descriptionPosition}
94
- labelAction={labelAction}
95
- requiredIndicator={requiredIndicator}
96
- errorIcon={errorIcon}
95
+ return labelPlacement === "start" ? (
96
+ <FormFieldShell
97
+ label={label}
98
+ description={description}
99
+ required={required}
100
+ error={error}
101
+ htmlFor={switchId}
102
+ labelId={resolvedIds.labelId}
103
+ descriptionId={resolvedIds.descriptionId}
104
+ errorId={resolvedIds.errorId}
105
+ className={className}
106
+ layout={layout}
107
+ descriptionPosition={descriptionPosition}
108
+ labelAction={labelAction}
109
+ requiredIndicator={requiredIndicator}
110
+ errorIcon={errorIcon}
97
111
  showErrorIcon={showErrorIcon}
98
112
  disabled={disabled}
99
113
  readOnly={readOnly}
@@ -106,12 +120,14 @@ function FormSwitch<
106
120
  {switchControl}
107
121
  </FormFieldShell>
108
122
  ) : (
109
- <FormFieldShell
110
- error={fieldState.error?.message}
111
- className={className}
112
- errorIcon={errorIcon}
113
- showErrorIcon={showErrorIcon}
114
- disabled={disabled}
123
+ <FormFieldShell
124
+ error={error}
125
+ className={className}
126
+ descriptionId={resolvedIds.descriptionId}
127
+ errorId={resolvedIds.errorId}
128
+ errorIcon={errorIcon}
129
+ showErrorIcon={showErrorIcon}
130
+ disabled={disabled}
115
131
  readOnly={readOnly}
116
132
  errorClassName={errorClassName}
117
133
  contentClassName={contentClassName}
@@ -121,17 +137,20 @@ function FormSwitch<
121
137
 
122
138
  {(label || description || labelAction) && (
123
139
  <div className="grid min-w-0 gap-1">
124
- {(label || labelAction) && (
125
- <div className={cn("flex items-center justify-between gap-2", labelRowClassName)}>
126
- {labelContent}
127
- {labelAction && <div className="shrink-0 text-sm">{labelAction}</div>}
128
- </div>
129
- )}
130
- {description && (
131
- <p className={cn("text-xs text-muted-foreground", descriptionClassName)}>
132
- {description}
133
- </p>
134
- )}
140
+ {(label || labelAction) && (
141
+ <div className={cn("flex items-center justify-between gap-2", labelRowClassName)}>
142
+ {labelContent}
143
+ {labelAction && <div className="shrink-0 text-sm">{labelAction}</div>}
144
+ </div>
145
+ )}
146
+ {description && (
147
+ <p
148
+ id={resolvedIds.descriptionId}
149
+ className={cn("text-xs text-muted-foreground", descriptionClassName)}
150
+ >
151
+ {description}
152
+ </p>
153
+ )}
135
154
  </div>
136
155
  )}
137
156
  </div>