tembro 2.0.5 → 2.1.0

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 (381) hide show
  1. package/dist/components/calendar/calendar.cjs +1 -1
  2. package/dist/components/calendar/calendar.d.ts +2 -1
  3. package/dist/components/calendar/calendar.js +126 -122
  4. package/dist/components/calendar/date-range-picker.cjs +1 -1
  5. package/dist/components/calendar/date-range-picker.d.ts +2 -1
  6. package/dist/components/calendar/date-range-picker.js +39 -39
  7. package/dist/components/charts/charts.cjs +1 -1
  8. package/dist/components/charts/charts.d.ts +13 -4
  9. package/dist/components/charts/charts.js +76 -46
  10. package/dist/components/charts/progress-ring.cjs +1 -1
  11. package/dist/components/charts/progress-ring.d.ts +3 -1
  12. package/dist/components/charts/progress-ring.js +11 -10
  13. package/dist/components/data-table/data-table-column-visibility-menu.cjs +1 -1
  14. package/dist/components/data-table/data-table-column-visibility-menu.d.ts +4 -1
  15. package/dist/components/data-table/data-table-column-visibility-menu.js +36 -8
  16. package/dist/components/data-table/data-table-pagination.cjs +1 -1
  17. package/dist/components/data-table/data-table-pagination.js +4 -4
  18. package/dist/components/data-table/data-table-toolbar.cjs +1 -1
  19. package/dist/components/data-table/data-table-toolbar.js +12 -13
  20. package/dist/components/data-table/data-table.cjs +1 -1
  21. package/dist/components/data-table/data-table.d.ts +2 -2
  22. package/dist/components/data-table/data-table.js +2 -1
  23. package/dist/components/display/carousel.cjs +1 -1
  24. package/dist/components/display/carousel.d.ts +15 -1
  25. package/dist/components/display/carousel.js +128 -86
  26. package/dist/components/display/code-block.cjs +2 -2
  27. package/dist/components/display/code-block.d.ts +2 -1
  28. package/dist/components/display/code-block.js +17 -12
  29. package/dist/components/display/delta-badge.cjs +1 -1
  30. package/dist/components/display/delta-badge.d.ts +2 -1
  31. package/dist/components/display/delta-badge.js +11 -7
  32. package/dist/components/display/kanban.cjs +1 -1
  33. package/dist/components/display/kanban.d.ts +4 -1
  34. package/dist/components/display/kanban.js +60 -33
  35. package/dist/components/display/metric-grid.cjs +1 -1
  36. package/dist/components/display/metric-grid.d.ts +1 -0
  37. package/dist/components/display/metric-grid.js +1 -1
  38. package/dist/components/display/qr-code.cjs +1 -1
  39. package/dist/components/display/qr-code.d.ts +2 -1
  40. package/dist/components/display/qr-code.js +19 -16
  41. package/dist/components/display/smart-card.d.ts +1 -1
  42. package/dist/components/display/status-legend.d.ts +1 -1
  43. package/dist/components/display/tag.cjs +1 -1
  44. package/dist/components/display/tag.d.ts +2 -1
  45. package/dist/components/display/tag.js +28 -22
  46. package/dist/components/display/tree-view.cjs +1 -1
  47. package/dist/components/display/tree-view.d.ts +9 -1
  48. package/dist/components/display/tree-view.js +104 -40
  49. package/dist/components/display/trend-card.cjs +1 -1
  50. package/dist/components/display/trend-card.js +27 -41
  51. package/dist/components/feedback/alert.cjs +1 -1
  52. package/dist/components/feedback/alert.d.ts +2 -1
  53. package/dist/components/feedback/alert.js +6 -6
  54. package/dist/components/feedback/loading-state.cjs +1 -1
  55. package/dist/components/feedback/loading-state.d.ts +3 -1
  56. package/dist/components/feedback/loading-state.js +23 -10
  57. package/dist/components/feedback/page-state.cjs +1 -1
  58. package/dist/components/feedback/page-state.d.ts +2 -1
  59. package/dist/components/feedback/page-state.js +7 -4
  60. package/dist/components/form/form-field-shell.cjs +1 -1
  61. package/dist/components/form/form-field-shell.d.ts +4 -2
  62. package/dist/components/form/form-field-shell.js +57 -41
  63. package/dist/components/form/form-input.cjs +1 -1
  64. package/dist/components/form/form-input.d.ts +3 -4
  65. package/dist/components/form/form-input.js +259 -257
  66. package/dist/components/form/form-select.cjs +1 -1
  67. package/dist/components/form/form-select.d.ts +2 -2
  68. package/dist/components/form/form-select.js +8 -6
  69. package/dist/components/form/form-switch.cjs +1 -1
  70. package/dist/components/form/form-switch.d.ts +1 -1
  71. package/dist/components/form/form-switch.js +58 -54
  72. package/dist/components/form/form-textarea.cjs +1 -1
  73. package/dist/components/form/form-textarea.d.ts +1 -1
  74. package/dist/components/form/form-textarea.js +29 -27
  75. package/dist/components/inputs/async-select.d.ts +3 -0
  76. package/dist/components/inputs/search-input.d.ts +3 -0
  77. package/dist/components/inputs/simple-select.cjs +1 -1
  78. package/dist/components/inputs/simple-select.d.ts +10 -32
  79. package/dist/components/inputs/simple-select.js +5 -101
  80. package/dist/components/layout/app-sidebar.cjs +1 -1
  81. package/dist/components/layout/app-sidebar.d.ts +1 -0
  82. package/dist/components/layout/app-sidebar.js +36 -36
  83. package/dist/components/layout/breadcrumbs.cjs +1 -1
  84. package/dist/components/layout/breadcrumbs.d.ts +2 -1
  85. package/dist/components/layout/breadcrumbs.js +7 -7
  86. package/dist/components/modern/calendar-scheduler.cjs +1 -1
  87. package/dist/components/modern/calendar-scheduler.d.ts +5 -1
  88. package/dist/components/modern/calendar-scheduler.js +47 -28
  89. package/dist/components/modern/dual-list-picker.cjs +1 -1
  90. package/dist/components/modern/dual-list-picker.d.ts +5 -1
  91. package/dist/components/modern/dual-list-picker.js +81 -23
  92. package/dist/components/modern/rich-text-editor.cjs +1 -1
  93. package/dist/components/modern/rich-text-editor.d.ts +3 -1
  94. package/dist/components/modern/rich-text-editor.js +12 -9
  95. package/dist/components/modern/tour.cjs +1 -1
  96. package/dist/components/modern/tour.d.ts +5 -1
  97. package/dist/components/modern/tour.js +57 -35
  98. package/dist/components/navigation/command-bar.cjs +1 -1
  99. package/dist/components/navigation/command-bar.d.ts +3 -1
  100. package/dist/components/navigation/command-bar.js +10 -7
  101. package/dist/components/navigation/demo.cjs +1 -1
  102. package/dist/components/navigation/demo.js +0 -1
  103. package/dist/components/navigation/nav-tabs.cjs +1 -1
  104. package/dist/components/navigation/nav-tabs.js +39 -27
  105. package/dist/components/navigation/page-tabs.cjs +1 -1
  106. package/dist/components/navigation/page-tabs.js +41 -30
  107. package/dist/components/navigation/pagination.cjs +1 -1
  108. package/dist/components/navigation/pagination.d.ts +7 -1
  109. package/dist/components/navigation/pagination.js +48 -25
  110. package/dist/components/notifications/notification-center.cjs +1 -1
  111. package/dist/components/notifications/notification-center.d.ts +3 -1
  112. package/dist/components/notifications/notification-center.js +56 -38
  113. package/dist/components/notifications/toast.cjs +1 -1
  114. package/dist/components/notifications/toast.d.ts +1 -0
  115. package/dist/components/notifications/toast.js +4 -0
  116. package/dist/components/overlay/alert-dialog.cjs +1 -1
  117. package/dist/components/overlay/alert-dialog.js +1 -1
  118. package/dist/components/overlay/confirm-dialog.cjs +1 -1
  119. package/dist/components/overlay/confirm-dialog.d.ts +4 -2
  120. package/dist/components/overlay/confirm-dialog.js +31 -22
  121. package/dist/components/overlay/drawer.cjs +1 -1
  122. package/dist/components/overlay/drawer.d.ts +3 -1
  123. package/dist/components/overlay/drawer.js +24 -16
  124. package/dist/components/ui/accordion/index.d.ts +4 -0
  125. package/dist/components/ui/badge/index.cjs +1 -1
  126. package/dist/components/ui/badge/index.d.ts +1 -1
  127. package/dist/components/ui/badge/index.js +2 -1
  128. package/dist/components/ui/button/index.cjs +1 -1
  129. package/dist/components/ui/button/index.d.ts +2 -1
  130. package/dist/components/ui/button/index.js +13 -10
  131. package/dist/components/ui/card/index.cjs +1 -1
  132. package/dist/components/ui/card/index.d.ts +13 -2
  133. package/dist/components/ui/card/index.js +74 -49
  134. package/dist/components/ui/dialog/index.cjs +1 -1
  135. package/dist/components/ui/dialog/index.js +2 -1
  136. package/dist/components/ui/hover-card.cjs +1 -1
  137. package/dist/components/ui/hover-card.d.ts +11 -3
  138. package/dist/components/ui/hover-card.js +29 -24
  139. package/dist/components/ui/input/index.cjs +1 -1
  140. package/dist/components/ui/input/index.d.ts +9 -1
  141. package/dist/components/ui/input/index.js +63 -30
  142. package/dist/components/ui/popover/index.cjs +1 -1
  143. package/dist/components/ui/popover/index.d.ts +2 -2
  144. package/dist/components/ui/popover/index.js +6 -5
  145. package/dist/components/ui/radio-group/index.cjs +1 -1
  146. package/dist/components/ui/radio-group/index.d.ts +5 -1
  147. package/dist/components/ui/radio-group/index.js +50 -16
  148. package/dist/components/ui/right-click-menu/index.cjs +1 -1
  149. package/dist/components/ui/right-click-menu/index.d.ts +5 -1
  150. package/dist/components/ui/right-click-menu/index.js +77 -23
  151. package/dist/components/ui/segmented-control/index.cjs +1 -1
  152. package/dist/components/ui/segmented-control/index.d.ts +2 -1
  153. package/dist/components/ui/segmented-control/index.js +23 -11
  154. package/dist/components/ui/select/index.cjs +1 -1
  155. package/dist/components/ui/select/index.d.ts +40 -1
  156. package/dist/components/ui/select/index.js +159 -48
  157. package/dist/components/ui/switch/index.cjs +1 -1
  158. package/dist/components/ui/switch/index.d.ts +18 -0
  159. package/dist/components/ui/switch/index.js +47 -17
  160. package/dist/components/ui/tabs/index.cjs +1 -1
  161. package/dist/components/ui/tabs/index.d.ts +14 -4
  162. package/dist/components/ui/tabs/index.js +11 -8
  163. package/dist/components/ui/textarea/index.cjs +1 -1
  164. package/dist/components/ui/textarea/index.d.ts +10 -2
  165. package/dist/components/ui/textarea/index.js +37 -8
  166. package/dist/components/ui/textarea.cjs +1 -0
  167. package/dist/components/ui/textarea.d.ts +1 -0
  168. package/dist/components/ui/textarea.js +2 -0
  169. package/dist/components/ui/tooltip/index.cjs +1 -1
  170. package/dist/components/ui/tooltip/index.d.ts +11 -3
  171. package/dist/components/ui/tooltip/index.js +41 -20
  172. package/dist/components/upload/file-upload.cjs +1 -1
  173. package/dist/components/upload/file-upload.d.ts +8 -1
  174. package/dist/components/upload/file-upload.js +132 -100
  175. package/dist/components/upload/image-upload.cjs +1 -1
  176. package/dist/components/upload/image-upload.d.ts +5 -1
  177. package/dist/components/upload/image-upload.js +34 -9
  178. package/dist/index.cjs +1 -1
  179. package/dist/index.js +31 -31
  180. package/dist/public-component-surface.cjs +1 -1
  181. package/dist/public-component-surface.js +15 -0
  182. package/dist/showcase/component-api-schema.cjs +1 -1
  183. package/dist/showcase/component-api-schema.js +187 -10
  184. package/dist/showcase/create-demo.cjs +5 -4
  185. package/dist/showcase/create-demo.js +2 -2
  186. package/dist/showcase/fallback.cjs +3 -3
  187. package/dist/showcase/fallback.js +221 -243
  188. package/dist/showcase/premium/alert/showcase.cjs +1 -1
  189. package/dist/showcase/premium/alert/showcase.js +1 -0
  190. package/dist/showcase/premium/app-sidebar/showcase.cjs +1 -1
  191. package/dist/showcase/premium/app-sidebar/showcase.js +1 -0
  192. package/dist/showcase/premium/badge/showcase.cjs +1 -1
  193. package/dist/showcase/premium/badge/showcase.js +7 -0
  194. package/dist/showcase/premium/badge/types.d.ts +1 -1
  195. package/dist/showcase/premium/breadcrumbs/showcase.cjs +1 -1
  196. package/dist/showcase/premium/breadcrumbs/showcase.js +12 -1
  197. package/dist/showcase/premium/button/mock.cjs +1 -4
  198. package/dist/showcase/premium/button/mock.js +1 -1
  199. package/dist/showcase/premium/button/showcase.cjs +1 -1
  200. package/dist/showcase/premium/button/showcase.js +2 -2
  201. package/dist/showcase/premium/card/showcase.cjs +1 -1
  202. package/dist/showcase/premium/card/showcase.js +96 -47
  203. package/dist/showcase/premium/carousel/showcase.cjs +1 -1
  204. package/dist/showcase/premium/carousel/showcase.js +76 -49
  205. package/dist/showcase/premium/command-bar/showcase.cjs +1 -1
  206. package/dist/showcase/premium/command-bar/showcase.js +2 -0
  207. package/dist/showcase/premium/data-table/mock.cjs +12 -11
  208. package/dist/showcase/premium/data-table/mock.js +1 -1
  209. package/dist/showcase/premium/data-table/showcase.cjs +1 -1
  210. package/dist/showcase/premium/data-table/showcase.js +1 -1
  211. package/dist/showcase/premium/data-table-parts/showcase.cjs +1 -1
  212. package/dist/showcase/premium/data-table-parts/showcase.js +3 -1
  213. package/dist/showcase/premium/file-upload/showcase.cjs +1 -1
  214. package/dist/showcase/premium/file-upload/showcase.js +25 -4
  215. package/dist/showcase/premium/image-upload/showcase.cjs +1 -1
  216. package/dist/showcase/premium/image-upload/showcase.js +4 -1
  217. package/dist/showcase/premium/index.cjs +1 -1
  218. package/dist/showcase/premium/index.js +396 -402
  219. package/dist/showcase/premium/loading-state/showcase.cjs +1 -1
  220. package/dist/showcase/premium/loading-state/showcase.js +3 -1
  221. package/dist/showcase/premium/metric-grid/showcase.cjs +1 -1
  222. package/dist/showcase/premium/metric-grid/showcase.js +96 -28
  223. package/dist/showcase/premium/notification-center/showcase.cjs +1 -1
  224. package/dist/showcase/premium/notification-center/showcase.js +7 -3
  225. package/dist/showcase/premium/page-state/showcase.cjs +1 -1
  226. package/dist/showcase/premium/page-state/showcase.js +5 -1
  227. package/dist/showcase/premium/pagination/showcase.cjs +1 -1
  228. package/dist/showcase/premium/pagination/showcase.js +15 -2
  229. package/dist/showcase/premium/popover/showcase.cjs +1 -1
  230. package/dist/showcase/premium/popover/showcase.js +85 -50
  231. package/dist/showcase/premium/radio-group/showcase.cjs +1 -1
  232. package/dist/showcase/premium/radio-group/showcase.js +27 -4
  233. package/dist/showcase/premium/right-click-menu/showcase.cjs +1 -1
  234. package/dist/showcase/premium/right-click-menu/showcase.js +56 -43
  235. package/dist/showcase/premium/segmented-control/showcase.cjs +1 -1
  236. package/dist/showcase/premium/segmented-control/showcase.js +1 -0
  237. package/dist/showcase/premium/select/data.cjs +1 -1
  238. package/dist/showcase/premium/select/data.js +69 -34
  239. package/dist/showcase/premium/select/mock.cjs +20 -8
  240. package/dist/showcase/premium/select/mock.js +3 -2
  241. package/dist/showcase/premium/select/showcase.cjs +1 -1
  242. package/dist/showcase/premium/select/showcase.js +101 -86
  243. package/dist/showcase/premium/select/types.d.ts +3 -0
  244. package/dist/showcase/premium/statistic/showcase.cjs +1 -1
  245. package/dist/showcase/premium/statistic/showcase.js +57 -25
  246. package/dist/showcase/premium/switch/showcase.cjs +1 -1
  247. package/dist/showcase/premium/switch/showcase.js +25 -14
  248. package/dist/showcase/premium/tabs/showcase.cjs +1 -1
  249. package/dist/showcase/premium/tabs/showcase.js +171 -48
  250. package/dist/showcase/premium/textarea/mock.cjs +12 -4
  251. package/dist/showcase/premium/textarea/mock.js +1 -1
  252. package/dist/showcase/premium/textarea/showcase.cjs +1 -1
  253. package/dist/showcase/premium/textarea/showcase.js +8 -3
  254. package/dist/showcase/premium/toast/showcase.cjs +1 -1
  255. package/dist/showcase/premium/toast/showcase.js +32 -6
  256. package/dist/showcase/premium/types.d.ts +1 -1
  257. package/dist/showcase/registry-quality.cjs +1 -1
  258. package/dist/showcase/registry-quality.js +1 -0
  259. package/dist/showcase/registry-specific.cjs +1 -1
  260. package/dist/showcase/registry-specific.js +78 -74
  261. package/dist/showcase/render-registry-preview.cjs +1 -1
  262. package/dist/showcase/render-registry-preview.js +90 -108
  263. package/dist/showcase/site-data.cjs +1 -1
  264. package/dist/showcase/site-data.js +60 -21
  265. package/dist/showcase/tembro-registry.json.cjs +1 -1
  266. package/dist/showcase/tembro-registry.json.js +34 -20
  267. package/dist/showcase/types.d.ts +1 -1
  268. package/package.json +1 -1
  269. package/packages/cli/dist/index.cjs +31 -31
  270. package/packages/cli/vendor/src/components/calendar/calendar.tsx +59 -50
  271. package/packages/cli/vendor/src/components/calendar/date-range-picker.tsx +7 -4
  272. package/packages/cli/vendor/src/components/charts/charts.tsx +109 -66
  273. package/packages/cli/vendor/src/components/charts/progress-ring.tsx +37 -26
  274. package/packages/cli/vendor/src/components/data-table/data-table-column-visibility-menu.tsx +41 -22
  275. package/packages/cli/vendor/src/components/data-table/data-table-pagination.tsx +7 -7
  276. package/packages/cli/vendor/src/components/data-table/data-table-toolbar.tsx +8 -6
  277. package/packages/cli/vendor/src/components/data-table/data-table.tsx +21 -20
  278. package/packages/cli/vendor/src/components/display/carousel.tsx +102 -9
  279. package/packages/cli/vendor/src/components/display/code-block.tsx +22 -2
  280. package/packages/cli/vendor/src/components/display/delta-badge.tsx +11 -11
  281. package/packages/cli/vendor/src/components/display/kanban.tsx +103 -57
  282. package/packages/cli/vendor/src/components/display/metric-grid.tsx +16 -13
  283. package/packages/cli/vendor/src/components/display/qr-code.tsx +17 -15
  284. package/packages/cli/vendor/src/components/display/smart-card.tsx +1 -1
  285. package/packages/cli/vendor/src/components/display/status-legend.tsx +1 -1
  286. package/packages/cli/vendor/src/components/display/tag.tsx +39 -21
  287. package/packages/cli/vendor/src/components/display/tree-view.tsx +221 -84
  288. package/packages/cli/vendor/src/components/display/trend-card.tsx +6 -40
  289. package/packages/cli/vendor/src/components/feedback/alert.tsx +3 -1
  290. package/packages/cli/vendor/src/components/feedback/loading-state.tsx +33 -17
  291. package/packages/cli/vendor/src/components/feedback/page-state.tsx +8 -7
  292. package/packages/cli/vendor/src/components/form/form-field-shell.tsx +37 -8
  293. package/packages/cli/vendor/src/components/form/form-input.tsx +11 -12
  294. package/packages/cli/vendor/src/components/form/form-select.tsx +6 -4
  295. package/packages/cli/vendor/src/components/form/form-switch.tsx +9 -3
  296. package/packages/cli/vendor/src/components/form/form-textarea.tsx +6 -2
  297. package/packages/cli/vendor/src/components/inputs/async-select.tsx +11 -8
  298. package/packages/cli/vendor/src/components/inputs/search-input.tsx +5 -2
  299. package/packages/cli/vendor/src/components/inputs/simple-select.tsx +20 -190
  300. package/packages/cli/vendor/src/components/layout/app-sidebar.tsx +3 -1
  301. package/packages/cli/vendor/src/components/layout/breadcrumbs.tsx +3 -1
  302. package/packages/cli/vendor/src/components/modern/calendar-scheduler.tsx +28 -13
  303. package/packages/cli/vendor/src/components/modern/dual-list-picker.tsx +103 -35
  304. package/packages/cli/vendor/src/components/modern/rich-text-editor.tsx +25 -22
  305. package/packages/cli/vendor/src/components/modern/tour.tsx +47 -29
  306. package/packages/cli/vendor/src/components/navigation/command-bar.tsx +6 -0
  307. package/packages/cli/vendor/src/components/navigation/demo.tsx +0 -1
  308. package/packages/cli/vendor/src/components/navigation/nav-tabs.tsx +38 -29
  309. package/packages/cli/vendor/src/components/navigation/page-tabs.tsx +35 -23
  310. package/packages/cli/vendor/src/components/navigation/pagination.tsx +65 -31
  311. package/packages/cli/vendor/src/components/notifications/notification-center.tsx +64 -39
  312. package/packages/cli/vendor/src/components/notifications/toast.tsx +23 -21
  313. package/packages/cli/vendor/src/components/overlay/alert-dialog.tsx +1 -1
  314. package/packages/cli/vendor/src/components/overlay/confirm-dialog.tsx +45 -22
  315. package/packages/cli/vendor/src/components/overlay/drawer.tsx +18 -5
  316. package/packages/cli/vendor/src/components/ui/accordion/index.tsx +4 -0
  317. package/packages/cli/vendor/src/components/ui/badge/index.tsx +2 -1
  318. package/packages/cli/vendor/src/components/ui/button/index.tsx +11 -5
  319. package/packages/cli/vendor/src/components/ui/card/index.tsx +95 -25
  320. package/packages/cli/vendor/src/components/ui/dialog/index.tsx +2 -1
  321. package/packages/cli/vendor/src/components/ui/hover-card.tsx +54 -28
  322. package/packages/cli/vendor/src/components/ui/input/index.tsx +98 -0
  323. package/packages/cli/vendor/src/components/ui/popover/index.tsx +10 -8
  324. package/packages/cli/vendor/src/components/ui/radio-group/index.tsx +55 -6
  325. package/packages/cli/vendor/src/components/ui/right-click-menu/index.tsx +120 -9
  326. package/packages/cli/vendor/src/components/ui/segmented-control/index.tsx +29 -3
  327. package/packages/cli/vendor/src/components/ui/select/index.tsx +260 -34
  328. package/packages/cli/vendor/src/components/ui/switch/index.tsx +71 -6
  329. package/packages/cli/vendor/src/components/ui/tabs/index.tsx +22 -6
  330. package/packages/cli/vendor/src/components/ui/textarea/index.tsx +105 -15
  331. package/packages/cli/vendor/src/components/ui/textarea.tsx +2 -0
  332. package/packages/cli/vendor/src/components/ui/tooltip/index.tsx +67 -22
  333. package/packages/cli/vendor/src/components/upload/file-upload.tsx +120 -57
  334. package/packages/cli/vendor/src/components/upload/image-upload.tsx +71 -24
  335. package/packages/cli/vendor/src/public-component-surface.ts +3 -0
  336. package/packages/cli/vendor/src/showcase/component-api-schema.ts +79 -41
  337. package/packages/cli/vendor/src/showcase/create-demo.tsx +16 -15
  338. package/packages/cli/vendor/src/showcase/fallback.tsx +4 -19
  339. package/packages/cli/vendor/src/showcase/premium/alert/showcase.tsx +1 -0
  340. package/packages/cli/vendor/src/showcase/premium/app-sidebar/showcase.tsx +1 -0
  341. package/packages/cli/vendor/src/showcase/premium/badge/showcase.tsx +4 -2
  342. package/packages/cli/vendor/src/showcase/premium/badge/types.ts +1 -1
  343. package/packages/cli/vendor/src/showcase/premium/breadcrumbs/showcase.tsx +3 -1
  344. package/packages/cli/vendor/src/showcase/premium/button/mock.ts +2 -5
  345. package/packages/cli/vendor/src/showcase/premium/button/showcase.tsx +2 -2
  346. package/packages/cli/vendor/src/showcase/premium/card/showcase.tsx +26 -1
  347. package/packages/cli/vendor/src/showcase/premium/carousel/showcase.tsx +19 -3
  348. package/packages/cli/vendor/src/showcase/premium/command-bar/showcase.tsx +1 -1
  349. package/packages/cli/vendor/src/showcase/premium/data-table/mock.ts +26 -25
  350. package/packages/cli/vendor/src/showcase/premium/data-table/showcase.tsx +3 -3
  351. package/packages/cli/vendor/src/showcase/premium/data-table-parts/showcase.tsx +3 -3
  352. package/packages/cli/vendor/src/showcase/premium/file-upload/showcase.tsx +21 -1
  353. package/packages/cli/vendor/src/showcase/premium/image-upload/showcase.tsx +4 -1
  354. package/packages/cli/vendor/src/showcase/premium/index.ts +0 -2
  355. package/packages/cli/vendor/src/showcase/premium/loading-state/showcase.tsx +1 -1
  356. package/packages/cli/vendor/src/showcase/premium/metric-grid/showcase.tsx +36 -4
  357. package/packages/cli/vendor/src/showcase/premium/notification-center/showcase.tsx +4 -3
  358. package/packages/cli/vendor/src/showcase/premium/page-state/showcase.tsx +1 -0
  359. package/packages/cli/vendor/src/showcase/premium/pagination/showcase.tsx +13 -1
  360. package/packages/cli/vendor/src/showcase/premium/popover/showcase.tsx +27 -11
  361. package/packages/cli/vendor/src/showcase/premium/radio-group/showcase.tsx +13 -1
  362. package/packages/cli/vendor/src/showcase/premium/right-click-menu/showcase.tsx +8 -5
  363. package/packages/cli/vendor/src/showcase/premium/segmented-control/showcase.tsx +1 -0
  364. package/packages/cli/vendor/src/showcase/premium/select/data.ts +12 -3
  365. package/packages/cli/vendor/src/showcase/premium/select/mock.ts +4 -4
  366. package/packages/cli/vendor/src/showcase/premium/select/showcase.tsx +35 -22
  367. package/packages/cli/vendor/src/showcase/premium/select/types.ts +3 -0
  368. package/packages/cli/vendor/src/showcase/premium/statistic/showcase.tsx +10 -1
  369. package/packages/cli/vendor/src/showcase/premium/switch/showcase.tsx +15 -6
  370. package/packages/cli/vendor/src/showcase/premium/tabs/showcase.tsx +48 -1
  371. package/packages/cli/vendor/src/showcase/premium/textarea/mock.ts +12 -4
  372. package/packages/cli/vendor/src/showcase/premium/textarea/showcase.tsx +5 -0
  373. package/packages/cli/vendor/src/showcase/premium/toast/showcase.tsx +17 -1
  374. package/packages/cli/vendor/src/showcase/premium/types.ts +1 -1
  375. package/packages/cli/vendor/src/showcase/registry-quality.ts +3 -2
  376. package/packages/cli/vendor/src/showcase/registry-specific.tsx +7 -8
  377. package/packages/cli/vendor/src/showcase/render-registry-preview.tsx +5 -21
  378. package/packages/cli/vendor/src/showcase/site-data.tsx +21 -15
  379. package/packages/cli/vendor/src/showcase/tembro-registry.json +42 -20
  380. package/packages/cli/vendor/src/showcase/types.ts +1 -1
  381. package/registry.json +18 -6
