tembro 2.0.4 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. package/dist/components/actions/action-menu.cjs +1 -1
  2. package/dist/components/actions/action-menu.d.ts +13 -1
  3. package/dist/components/actions/action-menu.js +87 -61
  4. package/dist/components/actions/button-group.cjs +1 -1
  5. package/dist/components/actions/button-group.d.ts +9 -1
  6. package/dist/components/actions/button-group.js +58 -14
  7. package/dist/components/actions/copy-button.cjs +1 -1
  8. package/dist/components/actions/copy-button.d.ts +2 -1
  9. package/dist/components/actions/copy-button.js +13 -11
  10. package/dist/components/calendar/calendar.cjs +1 -1
  11. package/dist/components/calendar/calendar.d.ts +14 -1
  12. package/dist/components/calendar/calendar.js +207 -128
  13. package/dist/components/calendar/date-picker.cjs +1 -1
  14. package/dist/components/calendar/date-picker.d.ts +3 -1
  15. package/dist/components/calendar/date-picker.js +57 -27
  16. package/dist/components/calendar/date-range-picker.cjs +1 -1
  17. package/dist/components/calendar/date-range-picker.d.ts +10 -1
  18. package/dist/components/calendar/date-range-picker.js +149 -64
  19. package/dist/components/data-table/data-table-pagination.cjs +1 -1
  20. package/dist/components/data-table/data-table-pagination.js +4 -4
  21. package/dist/components/data-table/data-table-toolbar.cjs +1 -1
  22. package/dist/components/data-table/data-table-toolbar.d.ts +5 -1
  23. package/dist/components/data-table/data-table-toolbar.js +36 -23
  24. package/dist/components/data-table/data-table.cjs +1 -1
  25. package/dist/components/data-table/data-table.d.ts +8 -6
  26. package/dist/components/data-table/data-table.js +89 -80
  27. package/dist/components/data-table/demo.cjs +1 -1
  28. package/dist/components/data-table/demo.js +3 -13
  29. package/dist/components/data-table/index.cjs +1 -1
  30. package/dist/components/data-table/index.js +5 -5
  31. package/dist/components/data-table/public.cjs +1 -1
  32. package/dist/components/data-table/public.d.ts +1 -6
  33. package/dist/components/data-table/public.js +7 -12
  34. package/dist/components/display/activity-feed.cjs +1 -1
  35. package/dist/components/display/activity-feed.d.ts +12 -1
  36. package/dist/components/display/activity-feed.js +69 -47
  37. package/dist/components/display/carousel.cjs +1 -1
  38. package/dist/components/display/carousel.d.ts +16 -1
  39. package/dist/components/display/carousel.js +71 -26
  40. package/dist/components/display/code-block.cjs +2 -1
  41. package/dist/components/display/code-block.d.ts +3 -1
  42. package/dist/components/display/code-block.js +33 -19
  43. package/dist/components/display/comparison-card.cjs +1 -1
  44. package/dist/components/display/comparison-card.d.ts +3 -3
  45. package/dist/components/display/comparison-card.js +14 -38
  46. package/dist/components/display/data-state.cjs +1 -1
  47. package/dist/components/display/data-state.d.ts +12 -2
  48. package/dist/components/display/data-state.js +80 -42
  49. package/dist/components/display/demo.cjs +1 -1
  50. package/dist/components/display/demo.js +1 -5
  51. package/dist/components/display/index.cjs +1 -1
  52. package/dist/components/display/index.d.ts +0 -3
  53. package/dist/components/display/index.js +21 -24
  54. package/dist/components/display/smart-card.d.ts +1 -1
  55. package/dist/components/display/status-legend.d.ts +1 -1
  56. package/dist/components/feedback/alert.cjs +1 -1
  57. package/dist/components/feedback/alert.d.ts +6 -1
  58. package/dist/components/feedback/alert.js +49 -19
  59. package/dist/components/feedback/index.cjs +1 -1
  60. package/dist/components/feedback/index.d.ts +0 -2
  61. package/dist/components/feedback/index.js +3 -5
  62. package/dist/components/filters/demo.cjs +1 -1
  63. package/dist/components/filters/demo.js +1 -5
  64. package/dist/components/filters/filter-bar.cjs +1 -1
  65. package/dist/components/filters/filter-bar.d.ts +15 -1
  66. package/dist/components/filters/filter-bar.js +94 -50
  67. package/dist/components/filters/index.cjs +1 -1
  68. package/dist/components/filters/index.d.ts +0 -1
  69. package/dist/components/filters/index.js +3 -4
  70. package/dist/components/form/form-field-shell.cjs +1 -1
  71. package/dist/components/form/form-field-shell.d.ts +17 -3
  72. package/dist/components/form/form-field-shell.js +54 -40
  73. package/dist/components/form/form-input.cjs +1 -1
  74. package/dist/components/form/form-input.d.ts +3 -4
  75. package/dist/components/form/form-input.js +285 -224
  76. package/dist/components/form/form-select.cjs +1 -1
  77. package/dist/components/form/form-select.d.ts +2 -2
  78. package/dist/components/form/form-select.js +49 -35
  79. package/dist/components/form/form-switch.cjs +1 -1
  80. package/dist/components/form/form-switch.js +79 -66
  81. package/dist/components/form/form-textarea.cjs +1 -1
  82. package/dist/components/form/form-textarea.js +59 -48
  83. package/dist/components/form/index.cjs +1 -1
  84. package/dist/components/form/index.js +14 -14
  85. package/dist/components/form/public.cjs +1 -1
  86. package/dist/components/form/public.d.ts +0 -8
  87. package/dist/components/form/public.js +7 -15
  88. package/dist/components/inputs/async-select.cjs +1 -1
  89. package/dist/components/inputs/async-select.d.ts +14 -2
  90. package/dist/components/inputs/async-select.js +278 -270
  91. package/dist/components/inputs/combobox.cjs +1 -1
  92. package/dist/components/inputs/combobox.d.ts +5 -1
  93. package/dist/components/inputs/combobox.js +52 -19
  94. package/dist/components/inputs/search-input.d.ts +3 -0
  95. package/dist/components/inputs/simple-select.cjs +1 -1
  96. package/dist/components/inputs/simple-select.d.ts +10 -31
  97. package/dist/components/inputs/simple-select.js +5 -85
  98. package/dist/components/layout/app-sidebar.cjs +1 -1
  99. package/dist/components/layout/app-sidebar.d.ts +4 -1
  100. package/dist/components/layout/app-sidebar.js +152 -132
  101. package/dist/components/layout/breadcrumbs.cjs +1 -1
  102. package/dist/components/layout/breadcrumbs.d.ts +2 -1
  103. package/dist/components/layout/breadcrumbs.js +10 -10
  104. package/dist/components/layout/index.cjs +1 -1
  105. package/dist/components/layout/index.js +3 -3
  106. package/dist/components/layout/stat-card.cjs +1 -1
  107. package/dist/components/layout/stat-card.d.ts +8 -1
  108. package/dist/components/layout/stat-card.js +33 -11
  109. package/dist/components/modern/calendar-scheduler.cjs +1 -1
  110. package/dist/components/modern/calendar-scheduler.d.ts +2 -1
  111. package/dist/components/modern/calendar-scheduler.js +21 -12
  112. package/dist/components/overlay/alert-dialog.cjs +1 -1
  113. package/dist/components/overlay/alert-dialog.d.ts +15 -1
  114. package/dist/components/overlay/alert-dialog.js +102 -27
  115. package/dist/components/overlay/drawer.cjs +1 -1
  116. package/dist/components/overlay/drawer.d.ts +4 -1
  117. package/dist/components/overlay/drawer.js +20 -17
  118. package/dist/components/patterns/index.cjs +1 -1
  119. package/dist/components/patterns/index.d.ts +0 -1
  120. package/dist/components/patterns/index.js +1 -2
  121. package/dist/components/patterns/public.cjs +1 -1
  122. package/dist/components/patterns/public.d.ts +0 -1
  123. package/dist/components/patterns/public.js +1 -2
  124. package/dist/components/ui/button/index.cjs +1 -1
  125. package/dist/components/ui/button/index.d.ts +3 -1
  126. package/dist/components/ui/button/index.js +7 -5
  127. package/dist/components/ui/card/index.cjs +1 -1
  128. package/dist/components/ui/card/index.d.ts +13 -2
  129. package/dist/components/ui/card/index.js +74 -49
  130. package/dist/components/ui/checkbox/index.cjs +1 -1
  131. package/dist/components/ui/checkbox/index.d.ts +8 -0
  132. package/dist/components/ui/checkbox/index.js +16 -14
  133. package/dist/components/ui/collapse/index.cjs +1 -1
  134. package/dist/components/ui/collapse/index.d.ts +17 -3
  135. package/dist/components/ui/collapse/index.js +88 -33
  136. package/dist/components/ui/dialog/index.cjs +1 -1
  137. package/dist/components/ui/dialog/index.d.ts +2 -1
  138. package/dist/components/ui/dialog/index.js +6 -4
  139. package/dist/components/ui/dropdown-menu/index.cjs +1 -1
  140. package/dist/components/ui/dropdown-menu/index.d.ts +9 -4
  141. package/dist/components/ui/dropdown-menu/index.js +87 -62
  142. package/dist/components/ui/input/index.cjs +1 -1
  143. package/dist/components/ui/input/index.d.ts +8 -0
  144. package/dist/components/ui/input/index.js +63 -30
  145. package/dist/components/ui/select/index.cjs +1 -1
  146. package/dist/components/ui/select/index.d.ts +33 -1
  147. package/dist/components/ui/select/index.js +154 -48
  148. package/dist/index.cjs +1 -1
  149. package/dist/index.js +137 -156
  150. package/dist/public-component-surface.cjs +1 -1
  151. package/dist/public-component-surface.js +0 -15
  152. package/dist/showcase/component-api-schema.cjs +1 -1
  153. package/dist/showcase/component-api-schema.js +2 -2
  154. package/dist/showcase/create-demo.cjs +23 -36
  155. package/dist/showcase/create-demo.js +15 -16
  156. package/dist/showcase/fallback.cjs +3 -3
  157. package/dist/showcase/fallback.js +275 -265
  158. package/dist/showcase/premium/accordion/showcase.cjs +1 -1
  159. package/dist/showcase/premium/accordion/showcase.js +36 -5
  160. package/dist/showcase/premium/action-menu/showcase.cjs +1 -1
  161. package/dist/showcase/premium/action-menu/showcase.js +26 -8
  162. package/dist/showcase/premium/activity-feed/showcase.cjs +1 -1
  163. package/dist/showcase/premium/activity-feed/showcase.js +60 -36
  164. package/dist/showcase/premium/alert/showcase.cjs +1 -1
  165. package/dist/showcase/premium/alert/showcase.js +41 -18
  166. package/dist/showcase/premium/alert-dialog/showcase.cjs +1 -1
  167. package/dist/showcase/premium/alert-dialog/showcase.js +35 -7
  168. package/dist/showcase/premium/async-multi-select/mock.cjs +4 -3
  169. package/dist/showcase/premium/async-multi-select/mock.js +5 -5
  170. package/dist/showcase/premium/async-multi-select/showcase.cjs +1 -1
  171. package/dist/showcase/premium/async-multi-select/showcase.js +4 -3
  172. package/dist/showcase/premium/async-select/mock.cjs +1 -1
  173. package/dist/showcase/premium/async-select/mock.js +1 -1
  174. package/dist/showcase/premium/async-select/showcase.cjs +1 -1
  175. package/dist/showcase/premium/async-select/showcase.js +69 -22
  176. package/dist/showcase/premium/button/showcase.cjs +1 -1
  177. package/dist/showcase/premium/button/showcase.js +49 -3
  178. package/dist/showcase/premium/button-group/showcase.cjs +1 -1
  179. package/dist/showcase/premium/button-group/showcase.js +53 -29
  180. package/dist/showcase/premium/calendar/showcase.cjs +1 -1
  181. package/dist/showcase/premium/calendar/showcase.js +7 -2
  182. package/dist/showcase/premium/carousel/showcase.cjs +1 -1
  183. package/dist/showcase/premium/carousel/showcase.js +95 -47
  184. package/dist/showcase/premium/checkbox/showcase.cjs +1 -1
  185. package/dist/showcase/premium/checkbox/showcase.js +143 -67
  186. package/dist/showcase/premium/clearable-input/mock.cjs +4 -3
  187. package/dist/showcase/premium/clearable-input/mock.js +3 -2
  188. package/dist/showcase/premium/clearable-input/showcase.cjs +1 -1
  189. package/dist/showcase/premium/clearable-input/showcase.js +8 -2
  190. package/dist/showcase/premium/collapse/showcase.cjs +1 -1
  191. package/dist/showcase/premium/collapse/showcase.js +7 -0
  192. package/dist/showcase/premium/combobox/showcase.cjs +1 -1
  193. package/dist/showcase/premium/combobox/showcase.d.ts +2 -1
  194. package/dist/showcase/premium/combobox/showcase.js +56 -47
  195. package/dist/showcase/premium/data-table/showcase.cjs +1 -1
  196. package/dist/showcase/premium/data-table/showcase.js +138 -46
  197. package/dist/showcase/premium/data-table-parts/showcase.cjs +1 -1
  198. package/dist/showcase/premium/data-table-parts/showcase.js +16 -14
  199. package/dist/showcase/premium/date-input/mock.cjs +1 -1
  200. package/dist/showcase/premium/date-input/mock.js +1 -1
  201. package/dist/showcase/premium/date-range-picker/showcase.cjs +1 -1
  202. package/dist/showcase/premium/date-range-picker/showcase.js +32 -1
  203. package/dist/showcase/premium/dropdown-menu/showcase.cjs +1 -1
  204. package/dist/showcase/premium/dropdown-menu/showcase.js +88 -54
  205. package/dist/showcase/premium/form-wrapper/mock.cjs +41 -15
  206. package/dist/showcase/premium/form-wrapper/mock.js +4 -4
  207. package/dist/showcase/premium/form-wrapper/showcase.cjs +1 -1
  208. package/dist/showcase/premium/form-wrapper/showcase.js +77 -28
  209. package/dist/showcase/premium/index.cjs +1 -1
  210. package/dist/showcase/premium/index.js +426 -467
  211. package/dist/showcase/premium/input/mock.cjs +4 -1
  212. package/dist/showcase/premium/input/mock.js +1 -1
  213. package/dist/showcase/premium/masked-input/mock.cjs +1 -1
  214. package/dist/showcase/premium/masked-input/mock.js +1 -1
  215. package/dist/showcase/premium/money-input/mock.cjs +1 -1
  216. package/dist/showcase/premium/money-input/mock.js +1 -1
  217. package/dist/showcase/premium/number-input/mock.cjs +1 -1
  218. package/dist/showcase/premium/number-input/mock.js +1 -1
  219. package/dist/showcase/premium/phone-input/mock.cjs +1 -1
  220. package/dist/showcase/premium/phone-input/mock.js +1 -1
  221. package/dist/showcase/premium/quantity-input/mock.cjs +1 -1
  222. package/dist/showcase/premium/quantity-input/mock.js +1 -1
  223. package/dist/showcase/premium/select/mock.cjs +8 -9
  224. package/dist/showcase/premium/select/mock.js +1 -1
  225. package/dist/showcase/premium/select/showcase.cjs +1 -1
  226. package/dist/showcase/premium/select/showcase.js +76 -86
  227. package/dist/showcase/premium/simple-select/mock.cjs +1 -1
  228. package/dist/showcase/premium/simple-select/mock.js +1 -1
  229. package/dist/showcase/premium/simple-select/showcase.cjs +1 -1
  230. package/dist/showcase/premium/simple-select/showcase.js +4 -2
  231. package/dist/showcase/preview-catalog.cjs +7 -10
  232. package/dist/showcase/preview-catalog.js +7 -7
  233. package/dist/showcase/registry-quality.cjs +1 -1
  234. package/dist/showcase/registry-quality.js +0 -23
  235. package/dist/showcase/registry-specific.cjs +1 -1
  236. package/dist/showcase/registry-specific.js +153 -383
  237. package/dist/showcase/render-registry-preview.cjs +1 -1
  238. package/dist/showcase/render-registry-preview.js +169 -197
  239. package/dist/showcase/site-data.cjs +1 -1
  240. package/dist/showcase/site-data.js +197 -941
  241. package/dist/showcase/supplemental.cjs +1 -1
  242. package/dist/showcase/supplemental.js +1 -1
  243. package/dist/showcase/tembro-registry.json.cjs +1 -1
  244. package/dist/showcase/tembro-registry.json.js +33 -51
  245. package/package.json +1 -1
  246. package/packages/cli/dist/index.cjs +2 -2
  247. package/packages/cli/vendor/src/components/actions/action-menu.tsx +149 -83
  248. package/packages/cli/vendor/src/components/actions/button-group.tsx +141 -33
  249. package/packages/cli/vendor/src/components/actions/copy-button.tsx +21 -16
  250. package/packages/cli/vendor/src/components/calendar/calendar.tsx +223 -88
  251. package/packages/cli/vendor/src/components/calendar/date-picker.tsx +73 -29
  252. package/packages/cli/vendor/src/components/calendar/date-range-picker.tsx +154 -49
  253. package/packages/cli/vendor/src/components/data-table/data-table-pagination.tsx +7 -7
  254. package/packages/cli/vendor/src/components/data-table/data-table-toolbar.tsx +71 -50
  255. package/packages/cli/vendor/src/components/data-table/data-table.tsx +86 -73
  256. package/packages/cli/vendor/src/components/data-table/demo.tsx +2 -12
  257. package/packages/cli/vendor/src/components/data-table/public.ts +1 -6
  258. package/packages/cli/vendor/src/components/display/activity-feed.tsx +98 -40
  259. package/packages/cli/vendor/src/components/display/carousel.tsx +104 -6
  260. package/packages/cli/vendor/src/components/display/code-block.tsx +58 -26
  261. package/packages/cli/vendor/src/components/display/comparison-card.tsx +15 -41
  262. package/packages/cli/vendor/src/components/display/data-state.tsx +119 -50
  263. package/packages/cli/vendor/src/components/display/demo.tsx +0 -4
  264. package/packages/cli/vendor/src/components/display/index.ts +0 -3
  265. package/packages/cli/vendor/src/components/display/smart-card.tsx +1 -1
  266. package/packages/cli/vendor/src/components/display/status-legend.tsx +1 -1
  267. package/packages/cli/vendor/src/components/feedback/alert.tsx +86 -28
  268. package/packages/cli/vendor/src/components/feedback/index.ts +0 -2
  269. package/packages/cli/vendor/src/components/filters/demo.tsx +0 -1
  270. package/packages/cli/vendor/src/components/filters/filter-bar.tsx +126 -54
  271. package/packages/cli/vendor/src/components/filters/index.ts +0 -1
  272. package/packages/cli/vendor/src/components/form/form-field-shell.tsx +72 -34
  273. package/packages/cli/vendor/src/components/form/form-input.tsx +127 -23
  274. package/packages/cli/vendor/src/components/form/form-select.tsx +30 -7
  275. package/packages/cli/vendor/src/components/form/form-switch.tsx +77 -58
  276. package/packages/cli/vendor/src/components/form/form-textarea.tsx +65 -51
  277. package/packages/cli/vendor/src/components/form/public.ts +0 -9
  278. package/packages/cli/vendor/src/components/inputs/async-select.tsx +138 -91
  279. package/packages/cli/vendor/src/components/inputs/combobox.tsx +66 -9
  280. package/packages/cli/vendor/src/components/inputs/search-input.tsx +5 -2
  281. package/packages/cli/vendor/src/components/inputs/simple-select.tsx +20 -162
  282. package/packages/cli/vendor/src/components/layout/app-sidebar.tsx +42 -1
  283. package/packages/cli/vendor/src/components/layout/breadcrumbs.tsx +17 -8
  284. package/packages/cli/vendor/src/components/layout/stat-card.tsx +63 -23
  285. package/packages/cli/vendor/src/components/modern/calendar-scheduler.tsx +32 -22
  286. package/packages/cli/vendor/src/components/overlay/alert-dialog.tsx +148 -24
  287. package/packages/cli/vendor/src/components/overlay/drawer.tsx +42 -30
  288. package/packages/cli/vendor/src/components/patterns/index.ts +0 -1
  289. package/packages/cli/vendor/src/components/patterns/public.ts +0 -1
  290. package/packages/cli/vendor/src/components/ui/button/index.tsx +27 -17
  291. package/packages/cli/vendor/src/components/ui/card/index.tsx +95 -25
  292. package/packages/cli/vendor/src/components/ui/checkbox/index.tsx +22 -5
  293. package/packages/cli/vendor/src/components/ui/collapse/index.tsx +97 -16
  294. package/packages/cli/vendor/src/components/ui/dialog/index.tsx +12 -8
  295. package/packages/cli/vendor/src/components/ui/dropdown-menu/index.tsx +82 -28
  296. package/packages/cli/vendor/src/components/ui/input/index.tsx +98 -0
  297. package/packages/cli/vendor/src/components/ui/select/index.tsx +227 -34
  298. package/packages/cli/vendor/src/public-component-surface.ts +0 -3
  299. package/packages/cli/vendor/src/showcase/component-api-schema.ts +2 -2
  300. package/packages/cli/vendor/src/showcase/create-demo.tsx +44 -58
  301. package/packages/cli/vendor/src/showcase/fallback.tsx +80 -99
  302. package/packages/cli/vendor/src/showcase/premium/accordion/showcase.tsx +32 -2
  303. package/packages/cli/vendor/src/showcase/premium/action-menu/showcase.tsx +12 -3
  304. package/packages/cli/vendor/src/showcase/premium/activity-feed/showcase.tsx +15 -2
  305. package/packages/cli/vendor/src/showcase/premium/alert/showcase.tsx +32 -17
  306. package/packages/cli/vendor/src/showcase/premium/alert-dialog/showcase.tsx +28 -3
  307. package/packages/cli/vendor/src/showcase/premium/async-multi-select/mock.ts +6 -5
  308. package/packages/cli/vendor/src/showcase/premium/async-multi-select/showcase.tsx +5 -4
  309. package/packages/cli/vendor/src/showcase/premium/async-select/mock.ts +1 -1
  310. package/packages/cli/vendor/src/showcase/premium/async-select/showcase.tsx +36 -0
  311. package/packages/cli/vendor/src/showcase/premium/button/showcase.tsx +26 -5
  312. package/packages/cli/vendor/src/showcase/premium/button-group/showcase.tsx +20 -3
  313. package/packages/cli/vendor/src/showcase/premium/calendar/showcase.tsx +5 -0
  314. package/packages/cli/vendor/src/showcase/premium/carousel/showcase.tsx +33 -5
  315. package/packages/cli/vendor/src/showcase/premium/checkbox/showcase.tsx +46 -3
  316. package/packages/cli/vendor/src/showcase/premium/clearable-input/mock.ts +5 -3
  317. package/packages/cli/vendor/src/showcase/premium/clearable-input/showcase.tsx +5 -2
  318. package/packages/cli/vendor/src/showcase/premium/collapse/showcase.tsx +4 -0
  319. package/packages/cli/vendor/src/showcase/premium/combobox/showcase.tsx +8 -0
  320. package/packages/cli/vendor/src/showcase/premium/data-table/showcase.tsx +77 -27
  321. package/packages/cli/vendor/src/showcase/premium/data-table-parts/showcase.tsx +14 -14
  322. package/packages/cli/vendor/src/showcase/premium/date-input/mock.ts +1 -1
  323. package/packages/cli/vendor/src/showcase/premium/date-range-picker/showcase.tsx +7 -0
  324. package/packages/cli/vendor/src/showcase/premium/dropdown-menu/showcase.tsx +46 -3
  325. package/packages/cli/vendor/src/showcase/premium/form-wrapper/mock.ts +70 -44
  326. package/packages/cli/vendor/src/showcase/premium/form-wrapper/showcase.tsx +129 -12
  327. package/packages/cli/vendor/src/showcase/premium/index.ts +7 -24
  328. package/packages/cli/vendor/src/showcase/premium/input/mock.ts +2 -2
  329. package/packages/cli/vendor/src/showcase/premium/masked-input/mock.ts +1 -1
  330. package/packages/cli/vendor/src/showcase/premium/money-input/mock.ts +1 -1
  331. package/packages/cli/vendor/src/showcase/premium/number-input/mock.ts +1 -1
  332. package/packages/cli/vendor/src/showcase/premium/phone-input/mock.ts +1 -1
  333. package/packages/cli/vendor/src/showcase/premium/quantity-input/mock.ts +1 -1
  334. package/packages/cli/vendor/src/showcase/premium/select/mock.ts +1 -1
  335. package/packages/cli/vendor/src/showcase/premium/select/showcase.tsx +13 -21
  336. package/packages/cli/vendor/src/showcase/premium/simple-select/mock.ts +1 -1
  337. package/packages/cli/vendor/src/showcase/premium/simple-select/showcase.tsx +2 -1
  338. package/packages/cli/vendor/src/showcase/preview-catalog.tsx +7 -7
  339. package/packages/cli/vendor/src/showcase/registry-quality.ts +4 -28
  340. package/packages/cli/vendor/src/showcase/registry-specific.tsx +10 -186
  341. package/packages/cli/vendor/src/showcase/render-registry-preview.tsx +23 -57
  342. package/packages/cli/vendor/src/showcase/site-data.tsx +2443 -2761
  343. package/packages/cli/vendor/src/showcase/supplemental.tsx +2 -42
  344. package/packages/cli/vendor/src/showcase/tembro-registry.json +11 -58
  345. package/registry.json +11 -61
  346. package/dist/components/display/entity-card.cjs +0 -1
  347. package/dist/components/display/entity-card.d.ts +0 -18
  348. package/dist/components/display/entity-card.js +0 -61
  349. package/dist/components/display/entity-header.cjs +0 -1
  350. package/dist/components/display/entity-header.d.ts +0 -13
  351. package/dist/components/display/entity-header.js +0 -52
  352. package/dist/components/display/file-card.cjs +0 -1
  353. package/dist/components/display/file-card.d.ts +0 -14
  354. package/dist/components/display/file-card.js +0 -59
  355. package/dist/components/feedback/empty-search-state.cjs +0 -1
  356. package/dist/components/feedback/empty-search-state.d.ts +0 -11
  357. package/dist/components/feedback/empty-search-state.js +0 -45
  358. package/dist/components/feedback/empty-state.cjs +0 -1
  359. package/dist/components/feedback/empty-state.d.ts +0 -11
  360. package/dist/components/feedback/empty-state.js +0 -38
  361. package/dist/components/filters/filter-chips.cjs +0 -1
  362. package/dist/components/filters/filter-chips.d.ts +0 -18
  363. package/dist/components/filters/filter-chips.js +0 -61
  364. package/dist/components/patterns/form-builder-presets.cjs +0 -1
  365. package/dist/components/patterns/form-builder-presets.d.ts +0 -1
  366. package/dist/components/patterns/form-builder-presets.js +0 -2
  367. package/dist/components/patterns/form-builder.cjs +0 -1
  368. package/dist/components/patterns/form-builder.d.ts +0 -109
  369. package/dist/components/patterns/form-builder.js +0 -263
  370. package/dist/showcase/premium/empty-state/index.cjs +0 -1
  371. package/dist/showcase/premium/empty-state/index.d.ts +0 -2
  372. package/dist/showcase/premium/empty-state/index.js +0 -3
  373. package/dist/showcase/premium/empty-state/mock.cjs +0 -14
  374. package/dist/showcase/premium/empty-state/mock.d.ts +0 -2
  375. package/dist/showcase/premium/empty-state/mock.js +0 -31
  376. package/dist/showcase/premium/empty-state/showcase.cjs +0 -1
  377. package/dist/showcase/premium/empty-state/showcase.d.ts +0 -3
  378. package/dist/showcase/premium/empty-state/showcase.js +0 -99
  379. package/dist/showcase/premium/form-builder/index.cjs +0 -1
  380. package/dist/showcase/premium/form-builder/index.d.ts +0 -2
  381. package/dist/showcase/premium/form-builder/index.js +0 -3
  382. package/dist/showcase/premium/form-builder/mock.cjs +0 -57
  383. package/dist/showcase/premium/form-builder/mock.d.ts +0 -2
  384. package/dist/showcase/premium/form-builder/mock.js +0 -40
  385. package/dist/showcase/premium/form-builder/showcase.cjs +0 -1
  386. package/dist/showcase/premium/form-builder/showcase.d.ts +0 -3
  387. package/dist/showcase/premium/form-builder/showcase.js +0 -69
  388. package/packages/cli/vendor/src/components/display/entity-card.tsx +0 -80
  389. package/packages/cli/vendor/src/components/display/entity-header.tsx +0 -80
  390. package/packages/cli/vendor/src/components/display/file-card.tsx +0 -61
  391. package/packages/cli/vendor/src/components/feedback/empty-search-state.tsx +0 -65
  392. package/packages/cli/vendor/src/components/feedback/empty-state.tsx +0 -56
  393. package/packages/cli/vendor/src/components/filters/filter-chips.tsx +0 -89
  394. package/packages/cli/vendor/src/components/patterns/form-builder-presets.ts +0 -13
  395. package/packages/cli/vendor/src/components/patterns/form-builder.tsx +0 -443
  396. package/packages/cli/vendor/src/showcase/premium/empty-state/index.ts +0 -2
  397. package/packages/cli/vendor/src/showcase/premium/empty-state/mock.ts +0 -30
  398. package/packages/cli/vendor/src/showcase/premium/empty-state/showcase.tsx +0 -65
  399. package/packages/cli/vendor/src/showcase/premium/form-builder/index.ts +0 -2
  400. package/packages/cli/vendor/src/showcase/premium/form-builder/mock.ts +0 -79
  401. package/packages/cli/vendor/src/showcase/premium/form-builder/showcase.tsx +0 -55
