tembro 2.0.6 → 2.1.1

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 (344) 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-toolbar.cjs +1 -1
  17. package/dist/components/data-table/data-table-toolbar.js +12 -13
  18. package/dist/components/display/carousel.cjs +1 -1
  19. package/dist/components/display/carousel.d.ts +9 -1
  20. package/dist/components/display/carousel.js +123 -81
  21. package/dist/components/display/code-block.cjs +2 -2
  22. package/dist/components/display/code-block.d.ts +2 -1
  23. package/dist/components/display/code-block.js +17 -12
  24. package/dist/components/display/delta-badge.cjs +1 -1
  25. package/dist/components/display/delta-badge.d.ts +2 -1
  26. package/dist/components/display/delta-badge.js +11 -7
  27. package/dist/components/display/kanban.cjs +1 -1
  28. package/dist/components/display/kanban.d.ts +4 -1
  29. package/dist/components/display/kanban.js +60 -33
  30. package/dist/components/display/metric-grid.cjs +1 -1
  31. package/dist/components/display/metric-grid.d.ts +1 -0
  32. package/dist/components/display/metric-grid.js +1 -1
  33. package/dist/components/display/qr-code.cjs +1 -1
  34. package/dist/components/display/qr-code.d.ts +2 -1
  35. package/dist/components/display/qr-code.js +19 -16
  36. package/dist/components/display/status-legend.cjs +1 -1
  37. package/dist/components/display/status-legend.js +6 -2
  38. package/dist/components/display/tag.cjs +1 -1
  39. package/dist/components/display/tag.d.ts +2 -1
  40. package/dist/components/display/tag.js +28 -22
  41. package/dist/components/display/tree-view.cjs +1 -1
  42. package/dist/components/display/tree-view.d.ts +9 -1
  43. package/dist/components/display/tree-view.js +104 -40
  44. package/dist/components/display/trend-card.cjs +1 -1
  45. package/dist/components/display/trend-card.js +27 -41
  46. package/dist/components/feedback/alert.cjs +1 -1
  47. package/dist/components/feedback/alert.d.ts +2 -1
  48. package/dist/components/feedback/alert.js +6 -6
  49. package/dist/components/feedback/loading-state.cjs +1 -1
  50. package/dist/components/feedback/loading-state.d.ts +3 -1
  51. package/dist/components/feedback/loading-state.js +23 -10
  52. package/dist/components/feedback/page-state.cjs +1 -1
  53. package/dist/components/feedback/page-state.d.ts +2 -1
  54. package/dist/components/feedback/page-state.js +7 -4
  55. package/dist/components/form/form-field-shell.cjs +1 -1
  56. package/dist/components/form/form-field-shell.d.ts +4 -2
  57. package/dist/components/form/form-field-shell.js +57 -41
  58. package/dist/components/form/form-input.cjs +1 -1
  59. package/dist/components/form/form-input.js +2 -0
  60. package/dist/components/form/form-select.cjs +1 -1
  61. package/dist/components/form/form-select.js +2 -0
  62. package/dist/components/form/form-switch.cjs +1 -1
  63. package/dist/components/form/form-switch.d.ts +1 -1
  64. package/dist/components/form/form-switch.js +58 -54
  65. package/dist/components/form/form-textarea.cjs +1 -1
  66. package/dist/components/form/form-textarea.d.ts +1 -1
  67. package/dist/components/form/form-textarea.js +29 -27
  68. package/dist/components/layout/app-sidebar.cjs +1 -1
  69. package/dist/components/layout/app-sidebar.d.ts +1 -0
  70. package/dist/components/layout/app-sidebar.js +36 -36
  71. package/dist/components/layout/breadcrumbs.cjs +1 -1
  72. package/dist/components/layout/breadcrumbs.d.ts +2 -1
  73. package/dist/components/layout/breadcrumbs.js +7 -7
  74. package/dist/components/modern/calendar-scheduler.cjs +1 -1
  75. package/dist/components/modern/calendar-scheduler.d.ts +5 -1
  76. package/dist/components/modern/calendar-scheduler.js +47 -28
  77. package/dist/components/modern/dual-list-picker.cjs +1 -1
  78. package/dist/components/modern/dual-list-picker.d.ts +5 -1
  79. package/dist/components/modern/dual-list-picker.js +81 -23
  80. package/dist/components/modern/rich-text-editor.cjs +1 -1
  81. package/dist/components/modern/rich-text-editor.d.ts +3 -1
  82. package/dist/components/modern/rich-text-editor.js +12 -9
  83. package/dist/components/modern/tour.cjs +1 -1
  84. package/dist/components/modern/tour.d.ts +5 -1
  85. package/dist/components/modern/tour.js +57 -35
  86. package/dist/components/navigation/command-bar.cjs +1 -1
  87. package/dist/components/navigation/command-bar.d.ts +3 -1
  88. package/dist/components/navigation/command-bar.js +10 -7
  89. package/dist/components/navigation/demo.cjs +1 -1
  90. package/dist/components/navigation/demo.js +0 -1
  91. package/dist/components/navigation/nav-tabs.cjs +1 -1
  92. package/dist/components/navigation/nav-tabs.js +39 -27
  93. package/dist/components/navigation/page-tabs.cjs +1 -1
  94. package/dist/components/navigation/page-tabs.js +41 -30
  95. package/dist/components/navigation/pagination.cjs +1 -1
  96. package/dist/components/navigation/pagination.d.ts +7 -1
  97. package/dist/components/navigation/pagination.js +48 -25
  98. package/dist/components/notifications/notification-center.cjs +1 -1
  99. package/dist/components/notifications/notification-center.d.ts +3 -1
  100. package/dist/components/notifications/notification-center.js +56 -38
  101. package/dist/components/notifications/toast.cjs +1 -1
  102. package/dist/components/notifications/toast.d.ts +1 -0
  103. package/dist/components/notifications/toast.js +4 -0
  104. package/dist/components/overlay/alert-dialog.cjs +1 -1
  105. package/dist/components/overlay/alert-dialog.js +1 -1
  106. package/dist/components/overlay/confirm-dialog.cjs +1 -1
  107. package/dist/components/overlay/confirm-dialog.d.ts +4 -2
  108. package/dist/components/overlay/confirm-dialog.js +31 -22
  109. package/dist/components/overlay/drawer.cjs +1 -1
  110. package/dist/components/overlay/drawer.d.ts +3 -1
  111. package/dist/components/overlay/drawer.js +24 -16
  112. package/dist/components/ui/accordion/index.d.ts +4 -0
  113. package/dist/components/ui/badge/index.cjs +1 -1
  114. package/dist/components/ui/badge/index.d.ts +1 -1
  115. package/dist/components/ui/badge/index.js +2 -1
  116. package/dist/components/ui/button/index.cjs +1 -1
  117. package/dist/components/ui/button/index.d.ts +2 -1
  118. package/dist/components/ui/button/index.js +13 -10
  119. package/dist/components/ui/dialog/index.cjs +1 -1
  120. package/dist/components/ui/dialog/index.js +2 -1
  121. package/dist/components/ui/hover-card.cjs +1 -1
  122. package/dist/components/ui/hover-card.d.ts +11 -3
  123. package/dist/components/ui/hover-card.js +29 -24
  124. package/dist/components/ui/input/index.d.ts +1 -1
  125. package/dist/components/ui/popover/index.cjs +1 -1
  126. package/dist/components/ui/popover/index.d.ts +2 -2
  127. package/dist/components/ui/popover/index.js +6 -5
  128. package/dist/components/ui/radio-group/index.cjs +1 -1
  129. package/dist/components/ui/radio-group/index.d.ts +5 -1
  130. package/dist/components/ui/radio-group/index.js +50 -16
  131. package/dist/components/ui/right-click-menu/index.cjs +1 -1
  132. package/dist/components/ui/right-click-menu/index.d.ts +5 -1
  133. package/dist/components/ui/right-click-menu/index.js +77 -23
  134. package/dist/components/ui/segmented-control/index.cjs +1 -1
  135. package/dist/components/ui/segmented-control/index.d.ts +2 -1
  136. package/dist/components/ui/segmented-control/index.js +23 -11
  137. package/dist/components/ui/select/index.cjs +1 -1
  138. package/dist/components/ui/select/index.d.ts +8 -1
  139. package/dist/components/ui/select/index.js +40 -35
  140. package/dist/components/ui/switch/index.cjs +1 -1
  141. package/dist/components/ui/switch/index.d.ts +18 -0
  142. package/dist/components/ui/switch/index.js +47 -17
  143. package/dist/components/ui/tabs/index.cjs +1 -1
  144. package/dist/components/ui/tabs/index.d.ts +14 -4
  145. package/dist/components/ui/tabs/index.js +11 -8
  146. package/dist/components/ui/textarea/index.cjs +1 -1
  147. package/dist/components/ui/textarea/index.d.ts +10 -2
  148. package/dist/components/ui/textarea/index.js +37 -8
  149. package/dist/components/ui/textarea.cjs +1 -0
  150. package/dist/components/ui/textarea.d.ts +1 -0
  151. package/dist/components/ui/textarea.js +2 -0
  152. package/dist/components/ui/tooltip/index.cjs +1 -1
  153. package/dist/components/ui/tooltip/index.d.ts +11 -3
  154. package/dist/components/ui/tooltip/index.js +41 -20
  155. package/dist/components/upload/file-upload.cjs +1 -1
  156. package/dist/components/upload/file-upload.d.ts +8 -1
  157. package/dist/components/upload/file-upload.js +132 -100
  158. package/dist/components/upload/image-upload.cjs +1 -1
  159. package/dist/components/upload/image-upload.d.ts +5 -1
  160. package/dist/components/upload/image-upload.js +34 -9
  161. package/dist/index.cjs +1 -1
  162. package/dist/index.js +31 -31
  163. package/dist/public-component-surface.cjs +1 -1
  164. package/dist/public-component-surface.js +15 -0
  165. package/dist/showcase/component-api-schema.cjs +1 -1
  166. package/dist/showcase/component-api-schema.js +187 -10
  167. package/dist/showcase/fallback.cjs +3 -3
  168. package/dist/showcase/fallback.js +221 -243
  169. package/dist/showcase/premium/alert/showcase.cjs +1 -1
  170. package/dist/showcase/premium/alert/showcase.js +1 -0
  171. package/dist/showcase/premium/app-sidebar/showcase.cjs +1 -1
  172. package/dist/showcase/premium/app-sidebar/showcase.js +1 -0
  173. package/dist/showcase/premium/badge/showcase.cjs +1 -1
  174. package/dist/showcase/premium/badge/showcase.js +7 -0
  175. package/dist/showcase/premium/badge/types.d.ts +1 -1
  176. package/dist/showcase/premium/breadcrumbs/showcase.cjs +1 -1
  177. package/dist/showcase/premium/breadcrumbs/showcase.js +12 -1
  178. package/dist/showcase/premium/button/mock.cjs +1 -4
  179. package/dist/showcase/premium/button/mock.js +1 -1
  180. package/dist/showcase/premium/button/showcase.cjs +1 -1
  181. package/dist/showcase/premium/button/showcase.js +2 -2
  182. package/dist/showcase/premium/card/showcase.cjs +1 -1
  183. package/dist/showcase/premium/card/showcase.js +96 -47
  184. package/dist/showcase/premium/carousel/showcase.cjs +1 -1
  185. package/dist/showcase/premium/carousel/showcase.js +76 -49
  186. package/dist/showcase/premium/command-bar/showcase.cjs +1 -1
  187. package/dist/showcase/premium/command-bar/showcase.js +2 -0
  188. package/dist/showcase/premium/data-table/mock.cjs +12 -11
  189. package/dist/showcase/premium/data-table/mock.js +1 -1
  190. package/dist/showcase/premium/file-upload/showcase.cjs +1 -1
  191. package/dist/showcase/premium/file-upload/showcase.js +25 -4
  192. package/dist/showcase/premium/image-upload/showcase.cjs +1 -1
  193. package/dist/showcase/premium/image-upload/showcase.js +4 -1
  194. package/dist/showcase/premium/index.cjs +1 -1
  195. package/dist/showcase/premium/index.js +396 -402
  196. package/dist/showcase/premium/loading-state/showcase.cjs +1 -1
  197. package/dist/showcase/premium/loading-state/showcase.js +3 -1
  198. package/dist/showcase/premium/metric-grid/showcase.cjs +1 -1
  199. package/dist/showcase/premium/metric-grid/showcase.js +96 -28
  200. package/dist/showcase/premium/notification-center/showcase.cjs +1 -1
  201. package/dist/showcase/premium/notification-center/showcase.js +7 -3
  202. package/dist/showcase/premium/page-state/showcase.cjs +1 -1
  203. package/dist/showcase/premium/page-state/showcase.js +5 -1
  204. package/dist/showcase/premium/pagination/showcase.cjs +1 -1
  205. package/dist/showcase/premium/pagination/showcase.js +15 -2
  206. package/dist/showcase/premium/popover/showcase.cjs +1 -1
  207. package/dist/showcase/premium/popover/showcase.js +85 -50
  208. package/dist/showcase/premium/radio-group/showcase.cjs +1 -1
  209. package/dist/showcase/premium/radio-group/showcase.js +27 -4
  210. package/dist/showcase/premium/right-click-menu/showcase.cjs +1 -1
  211. package/dist/showcase/premium/right-click-menu/showcase.js +56 -43
  212. package/dist/showcase/premium/segmented-control/showcase.cjs +1 -1
  213. package/dist/showcase/premium/segmented-control/showcase.js +1 -0
  214. package/dist/showcase/premium/select/data.cjs +1 -1
  215. package/dist/showcase/premium/select/data.js +69 -34
  216. package/dist/showcase/premium/select/mock.cjs +19 -6
  217. package/dist/showcase/premium/select/mock.js +3 -2
  218. package/dist/showcase/premium/select/showcase.cjs +1 -1
  219. package/dist/showcase/premium/select/showcase.js +43 -18
  220. package/dist/showcase/premium/select/types.d.ts +3 -0
  221. package/dist/showcase/premium/statistic/showcase.cjs +1 -1
  222. package/dist/showcase/premium/statistic/showcase.js +57 -25
  223. package/dist/showcase/premium/switch/showcase.cjs +1 -1
  224. package/dist/showcase/premium/switch/showcase.js +25 -14
  225. package/dist/showcase/premium/tabs/showcase.cjs +1 -1
  226. package/dist/showcase/premium/tabs/showcase.js +171 -48
  227. package/dist/showcase/premium/textarea/mock.cjs +12 -4
  228. package/dist/showcase/premium/textarea/mock.js +1 -1
  229. package/dist/showcase/premium/textarea/showcase.cjs +1 -1
  230. package/dist/showcase/premium/textarea/showcase.js +8 -3
  231. package/dist/showcase/premium/toast/showcase.cjs +1 -1
  232. package/dist/showcase/premium/toast/showcase.js +32 -6
  233. package/dist/showcase/premium/types.d.ts +1 -1
  234. package/dist/showcase/registry-quality.cjs +1 -1
  235. package/dist/showcase/registry-quality.js +1 -0
  236. package/dist/showcase/render-registry-preview.cjs +1 -1
  237. package/dist/showcase/render-registry-preview.js +57 -79
  238. package/dist/showcase/site-data.cjs +1 -1
  239. package/dist/showcase/site-data.js +60 -21
  240. package/dist/showcase/tembro-registry.json.cjs +1 -1
  241. package/dist/showcase/tembro-registry.json.js +34 -20
  242. package/dist/showcase/types.d.ts +1 -1
  243. package/package.json +1 -1
  244. package/packages/cli/dist/index.cjs +31 -31
  245. package/packages/cli/vendor/src/components/calendar/calendar.tsx +59 -50
  246. package/packages/cli/vendor/src/components/calendar/date-range-picker.tsx +7 -4
  247. package/packages/cli/vendor/src/components/charts/charts.tsx +109 -66
  248. package/packages/cli/vendor/src/components/charts/progress-ring.tsx +37 -26
  249. package/packages/cli/vendor/src/components/data-table/data-table-column-visibility-menu.tsx +41 -22
  250. package/packages/cli/vendor/src/components/data-table/data-table-toolbar.tsx +8 -6
  251. package/packages/cli/vendor/src/components/display/carousel.tsx +84 -3
  252. package/packages/cli/vendor/src/components/display/code-block.tsx +22 -2
  253. package/packages/cli/vendor/src/components/display/delta-badge.tsx +11 -11
  254. package/packages/cli/vendor/src/components/display/kanban.tsx +103 -57
  255. package/packages/cli/vendor/src/components/display/metric-grid.tsx +16 -13
  256. package/packages/cli/vendor/src/components/display/qr-code.tsx +17 -15
  257. package/packages/cli/vendor/src/components/display/status-legend.tsx +11 -8
  258. package/packages/cli/vendor/src/components/display/tag.tsx +39 -21
  259. package/packages/cli/vendor/src/components/display/tree-view.tsx +221 -84
  260. package/packages/cli/vendor/src/components/display/trend-card.tsx +6 -40
  261. package/packages/cli/vendor/src/components/feedback/alert.tsx +3 -1
  262. package/packages/cli/vendor/src/components/feedback/loading-state.tsx +33 -17
  263. package/packages/cli/vendor/src/components/feedback/page-state.tsx +8 -7
  264. package/packages/cli/vendor/src/components/form/form-field-shell.tsx +37 -8
  265. package/packages/cli/vendor/src/components/form/form-input.tsx +2 -0
  266. package/packages/cli/vendor/src/components/form/form-select.tsx +2 -0
  267. package/packages/cli/vendor/src/components/form/form-switch.tsx +9 -3
  268. package/packages/cli/vendor/src/components/form/form-textarea.tsx +6 -2
  269. package/packages/cli/vendor/src/components/layout/app-sidebar.tsx +3 -1
  270. package/packages/cli/vendor/src/components/layout/breadcrumbs.tsx +3 -1
  271. package/packages/cli/vendor/src/components/modern/calendar-scheduler.tsx +28 -13
  272. package/packages/cli/vendor/src/components/modern/dual-list-picker.tsx +103 -35
  273. package/packages/cli/vendor/src/components/modern/rich-text-editor.tsx +25 -22
  274. package/packages/cli/vendor/src/components/modern/tour.tsx +47 -29
  275. package/packages/cli/vendor/src/components/navigation/command-bar.tsx +6 -0
  276. package/packages/cli/vendor/src/components/navigation/demo.tsx +0 -1
  277. package/packages/cli/vendor/src/components/navigation/nav-tabs.tsx +38 -29
  278. package/packages/cli/vendor/src/components/navigation/page-tabs.tsx +35 -23
  279. package/packages/cli/vendor/src/components/navigation/pagination.tsx +65 -31
  280. package/packages/cli/vendor/src/components/notifications/notification-center.tsx +64 -39
  281. package/packages/cli/vendor/src/components/notifications/toast.tsx +23 -21
  282. package/packages/cli/vendor/src/components/overlay/alert-dialog.tsx +1 -1
  283. package/packages/cli/vendor/src/components/overlay/confirm-dialog.tsx +45 -22
  284. package/packages/cli/vendor/src/components/overlay/drawer.tsx +18 -5
  285. package/packages/cli/vendor/src/components/ui/accordion/index.tsx +4 -0
  286. package/packages/cli/vendor/src/components/ui/badge/index.tsx +2 -1
  287. package/packages/cli/vendor/src/components/ui/button/index.tsx +11 -5
  288. package/packages/cli/vendor/src/components/ui/dialog/index.tsx +2 -1
  289. package/packages/cli/vendor/src/components/ui/hover-card.tsx +54 -28
  290. package/packages/cli/vendor/src/components/ui/popover/index.tsx +10 -8
  291. package/packages/cli/vendor/src/components/ui/radio-group/index.tsx +55 -6
  292. package/packages/cli/vendor/src/components/ui/right-click-menu/index.tsx +120 -9
  293. package/packages/cli/vendor/src/components/ui/segmented-control/index.tsx +29 -3
  294. package/packages/cli/vendor/src/components/ui/select/index.tsx +64 -31
  295. package/packages/cli/vendor/src/components/ui/switch/index.tsx +71 -6
  296. package/packages/cli/vendor/src/components/ui/tabs/index.tsx +22 -6
  297. package/packages/cli/vendor/src/components/ui/textarea/index.tsx +105 -15
  298. package/packages/cli/vendor/src/components/ui/textarea.tsx +2 -0
  299. package/packages/cli/vendor/src/components/ui/tooltip/index.tsx +67 -22
  300. package/packages/cli/vendor/src/components/upload/file-upload.tsx +120 -57
  301. package/packages/cli/vendor/src/components/upload/image-upload.tsx +71 -24
  302. package/packages/cli/vendor/src/public-component-surface.ts +3 -0
  303. package/packages/cli/vendor/src/showcase/component-api-schema.ts +79 -41
  304. package/packages/cli/vendor/src/showcase/fallback.tsx +4 -19
  305. package/packages/cli/vendor/src/showcase/premium/alert/showcase.tsx +1 -0
  306. package/packages/cli/vendor/src/showcase/premium/app-sidebar/showcase.tsx +1 -0
  307. package/packages/cli/vendor/src/showcase/premium/badge/showcase.tsx +4 -2
  308. package/packages/cli/vendor/src/showcase/premium/badge/types.ts +1 -1
  309. package/packages/cli/vendor/src/showcase/premium/breadcrumbs/showcase.tsx +3 -1
  310. package/packages/cli/vendor/src/showcase/premium/button/mock.ts +2 -5
  311. package/packages/cli/vendor/src/showcase/premium/button/showcase.tsx +2 -2
  312. package/packages/cli/vendor/src/showcase/premium/card/showcase.tsx +26 -1
  313. package/packages/cli/vendor/src/showcase/premium/carousel/showcase.tsx +19 -3
  314. package/packages/cli/vendor/src/showcase/premium/command-bar/showcase.tsx +1 -1
  315. package/packages/cli/vendor/src/showcase/premium/data-table/mock.ts +26 -25
  316. package/packages/cli/vendor/src/showcase/premium/file-upload/showcase.tsx +21 -1
  317. package/packages/cli/vendor/src/showcase/premium/image-upload/showcase.tsx +4 -1
  318. package/packages/cli/vendor/src/showcase/premium/index.ts +0 -2
  319. package/packages/cli/vendor/src/showcase/premium/loading-state/showcase.tsx +1 -1
  320. package/packages/cli/vendor/src/showcase/premium/metric-grid/showcase.tsx +36 -4
  321. package/packages/cli/vendor/src/showcase/premium/notification-center/showcase.tsx +4 -3
  322. package/packages/cli/vendor/src/showcase/premium/page-state/showcase.tsx +1 -0
  323. package/packages/cli/vendor/src/showcase/premium/pagination/showcase.tsx +13 -1
  324. package/packages/cli/vendor/src/showcase/premium/popover/showcase.tsx +27 -11
  325. package/packages/cli/vendor/src/showcase/premium/radio-group/showcase.tsx +13 -1
  326. package/packages/cli/vendor/src/showcase/premium/right-click-menu/showcase.tsx +8 -5
  327. package/packages/cli/vendor/src/showcase/premium/segmented-control/showcase.tsx +1 -0
  328. package/packages/cli/vendor/src/showcase/premium/select/data.ts +12 -3
  329. package/packages/cli/vendor/src/showcase/premium/select/mock.ts +4 -4
  330. package/packages/cli/vendor/src/showcase/premium/select/showcase.tsx +22 -1
  331. package/packages/cli/vendor/src/showcase/premium/select/types.ts +3 -0
  332. package/packages/cli/vendor/src/showcase/premium/statistic/showcase.tsx +10 -1
  333. package/packages/cli/vendor/src/showcase/premium/switch/showcase.tsx +15 -6
  334. package/packages/cli/vendor/src/showcase/premium/tabs/showcase.tsx +48 -1
  335. package/packages/cli/vendor/src/showcase/premium/textarea/mock.ts +12 -4
  336. package/packages/cli/vendor/src/showcase/premium/textarea/showcase.tsx +5 -0
  337. package/packages/cli/vendor/src/showcase/premium/toast/showcase.tsx +17 -1
  338. package/packages/cli/vendor/src/showcase/premium/types.ts +1 -1
  339. package/packages/cli/vendor/src/showcase/registry-quality.ts +3 -2
  340. package/packages/cli/vendor/src/showcase/render-registry-preview.tsx +0 -15
  341. package/packages/cli/vendor/src/showcase/site-data.tsx +21 -15
  342. package/packages/cli/vendor/src/showcase/tembro-registry.json +42 -20
  343. package/packages/cli/vendor/src/showcase/types.ts +1 -1
  344. package/registry.json +18 -6
