tembro 2.0.3 → 2.0.5

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 (579) 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-toolbar.cjs +1 -1
  20. package/dist/components/data-table/data-table-toolbar.d.ts +5 -1
  21. package/dist/components/data-table/data-table-toolbar.js +36 -23
  22. package/dist/components/data-table/data-table.cjs +1 -1
  23. package/dist/components/data-table/data-table.d.ts +6 -4
  24. package/dist/components/data-table/data-table.js +87 -79
  25. package/dist/components/data-table/demo.cjs +1 -1
  26. package/dist/components/data-table/demo.js +3 -13
  27. package/dist/components/data-table/index.cjs +1 -1
  28. package/dist/components/data-table/index.js +5 -5
  29. package/dist/components/data-table/public.cjs +1 -1
  30. package/dist/components/data-table/public.d.ts +1 -6
  31. package/dist/components/data-table/public.js +7 -12
  32. package/dist/components/display/activity-feed.cjs +1 -1
  33. package/dist/components/display/activity-feed.d.ts +12 -1
  34. package/dist/components/display/activity-feed.js +69 -47
  35. package/dist/components/display/carousel.cjs +1 -1
  36. package/dist/components/display/carousel.d.ts +10 -1
  37. package/dist/components/display/carousel.js +68 -23
  38. package/dist/components/display/code-block.cjs +2 -1
  39. package/dist/components/display/code-block.d.ts +3 -1
  40. package/dist/components/display/code-block.js +33 -19
  41. package/dist/components/display/comparison-card.cjs +1 -1
  42. package/dist/components/display/comparison-card.d.ts +3 -3
  43. package/dist/components/display/comparison-card.js +14 -38
  44. package/dist/components/display/data-state.cjs +1 -1
  45. package/dist/components/display/data-state.d.ts +12 -2
  46. package/dist/components/display/data-state.js +80 -42
  47. package/dist/components/display/demo.cjs +1 -1
  48. package/dist/components/display/demo.js +1 -5
  49. package/dist/components/display/index.cjs +1 -1
  50. package/dist/components/display/index.d.ts +0 -8
  51. package/dist/components/display/index.js +21 -29
  52. package/dist/components/feedback/alert.cjs +1 -1
  53. package/dist/components/feedback/alert.d.ts +6 -1
  54. package/dist/components/feedback/alert.js +49 -19
  55. package/dist/components/feedback/index.cjs +1 -1
  56. package/dist/components/feedback/index.d.ts +0 -2
  57. package/dist/components/feedback/index.js +3 -5
  58. package/dist/components/filters/demo.cjs +1 -1
  59. package/dist/components/filters/demo.js +1 -5
  60. package/dist/components/filters/filter-bar.cjs +1 -1
  61. package/dist/components/filters/filter-bar.d.ts +15 -1
  62. package/dist/components/filters/filter-bar.js +94 -50
  63. package/dist/components/filters/index.cjs +1 -1
  64. package/dist/components/filters/index.d.ts +0 -1
  65. package/dist/components/filters/index.js +3 -4
  66. package/dist/components/form/demo.cjs +1 -1
  67. package/dist/components/form/demo.js +1 -2
  68. package/dist/components/form/form-field-shell.cjs +1 -1
  69. package/dist/components/form/form-field-shell.d.ts +17 -3
  70. package/dist/components/form/form-field-shell.js +54 -40
  71. package/dist/components/form/form-input.cjs +1 -1
  72. package/dist/components/form/form-input.js +278 -217
  73. package/dist/components/form/form-select.cjs +1 -1
  74. package/dist/components/form/form-select.js +47 -33
  75. package/dist/components/form/form-switch.cjs +1 -1
  76. package/dist/components/form/form-switch.js +79 -66
  77. package/dist/components/form/form-textarea.cjs +1 -1
  78. package/dist/components/form/form-textarea.js +59 -48
  79. package/dist/components/form/index.cjs +1 -1
  80. package/dist/components/form/index.d.ts +0 -1
  81. package/dist/components/form/index.js +11 -12
  82. package/dist/components/form/public.cjs +1 -1
  83. package/dist/components/form/public.d.ts +0 -9
  84. package/dist/components/form/public.js +7 -16
  85. package/dist/components/inputs/async-select.cjs +1 -1
  86. package/dist/components/inputs/async-select.d.ts +11 -2
  87. package/dist/components/inputs/async-select.js +278 -270
  88. package/dist/components/inputs/combobox.cjs +1 -1
  89. package/dist/components/inputs/combobox.d.ts +5 -1
  90. package/dist/components/inputs/combobox.js +52 -19
  91. package/dist/components/inputs/index.cjs +1 -1
  92. package/dist/components/inputs/index.d.ts +0 -2
  93. package/dist/components/inputs/index.js +3 -5
  94. package/dist/components/inputs/public.cjs +1 -1
  95. package/dist/components/inputs/public.d.ts +0 -2
  96. package/dist/components/inputs/public.js +3 -5
  97. package/dist/components/inputs/simple-select.cjs +1 -1
  98. package/dist/components/inputs/simple-select.d.ts +2 -1
  99. package/dist/components/inputs/simple-select.js +32 -16
  100. package/dist/components/layout/app-sidebar.cjs +1 -1
  101. package/dist/components/layout/app-sidebar.d.ts +4 -1
  102. package/dist/components/layout/app-sidebar.js +152 -132
  103. package/dist/components/layout/breadcrumbs.cjs +1 -1
  104. package/dist/components/layout/breadcrumbs.d.ts +2 -1
  105. package/dist/components/layout/breadcrumbs.js +10 -10
  106. package/dist/components/layout/index.cjs +1 -1
  107. package/dist/components/layout/index.d.ts +0 -1
  108. package/dist/components/layout/index.js +4 -5
  109. package/dist/components/layout/public.cjs +1 -1
  110. package/dist/components/layout/public.d.ts +0 -1
  111. package/dist/components/layout/public.js +2 -3
  112. package/dist/components/layout/stat-card.cjs +1 -1
  113. package/dist/components/layout/stat-card.d.ts +8 -1
  114. package/dist/components/layout/stat-card.js +33 -11
  115. package/dist/components/modern/calendar-scheduler.cjs +1 -1
  116. package/dist/components/modern/calendar-scheduler.d.ts +2 -1
  117. package/dist/components/modern/calendar-scheduler.js +21 -12
  118. package/dist/components/modern/index.cjs +1 -1
  119. package/dist/components/modern/index.d.ts +0 -4
  120. package/dist/components/modern/index.js +12 -16
  121. package/dist/components/overlay/alert-dialog.cjs +1 -1
  122. package/dist/components/overlay/alert-dialog.d.ts +15 -1
  123. package/dist/components/overlay/alert-dialog.js +102 -27
  124. package/dist/components/overlay/drawer.cjs +1 -1
  125. package/dist/components/overlay/drawer.d.ts +4 -1
  126. package/dist/components/overlay/drawer.js +20 -17
  127. package/dist/components/patterns/index.cjs +1 -1
  128. package/dist/components/patterns/index.d.ts +0 -1
  129. package/dist/components/patterns/index.js +1 -2
  130. package/dist/components/patterns/public.cjs +1 -1
  131. package/dist/components/patterns/public.d.ts +0 -1
  132. package/dist/components/patterns/public.js +1 -2
  133. package/dist/components/ui/button/index.cjs +1 -1
  134. package/dist/components/ui/button/index.d.ts +3 -1
  135. package/dist/components/ui/button/index.js +7 -5
  136. package/dist/components/ui/checkbox/index.cjs +1 -1
  137. package/dist/components/ui/checkbox/index.d.ts +8 -0
  138. package/dist/components/ui/checkbox/index.js +16 -14
  139. package/dist/components/ui/collapse/index.cjs +1 -1
  140. package/dist/components/ui/collapse/index.d.ts +17 -3
  141. package/dist/components/ui/collapse/index.js +88 -33
  142. package/dist/components/ui/dialog/index.cjs +1 -1
  143. package/dist/components/ui/dialog/index.d.ts +2 -1
  144. package/dist/components/ui/dialog/index.js +6 -4
  145. package/dist/components/ui/dropdown-menu/index.cjs +1 -1
  146. package/dist/components/ui/dropdown-menu/index.d.ts +9 -4
  147. package/dist/components/ui/dropdown-menu/index.js +87 -62
  148. package/dist/index.cjs +1 -1
  149. package/dist/index.js +145 -177
  150. package/dist/public-component-surface.cjs +1 -1
  151. package/dist/public-component-surface.js +0 -80
  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 +20 -34
  155. package/dist/showcase/create-demo.js +15 -16
  156. package/dist/showcase/fallback.cjs +3 -3
  157. package/dist/showcase/fallback.js +287 -451
  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 +13 -13
  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 +467 -574
  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/simple-select/mock.cjs +1 -1
  224. package/dist/showcase/premium/simple-select/mock.js +1 -1
  225. package/dist/showcase/premium/simple-select/showcase.cjs +1 -1
  226. package/dist/showcase/premium/simple-select/showcase.js +4 -2
  227. package/dist/showcase/preview-catalog.cjs +7 -10
  228. package/dist/showcase/preview-catalog.js +7 -7
  229. package/dist/showcase/registry-quality.cjs +1 -1
  230. package/dist/showcase/registry-quality.js +0 -24
  231. package/dist/showcase/registry-specific.cjs +1 -1
  232. package/dist/showcase/registry-specific.js +149 -383
  233. package/dist/showcase/render-registry-preview.cjs +1 -1
  234. package/dist/showcase/render-registry-preview.js +163 -195
  235. package/dist/showcase/site-data.cjs +1 -1
  236. package/dist/showcase/site-data.js +197 -941
  237. package/dist/showcase/supplemental.cjs +1 -1
  238. package/dist/showcase/supplemental.js +1 -1
  239. package/dist/showcase/tembro-registry.json.cjs +1 -1
  240. package/dist/showcase/tembro-registry.json.js +33 -59
  241. package/package.json +1 -1
  242. package/packages/cli/dist/index.cjs +2 -2
  243. package/packages/cli/vendor/src/components/actions/action-menu.tsx +149 -83
  244. package/packages/cli/vendor/src/components/actions/button-group.tsx +141 -33
  245. package/packages/cli/vendor/src/components/actions/copy-button.tsx +21 -16
  246. package/packages/cli/vendor/src/components/calendar/calendar.tsx +223 -88
  247. package/packages/cli/vendor/src/components/calendar/date-picker.tsx +73 -29
  248. package/packages/cli/vendor/src/components/calendar/date-range-picker.tsx +154 -49
  249. package/packages/cli/vendor/src/components/data-table/data-table-toolbar.tsx +71 -50
  250. package/packages/cli/vendor/src/components/data-table/data-table.tsx +65 -53
  251. package/packages/cli/vendor/src/components/data-table/demo.tsx +2 -12
  252. package/packages/cli/vendor/src/components/data-table/public.ts +1 -6
  253. package/packages/cli/vendor/src/components/display/activity-feed.tsx +98 -40
  254. package/packages/cli/vendor/src/components/display/carousel.tsx +88 -2
  255. package/packages/cli/vendor/src/components/display/code-block.tsx +58 -26
  256. package/packages/cli/vendor/src/components/display/comparison-card.tsx +15 -41
  257. package/packages/cli/vendor/src/components/display/data-state.tsx +119 -50
  258. package/packages/cli/vendor/src/components/display/demo.tsx +0 -4
  259. package/packages/cli/vendor/src/components/display/index.ts +0 -8
  260. package/packages/cli/vendor/src/components/feedback/alert.tsx +86 -28
  261. package/packages/cli/vendor/src/components/feedback/index.ts +0 -2
  262. package/packages/cli/vendor/src/components/filters/demo.tsx +0 -1
  263. package/packages/cli/vendor/src/components/filters/filter-bar.tsx +126 -54
  264. package/packages/cli/vendor/src/components/filters/index.ts +0 -1
  265. package/packages/cli/vendor/src/components/form/demo.tsx +0 -1
  266. package/packages/cli/vendor/src/components/form/form-field-shell.tsx +72 -34
  267. package/packages/cli/vendor/src/components/form/form-input.tsx +118 -11
  268. package/packages/cli/vendor/src/components/form/form-select.tsx +26 -3
  269. package/packages/cli/vendor/src/components/form/form-switch.tsx +77 -58
  270. package/packages/cli/vendor/src/components/form/form-textarea.tsx +65 -51
  271. package/packages/cli/vendor/src/components/form/index.ts +0 -1
  272. package/packages/cli/vendor/src/components/form/public.ts +0 -11
  273. package/packages/cli/vendor/src/components/inputs/async-select.tsx +126 -82
  274. package/packages/cli/vendor/src/components/inputs/combobox.tsx +66 -9
  275. package/packages/cli/vendor/src/components/inputs/index.ts +0 -2
  276. package/packages/cli/vendor/src/components/inputs/public.ts +0 -2
  277. package/packages/cli/vendor/src/components/inputs/simple-select.tsx +52 -24
  278. package/packages/cli/vendor/src/components/layout/app-sidebar.tsx +42 -1
  279. package/packages/cli/vendor/src/components/layout/breadcrumbs.tsx +17 -8
  280. package/packages/cli/vendor/src/components/layout/index.ts +0 -1
  281. package/packages/cli/vendor/src/components/layout/public.ts +0 -1
  282. package/packages/cli/vendor/src/components/layout/stat-card.tsx +63 -23
  283. package/packages/cli/vendor/src/components/modern/calendar-scheduler.tsx +32 -22
  284. package/packages/cli/vendor/src/components/modern/index.ts +1 -5
  285. package/packages/cli/vendor/src/components/overlay/alert-dialog.tsx +148 -24
  286. package/packages/cli/vendor/src/components/overlay/drawer.tsx +42 -30
  287. package/packages/cli/vendor/src/components/patterns/index.ts +0 -1
  288. package/packages/cli/vendor/src/components/patterns/public.ts +0 -1
  289. package/packages/cli/vendor/src/components/ui/button/index.tsx +27 -17
  290. package/packages/cli/vendor/src/components/ui/checkbox/index.tsx +22 -5
  291. package/packages/cli/vendor/src/components/ui/collapse/index.tsx +97 -16
  292. package/packages/cli/vendor/src/components/ui/dialog/index.tsx +12 -8
  293. package/packages/cli/vendor/src/components/ui/dropdown-menu/index.tsx +82 -28
  294. package/packages/cli/vendor/src/public-component-surface.ts +0 -16
  295. package/packages/cli/vendor/src/showcase/component-api-schema.ts +2 -2
  296. package/packages/cli/vendor/src/showcase/create-demo.tsx +31 -46
  297. package/packages/cli/vendor/src/showcase/fallback.tsx +83 -263
  298. package/packages/cli/vendor/src/showcase/premium/accordion/showcase.tsx +32 -2
  299. package/packages/cli/vendor/src/showcase/premium/action-menu/showcase.tsx +12 -3
  300. package/packages/cli/vendor/src/showcase/premium/activity-feed/showcase.tsx +15 -2
  301. package/packages/cli/vendor/src/showcase/premium/alert/showcase.tsx +32 -17
  302. package/packages/cli/vendor/src/showcase/premium/alert-dialog/showcase.tsx +28 -3
  303. package/packages/cli/vendor/src/showcase/premium/async-multi-select/mock.ts +6 -5
  304. package/packages/cli/vendor/src/showcase/premium/async-multi-select/showcase.tsx +5 -4
  305. package/packages/cli/vendor/src/showcase/premium/async-select/mock.ts +1 -1
  306. package/packages/cli/vendor/src/showcase/premium/async-select/showcase.tsx +36 -0
  307. package/packages/cli/vendor/src/showcase/premium/button/showcase.tsx +26 -5
  308. package/packages/cli/vendor/src/showcase/premium/button-group/showcase.tsx +20 -3
  309. package/packages/cli/vendor/src/showcase/premium/calendar/showcase.tsx +5 -0
  310. package/packages/cli/vendor/src/showcase/premium/carousel/showcase.tsx +33 -5
  311. package/packages/cli/vendor/src/showcase/premium/checkbox/showcase.tsx +46 -3
  312. package/packages/cli/vendor/src/showcase/premium/clearable-input/mock.ts +5 -3
  313. package/packages/cli/vendor/src/showcase/premium/clearable-input/showcase.tsx +5 -2
  314. package/packages/cli/vendor/src/showcase/premium/collapse/showcase.tsx +4 -0
  315. package/packages/cli/vendor/src/showcase/premium/combobox/showcase.tsx +8 -0
  316. package/packages/cli/vendor/src/showcase/premium/data-table/showcase.tsx +77 -27
  317. package/packages/cli/vendor/src/showcase/premium/data-table-parts/showcase.tsx +11 -11
  318. package/packages/cli/vendor/src/showcase/premium/date-input/mock.ts +1 -1
  319. package/packages/cli/vendor/src/showcase/premium/date-range-picker/showcase.tsx +7 -0
  320. package/packages/cli/vendor/src/showcase/premium/dropdown-menu/showcase.tsx +46 -3
  321. package/packages/cli/vendor/src/showcase/premium/form-wrapper/mock.ts +70 -44
  322. package/packages/cli/vendor/src/showcase/premium/form-wrapper/showcase.tsx +129 -12
  323. package/packages/cli/vendor/src/showcase/premium/index.ts +7 -46
  324. package/packages/cli/vendor/src/showcase/premium/input/mock.ts +2 -2
  325. package/packages/cli/vendor/src/showcase/premium/masked-input/mock.ts +1 -1
  326. package/packages/cli/vendor/src/showcase/premium/money-input/mock.ts +1 -1
  327. package/packages/cli/vendor/src/showcase/premium/number-input/mock.ts +1 -1
  328. package/packages/cli/vendor/src/showcase/premium/phone-input/mock.ts +1 -1
  329. package/packages/cli/vendor/src/showcase/premium/quantity-input/mock.ts +1 -1
  330. package/packages/cli/vendor/src/showcase/premium/simple-select/mock.ts +1 -1
  331. package/packages/cli/vendor/src/showcase/premium/simple-select/showcase.tsx +2 -1
  332. package/packages/cli/vendor/src/showcase/preview-catalog.tsx +7 -7
  333. package/packages/cli/vendor/src/showcase/registry-quality.ts +4 -30
  334. package/packages/cli/vendor/src/showcase/registry-specific.tsx +3 -178
  335. package/packages/cli/vendor/src/showcase/render-registry-preview.tsx +18 -51
  336. package/packages/cli/vendor/src/showcase/site-data.tsx +2443 -2761
  337. package/packages/cli/vendor/src/showcase/supplemental.tsx +2 -42
  338. package/packages/cli/vendor/src/showcase/tembro-registry.json +206 -280
  339. package/registry.json +251 -329
  340. package/dist/components/display/aspect-ratio.cjs +0 -1
  341. package/dist/components/display/aspect-ratio.d.ts +0 -6
  342. package/dist/components/display/aspect-ratio.js +0 -21
  343. package/dist/components/display/entity-card.cjs +0 -1
  344. package/dist/components/display/entity-card.d.ts +0 -18
  345. package/dist/components/display/entity-card.js +0 -61
  346. package/dist/components/display/entity-header.cjs +0 -1
  347. package/dist/components/display/entity-header.d.ts +0 -13
  348. package/dist/components/display/entity-header.js +0 -52
  349. package/dist/components/display/file-card.cjs +0 -1
  350. package/dist/components/display/file-card.d.ts +0 -14
  351. package/dist/components/display/file-card.js +0 -59
  352. package/dist/components/display/float-button.cjs +0 -1
  353. package/dist/components/display/float-button.d.ts +0 -6
  354. package/dist/components/display/float-button.js +0 -20
  355. package/dist/components/display/key-value-card.cjs +0 -1
  356. package/dist/components/display/key-value-card.d.ts +0 -16
  357. package/dist/components/display/key-value-card.js +0 -35
  358. package/dist/components/display/keyboard-shortcut.cjs +0 -1
  359. package/dist/components/display/keyboard-shortcut.d.ts +0 -7
  360. package/dist/components/display/keyboard-shortcut.js +0 -18
  361. package/dist/components/display/skeleton-form.cjs +0 -1
  362. package/dist/components/display/skeleton-form.d.ts +0 -9
  363. package/dist/components/display/skeleton-form.js +0 -31
  364. package/dist/components/display/skeleton-table.cjs +0 -1
  365. package/dist/components/display/skeleton-table.d.ts +0 -9
  366. package/dist/components/display/skeleton-table.js +0 -42
  367. package/dist/components/display/tag-list.cjs +0 -1
  368. package/dist/components/display/tag-list.d.ts +0 -17
  369. package/dist/components/display/tag-list.js +0 -30
  370. package/dist/components/display/watermark.cjs +0 -1
  371. package/dist/components/display/watermark.d.ts +0 -6
  372. package/dist/components/display/watermark.js +0 -23
  373. package/dist/components/feedback/empty-search-state.cjs +0 -1
  374. package/dist/components/feedback/empty-search-state.d.ts +0 -11
  375. package/dist/components/feedback/empty-search-state.js +0 -45
  376. package/dist/components/feedback/empty-state.cjs +0 -1
  377. package/dist/components/feedback/empty-state.d.ts +0 -11
  378. package/dist/components/feedback/empty-state.js +0 -38
  379. package/dist/components/filters/filter-chips.cjs +0 -1
  380. package/dist/components/filters/filter-chips.d.ts +0 -18
  381. package/dist/components/filters/filter-chips.js +0 -61
  382. package/dist/components/form/repeater-field.cjs +0 -1
  383. package/dist/components/form/repeater-field.d.ts +0 -16
  384. package/dist/components/form/repeater-field.js +0 -48
  385. package/dist/components/inputs/cascader.cjs +0 -1
  386. package/dist/components/inputs/cascader.d.ts +0 -13
  387. package/dist/components/inputs/cascader.js +0 -58
  388. package/dist/components/inputs/mention-input.cjs +0 -1
  389. package/dist/components/inputs/mention-input.d.ts +0 -18
  390. package/dist/components/inputs/mention-input.js +0 -96
  391. package/dist/components/layout/stack.cjs +0 -1
  392. package/dist/components/layout/stack.d.ts +0 -23
  393. package/dist/components/layout/stack.js +0 -57
  394. package/dist/components/modern/affix.cjs +0 -1
  395. package/dist/components/modern/affix.d.ts +0 -7
  396. package/dist/components/modern/affix.js +0 -18
  397. package/dist/components/patterns/form-builder-presets.cjs +0 -1
  398. package/dist/components/patterns/form-builder-presets.d.ts +0 -1
  399. package/dist/components/patterns/form-builder-presets.js +0 -2
  400. package/dist/components/patterns/form-builder.cjs +0 -1
  401. package/dist/components/patterns/form-builder.d.ts +0 -109
  402. package/dist/components/patterns/form-builder.js +0 -263
  403. package/dist/showcase/premium/affix/index.cjs +0 -1
  404. package/dist/showcase/premium/affix/index.d.ts +0 -2
  405. package/dist/showcase/premium/affix/index.js +0 -3
  406. package/dist/showcase/premium/affix/mock.cjs +0 -12
  407. package/dist/showcase/premium/affix/mock.d.ts +0 -2
  408. package/dist/showcase/premium/affix/mock.js +0 -15
  409. package/dist/showcase/premium/affix/showcase.cjs +0 -1
  410. package/dist/showcase/premium/affix/showcase.d.ts +0 -2
  411. package/dist/showcase/premium/affix/showcase.js +0 -64
  412. package/dist/showcase/premium/aspect-ratio/index.cjs +0 -1
  413. package/dist/showcase/premium/aspect-ratio/index.d.ts +0 -2
  414. package/dist/showcase/premium/aspect-ratio/index.js +0 -3
  415. package/dist/showcase/premium/aspect-ratio/mock.cjs +0 -11
  416. package/dist/showcase/premium/aspect-ratio/mock.d.ts +0 -2
  417. package/dist/showcase/premium/aspect-ratio/mock.js +0 -26
  418. package/dist/showcase/premium/aspect-ratio/showcase.cjs +0 -1
  419. package/dist/showcase/premium/aspect-ratio/showcase.d.ts +0 -2
  420. package/dist/showcase/premium/aspect-ratio/showcase.js +0 -53
  421. package/dist/showcase/premium/cascader/index.cjs +0 -1
  422. package/dist/showcase/premium/cascader/index.d.ts +0 -2
  423. package/dist/showcase/premium/cascader/index.js +0 -3
  424. package/dist/showcase/premium/cascader/mock.cjs +0 -9
  425. package/dist/showcase/premium/cascader/mock.d.ts +0 -2
  426. package/dist/showcase/premium/cascader/mock.js +0 -19
  427. package/dist/showcase/premium/cascader/showcase.cjs +0 -1
  428. package/dist/showcase/premium/cascader/showcase.d.ts +0 -2
  429. package/dist/showcase/premium/cascader/showcase.js +0 -43
  430. package/dist/showcase/premium/empty-state/index.cjs +0 -1
  431. package/dist/showcase/premium/empty-state/index.d.ts +0 -2
  432. package/dist/showcase/premium/empty-state/index.js +0 -3
  433. package/dist/showcase/premium/empty-state/mock.cjs +0 -14
  434. package/dist/showcase/premium/empty-state/mock.d.ts +0 -2
  435. package/dist/showcase/premium/empty-state/mock.js +0 -31
  436. package/dist/showcase/premium/empty-state/showcase.cjs +0 -1
  437. package/dist/showcase/premium/empty-state/showcase.d.ts +0 -3
  438. package/dist/showcase/premium/empty-state/showcase.js +0 -99
  439. package/dist/showcase/premium/float-button/index.cjs +0 -1
  440. package/dist/showcase/premium/float-button/index.d.ts +0 -2
  441. package/dist/showcase/premium/float-button/index.js +0 -3
  442. package/dist/showcase/premium/float-button/mock.cjs +0 -10
  443. package/dist/showcase/premium/float-button/mock.d.ts +0 -2
  444. package/dist/showcase/premium/float-button/mock.js +0 -15
  445. package/dist/showcase/premium/float-button/showcase.cjs +0 -1
  446. package/dist/showcase/premium/float-button/showcase.d.ts +0 -2
  447. package/dist/showcase/premium/float-button/showcase.js +0 -28
  448. package/dist/showcase/premium/form-builder/index.cjs +0 -1
  449. package/dist/showcase/premium/form-builder/index.d.ts +0 -2
  450. package/dist/showcase/premium/form-builder/index.js +0 -3
  451. package/dist/showcase/premium/form-builder/mock.cjs +0 -57
  452. package/dist/showcase/premium/form-builder/mock.d.ts +0 -2
  453. package/dist/showcase/premium/form-builder/mock.js +0 -40
  454. package/dist/showcase/premium/form-builder/showcase.cjs +0 -1
  455. package/dist/showcase/premium/form-builder/showcase.d.ts +0 -3
  456. package/dist/showcase/premium/form-builder/showcase.js +0 -69
  457. package/dist/showcase/premium/keyboard-shortcut/index.cjs +0 -1
  458. package/dist/showcase/premium/keyboard-shortcut/index.d.ts +0 -2
  459. package/dist/showcase/premium/keyboard-shortcut/index.js +0 -3
  460. package/dist/showcase/premium/keyboard-shortcut/mock.cjs +0 -5
  461. package/dist/showcase/premium/keyboard-shortcut/mock.d.ts +0 -2
  462. package/dist/showcase/premium/keyboard-shortcut/mock.js +0 -26
  463. package/dist/showcase/premium/keyboard-shortcut/showcase.cjs +0 -1
  464. package/dist/showcase/premium/keyboard-shortcut/showcase.d.ts +0 -1
  465. package/dist/showcase/premium/keyboard-shortcut/showcase.js +0 -64
  466. package/dist/showcase/premium/mention-input/index.cjs +0 -1
  467. package/dist/showcase/premium/mention-input/index.d.ts +0 -2
  468. package/dist/showcase/premium/mention-input/index.js +0 -3
  469. package/dist/showcase/premium/mention-input/mock.cjs +0 -11
  470. package/dist/showcase/premium/mention-input/mock.d.ts +0 -2
  471. package/dist/showcase/premium/mention-input/mock.js +0 -19
  472. package/dist/showcase/premium/mention-input/showcase.cjs +0 -1
  473. package/dist/showcase/premium/mention-input/showcase.d.ts +0 -2
  474. package/dist/showcase/premium/mention-input/showcase.js +0 -35
  475. package/dist/showcase/premium/skeleton-form/index.cjs +0 -1
  476. package/dist/showcase/premium/skeleton-form/index.d.ts +0 -2
  477. package/dist/showcase/premium/skeleton-form/index.js +0 -3
  478. package/dist/showcase/premium/skeleton-form/mock.cjs +0 -5
  479. package/dist/showcase/premium/skeleton-form/mock.d.ts +0 -2
  480. package/dist/showcase/premium/skeleton-form/mock.js +0 -19
  481. package/dist/showcase/premium/skeleton-form/showcase.cjs +0 -1
  482. package/dist/showcase/premium/skeleton-form/showcase.d.ts +0 -2
  483. package/dist/showcase/premium/skeleton-form/showcase.js +0 -52
  484. package/dist/showcase/premium/skeleton-table/index.cjs +0 -1
  485. package/dist/showcase/premium/skeleton-table/index.d.ts +0 -2
  486. package/dist/showcase/premium/skeleton-table/index.js +0 -3
  487. package/dist/showcase/premium/skeleton-table/mock.cjs +0 -5
  488. package/dist/showcase/premium/skeleton-table/mock.d.ts +0 -2
  489. package/dist/showcase/premium/skeleton-table/mock.js +0 -19
  490. package/dist/showcase/premium/skeleton-table/showcase.cjs +0 -1
  491. package/dist/showcase/premium/skeleton-table/showcase.d.ts +0 -2
  492. package/dist/showcase/premium/skeleton-table/showcase.js +0 -59
  493. package/dist/showcase/premium/stack/index.cjs +0 -1
  494. package/dist/showcase/premium/stack/index.d.ts +0 -2
  495. package/dist/showcase/premium/stack/index.js +0 -3
  496. package/dist/showcase/premium/stack/mock.cjs +0 -10
  497. package/dist/showcase/premium/stack/mock.d.ts +0 -2
  498. package/dist/showcase/premium/stack/mock.js +0 -26
  499. package/dist/showcase/premium/stack/showcase.cjs +0 -1
  500. package/dist/showcase/premium/stack/showcase.d.ts +0 -1
  501. package/dist/showcase/premium/stack/showcase.js +0 -47
  502. package/dist/showcase/premium/tag-list/index.cjs +0 -1
  503. package/dist/showcase/premium/tag-list/index.d.ts +0 -2
  504. package/dist/showcase/premium/tag-list/index.js +0 -3
  505. package/dist/showcase/premium/tag-list/mock.cjs +0 -12
  506. package/dist/showcase/premium/tag-list/mock.d.ts +0 -2
  507. package/dist/showcase/premium/tag-list/mock.js +0 -26
  508. package/dist/showcase/premium/tag-list/showcase.cjs +0 -1
  509. package/dist/showcase/premium/tag-list/showcase.d.ts +0 -2
  510. package/dist/showcase/premium/tag-list/showcase.js +0 -83
  511. package/dist/showcase/premium/watermark/index.cjs +0 -1
  512. package/dist/showcase/premium/watermark/index.d.ts +0 -2
  513. package/dist/showcase/premium/watermark/index.js +0 -3
  514. package/dist/showcase/premium/watermark/mock.cjs +0 -11
  515. package/dist/showcase/premium/watermark/mock.d.ts +0 -2
  516. package/dist/showcase/premium/watermark/mock.js +0 -26
  517. package/dist/showcase/premium/watermark/showcase.cjs +0 -1
  518. package/dist/showcase/premium/watermark/showcase.d.ts +0 -2
  519. package/dist/showcase/premium/watermark/showcase.js +0 -34
  520. package/packages/cli/vendor/src/components/display/aspect-ratio.tsx +0 -22
  521. package/packages/cli/vendor/src/components/display/entity-card.tsx +0 -80
  522. package/packages/cli/vendor/src/components/display/entity-header.tsx +0 -80
  523. package/packages/cli/vendor/src/components/display/file-card.tsx +0 -61
  524. package/packages/cli/vendor/src/components/display/float-button.tsx +0 -27
  525. package/packages/cli/vendor/src/components/display/key-value-card.tsx +0 -50
  526. package/packages/cli/vendor/src/components/display/keyboard-shortcut.tsx +0 -31
  527. package/packages/cli/vendor/src/components/display/skeleton-form.tsx +0 -51
  528. package/packages/cli/vendor/src/components/display/skeleton-table.tsx +0 -59
  529. package/packages/cli/vendor/src/components/display/tag-list.tsx +0 -52
  530. package/packages/cli/vendor/src/components/display/watermark.tsx +0 -20
  531. package/packages/cli/vendor/src/components/feedback/empty-search-state.tsx +0 -65
  532. package/packages/cli/vendor/src/components/feedback/empty-state.tsx +0 -56
  533. package/packages/cli/vendor/src/components/filters/filter-chips.tsx +0 -89
  534. package/packages/cli/vendor/src/components/form/repeater-field.tsx +0 -93
  535. package/packages/cli/vendor/src/components/inputs/cascader.tsx +0 -41
  536. package/packages/cli/vendor/src/components/inputs/mention-input.tsx +0 -162
  537. package/packages/cli/vendor/src/components/layout/stack.tsx +0 -106
  538. package/packages/cli/vendor/src/components/modern/affix.tsx +0 -21
  539. package/packages/cli/vendor/src/components/patterns/form-builder-presets.ts +0 -13
  540. package/packages/cli/vendor/src/components/patterns/form-builder.tsx +0 -443
  541. package/packages/cli/vendor/src/showcase/premium/affix/index.ts +0 -3
  542. package/packages/cli/vendor/src/showcase/premium/affix/mock.ts +0 -26
  543. package/packages/cli/vendor/src/showcase/premium/affix/showcase.tsx +0 -37
  544. package/packages/cli/vendor/src/showcase/premium/aspect-ratio/index.ts +0 -2
  545. package/packages/cli/vendor/src/showcase/premium/aspect-ratio/mock.ts +0 -26
  546. package/packages/cli/vendor/src/showcase/premium/aspect-ratio/showcase.tsx +0 -37
  547. package/packages/cli/vendor/src/showcase/premium/cascader/index.ts +0 -3
  548. package/packages/cli/vendor/src/showcase/premium/cascader/mock.ts +0 -24
  549. package/packages/cli/vendor/src/showcase/premium/cascader/showcase.tsx +0 -20
  550. package/packages/cli/vendor/src/showcase/premium/empty-state/index.ts +0 -2
  551. package/packages/cli/vendor/src/showcase/premium/empty-state/mock.ts +0 -30
  552. package/packages/cli/vendor/src/showcase/premium/empty-state/showcase.tsx +0 -65
  553. package/packages/cli/vendor/src/showcase/premium/float-button/index.ts +0 -3
  554. package/packages/cli/vendor/src/showcase/premium/float-button/mock.ts +0 -24
  555. package/packages/cli/vendor/src/showcase/premium/float-button/showcase.tsx +0 -21
  556. package/packages/cli/vendor/src/showcase/premium/form-builder/index.ts +0 -2
  557. package/packages/cli/vendor/src/showcase/premium/form-builder/mock.ts +0 -79
  558. package/packages/cli/vendor/src/showcase/premium/form-builder/showcase.tsx +0 -55
  559. package/packages/cli/vendor/src/showcase/premium/keyboard-shortcut/index.ts +0 -2
  560. package/packages/cli/vendor/src/showcase/premium/keyboard-shortcut/mock.ts +0 -20
  561. package/packages/cli/vendor/src/showcase/premium/keyboard-shortcut/showcase.tsx +0 -42
  562. package/packages/cli/vendor/src/showcase/premium/mention-input/index.ts +0 -3
  563. package/packages/cli/vendor/src/showcase/premium/mention-input/mock.ts +0 -26
  564. package/packages/cli/vendor/src/showcase/premium/mention-input/showcase.tsx +0 -27
  565. package/packages/cli/vendor/src/showcase/premium/skeleton-form/index.ts +0 -3
  566. package/packages/cli/vendor/src/showcase/premium/skeleton-form/mock.ts +0 -20
  567. package/packages/cli/vendor/src/showcase/premium/skeleton-form/showcase.tsx +0 -34
  568. package/packages/cli/vendor/src/showcase/premium/skeleton-table/index.ts +0 -3
  569. package/packages/cli/vendor/src/showcase/premium/skeleton-table/mock.ts +0 -20
  570. package/packages/cli/vendor/src/showcase/premium/skeleton-table/showcase.tsx +0 -37
  571. package/packages/cli/vendor/src/showcase/premium/stack/index.ts +0 -2
  572. package/packages/cli/vendor/src/showcase/premium/stack/mock.ts +0 -25
  573. package/packages/cli/vendor/src/showcase/premium/stack/showcase.tsx +0 -22
  574. package/packages/cli/vendor/src/showcase/premium/tag-list/index.ts +0 -2
  575. package/packages/cli/vendor/src/showcase/premium/tag-list/mock.ts +0 -27
  576. package/packages/cli/vendor/src/showcase/premium/tag-list/showcase.tsx +0 -55
  577. package/packages/cli/vendor/src/showcase/premium/watermark/index.ts +0 -2
  578. package/packages/cli/vendor/src/showcase/premium/watermark/mock.ts +0 -26
  579. package/packages/cli/vendor/src/showcase/premium/watermark/showcase.tsx +0 -26
