tembro 2.0.5 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/dist/components/calendar/calendar.cjs +1 -1
  2. package/dist/components/calendar/calendar.d.ts +2 -1
  3. package/dist/components/calendar/calendar.js +126 -122
  4. package/dist/components/calendar/date-range-picker.cjs +1 -1
  5. package/dist/components/calendar/date-range-picker.d.ts +2 -1
  6. package/dist/components/calendar/date-range-picker.js +39 -39
  7. package/dist/components/charts/charts.cjs +1 -1
  8. package/dist/components/charts/charts.d.ts +13 -4
  9. package/dist/components/charts/charts.js +76 -46
  10. package/dist/components/charts/progress-ring.cjs +1 -1
  11. package/dist/components/charts/progress-ring.d.ts +3 -1
  12. package/dist/components/charts/progress-ring.js +11 -10
  13. package/dist/components/data-table/data-table-column-visibility-menu.cjs +1 -1
  14. package/dist/components/data-table/data-table-column-visibility-menu.d.ts +4 -1
  15. package/dist/components/data-table/data-table-column-visibility-menu.js +36 -8
  16. package/dist/components/data-table/data-table-pagination.cjs +1 -1
  17. package/dist/components/data-table/data-table-pagination.js +4 -4
  18. package/dist/components/data-table/data-table-toolbar.cjs +1 -1
  19. package/dist/components/data-table/data-table-toolbar.js +12 -13
  20. package/dist/components/data-table/data-table.cjs +1 -1
  21. package/dist/components/data-table/data-table.d.ts +2 -2
  22. package/dist/components/data-table/data-table.js +2 -1
  23. package/dist/components/display/carousel.cjs +1 -1
  24. package/dist/components/display/carousel.d.ts +15 -1
  25. package/dist/components/display/carousel.js +128 -86
  26. package/dist/components/display/code-block.cjs +2 -2
  27. package/dist/components/display/code-block.d.ts +2 -1
  28. package/dist/components/display/code-block.js +17 -12
  29. package/dist/components/display/delta-badge.cjs +1 -1
  30. package/dist/components/display/delta-badge.d.ts +2 -1
  31. package/dist/components/display/delta-badge.js +11 -7
  32. package/dist/components/display/kanban.cjs +1 -1
  33. package/dist/components/display/kanban.d.ts +4 -1
  34. package/dist/components/display/kanban.js +60 -33
  35. package/dist/components/display/metric-grid.cjs +1 -1
  36. package/dist/components/display/metric-grid.d.ts +1 -0
  37. package/dist/components/display/metric-grid.js +1 -1
  38. package/dist/components/display/qr-code.cjs +1 -1
  39. package/dist/components/display/qr-code.d.ts +2 -1
  40. package/dist/components/display/qr-code.js +19 -16
  41. package/dist/components/display/smart-card.d.ts +1 -1
  42. package/dist/components/display/status-legend.d.ts +1 -1
  43. package/dist/components/display/tag.cjs +1 -1
  44. package/dist/components/display/tag.d.ts +2 -1
  45. package/dist/components/display/tag.js +28 -22
  46. package/dist/components/display/tree-view.cjs +1 -1
  47. package/dist/components/display/tree-view.d.ts +9 -1
  48. package/dist/components/display/tree-view.js +104 -40
  49. package/dist/components/display/trend-card.cjs +1 -1
  50. package/dist/components/display/trend-card.js +27 -41
  51. package/dist/components/feedback/alert.cjs +1 -1
  52. package/dist/components/feedback/alert.d.ts +2 -1
  53. package/dist/components/feedback/alert.js +6 -6
  54. package/dist/components/feedback/loading-state.cjs +1 -1
  55. package/dist/components/feedback/loading-state.d.ts +3 -1
  56. package/dist/components/feedback/loading-state.js +23 -10
  57. package/dist/components/feedback/page-state.cjs +1 -1
  58. package/dist/components/feedback/page-state.d.ts +2 -1
  59. package/dist/components/feedback/page-state.js +7 -4
  60. package/dist/components/form/form-field-shell.cjs +1 -1
  61. package/dist/components/form/form-field-shell.d.ts +4 -2
  62. package/dist/components/form/form-field-shell.js +57 -41
  63. package/dist/components/form/form-input.cjs +1 -1
  64. package/dist/components/form/form-input.d.ts +3 -4
  65. package/dist/components/form/form-input.js +259 -257
  66. package/dist/components/form/form-select.cjs +1 -1
  67. package/dist/components/form/form-select.d.ts +2 -2
  68. package/dist/components/form/form-select.js +8 -6
  69. package/dist/components/form/form-switch.cjs +1 -1
  70. package/dist/components/form/form-switch.d.ts +1 -1
  71. package/dist/components/form/form-switch.js +58 -54
  72. package/dist/components/form/form-textarea.cjs +1 -1
  73. package/dist/components/form/form-textarea.d.ts +1 -1
  74. package/dist/components/form/form-textarea.js +29 -27
  75. package/dist/components/inputs/async-select.d.ts +3 -0
  76. package/dist/components/inputs/search-input.d.ts +3 -0
  77. package/dist/components/inputs/simple-select.cjs +1 -1
  78. package/dist/components/inputs/simple-select.d.ts +10 -32
  79. package/dist/components/inputs/simple-select.js +5 -101
  80. package/dist/components/layout/app-sidebar.cjs +1 -1
  81. package/dist/components/layout/app-sidebar.d.ts +1 -0
  82. package/dist/components/layout/app-sidebar.js +36 -36
  83. package/dist/components/layout/breadcrumbs.cjs +1 -1
  84. package/dist/components/layout/breadcrumbs.d.ts +2 -1
  85. package/dist/components/layout/breadcrumbs.js +7 -7
  86. package/dist/components/modern/calendar-scheduler.cjs +1 -1
  87. package/dist/components/modern/calendar-scheduler.d.ts +5 -1
  88. package/dist/components/modern/calendar-scheduler.js +47 -28
  89. package/dist/components/modern/dual-list-picker.cjs +1 -1
  90. package/dist/components/modern/dual-list-picker.d.ts +5 -1
  91. package/dist/components/modern/dual-list-picker.js +81 -23
  92. package/dist/components/modern/rich-text-editor.cjs +1 -1
  93. package/dist/components/modern/rich-text-editor.d.ts +3 -1
  94. package/dist/components/modern/rich-text-editor.js +12 -9
  95. package/dist/components/modern/tour.cjs +1 -1
  96. package/dist/components/modern/tour.d.ts +5 -1
  97. package/dist/components/modern/tour.js +57 -35
  98. package/dist/components/navigation/command-bar.cjs +1 -1
  99. package/dist/components/navigation/command-bar.d.ts +3 -1
  100. package/dist/components/navigation/command-bar.js +10 -7
  101. package/dist/components/navigation/demo.cjs +1 -1
  102. package/dist/components/navigation/demo.js +0 -1
  103. package/dist/components/navigation/nav-tabs.cjs +1 -1
  104. package/dist/components/navigation/nav-tabs.js +39 -27
  105. package/dist/components/navigation/page-tabs.cjs +1 -1
  106. package/dist/components/navigation/page-tabs.js +41 -30
  107. package/dist/components/navigation/pagination.cjs +1 -1
  108. package/dist/components/navigation/pagination.d.ts +7 -1
  109. package/dist/components/navigation/pagination.js +48 -25
  110. package/dist/components/notifications/notification-center.cjs +1 -1
  111. package/dist/components/notifications/notification-center.d.ts +3 -1
  112. package/dist/components/notifications/notification-center.js +56 -38
  113. package/dist/components/notifications/toast.cjs +1 -1
  114. package/dist/components/notifications/toast.d.ts +1 -0
  115. package/dist/components/notifications/toast.js +4 -0
  116. package/dist/components/overlay/alert-dialog.cjs +1 -1
  117. package/dist/components/overlay/alert-dialog.js +1 -1
  118. package/dist/components/overlay/confirm-dialog.cjs +1 -1
  119. package/dist/components/overlay/confirm-dialog.d.ts +4 -2
  120. package/dist/components/overlay/confirm-dialog.js +31 -22
  121. package/dist/components/overlay/drawer.cjs +1 -1
  122. package/dist/components/overlay/drawer.d.ts +3 -1
  123. package/dist/components/overlay/drawer.js +24 -16
  124. package/dist/components/ui/accordion/index.d.ts +4 -0
  125. package/dist/components/ui/badge/index.cjs +1 -1
  126. package/dist/components/ui/badge/index.d.ts +1 -1
  127. package/dist/components/ui/badge/index.js +2 -1
  128. package/dist/components/ui/button/index.cjs +1 -1
  129. package/dist/components/ui/button/index.d.ts +2 -1
  130. package/dist/components/ui/button/index.js +13 -10
  131. package/dist/components/ui/card/index.cjs +1 -1
  132. package/dist/components/ui/card/index.d.ts +13 -2
  133. package/dist/components/ui/card/index.js +74 -49
  134. package/dist/components/ui/dialog/index.cjs +1 -1
  135. package/dist/components/ui/dialog/index.js +2 -1
  136. package/dist/components/ui/hover-card.cjs +1 -1
  137. package/dist/components/ui/hover-card.d.ts +11 -3
  138. package/dist/components/ui/hover-card.js +29 -24
  139. package/dist/components/ui/input/index.cjs +1 -1
  140. package/dist/components/ui/input/index.d.ts +9 -1
  141. package/dist/components/ui/input/index.js +63 -30
  142. package/dist/components/ui/popover/index.cjs +1 -1
  143. package/dist/components/ui/popover/index.d.ts +2 -2
  144. package/dist/components/ui/popover/index.js +6 -5
  145. package/dist/components/ui/radio-group/index.cjs +1 -1
  146. package/dist/components/ui/radio-group/index.d.ts +5 -1
  147. package/dist/components/ui/radio-group/index.js +50 -16
  148. package/dist/components/ui/right-click-menu/index.cjs +1 -1
  149. package/dist/components/ui/right-click-menu/index.d.ts +5 -1
  150. package/dist/components/ui/right-click-menu/index.js +77 -23
  151. package/dist/components/ui/segmented-control/index.cjs +1 -1
  152. package/dist/components/ui/segmented-control/index.d.ts +2 -1
  153. package/dist/components/ui/segmented-control/index.js +23 -11
  154. package/dist/components/ui/select/index.cjs +1 -1
  155. package/dist/components/ui/select/index.d.ts +40 -1
  156. package/dist/components/ui/select/index.js +159 -48
  157. package/dist/components/ui/switch/index.cjs +1 -1
  158. package/dist/components/ui/switch/index.d.ts +18 -0
  159. package/dist/components/ui/switch/index.js +47 -17
  160. package/dist/components/ui/tabs/index.cjs +1 -1
  161. package/dist/components/ui/tabs/index.d.ts +14 -4
  162. package/dist/components/ui/tabs/index.js +11 -8
  163. package/dist/components/ui/textarea/index.cjs +1 -1
  164. package/dist/components/ui/textarea/index.d.ts +10 -2
  165. package/dist/components/ui/textarea/index.js +37 -8
  166. package/dist/components/ui/textarea.cjs +1 -0
  167. package/dist/components/ui/textarea.d.ts +1 -0
  168. package/dist/components/ui/textarea.js +2 -0
  169. package/dist/components/ui/tooltip/index.cjs +1 -1
  170. package/dist/components/ui/tooltip/index.d.ts +11 -3
  171. package/dist/components/ui/tooltip/index.js +41 -20
  172. package/dist/components/upload/file-upload.cjs +1 -1
  173. package/dist/components/upload/file-upload.d.ts +8 -1
  174. package/dist/components/upload/file-upload.js +132 -100
  175. package/dist/components/upload/image-upload.cjs +1 -1
  176. package/dist/components/upload/image-upload.d.ts +5 -1
  177. package/dist/components/upload/image-upload.js +34 -9
  178. package/dist/index.cjs +1 -1
  179. package/dist/index.js +31 -31
  180. package/dist/public-component-surface.cjs +1 -1
  181. package/dist/public-component-surface.js +15 -0
  182. package/dist/showcase/component-api-schema.cjs +1 -1
  183. package/dist/showcase/component-api-schema.js +187 -10
  184. package/dist/showcase/create-demo.cjs +5 -4
  185. package/dist/showcase/create-demo.js +2 -2
  186. package/dist/showcase/fallback.cjs +3 -3
  187. package/dist/showcase/fallback.js +221 -243
  188. package/dist/showcase/premium/alert/showcase.cjs +1 -1
  189. package/dist/showcase/premium/alert/showcase.js +1 -0
  190. package/dist/showcase/premium/app-sidebar/showcase.cjs +1 -1
  191. package/dist/showcase/premium/app-sidebar/showcase.js +1 -0
  192. package/dist/showcase/premium/badge/showcase.cjs +1 -1
  193. package/dist/showcase/premium/badge/showcase.js +7 -0
  194. package/dist/showcase/premium/badge/types.d.ts +1 -1
  195. package/dist/showcase/premium/breadcrumbs/showcase.cjs +1 -1
  196. package/dist/showcase/premium/breadcrumbs/showcase.js +12 -1
  197. package/dist/showcase/premium/button/mock.cjs +1 -4
  198. package/dist/showcase/premium/button/mock.js +1 -1
  199. package/dist/showcase/premium/button/showcase.cjs +1 -1
  200. package/dist/showcase/premium/button/showcase.js +2 -2
  201. package/dist/showcase/premium/card/showcase.cjs +1 -1
  202. package/dist/showcase/premium/card/showcase.js +96 -47
  203. package/dist/showcase/premium/carousel/showcase.cjs +1 -1
  204. package/dist/showcase/premium/carousel/showcase.js +76 -49
  205. package/dist/showcase/premium/command-bar/showcase.cjs +1 -1
  206. package/dist/showcase/premium/command-bar/showcase.js +2 -0
  207. package/dist/showcase/premium/data-table/mock.cjs +12 -11
  208. package/dist/showcase/premium/data-table/mock.js +1 -1
  209. package/dist/showcase/premium/data-table/showcase.cjs +1 -1
  210. package/dist/showcase/premium/data-table/showcase.js +1 -1
  211. package/dist/showcase/premium/data-table-parts/showcase.cjs +1 -1
  212. package/dist/showcase/premium/data-table-parts/showcase.js +3 -1
  213. package/dist/showcase/premium/file-upload/showcase.cjs +1 -1
  214. package/dist/showcase/premium/file-upload/showcase.js +25 -4
  215. package/dist/showcase/premium/image-upload/showcase.cjs +1 -1
  216. package/dist/showcase/premium/image-upload/showcase.js +4 -1
  217. package/dist/showcase/premium/index.cjs +1 -1
  218. package/dist/showcase/premium/index.js +396 -402
  219. package/dist/showcase/premium/loading-state/showcase.cjs +1 -1
  220. package/dist/showcase/premium/loading-state/showcase.js +3 -1
  221. package/dist/showcase/premium/metric-grid/showcase.cjs +1 -1
  222. package/dist/showcase/premium/metric-grid/showcase.js +96 -28
  223. package/dist/showcase/premium/notification-center/showcase.cjs +1 -1
  224. package/dist/showcase/premium/notification-center/showcase.js +7 -3
  225. package/dist/showcase/premium/page-state/showcase.cjs +1 -1
  226. package/dist/showcase/premium/page-state/showcase.js +5 -1
  227. package/dist/showcase/premium/pagination/showcase.cjs +1 -1
  228. package/dist/showcase/premium/pagination/showcase.js +15 -2
  229. package/dist/showcase/premium/popover/showcase.cjs +1 -1
  230. package/dist/showcase/premium/popover/showcase.js +85 -50
  231. package/dist/showcase/premium/radio-group/showcase.cjs +1 -1
  232. package/dist/showcase/premium/radio-group/showcase.js +27 -4
  233. package/dist/showcase/premium/right-click-menu/showcase.cjs +1 -1
  234. package/dist/showcase/premium/right-click-menu/showcase.js +56 -43
  235. package/dist/showcase/premium/segmented-control/showcase.cjs +1 -1
  236. package/dist/showcase/premium/segmented-control/showcase.js +1 -0
  237. package/dist/showcase/premium/select/data.cjs +1 -1
  238. package/dist/showcase/premium/select/data.js +69 -34
  239. package/dist/showcase/premium/select/mock.cjs +20 -8
  240. package/dist/showcase/premium/select/mock.js +3 -2
  241. package/dist/showcase/premium/select/showcase.cjs +1 -1
  242. package/dist/showcase/premium/select/showcase.js +101 -86
  243. package/dist/showcase/premium/select/types.d.ts +3 -0
  244. package/dist/showcase/premium/statistic/showcase.cjs +1 -1
  245. package/dist/showcase/premium/statistic/showcase.js +57 -25
  246. package/dist/showcase/premium/switch/showcase.cjs +1 -1
  247. package/dist/showcase/premium/switch/showcase.js +25 -14
  248. package/dist/showcase/premium/tabs/showcase.cjs +1 -1
  249. package/dist/showcase/premium/tabs/showcase.js +171 -48
  250. package/dist/showcase/premium/textarea/mock.cjs +12 -4
  251. package/dist/showcase/premium/textarea/mock.js +1 -1
  252. package/dist/showcase/premium/textarea/showcase.cjs +1 -1
  253. package/dist/showcase/premium/textarea/showcase.js +8 -3
  254. package/dist/showcase/premium/toast/showcase.cjs +1 -1
  255. package/dist/showcase/premium/toast/showcase.js +32 -6
  256. package/dist/showcase/premium/types.d.ts +1 -1
  257. package/dist/showcase/registry-quality.cjs +1 -1
  258. package/dist/showcase/registry-quality.js +1 -0
  259. package/dist/showcase/registry-specific.cjs +1 -1
  260. package/dist/showcase/registry-specific.js +78 -74
  261. package/dist/showcase/render-registry-preview.cjs +1 -1
  262. package/dist/showcase/render-registry-preview.js +90 -108
  263. package/dist/showcase/site-data.cjs +1 -1
  264. package/dist/showcase/site-data.js +60 -21
  265. package/dist/showcase/tembro-registry.json.cjs +1 -1
  266. package/dist/showcase/tembro-registry.json.js +34 -20
  267. package/dist/showcase/types.d.ts +1 -1
  268. package/package.json +1 -1
  269. package/packages/cli/dist/index.cjs +31 -31
  270. package/packages/cli/vendor/src/components/calendar/calendar.tsx +59 -50
  271. package/packages/cli/vendor/src/components/calendar/date-range-picker.tsx +7 -4
  272. package/packages/cli/vendor/src/components/charts/charts.tsx +109 -66
  273. package/packages/cli/vendor/src/components/charts/progress-ring.tsx +37 -26
  274. package/packages/cli/vendor/src/components/data-table/data-table-column-visibility-menu.tsx +41 -22
  275. package/packages/cli/vendor/src/components/data-table/data-table-pagination.tsx +7 -7
  276. package/packages/cli/vendor/src/components/data-table/data-table-toolbar.tsx +8 -6
  277. package/packages/cli/vendor/src/components/data-table/data-table.tsx +21 -20
  278. package/packages/cli/vendor/src/components/display/carousel.tsx +102 -9
  279. package/packages/cli/vendor/src/components/display/code-block.tsx +22 -2
  280. package/packages/cli/vendor/src/components/display/delta-badge.tsx +11 -11
  281. package/packages/cli/vendor/src/components/display/kanban.tsx +103 -57
  282. package/packages/cli/vendor/src/components/display/metric-grid.tsx +16 -13
  283. package/packages/cli/vendor/src/components/display/qr-code.tsx +17 -15
  284. package/packages/cli/vendor/src/components/display/smart-card.tsx +1 -1
  285. package/packages/cli/vendor/src/components/display/status-legend.tsx +1 -1
  286. package/packages/cli/vendor/src/components/display/tag.tsx +39 -21
  287. package/packages/cli/vendor/src/components/display/tree-view.tsx +221 -84
  288. package/packages/cli/vendor/src/components/display/trend-card.tsx +6 -40
  289. package/packages/cli/vendor/src/components/feedback/alert.tsx +3 -1
  290. package/packages/cli/vendor/src/components/feedback/loading-state.tsx +33 -17
  291. package/packages/cli/vendor/src/components/feedback/page-state.tsx +8 -7
  292. package/packages/cli/vendor/src/components/form/form-field-shell.tsx +37 -8
  293. package/packages/cli/vendor/src/components/form/form-input.tsx +11 -12
  294. package/packages/cli/vendor/src/components/form/form-select.tsx +6 -4
  295. package/packages/cli/vendor/src/components/form/form-switch.tsx +9 -3
  296. package/packages/cli/vendor/src/components/form/form-textarea.tsx +6 -2
  297. package/packages/cli/vendor/src/components/inputs/async-select.tsx +11 -8
  298. package/packages/cli/vendor/src/components/inputs/search-input.tsx +5 -2
  299. package/packages/cli/vendor/src/components/inputs/simple-select.tsx +20 -190
  300. package/packages/cli/vendor/src/components/layout/app-sidebar.tsx +3 -1
  301. package/packages/cli/vendor/src/components/layout/breadcrumbs.tsx +3 -1
  302. package/packages/cli/vendor/src/components/modern/calendar-scheduler.tsx +28 -13
  303. package/packages/cli/vendor/src/components/modern/dual-list-picker.tsx +103 -35
  304. package/packages/cli/vendor/src/components/modern/rich-text-editor.tsx +25 -22
  305. package/packages/cli/vendor/src/components/modern/tour.tsx +47 -29
  306. package/packages/cli/vendor/src/components/navigation/command-bar.tsx +6 -0
  307. package/packages/cli/vendor/src/components/navigation/demo.tsx +0 -1
  308. package/packages/cli/vendor/src/components/navigation/nav-tabs.tsx +38 -29
  309. package/packages/cli/vendor/src/components/navigation/page-tabs.tsx +35 -23
  310. package/packages/cli/vendor/src/components/navigation/pagination.tsx +65 -31
  311. package/packages/cli/vendor/src/components/notifications/notification-center.tsx +64 -39
  312. package/packages/cli/vendor/src/components/notifications/toast.tsx +23 -21
  313. package/packages/cli/vendor/src/components/overlay/alert-dialog.tsx +1 -1
  314. package/packages/cli/vendor/src/components/overlay/confirm-dialog.tsx +45 -22
  315. package/packages/cli/vendor/src/components/overlay/drawer.tsx +18 -5
  316. package/packages/cli/vendor/src/components/ui/accordion/index.tsx +4 -0
  317. package/packages/cli/vendor/src/components/ui/badge/index.tsx +2 -1
  318. package/packages/cli/vendor/src/components/ui/button/index.tsx +11 -5
  319. package/packages/cli/vendor/src/components/ui/card/index.tsx +95 -25
  320. package/packages/cli/vendor/src/components/ui/dialog/index.tsx +2 -1
  321. package/packages/cli/vendor/src/components/ui/hover-card.tsx +54 -28
  322. package/packages/cli/vendor/src/components/ui/input/index.tsx +98 -0
  323. package/packages/cli/vendor/src/components/ui/popover/index.tsx +10 -8
  324. package/packages/cli/vendor/src/components/ui/radio-group/index.tsx +55 -6
  325. package/packages/cli/vendor/src/components/ui/right-click-menu/index.tsx +120 -9
  326. package/packages/cli/vendor/src/components/ui/segmented-control/index.tsx +29 -3
  327. package/packages/cli/vendor/src/components/ui/select/index.tsx +260 -34
  328. package/packages/cli/vendor/src/components/ui/switch/index.tsx +71 -6
  329. package/packages/cli/vendor/src/components/ui/tabs/index.tsx +22 -6
  330. package/packages/cli/vendor/src/components/ui/textarea/index.tsx +105 -15
  331. package/packages/cli/vendor/src/components/ui/textarea.tsx +2 -0
  332. package/packages/cli/vendor/src/components/ui/tooltip/index.tsx +67 -22
  333. package/packages/cli/vendor/src/components/upload/file-upload.tsx +120 -57
  334. package/packages/cli/vendor/src/components/upload/image-upload.tsx +71 -24
  335. package/packages/cli/vendor/src/public-component-surface.ts +3 -0
  336. package/packages/cli/vendor/src/showcase/component-api-schema.ts +79 -41
  337. package/packages/cli/vendor/src/showcase/create-demo.tsx +16 -15
  338. package/packages/cli/vendor/src/showcase/fallback.tsx +4 -19
  339. package/packages/cli/vendor/src/showcase/premium/alert/showcase.tsx +1 -0
  340. package/packages/cli/vendor/src/showcase/premium/app-sidebar/showcase.tsx +1 -0
  341. package/packages/cli/vendor/src/showcase/premium/badge/showcase.tsx +4 -2
  342. package/packages/cli/vendor/src/showcase/premium/badge/types.ts +1 -1
  343. package/packages/cli/vendor/src/showcase/premium/breadcrumbs/showcase.tsx +3 -1
  344. package/packages/cli/vendor/src/showcase/premium/button/mock.ts +2 -5
  345. package/packages/cli/vendor/src/showcase/premium/button/showcase.tsx +2 -2
  346. package/packages/cli/vendor/src/showcase/premium/card/showcase.tsx +26 -1
  347. package/packages/cli/vendor/src/showcase/premium/carousel/showcase.tsx +19 -3
  348. package/packages/cli/vendor/src/showcase/premium/command-bar/showcase.tsx +1 -1
  349. package/packages/cli/vendor/src/showcase/premium/data-table/mock.ts +26 -25
  350. package/packages/cli/vendor/src/showcase/premium/data-table/showcase.tsx +3 -3
  351. package/packages/cli/vendor/src/showcase/premium/data-table-parts/showcase.tsx +3 -3
  352. package/packages/cli/vendor/src/showcase/premium/file-upload/showcase.tsx +21 -1
  353. package/packages/cli/vendor/src/showcase/premium/image-upload/showcase.tsx +4 -1
  354. package/packages/cli/vendor/src/showcase/premium/index.ts +0 -2
  355. package/packages/cli/vendor/src/showcase/premium/loading-state/showcase.tsx +1 -1
  356. package/packages/cli/vendor/src/showcase/premium/metric-grid/showcase.tsx +36 -4
  357. package/packages/cli/vendor/src/showcase/premium/notification-center/showcase.tsx +4 -3
  358. package/packages/cli/vendor/src/showcase/premium/page-state/showcase.tsx +1 -0
  359. package/packages/cli/vendor/src/showcase/premium/pagination/showcase.tsx +13 -1
  360. package/packages/cli/vendor/src/showcase/premium/popover/showcase.tsx +27 -11
  361. package/packages/cli/vendor/src/showcase/premium/radio-group/showcase.tsx +13 -1
  362. package/packages/cli/vendor/src/showcase/premium/right-click-menu/showcase.tsx +8 -5
  363. package/packages/cli/vendor/src/showcase/premium/segmented-control/showcase.tsx +1 -0
  364. package/packages/cli/vendor/src/showcase/premium/select/data.ts +12 -3
  365. package/packages/cli/vendor/src/showcase/premium/select/mock.ts +4 -4
  366. package/packages/cli/vendor/src/showcase/premium/select/showcase.tsx +35 -22
  367. package/packages/cli/vendor/src/showcase/premium/select/types.ts +3 -0
  368. package/packages/cli/vendor/src/showcase/premium/statistic/showcase.tsx +10 -1
  369. package/packages/cli/vendor/src/showcase/premium/switch/showcase.tsx +15 -6
  370. package/packages/cli/vendor/src/showcase/premium/tabs/showcase.tsx +48 -1
  371. package/packages/cli/vendor/src/showcase/premium/textarea/mock.ts +12 -4
  372. package/packages/cli/vendor/src/showcase/premium/textarea/showcase.tsx +5 -0
  373. package/packages/cli/vendor/src/showcase/premium/toast/showcase.tsx +17 -1
  374. package/packages/cli/vendor/src/showcase/premium/types.ts +1 -1
  375. package/packages/cli/vendor/src/showcase/registry-quality.ts +3 -2
  376. package/packages/cli/vendor/src/showcase/registry-specific.tsx +7 -8
  377. package/packages/cli/vendor/src/showcase/render-registry-preview.tsx +5 -21
  378. package/packages/cli/vendor/src/showcase/site-data.tsx +21 -15
  379. package/packages/cli/vendor/src/showcase/tembro-registry.json +42 -20
  380. package/packages/cli/vendor/src/showcase/types.ts +1 -1
  381. package/registry.json +18 -6
