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
@@ -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 }
@@ -4,13 +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
- // Compatibility aliases
10
7
  export * from "./form-async-select"
11
- export * from "./form-date-input"
12
- export * from "./form-date-range-input"
13
- export * from "./form-number-input"
14
- export * from "./form-password-input"
15
- export * from "./form-phone-input"
16
- 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,21 +90,30 @@ 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
- }
99
-
100
- export type AsyncMultiSelectProps<
101
- TValue extends string = string,
102
- TData = unknown,
103
- TOption extends AsyncSelectOption<TValue, TData> = AsyncSelectOption<TValue, TData>,
104
- > = Omit<React.ComponentProps<"div">, "onChange"> & {
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
+ }
111
+
112
+ export type AsyncMultiSelectProps<
113
+ TValue extends string = string,
114
+ TData = unknown,
115
+ TOption extends AsyncSelectOption<TValue, TData> = AsyncSelectOption<TValue, TData>,
116
+ > = Omit<React.ComponentProps<"div">, "onChange"> & {
105
117
  value?: TValue[]
106
118
  selectedOptions?: TOption[]
107
119
  onValueChange?: (value: TValue[], options: TOption[]) => void
@@ -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,16 +139,17 @@ 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
136
150
  tagClassName?: string
137
- invalid?: boolean
138
- }
151
+ invalid?: boolean
152
+ }
139
153
 
140
154
  type AsyncSelectCacheEntry<
141
155
  TValue extends 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>
@@ -754,7 +778,10 @@ function AsyncSelect<
754
778
  )
755
779
  }
756
780
 
757
- function AsyncMultiSelect<
781
+ /**
782
+ * @deprecated Prefer `AsyncSelect` with `isMulti` for new usage.
783
+ */
784
+ function AsyncMultiSelect<
758
785
  TValue extends string = string,
759
786
  TData = unknown,
760
787
  TOption extends AsyncSelectOption<TValue, TData> = AsyncSelectOption<TValue, TData>,
@@ -773,8 +800,9 @@ function AsyncMultiSelect<
773
800
  closeOnSelect = false,
774
801
  debounceMs = 250,
775
802
  minSearchLength = 0,
776
- maxSelected,
777
- showSelectAll = false,
803
+ maxSelected,
804
+ maxVisibleTags,
805
+ showSelectAll = false,
778
806
  labels,
779
807
  renderOption,
780
808
  renderValue,
@@ -783,11 +811,12 @@ function AsyncMultiSelect<
783
811
  renderEmpty,
784
812
  renderError,
785
813
  renderMinSearch,
786
- renderMaxSelected,
787
- onCreateOption,
788
- createOptionLabel,
789
- showCreateOption,
790
- triggerClassName,
814
+ renderMaxSelected,
815
+ onCreateOption,
816
+ createOptionLabel,
817
+ showCreateOption,
818
+ showSelectedDescription = true,
819
+ triggerClassName,
791
820
  contentClassName,
792
821
  searchClassName,
793
822
  optionClassName,
@@ -825,17 +854,20 @@ function AsyncMultiSelect<
825
854
  () => ({ search, minSearchLength, options: flatOptions, selectedCount: values.length, maxSelected }),
826
855
  [flatOptions, maxSelected, minSearchLength, search, values.length]
827
856
  )
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
857
+ const hasValue = values.length > 0
858
+ const canClear = clearable && hasValue && !disabled
859
+ const isMaxReached = typeof maxSelected === "number" && values.length >= maxSelected
860
+ const resolvedMaxVisibleTags = Math.max(maxVisibleTags ?? values.length, 1)
861
+ const searchTooShort = searchKey.length < minSearchLength
832
862
  const canCreate =
833
863
  !searchTooShort &&
834
864
  Boolean(onCreateOption) &&
835
865
  (showCreateOption ?? defaultShowCreateOption)(search, flatOptions)
836
866
  const visibleSelectableOptions = flatOptions.filter((option) => !option.disabled)
837
867
  const unselectedVisibleOptions = visibleSelectableOptions.filter((option) => !selectedSet.has(option.value))
838
- const canSelectAll = showSelectAll && unselectedVisibleOptions.length > 0 && !isMaxReached
868
+ const canSelectAll = showSelectAll && unselectedVisibleOptions.length > 0 && !isMaxReached
869
+ const visibleTagOptions = currentOptions.slice(0, resolvedMaxVisibleTags)
870
+ const hiddenTagCount = Math.max(currentOptions.length - visibleTagOptions.length, 0)
839
871
 