@@ -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>
@@ -1,7 +1,11 @@
1
1
  import * as React from "react"
2
2
  import { Controller, type Control, type FieldPath, type FieldValues, type RegisterOptions } 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 { Textarea } from "@/components/ui/textarea"
6
10
 
7
11
  export type FormTextareaProps<
@@ -48,59 +52,69 @@ function FormTextarea<
48
52
  onChange,
49
53
  onBlur,
50
54
  ...props
51
- }: FormTextareaProps<TFieldValues, TName>) {
52
- const textareaId = id ?? name
53
-
54
- return (
55
+ }: FormTextareaProps<TFieldValues, TName>) {
56
+ const textareaId = id ?? name
57
+
58
+ return (
55
59
  <Controller
56
60
  control={control}
57
61
  name={name}
58
62
  rules={rules}
59
- render={({ field, fieldState }) => (
60
- <FormFieldShell
61
- label={label}
62
- description={description}
63
- required={required}
64
- error={fieldState.error?.message}
65
- htmlFor={textareaId}
66
- className={className}
67
- layout={layout}
68
- descriptionPosition={descriptionPosition}
69
- labelAction={labelAction}
70
- requiredIndicator={requiredIndicator}
71
- errorIcon={errorIcon}
72
- showErrorIcon={showErrorIcon}
73
- disabled={disabled}
74
- readOnly={readOnly}
75
- labelClassName={labelClassName}
76
- labelRowClassName={labelRowClassName}
77
- descriptionClassName={descriptionClassName}
78
- errorClassName={errorClassName}
79
- contentClassName={contentClassName}
80
- >
81
- <Textarea
82
- id={textareaId}
83
- ref={field.ref}
84
- name={field.name}
85
- value={transformIn ? transformIn(field.value) : field.value ?? ""}
86
- disabled={disabled}
87
- readOnly={readOnly}
88
- onBlur={(event) => {
89
- field.onBlur()
90
- onBlur?.(event)
91
- }}
92
- onChange={(event) => {
93
- field.onChange(transformOut ? transformOut(event) : event)
94
- onChange?.(event)
95
- }}
96
- aria-invalid={fieldState.invalid || undefined}
97
- className={fieldClassName}
98
- {...props}
99
- />
100
- </FormFieldShell>
101
- )}
102
- />
103
- )
104
- }
63
+ render={({ field, fieldState }) => {
64
+ const error = fieldState.error?.message
65
+ const resolvedIds = resolveFormFieldIds(textareaId, { description, error })
66
+
67
+ return (
68
+ <FormFieldShell
69
+ label={label}
70
+ description={description}
71
+ required={required}
72
+ error={error}
73
+ htmlFor={textareaId}
74
+ labelId={resolvedIds.labelId}
75
+ descriptionId={resolvedIds.descriptionId}
76
+ errorId={resolvedIds.errorId}
77
+ className={className}
78
+ layout={layout}
79
+ descriptionPosition={descriptionPosition}
80
+ labelAction={labelAction}
81
+ requiredIndicator={requiredIndicator}
82
+ errorIcon={errorIcon}
83
+ showErrorIcon={showErrorIcon}
84
+ disabled={disabled}
85
+ readOnly={readOnly}
86
+ labelClassName={labelClassName}
87
+ labelRowClassName={labelRowClassName}
88
+ descriptionClassName={descriptionClassName}
89
+ errorClassName={errorClassName}
90
+ contentClassName={contentClassName}
91
+ >
92
+ <Textarea
93
+ id={textareaId}
94
+ ref={field.ref}
95
+ name={field.name}
96
+ value={transformIn ? transformIn(field.value) : field.value ?? ""}
97
+ disabled={disabled}
98
+ readOnly={readOnly}
99
+ onBlur={(event) => {
100
+ field.onBlur()
101
+ onBlur?.(event)
102
+ }}
103
+ onChange={(event) => {
104
+ field.onChange(transformOut ? transformOut(event) : event)
105
+ onChange?.(event)
106
+ }}
107
+ aria-invalid={fieldState.invalid || undefined}
108
+ aria-describedby={resolvedIds.describedBy}
109
+ aria-errormessage={error ? resolvedIds.errorId : undefined}
110
+ className={fieldClassName}
111
+ {...props}
112
+ />
113
+ </FormFieldShell>
114
+ )
115
+ }}
116
+ />
117
+ )
118
+ }
105
119
 