@@ -1,165 +1,23 @@
1
- import * as React from "react"
2
- import { CheckIcon, LoaderCircleIcon, SearchIcon, XIcon } from "lucide-react"
3
-
4
1
  import {
5
2
  Select,
6
- SelectContent,
7
- SelectItem,
8
- SelectTrigger,
9
- SelectValue,
3
+ type SelectOption,
4
+ type SelectProps,
10
5
  } from "@/components/ui/select"
11
- import { cn, stopInteractivePropagation } from "@/lib/utils"
12
-
13
- export type SimpleSelectOption = {
14
- label: React.ReactNode
15
- value: string
16
- disabled?: boolean
17
- description?: React.ReactNode
18
- keywords?: string[]
19
- }
20
-
21
- export type SimpleSelectProps = Omit<
22
- React.ComponentProps<typeof Select>,
23
- "value" | "onValueChange"
24
- > & {
25
- value?: string
26
- onValueChange?: (value: string | undefined) => void
27
- options: SimpleSelectOption[]
28
- placeholder?: string
29
- searchPlaceholder?: string
30
- emptyLabel?: React.ReactNode
31
- clearLabel?: string
32
- size?: "sm" | "default" | "lg"
33
- clearable?: boolean
34
- searchable?: boolean
35
- loading?: boolean
36
- loadingLabel?: React.ReactNode
37
- disabled?: boolean
38
- triggerClassName?: string
39
- contentClassName?: string
40
- itemClassName?: string
41
- searchClassName?: string
42
- renderOption?: (option: SimpleSelectOption, state: { selected: boolean }) => React.ReactNode
43
- invalid?: boolean
44
- }
45
-
46
- function optionMatchesSearch(option: SimpleSelectOption, search: string) {
47
- const normalized = search.trim().toLowerCase()
48
- if (!normalized) return true
49
-
50
- const labelText = typeof option.label === "string" || typeof option.label === "number" ? String(option.label) : option.value
51
- const haystack = [labelText, option.value, ...(option.keywords ?? [])].join(" ").toLowerCase()
52
- return haystack.includes(normalized)
53
- }
54
-
55
- function SimpleSelect({
56
- value,
57
- onValueChange,
58
- options,
59
- placeholder = "Select",
60
- searchPlaceholder = "Search options...",
61
- emptyLabel = "No options found",
62
- clearLabel = "Clear selection",
63
- size = "default",
64
- clearable = false,
65
- searchable = false,
66
- loading = false,
67
- loadingLabel = "Loading options...",
68
- disabled = false,
69
- triggerClassName,
70
- contentClassName,
71
- itemClassName,
72
- searchClassName,
73
- renderOption,
74
- invalid,
75
- ...props
76
- }: SimpleSelectProps) {
77
- const [search, setSearch] = React.useState("")
78
- const selectedOption = options.find((option) => option.value === value)
79
- const filteredOptions = options.filter((option) => optionMatchesSearch(option, search))
80
-
81
- return (
82
- <Select value={value} onValueChange={(val) => onValueChange?.(val as string)} disabled={disabled || loading} {...props}>
83
- <SelectTrigger
84
- size={size}
85
- aria-invalid={invalid || undefined}
86
- className={cn(
87
- "w-full",
88
- triggerClassName
89
- )}
90
- >
91
- <SelectValue placeholder={placeholder}>{selectedOption?.label}</SelectValue>
92
- {loading ? <LoaderCircleIcon className="size-4 animate-spin text-muted-foreground" /> : null}
93
- {clearable && value && !disabled && !loading ? (
94
- <button
95
- type="button"
96
- aria-label={clearLabel}
97
- className="ml-1 rounded-[var(--radius-sm)] border border-border/65 p-1 text-muted-foreground transition-colors hover:border-border hover:bg-muted/55 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
98
- onClick={(event) => {
99
- event.preventDefault()
100
- stopInteractivePropagation(event)
101
- onValueChange?.(undefined)
102
- }}
103
- onMouseDown={stopInteractivePropagation}
104
- onDoubleClick={stopInteractivePropagation}
105
- >
106
- <XIcon className="size-3.5" />
107
- </button>
108
- ) : null}
109
- </SelectTrigger>
110
- <SelectContent
111
- className={cn(
112
- "w-(--anchor-width)",
113
- contentClassName
114
- )}
115
- >
116
- {searchable ? (
117
- <div data-slot="select-search" className="sticky top-0 z-10 mb-1 flex items-center gap-2 rounded-[var(--radius-md)] border border-[color:var(--aui-card-border,var(--border))] bg-popover px-2.5 py-2 text-sm">
118
- <SearchIcon className="size-4 text-muted-foreground" />
119
- <input
120
- value={search}
121
- onChange={(event) => setSearch(event.target.value)}
122
- placeholder={searchPlaceholder}
123
- className={cn("min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground", searchClassName)}
124
- />
125
- </div>
126
- ) : null}
127
-
128
- {loading ? (
129
- <div data-slot="select-state" className="flex items-center gap-2 rounded-[var(--radius-md)] border border-[color:var(--aui-card-border,var(--border))] bg-[color:color-mix(in_oklch,var(--muted),transparent_55%)] px-3 py-2.5 text-sm text-muted-foreground">
130
- <LoaderCircleIcon className="size-4 animate-spin" />
131
- {loadingLabel}
132
- </div>
133
- ) : filteredOptions.length === 0 ? (
134
- <div data-slot="select-state" className="rounded-[var(--radius-md)] border border-[color:var(--aui-card-border,var(--border))] bg-[color:color-mix(in_oklch,var(--muted),transparent_55%)] px-3 py-2.5 text-sm text-muted-foreground">{emptyLabel}</div>
135
- ) : (
136
- filteredOptions.map((option) => {
137
- const selected = option.value === value
138
- return (
139
- <SelectItem
140
- key={option.value}
141
- value={option.value}
142
- disabled={option.disabled}
143
- className={cn("rounded-[var(--radius-md)]", itemClassName)}
144
- >
145
- {renderOption ? (
146
- renderOption(option, { selected })
147
- ) : (
148
- <span className="flex min-w-0 flex-1 flex-col">
149
- <span className="flex min-w-0 items-center gap-2">
150
- <span className="truncate">{option.label}</span>
151
- {selected ? <CheckIcon className="ml-auto size-3.5 text-primary" /> : null}
152
- </span>
153
- {option.description && <span className="truncate text-xs text-muted-foreground">{option.description}</span>}
154
- </span>
155
- )}
156
- </SelectItem>
157
- )
158
- })
159
- )}
160
- </SelectContent>
161
- </Select>
162
- )
163
- }
164
-
165
- export { SimpleSelect }
6
+
7
+ export type SimpleSelectOption = SelectOption
8
+
9
+ /**
10
+ * @deprecated Prefer `Select` with `options` for new usage.
11
+ */
12
+ export type SimpleSelectProps = Omit<SelectProps, "children"> & {
13
+ options: SimpleSelectOption[]
14
+ }
15
+
16
+ /**
17
+ * @deprecated Prefer `Select` with `options` for new usage.
18
+ */
19
+ function SimpleSelect(props: SimpleSelectProps) {
20
+ return <Select {...props} />
21
+ }
22
+
23
+ export { SimpleSelect }
@@ -36,6 +36,9 @@ export type AppSidebarProps = React.ComponentProps<"aside"> & {
36
36
  footer?: React.ReactNode
37
37
  items?: AppSidebarNavItem[]
38
38
  collapsed?: boolean
39
+ width?: React.CSSProperties["width"]
40
+ collapsedWidth?: React.CSSProperties["width"]
41
+ mobileWidth?: React.CSSProperties["width"]
39
42
  collapsedRail?: React.ReactNode
40
43
  railItems?: AppSidebarNavItem[]
41
44
  footerAccount?: AppSidebarFooterAccount
@@ -63,6 +66,23 @@ export type AppSidebarProps = React.ComponentProps<"aside"> & {
63
66
  }
64
67
 
65
68
  const DEFAULT_APP_SIDEBAR_BREAKPOINT = 1024
69
+ const DEFAULT_SIDEBAR_WIDTH = "18rem"
70
+ const DEFAULT_COLLAPSED_SIDEBAR_WIDTH = "4.75rem"
71
+ const DEFAULT_MOBILE_SIDEBAR_WIDTH = "min(88vw, 22rem)"
72
+
73
+ function getSidebarInteractiveClassName({
74
+ active,
75
+ disabled,
76
+ }: {
77
+ active?: boolean
78
+ disabled?: boolean
79
+ }) {
80
+ return cn(
81
+ "border-[color:transparent] text-foreground/80 hover:border-[color:var(--aui-divider)] hover:bg-[color:color-mix(in_oklch,var(--card),var(--primary)_4%)] hover:text-foreground focus-visible:border-[color:var(--aui-control-border-strong,var(--border))] focus-visible:bg-[color:color-mix(in_oklch,var(--card),var(--primary)_6%)] focus-visible:text-foreground focus-visible:shadow-[0_0_0_3px_color-mix(in_oklch,var(--primary),transparent_86%)]",
82
+ active && "border-[color:color-mix(in_oklch,var(--primary),transparent_76%)] bg-[color:color-mix(in_oklch,var(--primary),transparent_91%)] text-foreground shadow-[inset_0_1px_0_rgba(255,255,255,0.08)]",
83
+ disabled && "hover:border-transparent hover:bg-transparent hover:text-foreground/80"
84
+ )
85
+ }
66
86
 
67
87
  function hasVisibleSidebarChildren(item: AppSidebarNavItem) {
68
88
  return item.items?.some((child) => !child.hidden) ?? false
@@ -101,6 +121,7 @@ function SidebarLeafItem({
101
121
  "data-depth": String(depth),
102
122
  className: cn(
103
123
  "flex min-h-9 items-center gap-2 rounded-lg border border-transparent px-2.5 text-sm font-medium outline-none transition-[background-color,border-color,color,box-shadow] data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50",
124
+ getSidebarInteractiveClassName({ active: item.active, disabled: item.disabled }),
104
125
  collapsed && "justify-center px-2"
105
126
  ),
106
127
  }
@@ -257,6 +278,7 @@ function SidebarTree({
257
278
  data-slot="app-sidebar-group-trigger"
258
279
  className={cn(
259
280
  "flex min-h-9 list-none items-center gap-2 rounded-lg border border-transparent text-sm font-medium outline-none transition-[background-color,border-color,color,box-shadow]",
281
+ getSidebarInteractiveClassName({ active }),
260
282
  collapsed ? "justify-center px-2" : "px-2.5"
261
283
  )}
262
284
  >
@@ -312,6 +334,7 @@ function SidebarActionButton({
312
334
  data-disabled={item.disabled || undefined}
313
335
  className={cn(
314
336
  "flex min-h-9 items-center gap-2 rounded-lg border border-transparent px-2.5 text-sm font-medium outline-none transition-[background-color,border-color,color,box-shadow] data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50",
337
+ getSidebarInteractiveClassName({ active: item.active, disabled: item.disabled }),
315
338
  collapsed && "justify-center px-2"
316
339
  )}
317
340
  disabled={item.disabled}
@@ -350,6 +373,7 @@ function SidebarFooterAccount({
350
373
  data-slot="app-sidebar-account"
351
374
  className={cn(
352
375
  "flex w-full items-center gap-3 rounded-[min(var(--radius-xl),16px)] border border-transparent text-left transition-[background-color,border-color,color,box-shadow]",
376
+ getSidebarInteractiveClassName({}),
353
377
  collapsed ? "justify-center px-2 py-2.5" : "px-3 py-2.5"
354
378
  )}
355
379
  onClick={() => {
@@ -397,10 +421,13 @@ function SidebarFooterAccount({
397
421
 
398
422
  function SidebarSurface({
399
423
  className,
424
+ style,
400
425
  header,
401
426
  footer,
402
427
  items = [],
403
428
  collapsed = false,
429
+ width = DEFAULT_SIDEBAR_WIDTH,
430
+ collapsedWidth = DEFAULT_COLLAPSED_SIDEBAR_WIDTH,
404
431
  collapsedRail,
405
432
  railItems = [],
406
433
  footerAccount,
@@ -438,6 +465,11 @@ function SidebarSurface({
438
465
  data-collapsed={collapsed || undefined}
439
466
  data-mobile={mobile || undefined}
440
467
  className={cn("flex h-full min-h-0 flex-col overflow-hidden", className)}
468
+ style={{
469
+ width: collapsed ? collapsedWidth : width,
470
+ minWidth: collapsed ? collapsedWidth : width,
471
+ ...style,
472
+ }}
441
473
  {...props}
442
474
  >
443
475
  {(header || showMobileHeader) && (
@@ -565,6 +597,9 @@ function AppSidebar({
565
597
  footer,
566
598
  items = [],
567
599
  collapsed = false,
600
+ width = DEFAULT_SIDEBAR_WIDTH,
601
+ collapsedWidth = DEFAULT_COLLAPSED_SIDEBAR_WIDTH,
602
+ mobileWidth = DEFAULT_MOBILE_SIDEBAR_WIDTH,
568
603
  collapsedRail,
569
604
  railItems = [],
570
605
  footerAccount,
@@ -634,6 +669,8 @@ function AppSidebar({
634
669
  footer,
635
670
  items,
636
671
  collapsed,
672
+ width,
673
+ collapsedWidth,
637
674
  collapsedRail,
638
675
  railItems,
639
676
  footerAccount,
@@ -703,11 +740,15 @@ function AppSidebar({
703
740
  aria-modal="true"
704
741
  aria-label={typeof mobileTitle === "string" ? mobileTitle : "Navigation"}
705
742
  className={cn(
706
- "fixed inset-y-0 left-0 z-50 w-[min(88vw,22rem)] max-w-[22rem] border-r border-[color:var(--aui-divider)] bg-[color:var(--aui-page-bg)] shadow-2xl transition-transform duration-200 ease-out",
743
+ "fixed inset-y-0 left-0 z-50 max-w-[22rem] border-r border-[color:var(--aui-divider)] bg-[color:var(--aui-page-bg)] shadow-2xl transition-transform duration-200 ease-out",
707
744
  mobileOpen ? "translate-x-0" : "-translate-x-full",
708
745
  mobilePanelClassName,
709
746
  className
710
747
  )}
748
+ style={{
749
+ width: mobileWidth,
750
+ minWidth: mobileWidth,
751
+ }}
711
752
  />
712
753
  </div>
713
754
  </>
@@ -18,6 +18,7 @@ export type BreadcrumbsProps = React.ComponentProps<"nav"> & {
18
18
  maxItems?: number
19
19
  collapseLabel?: React.ReactNode
20
20
  separator?: React.ReactNode
21
+ wrap?: boolean
21
22
  renderLink?: (props: React.ComponentProps<"a"> & { item: BreadcrumbItem; [key: `data-${string}`]: string | boolean | undefined }) => React.ReactNode
22
23
  }
23
24
 
@@ -44,6 +45,7 @@ function Breadcrumbs({
44
45
  maxItems,
45
46
  collapseLabel = "…",
46
47
  separator = <ChevronRightIcon className="size-3.5" />,
48
+ wrap = false,
47
49
  renderLink,
48
50
  ...props
49
51
  }: BreadcrumbsProps) {
@@ -54,11 +56,15 @@ function Breadcrumbs({
54
56
 
55
57
  return (
56
58
  <nav
57
- data-slot="breadcrumbs"
58
- aria-label="Breadcrumb"
59
- className={cn("flex min-w-0 items-center gap-1 text-sm text-muted-foreground", className)}
60
- {...props}
61
- >
59
+ data-slot="breadcrumbs"
60
+ aria-label="Breadcrumb"
61
+ className={cn(
62
+ "flex min-w-0 items-center gap-1 overflow-x-auto text-sm text-muted-foreground",
63
+ wrap ? "flex-wrap" : "whitespace-nowrap",
64
+ className
65
+ )}
66
+ {...props}
67
+ >
62
68
  {resolvedItems.map((item, index) => {
63
69
  const isCollapsed = item.key === "__collapsed__"
64
70
  const isLast = index === resolvedItems.length - 1
@@ -76,7 +82,7 @@ function Breadcrumbs({
76
82
  item,
77
83
  href: item.href,
78
84
  "data-slot": "breadcrumbs-link",
79
- className: "truncate transition-colors hover:text-foreground",
85
+ className: "truncate rounded-[var(--radius-sm)] px-1 py-0.5 transition-colors hover:bg-accent/55 hover:text-foreground",
80
86
  onClick: () => item.onSelect?.(),
81
87
  children: (
82
88
  <span className="inline-flex min-w-0 items-center gap-1.5">
@@ -88,7 +94,7 @@ function Breadcrumbs({
88
94
  <a
89
95
  href={item.href}
90
96
  data-slot="breadcrumbs-link"
91
- className="truncate transition-colors hover:text-foreground"
97
+ className="truncate rounded-[var(--radius-sm)] px-1 py-0.5 transition-colors hover:bg-accent/55 hover:text-foreground"
92
98
  onClick={() => item.onSelect?.()}
93
99
  >
94
100
  <span className="inline-flex min-w-0 items-center gap-1.5">
@@ -101,7 +107,10 @@ function Breadcrumbs({
101
107
  <span
102
108
  data-slot="breadcrumbs-current"
103
109
  aria-current={isCurrent ? (item.currentLabel ?? "page") : undefined}
104
- className={cn("inline-flex min-w-0 items-center gap-1.5 truncate", isCurrent && "font-medium text-foreground")}
110
+ className={cn(
111
+ "inline-flex min-w-0 items-center gap-1.5 truncate rounded-[var(--radius-sm)] px-1 py-0.5",
112
+ isCurrent && "bg-accent/45 font-medium text-foreground"
113
+ )}
105
114
  >
106
115
  {item.icon ? <span className="shrink-0">{item.icon}</span> : null}
107
116
  <span className="truncate">{item.label}</span>
@@ -17,16 +17,23 @@ export type StatCardTrend = {
17
17
  label?: React.ReactNode
18
18
  }
19
19
 
20
- export type StatCardProps = React.ComponentProps<typeof Card> & {
20
+ export type StatCardProps = React.ComponentProps<typeof Card> & {
21
21
  title?: React.ReactNode
22
22
  value?: React.ReactNode
23
- description?: React.ReactNode
24
- icon?: React.ReactNode
25
- action?: React.ReactNode
26
- trend?: StatCardTrend
27
- footer?: React.ReactNode
28
- helperText?: React.ReactNode
29
- loading?: boolean
23
+ description?: React.ReactNode
24
+ icon?: React.ReactNode
25
+ action?: React.ReactNode
26
+ trend?: StatCardTrend
27
+ footer?: React.ReactNode
28
+ helperText?: React.ReactNode
29
+ comparisonItems?: Array<{
30
+ label: React.ReactNode
31
+ value: React.ReactNode
32
+ change?: React.ReactNode
33
+ trend?: StatCardTrend["tone"] | "neutral"
34
+ }>
35
+ comparisonColumns?: 2 | 3 | 4
36
+ loading?: boolean
30
37
  valuePrefix?: React.ReactNode
31
38
  valueSuffix?: React.ReactNode
32
39
  contentClassName?: string
@@ -59,11 +66,13 @@ function StatCard({
59
66
  value,
60
67
  description,
61
68
  icon,
62
- action,
63
- trend,
64
- footer,
65
- helperText,
66
- loading = false,
69
+ action,
70
+ trend,
71
+ footer,
72
+ helperText,
73
+ comparisonItems,
74
+ comparisonColumns = 2,
75
+ loading = false,
67
76
  valuePrefix,
68
77
  valueSuffix,
69
78
  contentClassName,
@@ -99,22 +108,53 @@ function StatCard({
99
108
  </div>
100
109
  </CardHeader>
101
110
 
102
- {(description || trend || helperText || footer) && (
103
- <CardContent className={cn("space-y-2", contentClassName)}>
104
- {(description || trend) && (
105
- <div className="flex flex-wrap items-center gap-2 text-sm">
111
+ {(description || trend || helperText || footer || comparisonItems?.length) && (
112
+ <CardContent className={cn("space-y-2", contentClassName)}>
113
+ {(description || trend) && (
114
+ <div className="flex flex-wrap items-center gap-2 text-sm">
106
115
  {trend && (
107
116
  <Badge variant="ghost" tone={trend.tone === "muted" || trend.tone === "default" ? "neutral" : trend.tone} size="sm" className={cn("font-medium", trendClassName[trend.tone ?? "default"])}>
108
117
  {trend.value}
109
118
  </Badge>
110
119
  )}
111
120
  {trend?.label ? <span className="text-muted-foreground">{trend.label}</span> : null}
112
- {description && <span className="text-muted-foreground">{description}</span>}
113
- </div>
114
- )}
115
- {helperText ? <p className="text-xs leading-5 text-muted-foreground">{helperText}</p> : null}
116
- {footer}
117
- </CardContent>
121
+ {description && <span className="text-muted-foreground">{description}</span>}
122
+ </div>
123
+ )}
124
+ {comparisonItems?.length ? (
125
+ <div
126
+ data-slot="stat-card-comparison"
127
+ className={cn(
128
+ "grid gap-3 pt-1",
129
+ comparisonColumns === 2 && "grid-cols-2",
130
+ comparisonColumns === 3 && "grid-cols-3",
131
+ comparisonColumns === 4 && "grid-cols-2 sm:grid-cols-4"
132
+ )}
133
+ >
134
+ {comparisonItems.map((item, index) => (
135
+ <div key={index} className="min-w-0 space-y-1">
136
+ <p className="truncate text-[11px] font-medium uppercase tracking-[0.16em] text-muted-foreground">
137
+ {item.label}
138
+ </p>
139
+ <div className="flex flex-wrap items-center gap-2">
140
+ <span className="text-base font-semibold text-foreground">{item.value}</span>
141
+ {item.change ? (
142
+ <Badge
143
+ variant="ghost"
144
+ tone={item.trend === "neutral" ? "neutral" : item.trend === "default" ? "neutral" : item.trend}
145
+ size="sm"
146
+ >
147
+ {item.change}
148
+ </Badge>
149
+ ) : null}
150
+ </div>
151
+ </div>
152
+ ))}
153
+ </div>
154
+ ) : null}
155
+ {helperText ? <p className="text-xs leading-5 text-muted-foreground">{helperText}</p> : null}
156
+ {footer}
157
+ </CardContent>
118
158
  )}
119
159
  </>
120
160
  )}
@@ -10,10 +10,11 @@ export type CalendarSchedulerEvent = {
10
10
  tone?: "default" | "success" | "warning" | "danger"
11
11
  }
12
12
 
13
- export type CalendarSchedulerProps = React.ComponentProps<"div"> & {
14
- events: CalendarSchedulerEvent[]
15
- days?: string[]
16
- }
13
+ export type CalendarSchedulerProps = React.ComponentProps<"div"> & {
14
+ events: CalendarSchedulerEvent[]
15
+ days?: string[]
16
+ empty?: React.ReactNode
17
+ }
17
18
 
18
19
  const toneClassName = {
19
20
  default: "border-border bg-muted",
@@ -22,24 +23,33 @@ const toneClassName = {
22
23
  danger: "border-red-200 bg-red-50 text-red-700 dark:border-red-900 dark:bg-red-950 dark:text-red-300",
23
24
  }
24
25
 
25
- function CalendarScheduler({ events, days, className, ...props }: CalendarSchedulerProps) {
26
- const visibleDays = days ?? Array.from(new Set(events.map((event) => event.date)))
27
-
28
- return (
29
- <div data-slot="calendar-scheduler" className={cn("grid gap-3", className)} {...props}>
30
- {visibleDays.map((day) => (
31
- <section key={day} className="rounded-xl border bg-card p-3">
32
- <div className="mb-2 text-sm font-semibold">{day}</div>
33
- <div className="grid gap-2">
34
- {events.filter((event) => event.date === day).map((event) => (
35
- <div key={event.id} className={cn("rounded-md border px-3 py-2 text-sm", toneClassName[event.tone ?? "default"])}>
36
- <div className="font-medium">{event.title}</div>
37
- {event.time && <div className="text-xs opacity-70">{event.time}</div>}
38
- </div>
39
- ))}
40
- </div>
41
- </section>
42
- ))}
26
+ function CalendarScheduler({ events, days, empty = "No events scheduled.", className, ...props }: CalendarSchedulerProps) {
27
+ const visibleDays = days ?? Array.from(new Set(events.map((event) => event.date)))
28
+
29
+ return (
30
+ <div data-slot="calendar-scheduler" className={cn("grid gap-3", className)} {...props}>
31
+ {visibleDays.map((day) => (
32
+ <section key={day} className="rounded-[var(--aui-card-radius,var(--radius-xl))] border border-[color:var(--aui-card-border,var(--border))] bg-card p-4 shadow-[var(--aui-card-shadow,var(--aui-control-shadow,none))]">
33
+ <div className="mb-3 flex items-center justify-between gap-3">
34
+ <div className="text-sm font-semibold text-foreground">{day}</div>
35
+ <div className="text-xs text-muted-foreground">{events.filter((event) => event.date === day).length} items</div>
36
+ </div>
37
+ <div className="grid gap-2">
38
+ {events.filter((event) => event.date === day).length === 0 ? (
39
+ <div className="rounded-[var(--radius-md)] border border-dashed border-[color:var(--aui-card-border,var(--border))] px-3 py-4 text-sm text-muted-foreground">
40
+ {empty}
41
+ </div>
42
+ ) : (
43
+ events.filter((event) => event.date === day).map((event) => (
44
+ <div key={event.id} className={cn("rounded-[var(--radius-md)] border px-3 py-2.5 text-sm shadow-sm", toneClassName[event.tone ?? "default"])}>
45
+ <div className="font-medium">{event.title}</div>
46
+ {event.time && <div className="mt-1 text-xs opacity-70">{event.time}</div>}
47
+ </div>
48
+ ))
49
+ )}
50
+ </div>
51
+ </section>
52
+ ))}
43
53
  </div>
44
54
  )
45
55
  }