tembro 2.0.4 → 2.0.5

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 (372) 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-toolbar.cjs +1 -1
  20. package/dist/components/data-table/data-table-toolbar.d.ts +5 -1
  21. package/dist/components/data-table/data-table-toolbar.js +36 -23
  22. package/dist/components/data-table/data-table.cjs +1 -1
  23. package/dist/components/data-table/data-table.d.ts +6 -4
  24. package/dist/components/data-table/data-table.js +87 -79
  25. package/dist/components/data-table/demo.cjs +1 -1
  26. package/dist/components/data-table/demo.js +3 -13
  27. package/dist/components/data-table/index.cjs +1 -1
  28. package/dist/components/data-table/index.js +5 -5
  29. package/dist/components/data-table/public.cjs +1 -1
  30. package/dist/components/data-table/public.d.ts +1 -6
  31. package/dist/components/data-table/public.js +7 -12
  32. package/dist/components/display/activity-feed.cjs +1 -1
  33. package/dist/components/display/activity-feed.d.ts +12 -1
  34. package/dist/components/display/activity-feed.js +69 -47
  35. package/dist/components/display/carousel.cjs +1 -1
  36. package/dist/components/display/carousel.d.ts +10 -1
  37. package/dist/components/display/carousel.js +68 -23
  38. package/dist/components/display/code-block.cjs +2 -1
  39. package/dist/components/display/code-block.d.ts +3 -1
  40. package/dist/components/display/code-block.js +33 -19
  41. package/dist/components/display/comparison-card.cjs +1 -1
  42. package/dist/components/display/comparison-card.d.ts +3 -3
  43. package/dist/components/display/comparison-card.js +14 -38
  44. package/dist/components/display/data-state.cjs +1 -1
  45. package/dist/components/display/data-state.d.ts +12 -2
  46. package/dist/components/display/data-state.js +80 -42
  47. package/dist/components/display/demo.cjs +1 -1
  48. package/dist/components/display/demo.js +1 -5
  49. package/dist/components/display/index.cjs +1 -1
  50. package/dist/components/display/index.d.ts +0 -3
  51. package/dist/components/display/index.js +21 -24
  52. package/dist/components/feedback/alert.cjs +1 -1
  53. package/dist/components/feedback/alert.d.ts +6 -1
  54. package/dist/components/feedback/alert.js +49 -19
  55. package/dist/components/feedback/index.cjs +1 -1
  56. package/dist/components/feedback/index.d.ts +0 -2
  57. package/dist/components/feedback/index.js +3 -5
  58. package/dist/components/filters/demo.cjs +1 -1
  59. package/dist/components/filters/demo.js +1 -5
  60. package/dist/components/filters/filter-bar.cjs +1 -1
  61. package/dist/components/filters/filter-bar.d.ts +15 -1
  62. package/dist/components/filters/filter-bar.js +94 -50
  63. package/dist/components/filters/index.cjs +1 -1
  64. package/dist/components/filters/index.d.ts +0 -1
  65. package/dist/components/filters/index.js +3 -4
  66. package/dist/components/form/form-field-shell.cjs +1 -1
  67. package/dist/components/form/form-field-shell.d.ts +17 -3
  68. package/dist/components/form/form-field-shell.js +54 -40
  69. package/dist/components/form/form-input.cjs +1 -1
  70. package/dist/components/form/form-input.js +278 -217
  71. package/dist/components/form/form-select.cjs +1 -1
  72. package/dist/components/form/form-select.js +47 -33
  73. package/dist/components/form/form-switch.cjs +1 -1
  74. package/dist/components/form/form-switch.js +79 -66
  75. package/dist/components/form/form-textarea.cjs +1 -1
  76. package/dist/components/form/form-textarea.js +59 -48
  77. package/dist/components/form/index.cjs +1 -1
  78. package/dist/components/form/index.js +14 -14
  79. package/dist/components/form/public.cjs +1 -1
  80. package/dist/components/form/public.d.ts +0 -8
  81. package/dist/components/form/public.js +7 -15
  82. package/dist/components/inputs/async-select.cjs +1 -1
  83. package/dist/components/inputs/async-select.d.ts +11 -2
  84. package/dist/components/inputs/async-select.js +278 -270
  85. package/dist/components/inputs/combobox.cjs +1 -1
  86. package/dist/components/inputs/combobox.d.ts +5 -1
  87. package/dist/components/inputs/combobox.js +52 -19
  88. package/dist/components/inputs/simple-select.cjs +1 -1
  89. package/dist/components/inputs/simple-select.d.ts +2 -1
  90. package/dist/components/inputs/simple-select.js +32 -16
  91. package/dist/components/layout/app-sidebar.cjs +1 -1
  92. package/dist/components/layout/app-sidebar.d.ts +4 -1
  93. package/dist/components/layout/app-sidebar.js +152 -132
  94. package/dist/components/layout/breadcrumbs.cjs +1 -1
  95. package/dist/components/layout/breadcrumbs.d.ts +2 -1
  96. package/dist/components/layout/breadcrumbs.js +10 -10
  97. package/dist/components/layout/index.cjs +1 -1
  98. package/dist/components/layout/index.js +3 -3
  99. package/dist/components/layout/stat-card.cjs +1 -1
  100. package/dist/components/layout/stat-card.d.ts +8 -1
  101. package/dist/components/layout/stat-card.js +33 -11
  102. package/dist/components/modern/calendar-scheduler.cjs +1 -1
  103. package/dist/components/modern/calendar-scheduler.d.ts +2 -1
  104. package/dist/components/modern/calendar-scheduler.js +21 -12
  105. package/dist/components/overlay/alert-dialog.cjs +1 -1
  106. package/dist/components/overlay/alert-dialog.d.ts +15 -1
  107. package/dist/components/overlay/alert-dialog.js +102 -27
  108. package/dist/components/overlay/drawer.cjs +1 -1
  109. package/dist/components/overlay/drawer.d.ts +4 -1
  110. package/dist/components/overlay/drawer.js +20 -17
  111. package/dist/components/patterns/index.cjs +1 -1
  112. package/dist/components/patterns/index.d.ts +0 -1
  113. package/dist/components/patterns/index.js +1 -2
  114. package/dist/components/patterns/public.cjs +1 -1
  115. package/dist/components/patterns/public.d.ts +0 -1
  116. package/dist/components/patterns/public.js +1 -2
  117. package/dist/components/ui/button/index.cjs +1 -1
  118. package/dist/components/ui/button/index.d.ts +3 -1
  119. package/dist/components/ui/button/index.js +7 -5
  120. package/dist/components/ui/checkbox/index.cjs +1 -1
  121. package/dist/components/ui/checkbox/index.d.ts +8 -0
  122. package/dist/components/ui/checkbox/index.js +16 -14
  123. package/dist/components/ui/collapse/index.cjs +1 -1
  124. package/dist/components/ui/collapse/index.d.ts +17 -3
  125. package/dist/components/ui/collapse/index.js +88 -33
  126. package/dist/components/ui/dialog/index.cjs +1 -1
  127. package/dist/components/ui/dialog/index.d.ts +2 -1
  128. package/dist/components/ui/dialog/index.js +6 -4
  129. package/dist/components/ui/dropdown-menu/index.cjs +1 -1
  130. package/dist/components/ui/dropdown-menu/index.d.ts +9 -4
  131. package/dist/components/ui/dropdown-menu/index.js +87 -62
  132. package/dist/index.cjs +1 -1
  133. package/dist/index.js +137 -156
  134. package/dist/public-component-surface.cjs +1 -1
  135. package/dist/public-component-surface.js +0 -15
  136. package/dist/showcase/component-api-schema.cjs +1 -1
  137. package/dist/showcase/component-api-schema.js +2 -2
  138. package/dist/showcase/create-demo.cjs +20 -34
  139. package/dist/showcase/create-demo.js +15 -16
  140. package/dist/showcase/fallback.cjs +3 -3
  141. package/dist/showcase/fallback.js +275 -265
  142. package/dist/showcase/premium/accordion/showcase.cjs +1 -1
  143. package/dist/showcase/premium/accordion/showcase.js +36 -5
  144. package/dist/showcase/premium/action-menu/showcase.cjs +1 -1
  145. package/dist/showcase/premium/action-menu/showcase.js +26 -8
  146. package/dist/showcase/premium/activity-feed/showcase.cjs +1 -1
  147. package/dist/showcase/premium/activity-feed/showcase.js +60 -36
  148. package/dist/showcase/premium/alert/showcase.cjs +1 -1
  149. package/dist/showcase/premium/alert/showcase.js +41 -18
  150. package/dist/showcase/premium/alert-dialog/showcase.cjs +1 -1
  151. package/dist/showcase/premium/alert-dialog/showcase.js +35 -7
  152. package/dist/showcase/premium/async-multi-select/mock.cjs +4 -3
  153. package/dist/showcase/premium/async-multi-select/mock.js +5 -5
  154. package/dist/showcase/premium/async-multi-select/showcase.cjs +1 -1
  155. package/dist/showcase/premium/async-multi-select/showcase.js +4 -3
  156. package/dist/showcase/premium/async-select/mock.cjs +1 -1
  157. package/dist/showcase/premium/async-select/mock.js +1 -1
  158. package/dist/showcase/premium/async-select/showcase.cjs +1 -1
  159. package/dist/showcase/premium/async-select/showcase.js +69 -22
  160. package/dist/showcase/premium/button/showcase.cjs +1 -1
  161. package/dist/showcase/premium/button/showcase.js +49 -3
  162. package/dist/showcase/premium/button-group/showcase.cjs +1 -1
  163. package/dist/showcase/premium/button-group/showcase.js +53 -29
  164. package/dist/showcase/premium/calendar/showcase.cjs +1 -1
  165. package/dist/showcase/premium/calendar/showcase.js +7 -2
  166. package/dist/showcase/premium/carousel/showcase.cjs +1 -1
  167. package/dist/showcase/premium/carousel/showcase.js +95 -47
  168. package/dist/showcase/premium/checkbox/showcase.cjs +1 -1
  169. package/dist/showcase/premium/checkbox/showcase.js +143 -67
  170. package/dist/showcase/premium/clearable-input/mock.cjs +4 -3
  171. package/dist/showcase/premium/clearable-input/mock.js +3 -2
  172. package/dist/showcase/premium/clearable-input/showcase.cjs +1 -1
  173. package/dist/showcase/premium/clearable-input/showcase.js +8 -2
  174. package/dist/showcase/premium/collapse/showcase.cjs +1 -1
  175. package/dist/showcase/premium/collapse/showcase.js +7 -0
  176. package/dist/showcase/premium/combobox/showcase.cjs +1 -1
  177. package/dist/showcase/premium/combobox/showcase.d.ts +2 -1
  178. package/dist/showcase/premium/combobox/showcase.js +56 -47
  179. package/dist/showcase/premium/data-table/showcase.cjs +1 -1
  180. package/dist/showcase/premium/data-table/showcase.js +138 -46
  181. package/dist/showcase/premium/data-table-parts/showcase.cjs +1 -1
  182. package/dist/showcase/premium/data-table-parts/showcase.js +13 -13
  183. package/dist/showcase/premium/date-input/mock.cjs +1 -1
  184. package/dist/showcase/premium/date-input/mock.js +1 -1
  185. package/dist/showcase/premium/date-range-picker/showcase.cjs +1 -1
  186. package/dist/showcase/premium/date-range-picker/showcase.js +32 -1
  187. package/dist/showcase/premium/dropdown-menu/showcase.cjs +1 -1
  188. package/dist/showcase/premium/dropdown-menu/showcase.js +88 -54
  189. package/dist/showcase/premium/form-wrapper/mock.cjs +41 -15
  190. package/dist/showcase/premium/form-wrapper/mock.js +4 -4
  191. package/dist/showcase/premium/form-wrapper/showcase.cjs +1 -1
  192. package/dist/showcase/premium/form-wrapper/showcase.js +77 -28
  193. package/dist/showcase/premium/index.cjs +1 -1
  194. package/dist/showcase/premium/index.js +426 -467
  195. package/dist/showcase/premium/input/mock.cjs +4 -1
  196. package/dist/showcase/premium/input/mock.js +1 -1
  197. package/dist/showcase/premium/masked-input/mock.cjs +1 -1
  198. package/dist/showcase/premium/masked-input/mock.js +1 -1
  199. package/dist/showcase/premium/money-input/mock.cjs +1 -1
  200. package/dist/showcase/premium/money-input/mock.js +1 -1
  201. package/dist/showcase/premium/number-input/mock.cjs +1 -1
  202. package/dist/showcase/premium/number-input/mock.js +1 -1
  203. package/dist/showcase/premium/phone-input/mock.cjs +1 -1
  204. package/dist/showcase/premium/phone-input/mock.js +1 -1
  205. package/dist/showcase/premium/quantity-input/mock.cjs +1 -1
  206. package/dist/showcase/premium/quantity-input/mock.js +1 -1
  207. package/dist/showcase/premium/simple-select/mock.cjs +1 -1
  208. package/dist/showcase/premium/simple-select/mock.js +1 -1
  209. package/dist/showcase/premium/simple-select/showcase.cjs +1 -1
  210. package/dist/showcase/premium/simple-select/showcase.js +4 -2
  211. package/dist/showcase/preview-catalog.cjs +7 -10
  212. package/dist/showcase/preview-catalog.js +7 -7
  213. package/dist/showcase/registry-quality.cjs +1 -1
  214. package/dist/showcase/registry-quality.js +0 -23
  215. package/dist/showcase/registry-specific.cjs +1 -1
  216. package/dist/showcase/registry-specific.js +149 -383
  217. package/dist/showcase/render-registry-preview.cjs +1 -1
  218. package/dist/showcase/render-registry-preview.js +163 -195
  219. package/dist/showcase/site-data.cjs +1 -1
  220. package/dist/showcase/site-data.js +197 -941
  221. package/dist/showcase/supplemental.cjs +1 -1
  222. package/dist/showcase/supplemental.js +1 -1
  223. package/dist/showcase/tembro-registry.json.cjs +1 -1
  224. package/dist/showcase/tembro-registry.json.js +33 -51
  225. package/package.json +1 -1
  226. package/packages/cli/dist/index.cjs +2 -2
  227. package/packages/cli/vendor/src/components/actions/action-menu.tsx +149 -83
  228. package/packages/cli/vendor/src/components/actions/button-group.tsx +141 -33
  229. package/packages/cli/vendor/src/components/actions/copy-button.tsx +21 -16
  230. package/packages/cli/vendor/src/components/calendar/calendar.tsx +223 -88
  231. package/packages/cli/vendor/src/components/calendar/date-picker.tsx +73 -29
  232. package/packages/cli/vendor/src/components/calendar/date-range-picker.tsx +154 -49
  233. package/packages/cli/vendor/src/components/data-table/data-table-toolbar.tsx +71 -50
  234. package/packages/cli/vendor/src/components/data-table/data-table.tsx +65 -53
  235. package/packages/cli/vendor/src/components/data-table/demo.tsx +2 -12
  236. package/packages/cli/vendor/src/components/data-table/public.ts +1 -6
  237. package/packages/cli/vendor/src/components/display/activity-feed.tsx +98 -40
  238. package/packages/cli/vendor/src/components/display/carousel.tsx +88 -2
  239. package/packages/cli/vendor/src/components/display/code-block.tsx +58 -26
  240. package/packages/cli/vendor/src/components/display/comparison-card.tsx +15 -41
  241. package/packages/cli/vendor/src/components/display/data-state.tsx +119 -50
  242. package/packages/cli/vendor/src/components/display/demo.tsx +0 -4
  243. package/packages/cli/vendor/src/components/display/index.ts +0 -3
  244. package/packages/cli/vendor/src/components/feedback/alert.tsx +86 -28
  245. package/packages/cli/vendor/src/components/feedback/index.ts +0 -2
  246. package/packages/cli/vendor/src/components/filters/demo.tsx +0 -1
  247. package/packages/cli/vendor/src/components/filters/filter-bar.tsx +126 -54
  248. package/packages/cli/vendor/src/components/filters/index.ts +0 -1
  249. package/packages/cli/vendor/src/components/form/form-field-shell.tsx +72 -34
  250. package/packages/cli/vendor/src/components/form/form-input.tsx +118 -11
  251. package/packages/cli/vendor/src/components/form/form-select.tsx +26 -3
  252. package/packages/cli/vendor/src/components/form/form-switch.tsx +77 -58
  253. package/packages/cli/vendor/src/components/form/form-textarea.tsx +65 -51
  254. package/packages/cli/vendor/src/components/form/public.ts +0 -9
  255. package/packages/cli/vendor/src/components/inputs/async-select.tsx +126 -82
  256. package/packages/cli/vendor/src/components/inputs/combobox.tsx +66 -9
  257. package/packages/cli/vendor/src/components/inputs/simple-select.tsx +52 -24
  258. package/packages/cli/vendor/src/components/layout/app-sidebar.tsx +42 -1
  259. package/packages/cli/vendor/src/components/layout/breadcrumbs.tsx +17 -8
  260. package/packages/cli/vendor/src/components/layout/stat-card.tsx +63 -23
  261. package/packages/cli/vendor/src/components/modern/calendar-scheduler.tsx +32 -22
  262. package/packages/cli/vendor/src/components/overlay/alert-dialog.tsx +148 -24
  263. package/packages/cli/vendor/src/components/overlay/drawer.tsx +42 -30
  264. package/packages/cli/vendor/src/components/patterns/index.ts +0 -1
  265. package/packages/cli/vendor/src/components/patterns/public.ts +0 -1
  266. package/packages/cli/vendor/src/components/ui/button/index.tsx +27 -17
  267. package/packages/cli/vendor/src/components/ui/checkbox/index.tsx +22 -5
  268. package/packages/cli/vendor/src/components/ui/collapse/index.tsx +97 -16
  269. package/packages/cli/vendor/src/components/ui/dialog/index.tsx +12 -8
  270. package/packages/cli/vendor/src/components/ui/dropdown-menu/index.tsx +82 -28
  271. package/packages/cli/vendor/src/public-component-surface.ts +0 -3
  272. package/packages/cli/vendor/src/showcase/component-api-schema.ts +2 -2
  273. package/packages/cli/vendor/src/showcase/create-demo.tsx +31 -46
  274. package/packages/cli/vendor/src/showcase/fallback.tsx +80 -99
  275. package/packages/cli/vendor/src/showcase/premium/accordion/showcase.tsx +32 -2
  276. package/packages/cli/vendor/src/showcase/premium/action-menu/showcase.tsx +12 -3
  277. package/packages/cli/vendor/src/showcase/premium/activity-feed/showcase.tsx +15 -2
  278. package/packages/cli/vendor/src/showcase/premium/alert/showcase.tsx +32 -17
  279. package/packages/cli/vendor/src/showcase/premium/alert-dialog/showcase.tsx +28 -3
  280. package/packages/cli/vendor/src/showcase/premium/async-multi-select/mock.ts +6 -5
  281. package/packages/cli/vendor/src/showcase/premium/async-multi-select/showcase.tsx +5 -4
  282. package/packages/cli/vendor/src/showcase/premium/async-select/mock.ts +1 -1
  283. package/packages/cli/vendor/src/showcase/premium/async-select/showcase.tsx +36 -0
  284. package/packages/cli/vendor/src/showcase/premium/button/showcase.tsx +26 -5
  285. package/packages/cli/vendor/src/showcase/premium/button-group/showcase.tsx +20 -3
  286. package/packages/cli/vendor/src/showcase/premium/calendar/showcase.tsx +5 -0
  287. package/packages/cli/vendor/src/showcase/premium/carousel/showcase.tsx +33 -5
  288. package/packages/cli/vendor/src/showcase/premium/checkbox/showcase.tsx +46 -3
  289. package/packages/cli/vendor/src/showcase/premium/clearable-input/mock.ts +5 -3
  290. package/packages/cli/vendor/src/showcase/premium/clearable-input/showcase.tsx +5 -2
  291. package/packages/cli/vendor/src/showcase/premium/collapse/showcase.tsx +4 -0
  292. package/packages/cli/vendor/src/showcase/premium/combobox/showcase.tsx +8 -0
  293. package/packages/cli/vendor/src/showcase/premium/data-table/showcase.tsx +77 -27
  294. package/packages/cli/vendor/src/showcase/premium/data-table-parts/showcase.tsx +11 -11
  295. package/packages/cli/vendor/src/showcase/premium/date-input/mock.ts +1 -1
  296. package/packages/cli/vendor/src/showcase/premium/date-range-picker/showcase.tsx +7 -0
  297. package/packages/cli/vendor/src/showcase/premium/dropdown-menu/showcase.tsx +46 -3
  298. package/packages/cli/vendor/src/showcase/premium/form-wrapper/mock.ts +70 -44
  299. package/packages/cli/vendor/src/showcase/premium/form-wrapper/showcase.tsx +129 -12
  300. package/packages/cli/vendor/src/showcase/premium/index.ts +7 -24
  301. package/packages/cli/vendor/src/showcase/premium/input/mock.ts +2 -2
  302. package/packages/cli/vendor/src/showcase/premium/masked-input/mock.ts +1 -1
  303. package/packages/cli/vendor/src/showcase/premium/money-input/mock.ts +1 -1
  304. package/packages/cli/vendor/src/showcase/premium/number-input/mock.ts +1 -1
  305. package/packages/cli/vendor/src/showcase/premium/phone-input/mock.ts +1 -1
  306. package/packages/cli/vendor/src/showcase/premium/quantity-input/mock.ts +1 -1
  307. package/packages/cli/vendor/src/showcase/premium/simple-select/mock.ts +1 -1
  308. package/packages/cli/vendor/src/showcase/premium/simple-select/showcase.tsx +2 -1
  309. package/packages/cli/vendor/src/showcase/preview-catalog.tsx +7 -7
  310. package/packages/cli/vendor/src/showcase/registry-quality.ts +4 -28
  311. package/packages/cli/vendor/src/showcase/registry-specific.tsx +3 -178
  312. package/packages/cli/vendor/src/showcase/render-registry-preview.tsx +18 -51
  313. package/packages/cli/vendor/src/showcase/site-data.tsx +2443 -2761
  314. package/packages/cli/vendor/src/showcase/supplemental.tsx +2 -42
  315. package/packages/cli/vendor/src/showcase/tembro-registry.json +11 -58
  316. package/registry.json +11 -61
  317. package/dist/components/display/entity-card.cjs +0 -1
  318. package/dist/components/display/entity-card.d.ts +0 -18
  319. package/dist/components/display/entity-card.js +0 -61
  320. package/dist/components/display/entity-header.cjs +0 -1
  321. package/dist/components/display/entity-header.d.ts +0 -13
  322. package/dist/components/display/entity-header.js +0 -52
  323. package/dist/components/display/file-card.cjs +0 -1
  324. package/dist/components/display/file-card.d.ts +0 -14
  325. package/dist/components/display/file-card.js +0 -59
  326. package/dist/components/feedback/empty-search-state.cjs +0 -1
  327. package/dist/components/feedback/empty-search-state.d.ts +0 -11
  328. package/dist/components/feedback/empty-search-state.js +0 -45
  329. package/dist/components/feedback/empty-state.cjs +0 -1
  330. package/dist/components/feedback/empty-state.d.ts +0 -11
  331. package/dist/components/feedback/empty-state.js +0 -38
  332. package/dist/components/filters/filter-chips.cjs +0 -1
  333. package/dist/components/filters/filter-chips.d.ts +0 -18
  334. package/dist/components/filters/filter-chips.js +0 -61
  335. package/dist/components/patterns/form-builder-presets.cjs +0 -1
  336. package/dist/components/patterns/form-builder-presets.d.ts +0 -1
  337. package/dist/components/patterns/form-builder-presets.js +0 -2
  338. package/dist/components/patterns/form-builder.cjs +0 -1
  339. package/dist/components/patterns/form-builder.d.ts +0 -109
  340. package/dist/components/patterns/form-builder.js +0 -263
  341. package/dist/showcase/premium/empty-state/index.cjs +0 -1
  342. package/dist/showcase/premium/empty-state/index.d.ts +0 -2
  343. package/dist/showcase/premium/empty-state/index.js +0 -3
  344. package/dist/showcase/premium/empty-state/mock.cjs +0 -14
  345. package/dist/showcase/premium/empty-state/mock.d.ts +0 -2
  346. package/dist/showcase/premium/empty-state/mock.js +0 -31
  347. package/dist/showcase/premium/empty-state/showcase.cjs +0 -1
  348. package/dist/showcase/premium/empty-state/showcase.d.ts +0 -3
  349. package/dist/showcase/premium/empty-state/showcase.js +0 -99
  350. package/dist/showcase/premium/form-builder/index.cjs +0 -1
  351. package/dist/showcase/premium/form-builder/index.d.ts +0 -2
  352. package/dist/showcase/premium/form-builder/index.js +0 -3
  353. package/dist/showcase/premium/form-builder/mock.cjs +0 -57
  354. package/dist/showcase/premium/form-builder/mock.d.ts +0 -2
  355. package/dist/showcase/premium/form-builder/mock.js +0 -40
  356. package/dist/showcase/premium/form-builder/showcase.cjs +0 -1
  357. package/dist/showcase/premium/form-builder/showcase.d.ts +0 -3
  358. package/dist/showcase/premium/form-builder/showcase.js +0 -69
  359. package/packages/cli/vendor/src/components/display/entity-card.tsx +0 -80
  360. package/packages/cli/vendor/src/components/display/entity-header.tsx +0 -80
  361. package/packages/cli/vendor/src/components/display/file-card.tsx +0 -61
  362. package/packages/cli/vendor/src/components/feedback/empty-search-state.tsx +0 -65
  363. package/packages/cli/vendor/src/components/feedback/empty-state.tsx +0 -56
  364. package/packages/cli/vendor/src/components/filters/filter-chips.tsx +0 -89
  365. package/packages/cli/vendor/src/components/patterns/form-builder-presets.ts +0 -13
  366. package/packages/cli/vendor/src/components/patterns/form-builder.tsx +0 -443
  367. package/packages/cli/vendor/src/showcase/premium/empty-state/index.ts +0 -2
  368. package/packages/cli/vendor/src/showcase/premium/empty-state/mock.ts +0 -30
  369. package/packages/cli/vendor/src/showcase/premium/empty-state/showcase.tsx +0 -65
  370. package/packages/cli/vendor/src/showcase/premium/form-builder/index.ts +0 -2
  371. package/packages/cli/vendor/src/showcase/premium/form-builder/mock.ts +0 -79
  372. package/packages/cli/vendor/src/showcase/premium/form-builder/showcase.tsx +0 -55