@@ -1,4 +1,4 @@
1
- import { Button, Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger } from "@/index"
1
+ import { Button, Input, Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger } from "@/index"
2
2
 
3
3
  import { popoverDemoItems } from "./data"
4
4
 
@@ -57,16 +57,32 @@ export function PopoverShowcase() {
57
57
  </section>
58
58
 
59
59
  <section className={panelClass}>
60
- <div className="border-y border-[color:var(--aui-divider)]">
61
- {[
62
- "Trigger text should already hint that extra context exists.",
63
- "If users need multiple actions or long reading, move up to a heavier surface.",
64
- "Popover body should stay compact enough to scan in one glance.",
65
- ].map((item) => (
66
- <div key={item} className="border-b border-[color:var(--aui-divider)] py-3 text-sm leading-6 aui-text-muted last:border-b-0">
67
- {item}
68
- </div>
69
- ))}
60
+ <div className="grid gap-5 xl:grid-cols-[0.85fr_1.15fr]">
61
+ <div>
62
+ <p className="text-lg font-semibold aui-text-strong">Inline settings form</p>
63
+ <p className="mt-2 max-w-xl text-sm leading-6 aui-text-muted">
64
+ Short forms fit when they change a local view and can be dismissed without losing page context.
65
+ </p>
66
+ </div>
67
+ <div className="flex justify-start xl:justify-end">
68
+ <Popover>
69
+ <PopoverTrigger render={<Button variant="outline" />}>Edit workspace</PopoverTrigger>
70
+ <PopoverContent align="end" collisionPadding={16}>
71
+ <PopoverHeader>
72
+ <PopoverTitle>Workspace details</PopoverTitle>
73
+ <PopoverDescription>Update the label used in local navigation.</PopoverDescription>
74
+ </PopoverHeader>
75
+ <div className="grid gap-3">
76
+ <Input aria-label="Workspace name" defaultValue="Growth analytics" />
77
+ <Input aria-label="Workspace slug" defaultValue="growth" />
78
+ </div>
79
+ <div className="flex justify-end gap-2">
80
+ <Button type="button" variant="secondary" size="sm">Cancel</Button>
81
+ <Button type="button" size="sm">Save</Button>
82
+ </div>
83
+ </PopoverContent>
84
+ </Popover>
85
+ </div>
70
86
  </div>
71
87
  </section>
72
88
  </div>
@@ -8,7 +8,7 @@ const panelClass =
8
8
  const planOptions = [
9
9
  { value: "starter", label: "Starter", description: "Good for single workspace setup." },
10
10
  { value: "growth", label: "Growth", description: "Adds more seats and team workflows." },
11
- { value: "enterprise", label: "Enterprise", description: "Advanced controls and support." },
11
+ { value: "enterprise", label: "Enterprise", description: "Advanced controls and support.", disabled: true },
12
12
  ] as const
13
13
 
14
14
  export function RadioGroupShowcase() {
@@ -61,6 +61,18 @@ export function RadioGroupShowcase() {
61
61
  ))}