@@ -1,5 +1,6 @@
1
- import * as React from "react"
2
-
1
+ import * as React from "react"
2
+ import { XIcon } from "lucide-react"
3
+
3
4
  import { cn, stopInteractivePropagation } from "@/lib/utils"
4
5
 
5
6
  export type TagTone = "neutral" | "info" | "success" | "warning" | "danger"
@@ -8,10 +9,11 @@ export type TagSize = "sm" | "default" | "lg"
8
9
  export type TagProps = React.ComponentProps<"span"> & {
9
10
  tone?: TagTone
10
11
  size?: TagSize
11
- removable?: boolean
12
- selected?: boolean
13
- onRemove?: () => void
14
- }
12
+ removable?: boolean
13
+ selected?: boolean
14
+ onRemove?: () => void
15
+ removeLabel?: string
16
+ }
15
17
 
16
18
  export type TagGroupProps = React.ComponentProps<"div"> & {
17
19
  gap?: "sm" | "default" | "lg"
@@ -31,29 +33,45 @@ const sizeClassName: Record<TagSize, string> = {
31
33
  lg: "h-8 px-3 text-sm",
32
34
  }
33
35
 
34
- function Tag({ tone = "neutral", size = "default", removable, selected, onRemove, className, children, ...props }: TagProps) {
36
+ function Tag({ tone = "neutral", size = "default", removable, selected, onRemove, removeLabel = "Remove tag", className, children, onKeyDown, ...props }: TagProps) {
37
+ const handleRemove = (event: React.SyntheticEvent) => {
38
+ stopInteractivePropagation(event)
39
+ onRemove?.()
40
+ }
41
+
35
42
  return (
36
- <span
37
- data-slot="tag"
38
- data-tone={tone}
39
- data-selected={selected ? "true" : undefined}
40
- className={cn("inline-flex items-center gap-1 rounded-full border font-medium transition-colors", toneClassName[tone], sizeClassName[size], selected && "ring-2 ring-ring ring-offset-1", className)}
41
- {...props}
42
- >
43
+ <span
44
+ data-slot="tag"
45
+ data-tone={tone}
46
+ data-selected={selected ? "true" : undefined}
47
+ tabIndex={removable ? 0 : props.tabIndex}
48
+ className={cn(
49
+ "inline-flex items-center gap-1.5 rounded-full border font-medium transition-colors outline-none focus-visible:ring-3 focus-visible:ring-ring/35",
50
+ toneClassName[tone],
51
+ sizeClassName[size],
52
+ selected && "ring-2 ring-ring ring-offset-1",
53
+ className
54
+ )}
55
+ onKeyDown={(event) => {
56
+ if (removable && (event.key === "Backspace" || event.key === "Delete")) {
57
+ event.preventDefault()
58
+ onRemove?.()
59
+ }
60
+ onKeyDown?.(event)
61
+ }}
62
+ {...props}
63
+ >
43
64
  <span>{children}</span>
44
65
  {removable && (
45
66
  <button
46
67
  type="button"
47
- aria-label="Remove tag"
48
- className="-mr-1 inline-flex size-4 items-center justify-center rounded-full hover:bg-black/10 dark:hover:bg-white/10"
49
- onClick={(event) => {
50
- stopInteractivePropagation(event)
51
- onRemove?.()
52
- }}
68
+ aria-label={removeLabel}
69
+ className="-mr-1 inline-flex size-4 shrink-0 items-center justify-center rounded-full opacity-80 transition hover:bg-black/10 hover:opacity-100 focus-visible:ring-2 focus-visible:ring-current/35 dark:hover:bg-white/10"
70
+ onClick={handleRemove}
53
71
  onMouseDown={stopInteractivePropagation}
54
72
  onDoubleClick={stopInteractivePropagation}
55
73
  >
56
- ×
74
+ <XIcon className="size-3" />
57
75
  </button>
58
76
  )}
59
77
  </span>
@@ -1,77 +1,190 @@
1
- import * as React from "react"
2
- import { ChevronRightIcon } from "lucide-react"
1
+ import * as React from "react"
2
+ import { ChevronRightIcon } from "lucide-react"
3
3
 
4
4
  import { cn } from "@/lib/utils"
5
5
 
6
- export type TreeViewItem = {
7
- key: string
8
- label: React.ReactNode
9
- icon?: React.ReactNode
10
- extra?: React.ReactNode
11
- children?: TreeViewItem[]
12
- disabled?: boolean
13
- }
14
-
6
+ export type TreeViewItem = {
7
+ key: string
8
+ label: React.ReactNode
9
+ searchText?: string
10
+ icon?: React.ReactNode
11
+ extra?: React.ReactNode
12
+ children?: TreeViewItem[]
13
+ loading?: boolean
14
+ disabled?: boolean
15
+ }
16
+
15
17
  export type TreeViewProps = Omit<React.ComponentProps<"div">, "onSelect"> & {
16
18
  items: TreeViewItem[]
17
19
  defaultExpandedKeys?: string[]
18
20
  expandedKeys?: string[]
19
- onExpandedKeysChange?: (keys: string[]) => void
20
- selectedKey?: string
21
- onSelect?: (item: TreeViewItem) => void
22
- }
23
-
24
- function TreeView({ items, defaultExpandedKeys = [], expandedKeys, onExpandedKeysChange, selectedKey, onSelect, className, ...props }: TreeViewProps) {
25
- const [internalExpandedKeys, setInternalExpandedKeys] = React.useState(defaultExpandedKeys)
26
- const currentExpandedKeys = expandedKeys ?? internalExpandedKeys
27
-
28
- const setExpandedKeys = (nextKeys: string[]) => {
29
- if (expandedKeys === undefined) setInternalExpandedKeys(nextKeys)
30
- onExpandedKeysChange?.(nextKeys)
31
- }
32
-
33
- const toggle = (key: string) => {
34
- setExpandedKeys(currentExpandedKeys.includes(key) ? currentExpandedKeys.filter((item) => item !== key) : [...currentExpandedKeys, key])
35
- }
36
-
37
- return (
38
- <div data-slot="tree-view" role="tree" className={cn("grid gap-1 text-sm", className)} {...props}>
39
- {items.map((item) => (
40
- <TreeViewNode
41
- key={item.key}
42
- item={item}
43
- level={1}
44
- expandedKeys={currentExpandedKeys}
45
- selectedKey={selectedKey}
46
- onToggle={toggle}
47
- onSelect={onSelect}
48
- />
49
- ))}
50
- </div>
51
- )
52
- }
21
+ onExpandedKeysChange?: (keys: string[]) => void
22
+ selectedKey?: string
23
+ onSelect?: (item: TreeViewItem) => void
24
+ checkedKeys?: string[]
25
+ defaultCheckedKeys?: string[]
26
+ onCheckedKeysChange?: (keys: string[]) => void
27
+ checkable?: boolean
28
+ searchQuery?: string
29
+ onLoadChildren?: (item: TreeViewItem) => void | Promise<void>
30
+ }
31
+
32
+ function TreeView({
33
+ items,
34
+ defaultExpandedKeys = [],
35
+ expandedKeys,
36
+ onExpandedKeysChange,
37
+ selectedKey,
38
+ onSelect,
39
+ checkedKeys,
40
+ defaultCheckedKeys = [],
41
+ onCheckedKeysChange,
42
+ checkable = false,
43
+ searchQuery,
44
+ onLoadChildren,
45
+ className,
46
+ ...props
47
+ }: TreeViewProps) {
48
+ const [internalExpandedKeys, setInternalExpandedKeys] = React.useState(defaultExpandedKeys)
49
+ const [internalCheckedKeys, setInternalCheckedKeys] = React.useState(defaultCheckedKeys)
50
+ const currentExpandedKeys = expandedKeys ?? internalExpandedKeys
51
+ const currentCheckedKeys = checkedKeys ?? internalCheckedKeys
52
+ const query = searchQuery?.trim().toLowerCase()
53
+
54
+ const setExpandedKeys = React.useCallback((nextKeys: string[]) => {
55
+ if (expandedKeys === undefined) setInternalExpandedKeys(nextKeys)
56
+ onExpandedKeysChange?.(nextKeys)
57
+ }, [expandedKeys, onExpandedKeysChange])
58
+
59
+ const setCheckedKeyState = (key: string, checked: boolean) => {
60
+ const nextKeys = checked
61
+ ? [...new Set([...currentCheckedKeys, key])]
62
+ : currentCheckedKeys.filter((item) => item !== key)
63
+ if (checkedKeys === undefined) setInternalCheckedKeys(nextKeys)
64
+ onCheckedKeysChange?.(nextKeys)
65
+ }
66
+
67
+ const toggle = React.useCallback((key: string) => {
68
+ setExpandedKeys(currentExpandedKeys.includes(key) ? currentExpandedKeys.filter((item) => item !== key) : [...currentExpandedKeys, key])
69
+ }, [currentExpandedKeys, setExpandedKeys])
70
+
71
+ const visibleKeys = React.useMemo(() => flattenVisibleTreeKeys(items, currentExpandedKeys, query), [items, currentExpandedKeys, query])
72
+
73
+ return (
74
+ <div
75
+ data-slot="tree-view"
76
+ role="tree"
77
+ className={cn("grid gap-1 text-sm", className)}
78
+ onKeyDown={(event) => {
79
+ const activeKey = (event.target as HTMLElement).dataset.treeNodeKey
80
+ if (!activeKey) return
81
+ const activeIndex = visibleKeys.indexOf(activeKey)
82
+ const focusKey = (key: string | undefined) => {
83
+ if (!key) return
84
+ const escapedKey = key.replace(/\\/g, "\\\\").replace(/"/g, '\\"')
85
+ event.currentTarget.querySelector<HTMLElement>(`[data-tree-node-key="${escapedKey}"]`)?.focus()
86
+ }
87
+
88
+ if (event.key === "ArrowDown") {
89
+ event.preventDefault()
90
+ focusKey(visibleKeys[Math.min(activeIndex + 1, visibleKeys.length - 1)])
91
+ } else if (event.key === "ArrowUp") {
92
+ event.preventDefault()
93
+ focusKey(visibleKeys[Math.max(activeIndex - 1, 0)])
94
+ } else if (event.key === "ArrowRight") {
95
+ event.preventDefault()
96
+ if (!currentExpandedKeys.includes(activeKey)) toggle(activeKey)
97
+ } else if (event.key === "ArrowLeft") {
98
+ event.preventDefault()
99
+ if (currentExpandedKeys.includes(activeKey)) toggle(activeKey)
100
+ }
101
+ props.onKeyDown?.(event)
102
+ }}
103
+ {...props}
104
+ >
105
+ {items.map((item) => (
106
+ <TreeViewNode
107
+ key={item.key}
108
+ item={item}
109
+ level={1}
110
+ expandedKeys={currentExpandedKeys}
111
+ selectedKey={selectedKey}
112
+ onToggle={toggle}
113
+ onSelect={onSelect}
114
+ checkedKeys={currentCheckedKeys}
115
+ onCheckedChange={setCheckedKeyState}
116
+ checkable={checkable}
117
+ searchQuery={query}
118
+ onLoadChildren={onLoadChildren}
119
+ />
120
+ ))}
121
+ </div>
122
+ )
123
+ }
124
+
125
+ function flattenVisibleTreeKeys(items: TreeViewItem[], expandedKeys: string[], searchQuery?: string): string[] {
126
+ return items.flatMap((item) => {
127
+ if (!matchesTreeSearch(item, searchQuery)) return []
128
+ return [item.key, ...(item.children && expandedKeys.includes(item.key) ? flattenVisibleTreeKeys(item.children, expandedKeys, searchQuery) : [])]
129
+ })
130
+ }
131
+
132
+ function getTreeItemSearchText(item: TreeViewItem) {
133
+ return item.searchText ?? (typeof item.label === "string" ? item.label : item.key)
134
+ }
135
+
136
+ function matchesTreeSearch(item: TreeViewItem, searchQuery?: string): boolean {
137
+ if (!searchQuery) return true
138
+ return getTreeItemSearchText(item).toLowerCase().includes(searchQuery) || Boolean(item.children?.some((child) => matchesTreeSearch(child, searchQuery)))
139
+ }
140
+
141
+ function renderHighlightedLabel(label: React.ReactNode, searchQuery?: string) {
142
+ if (!searchQuery || typeof label !== "string") return label
143
+ const index = label.toLowerCase().indexOf(searchQuery)
144
+ if (index < 0) return label
145
+ return (
146
+ <>
147
+ {label.slice(0, index)}
148
+ <mark className="rounded bg-primary/15 px-0.5 text-foreground">{label.slice(index, index + searchQuery.length)}</mark>
149
+ {label.slice(index + searchQuery.length)}
150
+ </>
151
+ )
152
+ }
53
153
 
54
154
  function TreeViewNode({
55
155
  item,
56
156
  level,
57
157
  expandedKeys,
58
158
  selectedKey,
59
- onToggle,
60
- onSelect,
61
- }: {
62
- item: TreeViewItem
63
- level: number
64
- expandedKeys: string[]
65
- selectedKey?: string
66
- onToggle: (key: string) => void
67
- onSelect?: (item: TreeViewItem) => void
68
- }) {
69
- const hasChildren = Boolean(item.children?.length)
70
- const expanded = expandedKeys.includes(item.key)
71
- const selected = selectedKey === item.key
72
-
73
- return (
74
- <div data-slot="tree-node" role="treeitem" aria-expanded={hasChildren ? expanded : undefined} aria-selected={selected || undefined}>
159
+ onToggle,
160
+ onSelect,
161
+ checkedKeys,
162
+ onCheckedChange,
163
+ checkable,
164
+ searchQuery,
165
+ onLoadChildren,
166
+ }: {
167
+ item: TreeViewItem
168
+ level: number
169
+ expandedKeys: string[]
170
+ selectedKey?: string
171
+ onToggle: (key: string) => void
172
+ onSelect?: (item: TreeViewItem) => void
173
+ checkedKeys: string[]
174
+ onCheckedChange: (key: string, checked: boolean) => void
175
+ checkable: boolean
176
+ searchQuery?: string
177
+ onLoadChildren?: (item: TreeViewItem) => void | Promise<void>
178
+ }) {
179
+ if (!matchesTreeSearch(item, searchQuery)) return null
180
+
181
+ const hasChildren = Boolean(item.children?.length) || Boolean(onLoadChildren)
182
+ const expanded = expandedKeys.includes(item.key)
183
+ const selected = selectedKey === item.key
184
+ const checked = checkedKeys.includes(item.key)
185
+
186
+ return (
187
+ <div data-slot="tree-node" role="treeitem" aria-expanded={hasChildren ? expanded : undefined} aria-selected={selected || undefined}>
75
188
  <div
76
189
  className={cn(
77
190
  "flex items-center gap-1 rounded-md px-2 py-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground",
@@ -80,34 +193,58 @@ function TreeViewNode({
80
193
  )}
81
194
  style={{ paddingLeft: `${level * 0.75}rem` }}
82
195
  >
83
- <button
84
- type="button"
85
- aria-label={expanded ? "Collapse" : "Expand"}
86
- className={cn("flex size-5 items-center justify-center rounded-sm", !hasChildren && "invisible")}
87
- onClick={() => onToggle(item.key)}
88
- >
89
- <ChevronRightIcon className={cn("size-4 transition-transform", expanded && "rotate-90")} />
90
- </button>
91
- {item.icon}
92
- <button type="button" className="min-w-0 flex-1 truncate text-left" onClick={() => onSelect?.(item)}>
93
- {item.label}
94
- </button>
95
- {item.extra}
96
- </div>
97
- {hasChildren && expanded && (
98
- <div role="group" className="grid gap-1">
99
- {item.children?.map((child) => (
196
+ <button
197
+ type="button"
198
+ aria-label={expanded ? "Collapse" : "Expand"}
199
+ className={cn("flex size-5 items-center justify-center rounded-sm", !hasChildren && "invisible")}
200
+ onClick={() => {
201
+ if (!expanded && !item.children?.length) void onLoadChildren?.(item)
202
+ onToggle(item.key)
203
+ }}
204
+ >
205
+ <ChevronRightIcon className={cn("size-4 transition-transform", expanded && "rotate-90")} />
206
+ </button>
207
+ {checkable && (
208
+ <input
209
+ type="checkbox"
210
+ className="size-4 rounded border-border accent-primary"
211
+ checked={checked}
212
+ disabled={item.disabled}
213
+ aria-label={`Select ${getTreeItemSearchText(item)}`}
214
+ onChange={(event) => onCheckedChange(item.key, event.currentTarget.checked)}
215
+ />
216
+ )}
217
+ {item.icon}
218
+ <button
219
+ type="button"
220
+ data-tree-node-key={item.key}
221
+ className="min-w-0 flex-1 truncate rounded-sm text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40"
222
+ disabled={item.disabled}
223
+ onClick={() => onSelect?.(item)}
224
+ >
225
+ {renderHighlightedLabel(item.label, searchQuery)}
226
+ </button>
227
+ {item.loading ? <span className="text-xs text-muted-foreground">Loading...</span> : item.extra}
228
+ </div>
229
+ {hasChildren && expanded && (
230
+ <div role="group" className="grid gap-1">
231
+ {item.children?.map((child) => (
100
232
  <TreeViewNode
101
233
  key={child.key}
102
234
  item={child}
103
235
  level={level + 1}
104
236
  expandedKeys={expandedKeys}
105
- selectedKey={selectedKey}
106
- onToggle={onToggle}
107
- onSelect={onSelect}
108
- />
109
- ))}
110
- </div>
237
+ selectedKey={selectedKey}
238
+ onToggle={onToggle}
239
+ onSelect={onSelect}
240
+ checkedKeys={checkedKeys}
241
+ onCheckedChange={onCheckedChange}
242
+ checkable={checkable}
243
+ searchQuery={searchQuery}
244
+ onLoadChildren={onLoadChildren}
245
+ />
246
+ ))}
247
+ </div>
111
248
  )}
112
249
  </div>
113
250
  )
@@ -2,6 +2,7 @@ import * as React from "react"
2
2
 
3
3
  import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
4
4
  import { DeltaBadge } from "@/components/display/delta-badge"
5
+ import { Sparkline } from "@/components/charts/charts"
5
6
  import { cn } from "@/lib/utils"
6
7
 
7
8
  export type TrendCardProps = React.ComponentProps<typeof Card> & {
@@ -25,45 +26,6 @@ function TrendCard({
25
26
  className,
26
27
  ...props
27
28
  }: TrendCardProps) {
28
- // Simple SVG sparkline generator
29
- const renderSparkline = () => {
30
- if (!sparkline || sparkline.length < 2) return null
31
-
32
- const min = Math.min(...sparkline)
33
- const max = Math.max(...sparkline)
34
- const range = max - min || 1
35
-
36
- const points = sparkline.map((val, i) => {
37
- const x = (i / (sparkline.length - 1)) * 100
38
- const y = 100 - ((val - min) / range) * 100
39
- return `${x},${y}`
40
- }).join(" ")
41
-
42
- const strokeColor =
43
- trend === "up"
44
- ? "var(--aui-success,var(--primary))"
45
- : trend === "down"
46
- ? "var(--destructive)"
47
- : "var(--muted-foreground)"
48
-
49
- return (
50
- <div className="absolute bottom-0 left-0 right-0 h-12 overflow-hidden opacity-20 pointer-events-none">
51
- <svg viewBox="0 0 100 100" preserveAspectRatio="none" className="w-full h-full stroke-2">
52
- <polyline
53
- points={points}
54
- fill="none"
55
- stroke={strokeColor}
56
- vectorEffect="non-scaling-stroke"
57
- />
58
- <polygon
59
- points={`0,100 ${points} 100,100`}
60
- fill={`color-mix(in srgb, ${strokeColor} 20%, transparent)`}
61
- />
62
- </svg>
63
- </div>
64
- )
65
- }
66
-
67
29
  return (
68
30
  <Card data-slot="trend-card" className={cn("relative overflow-hidden", className)} {...props}>
69
31
  <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
@@ -83,7 +45,11 @@ function TrendCard({
83
45
  </p>
84
46
  )}
85
47
  </CardContent>
86
- {renderSparkline()}
48
+ {sparkline && sparkline.length > 1 ? (
49
+ <div className="px-6 pb-4">
50
+ <Sparkline values={sparkline} positive={trend !== "down"} />
51
+ </div>
52
+ ) : null}
87
53
  </Card>
88
54
  )
89
55
  }
@@ -16,6 +16,7 @@ export type AlertProps = React.ComponentProps<"div"> & {
16
16
  dismissible?: boolean
17
17
  dismissLabel?: string
18
18
  onDismiss?: () => void
19
+ actionsAlign?: "start" | "end"
19
20
  }
20
21
 
21
22
  const alertToneClassName: Record<AlertTone, Record<NonNullable<AlertProps["variant"]>, string>> = {
@@ -78,6 +79,7 @@ function Alert({
78
79
  dismissible = false,
79
80
  dismissLabel = "Dismiss alert",
80
81
  onDismiss,
82
+ actionsAlign = "end",
81
83
  className,
82
84
  children,
83
85
  ...props
@@ -113,7 +115,7 @@ function Alert({
113
115
  )}
114
116
  </div>
115
117
  {(action || dismissible) ? (
116
- <div data-slot="alert-action" className="flex shrink-0 items-start gap-2">
118
+ <div data-slot="alert-action" className={cn("flex shrink-0 items-start gap-2", actionsAlign === "start" && "order-[-1] mr-2")}>
117
119
  {action}
118
120
  {dismissible ? (
119
121
  <button
@@ -3,20 +3,24 @@ import { Loader2Icon } from "lucide-react"
3
3
 
4
4
  import { cn } from "@/lib/utils"
5
5
 
6
- export type LoadingStateProps = React.ComponentProps<"div"> & {
7
- label?: React.ReactNode
8
- description?: React.ReactNode
9
- icon?: React.ReactNode
10
- }
11
-
12
- function LoadingState({
13
- className,
14
- label = "Loading...",
15
- description,
16
- icon,
17
- ...props
18
- }: LoadingStateProps) {
19
- return (
6
+ export type LoadingStateProps = React.ComponentProps<"div"> & {
7
+ label?: React.ReactNode
8
+ description?: React.ReactNode
9
+ icon?: React.ReactNode
10
+ variant?: "spinner" | "skeleton" | "progress"
11
+ progress?: number
12
+ }
13
+
14
+ function LoadingState({
15
+ className,
16
+ label = "Loading...",
17
+ description,
18
+ icon,
19
+ variant = "spinner",
20
+ progress,
21
+ ...props
22
+ }: LoadingStateProps) {
23
+ return (
20
24
  <div
21
25
  data-slot="loading-state"
22
26
  className={cn(
@@ -25,12 +29,24 @@ function LoadingState({
25
29
  )}
26
30
  {...props}
27
31
  >
28
- <div className="flex size-12 items-center justify-center rounded-full border border-border/70 bg-background/92 shadow-[0_1px_0_rgba(255,255,255,0.08)]">
29
- {icon ?? <Loader2Icon className="size-5 animate-spin" />}
30
- </div>
32
+ {variant === "skeleton" ? (
33
+ <div className="grid gap-3">
34
+ <div className="h-4 w-32 animate-pulse rounded bg-muted" />
35
+ <div className="h-24 w-64 animate-pulse rounded-[min(var(--radius-xl),16px)] bg-muted/70" />
36
+ </div>
37
+ ) : (
38
+ <div className="flex size-12 items-center justify-center rounded-full border border-border/70 bg-background/92 shadow-[0_1px_0_rgba(255,255,255,0.08)]">
39
+ {icon ?? <Loader2Icon className="size-5 animate-spin" />}
40
+ </div>
41
+ )}
31
42
  <div className="grid gap-1.5">
32
43
  {label && <div className="text-base font-semibold tracking-tight text-foreground">{label}</div>}
33
44
  {description && <p className="max-w-sm text-sm leading-6">{description}</p>}
45
+ {variant === "progress" && typeof progress === "number" ? (
46
+ <div className="mx-auto mt-2 h-2 w-full max-w-xs overflow-hidden rounded-full bg-muted/80">
47
+ <div className="h-full rounded-full bg-primary" style={{ width: `${Math.min(Math.max(progress, 0), 100)}%` }} />
48
+ </div>
49
+ ) : null}
34
50
  </div>
35
51
  </div>
36
52
  )
@@ -11,9 +11,10 @@ export type PageStateProps = Omit<React.ComponentProps<"div">, "title"> & {
11
11
  title?: React.ReactNode
12
12
  description?: React.ReactNode
13
13
  icon?: React.ReactNode
14
- action?: React.ReactNode
15
- compact?: boolean
16
- }
14
+ action?: React.ReactNode
15
+ extra?: React.ReactNode
16
+ compact?: boolean
17
+ }
17
18
 
18
19
  function defaultPageStateIcon(tone: PageStateTone) {
19
20
  switch (tone) {
@@ -30,7 +31,7 @@ function defaultPageStateIcon(tone: PageStateTone) {
30
31
  }
31
32
  }
32
33
 
33
- function PageState({ tone = "empty", title, description, icon, action, compact = false, className, ...props }: PageStateProps) {
34
+ function PageState({ tone = "empty", title, description, icon, action, extra, compact = false, className, ...props }: PageStateProps) {
34
35
  return (
35
36
  <div
36
37
  data-slot="page-state"
@@ -49,10 +50,10 @@ function PageState({ tone = "empty", title, description, icon, action, compact =
49
50
  {title && <div className="text-base font-semibold tracking-tight text-foreground">{title}</div>}
50
51
  {description && <div className="max-w-md text-sm leading-6 text-muted-foreground">{description}</div>}
51
52
  </div>
52
- {action && <div>{action}</div>}
53
+ {(action || extra) ? <div className="flex flex-wrap items-center justify-center gap-2">{action}{extra}</div> : null}
53
54
  </div>
54
- )
55
- }
55
+ )
56
+ }
56
57
 
57
58
  export type InlineStateProps = Omit<PageStateProps, "compact"> & {
58
59
  retryLabel?: React.ReactNode