@@ -4,51 +4,162 @@ import { cn } from "@/lib/utils"
4
4
 
5
5
  export type RightClickMenuItem = {
6
6
  label: React.ReactNode
7
+ icon?: React.ReactNode
8
+ shortcut?: React.ReactNode
7
9
  onSelect?: () => void
8
10
  disabled?: boolean
11
+ variant?: "default" | "destructive"
9
12
  }
10
13
 
11
14
  export type RightClickMenuProps = React.ComponentProps<"div"> & {
12
15
  items: RightClickMenuItem[]
16
+ label?: string
13
17
  }
14
18
 
15
- function RightClickMenu({ items, children, className, ...props }: RightClickMenuProps) {
19
+ function getClampedPoint(x: number, y: number, width = 224, height: number) {
20
+ if (typeof window === "undefined") {
21
+ return { x, y }
22
+ }
23
+
24
+ const padding = 8
25
+ return {
26
+ x: Math.min(Math.max(padding, x), Math.max(padding, window.innerWidth - width - padding)),
27
+ y: Math.min(Math.max(padding, y), Math.max(padding, window.innerHeight - height - padding)),
28
+ }
29
+ }
30
+
31
+ function RightClickMenu({
32
+ items,
33
+ children,
34
+ className,
35
+ label = "Context menu",
36
+ ...props
37
+ }: RightClickMenuProps) {
16
38
  const [open, setOpen] = React.useState(false)
17
39
  const [point, setPoint] = React.useState({ x: 0, y: 0 })
40
+ const [activeIndex, setActiveIndex] = React.useState(0)
41
+ const rootRef = React.useRef<HTMLDivElement>(null)
42
+ const itemRefs = React.useRef<Array<HTMLButtonElement | null>>([])
43
+ const enabledItems = React.useMemo(
44
+ () => items.map((item, index) => ({ item, index })).filter(({ item }) => !item.disabled),
45
+ [items]
46
+ )
47
+
48
+ const openAt = React.useCallback(
49
+ (x: number, y: number) => {
50
+ const nextPoint = getClampedPoint(x, y, 224, Math.max(44, items.length * 42 + 12))
51
+ setPoint(nextPoint)
52
+ setActiveIndex(enabledItems[0]?.index ?? 0)
53
+ setOpen(true)
54
+ },
55
+ [enabledItems, items.length]
56
+ )
18
57
 
19
58
  React.useEffect(() => {
20
59
  if (!open) return
21
60
  const close = () => setOpen(false)
22
- window.addEventListener("click", close)
23
- return () => window.removeEventListener("click", close)
61
+ const onKeyDown = (event: KeyboardEvent) => {
62
+ if (event.key === "Escape") {
63
+ setOpen(false)
64
+ }
65
+ }
66
+
67
+ window.addEventListener("pointerdown", close)
68
+ window.addEventListener("resize", close)
69
+ window.addEventListener("scroll", close, true)
70
+ window.addEventListener("keydown", onKeyDown)
71
+ return () => {
72
+ window.removeEventListener("pointerdown", close)
73
+ window.removeEventListener("resize", close)
74
+ window.removeEventListener("scroll", close, true)
75
+ window.removeEventListener("keydown", onKeyDown)
76
+ }
24
77
  }, [open])
25
78
 
79
+ React.useEffect(() => {
80
+ if (!open) return
81
+ itemRefs.current[activeIndex]?.focus()
82
+ }, [activeIndex, open])
83
+
84
+ const focusNext = (direction: 1 | -1) => {
85
+ if (enabledItems.length === 0) return
86
+ const currentEnabledIndex = enabledItems.findIndex(({ index }) => index === activeIndex)
87
+ const nextEnabled =
88
+ enabledItems[(currentEnabledIndex + direction + enabledItems.length) % enabledItems.length]
89
+ setActiveIndex(nextEnabled.index)
90
+ }
91
+
26
92
  return (
27
93
  <div
28
94
  data-slot="right-click-menu"
29
- className={cn("contents", className)}
95
+ ref={rootRef}
96
+ tabIndex={0}
97
+ className={cn("contents focus:outline-none", className)}
30
98
  onContextMenu={(event) => {
31
99
  event.preventDefault()
32
- setPoint({ x: event.clientX, y: event.clientY })
33
- setOpen(true)
100
+ openAt(event.clientX, event.clientY)
101
+ }}
102
+ onKeyDown={(event) => {
103
+ if (event.key === "ContextMenu" || (event.shiftKey && event.key === "F10")) {
104
+ event.preventDefault()
105
+ const rect = rootRef.current?.getBoundingClientRect()
106
+ openAt(rect ? rect.left + 12 : 12, rect ? rect.top + 12 : 12)
107
+ }
34
108
  }}
35
109
  {...props}
36
110
  >
37
111
  {children}
38
112
  {open ? (
39
- <div className="fixed z-50 min-w-40 rounded-xl border border-border bg-popover p-1.5 text-sm text-popover-foreground shadow-xl" style={{ left: point.x, top: point.y }}>
113
+ <div
114
+ data-slot="right-click-menu-content"
115
+ role="menu"
116
+ aria-label={label}
117
+ className="fixed z-50 min-w-56 max-w-[calc(100vw-1rem)] 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-1.5 text-sm text-popover-foreground shadow-[var(--aui-popover-shadow,0_18px_42px_rgba(15,23,42,0.16))] outline-none"
118
+ style={{ left: point.x, top: point.y }}
119
+ onPointerDown={(event) => event.stopPropagation()}
120
+ onKeyDown={(event) => {
121
+ if (event.key === "ArrowDown") {
122
+ event.preventDefault()
123
+ focusNext(1)
124
+ }
125
+ if (event.key === "ArrowUp") {
126
+ event.preventDefault()
127
+ focusNext(-1)
128
+ }
129
+ if (event.key === "Home") {
130
+ event.preventDefault()
131
+ setActiveIndex(enabledItems[0]?.index ?? activeIndex)
132
+ }
133
+ if (event.key === "End") {
134
+ event.preventDefault()
135
+ setActiveIndex(enabledItems.at(-1)?.index ?? activeIndex)
136
+ }
137
+ }}
138
+ >
40
139
  {items.map((item, index) => (
41
140
  <button
42
141
  key={index}
142
+ ref={(node) => {
143
+ itemRefs.current[index] = node
144
+ }}
43
145
  type="button"
146
+ role="menuitem"
44
147
  disabled={item.disabled}
45
- className="block w-full rounded-lg px-3 py-2 text-left hover:bg-accent disabled:pointer-events-none disabled:opacity-50"
148
+ data-variant={item.variant ?? "default"}
149
+ className="group flex min-h-9 w-full items-center gap-2 rounded-[var(--radius-md)] px-2.5 py-2 text-left text-popover-foreground outline-none transition-[background-color,color] hover:bg-accent focus-visible:bg-accent data-[variant=destructive]:text-destructive data-[variant=destructive]:hover:bg-[color:color-mix(in_oklch,var(--destructive),transparent_90%)] data-[variant=destructive]:focus-visible:bg-[color:color-mix(in_oklch,var(--destructive),transparent_90%)] disabled:pointer-events-none disabled:opacity-50 [&_svg]:size-4 [&_svg]:shrink-0"
46
150
  onClick={() => {
151
+ if (item.disabled) return
47
152
  item.onSelect?.()
48
153
  setOpen(false)
49
154
  }}
50
155
  >
51
- {item.label}
156
+ {item.icon}
157
+ <span className="min-w-0 flex-1 truncate">{item.label}</span>
158
+ {item.shortcut ? (
159
+ <span className="ml-3 text-[11px] font-medium tracking-[0.08em] text-muted-foreground group-hover:text-foreground group-focus-visible:text-foreground">
160
+ {item.shortcut}
161
+ </span>
162
+ ) : null}
52
163
  </button>
53
164
  ))}
54
165
  </div>
@@ -16,6 +16,7 @@ export type SegmentedControlProps<TValue extends string = string> = Omit<React.C
16
16
  options: SegmentedControlOption<TValue>[]
17
17
  size?: "sm" | "md" | "lg"
18
18
  fullWidth?: boolean
19
+ equalWidth?: boolean
19
20
  }
20
21
 
21
22
  const sizeClassName = {
@@ -31,17 +32,28 @@ function SegmentedControl<TValue extends string = string>({
31
32
  options,
32
33
  size = "md",
33
34
  fullWidth = false,
35
+ equalWidth = false,
34
36
  className,
35
37
  ...props
36
38
  }: SegmentedControlProps<TValue>) {
37
39
  const [internalValue, setInternalValue] = React.useState<TValue | undefined>(defaultValue ?? options[0]?.value)
38
40
  const currentValue = value ?? internalValue
41
+ const buttonRefs = React.useRef<Array<HTMLButtonElement | null>>([])
39
42
 
40
43
  const selectValue = (nextValue: TValue) => {
41
44
  if (value === undefined) setInternalValue(nextValue)
42
45
  onValueChange?.(nextValue)
43
46
  }
44
47
 
48
+ const moveFocus = (fromIndex: number, direction: 1 | -1) => {
49
+ const enabledOptions = options
50
+ .map((option, index) => ({ option, index }))
51
+ .filter(({ option }) => !option.disabled)
52
+ const enabledIndex = enabledOptions.findIndex(({ index }) => index === fromIndex)
53
+ const next = enabledOptions[(enabledIndex + direction + enabledOptions.length) % enabledOptions.length]
54
+ buttonRefs.current[next?.index ?? fromIndex]?.focus()
55
+ }
56
+
45
57
  return (
46
58
  <div
47
59
  data-slot="segmented-control"
@@ -49,26 +61,40 @@ function SegmentedControl<TValue extends string = string>({
49
61
  className={cn(
50
62
  "inline-flex gap-1 rounded-[var(--radius-2xl)] border border-border/80 bg-muted/72 p-1 text-muted-foreground shadow-[inset_0_1px_0_rgba(255,255,255,0.06),0_10px_26px_rgba(15,23,42,0.05)] backdrop-blur",
51
63
  fullWidth && "flex w-full",
64
+ equalWidth && "grid auto-cols-fr grid-flow-col",
52
65
  className
53
66
  )}
54
67
  {...props}
55
68
  >
56
- {options.map((option) => {
69
+ {options.map((option, optionIndex) => {
57
70
  const selected = option.value === currentValue
58
71
  return (
59
72
  <button
60
73
  key={option.value}
74
+ ref={(node) => {
75
+ buttonRefs.current[optionIndex] = node
76
+ }}
61
77
  type="button"
62
78
  role="radio"
63
79
  aria-checked={selected}
64
80
  disabled={option.disabled}
65
81
  data-selected={selected || undefined}
66
82
  className={cn(
67
- "inline-flex items-center justify-center gap-1.5 rounded-[calc(var(--radius-xl)-2px)] border border-transparent font-medium text-muted-foreground outline-none transition-[background-color,color,border-color,box-shadow,transform] hover:bg-background/58 hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[selected=true]:-translate-y-px data-[selected=true]:border-border/85 data-[selected=true]:bg-background data-[selected=true]:text-foreground data-[selected=true]:shadow-[0_1px_0_rgba(255,255,255,0.24),0_12px_24px_rgba(15,23,42,0.12)]",
83
+ "inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-[calc(var(--radius-xl)-2px)] border border-transparent font-medium text-muted-foreground outline-none transition-[background-color,color,border-color,box-shadow,transform] hover:bg-background/58 hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[selected=true]:-translate-y-px data-[selected=true]:border-border/85 data-[selected=true]:bg-background data-[selected=true]:text-foreground data-[selected=true]:shadow-[0_1px_0_rgba(255,255,255,0.24),0_12px_24px_rgba(15,23,42,0.12)] [&_svg]:size-4 [&_svg]:shrink-0",
68
84
  sizeClassName[size],
69
- fullWidth && "flex-1"
85
+ (fullWidth || equalWidth) && "w-full"
70
86
  )}
71
87
  onClick={() => selectValue(option.value)}
88
+ onKeyDown={(event) => {
89
+ if (event.key === "ArrowRight" || event.key === "ArrowDown") {
90
+ event.preventDefault()
91
+ moveFocus(optionIndex, 1)
92
+ }
93
+ if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
94
+ event.preventDefault()
95
+ moveFocus(optionIndex, -1)
96
+ }
97
+ }}
72
98
  >
73
99
  {option.icon}
74
100
  {option.label}
@@ -2,9 +2,9 @@
2
2
 
3
3
  import * as React from "react"
4
4
  import { Select as SelectPrimitive } from "@base-ui/react/select"
5
+ import { CheckIcon, ChevronDownIcon, ChevronUpIcon, LoaderCircleIcon, SearchIcon, XIcon } from "lucide-react"
5
6
 
6
- import { cn } from "@/lib/utils"
7
- import { ChevronDownIcon, CheckIcon, ChevronUpIcon } from "lucide-react"
7
+ import { cn, stopInteractivePropagation } from "@/lib/utils"
8
8
 
9
9
  export type SelectRootProps = React.ComponentPropsWithoutRef<typeof SelectPrimitive.Root>
10
10
  export type SelectGroupProps = SelectPrimitive.Group.Props
@@ -21,7 +21,249 @@ export type SelectSeparatorProps = SelectPrimitive.Separator.Props
21
21
  export type SelectScrollUpButtonProps = React.ComponentProps<typeof SelectPrimitive.ScrollUpArrow>
22
22
  export type SelectScrollDownButtonProps = React.ComponentProps<typeof SelectPrimitive.ScrollDownArrow>
23
23
 
24
- const Select = SelectPrimitive.Root
24
+ export type SelectOption = {
25
+ label: React.ReactNode
26
+ value: string
27
+ disabled?: boolean
28
+ description?: React.ReactNode
29
+ keywords?: string[]
30
+ }
31
+
32
+ export type SelectOptionGroup = {
33
+ label?: React.ReactNode
34
+ options: SelectOption[]
35
+ }
36
+
37
+ export type SelectProps = Omit<SelectRootProps, "value" | "defaultValue" | "onValueChange"> & {
38
+ value?: string | null
39
+ defaultValue?: string | null
40
+ onValueChange?: (value: string | undefined) => void
41
+ options?: SelectOption[]
42
+ groups?: SelectOptionGroup[]
43
+ placeholder?: string
44
+ searchPlaceholder?: string
45
+ emptyLabel?: React.ReactNode
46
+ emptyMessage?: React.ReactNode
47
+ clearLabel?: string
48
+ size?: "sm" | "default" | "lg"
49
+ clearable?: boolean
50
+ searchable?: boolean
51
+ loading?: boolean
52
+ loadingLabel?: React.ReactNode
53
+ disabled?: boolean
54
+ showSelectedDescription?: boolean
55
+ triggerClassName?: string
56
+ contentClassName?: string
57
+ itemClassName?: string
58
+ searchClassName?: string
59
+ renderOption?: (option: SelectOption, state: { selected: boolean }) => React.ReactNode
60
+ invalid?: boolean
61
+ onSearchChange?: (value: string) => void
62
+ }
63
+
64
+ const SelectRoot = SelectPrimitive.Root
65
+
66
+ function optionMatchesSearch(option: SelectOption, search: string) {
67
+ const normalized = search.trim().toLowerCase()
68
+ if (!normalized) return true
69
+
70
+ const labelText =
71
+ typeof option.label === "string" || typeof option.label === "number"
72
+ ? String(option.label)
73
+ : option.value
74
+ const haystack = [labelText, option.value, ...(option.keywords ?? [])].join(" ").toLowerCase()
75
+ return haystack.includes(normalized)
76
+ }
77
+
78
+ function Select({
79
+ value,
80
+ defaultValue,
81
+ onValueChange,
82
+ options,
83
+ groups,
84
+ placeholder = "Select",
85
+ searchPlaceholder = "Search options...",
86
+ emptyLabel = "No options found",
87
+ emptyMessage,
88
+ clearLabel = "Clear selection",
89
+ size = "default",
90
+ clearable = false,
91
+ searchable = false,
92
+ loading = false,
93
+ loadingLabel = "Loading options...",
94
+ disabled = false,
95
+ showSelectedDescription = true,
96
+ triggerClassName,
97
+ contentClassName,
98
+ itemClassName,
99
+ searchClassName,
100
+ renderOption,
101
+ invalid,
102
+ children,
103
+ onOpenChange,
104
+ onSearchChange,
105
+ ...props
106
+ }: SelectProps) {
107
+ if (!options && !groups) {
108
+ return (
109
+ <SelectRoot
110
+ value={value ?? undefined}
111
+ defaultValue={defaultValue ?? undefined}
112
+ onValueChange={(nextValue) => onValueChange?.((nextValue as string | null | undefined) ?? undefined)}
113
+ onOpenChange={onOpenChange}
114
+ disabled={disabled}
115
+ {...props}
116
+ >
117
+ {children}
118
+ </SelectRoot>
119
+ )
120
+ }
121
+
122
+ const [search, setSearch] = React.useState("")
123
+ const optionGroups = React.useMemo<SelectOptionGroup[]>(
124
+ () => groups ?? [{ options: options ?? [] }],
125
+ [groups, options]
126
+ )
127
+ const flatOptions = React.useMemo(
128
+ () => optionGroups.flatMap((group) => group.options),
129
+ [optionGroups]
130
+ )
131
+ const selectedOption = flatOptions.find((option) => option.value === value)
132
+ const filteredGroups = optionGroups
133
+ .map((group) => ({
134
+ ...group,
135
+ options: group.options.filter((option) => optionMatchesSearch(option, search)),
136
+ }))
137
+ .filter((group) => group.options.length > 0)
138
+ const filteredOptionsCount = filteredGroups.reduce((count, group) => count + group.options.length, 0)
139
+
140
+ return (
141
+ <SelectRoot
142
+ value={value ?? undefined}
143
+ defaultValue={defaultValue ?? undefined}
144
+ onValueChange={(nextValue) => onValueChange?.((nextValue as string | null | undefined) ?? undefined)}
145
+ disabled={disabled || loading}
146
+ onOpenChange={(open, eventDetails) => {
147
+ if (!open) setSearch("")
148
+ onOpenChange?.(open, eventDetails)
149
+ }}
150
+ {...props}
151
+ >
152
+ <SelectTrigger
153
+ size={size}
154
+ aria-invalid={invalid || undefined}
155
+ className={cn("w-full", triggerClassName)}
156
+ >
157
+ <SelectValue placeholder={placeholder}>
158
+ {selectedOption ? (
159
+ <span className="flex min-w-0 flex-col items-start">
160
+ <span className="truncate">{selectedOption.label}</span>
161
+ {showSelectedDescription && selectedOption.description ? (
162
+ <span className="truncate text-[11px] font-medium text-muted-foreground">
163
+ {selectedOption.description}
164
+ </span>
165
+ ) : null}
166
+ </span>
167
+ ) : null}
168
+ </SelectValue>
169
+ {loading ? <LoaderCircleIcon className="size-4 animate-spin text-muted-foreground" /> : null}
170
+ {clearable && value && !disabled && !loading ? (
171
+ <span
172
+ role="button"
173
+ tabIndex={0}
174
+ aria-label={clearLabel}
175
+ className="ml-1 rounded-[var(--radius-sm)] border border-border/65 p-1 text-muted-foreground transition-colors hover:border-border hover:bg-muted/55 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
176
+ onClick={(event) => {
177
+ event.preventDefault()
178
+ stopInteractivePropagation(event)
179
+ onValueChange?.(undefined)
180
+ }}
181
+ onMouseDown={stopInteractivePropagation}
182
+ onDoubleClick={stopInteractivePropagation}
183
+ onKeyDown={(event) => {
184
+ if (event.key === "Enter" || event.key === " ") {
185
+ event.preventDefault()
186
+ onValueChange?.(undefined)
187
+ }
188
+ }}
189
+ >
190
+ <XIcon className="size-3.5" />
191
+ </span>
192
+ ) : null}
193
+ </SelectTrigger>
194
+ <SelectContent className={cn("w-(--anchor-width)", contentClassName)}>
195
+ {searchable ? (
196
+ <div
197
+ data-slot="select-search"
198
+ className="sticky top-0 z-10 mb-1 flex items-center gap-2 rounded-[var(--radius-md)] border border-[color:var(--aui-card-border,var(--border))] bg-popover px-2.5 py-2 text-sm"
199
+ >
200
+ <SearchIcon className="size-4 text-muted-foreground" />
201
+ <input
202
+ value={search}
203
+ onChange={(event) => {
204
+ setSearch(event.target.value)
205
+ onSearchChange?.(event.target.value)
206
+ }}
207
+ placeholder={searchPlaceholder}
208
+ className={cn(
209
+ "min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground",
210
+ searchClassName
211
+ )}
212
+ />
213
+ </div>
214
+ ) : null}
215
+
216
+ {loading ? (
217
+ <div
218
+ data-slot="select-state"
219
+ className="flex items-center gap-2 rounded-[var(--radius-md)] border border-[color:var(--aui-card-border,var(--border))] bg-[color:color-mix(in_oklch,var(--muted),transparent_55%)] px-3 py-2.5 text-sm text-muted-foreground"
220
+ >
221
+ <LoaderCircleIcon className="size-4 animate-spin" />
222
+ {loadingLabel}
223
+ </div>
224
+ ) : filteredOptionsCount === 0 ? (
225
+ <div
226
+ data-slot="select-state"
227
+ className="rounded-[var(--radius-md)] border border-[color:var(--aui-card-border,var(--border))] bg-[color:color-mix(in_oklch,var(--muted),transparent_55%)] px-3 py-2.5 text-sm text-muted-foreground"
228
+ >
229
+ {emptyMessage ?? emptyLabel}
230
+ </div>
231
+ ) : (
232
+ filteredGroups.map((group, groupIndex) => (
233
+ <SelectGroup key={groupIndex}>
234
+ {group.label ? <SelectLabel>{group.label}</SelectLabel> : null}
235
+ {group.options.map((option) => {
236
+ const selected = option.value === value
237
+ return (
238
+ <SelectItem
239
+ key={option.value}
240
+ value={option.value}
241
+ disabled={option.disabled}
242
+ className={cn("rounded-[var(--radius-md)]", itemClassName)}
243
+ >
244
+ {renderOption ? (
245
+ renderOption(option, { selected })
246
+ ) : (
247
+ <span className="flex min-w-0 flex-1 flex-col">
248
+ <span className="flex min-w-0 items-center gap-2">
249
+ <span className="truncate">{option.label}</span>
250
+ {selected ? <CheckIcon className="ml-auto size-3.5 text-primary" /> : null}
251
+ </span>
252
+ {option.description ? (
253
+ <span className="truncate text-xs text-muted-foreground">{option.description}</span>
254
+ ) : null}
255
+ </span>
256
+ )}
257
+ </SelectItem>
258
+ )
259
+ })}
260
+ </SelectGroup>
261
+ ))
262
+ )}
263
+ </SelectContent>
264
+ </SelectRoot>
265
+ )
266
+ }
25
267
 
26
268
  function SelectGroup({ className, ...props }: SelectGroupProps) {
27
269
  return (
@@ -60,11 +302,7 @@ function SelectTrigger({
60
302
  {...props}
61
303
  >
62
304
  {children}
63
- <SelectPrimitive.Icon
64
- render={
65
- <ChevronDownIcon className="pointer-events-none size-4 text-muted-foreground" />
66
- }
67
- />
305
+ <SelectPrimitive.Icon render={<ChevronDownIcon className="pointer-events-none size-4 text-muted-foreground" />} />
68
306
  </SelectPrimitive.Trigger>
69
307
  )
70
308
  }
@@ -92,7 +330,10 @@ function SelectContent({
92
330
  <SelectPrimitive.Popup
93
331
  data-slot="select-content"
94
332
  data-align-trigger={alignItemWithTrigger}
95
- className={cn("relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-52 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-[var(--aui-card-radius,var(--radius-lg))] border border-[color:var(--aui-card-border,var(--border))] bg-popover p-1.5 text-popover-foreground shadow-[var(--aui-control-panel-shadow,0_18px_40px_rgba(15,23,42,0.14))] backdrop-blur duration-100 data-[align-trigger=true]:animate-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:fade-out-0 data-closed:zoom-out-95", className)}
333
+ className={cn(
334
+ "relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-52 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-[var(--aui-card-radius,var(--radius-lg))] border border-[color:var(--aui-card-border,var(--border))] bg-popover p-1.5 text-popover-foreground shadow-[var(--aui-control-panel-shadow,0_18px_40px_rgba(15,23,42,0.14))] backdrop-blur duration-100 data-[align-trigger=true]:animate-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:fade-out-0 data-closed:zoom-out-95",
335
+ className
336
+ )}
96
337
  {...props}
97
338
  >
98
339
  <SelectScrollUpButton />
@@ -104,24 +345,20 @@ function SelectContent({
104
345
  )
105
346
  }
106
347
 
107
- function SelectLabel({
108
- className,
109
- ...props
110
- }: SelectLabelProps) {
348
+ function SelectLabel({ className, ...props }: SelectLabelProps) {
111
349
  return (
112
350
  <SelectPrimitive.GroupLabel
113
351
  data-slot="select-label"
114
- className={cn("px-2 py-1.5 text-[11px] font-semibold tracking-[0.14em] uppercase text-muted-foreground/90", className)}
352
+ className={cn(
353
+ "px-2 py-1.5 text-[11px] font-semibold tracking-[0.14em] uppercase text-muted-foreground/90",
354
+ className
355
+ )}
115
356
  {...props}
116
357
  />
117
358
  )
118
359
  }
119
360
 
120
- function SelectItem({
121
- className,
122
- children,
123
- ...props
124
- }: SelectItemProps) {
361
+ function SelectItem({ className, children, ...props }: SelectItemProps) {
125
362
  return (
126
363
  <SelectPrimitive.Item
127
364
  data-slot="select-item"
@@ -135,9 +372,7 @@ function SelectItem({
135
372
  {children}
136
373
  </SelectPrimitive.ItemText>
137
374
  <SelectPrimitive.ItemIndicator
138
- render={
139
- <span className="pointer-events-none absolute right-2 flex size-4 items-center justify-center" />
140
- }
375
+ render={<span className="pointer-events-none absolute right-2 flex size-4 items-center justify-center" />}
141
376
  >
142
377
  <CheckIcon className="pointer-events-none" />
143
378
  </SelectPrimitive.ItemIndicator>
@@ -145,10 +380,7 @@ function SelectItem({
145
380
  )
146
381
  }
147
382
 
148
- function SelectSeparator({
149
- className,
150
- ...props
151
- }: SelectSeparatorProps) {
383
+ function SelectSeparator({ className, ...props }: SelectSeparatorProps) {
152
384
  return (
153
385
  <SelectPrimitive.Separator
154
386
  data-slot="select-separator"
@@ -158,10 +390,7 @@ function SelectSeparator({
158
390
  )
159
391
  }
160
392
 
161
- function SelectScrollUpButton({
162
- className,
163
- ...props
164
- }: SelectScrollUpButtonProps) {
393
+ function SelectScrollUpButton({ className, ...props }: SelectScrollUpButtonProps) {
165
394
  return (
166
395
  <SelectPrimitive.ScrollUpArrow
167
396
  data-slot="select-scroll-up-button"
@@ -176,10 +405,7 @@ function SelectScrollUpButton({
176
405
  )
177
406
  }
178
407
 
179
- function SelectScrollDownButton({
180
- className,
181
- ...props
182
- }: SelectScrollDownButtonProps) {
408
+ function SelectScrollDownButton({ className, ...props }: SelectScrollDownButtonProps) {
183
409
  return (
184
410
  <SelectPrimitive.ScrollDownArrow
185
411
  data-slot="select-scroll-down-button"