@@ -1,10 +1,11 @@
1
- import * as React from "react"
2
- import { AlertTriangleIcon } from "lucide-react"
3
-
4
- import { Button } from "@/components/ui/button"
5
- import {
6
- Dialog,
7
- DialogClose,
1
+ import * as React from "react"
2
+ import { AlertTriangleIcon } from "lucide-react"
3
+
4
+ import { Button } from "@/components/ui/button"
5
+ import { Input } from "@/components/ui/input"
6
+ import {
7
+ Dialog,
8
+ DialogClose,
8
9
  DialogContent,
9
10
  DialogDescription,
10
11
  DialogFooter,
@@ -19,27 +20,104 @@ export type AlertDialogProps = Omit<React.ComponentProps<typeof Dialog>, "childr
19
20
  cancelLabel?: React.ReactNode
20
21
  actionLabel?: React.ReactNode
21
22
  actionTone?: "default" | "destructive"
23
+ cancelVariant?: React.ComponentProps<typeof Button>["variant"]
22
24
  loading?: boolean
25
+ closeOnAction?: boolean
26
+ confirmValue?: string
27
+ confirmLabel?: React.ReactNode
28
+ confirmPlaceholder?: string
29
+ confirmDescription?: React.ReactNode
30
+ confirmCaseSensitive?: boolean
31
+ severityNote?: React.ReactNode
32
+ errorMessage?: React.ReactNode
33
+ onActionError?: (error: unknown) => void
23
34
  onAction?: () => void | Promise<void>
24
35
  children?: React.ReactNode
36
+ preventCloseWhileLoading?: boolean
37
+ actionButtonProps?: Omit<React.ComponentProps<typeof Button>, "type" | "variant" | "loading" | "disabled" | "onClick" | "children">
38
+ cancelButtonProps?: Omit<React.ComponentProps<typeof Button>, "type" | "variant" | "disabled" | "children">
25
39
  }
26
40
 
27
41
  function AlertDialog({
28
42
  title = "Are you sure?",
29
43
  description,
30
44
  icon = <AlertTriangleIcon />,
31
- cancelLabel = "Cancel",
32
- actionLabel = "Continue",
33
- actionTone = "destructive",
34
- loading = false,
35
- onAction,
36
- children,
37
- ...props
38
- }: AlertDialogProps) {
39
- return (
40
- <Dialog {...props}>
41
- {children}
42
- <DialogContent>
45
+ cancelLabel = "Cancel",
46
+ actionLabel = "Continue",
47
+ actionTone = "destructive",
48
+ cancelVariant = "outline",
49
+ loading = false,
50
+ closeOnAction = true,
51
+ confirmValue,
52
+ confirmLabel = "Type to confirm",
53
+ confirmPlaceholder,
54
+ confirmDescription,
55
+ confirmCaseSensitive = true,
56
+ severityNote,
57
+ errorMessage = "Action could not be completed. Try again.",
58
+ onActionError,
59
+ onAction,
60
+ children,
61
+ preventCloseWhileLoading = true,
62
+ actionButtonProps,
63
+ cancelButtonProps,
64
+ onOpenChange,
65
+ ...props
66
+ }: AlertDialogProps) {
67
+ const [pending, setPending] = React.useState(false)
68
+ const [confirmationInput, setConfirmationInput] = React.useState("")
69
+ const [actionError, setActionError] = React.useState<React.ReactNode | null>(null)
70
+ const resolvedLoading = loading || pending
71
+ const requiresTypedConfirmation = Boolean(confirmValue?.trim())
72
+ const expectedConfirmation = confirmCaseSensitive ? confirmValue?.trim() : confirmValue?.trim().toLowerCase()
73
+ const actualConfirmation = confirmCaseSensitive ? confirmationInput.trim() : confirmationInput.trim().toLowerCase()
74
+ const canConfirm = !requiresTypedConfirmation || actualConfirmation === expectedConfirmation
75
+
76
+ React.useEffect(() => {
77
+ if (!props.open) {
78
+ setConfirmationInput("")
79
+ setActionError(null)
80
+ }
81
+ }, [props.open])
82
+
83
+ const handleOpenChange = React.useCallback(
84
+ (nextOpen: boolean, eventDetails: unknown) => {
85
+ if (!nextOpen && preventCloseWhileLoading && resolvedLoading) {
86
+ return
87
+ }
88
+ onOpenChange?.(nextOpen, eventDetails as never)
89
+ },
90
+ [onOpenChange, preventCloseWhileLoading, resolvedLoading]
91
+ )
92
+
93
+ const closeDialog = () => {
94
+ handleOpenChange(false, undefined)
95
+ }
96
+
97
+ const handleAction = async () => {
98
+ if (!canConfirm || resolvedLoading) return
99
+ setActionError(null)
100
+ if (!onAction) {
101
+ if (closeOnAction) closeDialog()
102
+ return
103
+ }
104
+
105
+ try {
106
+ setPending(true)
107
+ await onAction()
108
+ if (closeOnAction) closeDialog()
109
+ } catch (error) {
110
+ setActionError(errorMessage)
111
+ onActionError?.(error)
112
+ } finally {
113
+ setPending(false)
114
+ }
115
+ }
116
+
117
+ return (
118
+ <Dialog onOpenChange={handleOpenChange} {...props}>
119
+ {children}
120
+ <DialogContent>
43
121
  <DialogHeader>
44
122
  <div className="mb-3 inline-flex size-11 items-center justify-center rounded-2xl border border-destructive/20 bg-destructive/10 text-destructive [&_svg]:size-5">
45
123
  {icon}
@@ -47,19 +125,65 @@ function AlertDialog({
47
125
  <DialogTitle>{title}</DialogTitle>
48
126
  {description ? <DialogDescription>{description}</DialogDescription> : null}
49
127
  </DialogHeader>
128
+ {requiresTypedConfirmation ? (
129
+ <div className="grid gap-2.5">
130
+ <div className="space-y-1">
131
+ <p className="text-sm font-medium text-foreground">{confirmLabel}</p>
132
+ <p className="text-xs leading-5 text-muted-foreground">
133
+ {confirmDescription ?? (
134
+ <>
135
+ Type <span className="font-semibold text-foreground">{confirmValue}</span> to continue.
136
+ </>
137
+ )}
138
+ </p>
139
+ </div>
140
+ <Input
141
+ value={confirmationInput}
142
+ onValueChange={setConfirmationInput}
143
+ placeholder={confirmPlaceholder ?? confirmValue}
144
+ autoComplete="off"
145
+ autoCapitalize="off"
146
+ spellCheck={false}
147
+ aria-invalid={actionError ? true : undefined}
148
+ aria-describedby={actionError ? "alert-dialog-error" : undefined}
149
+ />
150
+ </div>
151
+ ) : null}
152
+ {severityNote ? (
153
+ <div className="rounded-2xl border border-border/70 bg-muted/35 px-3.5 py-3 text-sm leading-6 text-muted-foreground">
154
+ {severityNote}
155
+ </div>
156
+ ) : null}
157
+ {actionError ? (
158
+ <div
159
+ id="alert-dialog-error"
160
+ role="alert"
161
+ aria-live="polite"
162
+ className="rounded-2xl border border-destructive/20 bg-destructive/8 px-3.5 py-3 text-sm leading-6 text-destructive"
163
+ >
164
+ {actionError}
165
+ </div>
166
+ ) : null}
50
167
  <DialogFooter>
51
168
  <DialogClose render={() => (
52
- <Button type="button" variant="outline" disabled={loading}>
169
+ <Button type="button" variant={cancelVariant} disabled={resolvedLoading} {...cancelButtonProps}>
53
170
  {cancelLabel}
54
171
  </Button>
55
172
  )} />
56
- <Button type="button" variant={actionTone === "destructive" ? "destructive" : "default"} loading={loading} onClick={() => void onAction?.()}>
173
+ <Button
174
+ type="button"
175
+ variant={actionTone === "destructive" ? "destructive" : "default"}
176
+ loading={resolvedLoading}
177
+ disabled={!canConfirm && !resolvedLoading}
178
+ onClick={() => void handleAction()}
179
+ {...actionButtonProps}
180
+ >
57
181
  {actionLabel}
58
182
  </Button>
59
183
  </DialogFooter>
60
184
  </DialogContent>
61
- </Dialog>
62
- )
63
- }
185
+ </Dialog>
186
+ )
187
+ }
64
188
 
65
189
  export { AlertDialog }
@@ -3,8 +3,8 @@ import * as React from "react"
3
3
  import { Button } from "@/components/ui/button"
4
4
  import {
5
5
  Dialog,
6
- DialogClose,
7
- DialogContent,
6
+ DialogClose,
7
+ DialogContent,
8
8
  DialogDescription,
9
9
  DialogHeader,
10
10
  DialogTitle,
@@ -20,51 +20,63 @@ export type DrawerProps = Omit<React.ComponentProps<typeof Dialog>, "children">
20
20
  description?: React.ReactNode
21
21
  side?: DrawerSide
22
22
  footer?: React.ReactNode
23
+ headerClassName?: string
24
+ bodyClassName?: string
25
+ footerClassName?: string
23
26
  contentClassName?: string
24
27
  showCloseButton?: boolean
25
28
  children?: React.ReactNode
26
29
  }
27
30
 
28
- const sideClassName: Record<DrawerSide, string> = {
29
- right: "left-auto right-0 top-0 h-dvh max-h-dvh w-full max-w-md translate-x-0 translate-y-0 rounded-none rounded-l-[var(--radius-3xl)] sm:max-w-lg",
30
- left: "left-0 top-0 h-dvh max-h-dvh w-full max-w-md translate-x-0 translate-y-0 rounded-none rounded-r-[var(--radius-3xl)] sm:max-w-lg",
31
- top: "left-0 top-0 h-auto max-h-[85dvh] w-full max-w-none translate-x-0 translate-y-0 rounded-none rounded-b-[var(--radius-3xl)]",
32
- bottom: "bottom-0 left-0 top-auto h-auto max-h-[85dvh] w-full max-w-none translate-x-0 translate-y-0 rounded-none rounded-t-[var(--radius-3xl)]",
33
- }
31
+ const sideClassName: Record<DrawerSide, string> = {
32
+ right: "left-auto right-0 top-0 h-dvh max-h-dvh w-full max-w-md translate-x-0 translate-y-0 rounded-none rounded-l-[var(--radius-3xl)] data-open:slide-in-from-right data-closed:slide-out-to-right sm:max-w-lg",
33
+ left: "left-0 top-0 h-dvh max-h-dvh w-full max-w-md translate-x-0 translate-y-0 rounded-none rounded-r-[var(--radius-3xl)] data-open:slide-in-from-left data-closed:slide-out-to-left sm:max-w-lg",
34
+ top: "left-0 top-0 h-auto max-h-[85dvh] w-full max-w-none translate-x-0 translate-y-0 rounded-none rounded-b-[var(--radius-3xl)] data-open:slide-in-from-top data-closed:slide-out-to-top",
35
+ bottom: "bottom-0 left-0 top-auto h-auto max-h-[85dvh] w-full max-w-none translate-x-0 translate-y-0 rounded-none rounded-t-[var(--radius-3xl)] data-open:slide-in-from-bottom data-closed:slide-out-to-bottom",
36
+ }
34
37
 
35
38
  function Drawer({
36
39
  trigger,
37
40
  title,
38
- description,
39
- side = "right",
40
- footer,
41
- contentClassName,
42
- showCloseButton = true,
43
- children,
41
+ description,
42
+ side = "right",
43
+ footer,
44
+ headerClassName,
45
+ bodyClassName,
46
+ footerClassName,
47
+ contentClassName,
48
+ showCloseButton = true,
49
+ children,
44
50
  ...props
45
51
  }: DrawerProps) {
46
52
  return (
47
53
  <Dialog {...props}>
48
54
  {trigger ? <DialogTrigger render={trigger as React.ReactElement} /> : null}
49
- <DialogContent showCloseButton={showCloseButton} className={cn("fixed p-0", sideClassName[side], contentClassName)}>
50
- {(title || description) && (
51
- <DialogHeader className="border-b border-border/70 p-6">
52
- {title ? <DialogTitle>{title}</DialogTitle> : null}
53
- {description ? <DialogDescription>{description}</DialogDescription> : null}
54
- </DialogHeader>
55
- )}
56
- <div data-slot="drawer-body" className="min-h-0 flex-1 overflow-y-auto p-6">
57
- {children}
58
- </div>
59
- {footer ? <div data-slot="drawer-footer" className="border-t border-border/70 p-5">{footer}</div> : null}
60
- </DialogContent>
61
- </Dialog>
62
- )
63
- }
55
+ <DialogContent
56
+ size="full"
57
+ showCloseButton={showCloseButton}
58
+ className={cn("fixed grid grid-rows-[auto_minmax(0,1fr)_auto] gap-0 p-0", sideClassName[side], contentClassName)}
59
+ >
60
+ {(title || description) && (
61
+ <DialogHeader className={cn("border-b border-border/70 p-6", headerClassName)}>
62
+ {title ? <DialogTitle>{title}</DialogTitle> : null}
63
+ {description ? <DialogDescription>{description}</DialogDescription> : null}
64
+ </DialogHeader>
65
+ )}
66
+ <div data-slot="drawer-body" className={cn("min-h-0 flex-1 overflow-y-auto p-6", bodyClassName)}>
67
+ {children}
68
+ </div>
69
+ {footer ? <div data-slot="drawer-footer" className={cn("border-t border-border/70 p-5", footerClassName)}>{footer}</div> : null}
70
+ </DialogContent>
71
+ </Dialog>
72
+ )
73
+ }
64
74
 