62
62
  </div>
63
63
  </div>
64
+ <div className="mt-5">
65
+ <RadioGroup
66
+ invalid
67
+ defaultValue="card"
68
+ orientation="horizontal"
69
+ options={[
70
+ { value: "card", label: "Card" },
71
+ { value: "bank", label: "Bank" },
72
+ { value: "invoice", label: "Invoice", disabled: true },
73
+ ]}
74
+ />
75
+ </div>
64
76
  </section>
65
77
  </div>
66
78
  )
@@ -1,5 +1,7 @@
1
1
  import * as React from "react"
2
2
 
3
+ import { ArchiveIcon, CopyIcon, PencilIcon, Trash2Icon } from "lucide-react"
4
+
3
5
  import { Badge, Button, RightClickMenu } from "@/index"
4
6
 
5
7
  const panelClass =
@@ -32,13 +34,14 @@ export function RightClickMenuShowcase() {
32
34
  <div className="mt-3">
33
35
  <RightClickMenu
34
36
  items={[
35
- { label: "Rename", onSelect: () => setLastAction("Rename") },
36
- { label: "Duplicate", onSelect: () => setLastAction("Duplicate") },
37
- { label: "Archive", onSelect: () => setLastAction("Archive") },
37
+ { label: "Rename", icon: <PencilIcon />, shortcut: "R", onSelect: () => setLastAction("Rename") },
38
+ { label: "Duplicate", icon: <CopyIcon />, shortcut: "D", onSelect: () => setLastAction("Duplicate") },
39
+ { label: "Archive", icon: <ArchiveIcon />, onSelect: () => setLastAction("Archive") },
40
+ { label: "Remove", icon: <Trash2Icon />, variant: "destructive", onSelect: () => setLastAction("Remove") },
38
41
  ]}
39
42
  >
40
- <div className="rounded-[20px] border border-dashed border-[color:var(--aui-divider)] bg-[color:var(--aui-page-bg)] px-4 py-12 text-center text-sm aui-text-muted">
41
- Right click anywhere in this area
43
+ <div className="rounded-[20px] border border-dashed border-[color:var(--aui-divider)] bg-[color:var(--aui-page-bg)] px-4 py-12 text-center text-sm aui-text-muted" tabIndex={0}>
44
+ Right click, use Shift+F10, or press the context-menu key in this area
42
45
  </div>
43
46
  </RightClickMenu>
44
47
  </div>
@@ -76,6 +76,7 @@ export function SegmentedControlShowcase() {
76
76
  <SegmentedControl
77
77
  size="lg"
78
78
  fullWidth
79
+ equalWidth
79
80
  defaultValue="filters"
80
81
  options={[
81
82
  { value: "filters", label: "Filters", icon: <SlidersHorizontalIcon className="size-4" /> },
@@ -5,8 +5,8 @@ export const selectDemoGroups: SelectDemoGroup[] = [
5
5
  title: "Plan picker",
6
6
  options: [
7
7
  { value: "starter", label: "Starter" },
8
- { value: "growth", label: "Growth" },
9
- { value: "enterprise", label: "Enterprise" },
8
+ { value: "growth", label: "Growth", description: "25 seats and shared support" },
9
+ { value: "enterprise", label: "Enterprise", description: "Unlimited seats and priority support" },
10
10
  ],
11
11
  },
12
12
  {
@@ -18,4 +18,13 @@ export const selectDemoGroups: SelectDemoGroup[] = [
18
18
  { value: "draft", label: "Draft" },
19
19
  ],
20
20
  },
21
- ]
21
+ {
22
+ title: "Grouped workspace routing",
23
+ options: [
24
+ { value: "north", label: "North Region", description: "Sales operations", keywords: ["sales"] },
25
+ { value: "south", label: "South Region", description: "Support queue", keywords: ["support"] },
26
+ { value: "billing", label: "Billing Desk", description: "Finance team", keywords: ["finance"] },
27
+ { value: "archive", label: "Archive", description: "Read-only records", disabled: true, keywords: ["disabled"] },
28
+ ],
29
+ },
30
+ ]
@@ -1,9 +1,9 @@
1
1
  import type { ComponentDemoMock } from "../types"
2
2
 
3
3
  export const selectMock: ComponentDemoMock = {
4
- code: `import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from "tembro"\n\nexport function Example() {\n return (\n <Select defaultValue="starter">\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value="starter">Starter</SelectItem>\n </SelectContent>\n </Select>\n )\n}`,
5
- cliCommand: "npx tembro add select",
6
- highlights: ["Primary selection surface", "Controlled selection", "Searchable local flow", "Compact trigger options"],
4
+ code: `import { Select } from "tembro"\n\nconst planGroups = [\n {\n label: "Plans",\n options: [\n { value: "starter", label: "Starter" },\n { value: "growth", label: "Growth", description: "25 seats" },\n { value: "enterprise", label: "Enterprise", description: "Priority support" },\n ],\n },\n]\n\nexport function Example() {\n return (\n <Select\n defaultValue="starter"\n groups={planGroups}\n searchable\n clearable\n emptyMessage="No plan matched"\n />\n )\n}`,
5
+ cliCommand: "npx tembro add select",
6
+ highlights: ["Primary selection surface", "Controlled selection", "Searchable local flow", "Grouped option support", "Compact trigger options"],
7
7
  relatedBlockSlugs: ["crm-dashboard", "users-table", "dashboard-starter"],
8
8
  scenarios: [
9
9
  { title: "Plan picker", description: "Switch between starter, growth and enterprise plans." },
@@ -13,7 +13,7 @@ export const selectMock: ComponentDemoMock = {
13
13
  ],
14
14
  capabilityNotes: [
15
15
  "Start here for most static single-choice flows before reaching for helper members.",
16
- "Supports controlled and uncontrolled selected values plus searchable local filtering.",
16
+ "Supports controlled and uncontrolled selected values, grouped options, clearable state, and searchable local filtering.",
17
17
  "Includes trigger sizing for compact or default density layouts.",
18
18
  "AsyncSelect, AsyncMultiSelect, SimpleSelect, and Combobox should read as related members rather than separate starting points.",
19
19
  ],
@@ -1,6 +1,6 @@
1
1
  import * as React from "react"
2
2
 
3
- import { Badge, Button, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/index"
3
+ import { Badge, Button, Select } from "@/index"
4
4
 
5
5
  import type { ComponentDemoProps } from "../types"
6
6
 
@@ -13,10 +13,12 @@ type SelectMode = "plan" | "density"
13
13
  export function SelectShowcase({ state, setState }: ComponentDemoProps) {
14
14
  const planOptions = selectDemoGroups[0].options
15
15
  const compactOptions = selectDemoGroups[1].options
16
+ const groupedOptions = selectDemoGroups[2].options
16
17
  const selectedValue = state.selectValue ?? planOptions[0].value
17
18
  const selectedPlan = planOptions.find((option) => option.value === selectedValue) ?? planOptions[0]
18
19
  const highlightedPlan = planOptions[1] ?? planOptions[0]
19
20
  const [surface, setSurface] = React.useState<SelectMode>("plan")
21
+ const [workspace, setWorkspace] = React.useState("north")
20
22
 
21
23
  const summaryRows =
22
24
  selectedPlan.value === "enterprise"
@@ -55,7 +57,7 @@ export function SelectShowcase({ state, setState }: ComponentDemoProps) {
55
57
  <Button size="sm" variant={surface === "plan" ? "default" : "outline"} onClick={() => setSurface("plan")}>
56
58
  Default trigger
57
59
  </Button>
58
- <Button size="sm" variant={surface === "density" ? "default" : "outline"} onClick={() => setSurface("density")}>
60
+ <Button size="sm" variant={surface === "density" ? "default" : "outline"} onClick={() => setSurface("density")}>
59
61
  Compact trigger
60
62
  </Button>
61
63
  </div>
@@ -75,31 +77,42 @@ export function SelectShowcase({ state, setState }: ComponentDemoProps) {
75
77
  <p className="text-sm font-medium aui-text-muted">{surface === "plan" ? "Workspace plan" : "Toolbar density"}</p>
76
78
  <div className="mt-3">
77
79
  {surface === "plan" ? (
78
- <Select value={selectedValue} onValueChange={(value: string | null | undefined) => setState({ selectValue: value ?? planOptions[0].value })}>
79
- <SelectTrigger className="w-full">
80
- <SelectValue />
81
- </SelectTrigger>
82
- <SelectContent>
83
- {planOptions.map((option) => (
84
- <SelectItem key={option.value} value={option.value}>{option.label}</SelectItem>
85
- ))}
86
- </SelectContent>
87
- </Select>
80
+ <Select
81
+ value={selectedValue}
82
+ onValueChange={(value) => setState({ selectValue: value ?? planOptions[0].value })}
83
+ options={planOptions}
84
+ triggerClassName="w-full"
85
+ />
88
86
  ) : (
89
- <Select defaultValue={compactOptions[0].value}>
90
- <SelectTrigger size="sm" className="w-full">
91
- <SelectValue />
92
- </SelectTrigger>
93
- <SelectContent>
94
- {compactOptions.map((option) => (
95
- <SelectItem key={option.value} value={option.value}>{option.label}</SelectItem>
96
- ))}
97
- </SelectContent>
98
- </Select>
87
+ <Select
88
+ defaultValue={compactOptions[0].value}
89
+ options={compactOptions}
90
+ size="sm"
91
+ triggerClassName="w-full"
92
+ />
99
93
  )}
100
94
  </div>
101
95
  </div>
102
96
 
97
+ <div className="rounded-[20px] border border-[color:var(--aui-divider)] p-4">
98
+ <p className="text-sm font-medium aui-text-muted">Grouped searchable select</p>
99
+ <div className="mt-3">
100
+ <Select
101
+ value={workspace}
102
+ onValueChange={(value) => setWorkspace(value ?? "north")}
103
+ searchable
104
+ clearable
105
+ placeholder="Choose workspace"
106
+ emptyMessage="No workspace matched"
107
+ groups={[
108
+ { label: "Regions", options: groupedOptions.slice(0, 2) },
109
+ { label: "Operations", options: groupedOptions.slice(2) },
110
+ ]}
111
+ triggerClassName="w-full"
112
+ />
113
+ </div>
114
+ </div>
115
+
103
116
  <div className="grid gap-3 sm:grid-cols-3">
104
117
  {summaryRows.map(([label, value]) => (
105
118
  <div key={label} className="rounded-[18px] border border-[color:var(--aui-divider)] px-4 py-3">
@@ -1,6 +1,9 @@
1
1
  export type SelectDemoOption = {
2
2
  value: string
3
3
  label: string
4
+ description?: string
5
+ disabled?: boolean
6
+ keywords?: string[]
4
7
  }
5
8
 
6
9
  export type SelectDemoGroup = {
@@ -1,4 +1,4 @@
1
- import { Badge, Statistic, StatisticCard, StatisticGrid } from "@/index"
1
+ import { Badge, ProgressRing, Statistic, StatisticCard, StatisticGrid, TrendCard } from "@/index"
2
2
 
3
3
  const panelClass = "border-t border-[color:var(--aui-divider)] py-6"
4
4
 
@@ -43,6 +43,15 @@ export function StatisticShowcase() {
43
43
  </div>
44
44
  </div>
45
45
  </section>
46
+
47
+ <section className={panelClass}>
48
+ <div className="grid gap-6 xl:grid-cols-[1fr_240px]">
49
+ <TrendCard title="Release velocity" value="24" change="+3" trend="up" description="completed this sprint" sparkline={[8, 10, 9, 14, 18, 19, 24]} />
50
+ <div className="rounded-xl border border-[color:var(--aui-divider)] p-4">
51
+ <ProgressRing value={76} label="76%" description="coverage" tone="success" />
52
+ </div>
53
+ </div>
54
+ </section>
46
55
  </div>
47
56
  )
48
57
  }
@@ -29,12 +29,17 @@ export function SwitchShowcase({ state, setState }: ComponentDemoProps) {
29
29
 
30
30
  <div className="mt-6 grid gap-3">
31
31
  {switchDemoRows.map((row, index) => (
32
- <div key={row.title} className={`${panelClass} flex items-center justify-between gap-4`}>
33
- <div>
34
- <p className="font-medium aui-text-strong">{row.title}</p>
35
- <p className="text-sm aui-text-muted">{row.description}</p>
36
- </div>
37
- <Switch checked={index === 0 ? state.switchOn : row.defaultChecked} onCheckedChange={index === 0 ? (switchOn) => setState({ switchOn }) : undefined} defaultChecked={index > 0 ? row.defaultChecked : undefined} />
32
+ <div key={row.title} className={panelClass}>
33
+ <Switch
34
+ label={row.title}
35
+ description={row.description}
36
+ checked={index === 0 ? state.switchOn : row.defaultChecked}
37
+ onCheckedChange={index === 0 ? (switchOn) => setState({ switchOn }) : undefined}
38
+ defaultChecked={index > 0 ? row.defaultChecked : undefined}
39
+ size={index === 0 ? "lg" : "md"}
40
+ labelPlacement="start"
41
+ className="w-full justify-between"
42
+ />
38
43
  </div>
39
44
  ))}
40
45
  </div>
@@ -60,6 +65,10 @@ export function SwitchShowcase({ state, setState }: ComponentDemoProps) {
60
65
  </Button>
61
66
  </div>
62
67
  </div>
68
+ <div className="mt-5 grid gap-3 sm:grid-cols-2">
69
+ <Switch label="Sync in progress" description="Loading disables the control until the request finishes." loading defaultChecked />
70
+ <Switch label="Invalid setting" description="Error state keeps the same field layout." invalid />
71
+ </div>
63
72
  </section>
64
73
  </div>
65
74
  )
@@ -1,3 +1,5 @@
1
+ import { ActivityIcon, BellIcon, FileTextIcon, SettingsIcon, ShieldIcon, UsersIcon } from "lucide-react"
2
+
1
3
  import { Button, Tabs, TabsContent, TabsList, TabsTrigger } from "@/index"
2
4
 
3
5
  import type { ComponentDemoProps } from "../types"
@@ -38,7 +40,7 @@ export function TabsShowcase({ state, setState }: ComponentDemoProps) {
38
40
 
39
41
  <div className={panelClass}>
40
42
  <Tabs value={state.activeTab} onValueChange={(value: string) => setState({ activeTab: value as ComponentDemoProps["state"]["activeTab"] })}>
41
- <TabsList>
43
+ <TabsList overflow="scroll">
42
44
  {tabsDemoPanels.map((panel) => (
43
45
  <TabsTrigger key={panel.value} value={panel.value}>{panel.label}</TabsTrigger>
44
46
  ))}
@@ -51,6 +53,51 @@ export function TabsShowcase({ state, setState }: ComponentDemoProps) {
51
53
  </Tabs>
52
54
  </div>
53
55
 
56
+ <section className={panelClass}>
57
+ <div className="grid gap-6 xl:grid-cols-[0.9fr_1.1fr]">
58
+ <div>
59
+ <p className="text-lg font-semibold aui-text-strong">Variants and overflow</p>
60
+ <p className="mt-2 max-w-xl text-sm leading-6 aui-text-muted">
61
+ The same primitive covers underline navigation, compact density, icon labels, and long mobile tab rows.
62
+ </p>
63
+ </div>
64
+ <div className="grid gap-4">
65
+ <Tabs defaultValue="activity">
66
+ <TabsList variant="underline" overflow="scroll">
67
+ <TabsTrigger variant="underline" value="activity"><ActivityIcon />Activity</TabsTrigger>
68
+ <TabsTrigger variant="underline" value="files"><FileTextIcon />Files</TabsTrigger>
69
+ <TabsTrigger variant="underline" value="members"><UsersIcon />Members</TabsTrigger>
70
+ <TabsTrigger variant="underline" value="security"><ShieldIcon />Security</TabsTrigger>
71
+ <TabsTrigger variant="underline" value="settings"><SettingsIcon />Settings</TabsTrigger>
72
+ </TabsList>
73
+ </Tabs>
74
+ <Tabs defaultValue="compact">
75
+ <TabsList variant="compact" overflow="wrap">
76
+ <TabsTrigger variant="compact" value="compact">Compact</TabsTrigger>
77
+ <TabsTrigger variant="compact" value="alerts"><BellIcon />Alerts</TabsTrigger>
78
+ <TabsTrigger variant="compact" value="audit">Audit</TabsTrigger>
79
+ </TabsList>
80
+ </Tabs>
81
+ <Tabs defaultValue="vertical" orientation="vertical" className="grid gap-3 sm:grid-cols-[180px_1fr]">
82
+ <TabsList variant="pills" overflow="wrap" className="grid">
83
+ <TabsTrigger variant="pills" value="vertical">Vertical</TabsTrigger>
84
+ <TabsTrigger variant="pills" value="pills">Pills</TabsTrigger>
85
+ <TabsTrigger variant="pills" value="overflow">Overflow</TabsTrigger>
86
+ </TabsList>
87
+ <TabsContent value="vertical" className="mt-0 rounded-xl border border-[color:var(--aui-divider)] p-4 text-sm leading-6 aui-text-muted">
88
+ Vertical tabs keep local settings readable when each panel has a larger form.
89
+ </TabsContent>
90
+ <TabsContent value="pills" className="mt-0 rounded-xl border border-[color:var(--aui-divider)] p-4 text-sm leading-6 aui-text-muted">
91
+ Pill tabs carry a stronger selected state for dense dashboards.
92
+ </TabsContent>
93
+ <TabsContent value="overflow" className="mt-0 rounded-xl border border-[color:var(--aui-divider)] p-4 text-sm leading-6 aui-text-muted">
94
+ Scroll overflow keeps long labels accessible on small screens.
95
+ </TabsContent>
96
+ </Tabs>
97
+ </div>
98
+ </div>
99
+ </section>
100
+
54
101
  <section className={panelClass}>
55
102
  <div className="flex flex-col gap-5 lg:flex-row lg:items-center lg:justify-between">
56
103
  <div>
@@ -2,7 +2,7 @@ import type { ComponentDemoMock } from "../types"
2
2
 
3
3
  export const textareaMock: ComponentDemoMock = {
4
4
  code: `import { FormEvent, useState } from "react"
5
- import { Textarea } from "@/index"
5
+ import { Textarea } from "tembro"
6
6
 
7
7
  export function Example() {
8
8
  const [note, setNote] = useState("")
@@ -15,11 +15,19 @@ export function Example() {
15
15
 
16
16
  return (
17
17
  <form onSubmit={submit} className="space-y-3">
18
- <Textarea rows={6} value={note} onChange={(event) => setNote(event.target.value)} placeholder="Write your message..." />
19
- <Textarea rows={4} defaultValue="Internal changelog draft..." />
18
+ <Textarea
19
+ rows={6}
20
+ value={note}
21
+ onValueChange={setNote}
22
+ placeholder="Write your message..."
23
+ helperText="Keep instructions visible below the field."
24
+ errorText={error ? "Please enter at least 10 characters." : undefined}
25
+ maxLength={240}
26
+ showCharacterCount
27
+ />
28
+ <Textarea rows={4} defaultValue="Internal changelog draft..." helperText="Draft copy" />
20
29
  <Textarea readOnly value="Locked review comment" rows={3} />
21
30
  <button type="submit">Submit</button>
22
- {error ? <p className="text-sm text-red-600">Please enter at least 10 characters.</p> : null}
23
31
  </form>
24
32
  )
25
33
  }`,
@@ -39,6 +39,9 @@ export function TextareaShowcase({ state, setState }: ComponentDemoProps) {
39
39
  rows={textareaDemoFields[0].rows}
40
40
  className={`${textareaDemoFields[0].minHeight} resize-y`}
41
41
  placeholder={textareaDemoFields[0].placeholder}
42
+ helperText="Visible helper copy keeps instructions outside the placeholder."
43
+ maxLength={240}
44
+ showCharacterCount
42
45
  />
43
46
  </div>
44
47
  </div>
@@ -83,6 +86,7 @@ export function TextareaShowcase({ state, setState }: ComponentDemoProps) {
83
86
  defaultValue={textareaDemoFields[1].defaultValue}
84
87
  rows={textareaDemoFields[1].rows}
85
88
  className={`${textareaDemoFields[1].minHeight} resize-none`}
89
+ helperText="Uncontrolled draft with stable helper spacing."
86
90
  />
87
91
  </div>
88
92
  </section>
@@ -95,6 +99,7 @@ export function TextareaShowcase({ state, setState }: ComponentDemoProps) {
95
99
  readOnly={textareaDemoFields[2].readOnly}
96
100
  rows={textareaDemoFields[2].rows}
97
101
  className={`${textareaDemoFields[2].minHeight} resize-none opacity-70`}
102
+ errorText={state.textareaValue.trim().length > 0 && state.textareaValue.trim().length < 10 ? "Draft needs at least 10 characters." : undefined}
98
103
  />
99
104
  <p className="text-sm leading-6 aui-text-muted">
100
105
  Read-only textareas should still be easy to scan and copy without looking like disabled, broken, or low-priority content.
@@ -9,7 +9,7 @@ const panelClass =
9
9
 
10
10
  function ToastPlayground({ mode }: { mode: ComponentDemoProps["mode"] }) {
11
11
  const [seed, setSeed] = React.useState(0)
12
- const { addToast, success, warning, error, clearToasts, toasts, dismissToast } = useToast()
12
+ const { addToast, success, warning, error, promise, clearToasts, toasts, dismissToast } = useToast()
13
13
 
14
14
  const addSimple = () => {
15
15
  setSeed((value) => value + 1)
@@ -39,6 +39,19 @@ function ToastPlayground({ mode }: { mode: ComponentDemoProps["mode"] }) {
39
39
  error({ title: "Request failed", description: `Failure occurred while saving item #${seed + 1}` })
40
40
  }
41
41
 
42
+ const runPromiseToast = () => {
43
+ void promise(
44
+ new Promise<string>((resolve) => {
45
+ window.setTimeout(() => resolve("Export ready"), 1200)
46
+ }),
47
+ {
48
+ loading: { title: "Preparing export", description: "Building CSV package.", group: "Export" },
49
+ success: (message) => ({ title: message, description: "Download can start now.", group: "Export" }),
50
+ error: () => ({ title: "Export failed", description: "Retry after refreshing.", group: "Export" }),
51
+ }
52
+ )
53
+ }
54
+
42
55
  return (
43
56
  <div className="space-y-5">
44
57
  <section className="rounded-[24px] border border-[color:var(--aui-divider)] bg-[color:var(--aui-page-bg)] p-5 sm:p-6">
@@ -70,6 +83,9 @@ function ToastPlayground({ mode }: { mode: ComponentDemoProps["mode"] }) {
70
83
  <Button size="sm" variant="outline" onClick={addError}>
71
84
  Error
72
85
  </Button>
86
+ <Button size="sm" variant="outline" onClick={runPromiseToast}>
87
+ Promise
88
+ </Button>
73
89
  <Button size="sm" variant="outline" onClick={clearToasts}>
74
90
  Clear all
75
91
  </Button>
@@ -6,7 +6,7 @@ export type ComponentDemoState = {
6
6
  checked: boolean
7
7
  switchOn: boolean
8
8
  selectValue: string
9
- badgeVariant: "default" | "secondary" | "destructive" | "outline" | "ghost" | "link"
9
+ badgeVariant: "default" | "secondary" | "soft" | "destructive" | "outline" | "ghost" | "link"
10
10
  cardCompact: boolean
11
11
  activeTab: "overview" | "activity" | "settings"
12
12
  }
@@ -50,8 +50,9 @@ export const registryQualityDemoRegistry = createShowcaseDemoRegistry([
50
50
  component("quick-action-grid", "QuickActionGrid", "actions", "Action launcher grid for dense dashboard shortcuts."),
51
51
  component("filter-bar", "FilterBar", "actions", "Search, filters, active-count and reset actions in one toolbar."),
52
52
 
53
- component("app-header", "AppHeader", "layout", "Sticky product header with left, center and right slots."),
54
- component("section-header", "SectionHeader", "layout", "Reusable section title block with actions and metadata."),
53
+ component("app-header", "AppHeader", "layout", "Sticky product header with left, center and right slots."),
54
+ component("app-shell", "AppShell", "layout", "Responsive application shell with sidebar, header and content regions."),
55
+ component("section-header", "SectionHeader", "layout", "Reusable section title block with actions and metadata."),
55
56
  component("stat-card", "StatCard", "layout", "Dashboard stat card for KPI, trend and helper text."),
56
57
 
57
58
  component("alert", "Alert", "feedback", "Inline feedback banner for success, warning, info, and error states."),
@@ -40,10 +40,9 @@ import {
40
40
  RangeSlider,
41
41
  Rating,
42
42
  SavedFilterSelect,
43
- SearchInput,
44
43
  SectionHeader,
45
- SimpleSelect,
46
44
  Slider,
45
+ Select,
47
46
  StatusDot,
48
47
  StatusLegend,
49
48
  Stepper,
@@ -250,7 +249,7 @@ function InputPreview({
250
249
  const onValueChange = (nextValue: string) => setState({ textValue: nextValue })
251
250
 
252
251
  if (slug === "search-input") {
253
- return <SearchInput value={value} onValueChange={onValueChange} resultCount={12} shortcut="Ctrl K" placeholder="Search customers..." />
252
+ return <Input type="search" value={value} onValueChange={onValueChange} resultCount={12} shortcut="Ctrl K" placeholder="Search customers..." />
254
253
  }
255
254
 
256
255
  if (slug === "password-input") {
@@ -280,7 +279,7 @@ function InputPreview({
280
279
  if (slug === "simple-select") {
281
280
  return (
282
281
  <div className="grid gap-4">
283
- <SimpleSelect
282
+ <Select
284
283
  value="private"
285
284
  onValueChange={() => undefined}
286
285
  options={[
@@ -350,7 +349,7 @@ function FormPreview({
350
349
  </label>
351
350
  <label className="grid gap-2">
352
351
  <span className="text-sm font-medium aui-text-strong">Status</span>
353
- <SearchInput value="Active customers" resultCount={7} readOnly />
352
+ <Input type="search" value="Active customers" resultCount={7} readOnly />
354
353
  <span className="text-xs text-emerald-500">Ready to submit</span>
355
354
  </label>
356
355
  </div>
@@ -585,7 +584,7 @@ function ActionsPreview({
585
584
  if (slug === "filter-bar") {
586
585
  return (
587
586
  <FilterBar
588
- search={<SearchInput value={state.textValue} onValueChange={(value) => setState({ textValue: value })} placeholder="Search invoices..." />}
587
+ search={<Input type="search" value={state.textValue} onValueChange={(value) => setState({ textValue: value })} placeholder="Search invoices..." />}
589
588
  activeCount={2}
590
589
  onReset={() => setState({ textValue: "" })}
591
590
  filters={<Button variant="outline" size="sm"><FilterIcon data-icon="inline-start" />Status</Button>}
@@ -701,7 +700,7 @@ function DataTablePartsPreview({ slug }: { slug: string }) {
701
700
  return (
702
701
  <div className="overflow-hidden rounded-xl border border-[color:var(--aui-divider)] bg-[color:var(--aui-page-bg)]">
703
702
  <div className="flex flex-wrap items-center justify-between gap-3 border-b border-[color:var(--aui-divider)] p-3">
704
- <SearchInput value="" placeholder="Search rows..." className="max-w-xs" readOnly />
703
+ <Input type="search" value="" placeholder="Search rows..." className="max-w-xs" readOnly />
705
704
  <div className="flex gap-2">
706
705
  <Button variant="outline" size="sm"><FilterIcon data-icon="inline-start" />Filters</Button>
707
706
  <Button size="sm">Create</Button>
@@ -821,7 +820,7 @@ function PatternsPreview({ slug }: { slug: string }) {
821
820
  description="ResourcePage combines header, stats, filters and sections."
822
821
  actions={<Button size="sm">New customer</Button>}
823
822
  stats={<div className="grid gap-3 sm:grid-cols-2"><StatCard title="Active" value="2,418" trend={{ value: "+8%", tone: "success" }} /><StatCard title="Health" value="94%" trend={{ value: "Stable", tone: "info" }} /></div>}
824
- filters={<FilterBar search={<SearchInput value="" placeholder="Search..." readOnly />} activeCount={1} />}
823
+ filters={<FilterBar search={<Input type="search" value="" placeholder="Search..." readOnly />} activeCount={1} />}
825
824
  >
826
825
  <ResourcePageSection title="Recent activity">
827
826
  <Timeline