106
120
  export { FormTextarea }
@@ -12,4 +12,3 @@ export * from "./form-date-input"
12
12
  export * from "./form-date-range-input"
13
13
  export * from "./form-date-picker"
14
14
  export * from "./form-date-range-picker"
15
- export * from "./repeater-field"
@@ -4,15 +4,4 @@ export * from "./form-input"
4
4
  export * from "./form-select"
5
5
  export * from "./form-switch"
6
6
  export * from "./form-textarea"
7
- export * from "./form-date-picker"
8
- export * from "./form-date-range-picker"
9
- export * from "./repeater-field"
10
-
11
- // Compatibility aliases
12
7
  export * from "./form-async-select"
13
- export * from "./form-date-input"
14
- export * from "./form-date-range-input"
15
- export * from "./form-number-input"
16
- export * from "./form-password-input"
17
- export * from "./form-phone-input"
18
- export * from "./form-search-input"
@@ -48,9 +48,10 @@ export type AsyncSelectStateRenderer<
48
48
  TOption extends AsyncSelectOption<TValue, TData> = AsyncSelectOption<TValue, TData>,
49
49
  > = (state: AsyncSelectRenderState<TValue, TData, TOption>) => React.ReactNode
50
50
 
51
- export type AsyncSelectLabels = {
52
- placeholder?: string
53
- searchPlaceholder?: string
51
+ export type AsyncSelectLabels = {
52
+ placeholder?: string
53
+ multiPlaceholder?: string
54
+ searchPlaceholder?: string
54
55
  loading?: string
55
56
  creating?: string
56
57
  empty?: string
@@ -59,18 +60,20 @@ export type AsyncSelectLabels = {
59
60
  clearAll?: string
60
61
  selectAll?: string
61
62
  minSearchLength?: (minSearchLength: number) => string
62
- maxSelected?: (maxSelected: number) => string
63
- selectedCount?: (count: number) => string
64
- }
65
-
66
- export type AsyncSelectProps<
67
- TValue extends string = string,
68
- TData = unknown,
69
- TOption extends AsyncSelectOption<TValue, TData> = AsyncSelectOption<TValue, TData>,
70
- > = Omit<React.ComponentProps<"div">, "onChange"> & {
71
- value?: TValue
72
- selectedOption?: TOption | null
73
- onValueChange?: (value: TValue | undefined, option?: TOption) => void
63
+ maxSelected?: (maxSelected: number) => string
64
+ selectedCount?: (count: number) => string
65
+ hiddenSelected?: (count: number) => string
66
+ }
67
+
68
+ export type AsyncSelectProps<
69
+ TValue extends string = string,
70
+ TData = unknown,
71
+ TOption extends AsyncSelectOption<TValue, TData> = AsyncSelectOption<TValue, TData>,
72
+ > = Omit<React.ComponentProps<"div">, "onChange"> & {
73
+ isMulti?: false
74
+ value?: TValue
75
+ selectedOption?: TOption | null
76
+ onValueChange?: (value: TValue | undefined, option?: TOption) => void
74
77
  loadOptions: (search: string, signal?: AbortSignal) => Promise<AsyncSelectOptionsResult<TValue, TData, TOption>>
75
78
  loadSelectedOption?: (value: TValue, signal?: AbortSignal) => Promise<TOption | null | undefined>
76
79
  defaultOptions?: AsyncSelectOptionsResult<TValue, TData, TOption>
@@ -87,15 +90,24 @@ export type AsyncSelectProps<
87
90
  renderEmpty?: AsyncSelectStateRenderer<TValue, TData, TOption>
88
91
  renderError?: AsyncSelectStateRenderer<TValue, TData, TOption>
89
92
  renderMinSearch?: AsyncSelectStateRenderer<TValue, TData, TOption>
90
- onCreateOption?: (search: string) => Promise<TOption> | TOption
91
- createOptionLabel?: (search: string) => React.ReactNode
92
- showCreateOption?: (search: string, options: TOption[]) => boolean
93
- triggerClassName?: string
93
+ onCreateOption?: (search: string) => Promise<TOption> | TOption
94
+ createOptionLabel?: (search: string) => React.ReactNode
95
+ showCreateOption?: (search: string, options: TOption[]) => boolean
96
+ showSelectedDescription?: boolean
97
+ triggerClassName?: string
94
98
  contentClassName?: string
95
99
  searchClassName?: string
96
100
  optionClassName?: string
97
- invalid?: boolean
98
- }
101
+ invalid?: boolean
102
+ }
103
+
104
+ export type AsyncSelectMultiModeProps<
105
+ TValue extends string = string,
106
+ TData = unknown,
107
+ TOption extends AsyncSelectOption<TValue, TData> = AsyncSelectOption<TValue, TData>,
108
+ > = AsyncMultiSelectProps<TValue, TData, TOption> & {
109
+ isMulti: true
110
+ }
99
111
 
100
112
  export type AsyncMultiSelectProps<
101
113
  TValue extends string = string,
@@ -115,8 +127,9 @@ export type AsyncMultiSelectProps<
115
127
  closeOnSelect?: boolean
116
128
  debounceMs?: number
117
129
  minSearchLength?: number
118
- maxSelected?: number
119
- showSelectAll?: boolean
130
+ maxSelected?: number
131
+ maxVisibleTags?: number
132
+ showSelectAll?: boolean
120
133
  labels?: AsyncSelectLabels
121
134
  renderOption?: (option: TOption, state: { selected: boolean }) => React.ReactNode
122
135
  renderValue?: (option: TOption) => React.ReactNode
@@ -126,10 +139,11 @@ export type AsyncMultiSelectProps<
126
139
  renderError?: AsyncSelectStateRenderer<TValue, TData, TOption>
127
140
  renderMinSearch?: AsyncSelectStateRenderer<TValue, TData, TOption>
128
141
  renderMaxSelected?: AsyncSelectStateRenderer<TValue, TData, TOption>
129
- onCreateOption?: (search: string) => Promise<TOption> | TOption
130
- createOptionLabel?: (search: string) => React.ReactNode
131
- showCreateOption?: (search: string, options: TOption[]) => boolean
132
- triggerClassName?: string
142
+ onCreateOption?: (search: string) => Promise<TOption> | TOption
143
+ createOptionLabel?: (search: string) => React.ReactNode
144
+ showCreateOption?: (search: string, options: TOption[]) => boolean
145
+ showSelectedDescription?: boolean
146
+ triggerClassName?: string
133
147
  contentClassName?: string
134
148
  searchClassName?: string
135
149
  optionClassName?: string
@@ -410,14 +424,21 @@ function AsyncCreateButton({
410
424
  )
411
425
  }
412
426
 
413
- function AsyncSelect<
414
- TValue extends string = string,
415
- TData = unknown,
416
- TOption extends AsyncSelectOption<TValue, TData> = AsyncSelectOption<TValue, TData>,
417
- >({
418
- className,
419
- value,
420
- selectedOption,
427
+ function AsyncSelect<
428
+ TValue extends string = string,
429
+ TData = unknown,
430
+ TOption extends AsyncSelectOption<TValue, TData> = AsyncSelectOption<TValue, TData>,
431
+ >(props: AsyncSelectProps<TValue, TData, TOption> | AsyncSelectMultiModeProps<TValue, TData, TOption>) {
432
+ if ("isMulti" in props && props.isMulti) {
433
+ const multiProps = { ...props }
434
+ delete (multiProps as { isMulti?: true }).isMulti
435
+ return <AsyncMultiSelect {...multiProps} />
436
+ }
437
+
438
+ const {
439
+ className,
440
+ value,
441
+ selectedOption,
421
442
  onValueChange,
422
443
  loadOptions,
423
444
  loadSelectedOption,
@@ -434,17 +455,18 @@ function AsyncSelect<
434
455
  renderLoading,
435
456
  renderEmpty,
436
457
  renderError,
437
- renderMinSearch,
438
- onCreateOption,
439
- createOptionLabel,
440
- showCreateOption,
441
- triggerClassName,
458
+ renderMinSearch,
459
+ onCreateOption,
460
+ createOptionLabel,
461
+ showCreateOption,
462
+ showSelectedDescription = true,
463
+ triggerClassName,
442
464
  contentClassName,
443
- searchClassName,
444
- optionClassName,
445
- invalid,
446
- ...props
447
- }: AsyncSelectProps<TValue, TData, TOption>) {
465
+ searchClassName,
466
+ optionClassName,
467
+ invalid,
468
+ ...rootProps
469
+ } = props as AsyncSelectProps<TValue, TData, TOption>
448
470
  const resolvedDefaultGroups = React.useMemo(() => normalizeOptionGroups(defaultOptions), [defaultOptions])
449
471
  const defaultFlatOptions = React.useMemo(() => flattenOptionGroups(resolvedDefaultGroups), [resolvedDefaultGroups])
450
472
  const [open, setOpen] = React.useState(false)
@@ -613,7 +635,7 @@ function AsyncSelect<
613
635
  }
614
636
 
615
637
  return (
616
- <div data-slot="async-select" className={cn("w-full", className)} {...props}>
638
+ <div data-slot="async-select" className={cn("w-full", className)} {...rootProps}>
617
639
  <Popover open={open} onOpenChange={setOpen}>
618
640
  <PopoverTrigger
619
641
  render={
@@ -633,16 +655,18 @@ function AsyncSelect<
633
655
  }
634
656
  >
635
657
  <span className="min-w-0 flex-1 text-left">
636
- {currentOption ? (
658
+ {currentOption ? (
637
659
  <span className="flex min-w-0 flex-col gap-0.5">
638
660
  <span className="truncate font-semibold">
639
- {renderValue?.(currentOption) ?? currentOption.label}
640
- </span>
641
- {currentOption.disabled && currentOption.disabledReason && (
642
- <span className="truncate text-xs text-muted-foreground">{currentOption.disabledReason}</span>
643
- )}
644
- </span>
645
- ) : (
661
+ {renderValue?.(currentOption) ?? currentOption.label}
662
+ </span>
663
+ {showSelectedDescription && (currentOption.description || (currentOption.disabled && currentOption.disabledReason)) ? (
664
+ <span className="truncate text-xs text-muted-foreground">
665
+ {currentOption.description ?? currentOption.disabledReason}
666
+ </span>
667
+ ) : null}
668
+ </span>
669
+ ) : (
646
670
  <span className="truncate text-muted-foreground">{labels?.placeholder ?? "Select"}</span>
647
671
  )}
648
672
  </span>
@@ -773,8 +797,9 @@ function AsyncMultiSelect<
773
797
  closeOnSelect = false,
774
798
  debounceMs = 250,
775
799
  minSearchLength = 0,
776
- maxSelected,
777
- showSelectAll = false,
800
+ maxSelected,
801
+ maxVisibleTags,
802
+ showSelectAll = false,
778
803
  labels,
779
804
  renderOption,
780
805
  renderValue,
@@ -783,11 +808,12 @@ function AsyncMultiSelect<
783
808
  renderEmpty,
784
809
  renderError,
785
810
  renderMinSearch,
786
- renderMaxSelected,
787
- onCreateOption,
788
- createOptionLabel,
789
- showCreateOption,
790
- triggerClassName,
811
+ renderMaxSelected,
812
+ onCreateOption,
813
+ createOptionLabel,
814
+ showCreateOption,
815
+ showSelectedDescription = true,
816
+ triggerClassName,
791
817
  contentClassName,
792
818
  searchClassName,
793
819
  optionClassName,
@@ -825,17 +851,20 @@ function AsyncMultiSelect<
825
851
  () => ({ search, minSearchLength, options: flatOptions, selectedCount: values.length, maxSelected }),
826
852
  [flatOptions, maxSelected, minSearchLength, search, values.length]
827
853
  )
828
- const hasValue = values.length > 0
829
- const canClear = clearable && hasValue && !disabled
830
- const isMaxReached = typeof maxSelected === "number" && values.length >= maxSelected
831
- const searchTooShort = searchKey.length < minSearchLength
854
+ const hasValue = values.length > 0
855
+ const canClear = clearable && hasValue && !disabled
856
+ const isMaxReached = typeof maxSelected === "number" && values.length >= maxSelected
857
+ const resolvedMaxVisibleTags = Math.max(maxVisibleTags ?? values.length, 1)
858
+ const searchTooShort = searchKey.length < minSearchLength
832
859
  const canCreate =
833
860
  !searchTooShort &&
834
861
  Boolean(onCreateOption) &&
835
862
  (showCreateOption ?? defaultShowCreateOption)(search, flatOptions)
836
863
  const visibleSelectableOptions = flatOptions.filter((option) => !option.disabled)
837
864
  const unselectedVisibleOptions = visibleSelectableOptions.filter((option) => !selectedSet.has(option.value))
838
- const canSelectAll = showSelectAll && unselectedVisibleOptions.length > 0 && !isMaxReached
865
+ const canSelectAll = showSelectAll && unselectedVisibleOptions.length > 0 && !isMaxReached
866
+ const visibleTagOptions = currentOptions.slice(0, resolvedMaxVisibleTags)
867
+ const hiddenTagCount = Math.max(currentOptions.length - visibleTagOptions.length, 0)
839
868
 
840
869
  React.useEffect(() => {
841
870
  cacheRef.current.clear()
@@ -1051,11 +1080,12 @@ function AsyncMultiSelect<
1051
1080
  }
1052
1081
  >
1053
1082
  <span className="flex min-w-0 flex-1 flex-wrap gap-1 text-left">
1054
- {currentOptions.length > 0 ? (
1055
- currentOptions.map((option) => (
1056
- <span
1057
- key={option.value}
1058
- data-slot="async-select-tag"
1083
+ {currentOptions.length > 0 ? (
1084
+ <>
1085
+ {visibleTagOptions.map((option) => (
1086
+ <span
1087
+ key={option.value}
1088
+ data-slot="async-select-tag"
1059
1089
  className={cn(
1060
1090
  "inline-flex max-w-full items-center gap-1.5 rounded-[var(--radius-sm)] border border-[color:color-mix(in_oklch,var(--primary),transparent_70%)] bg-[color:color-mix(in_oklch,var(--primary),transparent_92%)] px-2 py-1 text-xs font-medium text-foreground",
1061
1091
  tagClassName
@@ -1067,9 +1097,11 @@ function AsyncMultiSelect<
1067
1097
  renderValue?.(option) ??
1068
1098
  option.label}
1069
1099
  </span>
1070
- {option.disabled && option.disabledReason && (
1071
- <span className="truncate text-[11px] text-muted-foreground">{option.disabledReason}</span>
1072
- )}
1100
+ {showSelectedDescription && (option.description || (option.disabled && option.disabledReason)) ? (
1101
+ <span className="truncate text-[11px] text-muted-foreground">
1102
+ {option.description ?? option.disabledReason}
1103
+ </span>
1104
+ ) : null}
1073
1105
  </span>
1074
1106
  {!disabled && (
1075
1107
  <span
@@ -1086,14 +1118,26 @@ function AsyncMultiSelect<
1086
1118
  >
1087
1119
  <XIcon className="size-3" />
1088
1120
  </span>
1089
- )}
1090
- </span>
1091
- ))
1092
- ) : (
1093
- <span className="truncate text-muted-foreground">
1094
- {labels?.placeholder ?? "Select"}
1095
- </span>
1096
- )}
1121
+ )}
1122
+ </span>
1123
+ ))}
1124
+ {hiddenTagCount > 0 ? (
1125
+ <span
1126
+ data-slot="async-select-tag-overflow"
1127
+ className={cn(
1128
+ "inline-flex max-w-full items-center rounded-[var(--radius-sm)] border border-dashed border-[color:var(--aui-card-border,var(--border))] bg-[color:color-mix(in_oklch,var(--muted),transparent_58%)] px-2 py-1 text-xs font-medium text-muted-foreground",
1129
+ tagClassName
1130
+ )}
1131
+ >
1132
+ {labels?.hiddenSelected?.(hiddenTagCount) ?? `+${hiddenTagCount} more`}
1133
+ </span>
1134
+ ) : null}
1135
+ </>
1136
+ ) : (
1137
+ <span className="truncate text-muted-foreground">
1138
+ {labels?.multiPlaceholder ?? labels?.placeholder ?? "Select"}
1139
+ </span>
1140
+ )}
1097
1141
  </span>
1098
1142
  <span className="ml-2 flex shrink-0 items-center gap-1">
1099
1143
  {canClear && (