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
@@ -7,9 +7,21 @@ export type CollapseProps = React.ComponentProps<"details"> & {
7
7
  defaultOpen?: boolean
8
8
  open?: boolean
9
9
  onOpenChange?: (open: boolean) => void
10
+ variant?: "default" | "soft" | "ghost"
11
+ size?: "sm" | "md" | "lg"
10
12
  }
11
13
 
12
- function Collapse({ open, defaultOpen, onOpenChange, onToggle, className, children, ...props }: CollapseProps) {
14
+ function Collapse({
15
+ open,
16
+ defaultOpen,
17
+ onOpenChange,
18
+ onToggle,
19
+ className,
20
+ children,
21
+ variant = "default",
22
+ size = "md",
23
+ ...props
24
+ }: CollapseProps) {
13
25
  const isControlled = open !== undefined
14
26
  const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false)
15
27
  const currentOpen = isControlled ? open : internalOpen
@@ -17,8 +29,10 @@ function Collapse({ open, defaultOpen, onOpenChange, onToggle, className, childr
17
29
  return (
18
30
  <details
19
31
  data-slot="collapse"
32
+ data-variant={variant}
33
+ data-size={size}
20
34
  className={cn(
21
- "group rounded-[var(--aui-card-radius,var(--radius-xl))] border border-[color:var(--aui-card-border,var(--border))] bg-card text-card-foreground shadow-[var(--aui-card-shadow,var(--aui-control-shadow,none))] transition-[background-color,border-color,box-shadow] open:border-[color:var(--aui-control-hover-border,var(--ring))]",
35
+ "group overflow-hidden rounded-[var(--aui-card-radius,var(--radius-xl))] border border-[color:var(--aui-card-border,var(--border))] bg-card text-card-foreground shadow-[var(--aui-card-shadow,var(--aui-control-shadow,none))] transition-[background-color,border-color,box-shadow] hover:border-[color:var(--aui-control-hover-border,var(--ring))] open:border-[color:var(--aui-control-hover-border,var(--ring))] data-[variant=soft]:bg-[color:color-mix(in_oklch,var(--muted),transparent_58%)] data-[variant=soft]:shadow-none data-[variant=ghost]:border-transparent data-[variant=ghost]:bg-transparent data-[variant=ghost]:shadow-none",
22
36
  className
23
37
  )}
24
38
  onToggle={(event) => {
@@ -26,6 +40,8 @@ function Collapse({ open, defaultOpen, onOpenChange, onToggle, className, childr
26
40
  const nextOpen = event.currentTarget.open
27
41
  if (!isControlled) {
28
42
  setInternalOpen(nextOpen)
43
+ } else if (nextOpen !== currentOpen) {
44
+ event.currentTarget.open = currentOpen
29
45
  }
30
46
  onOpenChange?.(nextOpen)
31
47
  }}
@@ -40,24 +56,51 @@ function Collapse({ open, defaultOpen, onOpenChange, onToggle, className, childr
40
56
  export type CollapseTriggerProps = React.ComponentProps<"summary"> & {
41
57
  icon?: React.ReactNode
42
58
  hideIcon?: boolean
59
+ size?: "sm" | "md" | "lg"
60
+ inset?: boolean
61
+ indicatorPosition?: "start" | "end"
43
62
  }
44
63
 
45
- function CollapseTrigger({ icon, hideIcon = false, className, children, ...props }: CollapseTriggerProps) {
64
+ function CollapseTrigger({
65
+ icon,
66
+ hideIcon = false,
67
+ size = "md",
68
+ inset = false,
69
+ indicatorPosition = "end",
70
+ className,
71
+ children,
72
+ onClick,
73
+ ...props
74
+ }: CollapseTriggerProps) {
75
+ const indicator = !hideIcon ? (
76
+ <span className="shrink-0 rounded-md text-muted-foreground transition-[color,transform] group-open:rotate-180 group-open:text-foreground">
77
+ {icon ?? <ChevronDownIcon className="size-4" />}
78
+ </span>
79
+ ) : null
80
+
46
81
  return (
47
82
  <summary
48
83
  data-slot="collapse-trigger"
84
+ data-size={size}
85
+ data-inset={inset || undefined}
86
+ data-indicator-position={indicatorPosition}
49
87
  className={cn(
50
- "flex cursor-pointer list-none items-center justify-between gap-3 rounded-[calc(var(--aui-card-radius,var(--radius-xl))-1px)] px-4 py-3 text-sm font-semibold outline-none transition-[background-color,color,box-shadow] hover:bg-[color:var(--aui-control-surface-hover,var(--muted))] focus-visible:shadow-[0_0_0_1px_var(--aui-focus-ring,var(--ring)),0_0_0_5px_var(--aui-focus-ring-soft,transparent)] group-open:text-foreground [&::-webkit-details-marker]:hidden",
88
+ "rounded-[calc(var(--aui-card-radius,var(--radius-xl))-1px)] group-open:rounded-b-none flex cursor-pointer list-none items-start gap-3 px-4 text-sm font-semibold outline-none transition-[background-color,color,box-shadow,border-radius] hover:bg-[color:var(--aui-control-surface-hover,var(--muted))] focus-visible:bg-[color:var(--aui-control-surface-hover,var(--muted))] focus-visible:shadow-[0_0_0_1px_var(--aui-focus-ring,var(--ring)),0_0_0_5px_var(--aui-focus-ring-soft,transparent)] group-open:text-foreground data-[indicator-position=end]:justify-between data-[indicator-position=start]:justify-start data-[size=sm]:py-2.5 data-[size=md]:py-3.5 data-[size=lg]:py-4.5 data-[inset=true]:px-5 [&::-webkit-details-marker]:hidden",
89
+ props["aria-disabled"] && "cursor-not-allowed opacity-75 hover:bg-transparent",
51
90
  className
52
91
  )}
92
+ onClick={(event) => {
93
+ if (props["aria-disabled"]) {
94
+ event.preventDefault()
95
+ return
96
+ }
97
+ onClick?.(event)
98
+ }}
53
99
  {...props}
54
100
  >
101
+ {indicatorPosition === "start" ? indicator : null}
55
102
  <span className="min-w-0 flex-1">{children}</span>
56
- {!hideIcon && (
57
- <span className="shrink-0 rounded-md text-muted-foreground transition-[color,transform] group-open:rotate-180 group-open:text-foreground">
58
- {icon ?? <ChevronDownIcon className="size-4" />}
59
- </span>
60
- )}
103
+ {indicatorPosition === "end" ? indicator : null}
61
104
  </summary>
62
105
  )
63
106
  }
@@ -67,7 +110,7 @@ function CollapseContent({ className, ...props }: React.ComponentProps<"div">) {
67
110
  <div
68
111
  data-slot="collapse-content"
69
112
  className={cn(
70
- "border-t border-[color:var(--aui-card-border,var(--border))] px-4 py-3 text-sm leading-6 text-muted-foreground",
113
+ "border-t border-[color:var(--aui-card-border,var(--border))] bg-[color:color-mix(in_oklch,var(--muted),transparent_70%)] px-4 py-3.5 text-sm leading-6 text-muted-foreground",
71
114
  className
72
115
  )}
73
116
  {...props}
@@ -80,7 +123,14 @@ export type CollapseItem = {
80
123
  title: React.ReactNode
81
124
  content: React.ReactNode
82
125
  description?: React.ReactNode
126
+ meta?: React.ReactNode
127
+ badge?: React.ReactNode
83
128
  disabled?: boolean
129
+ disabledReason?: React.ReactNode
130
+ icon?: React.ReactNode
131
+ indicatorPosition?: CollapseTriggerProps["indicatorPosition"]
132
+ triggerClassName?: string
133
+ contentClassName?: string
84
134
  }
85
135
 
86
136
  export type CollapseGroupProps = React.ComponentProps<"div"> & {
@@ -89,9 +139,21 @@ export type CollapseGroupProps = React.ComponentProps<"div"> & {
89
139
  value?: string | string[]
90
140
  defaultValue?: string | string[]
91
141
  onValueChange?: (value: string | string[]) => void
142
+ variant?: CollapseProps["variant"]
143
+ size?: CollapseTriggerProps["size"]
92
144
  }
93
145
 
94
- function CollapseGroup({ items, type = "multiple", value, defaultValue, onValueChange, className, ...props }: CollapseGroupProps) {
146
+ function CollapseGroup({
147
+ items,
148
+ type = "multiple",
149
+ value,
150
+ defaultValue,
151
+ onValueChange,
152
+ variant = "default",
153
+ size = "md",
154
+ className,
155
+ ...props
156
+ }: CollapseGroupProps) {
95
157
  const initialValue = React.useMemo(() => {
96
158
  if (value !== undefined) return value
97
159
  if (defaultValue !== undefined) return defaultValue
@@ -119,16 +181,35 @@ function CollapseGroup({ items, type = "multiple", value, defaultValue, onValueC
119
181
  <Collapse
120
182
  key={item.key}
121
183
  open={isOpen(item.key)}
122
- onOpenChange={(open) => updateValue(item.key, open)}
184
+ onOpenChange={(open) => {
185
+ if (item.disabled) return
186
+ updateValue(item.key, open)
187
+ }}
188
+ variant={variant}
189
+ size={size}
123
190
  className={cn(item.disabled && "pointer-events-none opacity-60")}
124
191
  >
125
- <CollapseTrigger>
126
- <span className="grid gap-0.5">
127
- <span>{item.title}</span>
192
+ <CollapseTrigger
193
+ size={size}
194
+ icon={item.icon}
195
+ indicatorPosition={item.indicatorPosition}
196
+ className={item.triggerClassName}
197
+ aria-disabled={item.disabled || undefined}
198
+ title={typeof item.disabledReason === "string" ? item.disabledReason : undefined}
199
+ >
200
+ <span className="grid min-w-0 gap-0.5">
201
+ <span className="flex min-w-0 items-center gap-2">
202
+ <span className="truncate">{item.title}</span>
203
+ {item.badge ? <span className="shrink-0">{item.badge}</span> : null}
204
+ {item.meta ? <span className="ml-auto shrink-0 text-[11px] font-medium text-muted-foreground">{item.meta}</span> : null}
205
+ </span>
128
206
  {item.description && <span className="text-xs font-normal text-muted-foreground">{item.description}</span>}
207
+ {item.disabled && item.disabledReason ? (
208
+ <span className="text-[11px] font-medium text-muted-foreground">{item.disabledReason}</span>
209
+ ) : null}
129
210
  </span>
130
211
  </CollapseTrigger>
131
- <CollapseContent>{item.content}</CollapseContent>
212
+ <CollapseContent className={item.contentClassName}>{item.content}</CollapseContent>
132
213
  </Collapse>
133
214
  ))}
134
215
  </div>
@@ -13,6 +13,7 @@ export type DialogOverlayProps = DialogPrimitive.Backdrop.Props
13
13
  export type DialogPopupProps = DialogPrimitive.Popup.Props & {
14
14
  showCloseButton?: boolean
15
15
  size?: "xs" | "sm" | "md" | "lg" | "xl" | "full"
16
+ surface?: "default" | "plain"
16
17
  }
17
18
  export type DialogHeaderProps = React.ComponentProps<"div">
18
19
  export type DialogFooterProps = React.ComponentProps<"div"> & {
@@ -58,6 +59,7 @@ function DialogContent({
58
59
  children,
59
60
  showCloseButton = true,
60
61
  size = "md",
62
+ surface = "default",
61
63
  ...props
62
64
  }: DialogPopupProps) {
63
65
  return (
@@ -66,8 +68,10 @@ function DialogContent({
66
68
  <DialogPrimitive.Popup
67
69
  data-slot="dialog-content"
68
70
  data-size={size}
71
+ data-surface={surface}
72
+ role="dialog"
69
73
  className={cn(
70
- "fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-5 rounded-[var(--radius-3xl)] border p-6 text-sm text-popover-foreground backdrop-blur duration-100 outline-none data-[size=xs]:sm:max-w-sm data-[size=sm]:sm:max-w-md data-[size=md]:sm:max-w-lg data-[size=lg]:sm:max-w-2xl data-[size=xl]:sm:max-w-4xl data-[size=full]:h-[min(92vh,56rem)] data-[size=full]:max-w-[min(96vw,84rem)] data-[size=full]:grid-rows-[auto_1fr] data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
74
+ "fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-5 overflow-hidden rounded-[var(--radius-3xl)] border border-[color:var(--aui-card-border,var(--border))] bg-[color:var(--aui-overlay-surface,var(--popover))] p-6 text-sm text-popover-foreground shadow-[var(--aui-control-panel-shadow,0_24px_70px_rgba(15,23,42,0.22))] backdrop-blur duration-100 outline-none data-[surface=plain]:overflow-visible data-[surface=plain]:border-transparent data-[surface=plain]:bg-transparent data-[surface=plain]:p-0 data-[surface=plain]:shadow-none data-[size=xs]:sm:max-w-sm data-[size=sm]:sm:max-w-md data-[size=md]:sm:max-w-lg data-[size=lg]:sm:max-w-2xl data-[size=xl]:sm:max-w-4xl data-[size=full]:h-[min(92vh,56rem)] data-[size=full]:max-w-[min(96vw,84rem)] data-[size=full]:grid-rows-[auto_minmax(0,1fr)] data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
71
75
  className
72
76
  )}
73
77
  {...props}
@@ -77,11 +81,11 @@ function DialogContent({
77
81
  <DialogPrimitive.Close
78
82
  data-slot="dialog-close"
79
83
  render={
80
- <Button
81
- variant="ghost"
82
- className="absolute top-3 right-3 rounded-full border border-transparent hover:border-border/50 hover:bg-muted/50"
83
- size="icon-sm"
84
- />
84
+ <Button
85
+ variant="ghost"
86
+ className="absolute top-3 right-3 rounded-full border border-transparent hover:border-border/50 hover:bg-muted/50"
87
+ size="icon-sm"
88
+ />
85
89
  }
86
90
  >
87
91
  <XIcon />
@@ -110,10 +114,10 @@ function DialogFooter({
110
114
  ...props
111
115
  }: DialogFooterProps) {
112
116
  return (
113
- <div
117
+ <div
114
118
  data-slot="dialog-footer"
115
119
  className={cn(
116
- "-mx-6 -mb-6 flex flex-col-reverse gap-2 rounded-b-[var(--radius-3xl)] border-t p-5 sm:flex-row sm:justify-end",
120
+ "-mx-6 -mb-6 flex flex-col-reverse gap-2 border-t border-border/70 bg-muted/20 p-5 sm:flex-row sm:justify-end",
117
121
  className
118
122
  )}
119
123
  {...props}
@@ -17,6 +17,7 @@ export type DropdownMenuLabelProps = React.ComponentProps<"div"> & { inset?: boo
17
17
  export type DropdownMenuItemProps = MenuPrimitive.Item.Props & {
18
18
  inset?: boolean
19
19
  variant?: "default" | "destructive"
20
+ closeOnSelect?: boolean
20
21
  }
21
22
  export type DropdownMenuSubmenuProps = MenuPrimitive.SubmenuRoot.Props
22
23
  export type DropdownMenuSubmenuTriggerProps = MenuPrimitive.SubmenuTrigger.Props & {
@@ -25,13 +26,19 @@ export type DropdownMenuSubmenuTriggerProps = MenuPrimitive.SubmenuTrigger.Props
25
26
  export type DropdownMenuSubmenuContentProps = React.ComponentProps<typeof DropdownMenuContent>
26
27
  export type DropdownMenuCheckboxItemProps = MenuPrimitive.CheckboxItem.Props & {
27
28
  inset?: boolean
29
+ closeOnSelect?: boolean
28
30
  }
29
31
  export type DropdownMenuRadioGroupProps = MenuPrimitive.RadioGroup.Props
30
32
  export type DropdownMenuRadioItemProps = MenuPrimitive.RadioItem.Props & {
31
33
  inset?: boolean
34
+ closeOnSelect?: boolean
32
35
  }
33
36
  export type DropdownMenuSeparatorProps = MenuPrimitive.Separator.Props
34
37
  export type DropdownMenuShortcutProps = React.ComponentProps<"span">
38
+ export type DropdownMenuItemDescriptionProps = React.ComponentProps<"span">
39
+
40
+ const menuItemClassName =
41
+ "relative flex cursor-default items-center gap-2 rounded-[var(--radius-md)] border border-transparent px-3 py-2.5 text-sm text-popover-foreground outline-hidden select-none transition-[background-color,border-color,color,box-shadow] data-[highlighted]:border-[color:color-mix(in_oklch,var(--primary),transparent_72%)] data-[highlighted]:bg-[color:color-mix(in_oklch,var(--primary),transparent_92%)] data-[highlighted]:text-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:data-[highlighted]:border-[color:color-mix(in_oklch,var(--destructive),transparent_70%)] data-[variant=destructive]:data-[highlighted]:bg-[color:color-mix(in_oklch,var(--destructive),transparent_90%)] data-[variant=destructive]:data-[highlighted]:text-destructive data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
35
42
 
36
43
  function DropdownMenu({ ...props }: MenuPrimitive.Root.Props) {
37
44
  return <MenuPrimitive.Root data-slot="dropdown-menu" {...props} />
@@ -42,6 +49,11 @@ function DropdownMenuPortal({ ...props }: DropdownMenuPortalProps) {
42
49
  }
43
50
 
44
51
  function DropdownMenuTrigger({ ...props }: DropdownMenuTriggerProps) {
52
+ if (!("render" in props) && React.isValidElement(props.children)) {
53
+ const { children, ...rest } = props
54
+ return <MenuPrimitive.Trigger data-slot="dropdown-menu-trigger" render={children} {...rest} />
55
+ }
56
+
45
57
  return <MenuPrimitive.Trigger data-slot="dropdown-menu-trigger" {...props} />
46
58
  }
47
59
 
@@ -64,7 +76,7 @@ function DropdownMenuContent({
64
76
  >
65
77
  <MenuPrimitive.Popup
66
78
  data-slot="dropdown-menu-content"
67
- className={cn("z-50 max-h-(--available-height) w-(--anchor-width) min-w-48 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-[var(--aui-card-radius,var(--radius-xl))] border border-[color:var(--aui-card-border,var(--border))] bg-[color:var(--aui-overlay-surface,var(--popover))] p-2 text-popover-foreground shadow-[var(--aui-popover-shadow,0_18px_42px_rgba(15,23,42,0.16))] duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95", className)}
79
+ className={cn("z-50 max-h-(--available-height) w-(--anchor-width) min-w-56 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-[var(--aui-card-radius,var(--radius-xl))] border border-[color:var(--aui-card-border,var(--border))] bg-[color:var(--aui-overlay-surface,var(--popover))] p-2 text-popover-foreground shadow-[var(--aui-popover-shadow,0_18px_42px_rgba(15,23,42,0.16))] duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95", className)}
68
80
  {...props}
69
81
  />
70
82
  </MenuPrimitive.Positioner>
@@ -98,21 +110,30 @@ function DropdownMenuItem({
98
110
  className,
99
111
  inset,
100
112
  variant = "default",
113
+ closeOnSelect = true,
114
+ onSelect,
101
115
  ...props
102
116
  }: DropdownMenuItemProps) {
103
- return (
104
- <MenuPrimitive.Item
117
+ return (
118
+ <MenuPrimitive.Item
105
119
  data-slot="dropdown-menu-item"
106
120
  data-inset={inset}
107
121
  data-variant={variant}
108
122
  className={cn(
109
- "group/dropdown-menu-item relative flex cursor-default items-center gap-2 rounded-[var(--radius-md)] border border-transparent px-3 py-2.5 text-sm outline-hidden select-none transition-[background-color,border-color,color,box-shadow] data-inset:pl-8 data-[variant=destructive]:text-destructive data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",
123
+ "group/dropdown-menu-item data-inset:pl-8",
124
+ menuItemClassName,
110
125
  className
111
126
  )}
127
+ onSelect={(event) => {
128
+ if (!closeOnSelect) {
129
+ event.preventDefault()
130
+ }
131
+ onSelect?.(event)
132
+ }}
112
133
  {...props}
113
- />
114
- )
115
- }
134
+ />
135
+ )
136
+ }
116
137
 
117
138
  function DropdownMenuSub({ ...props }: DropdownMenuSubmenuProps) {
118
139
  return <MenuPrimitive.SubmenuRoot data-slot="dropdown-menu-sub" {...props} />
@@ -129,13 +150,14 @@ function DropdownMenuSubTrigger({
129
150
  data-slot="dropdown-menu-sub-trigger"
130
151
  data-inset={inset}
131
152
  className={cn(
132
- "flex cursor-default items-center gap-2 rounded-[var(--radius-md)] border border-transparent px-3 py-2.5 text-sm outline-hidden select-none transition-[background-color,border-color,color,box-shadow] data-inset:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
153
+ "group/dropdown-menu-item data-inset:pl-8",
154
+ menuItemClassName,
133
155
  className
134
156
  )}
135
157
  {...props}
136
158
  >
137
159
  {children}
138
- <ChevronRightIcon className="ml-auto" />
160
+ <ChevronRightIcon className="ml-auto text-muted-foreground group-data-[highlighted]/dropdown-menu-item:text-foreground" />
139
161
  </MenuPrimitive.SubmenuTrigger>
140
162
  )
141
163
  }
@@ -166,19 +188,28 @@ function DropdownMenuCheckboxItem({
166
188
  children,
167
189
  checked,
168
190
  inset,
191
+ closeOnSelect = true,
192
+ onSelect,
169
193
  ...props
170
194
  }: DropdownMenuCheckboxItemProps) {
171
- return (
172
- <MenuPrimitive.CheckboxItem
195
+ return (
196
+ <MenuPrimitive.CheckboxItem
173
197
  data-slot="dropdown-menu-checkbox-item"
174
198
  data-inset={inset}
175
199
  className={cn(
176
- "relative flex cursor-default items-center gap-2 rounded-[var(--radius-md)] border border-transparent py-2.5 pr-9 pl-3 text-sm outline-hidden select-none transition-[background-color,border-color,color,box-shadow] data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
200
+ "group/dropdown-menu-item pr-9 data-inset:pl-8 data-[checked]:bg-muted/70 data-[checked]:font-medium",
201
+ menuItemClassName,
177
202
  className
178
203
  )}
179
- checked={checked}
180
- {...props}
181
- >
204
+ checked={checked}
205
+ onSelect={(event) => {
206
+ if (!closeOnSelect) {
207
+ event.preventDefault()
208
+ }
209
+ onSelect?.(event)
210
+ }}
211
+ {...props}
212
+ >
182
213
  <span
183
214
  className="pointer-events-none absolute right-2 flex items-center justify-center"
184
215
  data-slot="dropdown-menu-checkbox-item-indicator"
@@ -206,18 +237,27 @@ function DropdownMenuRadioItem({
206
237
  className,
207
238
  children,
208
239
  inset,
240
+ closeOnSelect = true,
241
+ onSelect,
209
242
  ...props
210
243
  }: DropdownMenuRadioItemProps) {
211
- return (
212
- <MenuPrimitive.RadioItem
244
+ return (
245
+ <MenuPrimitive.RadioItem
213
246
  data-slot="dropdown-menu-radio-item"
214
247
  data-inset={inset}
215
248
  className={cn(
216
- "relative flex cursor-default items-center gap-2 rounded-[var(--radius-md)] border border-transparent py-2.5 pr-9 pl-3 text-sm outline-hidden select-none transition-[background-color,border-color,color,box-shadow] data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
249
+ "group/dropdown-menu-item pr-9 data-inset:pl-8 data-[checked]:bg-muted/70 data-[checked]:font-medium",
250
+ menuItemClassName,
217
251
  className
218
252
  )}
219
- {...props}
220
- >
253
+ onSelect={(event) => {
254
+ if (!closeOnSelect) {
255
+ event.preventDefault()
256
+ }
257
+ onSelect?.(event)
258
+ }}
259
+ {...props}
260
+ >
221
261
  <span
222
262
  className="pointer-events-none absolute right-2 flex items-center justify-center"
223
263
  data-slot="dropdown-menu-radio-item-indicator"
@@ -252,14 +292,27 @@ function DropdownMenuShortcut({
252
292
  return (
253
293
  <span
254
294
  data-slot="dropdown-menu-shortcut"
255
- className={cn(
256
- "ml-auto text-[11px] tracking-[0.14em] text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground",
295
+ className={cn(
296
+ "ml-auto rounded bg-muted/70 px-1.5 py-0.5 text-[11px] font-medium tracking-[0.08em] text-muted-foreground group-data-[highlighted]/dropdown-menu-item:text-foreground",
257
297
  className
258
298
  )}
259
299
  {...props}
260
300
  />
261
- )
262
- }
301
+ )
302
+ }
303
+
304
+ function DropdownMenuItemDescription({
305
+ className,
306
+ ...props
307
+ }: DropdownMenuItemDescriptionProps) {
308
+ return (
309
+ <span
310
+ data-slot="dropdown-menu-item-description"
311
+ className={cn("block text-xs leading-5 text-muted-foreground group-data-[highlighted]/dropdown-menu-item:text-foreground/70", className)}
312
+ {...props}
313
+ />
314
+ )
315
+ }
263
316
 
264
317
  export {
265
318
  DropdownMenu,
@@ -271,10 +324,11 @@ export {
271
324
  DropdownMenuItem,
272
325
  DropdownMenuCheckboxItem,
273
326
  DropdownMenuRadioGroup,
274
- DropdownMenuRadioItem,
275
- DropdownMenuSeparator,
276
- DropdownMenuShortcut,
277
- DropdownMenuSub,
327
+ DropdownMenuRadioItem,
328
+ DropdownMenuSeparator,
329
+ DropdownMenuShortcut,
330
+ DropdownMenuItemDescription,
331
+ DropdownMenuSub,
278
332
  DropdownMenuSubTrigger,
279
333
  DropdownMenuSubContent,
280
334
  }
@@ -39,6 +39,7 @@ export type InputTextProps = Omit<InputPrimitiveProps, "value"> & {
39
39
  kind?: "text"
40
40
  value?: string | number | readonly string[] | null
41
41
  onValueChange?: (value: string) => void
42
+ onDebouncedValueChange?: (value: string) => void
42
43
  leading?: React.ReactNode
43
44
  trailing?: React.ReactNode
44
45
  trailingAction?: React.ReactNode
@@ -57,6 +58,13 @@ export type InputTextProps = Omit<InputPrimitiveProps, "value"> & {
57
58
  helperClassName?: string
58
59
  leadingPointerEvents?: boolean
59
60
  trailingPointerEvents?: boolean
61
+ searchIcon?: React.ReactNode
62
+ loading?: boolean
63
+ loadingLabel?: string
64
+ resultCount?: number
65
+ shortcut?: React.ReactNode
66
+ debounceMs?: number
67
+ showMetaOnClear?: boolean
60
68
  }
61
69
 
62
70
  export type InputClearableProps = Omit<ClearableInputProps, "kind"> & {
@@ -121,6 +129,20 @@ function getInputTextLength(value: InputTextProps["value"] | InputTextProps["def
121
129
  return 0
122
130
  }
123
131
 
132
+ function shouldRenderSearchInput(props: InputTextProps) {
133
+ return (
134
+ props.type === "search" ||
135
+ props.searchIcon !== undefined ||
136
+ props.loading !== undefined ||
137
+ props.loadingLabel !== undefined ||
138
+ props.resultCount !== undefined ||
139
+ props.shortcut !== undefined ||
140
+ props.debounceMs !== undefined ||
141
+ props.showMetaOnClear !== undefined ||
142
+ props.onDebouncedValueChange !== undefined
143
+ )
144
+ }
145
+
124
146
  const Input = React.forwardRef<HTMLInputElement | HTMLDivElement, InputProps>((props, ref) => {
125
147
  const kind = props.kind ?? "text"
126
148
 
@@ -210,6 +232,82 @@ const Input = React.forwardRef<HTMLInputElement | HTMLDivElement, InputProps>((p
210
232
  }
211
233
 
212
234
  const inputProps = props as Omit<InputTextProps, "kind">
235
+
236
+ if (shouldRenderSearchInput(inputProps)) {
237
+ const {
238
+ leading,
239
+ searchIcon,
240
+ helperText,
241
+ errorText,
242
+ showCharacterCount,
243
+ countFormatter,
244
+ helperClassName,
245
+ inputClassName,
246
+ ...searchInputProps
247
+ } = inputProps
248
+ const searchValue: SearchInputProps["value"] = Array.isArray(inputProps.value)
249
+ ? inputProps.value.join(" ")
250
+ : inputProps.value == null || typeof inputProps.value === "string" || typeof inputProps.value === "number"
251
+ ? inputProps.value
252
+ : String(inputProps.value)
253
+ const searchDefaultValue: SearchInputProps["defaultValue"] = Array.isArray(inputProps.defaultValue)
254
+ ? inputProps.defaultValue.join(" ")
255
+ : inputProps.defaultValue == null ||
256
+ typeof inputProps.defaultValue === "string" ||
257
+ typeof inputProps.defaultValue === "number"
258
+ ? inputProps.defaultValue
259
+ : String(inputProps.defaultValue)
260
+
261
+ const searchInput = (
262
+ <SearchInput
263
+ ref={ref as React.ForwardedRef<HTMLInputElement>}
264
+ searchIcon={searchIcon ?? leading}
265
+ inputClassName={inputClassName}
266
+ {...searchInputProps}
267
+ value={searchValue}
268
+ defaultValue={searchDefaultValue}
269
+ />
270
+ )
271
+
272
+ if (!helperText && !errorText && !showCharacterCount) {
273
+ return searchInput
274
+ }
275
+
276
+ const currentLength = getInputTextLength(inputProps.value ?? inputProps.defaultValue)
277
+
278
+ return (
279
+ <div data-slot="input-field" className="grid gap-1.5">
280
+ {searchInput}
281
+ <div data-slot="input-meta" className="flex items-start justify-between gap-3 px-1">
282
+ <div
283
+ data-slot="input-helper"
284
+ className={cn(
285
+ "min-w-0 text-xs leading-5",
286
+ errorText ? "text-destructive" : "text-muted-foreground",
287
+ helperClassName
288
+ )}
289
+ >
290
+ {errorText ?? helperText}
291
+ </div>
292
+ {showCharacterCount ? (
293
+ <div
294
+ data-slot="input-count"
295
+ className={cn(
296
+ "shrink-0 text-[11px] font-medium tabular-nums",
297
+ errorText ? "text-destructive" : "text-muted-foreground"
298
+ )}
299
+ >
300
+ {countFormatter?.(currentLength, inputProps.maxLength) ??
301
+ (typeof inputProps.maxLength === "number"
302
+ ? `${currentLength}/${inputProps.maxLength}`
303
+ : currentLength)}
304
+ </div>
305
+ ) : null}
306
+ </div>
307
+ </div>
308
+ )
309
+ }
310
+
213
311
  const {
214
312
  value,
215
313
  defaultValue,