840
872
  React.useEffect(() => {
841
873
  cacheRef.current.clear()
@@ -1051,11 +1083,12 @@ function AsyncMultiSelect<
1051
1083
  }
1052
1084
  >
1053
1085
  <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"
1086
+ {currentOptions.length > 0 ? (
1087
+ <>
1088
+ {visibleTagOptions.map((option) => (
1089
+ <span
1090
+ key={option.value}
1091
+ data-slot="async-select-tag"
1059
1092
  className={cn(
1060
1093
  "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
1094
  tagClassName
@@ -1067,9 +1100,11 @@ function AsyncMultiSelect<
1067
1100
  renderValue?.(option) ??
1068
1101
  option.label}
1069
1102
  </span>
1070
- {option.disabled && option.disabledReason && (
1071
- <span className="truncate text-[11px] text-muted-foreground">{option.disabledReason}</span>
1072
- )}
1103
+ {showSelectedDescription && (option.description || (option.disabled && option.disabledReason)) ? (
1104
+ <span className="truncate text-[11px] text-muted-foreground">
1105
+ {option.description ?? option.disabledReason}
1106
+ </span>
1107
+ ) : null}
1073
1108
  </span>
1074
1109
  {!disabled && (
1075
1110
  <span
@@ -1086,14 +1121,26 @@ function AsyncMultiSelect<
1086
1121
  >
1087
1122
  <XIcon className="size-3" />
1088
1123
  </span>
1089
- )}
1090
- </span>
1091
- ))
1092
- ) : (
1093
- <span className="truncate text-muted-foreground">
1094
- {labels?.placeholder ?? "Select"}
1095
- </span>
1096
- )}
1124
+ )}
1125
+ </span>
1126
+ ))}
1127
+ {hiddenTagCount > 0 ? (
1128
+ <span
1129
+ data-slot="async-select-tag-overflow"
1130
+ className={cn(
1131
+ "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",
1132
+ tagClassName
1133
+ )}
1134
+ >
1135
+ {labels?.hiddenSelected?.(hiddenTagCount) ?? `+${hiddenTagCount} more`}
1136
+ </span>
1137
+ ) : null}
1138
+ </>
1139
+ ) : (
1140
+ <span className="truncate text-muted-foreground">
1141
+ {labels?.multiPlaceholder ?? labels?.placeholder ?? "Select"}
1142
+ </span>
1143
+ )}
1097
1144
  </span>
1098
1145
  <span className="ml-2 flex shrink-0 items-center gap-1">