65
75
  function DrawerCloseButton({ children = "Close", ...props }: React.ComponentProps<typeof Button>) {
66
76
  return (
67
- <DialogClose render={() => <Button type="button" variant="outline" {...props}>{children}</Button>} />
77
+ <DialogClose render={<Button type="button" variant="outline" {...props} />}>
78
+ {children}
79
+ </DialogClose>
68
80
  )
69
81
  }
70
82
 
@@ -1,3 +1,2 @@
1
1
  export * from './resource-page'
2
2
  export * from './resource-detail-page'
3
- export * from './form-builder'
@@ -1,3 +1,2 @@
1
1
  export * from "./resource-page"
2
2
  export * from "./resource-detail-page"
3
- export * from "./form-builder"
@@ -40,26 +40,30 @@ const buttonVariants = cva(
40
40
  }
41
41
  )
42
42
 
43
- export type ButtonProps = ButtonPrimitive.Props &
44
- VariantProps<typeof buttonVariants> & {
45
- loading?: boolean
46
- loadingLabel?: string
47
- leftIcon?: React.ReactNode
48
- rightIcon?: React.ReactNode
49
- }
43
+ export type ButtonProps = ButtonPrimitive.Props &
44
+ VariantProps<typeof buttonVariants> & {
45
+ loading?: boolean
46
+ loadingLabel?: string
47
+ leftIcon?: React.ReactNode
48
+ rightIcon?: React.ReactNode
49
+ fullWidth?: boolean
50
+ pressed?: boolean
51
+ }
50
52
 
