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
@@ -20,17 +20,17 @@ import {
20
20
 
21
21
  import { createDataTableActionsColumn } from "@/components/data-table/data-table-actions-column"
22
22
  import { DataTableBulkActions, type DataTableBulkAction } from "@/components/data-table/data-table-bulk-actions"
23
- import { DataTableColumnVisibilityMenu } from "@/components/data-table/data-table-column-visibility-menu"
24
- import { DataTablePagination, type DataTablePaginationProps } from "@/components/data-table/data-table-pagination"
25
- import { type DataTableRowAction } from "@/components/data-table/data-table-row-actions"
26
- import { DataTableToolbar, type DataTableToolbarProps } from "@/components/data-table/data-table-toolbar"
27
- import { EmptyState, type EmptyStateProps } from "@/components/feedback/empty-state"
28
- import { LoadingState, type LoadingStateProps } from "@/components/feedback/loading-state"
29
- import { SearchInput, type SearchInputProps } from "@/components/inputs/search-input"
30
- import { Button } from "@/components/ui/button"
31
- import {
32
- Table,
33
- TableBody,
23
+ import { DataTableColumnVisibilityMenu } from "@/components/data-table/data-table-column-visibility-menu"
24
+ import { DataTablePagination, type DataTablePaginationProps } from "@/components/data-table/data-table-pagination"
25
+ import { type DataTableRowAction } from "@/components/data-table/data-table-row-actions"
26
+ import { DataTableToolbar, type DataTableToolbarProps } from "@/components/data-table/data-table-toolbar"
27
+ import { DataState, type DataStateProps } from "@/components/display/data-state"
28
+ import { LoadingState, type LoadingStateProps } from "@/components/feedback/loading-state"
29
+ import { Button } from "@/components/ui/button"
30
+ import { Input, type InputSearchProps } from "@/components/ui/input"
31
+ import {
32
+ Table,
33
+ TableBody,
34
34
  TableCell,
35
35
  TableHead,
36
36
  TableHeader,
@@ -50,12 +50,12 @@ export type DataTableFeatureConfig = {
50
50
  export?: boolean
51
51
  }
52
52
 
53
- export type DataTableSearchConfig = Pick<
54
- SearchInputProps,
55
- | "value"
56
- | "onValueChange"
57
- | "placeholder"
58
- | "inputClassName"
53
+ export type DataTableSearchConfig = Pick<
54
+ InputSearchProps,
55
+ | "value"
56
+ | "onValueChange"
57
+ | "placeholder"
58
+ | "inputClassName"
59
59
  | "disabled"
60
60
  | "clearable"
61
61
  | "clearLabel"
@@ -87,28 +87,30 @@ export type DataTablePaginationConfig = Pick<
87
87
  onPageSizeChange?: (pageSize: number) => void
88
88
  }
89
89
 
90
- export type DataTableProps<TData, TValue = unknown> = Omit<
91
- React.ComponentProps<"div">,
92
- "children"
93
- > & {
90
+ export type DataTableProps<TData, TValue = unknown> = Omit<
91
+ React.ComponentProps<"div">,
92
+ "children"
93
+ > & {
94
94
  columns: ColumnDef<TData, TValue>[]
95
95
  data: TData[]
96
- title?: React.ReactNode
97
- description?: React.ReactNode
98
- features?: DataTableFeatureConfig
99
- search?: DataTableSearchConfig
100
- toolbarActions?: React.ReactNode | ((context: DataTableActionContext<TData>) => React.ReactNode)
101
- rowActions?: (row: Row<TData>, original: TData) => DataTableRowAction<TData>[]
96
+ title?: React.ReactNode
97
+ description?: React.ReactNode
98
+ features?: DataTableFeatureConfig
99
+ search?: DataTableSearchConfig
100
+ filters?: React.ReactNode | ((context: DataTableActionContext<TData>) => React.ReactNode)
101
+ summary?: React.ReactNode | ((context: DataTableActionContext<TData>) => React.ReactNode)
102
+ toolbarActions?: React.ReactNode | ((context: DataTableActionContext<TData>) => React.ReactNode)
103
+ rowActions?: (row: Row<TData>, original: TData) => DataTableRowAction<TData>[]
102
104
  bulkActions?: DataTableBulkAction<TData>[]
103
105
  onRefresh?: (context: DataTableActionContext<TData>) => void
104
- onExport?: (context: DataTableActionContext<TData>) => void
106
+ onExport?: (context: DataTableActionContext<TData>) => void
105
107
  refreshLabel?: React.ReactNode
106
108
  exportLabel?: React.ReactNode
107
109
  getRowId?: (originalRow: TData, index: number, parent?: Row<TData>) => string
108
110
  isLoading?: boolean
109
111
  isError?: boolean
110
- emptyState?: EmptyStateProps
111
- errorState?: EmptyStateProps
112
+ emptyState?: Omit<DataStateProps, "status">
113
+ errorState?: Omit<DataStateProps, "status">
112
114
  loadingState?: LoadingStateProps
113
115
  loadingVariant?: DataTableLoadingVariant
114
116
  toolbar?: React.ReactNode | ((table: TanStackTable<TData>) => React.ReactNode)
@@ -189,11 +191,13 @@ function DataTable<TData, TValue = unknown>({
189
191
  columns,
190
192
  data,
191
193
  title,
192
- description,
193
- features,
194
- search,
195
- toolbarActions,
196
- rowActions,
194
+ description,
195
+ features,
196
+ search,
197
+ filters,
198
+ summary,
199
+ toolbarActions,
200
+ rowActions,
197
201
  bulkActions,
198
202
  onRefresh,
199
203
  onExport,
@@ -259,11 +263,10 @@ function DataTable<TData, TValue = unknown>({
259
263
  pageSize: paginationConfig.pageSize,
260
264
  }
261
265
  : undefined
262
- const manualPagination = Boolean(paginationConfig && paginationConfig.manual !== false)
263
- const resolvedRowSelection = rowSelection ?? {}
264
- const selectedRowCount = Object.keys(resolvedRowSelection).length
265
-
266
- // TanStack Table returns imperative helpers that React Compiler flags by design.
266
+ const manualPagination = Boolean(paginationConfig && paginationConfig.manual !== false)
267
+ const resolvedRowSelection = rowSelection ?? {}
268
+
269
+ // TanStack Table returns imperative helpers that React Compiler flags by design.
267
270
  // eslint-disable-next-line react-hooks/incompatible-library
268
271
  const table = useReactTable({
269
272
  data,
@@ -291,18 +294,21 @@ function DataTable<TData, TValue = unknown>({
291
294
  getExpandedRowModel: getExpandedRowModel(),
292
295
  })
293
296
 
294
- const rows = table.getRowModel().rows
295
- const selectedRows = table.getSelectedRowModel().rows.map((row) => row.original)
296
- const actionContext = React.useMemo<DataTableActionContext<TData>>(
297
- () => ({ table, data, selectedRows }),
298
- [data, selectedRows, table]
299
- )
300
- const visibleColumns = table.getVisibleLeafColumns()
301
- const visibleColumnCount = Math.max(visibleColumns.length, 1)
302
- const resolvedToolbar = typeof toolbar === "function" ? toolbar(table) : toolbar
303
- const resolvedToolbarProps = typeof toolbarProps === "function" ? toolbarProps(table) : toolbarProps
304
- const shouldShowSearch = Boolean(search && features?.search !== false)
305
- const shouldShowColumnVisibility = Boolean(features?.columnVisibility && table.getAllLeafColumns().some((column) => column.getCanHide()))
297
+ const rows = table.getRowModel().rows
298
+ const selectedRows = table.getSelectedRowModel().rows.map((row) => row.original)
299
+ const selectedRowCount = selectedRows.length
300
+ const actionContext = React.useMemo<DataTableActionContext<TData>>(
301
+ () => ({ table, data, selectedRows }),
302
+ [data, selectedRows, table]
303
+ )
304
+ const visibleColumns = table.getVisibleLeafColumns()
305
+ const visibleColumnCount = Math.max(visibleColumns.length, 1)
306
+ const resolvedToolbar = typeof toolbar === "function" ? toolbar(table) : toolbar
307
+ const resolvedToolbarProps = typeof toolbarProps === "function" ? toolbarProps(table) : toolbarProps
308
+ const resolvedFilters = typeof filters === "function" ? filters(actionContext) : filters
309
+ const resolvedSummary = typeof summary === "function" ? summary(actionContext) : summary
310
+ const shouldShowSearch = Boolean(search && features?.search !== false)
311
+ const shouldShowColumnVisibility = Boolean(features?.columnVisibility && table.getAllLeafColumns().some((column) => column.getCanHide()))
306
312
  const shouldShowRefresh = Boolean(features?.refresh && onRefresh)
307
313
  const shouldShowExport = Boolean(features?.export && onExport)
308
314
  const shouldShowBulkActions = Boolean(features?.bulkActions !== false && bulkActions?.length)
@@ -310,16 +316,19 @@ function DataTable<TData, TValue = unknown>({
310
316
  title ||
311
317
  description ||
312
318
  search ||
319
+ resolvedFilters ||
320
+ resolvedSummary ||
313
321
  toolbarActions ||
314
322
  shouldShowRefresh ||
315
323
  shouldShowExport
316
324
  )
317
325
  const shouldShowColumnVisibilityInToolbar = shouldShowColumnVisibility && hasPrimaryToolbarContent
318
326
  const defaultSearch = shouldShowSearch && search ? (
319
- <SearchInput
320
- value={search.value}
321
- onValueChange={search.onValueChange}
322
- placeholder={search.placeholder ?? "Search..."}
327
+ <Input
328
+ type="search"
329
+ value={search.value}
330
+ onValueChange={search.onValueChange}
331
+ placeholder={search.placeholder ?? "Search..."}
323
332
  wrapperClassName={search.wrapperClassName ?? search.className}
324
333
  inputClassName={search.inputClassName}
325
334
  disabled={search.disabled}
@@ -355,9 +364,11 @@ function DataTable<TData, TValue = unknown>({
355
364
  />
356
365
  ) : undefined
357
366
  const hasDefaultToolbarContent = Boolean(
358
- title ||
359
- description ||
367
+ title ||
368
+ description ||
360
369
  defaultSearch ||
370
+ resolvedFilters ||
371
+ resolvedSummary ||
361
372
  toolbarActions ||
362
373
  shouldShowColumnVisibilityInToolbar ||
363
374
  shouldShowRefresh ||
@@ -400,26 +411,28 @@ function DataTable<TData, TValue = unknown>({
400
411
  </TableRow>
401
412
  ))
402
413
 
403
- const stateContent = shouldRenderSkeleton ? null : isLoading ? (
404
- <LoadingState label="Loading data..." {...loadingState} />
405
- ) : isError ? (
406
- <EmptyState title="Could not load data" description="Please try again." {...errorState} />
407
- ) : rows.length === 0 ? (
408
- <EmptyState {...emptyState} />
409
- ) : null
414
+ const stateContent = shouldRenderSkeleton ? null : isLoading ? (
415
+ <LoadingState label="Loading data..." {...loadingState} />
416
+ ) : isError ? (
417
+ <DataState status="error" title="Could not load data" description="Please try again." variant="plain" {...errorState} />
418
+ ) : rows.length === 0 ? (
419
+ <DataState status="empty" variant="plain" {...emptyState} />
420
+ ) : null
410
421
 
411
422
  return (
412
423
  <div data-slot="data-table" className={cn("grid gap-3", className)} {...props}>
413
424
  {hasToolbar &&
414
425
  (resolvedToolbar ?? (
415
- <DataTableToolbar
416
- title={title}
417
- description={description}
418
- search={defaultSearch}
419
- actions={defaultActions}
420
- selectionActions={defaultSelectionActions}
421
- selectedCount={selectedRowCount}
422
- totalCount={paginationConfig ? paginationConfig.rowCount ?? data.length : data.length}
426
+ <DataTableToolbar
427
+ title={title}
428
+ description={description}
429
+ search={defaultSearch}
430
+ filters={resolvedFilters}
431
+ summary={resolvedSummary}
432
+ actions={defaultActions}
433
+ selectionActions={defaultSelectionActions}
434
+ selectedCount={selectedRowCount}
435
+ totalCount={paginationConfig ? paginationConfig.rowCount ?? data.length : data.length}
423
436
  variant="plain"
424
437
  {...resolvedToolbarProps}
425
438
  />
@@ -1,13 +1,3 @@
1
- import { component, createShowcaseDemoRegistry } from "@/showcase/create-demo"
1
+ import { createShowcaseDemoRegistry } from "@/showcase/create-demo"
2
2
 
3
- export const dataTableShowcaseDemoRegistry = createShowcaseDemoRegistry([
4
- component("data-table-pagination", "DataTablePagination", "data-table", "Pagination control used by DataTable pages."),
5
- component("data-table-toolbar", "DataTableToolbar", "data-table", "Toolbar surface for DataTable search, filters and actions."),
6
- component("data-table-column-visibility-menu", "DataTableColumnVisibilityMenu", "data-table", "Column visibility menu pattern for table views."),
7
- component("data-table-select-column", "DataTableSelectColumn", "data-table", "Selection column pattern for bulk table workflows."),
8
- component("data-table-sortable-header", "DataTableSortableHeader", "data-table", "Sortable header trigger with clear visual state."),
9
- component("data-table-row-actions", "DataTableRowActions", "data-table", "Row action menu for inspect, duplicate and archive operations."),
10
- component("data-table-actions-column", "DataTableActionsColumn", "data-table", "Reusable actions column for DataTable definitions."),
11
- component("data-table-bulk-actions", "DataTableBulkActions", "data-table", "Bulk action bar for selected rows."),
12
- component("data-table-view-presets", "DataTableViewPresets", "data-table", "Saved table view presets for operational dashboards."),
13
- ])
3
+ export const dataTableShowcaseDemoRegistry = createShowcaseDemoRegistry([])
@@ -1,11 +1,6 @@
1
1
  export * from "./data-table"
2
- export * from "./data-table-actions-column"
2
+ export * from "./data-table-pagination"
3
3
  export * from "./data-table-bulk-actions"
4
4
  export * from "./data-table-column-visibility-menu"
5
- export * from "./data-table-pagination"
6
- export * from "./data-table-row-actions"
7
- export * from "./data-table-select-column"
8
5
  export * from "./data-table-sortable-header"
9
- export * from "./data-table-toolbar"
10
6
  export * from "./data-table-view-presets"
11
- export * from "./data-table-saved-filters"
@@ -3,28 +3,39 @@ import * as React from "react"
3
3
  import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
4
4
  import { cn } from "@/lib/utils"
5
5
 
6
- export type ActivityFeedItem = {
6
+ export type ActivityFeedItem = {
7
7
  id: string
8
8
  title: React.ReactNode
9
9
  description?: React.ReactNode
10
10
  time?: React.ReactNode
11
11
  icon?: React.ReactNode
12
12
  tone?: "default" | "success" | "warning" | "danger" | "info" | "muted"
13
- actions?: React.ReactNode
14
- hidden?: boolean
15
- className?: string
16
- }
13
+ actions?: React.ReactNode
14
+ meta?: React.ReactNode
15
+ badge?: React.ReactNode
16
+ unread?: boolean
17
+ hidden?: boolean
18
+ interactive?: boolean
19
+ href?: string
20
+ target?: React.ComponentProps<"a">["target"]
21
+ rel?: React.ComponentProps<"a">["rel"]
22
+ onSelect?: () => void
23
+ className?: string
24
+ }
17
25
 
18
- export type ActivityFeedProps = React.ComponentProps<typeof Card> & {
26
+ export type ActivityFeedProps = React.ComponentProps<typeof Card> & {
19
27
  title?: React.ReactNode
20
28
  description?: React.ReactNode
21
29
  actions?: React.ReactNode
22
30
  items: ActivityFeedItem[]
23
31
  empty?: React.ReactNode
24
- compact?: boolean
25
- contentClassName?: string
26
- itemClassName?: string
27
- }
32
+ compact?: boolean
33
+ density?: "comfortable" | "compact"
34
+ showConnector?: boolean
35
+ connectorClassName?: string
36
+ contentClassName?: string
37
+ itemClassName?: string
38
+ }
28
39
 
29
40
  const toneDotClassName: Record<NonNullable<ActivityFeedItem["tone"]>, string> = {
30
41
  default: "bg-primary",
@@ -41,14 +52,18 @@ function ActivityFeed({
41
52
  description,
42
53
  actions,
43
54
  items,
44
- empty = "No activity yet.",
45
- compact = false,
46
- contentClassName,
47
- itemClassName,
48
- ...props
49
- }: ActivityFeedProps) {
50
- const visibleItems = items.filter((item) => !item.hidden)
51
- const hasHeader = Boolean(title || description || actions)
55
+ empty = "No activity yet.",
56
+ compact = false,
57
+ density,
58
+ showConnector = true,
59
+ connectorClassName,
60
+ contentClassName,
61
+ itemClassName,
62
+ ...props
63
+ }: ActivityFeedProps) {
64
+ const visibleItems = items.filter((item) => !item.hidden)
65
+ const hasHeader = Boolean(title || description || actions)
66
+ const isCompact = density ? density === "compact" : compact
52
67
 
53
68
  return (
54
69
  <Card data-slot="activity-feed" className={cn("min-w-0", className)} {...props}>
@@ -68,28 +83,71 @@ function ActivityFeed({
68
83
  {visibleItems.length === 0 ? (
69
84
  <div className="rounded-lg border border-dashed p-4 text-center text-sm text-muted-foreground">{empty}</div>
70
85
  ) : (
71
- visibleItems.map((item, index) => (
72
- <div
73
- key={item.id}
74
- data-slot="activity-feed-item"
75
- className={cn("relative flex gap-3 pb-4 last:pb-0", compact && "gap-2 pb-3", itemClassName, item.className)}
76
- >
77
- {index < visibleItems.length - 1 && <div className="absolute left-3 top-7 h-[calc(100%-1.75rem)] w-px bg-border" />}
78
- <div className="relative z-10 mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-full border bg-background">
79
- {item.icon ?? <span className={cn("size-2 rounded-full", toneDotClassName[item.tone ?? "default"])} />}
80
- </div>
81
- <div className="min-w-0 flex-1 space-y-1">
82
- <div className="flex min-w-0 items-start justify-between gap-2">
83
- <div className="min-w-0 text-sm font-medium leading-5 text-foreground">{item.title}</div>
84
- {item.time && <div className="shrink-0 text-xs text-muted-foreground">{item.time}</div>}
85
- </div>
86
- {item.description && <div className="text-sm leading-5 text-muted-foreground">{item.description}</div>}
87
- {item.actions && <div className="pt-1">{item.actions}</div>}
88
- </div>
89
- </div>
90
- ))
91
- )}
92
- </CardContent>
86
+ visibleItems.map((item, index) => {
87
+ const isInteractive = item.interactive ?? Boolean(item.href || item.onSelect)
88
+ const content = (
89
+ <>
90
+ <div className={cn(
91
+ "relative z-10 mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-full border bg-background",
92
+ item.unread && "border-primary/45 bg-primary/8 shadow-[0_0_0_3px_color-mix(in_oklch,var(--primary),transparent_88%)]"
93
+ )}>
94
+ {item.icon ?? <span className={cn("size-2 rounded-full", toneDotClassName[item.tone ?? "default"])} />}
95
+ </div>
96
+ <div className="min-w-0 flex-1 space-y-1">
97
+ <div className="flex min-w-0 items-start justify-between gap-2">
98
+ <div className="min-w-0 space-y-1">
99
+ <div className="min-w-0 text-sm font-medium leading-5 text-foreground">{item.title}</div>
100
+ {item.meta && <div className="text-xs text-muted-foreground">{item.meta}</div>}
101
+ </div>
102
+ <div className="flex shrink-0 items-center gap-2">
103
+ {item.badge}
104
+ {item.time && <div className="text-xs text-muted-foreground">{item.time}</div>}
105
+ </div>
106
+ </div>
107
+ {item.description && <div className="text-sm leading-5 text-muted-foreground">{item.description}</div>}
108
+ {item.actions && <div className="pt-1">{item.actions}</div>}
109
+ </div>
110
+ </>
111
+ )
112
+
113
+ return (
114
+ <div
115
+ key={item.id}
116
+ data-slot="activity-feed-item"
117
+ className={cn("relative flex gap-3 pb-4 last:pb-0", isCompact && "gap-2 pb-3", itemClassName, item.className)}
118
+ >
119
+ {showConnector && index < visibleItems.length - 1 && (
120
+ <div className={cn("absolute left-3 top-7 h-[calc(100%-1.75rem)] w-px bg-border", connectorClassName)} />
121
+ )}
122
+ {item.href ? (
123
+ <a
124
+ href={item.href}
125
+ target={item.target}
126
+ rel={item.rel}
127
+ className={cn(
128
+ "flex min-w-0 flex-1 gap-3 rounded-[var(--radius-lg)] px-2 py-1.5 transition-[background-color,border-color,box-shadow]",
129
+ isInteractive && "hover:bg-muted/35 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40"
130
+ )}
131
+ >
132
+ {content}
133
+ </a>
134
+ ) : isInteractive ? (
135
+ <button
136
+ type="button"
137
+ className="flex min-w-0 flex-1 gap-3 rounded-[var(--radius-lg)] px-2 py-1.5 text-left transition-[background-color,border-color,box-shadow] hover:bg-muted/35 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40"
138
+ onClick={item.onSelect}
139
+ >
140
+ {content}
141
+ </button>
142
+ ) : (
143
+ <div className="flex min-w-0 flex-1 gap-3 px-2 py-1.5">
144
+ {content}
145
+ </div>
146
+ )}
147
+ </div>
148
+ )})
149
+ )}
150
+ </CardContent>
93
151
  </Card>
94
152
  )
95
153
  }
@@ -16,6 +16,21 @@ export type CarouselProps = React.ComponentProps<"div"> & {
16
16
  ariaLabel?: string
17
17
  previousLabel?: string
18
18
  nextLabel?: string
19
+ swipeThreshold?: number
20
+ autoplay?: boolean
21
+ autoplayInterval?: number
22
+ pauseOnHover?: boolean
23
+ stopAutoplayOnInteraction?: boolean
24
+ showPlaybackControl?: boolean
25
+ playLabel?: string
26
+ pauseLabel?: string
27
+ onAutoplayChange?: (playing: boolean) => void
28
+ viewportClassName?: string
29
+ controlsClassName?: string
30
+ dotsClassName?: string
31
+ arrowClassName?: string
32
+ dotClassName?: string
33
+ activeDotClassName?: string
19
34
  }
20
35
 
21
36
  export type CarouselItemProps = React.ComponentProps<"div">
@@ -38,24 +53,86 @@ function Carousel({
38
53
  ariaLabel = "Carousel",
39
54
  previousLabel = "Previous slide",
40
55
  nextLabel = "Next slide",
56
+ swipeThreshold = 44,
57
+ autoplay = false,
58
+ autoplayInterval = 4500,
59
+ pauseOnHover = true,
60
+ stopAutoplayOnInteraction = true,
61
+ showPlaybackControl = false,
62
+ playLabel = "Start autoplay",
63
+ pauseLabel = "Pause autoplay",
64
+ onAutoplayChange,
65
+ viewportClassName,
66
+ controlsClassName,
67
+ dotsClassName,
68
+ arrowClassName,
69
+ dotClassName,
70
+ activeDotClassName,
41
71
  className,
42
72
  children,
43
73
  ...props
44
74
  }: CarouselProps) {
45
75
  const items = React.Children.toArray(children)
46
76
  const [internalIndex, setInternalIndex] = React.useState(defaultIndex)
77
+ const touchStartXRef = React.useRef<number | null>(null)
78
+ const [isHovered, setIsHovered] = React.useState(false)
79
+ const [autoplayStopped, setAutoplayStopped] = React.useState(false)
80
+ const [autoplayEnabled, setAutoplayEnabled] = React.useState(autoplay)
47
81
  const controlled = index !== undefined
48
82
  const activeIndex = clampIndex(controlled ? index : internalIndex, items.length, loop)
49
83
 
50
- function setActiveIndex(nextIndex: number) {
84
+ React.useEffect(() => {
85
+ setAutoplayEnabled(autoplay)
86
+ }, [autoplay])
87
+
88
+ function setActiveIndex(nextIndex: number, reason: "manual" | "autoplay" = "manual") {
51
89
  const resolvedIndex = clampIndex(nextIndex, items.length, loop)
52
90
  if (!controlled) setInternalIndex(resolvedIndex)
91
+ if (reason === "manual" && stopAutoplayOnInteraction) {
92
+ setAutoplayStopped(true)
93
+ if (autoplayEnabled) {
94
+ setAutoplayEnabled(false)
95
+ onAutoplayChange?.(false)
96
+ }
97
+ }
53
98
  onIndexChange?.(resolvedIndex)
54
99
  }
55
100
 
56
101
  const canGoPrevious = loop || activeIndex > 0
57
102
  const canGoNext = loop || activeIndex < items.length - 1
58
103
 
104
+ const handleTouchStart: React.TouchEventHandler<HTMLDivElement> = (event) => {
105
+ touchStartXRef.current = event.touches[0]?.clientX ?? null
106
+ }
107
+
108
+ const handleTouchEnd: React.TouchEventHandler<HTMLDivElement> = (event) => {
109
+ if (touchStartXRef.current == null || items.length <= 1) return
110
+ const endX = event.changedTouches[0]?.clientX ?? touchStartXRef.current
111
+ const deltaX = endX - touchStartXRef.current
112
+ touchStartXRef.current = null
113
+
114
+ if (Math.abs(deltaX) < swipeThreshold) return
115
+ if (deltaX > 0 && canGoPrevious) setActiveIndex(activeIndex - 1)
116
+ if (deltaX < 0 && canGoNext) setActiveIndex(activeIndex + 1)
117
+ }
118
+
119
+ React.useEffect(() => {
120
+ if (!autoplayEnabled || items.length <= 1 || autoplayStopped) return
121
+ if (pauseOnHover && isHovered) return
122
+
123
+ const timer = window.setInterval(() => {
124
+ if (!loop && activeIndex >= items.length - 1) {
125
+ setActiveIndex(0, "autoplay")
126
+ return
127
+ }
128
+ setActiveIndex(activeIndex + 1, "autoplay")
129
+ }, autoplayInterval)
130
+
131
+ return () => {
132
+ window.clearInterval(timer)
133
+ }
134
+ }, [activeIndex, autoplayEnabled, autoplayInterval, autoplayStopped, isHovered, items.length, loop, pauseOnHover])
135
+
59
136
  return (
60
137
  <div
61
138
  data-slot="carousel"
@@ -63,6 +140,7 @@ function Carousel({
63
140
  role="region"
64
141
  aria-roledescription="carousel"
65
142
  aria-label={ariaLabel}
143
+ tabIndex={keyboard ? 0 : undefined}
66
144
  className={cn("grid gap-3", className)}
67
145
  onKeyDown={(event) => {
68
146
  if (!keyboard || items.length <= 1) return
@@ -75,13 +153,17 @@ function Carousel({
75
153
  setActiveIndex(activeIndex + 1)
76
154
  }
77
155
  }}
156
+ onTouchStart={handleTouchStart}
157
+ onTouchEnd={handleTouchEnd}
158
+ onMouseEnter={() => setIsHovered(true)}
159
+ onMouseLeave={() => setIsHovered(false)}
78
160
  {...props}
79
161
  >
80
162
  <div className={cn(
81
163
  "relative overflow-hidden rounded-[var(--aui-card-radius,var(--radius-lg))] border border-[color:var(--aui-card-border,var(--border))] bg-card shadow-[var(--aui-card-shadow,0_12px_32px_rgba(15,23,42,0.08))]",
82
164
  variant === "hero" && "min-h-72",
83
165
  variant === "minimal" && "rounded-[var(--radius-md)] shadow-none"
84
- )}>
166
+ , viewportClassName)}>
85
167
  <div className="transition-transform duration-300 ease-out" aria-live="polite">
86
168
  {items[activeIndex]}
87
169
  </div>
@@ -91,7 +173,7 @@ function Carousel({
91
173
  type="button"
92
174
  variant={variant === "hero" ? "default" : "secondary"}
93
175
  size="icon-sm"
94
- className="absolute left-3 top-1/2 -translate-y-1/2 rounded-full shadow-lg"
176
+ className={cn("absolute left-3 top-1/2 -translate-y-1/2 rounded-full shadow-lg", arrowClassName)}
95
177
  disabled={!canGoPrevious}
96
178
  aria-label={previousLabel}
97
179
  onClick={() => setActiveIndex(activeIndex - 1)}
@@ -102,7 +184,7 @@ function Carousel({
102
184
  type="button"
103
185
  variant={variant === "hero" ? "default" : "secondary"}
104
186
  size="icon-sm"
105
- className="absolute right-3 top-1/2 -translate-y-1/2 rounded-full shadow-lg"
187
+ className={cn("absolute right-3 top-1/2 -translate-y-1/2 rounded-full shadow-lg", arrowClassName)}
106
188
  disabled={!canGoNext}
107
189
  aria-label={nextLabel}
108
190
  onClick={() => setActiveIndex(activeIndex + 1)}
@@ -113,7 +195,7 @@ function Carousel({
113
195
  ) : null}
114
196
  </div>
115
197
  {showDots && items.length > 1 && (
116
- <div className="flex items-center justify-center gap-2" role="tablist" aria-label={`${ariaLabel} slides`}>
198
+ <div className={cn("flex flex-wrap items-center justify-center gap-2", dotsClassName)} role="tablist" aria-label={`${ariaLabel} slides`}>
117
199
  {items.map((_, itemIndex) => (
118
200
  <button
119
201
  key={itemIndex}
@@ -123,11 +205,27 @@ function Carousel({
123
205
  aria-selected={itemIndex === activeIndex}
124
206
  className={cn(
125
207
  "h-2.5 rounded-full bg-muted-foreground/30 transition-[width,background-color,opacity] hover:bg-muted-foreground/55",
126
- itemIndex === activeIndex ? "w-7 bg-primary" : "w-2.5"
208
+ itemIndex === activeIndex ? cn("w-7 bg-primary", activeDotClassName) : cn("w-2.5", dotClassName)
127
209
  )}
128
210
  onClick={() => setActiveIndex(itemIndex)}
129
211
  />
130
212
  ))}
213
+ {showPlaybackControl ? (
214
+ <Button
215
+ type="button"
216
+ variant="ghost"
217
+ size="sm"
218
+ className={cn("ml-2 rounded-full", controlsClassName)}
219
+ onClick={() => {
220
+ const nextPlaying = !autoplayEnabled
221
+ setAutoplayStopped(false)
222
+ setAutoplayEnabled(nextPlaying)
223
+ onAutoplayChange?.(nextPlaying)
224
+ }}
225
+ >
226
+ {autoplayEnabled ? pauseLabel : playLabel}
227
+ </Button>
228
+ ) : null}
131
229
  </div>
132
230
  )}
133
231
  </div>