1099
1146
  {canClear && (
@@ -15,15 +15,19 @@ export type ComboboxOption<TValue extends string = string> = {
15
15
  hidden?: boolean
16
16
  }
17
17
 
18
- export type ComboboxProps<TValue extends string = string> = React.ComponentProps<"div"> & {
18
+ export type ComboboxProps<TValue extends string = string> = React.ComponentProps<"div"> & {
19
19
  value?: TValue
20
20
  options: ComboboxOption<TValue>[]
21
21
  onValueChange?: (value: TValue | undefined, option?: ComboboxOption<TValue>) => void
22
22
  placeholder?: React.ReactNode
23
23
  searchPlaceholder?: string
24
- emptyLabel?: React.ReactNode
25
- disabled?: boolean
24
+ emptyLabel?: React.ReactNode
25
+ disabled?: boolean
26
26
  invalid?: boolean
27
+ clearable?: boolean
28
+ allowDeselect?: boolean
29
+ showSelectedDescription?: boolean
30
+ onSearchChange?: (value: string) => void
27
31
  triggerClassName?: string
28
32
  contentClassName?: string
29
33
  optionClassName?: string
@@ -36,9 +40,13 @@ function Combobox<TValue extends string = string>({
36
40
  onValueChange,
37
41
  placeholder = "Select option",
38
42
  searchPlaceholder = "Search...",
39
- emptyLabel = "No option found",
43
+ emptyLabel = "No option found",
40
44
  disabled = false,
41
45
  invalid,
46
+ clearable = false,
47
+ allowDeselect = false,
48
+ showSelectedDescription = true,
49
+ onSearchChange,
42
50
  triggerClassName,
43
51
  contentClassName,
44
52
  optionClassName,
@@ -58,7 +66,16 @@ function Combobox<TValue extends string = string>({
58
66
 
59
67
  return (
60
68
  <div data-slot="combobox" className={cn("grid w-full gap-2", className)} {...props}>
61
- <Popover open={open} onOpenChange={setOpen}>
69
+ <Popover
70
+ open={open}
71
+ onOpenChange={(nextOpen) => {
72
+ setOpen(nextOpen)
73
+ if (!nextOpen) {
74
+ setSearch("")
75
+ onSearchChange?.("")
76
+ }
77
+ }}
78
+ >
62
79
  <PopoverTrigger
63
80
  render={
64
81
  <Button
@@ -71,9 +88,40 @@ function Combobox<TValue extends string = string>({
71
88
  />
72
89
  }
73
90
  >
74
- <span className={cn("min-w-0 flex-1 truncate font-medium", !selectedOption && "font-normal text-muted-foreground")}>
75
- {selectedOption?.label ?? placeholder}
91
+ <span className={cn("min-w-0 flex-1", !selectedOption && "text-muted-foreground")}>
92
+ {selectedOption ? (
93
+ <span className="flex min-w-0 flex-col items-start">
94
+ <span className="truncate font-medium">{selectedOption.label}</span>
95
+ {showSelectedDescription && selectedOption.description ? (
96
+ <span className="truncate text-[11px] text-muted-foreground">{selectedOption.description}</span>
97
+ ) : null}
98
+ </span>
99
+ ) : (
100
+ <span className="truncate font-normal">{placeholder}</span>
101
+ )}
76
102
  </span>
103
+ {clearable && selectedOption && !disabled ? (
104
+ <span
105
+ role="button"
106
+ tabIndex={0}
107
+ aria-label="Clear value"
108
+ className="inline-flex size-6 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted/55 hover:text-foreground"
109
+ onClick={(event) => {
110
+ event.preventDefault()
111
+ event.stopPropagation()
112
+ onValueChange?.(undefined, undefined)
113
+ }}
114
+ onKeyDown={(event) => {
115
+ if (event.key === "Enter" || event.key === " ") {
116
+ event.preventDefault()
117
+ event.stopPropagation()
118
+ onValueChange?.(undefined, undefined)
119
+ }
120
+ }}
121
+ >
122
+ ×
123
+ </span>
124
+ ) : null}
77
125
  <ChevronDownIcon className="size-4 opacity-60" />
78
126
  </PopoverTrigger>
79
127
  <PopoverContent
@@ -83,7 +131,15 @@ function Combobox<TValue extends string = string>({
83
131
  >
84
132
  <div className="relative mb-2">
85
133
  <SearchIcon className="pointer-events-none absolute left-2 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" />
86
- <Input value={search} onChange={(event) => setSearch(event.target.value)} placeholder={searchPlaceholder} className={cn("h-9 pl-8", searchClassName)} />
134
+ <Input
135
+ value={search}
136
+ onChange={(event) => {
137
+ setSearch(event.target.value)
138
+ onSearchChange?.(event.target.value)
139
+ }}
140
+ placeholder={searchPlaceholder}
141
+ className={cn("h-9 pl-8", searchClassName)}
142
+ />
87
143
  </div>
88
144
  <div className="max-h-64 overflow-y-auto">
89
145
  {filteredOptions.length ? filteredOptions.map((option) => {
@@ -99,7 +155,8 @@ function Combobox<TValue extends string = string>({
99
155
  optionClassName
100
156
  )}
101
157
  onClick={() => {
102
- onValueChange?.(option.value, option)
158
+ const nextValue = allowDeselect && active ? undefined : option.value
159
+ onValueChange?.(nextValue, nextValue ? option : undefined)
103
160
  setOpen(false)
104
161
  }}
105
162
  >
@@ -14,8 +14,11 @@ export type SearchInputProps = Omit<ClearableInputProps, "leadingIcon" | "type"
14
14
  onValueChange?: (value: string) => void
15
15
  onDebouncedValueChange?: (value: string) => void
16
16
  }
17
-
18
- const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(
17
+
18
+ /**
19
+ * @deprecated Prefer `Input` with `type="search"` and search-related props for new usage.
20
+ */
21
+ const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(
19
22
  (
20
23
  {
21
24
  searchIcon,