51
53
  function Button({
52
54
  className,
53
55
  variant = "default",
54
56
  size = "default",
55
57
  disabled,
56
- loading = false,
57
- loadingLabel = "Loading",
58
- leftIcon,
59
- rightIcon,
60
- children,
61
- ...props
62
- }: ButtonProps) {
58
+ loading = false,
59
+ loadingLabel = "Loading",
60
+ leftIcon,
61
+ rightIcon,
62
+ fullWidth = false,
63
+ pressed = false,
64
+ children,
65
+ ...props
66
+ }: ButtonProps) {
63
67
  const isDisabled = disabled || loading
64
68
 
65
69
  return (
@@ -68,11 +72,17 @@ function Button({
68
72
  data-variant={variant ?? "default"}
69
73
  data-size={size ?? "default"}
70
74
  data-loading={loading || undefined}
75
+ data-pressed={pressed || undefined}
71
76
  disabled={isDisabled}
72
77
  aria-busy={loading || undefined}
73
- className={cn(buttonVariants({ variant, size, className }))}
74
- {...props}
75
- >
78
+ aria-pressed={pressed || undefined}
79
+ className={cn(
80
+ buttonVariants({ variant, size, className }),
81
+ fullWidth && "w-full",
82
+ pressed && "shadow-[var(--aui-control-shadow,0_1px_2px_rgba(15,23,42,0.04)),0_0_0_1px_var(--aui-focus-ring,var(--ring))]"
83
+ )}
84
+ {...props}
85
+ >
76
86
  {loading ? (
77
87
  <span
78
88
  data-slot="button-spinner"
@@ -12,10 +12,20 @@ export type CheckboxProps = Omit<
12
12
  checked?: CheckboxCheckedState
13
13
  defaultChecked?: CheckboxCheckedState
14
14
  onCheckedChange?: (checked: boolean) => void
15
+ onCheckedStateChange?: (checked: CheckboxCheckedState) => void
16
+ size?: "sm" | "md" | "lg"
17
+ invalid?: boolean
18
+ allowIndeterminate?: boolean
15
19
  }
16
20
 
17
- function getNextCheckedState(checked: CheckboxCheckedState) {
18
- return checked === true ? false : true
21
+ function getNextCheckedState(checked: CheckboxCheckedState, allowIndeterminate: boolean) {
22
+ if (!allowIndeterminate) {
23
+ return checked === true ? false : true
24
+ }
25
+
26
+ if (checked === false) return "indeterminate"
27
+ if (checked === "indeterminate") return true
28
+ return false
19
29
  }
20
30
 
21
31
  const Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(
@@ -25,6 +35,10 @@ const Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(
25
35
  checked,
26
36
  defaultChecked = false,
27
37
  onCheckedChange,
38
+ onCheckedStateChange,
39
+ size = "md",
40
+ invalid = false,
41
+ allowIndeterminate = false,
28
42
  disabled,
29
43
  onClick,
30
44
  children,
@@ -38,13 +52,14 @@ const Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(
38
52
  const dataState = currentChecked === "indeterminate" ? "indeterminate" : currentChecked ? "checked" : "unchecked"
39
53
 
40
54
  const handleClick: React.MouseEventHandler<HTMLButtonElement> = (event) => {
41
- const nextChecked = getNextCheckedState(currentChecked)
55
+ const nextChecked = getNextCheckedState(currentChecked, allowIndeterminate)
42
56
 
43
57
  if (!isControlled) {
44
58
  setInternalChecked(nextChecked)
45
59
  }
46
60
 
47
- onCheckedChange?.(nextChecked)
61
+ onCheckedStateChange?.(nextChecked)
62
+ onCheckedChange?.(nextChecked === true)
48
63
  onClick?.(event)
49
64
  }
50
65
 
@@ -55,10 +70,12 @@ const Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(
55
70
  role="checkbox"
56
71
  aria-checked={currentChecked === "indeterminate" ? "mixed" : currentChecked}
57
72
  data-state={dataState}
73
+ data-size={size}
58
74
  data-slot="checkbox"
59
75
  disabled={disabled}
76
+ aria-invalid={invalid || undefined}
60
77
  className={cn(
61
- "peer flex size-5 shrink-0 items-center justify-center rounded-[10px] border border-input/88 bg-background text-primary-foreground shadow-[inset_0_1px_0_rgba(255,255,255,0.10)] outline-none transition-[background-color,border-color,box-shadow,color,transform] hover:border-ring/30 hover:bg-background focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/45 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-primary/28 data-[state=checked]:bg-primary data-[state=checked]:shadow-[0_10px_24px_color-mix(in_oklch,var(--primary),transparent_82%)] data-[state=indeterminate]:border-primary/28 data-[state=indeterminate]:bg-primary data-[state=indeterminate]:shadow-[0_10px_24px_color-mix(in_oklch,var(--primary),transparent_82%)] dark:border-white/12 dark:bg-white/[0.04] dark:hover:bg-white/[0.08]",
78
+ "peer flex shrink-0 items-center justify-center rounded-[10px] border border-input/88 bg-background text-primary-foreground shadow-[inset_0_1px_0_rgba(255,255,255,0.10)] outline-none transition-[background-color,border-color,box-shadow,color,transform] hover:border-ring/30 hover:bg-background focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/45 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/25 data-[size=sm]:size-4 data-[size=md]:size-5 data-[size=lg]:size-6 data-[state=checked]:border-primary/28 data-[state=checked]:bg-primary data-[state=checked]:shadow-[0_10px_24px_color-mix(in_oklch,var(--primary),transparent_82%)] data-[state=indeterminate]:border-primary/28 data-[state=indeterminate]:bg-primary data-[state=indeterminate]:shadow-[0_10px_24px_color-mix(in_oklch,var(--primary),transparent_82%)] dark:border-white/12 dark:bg-white/[0.04] dark:hover:bg-white/[0.08]",
62
79
  className
63
80
  )}
64
81
  onClick={handleClick}
@@ -7,9 +7,21 @@ export type CollapseProps = React.ComponentProps<"details"> & {
7
7
  defaultOpen?: boolean
8
8
  open?: boolean
9
9
  onOpenChange?: (open: boolean) => void
10
+ variant?: "default" | "soft" | "ghost"
11
+ size?: "sm" | "md" | "lg"
10
12
  }
11
13
 
12
- function Collapse({ open, defaultOpen, onOpenChange, onToggle, className, children, ...props }: CollapseProps) {
14
+ function Collapse({
15
+ open,
16
+ defaultOpen,
17
+ onOpenChange,
18
+ onToggle,
19
+ className,
20
+ children,
21
+ variant = "default",
22
+ size = "md",
23
+ ...props
24
+ }: CollapseProps) {
13
25
  const isControlled = open !== undefined
14
26
  const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false)
15
27
  const currentOpen = isControlled ? open : internalOpen
@@ -17,8 +29,10 @@ function Collapse({ open, defaultOpen, onOpenChange, onToggle, className, childr
17
29
  return (
18
30
  <details
19
31
  data-slot="collapse"
32
+ data-variant={variant}
33
+ data-size={size}
20
34
  className={cn(
21
- "group rounded-[var(--aui-card-radius,var(--radius-xl))] border border-[color:var(--aui-card-border,var(--border))] bg-card text-card-foreground shadow-[var(--aui-card-shadow,var(--aui-control-shadow,none))] transition-[background-color,border-color,box-shadow] open:border-[color:var(--aui-control-hover-border,var(--ring))]",
35
+ "group overflow-hidden rounded-[var(--aui-card-radius,var(--radius-xl))] border border-[color:var(--aui-card-border,var(--border))] bg-card text-card-foreground shadow-[var(--aui-card-shadow,var(--aui-control-shadow,none))] transition-[background-color,border-color,box-shadow] hover:border-[color:var(--aui-control-hover-border,var(--ring))] open:border-[color:var(--aui-control-hover-border,var(--ring))] data-[variant=soft]:bg-[color:color-mix(in_oklch,var(--muted),transparent_58%)] data-[variant=soft]:shadow-none data-[variant=ghost]:border-transparent data-[variant=ghost]:bg-transparent data-[variant=ghost]:shadow-none",
22
36
  className
23
37
  )}
24
38
  onToggle={(event) => {
@@ -26,6 +40,8 @@ function Collapse({ open, defaultOpen, onOpenChange, onToggle, className, childr
26
40
  const nextOpen = event.currentTarget.open
27
41
  if (!isControlled) {
28
42
  setInternalOpen(nextOpen)
43
+ } else if (nextOpen !== currentOpen) {
44
+ event.currentTarget.open = currentOpen
29
45
  }
30
46
  onOpenChange?.(nextOpen)
31
47
  }}
@@ -40,24 +56,51 @@ function Collapse({ open, defaultOpen, onOpenChange, onToggle, className, childr
40
56
  export type CollapseTriggerProps = React.ComponentProps<"summary"> & {
41
57
  icon?: React.ReactNode
42
58
  hideIcon?: boolean
59
+ size?: "sm" | "md" | "lg"
60
+ inset?: boolean
61
+ indicatorPosition?: "start" | "end"
43
62
  }
44
63
 
45
- function CollapseTrigger({ icon, hideIcon = false, className, children, ...props }: CollapseTriggerProps) {
64
+ function CollapseTrigger({
65
+ icon,
66
+ hideIcon = false,
67
+ size = "md",
68
+ inset = false,
69
+ indicatorPosition = "end",
70
+ className,
71
+ children,
72
+ onClick,
73
+ ...props
74
+ }: CollapseTriggerProps) {
75
+ const indicator = !hideIcon ? (
76
+ <span className="shrink-0 rounded-md text-muted-foreground transition-[color,transform] group-open:rotate-180 group-open:text-foreground">
77
+ {icon ?? <ChevronDownIcon className="size-4" />}
78
+ </span>
79
+ ) : null
80
+
46
81
  return (
47
82
  <summary
48
83
  data-slot="collapse-trigger"
84
+ data-size={size}
85
+ data-inset={inset || undefined}
86
+ data-indicator-position={indicatorPosition}
49
87
  className={cn(
50
- "flex cursor-pointer list-none items-center justify-between gap-3 rounded-[calc(var(--aui-card-radius,var(--radius-xl))-1px)] px-4 py-3 text-sm font-semibold outline-none transition-[background-color,color,box-shadow] hover:bg-[color:var(--aui-control-surface-hover,var(--muted))] focus-visible:shadow-[0_0_0_1px_var(--aui-focus-ring,var(--ring)),0_0_0_5px_var(--aui-focus-ring-soft,transparent)] group-open:text-foreground [&::-webkit-details-marker]:hidden",
88
+ "rounded-[calc(var(--aui-card-radius,var(--radius-xl))-1px)] group-open:rounded-b-none flex cursor-pointer list-none items-start gap-3 px-4 text-sm font-semibold outline-none transition-[background-color,color,box-shadow,border-radius] hover:bg-[color:var(--aui-control-surface-hover,var(--muted))] focus-visible:bg-[color:var(--aui-control-surface-hover,var(--muted))] focus-visible:shadow-[0_0_0_1px_var(--aui-focus-ring,var(--ring)),0_0_0_5px_var(--aui-focus-ring-soft,transparent)] group-open:text-foreground data-[indicator-position=end]:justify-between data-[indicator-position=start]:justify-start data-[size=sm]:py-2.5 data-[size=md]:py-3.5 data-[size=lg]:py-4.5 data-[inset=true]:px-5 [&::-webkit-details-marker]:hidden",
89
+ props["aria-disabled"] && "cursor-not-allowed opacity-75 hover:bg-transparent",
51
90
  className
52
91
  )}
92
+ onClick={(event) => {
93
+ if (props["aria-disabled"]) {
94
+ event.preventDefault()
95
+ return
96
+ }
97
+ onClick?.(event)
98
+ }}
53
99
  {...props}
54
100
  >
101
+ {indicatorPosition === "start" ? indicator : null}
55
102
  <span className="min-w-0 flex-1">{children}</span>
56
- {!hideIcon && (
57
- <span className="shrink-0 rounded-md text-muted-foreground transition-[color,transform] group-open:rotate-180 group-open:text-foreground">
58
- {icon ?? <ChevronDownIcon className="size-4" />}
59
- </span>
60
- )}
103
+ {indicatorPosition === "end" ? indicator : null}
61
104
  </summary>
62
105
  )
63
106
  }
@@ -67,7 +110,7 @@ function CollapseContent({ className, ...props }: React.ComponentProps<"div">) {
67
110
  <div
68
111
  data-slot="collapse-content"
69
112
  className={cn(
70
- "border-t border-[color:var(--aui-card-border,var(--border))] px-4 py-3 text-sm leading-6 text-muted-foreground",
113
+ "border-t border-[color:var(--aui-card-border,var(--border))] bg-[color:color-mix(in_oklch,var(--muted),transparent_70%)] px-4 py-3.5 text-sm leading-6 text-muted-foreground",
71
114
  className
72
115
  )}
73
116
  {...props}
@@ -80,7 +123,14 @@ export type CollapseItem = {
80
123
  title: React.ReactNode
81
124
  content: React.ReactNode
82
125
  description?: React.ReactNode
126
+ meta?: React.ReactNode
127
+ badge?: React.ReactNode
83
128
  disabled?: boolean
129
+ disabledReason?: React.ReactNode
130
+ icon?: React.ReactNode
131
+ indicatorPosition?: CollapseTriggerProps["indicatorPosition"]
132
+ triggerClassName?: string
133
+ contentClassName?: string
84
134
  }
85
135
 
86
136
  export type CollapseGroupProps = React.ComponentProps<"div"> & {
@@ -89,9 +139,21 @@ export type CollapseGroupProps = React.ComponentProps<"div"> & {
89
139
  value?: string | string[]
90
140
  defaultValue?: string | string[]
91
141
  onValueChange?: (value: string | string[]) => void
142
+ variant?: CollapseProps["variant"]
143
+ size?: CollapseTriggerProps["size"]
92
144
  }
93
145
 
94
- function CollapseGroup({ items, type = "multiple", value, defaultValue, onValueChange, className, ...props }: CollapseGroupProps) {
146
+ function CollapseGroup({
147
+ items,
148
+ type = "multiple",
149
+ value,
150
+ defaultValue,
151
+ onValueChange,
152
+ variant = "default",
153
+ size = "md",
154
+ className,
155
+ ...props
156
+ }: CollapseGroupProps) {
95
157
  const initialValue = React.useMemo(() => {
96
158
  if (value !== undefined) return value
97
159
  if (defaultValue !== undefined) return defaultValue
@@ -119,16 +181,35 @@ function CollapseGroup({ items, type = "multiple", value, defaultValue, onValueC
119
181
  <Collapse
120
182
  key={item.key}
121
183
  open={isOpen(item.key)}
122
- onOpenChange={(open) => updateValue(item.key, open)}
184
+ onOpenChange={(open) => {
185
+ if (item.disabled) return
186
+ updateValue(item.key, open)
187
+ }}
188
+ variant={variant}
189
+ size={size}
123
190
  className={cn(item.disabled && "pointer-events-none opacity-60")}
124
191
  >
125
- <CollapseTrigger>
126
- <span className="grid gap-0.5">
127
- <span>{item.title}</span>
192
+ <CollapseTrigger
193
+ size={size}
194
+ icon={item.icon}
195
+ indicatorPosition={item.indicatorPosition}
196
+ className={item.triggerClassName}
197
+ aria-disabled={item.disabled || undefined}
198
+ title={typeof item.disabledReason === "string" ? item.disabledReason : undefined}
199
+ >
200
+ <span className="grid min-w-0 gap-0.5">
201
+ <span className="flex min-w-0 items-center gap-2">
202
+ <span className="truncate">{item.title}</span>
203
+ {item.badge ? <span className="shrink-0">{item.badge}</span> : null}
204
+ {item.meta ? <span className="ml-auto shrink-0 text-[11px] font-medium text-muted-foreground">{item.meta}</span> : null}
205
+ </span>
128
206
  {item.description && <span className="text-xs font-normal text-muted-foreground">{item.description}</span>}
207
+ {item.disabled && item.disabledReason ? (
208
+ <span className="text-[11px] font-medium text-muted-foreground">{item.disabledReason}</span>
209
+ ) : null}
129
210
  </span>
130
211
  </CollapseTrigger>
131
- <CollapseContent>{item.content}</CollapseContent>
212
+ <CollapseContent className={item.contentClassName}>{item.content}</CollapseContent>
132
213
  </Collapse>
133
214
  ))}
134
215
  </div>