themelia-react-ui 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 (588) hide show
  1. package/CHANGELOG.md +135 -0
  2. package/README.md +113 -18
  3. package/dist/{accordion-96o0pN62.js → accordion-B9MHG0cT.js} +11 -11
  4. package/dist/accordion-B9MHG0cT.js.map +1 -0
  5. package/dist/{action-menu-CHgs8vmj.js → action-menu-Dr8K-ghE.js} +48 -45
  6. package/dist/action-menu-Dr8K-ghE.js.map +1 -0
  7. package/dist/{affordance-geometry.generated-B8yGOr8-.js → affordance-geometry.generated-P-aVJisu.js} +36 -36
  8. package/dist/affordance-geometry.generated-P-aVJisu.js.map +1 -0
  9. package/dist/{ai-artifact-BZUGwBq6.js → ai-artifact-C58tQcBy.js} +210 -174
  10. package/dist/ai-artifact-C58tQcBy.js.map +1 -0
  11. package/dist/app-shell-B_IuNWOo.js +321 -0
  12. package/dist/app-shell-B_IuNWOo.js.map +1 -0
  13. package/dist/{attachment-DkoqHPPl.js → attachment-Dg_69lPS.js} +9 -9
  14. package/dist/{attachment-DkoqHPPl.js.map → attachment-Dg_69lPS.js.map} +1 -1
  15. package/dist/{auth-D2FVZ1MH.js → auth-DTkkshS8.js} +43 -46
  16. package/dist/auth-DTkkshS8.js.map +1 -0
  17. package/dist/{avatar-DWO_HHhB.js → avatar-CeZaFmNH.js} +8 -8
  18. package/dist/avatar-CeZaFmNH.js.map +1 -0
  19. package/dist/{badge-DErMA7ul.js → badge-xIiV_E7f.js} +5 -5
  20. package/dist/{badge-DErMA7ul.js.map → badge-xIiV_E7f.js.map} +1 -1
  21. package/dist/base/accordion.js +1 -1
  22. package/dist/base/action-menu.js +1 -1
  23. package/dist/base/attachment.js +1 -1
  24. package/dist/base/avatar.js +1 -1
  25. package/dist/base/badge.js +1 -1
  26. package/dist/base/batch-action-bar.js +1 -1
  27. package/dist/base/buttons.js +1 -1
  28. package/dist/base/cards.js +2 -2
  29. package/dist/base/carousel.js +3 -3
  30. package/dist/base/cascader.js +2 -372
  31. package/dist/base/chart.js +1 -1
  32. package/dist/base/choice-inputs.js +2 -2
  33. package/dist/base/code-block.js +1 -1
  34. package/dist/base/combobox.js +2 -2
  35. package/dist/base/command.js +1 -1
  36. package/dist/base/copyable.js +1 -1
  37. package/dist/base/date-pickers.js +2 -2
  38. package/dist/base/display.js +6 -6
  39. package/dist/base/feedback.js +3 -3
  40. package/dist/base/forms-numeric.js +1 -1
  41. package/dist/base/forms.js +2 -2
  42. package/dist/base/inline-edit.js +10 -10
  43. package/dist/base/item.js +1 -1
  44. package/dist/base/media-gallery.js +1 -1
  45. package/dist/base/metadata-list.js +1 -1
  46. package/dist/base/navigation.js +7 -7
  47. package/dist/base/popover-menu.js +1 -1
  48. package/dist/base/popover.js +1 -1
  49. package/dist/base/qr-code.js +1 -1
  50. package/dist/base/repeaters.js +12 -12
  51. package/dist/base/repeaters.js.map +1 -1
  52. package/dist/base/sheet.js +1 -1
  53. package/dist/base/sidebar.js +2 -2
  54. package/dist/base/signature-pad.js +7 -7
  55. package/dist/base/signature-pad.js.map +1 -1
  56. package/dist/base/skeleton.js +1 -1
  57. package/dist/base/spinner.js +4 -4
  58. package/dist/base/structure.js +1 -1
  59. package/dist/base/table.js +1 -1
  60. package/dist/base/text-inputs.js +2 -2
  61. package/dist/base/toaster.js +36 -36
  62. package/dist/base/toaster.js.map +1 -1
  63. package/dist/base/tree.js +1 -1
  64. package/dist/base/upload-queue.js +1 -1
  65. package/dist/base/upload.js +3 -3
  66. package/dist/base/value-inputs.js +1 -1
  67. package/dist/{batch-action-bar-CdfIkCsV.js → batch-action-bar-Cb8cuvyy.js} +6 -6
  68. package/dist/batch-action-bar-Cb8cuvyy.js.map +1 -0
  69. package/dist/blocks/admin.js +21 -21
  70. package/dist/blocks/admin.js.map +1 -1
  71. package/dist/blocks/ai.js +230 -216
  72. package/dist/blocks/ai.js.map +1 -1
  73. package/dist/blocks/analytics/usage-card.js +1 -1
  74. package/dist/blocks/analytics.js +325 -306
  75. package/dist/blocks/analytics.js.map +1 -1
  76. package/dist/blocks/collaboration.js +1 -1
  77. package/dist/blocks/commerce/receipt.js +1 -1
  78. package/dist/blocks/commerce.js +1259 -1184
  79. package/dist/blocks/commerce.js.map +1 -1
  80. package/dist/blocks/data-display.js +2 -2
  81. package/dist/blocks/onboarding.js +6 -6
  82. package/dist/blocks/onboarding.js.map +1 -1
  83. package/dist/blocks/planning.js +11 -11
  84. package/dist/blocks/timelines.js +1 -1
  85. package/dist/{breadcrumbs-B-WFKecD.js → breadcrumbs-J-K2kl4c.js} +6 -6
  86. package/dist/{breadcrumbs-B-WFKecD.js.map → breadcrumbs-J-K2kl4c.js.map} +1 -1
  87. package/dist/{button-DkmK-z8E.js → button-S2Cubiiz.js} +3 -3
  88. package/dist/button-S2Cubiiz.js.map +1 -0
  89. package/dist/{buttons-BbfzgczK.js → buttons-BedGfygC.js} +16 -16
  90. package/dist/buttons-BedGfygC.js.map +1 -0
  91. package/dist/cards-rNX1M4Xn.js +69 -0
  92. package/dist/cards-rNX1M4Xn.js.map +1 -0
  93. package/dist/cascader-B1MiqkBq.js +439 -0
  94. package/dist/cascader-B1MiqkBq.js.map +1 -0
  95. package/dist/chart-Darg_0Kv.js +162 -0
  96. package/dist/chart-Darg_0Kv.js.map +1 -0
  97. package/dist/{checkbox-CzYUTPeJ.js → checkbox-fflqmODR.js} +2 -2
  98. package/dist/{checkbox-CzYUTPeJ.js.map → checkbox-fflqmODR.js.map} +1 -1
  99. package/dist/{choice-inputs-JLtij2y4.js → choice-inputs-zUgBZfE4.js} +258 -257
  100. package/dist/choice-inputs-zUgBZfE4.js.map +1 -0
  101. package/dist/{code-block-CGNaUtAE.js → code-block-BzmM9Eig.js} +8 -8
  102. package/dist/code-block-BzmM9Eig.js.map +1 -0
  103. package/dist/{collapsible-Do4G0zcC.js → collapsible-BkAI_XD4.js} +5 -5
  104. package/dist/{collapsible-Do4G0zcC.js.map → collapsible-BkAI_XD4.js.map} +1 -1
  105. package/dist/{collection-content-C0e8SsTm.js → collection-content-gDh1v6O4.js} +3 -3
  106. package/dist/{collection-content-C0e8SsTm.js.map → collection-content-gDh1v6O4.js.map} +1 -1
  107. package/dist/combobox-BEx0vJgF.js +362 -0
  108. package/dist/combobox-BEx0vJgF.js.map +1 -0
  109. package/dist/{combobox-CBJDs6w_.js → combobox-BwzoXFSG.js} +254 -247
  110. package/dist/combobox-BwzoXFSG.js.map +1 -0
  111. package/dist/{command-D8NrBj-b.js → command-CrlPIL6m.js} +11 -11
  112. package/dist/command-CrlPIL6m.js.map +1 -0
  113. package/dist/{comments-Di4w0H_S.js → comments-Dmpp0YIc.js} +29 -29
  114. package/dist/{comments-Di4w0H_S.js.map → comments-Dmpp0YIc.js.map} +1 -1
  115. package/dist/components/base/action-menu/action-menu.d.ts +7 -1
  116. package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
  117. package/dist/components/base/cards/card.recipes.d.ts +6 -4
  118. package/dist/components/base/cards/partials/card-primitives.d.ts +9 -2
  119. package/dist/components/base/cards/partials/smart-card-header-row.d.ts +3 -1
  120. package/dist/components/base/cards/smart-card.types.d.ts +3 -4
  121. package/dist/components/base/cascader/cascader-panel.d.ts +76 -0
  122. package/dist/components/base/chart/chart.d.ts +6 -1
  123. package/dist/components/base/choice-inputs/choice-types.d.ts +1 -1
  124. package/dist/components/base/combobox/index.d.ts +4 -2
  125. package/dist/components/base/feedback/alert.d.ts +1 -1
  126. package/dist/components/base/forms/form-sizing.d.ts +7 -7
  127. package/dist/components/base/forms/workflow.d.ts +7 -1
  128. package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -0
  129. package/dist/components/base/metadata-list/metadata-list.d.ts +1 -1
  130. package/dist/components/base/navigation/dropdown-menu.d.ts +1 -1
  131. package/dist/components/base/navigation/page-header/page-header-commands.d.ts +14 -7
  132. package/dist/components/base/navigation/page-header/page-header.d.ts +10 -3
  133. package/dist/components/base/popover/popover.d.ts +3 -3
  134. package/dist/components/base/popover/popover.recipes.d.ts +10 -6
  135. package/dist/components/base/sheet/sheet.d.ts +2 -0
  136. package/dist/components/base/sidebar/index.d.ts +1 -1
  137. package/dist/components/base/sidebar/sidebar.d.ts +27 -5
  138. package/dist/components/base/toaster/index.d.ts +1 -0
  139. package/dist/components/blocks/ai/ai-file-tree/types.d.ts +1 -1
  140. package/dist/components/blocks/ai/ai-tool-call/types.d.ts +3 -1
  141. package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
  142. package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
  143. package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +2 -0
  144. package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +1 -1
  145. package/dist/components/blocks/commerce/cart-summary/types.d.ts +3 -1
  146. package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +1 -1
  147. package/dist/components/blocks/commerce/discount-stack/types.d.ts +3 -1
  148. package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +1 -1
  149. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +11 -2
  150. package/dist/components/blocks/commerce/index.d.ts +7 -6
  151. package/dist/components/blocks/commerce/inventory-section/inventory-section.d.ts +1 -1
  152. package/dist/components/blocks/commerce/inventory-section/types.d.ts +7 -2
  153. package/dist/components/blocks/commerce/invoice-header/index.d.ts +2 -1
  154. package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
  155. package/dist/components/blocks/commerce/invoice-header/types.d.ts +20 -6
  156. package/dist/components/blocks/commerce/invoice-line-items/invoice-line-items.d.ts +1 -1
  157. package/dist/components/blocks/commerce/invoice-line-items/types.d.ts +24 -7
  158. package/dist/components/blocks/commerce/invoice-mini/index.d.ts +2 -1
  159. package/dist/components/blocks/commerce/invoice-mini/types.d.ts +7 -1
  160. package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +1 -1
  161. package/dist/components/blocks/commerce/order-customer/types.d.ts +9 -1
  162. package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +1 -1
  163. package/dist/components/blocks/commerce/refund-status/types.d.ts +3 -1
  164. package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
  165. package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +3 -1
  166. package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
  167. package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +3 -1
  168. package/dist/components/features/activities/activities.types.d.ts +8 -2
  169. package/dist/components/features/activities/partials/activity-marker.d.ts +7 -3
  170. package/dist/components/features/activities/partials/activity-row.d.ts +24 -0
  171. package/dist/components/features/event-calendar/colors.d.ts +2 -2
  172. package/dist/components/features/event-calendar/event-calendar.types.d.ts +4 -0
  173. package/dist/components/features/filters/facets/select-facet.d.ts +2 -1
  174. package/dist/components/features/filters/filters.strings.d.ts +4 -0
  175. package/dist/components/features/filters/filters.types.d.ts +3 -0
  176. package/dist/components/features/filters/partials/filter-editor-header.d.ts +16 -0
  177. package/dist/components/features/filters/partials/filter-popover-content.d.ts +1 -1
  178. package/dist/components/features/filters/partials/nested-filter-options.d.ts +21 -0
  179. package/dist/components/features/filters/partials/regular-filter-content.d.ts +2 -1
  180. package/dist/components/features/filters/utils/filter-utils.d.ts +21 -3
  181. package/dist/components/features/global-search/global-search.types.d.ts +2 -0
  182. package/dist/components/features/global-search/partials/global-search-input.d.ts +10 -0
  183. package/dist/components/features/global-search/partials/global-search-result-row.d.ts +7 -1
  184. package/dist/components/features/media-library/media-library.strings.d.ts +2 -0
  185. package/dist/components/features/media-library/media-library.types.d.ts +14 -4
  186. package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
  187. package/dist/components/features/products/components/product-options-matrix.d.ts +1 -1
  188. package/dist/components/features/products/components/product-variant-editor.d.ts +1 -1
  189. package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
  190. package/dist/components/features/products/products.strings.d.ts +9 -1
  191. package/dist/components/features/products/products.types.d.ts +43 -6
  192. package/dist/components/features/resource/resource.d.ts +5 -1
  193. package/dist/components/features/resource/resource.types.d.ts +12 -1
  194. package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +1 -1
  195. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +12 -2
  196. package/dist/components/features/table/partials/resource-cell.d.ts +22 -5
  197. package/dist/components/features/table/table.types.d.ts +1 -1
  198. package/dist/components/layout/app-shell/app-shell.types.d.ts +35 -6
  199. package/dist/components/layout/app-shell/index.d.ts +1 -1
  200. package/dist/components/layout/app-shell/shell-regions.d.ts +27 -0
  201. package/dist/components/layout/app-shell/sidebar-inset-layout.d.ts +1 -1
  202. package/dist/components/layout/app-shell/stacked-layout.d.ts +1 -1
  203. package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
  204. package/dist/components/layout/containers/two-column-layout.d.ts +2 -0
  205. package/dist/components/layout/header/header.recipes.d.ts +6 -0
  206. package/dist/components/layout/header/header.types.d.ts +6 -6
  207. package/dist/components/layout/navigation/section-nav/section-nav.d.ts +5 -0
  208. package/dist/components/layout/page/index.d.ts +2 -1
  209. package/dist/components/layout/page/page.d.ts +1 -0
  210. package/dist/components/layout/page/page.strings.d.ts +11 -0
  211. package/dist/components/layout/page/page.types.d.ts +69 -17
  212. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  213. package/dist/components/layout/settings/settings.d.ts +9 -2
  214. package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
  215. package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts +1 -1
  216. package/dist/components/layout/sidebar/components/sidebar-navigation.d.ts +1 -1
  217. package/dist/components/layout/sidebar/index.d.ts +2 -1
  218. package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +36 -0
  219. package/dist/components/layout/sidebar/sidebar.context.d.ts +5 -7
  220. package/dist/components/layout/sidebar/sidebar.types.d.ts +48 -10
  221. package/dist/components/layout/sidebar/sidebar.utils.d.ts +9 -1
  222. package/dist/components/layout/workspace/workspace.types.d.ts +8 -1
  223. package/dist/components/ui/alert-dialog.d.ts +2 -2
  224. package/dist/components/ui/combobox.d.ts +1 -1
  225. package/dist/components/ui/dialog.d.ts +2 -2
  226. package/dist/components/ui/overlay-layer.d.ts +18 -0
  227. package/dist/components/ui/sheet.d.ts +5 -1
  228. package/dist/components/ui/sidebar-state.d.ts +82 -0
  229. package/dist/components/ui/sidebar.d.ts +5 -17
  230. package/dist/{containers-CRmHf7GP.js → containers-CIxwbZt5.js} +26 -18
  231. package/dist/containers-CIxwbZt5.js.map +1 -0
  232. package/dist/{control-group-recipes-DBXmfh2E.js → control-group-recipes-fMuFo0H7.js} +6 -6
  233. package/dist/control-group-recipes-fMuFo0H7.js.map +1 -0
  234. package/dist/{copyable-CnGCZdX4.js → copyable-DIznBqiT.js} +7 -7
  235. package/dist/{copyable-CnGCZdX4.js.map → copyable-DIznBqiT.js.map} +1 -1
  236. package/dist/{data-display-D4oujtx0.js → data-display-BdgCAw8T.js} +268 -277
  237. package/dist/data-display-BdgCAw8T.js.map +1 -0
  238. package/dist/{date-Q7jnXxpk.js → date-Cq8ioE4o.js} +5 -5
  239. package/dist/{date-Q7jnXxpk.js.map → date-Cq8ioE4o.js.map} +1 -1
  240. package/dist/{date-picker-zOt1oNss.js → date-picker-RlIzKom_.js} +446 -437
  241. package/dist/date-picker-RlIzKom_.js.map +1 -0
  242. package/dist/{date-pickers-cj8IXbDC.js → date-pickers-DY-CpXS1.js} +12 -12
  243. package/dist/{date-pickers-cj8IXbDC.js.map → date-pickers-DY-CpXS1.js.map} +1 -1
  244. package/dist/{display-BB4BL_-K.js → display-KsZLw9Ov.js} +9 -9
  245. package/dist/{display-BB4BL_-K.js.map → display-KsZLw9Ov.js.map} +1 -1
  246. package/dist/dropdown-menu-CLs8Lihj.js +194 -0
  247. package/dist/dropdown-menu-CLs8Lihj.js.map +1 -0
  248. package/dist/features/activities.js +302 -253
  249. package/dist/features/activities.js.map +1 -1
  250. package/dist/features/ai-chat.js +15 -14
  251. package/dist/features/ai-chat.js.map +1 -1
  252. package/dist/features/appointment-calendar.js +22 -22
  253. package/dist/features/appointment-calendar.js.map +1 -1
  254. package/dist/features/async-preview.js +11 -10
  255. package/dist/features/async-preview.js.map +1 -1
  256. package/dist/features/combobox.js +1 -1
  257. package/dist/features/comments.js +1 -1
  258. package/dist/features/data-view.js +13 -13
  259. package/dist/features/data-view.js.map +1 -1
  260. package/dist/features/email-composer.js +237 -238
  261. package/dist/features/email-composer.js.map +1 -1
  262. package/dist/features/event-calendar.js +140 -146
  263. package/dist/features/event-calendar.js.map +1 -1
  264. package/dist/features/filters.js +1 -1
  265. package/dist/features/global-search.js +167 -138
  266. package/dist/features/global-search.js.map +1 -1
  267. package/dist/features/kanban.js +6 -7
  268. package/dist/features/kanban.js.map +1 -1
  269. package/dist/features/map.js +269 -260
  270. package/dist/features/map.js.map +1 -1
  271. package/dist/features/media-library.js +375 -326
  272. package/dist/features/media-library.js.map +1 -1
  273. package/dist/features/mentions.js +1 -1
  274. package/dist/features/overlays.js +1 -1
  275. package/dist/features/products.js +1266 -1193
  276. package/dist/features/products.js.map +1 -1
  277. package/dist/features/questionnaire.js +13 -13
  278. package/dist/features/questionnaire.js.map +1 -1
  279. package/dist/features/resource-assignment.js +8 -8
  280. package/dist/features/resource.js +69 -66
  281. package/dist/features/resource.js.map +1 -1
  282. package/dist/features/rich-text-editor.js +2 -2
  283. package/dist/features/schema-form.js +13 -13
  284. package/dist/features/suggestions.js +3 -3
  285. package/dist/features/sync.js +3 -3
  286. package/dist/features/table.js +1 -1
  287. package/dist/features/theme-tweaker.js +94 -95
  288. package/dist/features/theme-tweaker.js.map +1 -1
  289. package/dist/{feedback-DZNL5Lg1.js → feedback-Dm4izqFn.js} +80 -79
  290. package/dist/feedback-Dm4izqFn.js.map +1 -0
  291. package/dist/{field-affordance-recipes-DjwGx8eM.js → field-affordance-recipes-DWcNcOjh.js} +4 -4
  292. package/dist/field-affordance-recipes-DWcNcOjh.js.map +1 -0
  293. package/dist/{filters-BcT-uoFy.js → filters-DzgSJpMK.js} +693 -645
  294. package/dist/filters-DzgSJpMK.js.map +1 -0
  295. package/dist/{form-field-CsgRmdit.js → form-field-BriWAXyg.js} +6 -6
  296. package/dist/{form-field-CsgRmdit.js.map → form-field-BriWAXyg.js.map} +1 -1
  297. package/dist/{form-sizing-NXgjkmBG.js → form-sizing-Bs2qFUeE.js} +4 -4
  298. package/dist/form-sizing-Bs2qFUeE.js.map +1 -0
  299. package/dist/{forms-BV5m5aQF.js → forms-C0RGnJTe.js} +17 -13
  300. package/dist/forms-C0RGnJTe.js.map +1 -0
  301. package/dist/{forms-numeric-Cd33AKbD.js → forms-numeric-DIhghX1Q.js} +86 -82
  302. package/dist/forms-numeric-DIhghX1Q.js.map +1 -0
  303. package/dist/{header-BA697l4a.js → header-DMMxG__r.js} +67 -63
  304. package/dist/header-DMMxG__r.js.map +1 -0
  305. package/dist/header.recipes-BigdJjw1.js +6 -0
  306. package/dist/header.recipes-BigdJjw1.js.map +1 -0
  307. package/dist/{hooks-BQ-L7Uu2.js → hooks-DB6CJ4MR.js} +26 -14
  308. package/dist/hooks-DB6CJ4MR.js.map +1 -0
  309. package/dist/{icon-badge-COWbCCWu.js → icon-badge-DZF-YjQp.js} +4 -4
  310. package/dist/{icon-badge-COWbCCWu.js.map → icon-badge-DZF-YjQp.js.map} +1 -1
  311. package/dist/index.js +4 -5
  312. package/dist/{input-Cdw4k0fb.js → input-CvyDQlY7.js} +8 -8
  313. package/dist/{input-Cdw4k0fb.js.map → input-CvyDQlY7.js.map} +1 -1
  314. package/dist/input-DMBwAZmr.js +21 -0
  315. package/dist/input-DMBwAZmr.js.map +1 -0
  316. package/dist/{item-BvZ2DR_x.js → item-DjCcM18E.js} +16 -16
  317. package/dist/item-DjCcM18E.js.map +1 -0
  318. package/dist/layout/app-shell.js +1 -1
  319. package/dist/layout/auth.js +1 -1
  320. package/dist/layout/containers.js +1 -1
  321. package/dist/layout/header.js +1 -1
  322. package/dist/layout/hooks.js +1 -1
  323. package/dist/layout/navigation.js +1 -1
  324. package/dist/layout/page.js +2 -2
  325. package/dist/layout/settings.js +1 -1
  326. package/dist/layout/sidebar.js +3 -3
  327. package/dist/layout/workspace.js +1 -1
  328. package/dist/layout.js +11 -11
  329. package/dist/lib/affordance-geometry.generated.d.ts +35 -35
  330. package/dist/lib/control-group-recipes.d.ts +5 -5
  331. package/dist/lib/field-affordance-recipes.d.ts +2 -2
  332. package/dist/lib/motion-recipes.d.ts +3 -0
  333. package/dist/lib/navigation-row-recipes.d.ts +7 -7
  334. package/dist/lib/overlay-anatomy-recipes.d.ts +3 -3
  335. package/dist/lib/portal-recipes.d.ts +3 -0
  336. package/dist/lib/token-merge.generated.d.ts +13 -10
  337. package/dist/lib/utils.js +1 -1
  338. package/dist/map-demo-tile.svg +1 -1
  339. package/dist/{media-gallery-CSl5W1Fy.js → media-gallery-C-vChPmE.js} +6 -6
  340. package/dist/{media-gallery-CSl5W1Fy.js.map → media-gallery-C-vChPmE.js.map} +1 -1
  341. package/dist/{mentions-RKOQaaIB.js → mentions-0_4nWuI-.js} +10 -10
  342. package/dist/{mentions-RKOQaaIB.js.map → mentions-0_4nWuI-.js.map} +1 -1
  343. package/dist/{message-INU2xsxu.js → message-g8p7eVtN.js} +7 -7
  344. package/dist/message-g8p7eVtN.js.map +1 -0
  345. package/dist/{metadata-list-qVV7AVxa.js → metadata-list-C3MkU-Om.js} +64 -64
  346. package/dist/metadata-list-C3MkU-Om.js.map +1 -0
  347. package/dist/{motion-recipes-ChBg4HBq.js → motion-recipes-DitYv6P2.js} +10 -2
  348. package/dist/motion-recipes-DitYv6P2.js.map +1 -0
  349. package/dist/navigation-C90-oQFq.js +255 -0
  350. package/dist/navigation-C90-oQFq.js.map +1 -0
  351. package/dist/{navigation-BQNcg1jT.js → navigation-DaRjthVk.js} +101 -82
  352. package/dist/navigation-DaRjthVk.js.map +1 -0
  353. package/dist/{navigation-row-recipes-WZEs-hYo.js → navigation-row-recipes-BGVLvU_O.js} +9 -9
  354. package/dist/navigation-row-recipes-BGVLvU_O.js.map +1 -0
  355. package/dist/{number-E_OiIfJz.js → number-CRU3kGuk.js} +5 -5
  356. package/dist/{number-E_OiIfJz.js.map → number-CRU3kGuk.js.map} +1 -1
  357. package/dist/overflow-tab-bar-IVFVQFV6.js +172 -0
  358. package/dist/overflow-tab-bar-IVFVQFV6.js.map +1 -0
  359. package/dist/overlays-BSgCtM2v.js +1013 -0
  360. package/dist/overlays-BSgCtM2v.js.map +1 -0
  361. package/dist/page-DUUKDAjo.js +331 -0
  362. package/dist/page-DUUKDAjo.js.map +1 -0
  363. package/dist/page-header-commands-7P3sfE9u.js +193 -0
  364. package/dist/page-header-commands-7P3sfE9u.js.map +1 -0
  365. package/dist/{pagination-Ch8X_47u.js → pagination-CgCjElfu.js} +7 -7
  366. package/dist/{pagination-Ch8X_47u.js.map → pagination-CgCjElfu.js.map} +1 -1
  367. package/dist/popover-B85RenIl.js +201 -0
  368. package/dist/popover-B85RenIl.js.map +1 -0
  369. package/dist/{popover-menu-BYaCdFhf.js → popover-menu-DlnQ2zlR.js} +7 -7
  370. package/dist/{popover-menu-BYaCdFhf.js.map → popover-menu-DlnQ2zlR.js.map} +1 -1
  371. package/dist/{popover.recipes-D3j8R8Yp.js → popover.recipes-DdiEp0rd.js} +18 -11
  372. package/dist/popover.recipes-DdiEp0rd.js.map +1 -0
  373. package/dist/portal-recipes-BpsV_iRw.js +9 -0
  374. package/dist/portal-recipes-BpsV_iRw.js.map +1 -0
  375. package/dist/{primitives-Du64iDbb.js → primitives-ByWgGUgt.js} +5 -5
  376. package/dist/{primitives-Du64iDbb.js.map → primitives-ByWgGUgt.js.map} +1 -1
  377. package/dist/primitives.js +4 -4
  378. package/dist/{progress-BvF2oCdV.js → progress-BJhQP9WX.js} +9 -9
  379. package/dist/{progress-BvF2oCdV.js.map → progress-BJhQP9WX.js.map} +1 -1
  380. package/dist/{receipt-D789Jwyy.js → receipt-tOc7B3hw.js} +7 -7
  381. package/dist/receipt-tOc7B3hw.js.map +1 -0
  382. package/dist/{rich-text-CLJEf76s.js → rich-text-Dth5E882.js} +3 -3
  383. package/dist/{rich-text-CLJEf76s.js.map → rich-text-Dth5E882.js.map} +1 -1
  384. package/dist/{rich-text-editor-Cm1dpUpQ.js → rich-text-editor-C1fOjBTd.js} +429 -430
  385. package/dist/rich-text-editor-C1fOjBTd.js.map +1 -0
  386. package/dist/{rich-text-editor-toolbar-L__e4x47.js → rich-text-editor-toolbar-laT3tpBT.js} +32 -28
  387. package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +1 -0
  388. package/dist/{scroll-area-La5RXsEk.js → scroll-area-B0dB2cBi.js} +2 -2
  389. package/dist/{scroll-area-La5RXsEk.js.map → scroll-area-B0dB2cBi.js.map} +1 -1
  390. package/dist/{separator-DAEV0w65.js → separator-Bb17I4pu.js} +2 -2
  391. package/dist/{separator-DAEV0w65.js.map → separator-Bb17I4pu.js.map} +1 -1
  392. package/dist/{separator-GNfPG-90.js → separator-Ct_WSWTJ.js} +3 -3
  393. package/dist/{separator-GNfPG-90.js.map → separator-Ct_WSWTJ.js.map} +1 -1
  394. package/dist/services/actions.js +1 -1
  395. package/dist/{settings-BA2iboic.js → settings-Bar5wiSo.js} +31 -38
  396. package/dist/settings-Bar5wiSo.js.map +1 -0
  397. package/dist/sheet-BGPERY55.js +250 -0
  398. package/dist/sheet-BGPERY55.js.map +1 -0
  399. package/dist/sidebar-D-JYMMbY.js +686 -0
  400. package/dist/sidebar-D-JYMMbY.js.map +1 -0
  401. package/dist/sidebar-f9gRWXIR.js +1001 -0
  402. package/dist/sidebar-f9gRWXIR.js.map +1 -0
  403. package/dist/skeleton-BapcJd9C.js +265 -0
  404. package/dist/skeleton-BapcJd9C.js.map +1 -0
  405. package/dist/smart-card-CW0hjetE.js +617 -0
  406. package/dist/smart-card-CW0hjetE.js.map +1 -0
  407. package/dist/{structure-C0V0_Fyf.js → structure-DuxKl954.js} +2 -2
  408. package/dist/{structure-C0V0_Fyf.js.map → structure-DuxKl954.js.map} +1 -1
  409. package/dist/style.css +1 -1
  410. package/dist/{table-CpvnzJn9.js → table-B4TE7iOV.js} +3 -3
  411. package/dist/{table-CpvnzJn9.js.map → table-B4TE7iOV.js.map} +1 -1
  412. package/dist/{table-DH7rozUv.js → table-CFOWY9pQ.js} +394 -388
  413. package/dist/table-CFOWY9pQ.js.map +1 -0
  414. package/dist/{tabs-eqVsJZWO.js → tabs-e7ko9S2o.js} +11 -11
  415. package/dist/tabs-e7ko9S2o.js.map +1 -0
  416. package/dist/{text-inputs-DXItiR0O.js → text-inputs-B1culiSK.js} +17 -17
  417. package/dist/text-inputs-B1culiSK.js.map +1 -0
  418. package/dist/theme.css +40 -37
  419. package/dist/{timelines-DmtztAY_.js → timelines-D3Sl9ueq.js} +13 -12
  420. package/dist/timelines-D3Sl9ueq.js.map +1 -0
  421. package/dist/tooltip-8wz5S_Zr.js +113 -0
  422. package/dist/tooltip-8wz5S_Zr.js.map +1 -0
  423. package/dist/{tree-CV11PURP.js → tree-CzUJHnFs.js} +8 -8
  424. package/dist/{tree-CV11PURP.js.map → tree-CzUJHnFs.js.map} +1 -1
  425. package/dist/typography/rich-text.js +1 -1
  426. package/dist/{typography-CSyJrh28.js → typography-BQnine1k.js} +12 -12
  427. package/dist/{typography-CSyJrh28.js.map → typography-BQnine1k.js.map} +1 -1
  428. package/dist/typography.js +1 -1
  429. package/dist/ui-provider-C-74NVLc.js +178 -0
  430. package/dist/ui-provider-C-74NVLc.js.map +1 -0
  431. package/dist/ui-provider.js +2 -3
  432. package/dist/{upload-C9SA0X-8.js → upload-BOW6U2tI.js} +25 -24
  433. package/dist/upload-BOW6U2tI.js.map +1 -0
  434. package/dist/{upload-queue-DhQJiSRc.js → upload-queue-qUXn1ykN.js} +16 -14
  435. package/dist/upload-queue-qUXn1ykN.js.map +1 -0
  436. package/dist/{usage-card-DVTRDmGz.js → usage-card-BeSLY0i0.js} +24 -17
  437. package/dist/usage-card-BeSLY0i0.js.map +1 -0
  438. package/dist/{utils-CF3c95Io.js → utils-B6kKb8jB.js} +237 -141
  439. package/dist/utils-B6kKb8jB.js.map +1 -0
  440. package/dist/value-inputs-skdVB2zh.js +980 -0
  441. package/dist/value-inputs-skdVB2zh.js.map +1 -0
  442. package/dist/{value-typography-ClupF0Gz.js → value-typography-uAmWUAL1.js} +2 -2
  443. package/dist/{value-typography-ClupF0Gz.js.map → value-typography-uAmWUAL1.js.map} +1 -1
  444. package/dist/{workspace-9EFVXUyk.js → workspace-DHeHv0qw.js} +50 -49
  445. package/dist/workspace-DHeHv0qw.js.map +1 -0
  446. package/docs/consumer-skill/SKILL.md +4 -3
  447. package/docs/consumer-skill/agents/themelia-ui-designer.md +96 -0
  448. package/docs/consumer-skill/examples/app-layout.tsx +52 -1
  449. package/docs/consumer-skill/examples/commerce-lines.tsx +271 -0
  450. package/docs/consumer-skill/examples/custom-composition.tsx +21 -0
  451. package/docs/consumer-skill/examples/detail.tsx +5 -4
  452. package/docs/consumer-skill/examples/editable-sections.tsx +38 -0
  453. package/docs/consumer-skill/examples/index-table.tsx +4 -4
  454. package/docs/consumer-skill/examples/manifest.json +38 -1
  455. package/docs/consumer-skill/examples/product-media.tsx +41 -0
  456. package/docs/consumer-skill/examples/product-parts.tsx +81 -0
  457. package/docs/consumer-skill/examples/rhf-edit-page.tsx +1 -1
  458. package/docs/consumer-skill/examples/rhf-overlay-form.tsx +24 -11
  459. package/docs/consumer-skill/examples/token-domain-structure.tsx +68 -0
  460. package/docs/consumer-skill/references/agents-md.md +19 -17
  461. package/docs/consumer-skill/references/analytics.md +18 -1
  462. package/docs/consumer-skill/references/commerce-composition.md +97 -0
  463. package/docs/consumer-skill/references/component-contracts.json +7131 -1754
  464. package/docs/consumer-skill/references/composition-mapping.md +17 -3
  465. package/docs/consumer-skill/references/composition.md +159 -31
  466. package/docs/consumer-skill/references/critique-rubric.md +98 -0
  467. package/docs/consumer-skill/references/custom-composition.md +261 -0
  468. package/docs/consumer-skill/references/data-reading.md +79 -0
  469. package/docs/consumer-skill/references/design-contract.md +11 -9
  470. package/docs/consumer-skill/references/discovery.md +27 -3
  471. package/docs/consumer-skill/references/domain-structures.md +124 -0
  472. package/docs/consumer-skill/references/installation.md +15 -4
  473. package/docs/consumer-skill/references/integration.md +35 -0
  474. package/docs/consumer-skill/references/product-composition.md +94 -0
  475. package/docs/consumer-skill/references/public-api.json +2881 -420
  476. package/docs/consumer-skill/references/review.md +39 -2
  477. package/docs/consumer-skill/references/rhf-workflows.md +7 -0
  478. package/docs/consumer-skill/references/screen-archetypes.md +19 -7
  479. package/docs/consumer-skill/references/screen-decisions.md +126 -0
  480. package/docs/consumer-skill/references/theming.md +17 -18
  481. package/docs/consumer-skill/references/tokens.json +9 -9
  482. package/docs/consumer-skill/references/view-craft.md +153 -0
  483. package/docs/consumer-skill/references/view-spec.md +73 -0
  484. package/docs/consumer-skill/references/workflows.md +7 -1
  485. package/docs/consumer-skill/scripts/composition-policy.mjs +39 -3
  486. package/docs/consumer-skill/scripts/composition-schema.mjs +1 -1
  487. package/docs/consumer-skill/scripts/composition.mjs +61 -5
  488. package/docs/consumer-skill/scripts/discovery.mjs +54 -0
  489. package/docs/consumer-skill/scripts/inspect-component.mjs +1 -1
  490. package/docs/consumer-skill/scripts/inspection.mjs +73 -18
  491. package/docs/consumer-skill/scripts/setup-skills.mjs +41 -6
  492. package/docs/consumer-skill/scripts/surface-policy.mjs +5 -5
  493. package/docs/consumer-skills/themelia-components/SKILL.md +14 -13
  494. package/docs/consumer-skills/themelia-composition/SKILL.md +16 -17
  495. package/docs/consumer-skills/themelia-design/SKILL.md +55 -0
  496. package/docs/consumer-skills/themelia-foundation/SKILL.md +2 -1
  497. package/docs/consumer-skills/themelia-tokenization/SKILL.md +24 -17
  498. package/package.json +1 -1
  499. package/dist/accordion-96o0pN62.js.map +0 -1
  500. package/dist/action-menu-CHgs8vmj.js.map +0 -1
  501. package/dist/affordance-geometry.generated-B8yGOr8-.js.map +0 -1
  502. package/dist/ai-artifact-BZUGwBq6.js.map +0 -1
  503. package/dist/app-shell-D63ATkIK.js +0 -237
  504. package/dist/app-shell-D63ATkIK.js.map +0 -1
  505. package/dist/auth-D2FVZ1MH.js.map +0 -1
  506. package/dist/avatar-DWO_HHhB.js.map +0 -1
  507. package/dist/base/cascader.js.map +0 -1
  508. package/dist/batch-action-bar-CdfIkCsV.js.map +0 -1
  509. package/dist/button-DkmK-z8E.js.map +0 -1
  510. package/dist/buttons-BbfzgczK.js.map +0 -1
  511. package/dist/cards-4JTWqvVe.js +0 -68
  512. package/dist/cards-4JTWqvVe.js.map +0 -1
  513. package/dist/chart-C19flDQb.js +0 -155
  514. package/dist/chart-C19flDQb.js.map +0 -1
  515. package/dist/choice-inputs-JLtij2y4.js.map +0 -1
  516. package/dist/code-block-CGNaUtAE.js.map +0 -1
  517. package/dist/combobox-CBJDs6w_.js.map +0 -1
  518. package/dist/combobox-hbhSS18O.js +0 -355
  519. package/dist/combobox-hbhSS18O.js.map +0 -1
  520. package/dist/command-D8NrBj-b.js.map +0 -1
  521. package/dist/containers-CRmHf7GP.js.map +0 -1
  522. package/dist/control-group-recipes-DBXmfh2E.js.map +0 -1
  523. package/dist/data-display-D4oujtx0.js.map +0 -1
  524. package/dist/date-picker-zOt1oNss.js.map +0 -1
  525. package/dist/dropdown-menu-CjY8Vt7W.js +0 -193
  526. package/dist/dropdown-menu-CjY8Vt7W.js.map +0 -1
  527. package/dist/feedback-DZNL5Lg1.js.map +0 -1
  528. package/dist/field-affordance-recipes-DjwGx8eM.js.map +0 -1
  529. package/dist/filters-BcT-uoFy.js.map +0 -1
  530. package/dist/form-sizing-NXgjkmBG.js.map +0 -1
  531. package/dist/forms-BV5m5aQF.js.map +0 -1
  532. package/dist/forms-numeric-Cd33AKbD.js.map +0 -1
  533. package/dist/header-BA697l4a.js.map +0 -1
  534. package/dist/hooks-BQ-L7Uu2.js.map +0 -1
  535. package/dist/input-DOPL5_QE.js +0 -21
  536. package/dist/input-DOPL5_QE.js.map +0 -1
  537. package/dist/item-BvZ2DR_x.js.map +0 -1
  538. package/dist/message-INU2xsxu.js.map +0 -1
  539. package/dist/metadata-list-qVV7AVxa.js.map +0 -1
  540. package/dist/motion-recipes-ChBg4HBq.js.map +0 -1
  541. package/dist/navigation-BQNcg1jT.js.map +0 -1
  542. package/dist/navigation-DLF3E1IC.js +0 -145
  543. package/dist/navigation-DLF3E1IC.js.map +0 -1
  544. package/dist/navigation-row-recipes-WZEs-hYo.js.map +0 -1
  545. package/dist/overflow-tab-bar-CrbqMteP.js +0 -284
  546. package/dist/overflow-tab-bar-CrbqMteP.js.map +0 -1
  547. package/dist/overlays-BlKynmde.js +0 -1004
  548. package/dist/overlays-BlKynmde.js.map +0 -1
  549. package/dist/page-CIwNUtGr.js +0 -227
  550. package/dist/page-CIwNUtGr.js.map +0 -1
  551. package/dist/page-header-commands-DFMlNYzN.js +0 -128
  552. package/dist/page-header-commands-DFMlNYzN.js.map +0 -1
  553. package/dist/popover-uwzX2vo7.js +0 -198
  554. package/dist/popover-uwzX2vo7.js.map +0 -1
  555. package/dist/popover.recipes-D3j8R8Yp.js.map +0 -1
  556. package/dist/receipt-D789Jwyy.js.map +0 -1
  557. package/dist/rich-text-editor-Cm1dpUpQ.js.map +0 -1
  558. package/dist/rich-text-editor-toolbar-L__e4x47.js.map +0 -1
  559. package/dist/settings-BA2iboic.js.map +0 -1
  560. package/dist/sheet-DoAxTb2J.js +0 -213
  561. package/dist/sheet-DoAxTb2J.js.map +0 -1
  562. package/dist/sidebar-ByqKR_W5.js +0 -512
  563. package/dist/sidebar-ByqKR_W5.js.map +0 -1
  564. package/dist/sidebar-D2iSnGJ7.js +0 -619
  565. package/dist/sidebar-D2iSnGJ7.js.map +0 -1
  566. package/dist/skeleton-CUj8O5Bd.js +0 -264
  567. package/dist/skeleton-CUj8O5Bd.js.map +0 -1
  568. package/dist/smart-card-CqkzQsK-.js +0 -614
  569. package/dist/smart-card-CqkzQsK-.js.map +0 -1
  570. package/dist/table-DH7rozUv.js.map +0 -1
  571. package/dist/tabs-eqVsJZWO.js.map +0 -1
  572. package/dist/text-inputs-DXItiR0O.js.map +0 -1
  573. package/dist/theme-scope-BJ6eE2xt.js +0 -50
  574. package/dist/theme-scope-BJ6eE2xt.js.map +0 -1
  575. package/dist/timelines-DmtztAY_.js.map +0 -1
  576. package/dist/tooltip-B4hjKtoV.js +0 -111
  577. package/dist/tooltip-B4hjKtoV.js.map +0 -1
  578. package/dist/ui-provider-CQCuCBcy.js +0 -136
  579. package/dist/ui-provider-CQCuCBcy.js.map +0 -1
  580. package/dist/upload-C9SA0X-8.js.map +0 -1
  581. package/dist/upload-queue-DhQJiSRc.js.map +0 -1
  582. package/dist/usage-card-DVTRDmGz.js.map +0 -1
  583. package/dist/use-mobile-vaLKwgyf.js +0 -15
  584. package/dist/use-mobile-vaLKwgyf.js.map +0 -1
  585. package/dist/utils-CF3c95Io.js.map +0 -1
  586. package/dist/value-inputs-C0o70p-U.js +0 -980
  587. package/dist/value-inputs-C0o70p-U.js.map +0 -1
  588. package/dist/workspace-9EFVXUyk.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-D2FVZ1MH.js","names":["_Fragment","_Fragment","React","_Fragment","useDensityConfig","resolveComponentScale","cn","buttonVariants","Button","Text","DisplayLabel","Heading","resolveTextClassNames","focusRecipes","Grid","Stack","CardContent","CardShell","CardFooter","interactionRecipes","ItemMedia","ItemDescription","ItemGroup","ItemContent","Item","ItemTitle","useLayoutLinkRenderer","containerRecipe","React$1","Fragment$1","AuthCard","props","hasHeader","eyebrow","title","description","headerEnd","surface","className","media","mediaClassName","headerClassName","contentClassName","banner","children","footer","footerClassName","isAuthBrandConfig","brand","isValidElement","useAuthLinks","resolvedRenderLink","useMemo","links","link","useAuthShell","visibleFooterLinks","footerLinks","visiblePolicyLinks","policyLinks","visibleLanguageLinks","languageLinks","visibleSocialProviders","socialProviders","provider","hasBrand","hasAfterCard","postCard","languageSwitcher","hasSplitPanel","splitPanel","variant","defaultAuthShellStrings","defaultAuthFooterLinksStrings","defaultAuthSocialProvidersStrings","defaultAuthMethodSwitchStrings","AuthFooterLinks","stringsProp","strings","useStrings","visibleLinks","leadingIcon","linkNode","Fragment","index","separator","PROVIDER_BUTTON_CLASS","GoogleMark","MicrosoftMark","GithubMark","AppleMark","ProviderIcon","KeyRound","AuthSocialProviderButton","size","defaultScale","content","buttonClassName","event","AuthSocialProviders","visibleProviders","providers","layout","SURFACE_CLASS","AuthSplitPanel","hasIntro","visibleFeatures","features","feature","SIZE_CLASS","isSplitPanelProps","panel","renderBrandContent","hasText","renderBrand","renderLink","renderSplitPanel","AuthShell","variantProp","isSplit","panelFirst","splitSide","showStackedPanel","splitMobile","brandNode","main","align","mainClassName","stackClassName","cardMedia","cardMediaClassName","cardFooter","cardClassName","cardContentClassName","hasSocialProviders","socialProvidersLayout","socialDivider","Globe2","splitGridClassName","splitPanelClassName","AuthForm","formProps","renderProps","AuthFormRow","firstEnabledOption","options","option","useAuthMethodSwitch","visibleOptions","fallbackValue","defaultValue","internalValue","setInternalValue","isControlled","value","selectedValue","selectedOption","setValue","nextOption","nextValue","onValueChange","AuthMethodSwitch","ariaLabel","rootProps","segmented","optionButtons","selected","optionContent","divider"],"sources":["../src/components/layout/auth/auth-card.tsx","../src/components/layout/auth/auth-hooks.tsx","../src/components/layout/auth/auth.strings.ts","../src/components/layout/auth/auth-footer-links.tsx","../src/components/layout/auth/auth-social-providers.tsx","../src/components/layout/auth/auth-split-panel.tsx","../src/components/layout/auth/auth-shell.tsx","../src/components/layout/auth/auth-form.tsx","../src/components/layout/auth/auth-method-switch.tsx"],"sourcesContent":["import { CardContent, CardFooter, CardShell } from '../../base/cards';\nimport { Stack } from '../../base/structure';\nimport { DisplayLabel, Heading, Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\n\nimport type { AuthCardProps } from './auth.types';\n\nexport function AuthCard({\n\tsurface = 'card',\n\teyebrow,\n\ttitle,\n\tdescription,\n\theaderEnd,\n\tbanner,\n\tmedia,\n\tfooter,\n\tchildren,\n\tclassName,\n\theaderClassName,\n\tmediaClassName,\n\tcontentClassName,\n\tfooterClassName,\n\t...props\n}: AuthCardProps) {\n\tconst hasHeader = Boolean(eyebrow || title || description || headerEnd);\n\n\treturn (\n\t\t<CardShell\n\t\t\tdata-slot=\"auth-card\"\n\t\t\tdata-surface={surface}\n\t\t\tclassName={cn(\n\t\t\t\t'auth-card--component',\n\t\t\t\t'w-full min-w-0 gap-0 py-0',\n\t\t\t\t// `bare` keeps the header/body/footer rhythm and drops only the\n\t\t\t\t// framing, so the same composition works on a page that is itself\n\t\t\t\t// the surface. Padding goes too — without a frame it reads as drift.\n\t\t\t\tsurface === 'card'\n\t\t\t\t\t? 'overflow-hidden rounded-radius border border-border bg-card text-card-foreground shadow-sm'\n\t\t\t\t\t: 'border-0 bg-transparent text-inherit shadow-none',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{!!media && (\n\t\t\t\t<div className={cn('auth-card--media', 'min-h-12 border-b border-border/60 bg-muted/50', mediaClassName)}>\n\t\t\t\t\t{media}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{!!hasHeader && (\n\t\t\t\t<header className={cn('auth-card--header min-w-0', surface === 'card' ? 'p-surface pb-0' : 'p-0', headerClassName)}>\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"xl\" align=\"start\" justify=\"between\" className=\"auth-card--header-layout min-w-0\">\n\t\t\t\t\t\t<Stack gap=\"normal\" className=\"min-w-0\">\n\t\t\t\t\t\t\t{!!eyebrow && (\n\t\t\t\t\t\t\t\t<DisplayLabel tag=\"div\" className=\"auth-card--eyebrow text-inherit\">\n\t\t\t\t\t\t\t\t\t{eyebrow}\n\t\t\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!title && (\n\t\t\t\t\t\t\t\t<Heading\n\t\t\t\t\t\t\t\t\ttag=\"h1\"\n\t\t\t\t\t\t\t\t\tcontainerClassName=\"space-y-0\"\n\t\t\t\t\t\t\t\t\tsize=\"base\"\n\t\t\t\t\t\t\t\t\tclassName=\"auth-card--title text-inherit\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t</Heading>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!description && (\n\t\t\t\t\t\t\t\t<Text tag=\"div\" type=\"secondary\" lineHeight=\"relaxed\" className=\"auth-card--description max-w-prose\">\n\t\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t{!!headerEnd && <div className=\"auth-card--header-end shrink-0\">{headerEnd}</div>}\n\t\t\t\t\t</Stack>\n\t\t\t\t</header>\n\t\t\t)}\n\n\t\t\t<CardContent\n\t\t\t\tpadding={surface === 'card' ? 'md' : 'none'}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'auth-card--content',\n\t\t\t\t\t'min-w-0',\n\t\t\t\t\tcontentClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div className={cn('auth-card--body min-w-0', surface === 'bare' && 'py-space-xl')}>\n\t\t\t\t{!!banner && <div className=\"auth-card--banner mb-space-xl min-w-0\">{banner}</div>}\n\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</CardContent>\n\n\t\t\t{!!footer && (\n\t\t\t\t<CardFooter\n\t\t\t\t\tpadding=\"md\"\n\t\t\t\t\tclassName={cn('auth-card--footer', 'min-w-0 flex-wrap border-t border-border/60', footerClassName)}\n\t\t\t\t>\n\t\t\t\t\t{footer}\n\t\t\t\t</CardFooter>\n\t\t\t)}\n\t\t</CardShell>\n\t);\n}\n","import { isValidElement, useMemo } from 'react';\n\nimport { useLayoutLinkRenderer } from '../hooks';\nimport type {\n\tAuthBrand,\n\tAuthBrandConfig,\n\tUseAuthLinksOptions,\n\tUseAuthLinksReturn,\n\tUseAuthShellOptions,\n\tUseAuthShellReturn,\n} from './auth.types';\n\nexport function isAuthBrandConfig(brand: AuthBrand | undefined): brand is AuthBrandConfig {\n\treturn Boolean(\n\t\tbrand &&\n\t\t\ttypeof brand === 'object' &&\n\t\t\t!isValidElement(brand) &&\n\t\t\t('logo' in brand || 'label' in brand || 'description' in brand || 'href' in brand),\n\t);\n}\n\nexport function useAuthLinks({\n\tlinks = [],\n\trenderLink,\n}: UseAuthLinksOptions = {}): UseAuthLinksReturn {\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\tconst visibleLinks = useMemo(\n\t\t() => links.filter((link) => link.visible !== false),\n\t\t[links],\n\t);\n\n\treturn {\n\t\tlinks: visibleLinks,\n\t\trenderLink: resolvedRenderLink,\n\t};\n}\n\nexport function useAuthShell({\n\tvariant = 'card',\n\tbrand,\n\tfooter,\n\tfooterLinks = [],\n\tpolicyLinks = [],\n\tlanguageLinks = [],\n\tlanguageSwitcher,\n\tpostCard,\n\tsocialProviders = [],\n\tsplitPanel,\n\trenderLink,\n}: UseAuthShellOptions = {}): UseAuthShellReturn {\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\tconst visibleFooterLinks = useMemo(\n\t\t() => footerLinks.filter((link) => link.visible !== false),\n\t\t[footerLinks],\n\t);\n\tconst visiblePolicyLinks = useMemo(\n\t\t() => policyLinks.filter((link) => link.visible !== false),\n\t\t[policyLinks],\n\t);\n\tconst visibleLanguageLinks = useMemo(\n\t\t() => languageLinks.filter((link) => link.visible !== false),\n\t\t[languageLinks],\n\t);\n\tconst visibleSocialProviders = useMemo(\n\t\t() => socialProviders.filter((provider) => provider.visible !== false),\n\t\t[socialProviders],\n\t);\n\tconst hasBrand = Boolean(\n\t\tbrand &&\n\t\t\t(isAuthBrandConfig(brand)\n\t\t\t\t? brand.logo || brand.label || brand.description\n\t\t\t\t: brand),\n\t);\n\tconst hasAfterCard = Boolean(\n\t\tpostCard ||\n\t\t\tfooter ||\n\t\t\tlanguageSwitcher ||\n\t\t\tvisibleFooterLinks.length > 0 ||\n\t\t\tvisiblePolicyLinks.length > 0 ||\n\t\t\tvisibleLanguageLinks.length > 0,\n\t);\n\tconst hasSplitPanel = Boolean(splitPanel);\n\n\treturn {\n\t\t// Only `split` depends on a panel being supplied; falling back to `card`\n\t\t// for every other variant would silently flatten them. `bare` in\n\t\t// particular has nothing to do with the split panel, so clamping on\n\t\t// `hasSplitPanel` alone discarded it.\n\t\tvariant: variant === 'split' && !hasSplitPanel ? 'card' : variant,\n\t\thasBrand,\n\t\thasAfterCard,\n\t\thasSplitPanel,\n\t\thasSocialProviders: visibleSocialProviders.length > 0,\n\t\trenderLink: resolvedRenderLink,\n\t\tfooterLinks: visibleFooterLinks,\n\t\tpolicyLinks: visiblePolicyLinks,\n\t\tlanguageLinks: visibleLanguageLinks,\n\t\tsocialProviders: visibleSocialProviders,\n\t};\n}\n","export interface AuthShellStrings {\n\tsocialDivider: string;\n\tsocialProvidersLabel: string;\n\tfooterLinksLabel: string;\n\tpolicyLinksLabel: string;\n\tlanguageLinksLabel: string;\n}\n\nexport const defaultAuthShellStrings: AuthShellStrings = {\n\tsocialDivider: 'or continue with email',\n\tsocialProvidersLabel: 'Social sign-in options',\n\tfooterLinksLabel: 'Authentication links',\n\tpolicyLinksLabel: 'Policies',\n\tlanguageLinksLabel: 'Language options',\n};\n\nexport interface AuthFooterLinksStrings {\n\tlabel: string;\n}\n\nexport const defaultAuthFooterLinksStrings: AuthFooterLinksStrings = {\n\tlabel: 'Authentication links',\n};\n\nexport interface AuthSocialProvidersStrings {\n\tlabel: string;\n}\n\nexport const defaultAuthSocialProvidersStrings: AuthSocialProvidersStrings = {\n\tlabel: 'Social sign-in options',\n};\n\nexport interface AuthMethodSwitchStrings {\n\tlabel: string;\n\tdivider: string;\n}\n\nexport const defaultAuthMethodSwitchStrings: AuthMethodSwitchStrings = {\n\tlabel: 'Authentication method',\n\tdivider: 'or',\n};\n","import { Fragment } from 'react';\n\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { useAuthLinks } from './auth-hooks';\nimport { defaultAuthFooterLinksStrings } from './auth.strings';\nimport type { AuthFooterLinksProps } from './auth.types';\n\nexport function AuthFooterLinks({\n\tlinks,\n\tleadingIcon,\n\tseparator = '·',\n\trenderLink,\n\tclassName,\n\tstrings: stringsProp,\n\t...props\n}: AuthFooterLinksProps) {\n\tconst strings = useStrings(defaultAuthFooterLinksStrings, stringsProp);\n\tconst { links: visibleLinks, renderLink: resolvedRenderLink } = useAuthLinks({\n\t\tlinks,\n\t\trenderLink,\n\t});\n\n\tif (visibleLinks.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<nav\n\t\t\taria-label={props['aria-label'] ?? strings.label}\n\t\t\tclassName={cn(\n\t\t\t\t'auth-footer-links--component',\n\t\t\t\t'flex flex-wrap items-center justify-center gap-x-space-md gap-y-space-xs text-center',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{!!leadingIcon && (\n\t\t\t\t<span className=\"auth-footer-links--icon flex shrink-0 items-center text-muted-foreground\" aria-hidden=\"true\">\n\t\t\t\t\t{leadingIcon}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{visibleLinks.map((link, index) => {\n\t\t\t\tconst linkNode = resolvedRenderLink({\n\t\t\t\t\thref: link.href,\n\t\t\t\t\ttarget: link.target,\n\t\t\t\t\trel: link.rel,\n\t\t\t\t\texternal: link.external,\n\t\t\t\t\tdisabled: link.disabled,\n\t\t\t\t\tonClick: link.onClick,\n\t\t\t\t\tclassName: cn(\n\t\t\t\t\t\t'auth-footer-links--item',\n\t\t\t\t\t\t'text-muted-foreground transition-colors hover:text-foreground',\n\t\t\t\t\t\tlink.disabled && 'pointer-events-none opacity-50',\n\t\t\t\t\t),\n\t\t\t\t\tchildren: (\n\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" className=\"text-inherit\">\n\t\t\t\t\t\t\t{link.label}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t),\n\t\t\t\t});\n\n\t\t\t\treturn (\n\t\t\t\t\t<Fragment key={link.id ?? index}>\n\t\t\t\t\t\t{index > 0 && (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclassName=\"auth-footer-links--separator\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{separator}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{linkNode}\n\t\t\t\t\t</Fragment>\n\t\t\t\t);\n\t\t\t})}\n\t\t</nav>\n\t);\n}\n","/* oxlint-disable shadcn/no-raw-colors -- Official provider logos are external brand artwork, not themeable UI states. */\nimport { KeyRound } from 'lucide-react';\n\nimport { Button } from '../../base/buttons';\nimport { buttonVariants } from '../../base/buttons/button.variants';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { Grid } from '../../base/structure';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { useLayoutLinkRenderer } from '../hooks';\nimport { defaultAuthSocialProvidersStrings } from './auth.strings';\nimport type {\n\tAuthSocialProvider,\n\tAuthSocialProviderButtonProps,\n\tAuthSocialProvidersProps,\n} from './auth.types';\n\nconst PROVIDER_BUTTON_CLASS = 'auth-social-provider-button--component';\n\nfunction GoogleMark() {\n\treturn (\n\t\t<svg data-artwork=\"auth-provider-logo\"\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName=\"size-icon\"\n\t\t\tviewBox=\"0 0 256 262\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<path fill=\"#4285F4\" d=\"M255.878 133.451c0-10.734-.871-18.567-2.756-26.69H130.55v48.448h71.947c-1.45 12.04-9.283 30.172-26.69 42.356l-.244 1.622 38.755 30.023 2.685.268c24.659-22.774 38.875-56.282 38.875-96.027\" />\n\t\t\t<path fill=\"#34A853\" d=\"M130.55 261.1c35.248 0 64.839-11.605 86.453-31.622l-41.196-31.913c-11.024 7.688-25.82 13.055-45.257 13.055-34.523 0-63.824-22.773-74.269-54.25l-1.531.13-40.298 31.187-.527 1.465C35.393 231.798 79.49 261.1 130.55 261.1\" />\n\t\t\t<path fill=\"#FBBC05\" d=\"M56.281 156.37c-2.756-8.123-4.351-16.827-4.351-25.82 0-8.994 1.595-17.697 4.206-25.82l-.073-1.73L15.26 71.312l-1.335.635C5.077 89.644 0 109.517 0 130.55s5.077 40.905 13.925 58.602l42.356-32.782\" />\n\t\t\t<path fill=\"#EB4335\" d=\"M130.55 50.479c24.514 0 41.05 10.589 50.479 19.438l36.844-35.974C195.245 12.91 165.798 0 130.55 0 79.49 0 35.393 29.301 13.925 71.947l42.211 32.783c10.59-31.477 39.891-54.251 74.414-54.251\" />\n\t\t</svg>\n\t);\n}\n\nfunction MicrosoftMark() {\n\treturn (\n\t\t<svg data-artwork=\"auth-provider-logo\" aria-hidden=\"true\" className=\"size-icon\" viewBox=\"0 0 23 23\">\n\t\t\t<path fill=\"#f25022\" d=\"M1 1h10v10H1z\" />\n\t\t\t<path fill=\"#7fba00\" d=\"M12 1h10v10H12z\" />\n\t\t\t<path fill=\"#00a4ef\" d=\"M1 12h10v10H1z\" />\n\t\t\t<path fill=\"#ffb900\" d=\"M12 12h10v10H12z\" />\n\t\t</svg>\n\t);\n}\n\nfunction GithubMark() {\n\treturn (\n\t\t<svg data-artwork=\"auth-provider-logo\" aria-hidden=\"true\" className=\"size-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n\t\t\t<path d=\"M12 2C6.48 2 2 6.58 2 12.24c0 4.53 2.87 8.37 6.84 9.73.5.09.68-.22.68-.49 0-.24-.01-.88-.01-1.73-2.78.62-3.37-1.37-3.37-1.37-.45-1.18-1.11-1.5-1.11-1.5-.91-.64.07-.63.07-.63 1 .07 1.53 1.06 1.53 1.06.9 1.57 2.36 1.12 2.93.86.09-.67.35-1.12.64-1.38-2.22-.26-4.56-1.14-4.56-5.07 0-1.12.39-2.04 1.03-2.76-.1-.26-.45-1.31.1-2.72 0 0 .84-.28 2.75 1.05A9.32 9.32 0 0 1 12 6.95c.85 0 1.7.12 2.5.35 1.9-1.33 2.74-1.05 2.74-1.05.55 1.41.2 2.46.1 2.72.64.72 1.03 1.64 1.03 2.76 0 3.94-2.34 4.8-4.57 5.06.36.32.68.95.68 1.91 0 1.38-.01 2.49-.01 2.83 0 .27.18.59.69.49A10.12 10.12 0 0 0 22 12.24C22 6.58 17.52 2 12 2Z\" />\n\t\t</svg>\n\t);\n}\n\nfunction AppleMark() {\n\treturn (\n\t\t<svg data-artwork=\"auth-provider-logo\" aria-hidden=\"true\" className=\"size-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n\t\t\t<path d=\"M16.37 12.05c-.02-2.26 1.85-3.35 1.94-3.4-1.06-1.55-2.69-1.76-3.26-1.78-1.37-.14-2.7.82-3.39.82-.71 0-1.78-.8-2.93-.78-1.5.02-2.9.89-3.67 2.25-1.57 2.72-.4 6.72 1.1 8.92.76 1.08 1.64 2.29 2.79 2.25 1.13-.05 1.55-.72 2.91-.72 1.35 0 1.75.72 2.93.69 1.21-.02 1.98-1.09 2.71-2.18.87-1.24 1.22-2.46 1.23-2.52-.03-.01-2.34-.9-2.36-3.55ZM14.16 5.42c.61-.76 1.03-1.8.91-2.85-.88.04-1.98.61-2.62 1.35-.57.65-1.08 1.73-.95 2.74.99.08 2.02-.5 2.66-1.24Z\" />\n\t\t</svg>\n\t);\n}\n\nfunction ProviderIcon({ provider }: { provider: AuthSocialProvider }) {\n\tif (provider.icon) return <>{provider.icon}</>;\n\tswitch (provider.provider) {\n\t\tcase 'google':\n\t\t\treturn <GoogleMark />;\n\t\tcase 'github':\n\t\t\treturn <GithubMark />;\n\t\tcase 'microsoft':\n\t\t\treturn <MicrosoftMark />;\n\t\tcase 'apple':\n\t\t\treturn <AppleMark />;\n\t\tdefault:\n\t\t\treturn <KeyRound className=\"size-icon\" aria-hidden=\"true\" />;\n\t}\n}\n\nexport function AuthSocialProviderButton({\n\tprovider,\n\trenderLink,\n\tclassName,\n}: AuthSocialProviderButtonProps) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(undefined, defaultScale);\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\tconst content = (\n\t\t<>\n\t\t\t<ProviderIcon provider={provider} />\n\t\t\t<Text tag=\"span\" className=\"text-inherit\">\n\t\t\t\t{provider.label}\n\t\t\t</Text>\n\t\t</>\n\t);\n\tconst buttonClassName = cn(\n\t\tPROVIDER_BUTTON_CLASS,\n\t\tbuttonVariants({size, tone: 'secondary', buttonStyle: 'outline', fullWidth: true}),\n\t\tprovider.disabled && 'pointer-events-none opacity-50',\n\t\tclassName,\n\t);\n\n\tif (provider.href) {\n\t\treturn resolvedRenderLink({\n\t\t\thref: provider.href,\n\t\t\ttarget: provider.target,\n\t\t\trel: provider.rel,\n\t\t\texternal: provider.external,\n\t\t\tdisabled: provider.disabled,\n\t\t\tonClick: provider.onClick,\n\t\t\tclassName: buttonClassName,\n\t\t\tchildren: content,\n\t\t});\n\t}\n\n\treturn (\n\t\t<Button\n\t\t\ttype=\"button\"\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"outline\"\n\t\t\tfullWidth\n\t\t\tdisabled={provider.disabled}\n\t\t\tclassName={cn('auth-social-provider-button--component', className)}\n\t\t\tonClick={(event) => provider.onClick?.(event)}\n\t\t>\n\t\t\t{content}\n\t\t</Button>\n\t);\n}\n\nexport function AuthSocialProviders({\n\tproviders,\n\tlayout = 'stack',\n\trenderLink,\n\tclassName,\n\tstrings: stringsProp,\n\t...props\n}: AuthSocialProvidersProps) {\n\tconst strings = useStrings(defaultAuthSocialProvidersStrings, stringsProp);\n\tconst visibleProviders = providers?.filter((provider) => provider.visible !== false) ?? [];\n\n\tif (visibleProviders.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Grid\n\t\t\tcolumns={layout === 'grid' ? { base: 1, sm: 2 } : 1}\n\t\t\tgap=\"md\"\n\t\t\trole=\"group\"\n\t\t\taria-label={props['aria-label'] ?? strings.label}\n\t\t\tdata-layout={layout}\n\t\t\tclassName={cn(\n\t\t\t\t'auth-social-providers--component',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{visibleProviders.map((provider) => (\n\t\t\t\t<AuthSocialProviderButton\n\t\t\t\t\tkey={provider.id ?? String(provider.label)}\n\t\t\t\t\tprovider={provider}\n\t\t\t\t\trenderLink={renderLink}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</Grid>\n\t);\n}\n","import {\n\tItem,\n\tItemContent,\n\tItemDescription,\n\tItemGroup,\n\tItemMedia,\n\tItemTitle,\n} from '../../base/item';\nimport { Stack } from '../../base/structure';\nimport { DisplayLabel, Heading, Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\n\nimport type { AuthSplitPanelProps } from './auth.types';\n\nconst SURFACE_CLASS: Record<NonNullable<AuthSplitPanelProps['surface']>, string> = {\n\tcard: 'border-border bg-card text-card-foreground',\n\tmuted: 'border-border bg-muted/30',\n};\n\nexport function AuthSplitPanel({\n\teyebrow,\n\ttitle,\n\tdescription,\n\tmedia,\n\tfeatures,\n\tfooter,\n\tchildren,\n\tsurface = 'muted',\n\tclassName,\n\tcontentClassName,\n\t...props\n}: AuthSplitPanelProps) {\n\tconst hasIntro = Boolean(eyebrow || title || description);\n\tconst visibleFeatures = features?.filter((feature) => feature.title) ?? [];\n\n\treturn (\n\t\t<Stack\n\t\t\trender={<aside />}\n\t\t\tgap=\"none\"\n\t\t\tjustify=\"between\"\n\t\t\tdata-slot=\"auth-split-panel\"\n\t\t\tdata-surface={surface}\n\t\t\tclassName={cn(\n\t\t\t\t'auth-split-panel--component',\n\t\t\t\t'box-border min-h-full w-full overflow-hidden border',\n\t\t\t\tSURFACE_CLASS[surface],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Stack\n\t\t\t\tgap=\"2xl\"\n\t\t\t\tjustify=\"center\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'auth-split-panel--content',\n\t\t\t\t\t'min-h-full p-surface md:p-surface-lg',\n\t\t\t\t\tcontentClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{!!media && (\n\t\t\t\t\t<div className=\"auth-split-panel--media overflow-hidden rounded-radius border border-border/60 bg-card text-card-foreground\">\n\t\t\t\t\t\t{media}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!hasIntro && (\n\t\t\t\t\t<Stack gap=\"md\" className=\"auth-split-panel--intro max-w-xl\">\n\t\t\t\t\t\t{!!eyebrow && (\n\t\t\t\t\t\t\t<DisplayLabel tag=\"div\" className=\"auth-split-panel--eyebrow text-inherit\">\n\t\t\t\t\t\t\t\t{eyebrow}\n\t\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!title && (\n\t\t\t\t\t\t\t<Heading\n\t\t\t\t\t\t\t\ttag=\"h2\"\n\t\t\t\t\t\t\t\tcontainerClassName=\"space-y-0\"\n\t\t\t\t\t\t\t\tsize=\"base\"\n\t\t\t\t\t\t\t\tclassName=\"auth-split-panel--title text-inherit\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t</Heading>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!description && (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\ttag=\"div\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tlineHeight=\"relaxed\"\n\t\t\t\t\t\t\t\tclassName=\"auth-split-panel--description max-w-prose\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\n\t\t\t\t{visibleFeatures.length > 0 && (\n\t\t\t\t\t<ItemGroup className=\"auth-split-panel--features\">\n\t\t\t\t\t\t{visibleFeatures.map((feature, index) => (\n\t\t\t\t\t\t\t<Item\n\t\t\t\t\t\t\t\tkey={feature.id ?? index}\n\t\t\t\t\t\t\t\tvariant=\"muted\"\n\t\t\t\t\t\t\t\tclassName=\"auth-split-panel--feature bg-card text-card-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{!!feature.icon && (\n\t\t\t\t\t\t\t\t\t<ItemMedia variant=\"icon\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t{feature.icon}\n\t\t\t\t\t\t\t\t\t</ItemMedia>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<ItemContent className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t<ItemTitle>{feature.title}</ItemTitle>\n\t\t\t\t\t\t\t\t\t{!!feature.description && (\n\t\t\t\t\t\t\t\t\t\t<ItemDescription clamp=\"none\">{feature.description}</ItemDescription>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</ItemContent>\n\t\t\t\t\t\t\t</Item>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ItemGroup>\n\t\t\t\t)}\n\n\t\t\t\t{children}\n\n\t\t\t\t{!!footer && (\n\t\t\t\t\t<div className=\"auth-split-panel--footer\">\n\t\t\t\t\t\t{footer}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</Stack>\n\t);\n}\n","import { Globe2 } from 'lucide-react';\nimport { isValidElement, type ReactNode } from 'react';\n\nimport { Text } from '../../typography';\nimport { Stack } from '../../base/structure';\nimport { containerRecipe } from '../containers/container.recipes';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { AuthCard } from './auth-card';\nimport { AuthFooterLinks } from './auth-footer-links';\nimport { isAuthBrandConfig, useAuthShell } from './auth-hooks';\nimport { defaultAuthShellStrings } from './auth.strings';\nimport { AuthSocialProviders } from './auth-social-providers';\nimport { AuthSplitPanel } from './auth-split-panel';\nimport type {\n\tAuthBrand,\n\tAuthBrandConfig,\n\tAuthShellProps,\n\tAuthSplitPanelProps,\n} from './auth.types';\n\nconst SIZE_CLASS: Record<NonNullable<AuthShellProps['size']>, string> = {\n\tsm: 'max-w-sm',\n\tmd: 'max-w-md',\n\tlg: 'max-w-lg',\n};\n\nfunction isSplitPanelProps(panel: AuthShellProps['splitPanel']): panel is AuthSplitPanelProps {\n\treturn Boolean(panel && typeof panel === 'object' && !isValidElement(panel));\n}\n\nfunction renderBrandContent(brand: AuthBrandConfig): ReactNode {\n\tconst hasText = Boolean(brand.label || brand.description);\n\n\treturn (\n\t\t<>\n\t\t\t{!!brand.logo && (\n\t\t\t\t<div className=\"auth-shell--brand-logo shrink-0\">\n\t\t\t\t\t{brand.logo}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!!hasText && (\n\t\t\t\t<div className=\"auth-shell--brand-text min-w-0\">\n\t\t\t\t\t{!!brand.label && (\n\t\t\t\t\t\t<Text tag=\"div\" weight=\"semibold\" className=\"auth-shell--brand-label\">\n\t\t\t\t\t\t\t{brand.label}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!brand.description && (\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\ttag=\"div\"\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\tclassName=\"auth-shell--brand-description\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{brand.description}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n}\n\nfunction renderBrand({\n\tbrand,\n\trenderLink,\n}: {\n\t/** Logo, name, and href for the product mark. */\n\tbrand?: AuthBrand;\n\trenderLink: NonNullable<AuthShellProps['renderLink']>;\n}) {\n\tif (!brand) return null;\n\n\tif (!isAuthBrandConfig(brand)) {\n\t\treturn (\n\t\t\t<div className=\"auth-shell--brand flex items-center justify-center\">\n\t\t\t\t{brand}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst content = renderBrandContent(brand);\n\tconst className = cn(\n\t\t'auth-shell--brand',\n\t\t'inline-flex items-center justify-center gap-space-md self-center rounded-radius text-foreground',\n\t\tbrand.href && 'transition-opacity hover:opacity-80',\n\t);\n\n\tif (brand.href) {\n\t\treturn renderLink({\n\t\t\thref: brand.href,\n\t\t\t'aria-label': brand.ariaLabel,\n\t\t\tclassName,\n\t\t\tchildren: content,\n\t\t});\n\t}\n\n\treturn <div className={className}>{content}</div>;\n}\n\nfunction renderSplitPanel(panel: AuthShellProps['splitPanel']) {\n\tif (!panel) return null;\n\tif (isValidElement(panel)) return panel;\n\tif (isSplitPanelProps(panel)) return <AuthSplitPanel {...panel} />;\n\treturn null;\n}\n\nexport function AuthShell({\n\tchildren,\n\tvariant: variantProp = 'card',\n\tsize = 'md',\n\talign = 'center',\n\tbrand,\n\teyebrow,\n\ttitle,\n\tdescription,\n\theaderEnd,\n\tbanner,\n\tcardMedia,\n\tcardMediaClassName,\n\tcardFooter,\n\tpostCard,\n\tfooter,\n\tfooterLinks,\n\tpolicyLinks,\n\tlanguageLinks,\n\tlanguageSwitcher,\n\tsocialProviders,\n\tsocialProvidersLayout = 'stack',\n\tsocialDivider,\n\tsplitPanel,\n\tsplitSide = 'left',\n\tsplitMobile = 'hidden',\n\trenderLink,\n\tclassName,\n\tmainClassName,\n\tstackClassName,\n\tcardClassName,\n\tcardContentClassName,\n\tsplitGridClassName,\n\tsplitPanelClassName,\n\tfooterClassName,\n\tstrings: stringsProp,\n\t...props\n}: AuthShellProps) {\n\tconst strings = useStrings(defaultAuthShellStrings, stringsProp);\n\tconst {\n\t\tvariant,\n\t\thasBrand,\n\t\thasAfterCard,\n\t\thasSplitPanel,\n\t\thasSocialProviders,\n\t\trenderLink: resolvedRenderLink,\n\t\tfooterLinks: visibleFooterLinks,\n\t\tpolicyLinks: visiblePolicyLinks,\n\t\tlanguageLinks: visibleLanguageLinks,\n\t\tsocialProviders: visibleSocialProviders,\n\t} = useAuthShell({\n\t\tvariant: variantProp,\n\t\tbrand,\n\t\tfooter,\n\t\tfooterLinks,\n\t\tpolicyLinks,\n\t\tlanguageLinks,\n\t\tlanguageSwitcher,\n\t\tpostCard,\n\t\tsocialProviders,\n\t\tsplitPanel,\n\t\trenderLink,\n\t});\n\tconst isSplit = variant === 'split' && hasSplitPanel;\n\tconst panel = renderSplitPanel(splitPanel);\n\tconst panelFirst = splitSide === 'left';\n\tconst showStackedPanel = splitMobile === 'stacked';\n\tconst brandNode = hasBrand ? renderBrand({ brand, renderLink: resolvedRenderLink }) : null;\n\n\tconst main = (\n\t\t<Stack\n\t\t\trender={<main />}\n\t\t\tgap=\"none\"\n\t\t\talign={align === 'start' ? 'start' : 'center'}\n\t\t\tjustify=\"center\"\n\t\t\tclassName={cn(\n\t\t\t\t'auth-shell--main',\n\t\t\t\tcontainerRecipe({ maxWidth: 'full', gutter: 'md' }),\n\t\t\t\t'min-h-svh py-surface-lg sm:px-surface-lg',\n\t\t\t\tmainClassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Stack\n\t\t\t\tgap=\"xl\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'auth-shell--stack',\n\t\t\t\t\t'w-full',\n\t\t\t\t\tSIZE_CLASS[size],\n\t\t\t\t\tstackClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{brandNode}\n\n\t\t\t\t<AuthCard\n\t\t\t\t\tsurface={variant === 'bare' ? 'bare' : 'card'}\n\t\t\t\t\teyebrow={eyebrow}\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tdescription={description}\n\t\t\t\t\theaderEnd={headerEnd}\n\t\t\t\t\tbanner={banner}\n\t\t\t\t\tmedia={cardMedia}\n\t\t\t\t\tmediaClassName={cardMediaClassName}\n\t\t\t\t\tfooter={cardFooter}\n\t\t\t\t\tclassName={cardClassName}\n\t\t\t\t\tcontentClassName={cardContentClassName}\n\t\t\t\t>\n\t\t\t\t\t{!!hasSocialProviders && (\n\t\t\t\t\t\t<Stack gap=\"xl\" className=\"auth-shell--social mb-space-xl\">\n\t\t\t\t\t\t\t<AuthSocialProviders\n\t\t\t\t\t\t\t\tproviders={visibleSocialProviders}\n\t\t\t\t\t\t\t\tlayout={socialProvidersLayout}\n\t\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t\t\tstrings={{ label: strings.socialProvidersLabel }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div className=\"auth-shell--social-divider flex items-center gap-space-lg\">\n\t\t\t\t\t\t\t\t<span className=\"h-px min-w-0 flex-1 bg-border\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t\t\t{socialDivider ?? strings.socialDivider}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t<span className=\"h-px min-w-0 flex-1 bg-border\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t)}\n\t\t\t\t\t{children}\n\t\t\t\t</AuthCard>\n\n\t\t\t\t{!!hasAfterCard && (\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tgap=\"lg\"\n\t\t\t\t\t\talign=\"center\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'auth-shell--after-card',\n\t\t\t\t\t\t\t'text-center',\n\t\t\t\t\t\t\tfooterClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{!!postCard && <div className=\"auth-shell--post-card\">{postCard}</div>}\n\t\t\t\t\t\t{!!languageSwitcher && (\n\t\t\t\t\t\t\t<div className=\"auth-shell--language-switcher\">\n\t\t\t\t\t\t\t\t{languageSwitcher}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{visibleLanguageLinks.length > 0 && (\n\t\t\t\t\t\t\t<AuthFooterLinks\n\t\t\t\t\t\t\t\tclassName=\"auth-shell--language-links\"\n\t\t\t\t\t\t\t\tlinks={visibleLanguageLinks}\n\t\t\t\t\t\t\t\tleadingIcon={<Globe2 className=\"size-icon-md\" />}\n\t\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t\t\tstrings={{ label: strings.languageLinksLabel }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{visibleFooterLinks.length > 0 && (\n\t\t\t\t\t\t\t<AuthFooterLinks\n\t\t\t\t\t\t\t\tclassName=\"auth-shell--footer-links\"\n\t\t\t\t\t\t\t\tlinks={visibleFooterLinks}\n\t\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t\t\tstrings={{ label: strings.footerLinksLabel }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{visiblePolicyLinks.length > 0 && (\n\t\t\t\t\t\t\t<AuthFooterLinks\n\t\t\t\t\t\t\t\tclassName=\"auth-shell--policy-links\"\n\t\t\t\t\t\t\t\tlinks={visiblePolicyLinks}\n\t\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t\t\tstrings={{ label: strings.policyLinksLabel }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!footer && <div className=\"auth-shell--footer\">{footer}</div>}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</Stack>\n\t);\n\n\tif (!isSplit) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tdata-slot=\"auth-shell\"\n\t\t\t\tdata-variant={variant === 'bare' ? 'bare' : 'card'}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'auth-shell--component',\n\t\t\t\t\t'@container/auth-shell min-h-svh bg-background text-foreground',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{main}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"auth-shell\"\n\t\t\tdata-variant=\"split\"\n\t\t\tdata-split-side={splitSide}\n\t\t\tdata-split-mobile={splitMobile}\n\t\t\tclassName={cn(\n\t\t\t\t'auth-shell--component',\n\t\t\t\t'@container/auth-shell min-h-svh bg-background text-foreground',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'auth-shell--split-grid min-h-svh @5xl/auth-shell:grid',\n\t\t\t\t\tpanelFirst\n\t\t\t\t\t\t? '@5xl/auth-shell:grid-cols-[minmax(0,1fr)_minmax(24rem,34rem)]'\n\t\t\t\t\t\t: '@5xl/auth-shell:grid-cols-[minmax(24rem,34rem)_minmax(0,1fr)]',\n\t\t\t\t\tsplitGridClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{!!panelFirst && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'auth-shell--split-panel',\n\t\t\t\t\t\t\tshowStackedPanel ? 'block' : 'hidden @5xl/auth-shell:block',\n\t\t\t\t\t\t\tsplitPanelClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{panel}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{main}\n\t\t\t\t{!panelFirst && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'auth-shell--split-panel',\n\t\t\t\t\t\t\tshowStackedPanel ? 'block' : 'hidden @5xl/auth-shell:block',\n\t\t\t\t\t\t\tsplitPanelClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{panel}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { cn } from '../../../lib/utils';\nimport { Grid } from '../../base/structure';\n\nimport type { AuthFormProps, AuthFormRowProps } from './auth.types';\n\n/**\n * Canonical auth form track. The explicit minmax(0, 1fr) column prevents\n * nowrap controls from widening a narrow auth card through grid min-content.\n */\nexport function AuthForm({ className, ...props }: AuthFormProps) {\n\tconst { children, ...formProps } = props;\n\n\treturn (\n\t\t<Grid\n\t\t\trender={(renderProps) => <form {...formProps} {...renderProps} />}\n\t\t\tcolumns={1}\n\t\t\tgap=\"xl\"\n\t\t\tdata-slot=\"auth-form\"\n\t\t\tclassName={cn('auth-form--component', className)}\n\t\t>\n\t\t\t{children}\n\t\t</Grid>\n\t);\n}\n\n/**\n * Auxiliary auth row for controls such as \"remember me\" and recovery links.\n * Items remain side by side when they fit and wrap without widening the card.\n */\nexport function AuthFormRow({ className, ...props }: AuthFormRowProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"auth-form-row\"\n\t\t\tclassName={cn(\n\t\t\t\t'auth-form-row--component',\n\t\t\t\t'flex min-w-0 flex-wrap items-center justify-between gap-x-space-lg gap-y-space-md',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n","import * as React from 'react';\n\nimport { Grid, Stack } from '../../base/structure';\nimport { Text } from '../../typography';\nimport { resolveTextClassNames } from '../../typography/text.styles';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { defaultAuthMethodSwitchStrings } from './auth.strings';\nimport type {\n\tAuthMethodOption,\n\tAuthMethodSwitchProps,\n\tUseAuthMethodSwitchOptions,\n\tUseAuthMethodSwitchReturn,\n} from './auth.types';\nimport { focusRecipes } from '../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\n\nfunction firstEnabledOption(options: AuthMethodOption[]) {\n\treturn options.find((option) => !option.disabled);\n}\n\nexport function useAuthMethodSwitch({\n\toptions = [],\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n}: UseAuthMethodSwitchOptions = {}): UseAuthMethodSwitchReturn {\n\tconst visibleOptions = React.useMemo(() => options.filter((option) => option.visible !== false), [options]);\n\tconst fallbackValue = defaultValue ?? firstEnabledOption(visibleOptions)?.id;\n\tconst [internalValue, setInternalValue] = React.useState<string | undefined>(fallbackValue);\n\tconst isControlled = value !== undefined;\n\tconst selectedValue = isControlled ? value : internalValue;\n\tconst selectedOption = visibleOptions.find((option) => option.id === selectedValue);\n\n\tconst setValue = React.useCallback(\n\t\t(nextValue: string) => {\n\t\t\tconst nextOption = visibleOptions.find((option) => option.id === nextValue);\n\t\t\tif (!nextOption || nextOption.disabled) return;\n\n\t\t\tif (!isControlled) {\n\t\t\t\tsetInternalValue(nextValue);\n\t\t\t}\n\n\t\t\tonValueChange?.(nextValue, nextOption);\n\t\t},\n\t\t[isControlled, onValueChange, visibleOptions],\n\t);\n\n\tReact.useEffect(() => {\n\t\tif (isControlled || selectedOption || visibleOptions.length === 0) return;\n\t\tsetInternalValue(firstEnabledOption(visibleOptions)?.id);\n\t}, [isControlled, selectedOption, visibleOptions]);\n\n\treturn {\n\t\tvalue: selectedValue,\n\t\tselectedOption,\n\t\toptions: visibleOptions,\n\t\tsetValue,\n\t};\n}\n\nexport function AuthMethodSwitch({\n\toptions = [],\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\tlayout = 'stack',\n\tdivider,\n\tclassName,\n\tstrings: stringsProp,\n\t...props\n}: AuthMethodSwitchProps) {\n\tconst strings = useStrings(defaultAuthMethodSwitchStrings, stringsProp);\n\tconst { ['aria-label']: ariaLabel, ...rootProps } = props;\n\tconst {\n\t\tvalue: selectedValue,\n\t\toptions: visibleOptions,\n\t\tsetValue,\n\t} = useAuthMethodSwitch({\n\t\toptions,\n\t\tvalue,\n\t\tdefaultValue,\n\t\tonValueChange,\n\t});\n\n\tif (visibleOptions.length === 0) {\n\t\treturn null;\n\t}\n\tconst segmented = layout === 'segmented';\n\tconst optionButtons = visibleOptions.map((option) => {\n\t\tconst selected = option.id === selectedValue;\n\t\tconst optionContent = (\n\t\t\t<>\n\t\t\t\t{!!option.icon && (\n\t\t\t\t\t<span className=\"auth-method-switch--option-icon shrink-0\" aria-hidden=\"true\">\n\t\t\t\t\t\t{option.icon}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<Stack render={<span />} gap=\"dense\" className=\"auth-method-switch--option-copy w-full\">\n\t\t\t\t\t<Text\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\tweight=\"semibold\"\n\t\t\t\t\t\tlineHeight=\"tight\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'max-w-full whitespace-normal break-words text-inherit',\n\t\t\t\t\t\t\tsegmented ? 'text-center min-[480px]:truncate min-[480px]:text-start' : 'text-start',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{option.label}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{!!option.description && (\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\tlineHeight={segmented ? undefined : 'snug'}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'whitespace-normal break-words',\n\t\t\t\t\t\t\t\tsegmented ? 'hidden min-[480px]:block min-[480px]:truncate' : 'text-start',\n\t\t\t\t\t\t\t\tselected ? 'text-inherit' : 'text-muted-foreground',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{option.description}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t</>\n\t\t);\n\t\treturn (\n\t\t\t<button\n\t\t\t\tkey={option.id}\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-pressed={selected}\n\t\t\t\tdisabled={option.disabled}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'auth-method-switch--option',\n\t\t\t\t\t`box-border m-0 inline-flex min-h-action-lg min-w-0 w-full cursor-pointer items-center justify-start gap-space-sm whitespace-normal rounded-inner border px-control py-row-y-lg text-start outline-none transition-[color,background-color,border-color,box-shadow] ${focusRecipes.frame} disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50`,\n\t\t\t\t\tresolveTextClassNames({type: null, size: 'sm', weight: 'medium', align: null, lineHeight: 'none'}),\n\t\t\t\t\tselected ? 'border-transparent bg-primary text-primary-foreground' : segmented ? `border-transparent bg-transparent text-foreground ${interactionRecipes.rowHover}` : `border-input bg-background text-foreground ${interactionRecipes.rowHover}`,\n\t\t\t\t\tsegmented &&\n\t\t\t\t\t\t'min-h-action justify-center border-0 px-control-sm py-row-y text-center shadow-none min-[480px]:px-control min-[480px]:text-start',\n\t\t\t\t\tselected && 'auth-method-switch--option-selected',\n\t\t\t\t)}\n\t\t\t\tonClick={() => setValue(option.id)}\n\t\t\t>\n\t\t\t\t{segmented ? (\n\t\t\t\t\t<span className=\"auth-method-switch--option-inner flex w-full flex-col justify-center gap-space-xs min-[480px]:w-auto min-[480px]:flex-row min-[480px]:justify-start min-[480px]:gap-space-md\">\n\t\t\t\t\t\t{optionContent}\n\t\t\t\t\t</span>\n\t\t\t\t) : (\n\t\t\t\t\t<Stack render={<span />} direction=\"horizontal\" gap=\"md\" wrap={false} className=\"auth-method-switch--option-inner w-full\">\n\t\t\t\t\t\t{optionContent}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t);\n\t});\n\n\treturn (\n\t\t<Stack gap=\"lg\" className={cn('auth-method-switch--component', className)} {...rootProps}>\n\t\t\t{divider !== null && divider !== false && (\n\t\t\t\t<div className=\"auth-method-switch--divider flex items-center gap-space-lg\">\n\t\t\t\t\t<span className=\"h-px min-w-0 flex-1 bg-border\" aria-hidden=\"true\" />\n\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t{divider ?? strings.divider}\n\t\t\t\t\t</Text>\n\t\t\t\t\t<span className=\"h-px min-w-0 flex-1 bg-border\" aria-hidden=\"true\" />\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{layout === 'segmented' ? (\n\t\t\t\t<div\n\t\t\t\t\trole=\"group\"\n\t\t\t\t\taria-label={ariaLabel ?? strings.label}\n\t\t\t\t\tdata-layout={layout}\n\t\t\t\t\tclassName=\"auth-method-switch--options grid min-w-0 grid-cols-[repeat(auto-fit,minmax(0,1fr))] gap-space-xs rounded-inner border border-border bg-muted p-space-xs\"\n\t\t\t\t>\n\t\t\t\t\t{optionButtons}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<Grid\n\t\t\t\t\tcolumns={layout === 'grid' ? { base: 1, sm: 2 } : 1}\n\t\t\t\t\tgap=\"md\"\n\t\t\t\t\trole=\"group\"\n\t\t\t\t\taria-label={ariaLabel ?? strings.label}\n\t\t\t\t\tdata-layout={layout}\n\t\t\t\t\tclassName=\"auth-method-switch--options\"\n\t\t\t\t>\n\t\t\t\t\t{optionButtons}\n\t\t\t\t</Grid>\n\t\t\t)}\n\t\t</Stack>\n\t);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"avatar-DWO_HHhB.js","names":["Avatar","AvatarPrimitive","AvatarImage","AvatarFallback","AvatarBadge","AvatarGroup","AvatarGroupCount","Avatar","React","PrimitiveAvatar","PrimitiveAvatarImage","PrimitiveAvatarFallback","PrimitiveAvatarBadge","PrimitiveAvatarGroup","PrimitiveAvatarGroupCount","Avatar","useDensityConfig","resolveComponentScale","cn","affordanceGeometry","Text","toneRecipes","formatInitials","React$1","Avatar$2","props","Avatar","size","className","AvatarImage$1","AvatarFallback$1","AvatarBadge$1","AvatarGroup$1","AvatarGroupCount$1","AVATAR_SIZE_CLASSNAMES","getPrimitiveSize","Avatar$1","sizeProp","defaultScale","AvatarImage","AvatarFallback","children","AvatarBadge","AvatarGroup","AvatarGroupCount","FALLBACK_TONES","FALLBACK_TONE_CLASSNAMES","pickFallbackTone","override","StackedAvatars","visible","users","max","overflow","overflowContent","overflowFormatter","initials","user","fallbackTone","avatarClassName","index","showOverflow"],"sources":["../src/components/ui/avatar.tsx","../src/components/base/avatar/avatar.tsx","../src/components/base/avatar/stacked-avatars.tsx"],"sourcesContent":["import { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: AvatarPrimitive.Root.Props & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"size-8 rounded-full after:rounded-full data-[size=lg]:size-10 data-[size=sm]:size-6 after:border-border group/avatar relative flex shrink-0 select-none after:absolute after:inset-0 after:border after:mix-blend-darken dark:after:mix-blend-lighten\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"rounded-full aspect-square size-full object-cover\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: AvatarPrimitive.Fallback.Props) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted text-muted-foreground rounded-full flex size-full items-center justify-center text-sm group-data-[size=sm]/avatar:text-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"bg-primary text-primary-foreground ring-background absolute end-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-blend-color ring-2 select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"*:data-[slot=avatar]:ring-background group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\"bg-muted text-muted-foreground size-8 rounded-full text-sm group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-icon group-has-data-[size=lg]/avatar-group:[&>svg]:size-icon-lg group-has-data-[size=sm]/avatar-group:[&>svg]:size-icon-sm ring-background relative flex shrink-0 items-center justify-center ring-2\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n}\n","/**\n * Avatar — tokenized base wrapper around the shadcn/Base UI avatar primitive.\n * Public sizing uses the shared component scale.\n */\nimport * as React from 'react';\n\nimport {\n\tAvatar as PrimitiveAvatar,\n\tAvatarBadge as PrimitiveAvatarBadge,\n\tAvatarFallback as PrimitiveAvatarFallback,\n\tAvatarGroup as PrimitiveAvatarGroup,\n\tAvatarGroupCount as PrimitiveAvatarGroupCount,\n\tAvatarImage as PrimitiveAvatarImage,\n} from '../../ui/avatar';\nimport { useDensityConfig, type ComponentScale } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { affordanceGeometry } from '../../../lib/affordance-geometry.generated';\n\nexport type AvatarSize = ComponentScale;\n\nexport interface AvatarProps\n\textends Omit<React.ComponentPropsWithoutRef<typeof PrimitiveAvatar>, 'size'> {\n\t/** Size preset. */\n\tsize?: AvatarSize;\n}\n\nexport type AvatarImageProps = React.ComponentPropsWithoutRef<typeof PrimitiveAvatarImage>;\nexport type AvatarFallbackProps = React.ComponentPropsWithoutRef<typeof PrimitiveAvatarFallback>;\nexport type AvatarBadgeProps = React.ComponentPropsWithoutRef<typeof PrimitiveAvatarBadge>;\nexport type AvatarGroupProps = React.ComponentPropsWithoutRef<typeof PrimitiveAvatarGroup>;\nexport type AvatarGroupCountProps = React.ComponentPropsWithoutRef<typeof PrimitiveAvatarGroupCount>;\n\nconst AVATAR_SIZE_CLASSNAMES: Record<AvatarSize, string> = {\n\tsm: 'size-avatar-sm data-[size=sm]:size-avatar-sm',\n\tmd: 'size-avatar',\n\tlg: 'size-avatar-lg data-[size=lg]:size-avatar-lg',\n};\n\nfunction getPrimitiveSize(size: AvatarSize): NonNullable<React.ComponentPropsWithoutRef<typeof PrimitiveAvatar>['size']> {\n\tif (size === 'sm') return 'sm';\n\tif (size === 'lg') return 'lg';\n\treturn 'default';\n}\n\nconst Avatar = React.forwardRef<React.ElementRef<typeof PrimitiveAvatar>, AvatarProps>(\n\t({ size: sizeProp, className, ...props }, ref) => {\n\t\tconst { defaultScale } = useDensityConfig();\n\t\tconst size = resolveComponentScale(sizeProp, defaultScale);\n\t\treturn (\n\t\t\t<PrimitiveAvatar\n\t\t\t\tref={ref}\n\t\t\t\tsize={getPrimitiveSize(size)}\n\t\t\t\tdata-scale={size}\n\t\t\t\tclassName={cn('avatar--component', AVATAR_SIZE_CLASSNAMES[size], className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\nAvatar.displayName = 'Avatar';\n\nconst AvatarImage = React.forwardRef<React.ElementRef<typeof PrimitiveAvatarImage>, AvatarImageProps>(\n\t({ className, ...props }, ref) => (\n\t\t<PrimitiveAvatarImage\n\t\t\tref={ref}\n\t\t\tclassName={cn('avatar--image', className)}\n\t\t\t{...props}\n\t\t/>\n\t),\n);\nAvatarImage.displayName = 'AvatarImage';\n\nconst AvatarFallback = React.forwardRef<React.ElementRef<typeof PrimitiveAvatarFallback>, AvatarFallbackProps>(\n\t({ className, children, ...props }, ref) => (\n\t\t<PrimitiveAvatarFallback\n\t\t\tref={ref}\n\t\t\tclassName={cn('avatar--fallback text-xs font-medium leading-none', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{typeof children === 'string' || typeof children === 'number' || typeof children === 'bigint' ? (\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"none\" className=\"text-inherit\">\n\t\t\t\t\t{children}\n\t\t\t\t</Text>\n\t\t\t) : children}\n\t\t</PrimitiveAvatarFallback>\n\t),\n);\nAvatarFallback.displayName = 'AvatarFallback';\n\nconst AvatarBadge = React.forwardRef<React.ElementRef<typeof PrimitiveAvatarBadge>, AvatarBadgeProps>(\n\t({ className, ...props }, ref) => (\n\t\t<PrimitiveAvatarBadge\n\t\t\tref={ref}\n\t\t\tclassName={cn('avatar--badge', className)}\n\t\t\t{...props}\n\t\t/>\n\t),\n);\nAvatarBadge.displayName = 'AvatarBadge';\n\nconst AvatarGroup = React.forwardRef<React.ElementRef<typeof PrimitiveAvatarGroup>, AvatarGroupProps>(\n\t({ className, ...props }, ref) => (\n\t\t<PrimitiveAvatarGroup\n\t\t\tref={ref}\n\t\t\tclassName={cn('avatar-group--component isolate items-center', affordanceGeometry.avatarOverlap.md, affordanceGeometry.avatarOverlap.sm, affordanceGeometry.avatarOverlap.lg, className)}\n\t\t\t{...props}\n\t\t/>\n\t),\n);\nAvatarGroup.displayName = 'AvatarGroup';\n\nconst AvatarGroupCount = React.forwardRef<React.ElementRef<typeof PrimitiveAvatarGroupCount>, AvatarGroupCountProps>(\n\t({ className, children, ...props }, ref) => (\n\t\t<PrimitiveAvatarGroupCount\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'avatar-group-count--component size-avatar text-xs',\n\t\t\t\t'group-has-data-[size=sm]/avatar-group:size-avatar-sm',\n\t\t\t\t'group-has-data-[size=lg]/avatar-group:size-avatar-lg',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{typeof children === 'string' || typeof children === 'number' || typeof children === 'bigint' ? (\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"none\" className=\"text-inherit\">\n\t\t\t\t\t{children}\n\t\t\t\t</Text>\n\t\t\t) : children}\n\t\t</PrimitiveAvatarGroupCount>\n\t),\n);\nAvatarGroupCount.displayName = 'AvatarGroupCount';\n\nexport {\n\tAvatar,\n\tAvatarImage,\n\tAvatarFallback,\n\tAvatarGroup,\n\tAvatarGroupCount,\n\tAvatarBadge,\n};\n","/**\n * StackedAvatars — overlapping avatar group with optional `+N` overflow chip,\n * configurable size, and an optional semantic `tone` for fallbacks (initials)\n * when the consumer hasn't passed `imageUrl`.\n *\n * Fallbacks are neutral by default: colour states meaning, so a person's\n * initials are not tinted by a hash of their name. Pass `tone` per user when a\n * fallback does carry meaning; numeric tones map onto the semantic token set.\n */\nimport * as React from 'react';\nimport {\n\tAvatar,\n\tAvatarFallback,\n\tAvatarGroup,\n\tAvatarGroupCount,\n\tAvatarImage,\n} from './avatar';\nimport { formatInitials } from '../../primitives/initials-format';\nimport { Text } from '../../typography';\nimport { useDensityConfig, type ComponentScale } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { cn } from '../../../lib/utils';\nimport type { SemanticTone } from '../../../lib/component-vocabulary';\nimport { toneRecipes } from '../../../lib/tone-recipes';\n\nexport type StackedAvatarsSize = ComponentScale;\nexport type StackedAvatarTone = SemanticTone;\n\nexport interface StackedAvatarUser {\n\t/** Stable identity for this entry. */\n\tid?: string;\n\t/** The person's name; supplies the initials and the hover title. */\n\tname: string;\n\timageUrl?: string;\n\t/** Semantic tone for this user's fallback. Defaults to `neutral`. Numeric values map to the token set. */\n\ttone?: StackedAvatarTone | number;\n}\n\nexport interface StackedAvatarsProps {\n\tusers: StackedAvatarUser[];\n\tmax?: number;\n\t/** Size preset. */\n\tsize?: StackedAvatarsSize;\n\tclassName?: string;\n\t/** Whether to render a `+N` count when `users.length > max`. Default `true`. */\n\tshowOverflow?: boolean;\n\t/** Provide custom overflow text (e.g. \"+12 more\"). Default `+N`. */\n\toverflowFormatter?: (overflow: number) => React.ReactNode;\n\t/** Extra class names applied to each avatar root. */\n\tavatarClassName?: string;\n}\n\nconst FALLBACK_TONES: StackedAvatarTone[] = [\n\t'neutral',\n\t'primary',\n\t'secondary',\n\t'info',\n\t'success',\n];\n\nconst FALLBACK_TONE_CLASSNAMES: Record<StackedAvatarTone, string> = {\n\tneutral: 'bg-muted text-muted-foreground',\n\tprimary: `${toneRecipes.primary.tint} ${toneRecipes.primary.ink}`,\n\tsecondary: 'bg-secondary text-secondary-foreground',\n\tinfo: `${toneRecipes.info.tint} ${toneRecipes.info.ink}`,\n\tsuccess: `${toneRecipes.success.tint} ${toneRecipes.success.ink}`,\n\twarning: `${toneRecipes.warning.tint} ${toneRecipes.warning.ink}`,\n\tdestructive: `${toneRecipes.destructive.tint} ${toneRecipes.destructive.ink}`,\n};\n\nfunction pickFallbackTone(override?: StackedAvatarTone | number): StackedAvatarTone {\n\tif (typeof override === 'string') {\n\t\treturn override;\n\t}\n\tif (typeof override === 'number') {\n\t\treturn FALLBACK_TONES[Math.abs(override) % FALLBACK_TONES.length];\n\t}\n\treturn 'neutral';\n}\n\nexport function StackedAvatars({\n\tusers,\n\tmax = 4,\n\tsize: sizeProp,\n\tclassName,\n\tshowOverflow = true,\n\toverflowFormatter,\n\tavatarClassName,\n}: StackedAvatarsProps) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(sizeProp, defaultScale);\n\tconst visible = users.slice(0, max);\n\tconst overflow = Math.max(0, users.length - max);\n\tconst overflowContent = overflowFormatter ? overflowFormatter(overflow) : `+${overflow}`;\n\n\treturn (\n\t\t<AvatarGroup className={cn('stacked-avatars--component', className)}>\n\t\t\t{visible.map((user, index) => {\n\t\t\t\tconst initials = formatInitials(user.name, {\n\t\t\t\t\tmaxCharacters: size === 'sm' ? 1 : 2,\n\t\t\t\t\tfallback: '?',\n\t\t\t\t});\n\t\t\t\tconst fallbackTone = pickFallbackTone(user.tone);\n\t\t\t\treturn (\n\t\t\t\t\t<Avatar\n\t\t\t\t\t\tkey={user.id ?? `${user.name}-${index}`}\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\tclassName={cn('ring-background', avatarClassName)}\n\t\t\t\t\t\ttitle={user.name}\n\t\t\t\t\t>\n\t\t\t\t\t\t{user.imageUrl ? (\n\t\t\t\t\t\t\t<AvatarImage src={user.imageUrl} alt={user.name} />\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<AvatarFallback className={FALLBACK_TONE_CLASSNAMES[fallbackTone]}>\n\t\t\t\t\t\t\t{initials}\n\t\t\t\t\t\t</AvatarFallback>\n\t\t\t\t\t</Avatar>\n\t\t\t\t);\n\t\t\t})}\n\t\t\t{!!showOverflow && overflow > 0 && (\n\t\t\t\t<AvatarGroupCount data-scale={size} data-size={size === 'md' ? 'default' : size}>\n\t\t\t\t\t{typeof overflowContent === 'string' || typeof overflowContent === 'number' || typeof overflowContent === 'bigint' ? (\n\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"none\" className=\"text-inherit\">\n\t\t\t\t\t\t\t{overflowContent}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t) : overflowContent}\n\t\t\t\t</AvatarGroupCount>\n\t\t\t)}\n\t\t</AvatarGroup>\n\t);\n}\n\nStackedAvatars.displayName = 'StackedAvatars';\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cascader.js","names":["useDensityConfig","Text","Stack","surfaceInsetClasses","popoverWidthRecipes","CollectionContent","fieldAffordanceRecipes","selectToggleRecipes","CommandItem","CommandList","Command","formFieldTriggerClasses","resolveFormControlSize","FieldClearButton","Input","PopoverTitle","PopoverTrigger","PopoverHeader","PopoverDescription","Popover","PopoverContent","ScrollArea","indexHierarchy","isBranch","Tree","defaults","valuesOf","value","statusRowClasses","resolveHierarchy","nodes","children","cache","node","Cascader","controlledOpen","sizeProp","customStrings","aria","size","defaultScale","strings","localValue","setLocalValue","useState","defaultValue","selected","localOpen","setLocalOpen","defaultOpen","open","disabled","path","setPath","query","setQuery","expanded","setExpanded","highlights","setHighlights","setCache","cacheSource","useRef","cacheCurrent","items","loadChildren","cacheRef","loads","setLoads","requests","mounted","inputItems","currentLoader","panel","triggerRef","showClear","clearable","pendingFocus","pendingTreeFocus","resolvedItems","useMemo","index","paths","key","activePath","current","results","entry","abortPending","controller","previous","state","useEffect","selectedNodes","selectedPath","rememberPath","mode","visibleBranches","load","row","element","option","changeOpen","next","onOpenChange","keys","level","canSelect","selectable","commit","remove","multiple","onValueChange","retry","sourceItems","loader","nextCache","enter","nextPath","item","goBack","departed","focusList","levelKey","rtl","event","activeId","status","parent","Button","column","saved","highlight","cn","ChevronRight","label","i","className","name","invalid","renderValue","ChevronLeft","searchable","surfaceDividerRecipes","ChevronDown"],"sources":["../../src/components/base/cascader/cascader.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport { ChevronDown, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { Button } from '../buttons';\nimport { Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger } from '../popover';\nimport { Command, CommandItem, CommandList } from '../command';\nimport { Input } from '../text-inputs';\nimport { FieldClearButton } from '../text-inputs/field-clear-button';\nimport { ScrollArea } from '../display';\nimport { Stack } from '../structure';\nimport { Text } from '../../typography';\nimport { popoverWidthRecipes, surfaceInsetClasses } from '../popover/popover.recipes';\nimport { CollectionContent } from '../popover/collection-content';\nimport { Tree } from '../tree';\nimport { indexHierarchy, isBranch } from '../tree/hierarchy';\nimport { formFieldTriggerClasses, resolveFormControlSize } from '../forms/form-sizing';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { surfaceDividerRecipes } from '../../../lib/surface-recipes';\nimport { fieldAffordanceRecipes, selectToggleRecipes } from '../../../lib/field-affordance-recipes';\nimport type { CascaderNode, CascaderProps, CascaderStrings } from './cascader.types';\n\nconst defaults: CascaderStrings = { placeholder: 'Choose an option', search: 'Search options', empty: 'No options', loading: 'Loading options…', error: 'Options could not be loaded.', retry: 'Retry', back: 'Back', root: 'All options', clear: 'Clear selection', selectCurrent: 'Select current category', pathSeparator: ' / ' };\nconst valuesOf = (value: CascaderProps['value']): readonly string[] => value == null ? [] : typeof value === 'string' ? [value] : value;\n/** Status copy in a list aligns with the row text, not the list edge. */\nconst statusRowClasses = 'px-row-x py-row-y';\ntype LoadState = { status: 'loading' | 'error'; };\nfunction resolveHierarchy<T>(nodes: readonly CascaderNode<T>[], cache: ReadonlyMap<string, readonly CascaderNode<T>[]>): CascaderNode<T>[] {\n return nodes.map(node => {\n const children = cache.get(node.value) ?? node.children;\n return { ...node, ...(children ? { children: resolveHierarchy(children, cache) } : {}), ...(cache.has(node.value) ? { hasChildren: !!children?.length } : {}) };\n });\n}\n\nexport function Cascader<T = unknown>({ items, value, defaultValue = null, onValueChange, multiple = false, mode = 'drill', selectable = 'leaf', open: controlledOpen, defaultOpen = false, onOpenChange, disabled = false, invalid = false, searchable = true, clearable = false, density = 'default', size: sizeProp, name, id, className, strings: customStrings, loadChildren, renderValue, ...aria }: CascaderProps<T>) {\n const { defaultScale } = useDensityConfig();\n const size = resolveFormControlSize(sizeProp, defaultScale);\n const strings = { ...defaults, ...customStrings };\n const [localValue, setLocalValue] = useState(defaultValue);\n const selected = valuesOf(value === undefined ? localValue : value);\n const [localOpen, setLocalOpen] = useState(defaultOpen);\n const open = !disabled && (controlledOpen ?? localOpen);\n const [path, setPath] = useState<string[]>([]);\n const [query, setQuery] = useState('');\n const [expanded, setExpanded] = useState<string[]>([]);\n const [highlights, setHighlights] = useState(new Map<string | undefined, string>());\n const [cache, setCache] = useState(new Map<string, readonly CascaderNode<T>[]>());\n const cacheSource = useRef({items, loadChildren});\n const cacheCurrent = cacheSource.current.items === items && cacheSource.current.loadChildren === loadChildren;\n const cacheRef = useRef(cache);\n useLayoutEffect(() => { cacheRef.current = cache; }, [cache]);\n const [loads, setLoads] = useState(new Map<string, LoadState>());\n const requests = useRef(new Map<string, AbortController>());\n const mounted = useRef(true);\n const inputItems = useRef(items);\n const currentLoader = useRef(loadChildren);\n useLayoutEffect(() => { inputItems.current = items; currentLoader.current = loadChildren; }, [items, loadChildren]);\n const panel = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const showClear = clearable && !!selected.length;\n const pendingFocus = useRef<number | null>(null);\n const pendingTreeFocus = useRef<string | null>(null);\n const resolvedItems = useMemo(() => resolveHierarchy(items, cacheCurrent ? cache : new Map()), [items, cache, cacheCurrent]);\n const index = useMemo(() => indexHierarchy(resolvedItems), [resolvedItems]);\n const paths = selected.map(key => index.get(key)?.path ?? []);\n const activePath = path.filter(key => index.has(key));\n const current = activePath.length ? index.get(activePath.at(-1)!)?.node : undefined;\n const results = query.trim() ? [...index.values()].filter(entry => !entry.disabled && entry.path.map(node => node.label).join(strings.pathSeparator).toLocaleLowerCase().includes(query.trim().toLocaleLowerCase())) : null;\n function abortPending() {\n for (const controller of requests.current.values()) controller.abort();\n requests.current.clear();\n setLoads(previous => new Map([...previous].filter(([, state]) => state.status !== 'loading')));\n }\n useEffect(() => {\n mounted.current = true;\n return () => { mounted.current = false; for (const controller of requests.current.values()) controller.abort(); requests.current.clear(); };\n }, []);\n useEffect(() => { abortPending(); cacheSource.current = {items, loadChildren}; cacheRef.current = new Map(); setCache(cacheRef.current); setLoads(new Map()); setPath([]); setExpanded([]); setHighlights(new Map()); pendingFocus.current = null; pendingTreeFocus.current = null; }, [items, loadChildren]);\n useEffect(() => {\n if (!open) { abortPending(); setQuery(''); }\n else {\n const selectedNodes = paths.find(nodes => nodes.length);\n const selectedPath = selectedNodes?.slice(0, -1).map(node => node.value);\n if (selectedPath) {\n setPath(selectedPath);\n rememberPath(selectedNodes!.map(node => node.value));\n if (mode === 'tree') setExpanded(previous => [...new Set([...previous, ...selectedPath])]);\n }\n const visibleBranches = mode === 'tree' ? [...expanded, ...(selectedPath ?? [])] : selectedPath ?? activePath;\n for (const key of visibleBranches) { const node = index.get(key)?.node; if (node) void load(node); }\n }\n }, [open]);\n useEffect(() => {\n if (pendingTreeFocus.current !== null) {\n const row = [...(panel.current?.querySelectorAll<HTMLElement>('[data-tree-value]') ?? [])].find(element => element.dataset.treeValue === pendingTreeFocus.current);\n if (row) { row.focus(); pendingTreeFocus.current = null; }\n }\n if (pendingFocus.current === null) return;\n const columns = panel.current?.querySelectorAll('[data-cascader-level]');\n const target = columns?.[pendingFocus.current];\n const option = target?.querySelector<HTMLElement>('[data-cascader-list][tabindex=\"0\"]');\n if (option) { option.focus(); pendingFocus.current = null; }\n }, [path, cache, query]);\n function changeOpen(next: boolean) {\n if (disabled) return;\n if (controlledOpen === undefined) setLocalOpen(next);\n onOpenChange?.(next);\n }\n function rememberPath(keys: readonly string[]) {\n setHighlights(previous => {\n const next = new Map(previous);\n keys.forEach((key, level) => next.set(level ? keys[level - 1] : undefined, key));\n return next;\n });\n }\n function canSelect(node: CascaderNode<T>) { return typeof selectable === 'function' ? selectable(node) : selectable === 'any' || !isBranch(node); }\n function commit(node: CascaderNode<T> | null) {\n if (disabled || (node && (index.get(node.value)?.disabled || !canSelect(node)))) return;\n const remove = !!node && selected.includes(node.value);\n const next = node ? multiple ? remove ? selected.filter(key => key !== node.value) : [...selected, node.value] : node.value : multiple ? [] : null;\n if (value === undefined) setLocalValue(next);\n onValueChange?.(next, { node, path: node ? index.get(node.value)?.path ?? [node] : [], reason: node ? multiple && remove ? 'deselect' : 'select' : 'clear' });\n if (!multiple && node) changeOpen(false);\n }\n async function load(node: CascaderNode<T>, retry = false) {\n if (!loadChildren || !node.hasChildren || node.children !== undefined || (cacheCurrent && cache.has(node.value)) || requests.current.has(node.value) || (!retry && cacheCurrent && loads.get(node.value)?.status === 'error')) return;\n const controller = new AbortController();\n const sourceItems = inputItems.current;\n const loader = loadChildren;\n requests.current.set(node.value, controller);\n setLoads(previous => new Map(previous).set(node.value, {status: 'loading'}));\n try {\n const children = await loader(node, {signal: controller.signal});\n if (!mounted.current || controller.signal.aborted || inputItems.current !== sourceItems || currentLoader.current !== loader || requests.current.get(node.value) !== controller) return;\n // Reject duplicate/cyclic values before a bad response can replace the rendered hierarchy.\n const nextCache = new Map(cacheRef.current).set(node.value, children);\n indexHierarchy(resolveHierarchy(sourceItems, nextCache));\n cacheRef.current = nextCache;\n setCache(nextCache);\n setLoads(previous => {const next = new Map(previous); next.delete(node.value); return next;});\n } catch {\n if (mounted.current && !controller.signal.aborted && inputItems.current === sourceItems && currentLoader.current === loader) setLoads(previous => new Map(previous).set(node.value, {status: 'error'}));\n } finally { if (requests.current.get(node.value) === controller) requests.current.delete(node.value); }\n }\n function enter(node: CascaderNode<T>, level: number) {\n if (index.get(node.value)?.disabled) return;\n if (isBranch(node)) {\n const nextPath = index.get(node.value)?.path.map(item => item.value) ?? [...activePath.slice(0, level), node.value];\n rememberPath(nextPath);\n setQuery(''); setPath(nextPath);\n if (mode === 'tree') { setExpanded(previous => [...new Set([...previous, ...nextPath])]); pendingTreeFocus.current = node.value; }\n else pendingFocus.current = mode === 'columns' ? nextPath.length : 0;\n void load(node);\n }\n else commit(node);\n }\n function goBack(focusList = true) {\n if (disabled || !activePath.length) return;\n const departed = activePath.at(-1)!;\n const nextPath = activePath.slice(0, -1);\n requests.current.get(departed)?.abort(); requests.current.delete(departed);\n setLoads(previous => { if (previous.get(departed)?.status !== 'loading') return previous; const next = new Map(previous); next.delete(departed); return next; });\n setHighlights(previous => new Map(previous).set(nextPath.at(-1), departed));\n setQuery(''); setPath(nextPath);\n pendingFocus.current = focusList ? mode === 'columns' ? nextPath.length : 0 : null;\n }\n function levelKey(event: KeyboardEvent<HTMLDivElement>, level: number) {\n const rtl = getComputedStyle(event.currentTarget).direction === 'rtl';\n if (event.key === (rtl ? 'ArrowRight' : 'ArrowLeft') && activePath.length) {\n event.preventDefault(); event.stopPropagation();\n if (mode === 'columns' && level > 0) panel.current?.querySelectorAll('[data-cascader-level]')[level - 1]?.querySelector<HTMLElement>('[data-cascader-list][tabindex=\"0\"]')?.focus();\n else goBack();\n } else if (event.key === (rtl ? 'ArrowLeft' : 'ArrowRight')) {\n const activeId = event.currentTarget.querySelector('[data-cascader-list]')?.getAttribute('aria-activedescendant');\n const row = (event.target as HTMLElement).closest('[data-node-value]') ?? (activeId ? document.getElementById(activeId) : null);\n const key = row?.getAttribute('data-node-value');\n const node = index.get(key ?? '')?.node;\n if (node && isBranch(node)) { event.preventDefault(); event.stopPropagation(); enter(node, level); }\n }\n }\n function state(parent: CascaderNode<T> | undefined, nodes: readonly CascaderNode<T>[]) {\n const status = parent ? loads.get(parent.value)?.status : undefined;\n if (status === 'loading') return <Text role=\"status\" type=\"secondary\" className={statusRowClasses}>{strings.loading}</Text>;\n if (status === 'error') return <Stack gap=\"sm\" align=\"start\" className={statusRowClasses}><Text role=\"alert\" type=\"error\">{strings.error}</Text><Button buttonStyle=\"outline\" size=\"sm\" onClick={() => parent && void load(parent, true)}>{strings.retry}</Button></Stack>;\n if (!nodes.length) return <Text role=\"status\" type=\"secondary\" className={statusRowClasses}>{strings.empty}</Text>;\n return null;\n }\n function column(nodes: readonly CascaderNode<T>[], parent: CascaderNode<T> | undefined, level: number) {\n const saved = highlights.get(parent?.value);\n const highlight = nodes.find(node => node.value === saved && !index.get(node.value)?.disabled)?.value ?? nodes.find(node => !index.get(node.value)?.disabled)?.value ?? '';\n return <div key={JSON.stringify(parent ? [parent.value] : [])} data-cascader-level={level} className={cn('cascader--level min-w-0', mode === 'columns' && !results && 'w-56 shrink-0')} onKeyDownCapture={event => levelKey(event, level)}>\n <Command shouldFilter={false} value={highlight} onValueChange={next => setHighlights(previous => new Map(previous).set(parent?.value, next))} aria-label={parent?.label ?? strings.root}>\n <CommandList data-cascader-list aria-multiselectable={multiple || undefined} aria-label={parent?.label ?? strings.root} tabIndex={nodes.some(node => !index.get(node.value)?.disabled) ? 0 : -1}>\n {state(parent, nodes)}\n {nodes.map(node => <CommandItem key={node.value} value={node.value} data-node-value={node.value} density={density} disabled={disabled || index.get(node.value)?.disabled} data-checked={selected.includes(node.value)} aria-selected={selected.includes(node.value)} onSelect={() => enter(node, level)}>\n <CollectionContent label={results ? index.get(node.value)?.path.map(item => item.label).join(strings.pathSeparator) : node.label} description={node.description} leading={node.icon} leadingDecorative wrap trailing={isBranch(node) ? <ChevronRight aria-hidden=\"true\" className=\"size-icon rtl:rotate-180\" /> : undefined} />\n </CommandItem>)}\n </CommandList>\n </Command>\n </div>;\n }\n const label = selected.length ? paths.map((nodes, i) => nodes.length ? nodes.map(node => node.label).join(strings.pathSeparator) : selected[i]).join(', ') : strings.placeholder;\n return <div className={cn('cascader--component min-w-0', className)}>\n {name && selected.map(key => <input key={key} type=\"hidden\" name={name} value={key} disabled={disabled} />)}\n <div className=\"cascader--field relative min-w-0\">\n <Popover open={open} onOpenChange={changeOpen}>\n {/* Input's field frame; the select-toggle padding keeps the value clear of the affordance track. */}\n <PopoverTrigger ref={triggerRef} id={id} {...aria} disabled={disabled} aria-invalid={invalid || undefined} className={cn('cascader--trigger', formFieldTriggerClasses(size), showClear ? selectToggleRecipes.clearPadding[size] : selectToggleRecipes.padding[size])}>\n <span className={cn('cascader--value min-w-0 flex-1 truncate text-start', !selected.length && 'text-muted-foreground')}>{renderValue ? renderValue(paths) : label}</span>\n </PopoverTrigger>\n <PopoverContent type=\"menu\" inset=\"flush\" className={cn('cascader--popup', popoverWidthRecipes.lg, mode === 'columns' && !results && 'w-auto')}>\n <div ref={panel}>\n {!!activePath.length && mode !== 'tree' && <PopoverHeader start={<Button tone=\"secondary\" buttonStyle=\"ghost\" size=\"sm\" iconOnly aria-label={strings.back} withTooltip={strings.back} onClick={() => goBack()}><ChevronLeft aria-hidden=\"true\" className=\"size-icon-sm rtl:rotate-180\" /></Button>}>\n <Stack direction=\"horizontal\" gap=\"sm\" align=\"center\" justify=\"between\" wrap>\n <PopoverTitle className=\"min-w-0 wrap-anywhere\">{current?.label}</PopoverTitle>\n {current && canSelect(current) && <Button buttonStyle=\"outline\" size=\"sm\" onClick={() => commit(current)}>{strings.selectCurrent}</Button>}\n </Stack>\n {activePath.length > 1 && <PopoverDescription>{activePath.slice(0, -1).map(key => index.get(key)?.node.label).join(strings.pathSeparator)}</PopoverDescription>}\n </PopoverHeader>}\n {searchable && <div className={cn('cascader--search', surfaceInsetClasses.compact, surfaceDividerRecipes.anchored.header)}><Input aria-label={strings.search} placeholder={strings.search} value={query} onChange={event => setQuery(event.target.value)} onKeyDown={event => {\n if (event.key === 'ArrowDown') { const option = panel.current?.querySelector<HTMLElement>('[data-cascader-list][tabindex=\"0\"], [role=treeitem][tabindex=\"0\"]'); if (option) { event.preventDefault(); option.focus(); } }\n else if (event.key === 'Backspace' && !query && activePath.length && mode !== 'tree') { event.preventDefault(); goBack(false); }\n }} /></div>}\n {results ? column(results.map(entry => entry.node), undefined, 0) : mode === 'tree' ? <ScrollArea className=\"h-72\"><div className={surfaceInsetClasses.compact}><Tree items={resolvedItems} aria-label={strings.root} density={density} selectionMode={multiple ? 'multiple' : 'single'} selectedValues={selected} expandedValues={expanded} empty={strings.empty}\n onExpandedValuesChange={next => {\n setExpanded(next);\n for (const key of next) {\n if (expanded.includes(key)) continue;\n const node = index.get(key)?.node;\n if (node) void load(node);\n }\n }}\n onSelectedValuesChange={(_next, node) => commit(node)} /></div>\n {[...loads].filter(([key]) => expanded.includes(key)).map(([key]) => <PopoverHeader key={key}><Text size=\"xs\" type=\"secondary\">{index.get(key)?.node.label}</Text>{state(index.get(key)?.node, [])}</PopoverHeader>)}\n </ScrollArea> : mode === 'columns' ? <ScrollArea orientation=\"both\" className=\"max-w-full\" viewportClassName=\"max-h-80\"><div className=\"flex items-start\">{column(resolvedItems, undefined, 0)}{activePath.map((key, level) => { const node = index.get(key)?.node; return node ? column(node.children ?? [], node, level + 1) : null; })}</div></ScrollArea> : column(current?.children ?? (current ? [] : resolvedItems), current, 0)}\n </div>\n </PopoverContent>\n </Popover>\n {/* The Combobox affordance track: the shared clear target one gap before the\n chevron, which centres where a Select draws its own. The chevron passes\n pointer input through to the trigger beneath it. */}\n <div className={cn('cascader--affordances pointer-events-none flex items-center gap-space-xs text-muted-foreground', fieldAffordanceRecipes.centered, selectToggleRecipes.track[size])}>\n {showClear && <FieldClearButton aria-label={strings.clear} disabled={disabled} className=\"cascader--clear pointer-events-auto\"\n onClick={() => { commit(null); triggerRef.current?.focus(); }} />}\n <span aria-hidden=\"true\" className={cn('cascader--toggle', fieldAffordanceRecipes.target, disabled && 'opacity-50')}>\n <ChevronDown className={cn(selectToggleRecipes.icon[size], 'shrink-0')} />\n </span>\n </div>\n </div>\n </div>;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"batch-action-bar-CdfIkCsV.js","names":["Text","motionRecipes","neutralFillRecipes","elevationRecipes","layerRecipes","defaultBatchActionBarStrings","total","selected","barRecipe","surfaceDividerRecipes","placementRecipes","cn","isConnectedElement","node","isWithinBar","bar","BatchActionBar","stringsProp","strings","useStrings","visible","selectedCount","countReady","setCountReady","useState","barRef","useRef","focusInsideRef","focusOriginRef","handleFocusIn","inside","event","from","handlePointerDown","restoreFocus","useCallback","origin","owner","returnFocusRef","candidates","candidate","handBackFocus","active","handBackFocusRef","useEffect","handleKeyDown","onClear","hasActions","children","placement","className","totalCount","Button"],"sources":["../src/components/base/batch-action-bar/batch-action-bar.strings.ts","../src/components/base/batch-action-bar/batch-action-bar.tsx"],"sourcesContent":["/**\n * Default user-facing strings for `<BatchActionBar>`.\n *\n * Consumers wire their own i18n at the call site:\n *\n * <BatchActionBar strings={{ summary: (n, total) => t('selection.summary', { n, total }) }} … />\n */\n\nexport interface BatchActionBarStrings {\n\t/**\n\t * The selection summary (\"3 selected\", \"3 of 250 selected\"). A function,\n\t * because the sentence shape varies by language; `total` is `undefined`\n\t * when the caller does not know or bound the total.\n\t */\n\tsummary: (selected: number, total?: number) => string;\n\t/** The control that drops the selection. */\n\tclear: string;\n\t/** The accessible name of the bar's region. */\n\tlabel: string;\n}\n\nexport const defaultBatchActionBarStrings: BatchActionBarStrings = {\n\tsummary: (selected, total) =>\n\t\ttotal === undefined ? `${selected} selected` : `${selected} of ${total} selected`,\n\tclear: 'Clear',\n\tlabel: 'Batch actions',\n};\n","/**\n * BatchActionBar — the bar shown once a selection exists: the count, the bulk\n * actions, and a way out.\n *\n * Several features share it (DataTable, MediaLibrary, product variants), so it\n * lives in base. `floating` docks to the bottom centre of the viewport, so the\n * selection stays reachable after scrolling a long list; `inline` stays in flow\n * inside a panel that scrolls its own body, where a dock would cover the rows.\n *\n * Callers can mount it unconditionally: at a count of zero it renders nothing.\n * The count is a polite live region, so changes are announced. Escape inside\n * the bar clears, and when the bar goes away with focus inside it (Clear, or an\n * action that drops the selection), focus returns to `returnFocusRef` or to the\n * control focus came from rather than falling to the document body.\n */\nimport { useCallback, useEffect, useRef, useState, type KeyboardEvent, type ReactNode, type RefObject } from 'react';\n\nimport { Button } from '../buttons';\nimport { Text } from '../../typography';\nimport { layerRecipes } from '../../../lib/layer-recipes';\nimport { motionRecipes } from '../../../lib/motion-recipes';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { elevationRecipes, neutralFillRecipes, surfaceDividerRecipes } from '../../../lib/surface-recipes';\nimport { cn } from '../../../lib/utils';\n\nimport { defaultBatchActionBarStrings, type BatchActionBarStrings } from './batch-action-bar.strings';\n\nexport type BatchActionBarPlacement = 'floating' | 'inline';\n\nexport interface BatchActionBarProps {\n\t/** How many items are selected. At zero or below no bar renders, so a caller can mount it unconditionally. */\n\tselectedCount: number;\n\t/** Denominator for the summary. Omit when the total is unknown or unbounded. */\n\ttotalCount?: number;\n\t/** Drops the selection. Omit to render no Clear control or Escape shortcut; a selection the user cannot drop needs a reason. */\n\tonClear?: () => void;\n\t/**\n\t * `floating` (default) docks to the bottom centre of the viewport, or of the\n\t * nearest transformed ancestor; `inline` sits in flow at full width.\n\t */\n\tplacement?: BatchActionBarPlacement;\n\t/**\n\t * Where focus goes when the bar disappears while focus is inside it: the list\n\t * it acts on, or that list's select-all control. When focus entered the bar\n\t * from a control inside this element that is still there, it returns to that\n\t * control instead. Without it, or when it cannot take focus, focus returns to\n\t * the control it entered the bar from, if that is still in the document.\n\t */\n\treturnFocusRef?: RefObject<HTMLElement | null>;\n\t/** Overrides this bar's own copy: `summary(selected, total)`, `clear`, and the region's accessible `label`. */\n\tstrings?: StringsProp<BatchActionBarStrings>;\n\t/** The bulk actions: buttons, a menu, whatever the surface needs. Clear follows them. */\n\tchildren?: ReactNode;\n\t/** Merged onto the bar. */\n\tclassName?: string;\n}\n\n// Both placements share one geometry: the compact anchored-surface inset and\n// shell radius, so the bar's buttons sit in the same frame as a menu's rows.\nconst barRecipe = `batch-action-bar--component box-border flex min-w-0 flex-wrap items-center justify-between gap-space-md rounded-radius p-surface-xs ${surfaceDividerRecipes.anchored.shell}`;\n\nconst placementRecipes: Record<BatchActionBarPlacement, string> = {\n\t// Above sticky headers and toolbars, below the menus and dialogs its own\n\t// actions open. Opaque and lifted, so it never reads as part of the list\n\t// scrolling underneath. 100% rather than 100vw, so a dock inside a\n\t// transformed ancestor does not overhang it.\n\tfloating: cn(\n\t\t// Root knobs, not the --spacing-* aliases: those resolve once at :root, so a\n\t\t// scoped space-scale would never reach the dock offset.\n\t\t'fixed bottom-[calc(1rem*var(--space-scale)+env(safe-area-inset-bottom,0px))] left-1/2 w-max max-w-[calc(100%-2rem*var(--space-scale))] -translate-x-1/2',\n\t\t'bg-popover text-popover-foreground',\n\t\televationRecipes.lifted,\n\t\tlayerRecipes.chrome,\n\t\tmotionRecipes.dock,\n\t),\n\tinline: cn('w-full text-foreground', neutralFillRecipes.band),\n};\n\nfunction isConnectedElement(node: HTMLElement | null | undefined): node is HTMLElement {\n\treturn !!node && node.isConnected;\n}\n\n/**\n * Inside the bar, or inside a popup one of its actions has open: a menu is\n * portaled out of the bar's DOM but unmounts with it, so focus there is lost\n * with the bar just the same.\n */\nfunction isWithinBar(bar: HTMLElement | null, node: EventTarget | null): boolean {\n\tif (!bar || !(node instanceof Node)) return false;\n\treturn bar.contains(node) || bar.querySelector('[aria-expanded=\"true\"]') !== null;\n}\n\nexport function BatchActionBar({\n\tselectedCount,\n\ttotalCount,\n\tonClear,\n\tplacement = 'floating',\n\treturnFocusRef,\n\tstrings: stringsProp,\n\tchildren,\n\tclassName,\n}: BatchActionBarProps) {\n\tconst strings = useStrings(defaultBatchActionBarStrings, stringsProp);\n\tconst visible = selectedCount > 0;\n\n\t// The count is a polite live region. It mounts empty and fills once the bar\n\t// is in the document: a live region inserted together with its text is often\n\t// not read, and a second, hidden copy of the count would be read twice.\n\tconst [countReady, setCountReady] = useState(false);\n\tuseEffect(() => {\n\t\tsetCountReady(visible);\n\t}, [visible]);\n\n\tconst barRef = useRef<HTMLDivElement>(null);\n\t// Whether focus was last known to be inside the bar, and the control it came from.\n\tconst focusInsideRef = useRef(false);\n\tconst focusOriginRef = useRef<HTMLElement | null>(null);\n\n\t// Track focus through document listeners rather than blur: browsers differ\n\t// on whether removing a focused node fires blur, and the bar's own removal\n\t// is exactly the moment that matters.\n\tuseEffect(() => {\n\t\tif (!visible || typeof document === 'undefined') return;\n\t\tconst handleFocusIn = (event: FocusEvent) => {\n\t\t\tconst bar = barRef.current;\n\t\t\tconst inside = isWithinBar(bar, event.target);\n\t\t\tif (inside && !focusInsideRef.current) {\n\t\t\t\tconst from = event.relatedTarget;\n\t\t\t\tfocusOriginRef.current = from instanceof HTMLElement && !isWithinBar(bar, from) ? from : null;\n\t\t\t}\n\t\t\tfocusInsideRef.current = inside;\n\t\t};\n\t\t// Pressing somewhere else moves on, even when nothing there takes focus.\n\t\tconst handlePointerDown = (event: PointerEvent) => {\n\t\t\tif (!isWithinBar(barRef.current, event.target)) focusInsideRef.current = false;\n\t\t};\n\t\tdocument.addEventListener('focusin', handleFocusIn);\n\t\tdocument.addEventListener('pointerdown', handlePointerDown, true);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('focusin', handleFocusIn);\n\t\t\tdocument.removeEventListener('pointerdown', handlePointerDown, true);\n\t\t};\n\t}, [visible]);\n\n\tconst restoreFocus = useCallback(() => {\n\t\tconst origin = isConnectedElement(focusOriginRef.current) ? focusOriginRef.current : null;\n\t\tconst owner = isConnectedElement(returnFocusRef?.current) ? returnFocusRef.current : null;\n\t\tfocusOriginRef.current = null;\n\t\t// Entered from inside the owner, and that control is still there: the\n\t\t// user keeps their place in the list. Otherwise the owner, then the origin.\n\t\t// Going back to the origin restores where focus was, so it never scrolls\n\t\t// the page to it.\n\t\tconst candidates = owner && origin && owner.contains(origin) ? [origin, owner] : [owner, origin];\n\t\tfor (const candidate of candidates) {\n\t\t\tif (!candidate) continue;\n\t\t\tcandidate.focus(candidate === origin ? { preventScroll: true } : undefined);\n\t\t\tif (document.activeElement === candidate) return;\n\t\t}\n\t}, [returnFocusRef]);\n\n\t// The bar went away with focus inside it: hand focus back instead of\n\t// dropping it on the body. An action that already moved focus on (a\n\t// dialog, the next field) keeps it.\n\tconst handBackFocus = useCallback(() => {\n\t\tif (!focusInsideRef.current) return;\n\t\tfocusInsideRef.current = false;\n\t\tconst active = document.activeElement;\n\t\tconst lost = !active || active === document.body || !active.isConnected;\n\t\tif (lost) restoreFocus();\n\t}, [restoreFocus]);\n\tuseEffect(() => {\n\t\tif (!visible) handBackFocus();\n\t}, [visible, handBackFocus]);\n\t// The same when a caller unmounts the bar together with the selection.\n\tconst handBackFocusRef = useRef(handBackFocus);\n\thandBackFocusRef.current = handBackFocus;\n\tuseEffect(() => () => handBackFocusRef.current(), []);\n\n\tconst handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n\t\tif (event.key !== 'Escape' || !onClear || event.defaultPrevented) return;\n\t\t// React bubbles events out of portals; a menu opened from an action owns\n\t\t// its own Escape, so only keys pressed in the bar's DOM clear.\n\t\tif (!(event.target instanceof Node) || !event.currentTarget.contains(event.target)) return;\n\t\tevent.preventDefault();\n\t\t// One Escape, one layer: the dialog or drawer around the bar stays open.\n\t\tevent.stopPropagation();\n\t\tonClear();\n\t};\n\n\t// Nothing selected, nothing rendered.\n\tif (!visible) return null;\n\n\tconst hasActions = children !== undefined && children !== null && children !== false;\n\n\treturn (\n\t\t<div\n\t\t\tref={barRef}\n\t\t\t// A named region, so screen reader users can find the bar again after the list.\n\t\t\trole=\"region\"\n\t\t\taria-label={strings.label}\n\t\t\tdata-slot=\"batch-action-bar\"\n\t\t\tdata-placement={placement}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\tclassName={cn(barRecipe, placementRecipes[placement], className)}\n\t\t>\n\t\t\t{/*\n\t\t\t * Not `role=\"status\"`, which would collide with the page's own status\n\t\t\t * line. The control inset lines the count up with the buttons' labels,\n\t\t\t * also when the actions wrap below it. Tabular figures, so a changing\n\t\t\t * count does not shift a centred dock.\n\t\t\t */}\n\t\t\t<div\n\t\t\t\tdata-slot=\"batch-action-bar-summary\"\n\t\t\t\tclassName=\"batch-action-bar--summary min-w-0 px-control\"\n\t\t\t\taria-live=\"polite\"\n\t\t\t\taria-atomic=\"true\"\n\t\t\t>\n\t\t\t\t{countReady && (\n\t\t\t\t\t<Text tag=\"span\" type=\"inherit\" className=\"tabular-nums\">\n\t\t\t\t\t\t{strings.summary(selectedCount, totalCount)}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{(hasActions || !!onClear) && (\n\t\t\t\t<div\n\t\t\t\t\tdata-slot=\"batch-action-bar-actions\"\n\t\t\t\t\t// A rule between the count and the verbs, so the count does not read\n\t\t\t\t\t// as another button. Wrapped below the count on narrow screens, where\n\t\t\t\t\t// the rule would lead the row, it hides.\n\t\t\t\t\tclassName=\"batch-action-bar--actions flex min-w-0 shrink flex-wrap items-center gap-space-xs before:my-space-xs before:w-px before:self-stretch before:bg-border/60 max-sm:before:hidden\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t{!!onClear && (\n\t\t\t\t\t\t<Button type=\"button\" tone=\"neutral\" buttonStyle=\"ghost\" onClick={onClear}>\n\t\t\t\t\t\t\t{strings.clear}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nBatchActionBar.displayName = 'BatchActionBar';\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"button-DkmK-z8E.js","names":["Button","React","ButtonPrimitive","cn","React$1","buttonVariants","cva","focusRecipes","Button$1","props","Button","variant","size","className","state"],"sources":["../src/components/ui/button.tsx"],"sourcesContent":["import { Button as ButtonPrimitive } from '@base-ui/react/button';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\nimport { cn } from '../../lib/utils';\nimport { focusRecipes } from '../../lib/focus-recipes';\n\n/** Internal presentation only; public buttons own the stable tone/style API. */\nexport const buttonVariants = cva(`box-border inline-flex items-center justify-center gap-space-md whitespace-nowrap rounded-inner font-sans text-sm font-medium shrink-0 border border-transparent transition-colors outline-none ${focusRecipes.frame} disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=size-])]:size-icon`, {\n variants: {\n variant: {default:'bg-primary text-primary-foreground hover:bg-primary/90', destructive:'bg-destructive text-destructive-foreground hover:bg-destructive/90', outline:'border-border bg-background text-foreground hover:bg-accent hover:text-accent-foreground', secondary:'bg-secondary text-secondary-foreground hover:bg-secondary/80', ghost:'hover:bg-accent hover:text-accent-foreground', link:'text-link-color underline-offset-4 hover:underline'},\n size: {default:'h-action px-control', xs:'h-action-xs px-control-xs', sm:'h-action-sm px-control-sm', lg:'h-action-lg px-control', icon:'size-action p-0', 'icon-xs':'size-action-xs p-0', 'icon-sm':'size-action-sm p-0', 'icon-lg':'size-action-lg p-0'},\n }, defaultVariants:{variant:'default',size:'default'},\n});\nexport namespace Button { export type Props = ButtonPrimitive.Props & VariantProps<typeof buttonVariants>; }\nexport const Button = React.forwardRef<HTMLElement, Button.Props>(function Button({className,variant,size,...props},ref) {\n // Unspecified recipe props leave presentation ownership with the public wrapper.\n return <ButtonPrimitive {...props} ref={ref} data-slot=\"button\" className={state => cn(variant != null || size != null ? buttonVariants({variant,size}) : undefined, typeof className === 'function' ? className(state) : className)} />;\n});\n"],"mappings":";;;;;;;;AAOA,IAAaK,IAAiBC,EAAI,mMAAmMC,EAAa,MAAM,kMAAkM;CACzb,UAAU;EACT,SAAS;GAAC,SAAQ;GAA0D,aAAY;GAAsE,SAAQ;GAA4F,WAAU;GAAgE,OAAM;GAAgD,MAAK;EAAoD;EAC3b,MAAM;GAAC,SAAQ;GAAuB,IAAG;GAA6B,IAAG;GAA6B,IAAG;GAA0B,MAAK;GAAmB,WAAU;GAAsB,WAAU;GAAsB,WAAU;EAAoB;CAC1P;CAAG,iBAAgB;EAAC,SAAQ;EAAU,MAAK;CAAS;AACrD,CAAC,GAEYP,IAASC,EAAM,WAAsC,SAAgB,EAAC,cAAU,YAAQ,SAAK,GAAGQ,KAAO,GAAK;CAExH,OAAO,kBAACP,GAAD;EAAiB,GAAIO;EAAY;EAAK,aAAU;EAAS,YAAW,MAASN,EAAGQ,KAAW,QAAQC,KAAQ,OAAOP,EAAe;GAAC;GAAQ;EAAI,CAAC,IAAI,KAAA,GAAW,OAAOQ,KAAc,aAAaA,EAAUC,CAAK,IAAID,CAAS;CAAI,CAAA;AACxO,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"buttons-BbfzgczK.js","names":["ButtonGroup","ButtonGroupText","ButtonGroupSeparator","ButtonGroupPrimitive","styles","ButtonGroupTextPrimitive","ButtonGroupSeparatorPrimitive","_Fragment","PrimitiveButton","_Fragment","styles","React","React","React","React","useButtonConfig","useDensityConfig","resolveComponentScale","cn","affordanceGeometry","Separator","Text","focusRecipes","TooltipTrigger","TooltipContent","Tooltip","Button$1","React$1","Fragment$1","buttonGroupVariants","orientation","ButtonGroup$1","props","className","ButtonGroupText$1","useRender","mergeProps","ButtonGroupSeparator$1","buttonGroupRecipes","ButtonGroup","isScalarContent","content","ButtonGroupText","children","ButtonGroupSeparator","buttonRecipes","buttonVariants","cva","usePendingButtonFocus","element","useRef","lastFocused","wasPending","restore","ref","useCallback","node","focus","blur","cleanup","forwardedRef","useLayoutEffect","previous","pending","doc","eligible","removeListeners","pointer","keyboard","cancel","event","usePresentation","defaults","resolved","tone","buttonStyle","size","defaultScale","iconOnly","fullWidth","truncate","Content","Icon","glyph","iconPosition","BaseButton","forwardRef","presentation","focusRef","state","BaseButtonLink","relTokens","rel","target","disabled","tabIndex","defaultButtonLoadingStrings","useLoaderButtonState","stringsProp","strings","useStrings","isLoading","setIsLoading","useState","loading","setShowCompletedState","useEffect","handlesLoading","timeoutId","LoaderButtonContent","_size","loadingText","isSimpleText","Loader2","LoaderButton","TooltipButton","mergedProps","triggerProps","withTooltip","usesLoaderPath","LoadingButtonLink","loader","ButtonLink","_withTooltip","_loading","_handlesLoading","_strings","linkProps","toLinkProps","_type","_form","_formAction","_formEncType","_formMethod","_formNoValidate","_formTarget","_name","_value","_nativeButton","_focusableWhenDisabled","_render","Button","href","link","_download","_hrefLang","_media","_ping","_referrerPolicy","_rel","_target","baseProps","actionProps","sizeClasses","TextButton","resolvedSize"],"sources":["../src/components/ui/button-group.tsx","../src/components/base/buttons/button-group.recipes.ts","../src/components/base/buttons/button-group.tsx","../src/components/base/buttons/button.recipes.ts","../src/components/base/buttons/button.variants.ts","../src/components/base/buttons/use-pending-button-focus.ts","../src/components/base/buttons/base-button.tsx","../src/components/base/buttons/loader-button.tsx","../src/components/base/buttons/tooltip-button.tsx","../src/components/base/buttons/button.tsx","../src/components/base/buttons/text-button.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Separator } from \"./separator\"\n\nconst buttonGroupVariants = ({ orientation = \"horizontal\" }: { orientation?: \"horizontal\" | \"vertical\" } = {}) =>\n orientation === \"vertical\" ? \"button-group-vertical\" : \"button-group-horizontal\"\n\nfunction ButtonGroup({\n className,\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<\"div\"> & { orientation?: \"horizontal\" | \"vertical\" }) {\n return (\n <div\n role=\"group\"\n data-slot=\"button-group\"\n data-orientation={orientation}\n className={cn(\"button-group--primitive\", className)}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupText({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(\"button-group-text--primitive\", className),\n },\n props\n ),\n render,\n state: {\n slot: \"button-group-text\",\n },\n })\n}\n\nfunction ButtonGroupSeparator({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"button-group-separator\"\n orientation={orientation}\n className={cn(\"button-group-separator--primitive\", className)}\n {...props}\n />\n )\n}\n\nexport {\n ButtonGroup,\n ButtonGroupSeparator,\n ButtonGroupText,\n buttonGroupVariants,\n}\n","/** Private Tailwind recipes; public props and DOM hooks remain owned by the component. */\nexport const buttonGroupRecipes = {\n\t// Joined edges drop the following segment's leading border instead of overlapping\n\t// by a pixel: translucent hairlines would otherwise double up into a darker seam.\n\troot: \"inline-flex items-stretch rounded-inner box-border data-[orientation=vertical]:flex-col [&[data-orientation=horizontal]>:not(:last-child)]:rounded-e-none [&[data-orientation=horizontal]>:not(:first-child)]:rounded-s-none [&[data-orientation=horizontal]>:not(:first-child)]:border-s-0 [&[data-orientation=vertical]>:not(:last-child)]:rounded-b-none [&[data-orientation=vertical]>:not(:first-child)]:rounded-t-none [&[data-orientation=vertical]>:not(:first-child)]:border-t-0\",\n\t// A text segment shares the default outline button's corner and hairline.\n\ttext: \"inline-flex items-center rounded-inner px-control-sm py-0 bg-muted border border-input text-sm text-muted-foreground\",\n\tseparator: \"bg-border w-px self-stretch\",\n} as const satisfies Record<string, string>;\n","/**\n * ButtonGroup — base wrapper around the shadcn `ui/button-group` primitive.\n *\n * What this layer adds on top of the primitive:\n * - Stable BEM hooks (`button-group--component`, `button-group-text--component`,\n * `button-group-separator--component`) on each wrapped part's outermost node.\n * - Design-system typography for the scalar copy inside `ButtonGroupText`,\n * while arbitrary `ReactNode` content (icons, `kbd`, nested controls) passes\n * through untouched so the compound pattern stays composable.\n * - Keeps the primitive's `orientation` variant, segmented-radius handling, and\n * every native `div` prop by spread.\n *\n * Compose it as `<ButtonGroup><Button/><ButtonGroupSeparator/><Button/></ButtonGroup>`.\n * Reach for it when adjacent buttons must read as one segmented control; use\n * `Stack` when the buttons are merely peers with a gap between them.\n */\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport {\n\tButtonGroup as ButtonGroupPrimitive,\n\tButtonGroupSeparator as ButtonGroupSeparatorPrimitive,\n\tButtonGroupText as ButtonGroupTextPrimitive,\n\tbuttonGroupVariants,\n} from '../../ui/button-group';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { buttonGroupRecipes as styles } from './button-group.recipes';\n\nexport type ButtonGroupProps = ComponentProps<typeof ButtonGroupPrimitive>;\nexport type ButtonGroupTextProps = ComponentProps<typeof ButtonGroupTextPrimitive>;\nexport type ButtonGroupSeparatorProps = ComponentProps<typeof ButtonGroupSeparatorPrimitive>;\n\n/** Segmented shell that joins adjacent buttons into a single control. */\nfunction ButtonGroup({ className, ...props }: ButtonGroupProps) {\n\treturn (\n\t\t<ButtonGroupPrimitive className={cn('button-group--component', styles.root, className)} {...props} />\n\t);\n}\n\nfunction isScalarContent(content: ReactNode): content is string | number | bigint {\n\treturn typeof content === 'string' || typeof content === 'number' || typeof content === 'bigint';\n}\n\n/** Non-interactive label segment — scalar copy renders through Typography. */\nfunction ButtonGroupText({ children, className, ...props }: ButtonGroupTextProps) {\n\treturn (\n\t\t<ButtonGroupTextPrimitive className={cn('button-group-text--component', styles.text, className)} {...props}>\n\t\t\t{isScalarContent(children) ? (\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t{children}\n\t\t\t\t</Text>\n\t\t\t) : (\n\t\t\t\tchildren\n\t\t\t)}\n\t\t</ButtonGroupTextPrimitive>\n\t);\n}\n\n/** Hairline divider between two segments of the group. */\nfunction ButtonGroupSeparator({ className, ...props }: ButtonGroupSeparatorProps) {\n\treturn (\n\t\t<ButtonGroupSeparatorPrimitive\n\t\t\tclassName={cn('button-group-separator--component', styles.separator, className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { ButtonGroup, ButtonGroupSeparator, ButtonGroupText, buttonGroupVariants };\n","/** Shared interaction states and loader anatomy; public variants own geometry. */\nexport const buttonRecipes = {\n\tsolidInteractive: '[&:hover:not(:active):not(:disabled):not([data-disabled]):not([aria-disabled=true])]:brightness-95 [&:active:not(:disabled):not([data-disabled]):not([aria-disabled=true])]:brightness-90',\n\t// Outline and ghost buttons hover with the same accent fill as rows and menus, paired\n\t// with its foreground. The text pairing is a plain hover so a component's own hover\n\t// colour (a destructive remove icon, a segment label) still merges over it.\n\tneutralInteractive: 'hover:text-accent-foreground [&:hover:not(:active):not(:disabled):not([data-disabled]):not([aria-disabled=true])]:bg-accent [&:active:not(:disabled):not([data-disabled]):not([aria-disabled=true])]:bg-muted',\n\tsecondaryInteractive: 'hover:text-accent-foreground [&:hover:not(:active):not(:disabled):not([data-disabled]):not([aria-disabled=true])]:bg-accent [&:active:not(:disabled):not([data-disabled]):not([aria-disabled=true])]:bg-muted',\n\tprimaryInteractive: '[&:hover:not(:active):not(:disabled):not([data-disabled]):not([aria-disabled=true])]:bg-primary/10 [&:active:not(:disabled):not([data-disabled]):not([aria-disabled=true])]:bg-primary/20',\n\tdestructiveInteractive: '[&:hover:not(:active):not(:disabled):not([data-disabled]):not([aria-disabled=true])]:bg-destructive/10 [&:active:not(:disabled):not([data-disabled]):not([aria-disabled=true])]:bg-destructive/20',\n\tsuccessInteractive: '[&:hover:not(:active):not(:disabled):not([data-disabled]):not([aria-disabled=true])]:bg-success/10 [&:active:not(:disabled):not([data-disabled]):not([aria-disabled=true])]:bg-success/20',\n\twarningInteractive: '[&:hover:not(:active):not(:disabled):not([data-disabled]):not([aria-disabled=true])]:bg-warning/10 [&:active:not(:disabled):not([data-disabled]):not([aria-disabled=true])]:bg-warning/20',\n\tinfoInteractive: '[&:hover:not(:active):not(:disabled):not([data-disabled]):not([aria-disabled=true])]:bg-info/10 [&:active:not(:disabled):not([data-disabled]):not([aria-disabled=true])]:bg-info/20',\n\tisLoading: 'cursor-wait',\n\ticon: 'base-button-icon pointer-events-none shrink-0',\n\tspinner: 'animate-spin',\n} as const;\n","import { cva } from 'class-variance-authority';\nimport { affordanceGeometry } from '../../../lib/affordance-geometry.generated';\nimport { buttonRecipes } from './button.recipes';\nimport { focusRecipes } from '../../../lib/focus-recipes';\n\n/** Shared geometry and semantic tone/treatment pairs; no extra component tokens. */\n// Labels wrap within the container (capped at max-w-full); truncate keeps one line with an ellipsis.\nexport const buttonVariants = cva(`box-border inline-flex max-w-full shrink-0 items-center justify-center gap-space-sm [&_svg:not([class*=size-])]:size-icon [&_svg]:shrink-0 text-center [overflow-wrap:break-word] rounded-inner border font-sans font-medium no-underline outline-none transition-[background-color,border-color,color,filter,box-shadow] ${focusRecipes.frame} disabled:cursor-not-allowed disabled:opacity-50 aria-disabled:cursor-not-allowed aria-disabled:opacity-50`, {\n variants: {\n tone: {primary: '', neutral: '', secondary: '', destructive: '', success: '', warning: '', info: ''},\n buttonStyle: {\n solid: `border-transparent ${buttonRecipes.solidInteractive}`,\n outline: 'border-input bg-transparent',\n ghost: 'border-transparent bg-transparent',\n },\n // Keep leading after text size: class merging treats a later font size as\n // owning its default line height and would remove an earlier leading-none.\n // The block inset is capped so a one-line label always fits the action height.\n size: {\n sm: `px-control-sm ${affordanceGeometry.buttonBlockPadding.sm} text-sm leading-tight`,\n md: `px-control ${affordanceGeometry.buttonBlockPadding.md} text-sm leading-tight`,\n lg: `px-control ${affordanceGeometry.buttonBlockPadding.lg} text-sm leading-tight`,\n },\n iconOnly: {true: 'px-0 py-0', false: ''},\n truncate: {true: 'min-w-0 shrink whitespace-nowrap', false: ''},\n fullWidth: {true: 'w-full', false: ''},\n },\n compoundVariants: [\n {tone: 'info', buttonStyle: ['outline', 'ghost'], class: buttonRecipes.infoInteractive},\n {tone: 'warning', buttonStyle: ['outline', 'ghost'], class: buttonRecipes.warningInteractive},\n {tone: 'success', buttonStyle: ['outline', 'ghost'], class: buttonRecipes.successInteractive},\n {tone: 'destructive', buttonStyle: ['outline', 'ghost'], class: buttonRecipes.destructiveInteractive},\n {tone: 'secondary', buttonStyle: ['outline', 'ghost'], class: buttonRecipes.secondaryInteractive},\n {tone: 'neutral', buttonStyle: ['outline', 'ghost'], class: buttonRecipes.neutralInteractive},\n {tone: 'primary', buttonStyle: ['outline', 'ghost'], class: buttonRecipes.primaryInteractive},\n {tone: 'primary', buttonStyle: 'solid', class: 'bg-primary text-primary-foreground'},\n {tone: 'primary', buttonStyle: 'outline', class: 'border-primary/60 text-primary-accent'},\n {tone: 'primary', buttonStyle: 'ghost', class: 'text-primary-accent'},\n {tone: 'neutral', buttonStyle: 'solid', class: 'bg-foreground text-background'},\n {tone: 'neutral', buttonStyle: 'outline', class: 'border-input text-foreground'},\n {tone: 'neutral', buttonStyle: 'ghost', class: 'text-foreground'},\n {tone: 'secondary', buttonStyle: 'solid', class: 'bg-secondary text-secondary-foreground'},\n // Neutral and default outlines draw the shared control boundary, like every field.\n {tone: 'secondary', buttonStyle: 'outline', class: 'border-input text-secondary-foreground'},\n {tone: 'secondary', buttonStyle: 'ghost', class: 'text-secondary-foreground'},\n {tone: 'destructive', buttonStyle: 'solid', class: 'bg-destructive text-destructive-foreground'},\n {tone: 'destructive', buttonStyle: 'outline', class: 'border-destructive/60 text-destructive'},\n {tone: 'destructive', buttonStyle: 'ghost', class: 'text-destructive'},\n {tone: 'success', buttonStyle: 'solid', class: 'bg-success text-success-foreground'},\n {tone: 'success', buttonStyle: 'outline', class: 'border-success/60 text-success'},\n {tone: 'success', buttonStyle: 'ghost', class: 'text-success'},\n {tone: 'warning', buttonStyle: 'solid', class: 'bg-warning text-warning-foreground'},\n {tone: 'warning', buttonStyle: 'outline', class: 'border-warning/60 text-warning-accent'},\n {tone: 'warning', buttonStyle: 'ghost', class: 'text-warning-accent'},\n {tone: 'info', buttonStyle: 'solid', class: 'bg-info text-info-foreground'},\n {tone: 'info', buttonStyle: 'outline', class: 'border-info/60 text-info'},\n {tone: 'info', buttonStyle: 'ghost', class: 'text-info'},\n // Text buttons treat the action height as a minimum, so a wrapped label grows the\n // button instead of overflowing it; icon-only buttons stay fixed squares.\n {size: 'sm', iconOnly: false, class: 'min-h-action-sm'},\n {size: 'md', iconOnly: false, class: 'min-h-action'},\n {size: 'lg', iconOnly: false, class: 'min-h-action-lg'},\n {size: 'sm', iconOnly: true, class: 'size-action-sm'},\n {size: 'md', iconOnly: true, class: 'size-action'},\n {size: 'lg', iconOnly: true, class: 'size-action-lg'},\n ],\n defaultVariants: {tone: 'secondary', buttonStyle: 'outline', size: 'md', iconOnly: false, fullWidth: false, truncate: false},\n});\n","import { useCallback, useLayoutEffect, useRef, type ForwardedRef, type RefCallback } from 'react';\n\n/** Native disabling can drop focused busy actions to body; restore only an unclaimed focus. */\nexport function usePendingButtonFocus(pending: boolean, forwardedRef: ForwardedRef<HTMLElement>) {\n const element = useRef<HTMLElement | null>(null);\n const lastFocused = useRef(false);\n const wasPending = useRef(false);\n const restore = useRef(false);\n const ref = useCallback<RefCallback<HTMLElement>>(node => {\n element.current = node;\n const focus = () => {lastFocused.current = true;};\n const blur = () => {\n // Disabling can blur before the pending layout effect runs.\n if (!wasPending.current && !node?.matches(':disabled')) lastFocused.current = false;\n };\n node?.addEventListener('focus', focus);\n node?.addEventListener('blur', blur);\n const cleanup = typeof forwardedRef === 'function' ? (forwardedRef as RefCallback<HTMLElement>)(node) : undefined;\n if (forwardedRef && typeof forwardedRef !== 'function') forwardedRef.current = node;\n return () => {\n node?.removeEventListener('focus', focus);\n node?.removeEventListener('blur', blur);\n if (element.current === node) element.current = null;\n if (typeof cleanup === 'function') cleanup();\n else if (typeof forwardedRef === 'function') forwardedRef(null);\n else if (forwardedRef) forwardedRef.current = null;\n };\n }, [forwardedRef]);\n\n useLayoutEffect(() => {\n const node = element.current;\n const previous = wasPending.current;\n wasPending.current = pending;\n if (!node) return;\n const doc = node.ownerDocument;\n if (!pending && !previous) lastFocused.current = doc.activeElement === node;\n if (pending && !previous) restore.current = lastFocused.current || doc.activeElement === node;\n if (!pending && previous) {\n const eligible = restore.current;\n restore.current = false;\n if (eligible && node.isConnected && !node.matches(':disabled,[aria-disabled=true]') && (doc.activeElement === doc.body || doc.activeElement === doc.documentElement)) node.focus({preventScroll:true});\n }\n if (!pending || !restore.current) return;\n const removeListeners = () => {\n doc.removeEventListener('focusin', focus, true);\n doc.removeEventListener('pointerdown', pointer, true);\n doc.removeEventListener('keydown', keyboard, true);\n };\n const cancel = () => {\n lastFocused.current = false;\n restore.current = false;\n removeListeners();\n };\n const focus = (event: FocusEvent) => {\n // Body is the browser's fallback when a native button becomes disabled.\n if (event.target !== node && event.target !== doc.body && event.target !== doc.documentElement) cancel();\n };\n const pointer = (event: PointerEvent) => {\n if (!node.contains(event.target as Node)) cancel();\n };\n const keyboard = (event: KeyboardEvent) => {\n if (event.key === 'Tab') cancel();\n };\n doc.addEventListener('focusin', focus, true);\n doc.addEventListener('pointerdown', pointer, true);\n doc.addEventListener('keydown', keyboard, true);\n return removeListeners;\n });\n return ref;\n}\n","import { forwardRef, type AnchorHTMLAttributes, type ElementType, type ReactNode } from 'react';\nimport { Button as PrimitiveButton } from '../../ui/button';\nimport { useButtonConfig, useDensityConfig, type ButtonSize, type ButtonStyle, type ButtonTone } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { cn } from '../../../lib/utils';\nimport { buttonVariants } from './button.variants';\nimport { usePendingButtonFocus } from './use-pending-button-focus';\n\nexport type { ButtonSize, ButtonStyle, ButtonTone } from '../../../lib/ui-provider';\nexport type IconPosition = 'left' | 'right';\ninterface PresentationProps {\n /** Semantic color. Omit for the neutral button (`UIProvider.button.defaultTone`, `secondary`); use `primary` for the one main command. */\n tone?: ButtonTone;\n /** Emphasis. Defaults to `solid` when `tone` is set, otherwise to `UIProvider.button.defaultButtonStyle` (`outline`). */\n buttonStyle?: ButtonStyle;\n /**\n * Keep the label on one line and end it with an ellipsis instead of wrapping.\n * Use where the button cannot grow, such as a joined group or a dense toolbar.\n */\n truncate?: boolean;\n size?: ButtonSize;\n iconOnly?: boolean;\n fullWidth?: boolean;\n icon?: ElementType;\n iconPosition?: IconPosition;\n children?: ReactNode;\n}\nexport interface BaseButtonProps extends Omit<PrimitiveButton.Props, 'children' | 'size' | 'variant'>, PresentationProps {}\nexport interface BaseButtonLinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'children' | 'href'>, PresentationProps {href: string; disabled?: boolean}\n\nfunction usePresentation({tone, buttonStyle, size, iconOnly = false, fullWidth = false, truncate = false}: PresentationProps) {\n const defaults = useButtonConfig();\n const {defaultScale} = useDensityConfig();\n // Choosing a tone asks for that tone's solid treatment; untoned buttons use the default pair.\n const resolved = {tone: tone ?? defaults.defaultTone, buttonStyle: buttonStyle ?? (tone === undefined ? defaults.defaultButtonStyle : 'solid'), size: resolveComponentScale(size, defaultScale), iconOnly, fullWidth, truncate};\n return {\n ...resolved,\n classes: buttonVariants(resolved),\n attributes: {'data-slot': 'button', 'data-tone': resolved.tone, 'data-style': resolved.buttonStyle, 'data-size': resolved.size, 'data-icon-only': iconOnly || undefined, 'data-full-width': fullWidth || undefined, 'data-truncate': truncate || undefined},\n };\n}\n\nfunction Content({icon: Icon, iconPosition = 'left', truncate = false, children}: Pick<PresentationProps, 'icon' | 'iconPosition' | 'truncate' | 'children'>) {\n const glyph = Icon && <Icon className=\"size-icon shrink-0\" aria-hidden=\"true\" />;\n // An ellipsis needs a block box: bare text inside the flex button cannot truncate.\n const label = truncate && (typeof children === 'string' || typeof children === 'number') ? <span className=\"min-w-0 truncate\">{children}</span> : children;\n return <>{iconPosition === 'left' && glyph}{label}{iconPosition === 'right' && glyph}</>;\n}\n\nexport const BaseButton = forwardRef<HTMLElement, BaseButtonProps>(function BaseButton({tone, buttonStyle, size, iconOnly, fullWidth, truncate, icon, iconPosition, className, children, ...props}, ref) {\n const presentation = usePresentation({tone, buttonStyle, size, iconOnly, fullWidth, truncate, children});\n const focusRef = usePendingButtonFocus(props['aria-busy'] === true || props['aria-busy'] === 'true', ref);\n return <PrimitiveButton {...props} {...presentation.attributes} ref={focusRef} className={(state) => cn('base-button--component', presentation.classes, typeof className === 'function' ? className(state) : className)}><Content icon={icon} iconPosition={iconPosition} truncate={truncate}>{children}</Content></PrimitiveButton>;\n});\n\n/** Navigation remains an anchor: Base UI's Button render API deliberately enforces button semantics. */\nexport const BaseButtonLink = forwardRef<HTMLAnchorElement, BaseButtonLinkProps>(function BaseButtonLink({tone, buttonStyle, size, iconOnly, fullWidth, truncate, icon, iconPosition, className, children, disabled = false, tabIndex, onClick, rel, target, ...props}, ref) {\n const presentation = usePresentation({tone, buttonStyle, size, iconOnly, fullWidth, truncate, children});\n const relTokens = new Set(rel?.split(/\\s+/).filter(Boolean));\n if (target?.toLowerCase() === '_blank') {if (!relTokens.size) relTokens.add('noreferrer'); relTokens.add('noopener');}\n return <a {...props} {...presentation.attributes} ref={ref} target={target} rel={relTokens.size ? [...relTokens].join(' ') : undefined} aria-disabled={disabled || props['aria-disabled'] || undefined} tabIndex={disabled ? -1 : tabIndex} className={cn('base-button--component', presentation.classes, className)} onClick={(event) => {\n if (disabled) {event.preventDefault(); event.stopPropagation(); return;}\n onClick?.(event);\n }}><Content icon={icon} iconPosition={iconPosition} truncate={truncate}>{children}</Content></a>;\n});\n","import { Loader2 } from 'lucide-react';\nimport * as React from 'react';\nimport { useState, useEffect } from 'react';\nimport { cn } from '../../../lib/utils';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { Text } from '../../typography';\nimport { BaseButton, type BaseButtonProps, type ButtonSize } from './base-button';\nimport { buttonRecipes as styles } from './button.recipes';\n\nexport interface ButtonLoadingStrings {\n\t/** Shows the spinner and blocks activation. */\n\tloading: string;\n\tcompleted: string;\n}\n\nexport const defaultButtonLoadingStrings: ButtonLoadingStrings = {\n\tloading: 'Loading...',\n\tcompleted: 'Completed',\n};\n\nexport interface LoaderButtonProps extends BaseButtonProps {\n\t/** Shows the spinner and blocks activation. */\n\tloading?: boolean;\n\t/** Opts into the loading-capable button even before `loading` is true, so the first press does not swap component identity. */\n\thandlesLoading?: boolean;\n\t/** Overrides the loading announcement copy. */\n\tstrings?: StringsProp<ButtonLoadingStrings>;\n}\n\ninterface UseLoaderButtonStateOptions {\n\t/** Shows the spinner and blocks activation. */\n\tloading?: boolean;\n\t/** Opts into the loading-capable button even before `loading` is true, so the first press does not swap component identity. */\n\thandlesLoading?: boolean;\n\t/** Overrides the loading announcement copy. */\n\tstrings?: StringsProp<ButtonLoadingStrings>;\n}\n\nexport function useLoaderButtonState({\n\tloading = false,\n\thandlesLoading,\n\tstrings: stringsProp,\n}: UseLoaderButtonStateOptions) {\n\tconst strings = useStrings(defaultButtonLoadingStrings, stringsProp);\n\tconst [isLoading, setIsLoading] = useState(loading);\n\tconst [, setShowCompletedState] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (loading) {\n\t\t\tsetIsLoading(true);\n\t\t}\n\t}, [loading]);\n\n\tuseEffect(() => {\n\t\tif (handlesLoading && loading) {\n\t\t\tsetIsLoading(true);\n\t\t}\n\t}, [loading, handlesLoading]);\n\n\tuseEffect(() => {\n\t\tlet timeoutId: ReturnType<typeof setTimeout>;\n\t\tif (!loading && isLoading) {\n\t\t\tsetShowCompletedState(true);\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tsetIsLoading(false);\n\t\t\t\tsetShowCompletedState(false);\n\t\t\t}, 300);\n\t\t}\n\t\treturn () => {\n\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t};\n\t}, [loading, isLoading]);\n\n\treturn { isLoading, strings };\n}\n\ninterface LoaderButtonContentProps {\n\tisLoading: boolean;\n\tloadingText: string;\n\ticon?: BaseButtonProps['icon'];\n\ticonPosition?: BaseButtonProps['iconPosition'];\n\ticonOnly?: boolean;\n\tsize?: ButtonSize;\n\t/** Ends the label with an ellipsis instead of wrapping it. */\n\ttruncate?: boolean;\n\tchildren: React.ReactNode;\n}\n\nexport function LoaderButtonContent({\n\tisLoading,\n\tloadingText,\n\ticon: Icon,\n\ticonPosition = 'left',\n\ticonOnly = false,\n\tsize: _size,\n\ttruncate = false,\n\tchildren,\n}: LoaderButtonContentProps) {\n\tconst content = isLoading ? loadingText : children;\n\tconst isSimpleText = typeof content === 'string' || typeof content === 'number' || typeof content === 'bigint';\n\n\treturn (\n\t\t<>\n\t\t\t{!!isLoading && (\n\t\t\t\t<Loader2\n\t\t\t\t\tclassName={cn(styles.icon, styles.spinner)}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{!!Icon && iconPosition === 'left' && !isLoading && (\n\t\t\t\t<Icon\n\t\t\t\t\tclassName={styles.icon}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{isLoading && iconOnly ? (\n\t\t\t\t<span className=\"sr-only\">{loadingText}</span>\n\t\t\t) : isSimpleText ? (\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className={cn('text-inherit', truncate && 'min-w-0 truncate')}>\n\t\t\t\t\t{content}\n\t\t\t\t</Text>\n\t\t\t) : content}\n\t\t\t{!!Icon && iconPosition === 'right' && !isLoading && (\n\t\t\t\t<Icon\n\t\t\t\t\tclassName={styles.icon}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n}\n\nconst LoaderButton = React.forwardRef<HTMLButtonElement, LoaderButtonProps>(\n\t(\n\t\t{\n\t\t\tloading = false,\n\t\t\thandlesLoading,\n\t\t\tstrings: stringsProp,\n\t\t\ticon: Icon,\n\t\t\ticonPosition = 'left',\n\t\t\tchildren,\n\t\t\tdisabled,\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst { isLoading, strings } = useLoaderButtonState({\n\t\t\tloading,\n\t\t\thandlesLoading,\n\t\t\tstrings: stringsProp,\n\t\t});\n\n\t\treturn (\n\t\t\t<BaseButton\n\t\t\t\t{...props}\n\t\t\t\tref={ref}\n\t\t\t\tdisabled={disabled || isLoading}\n\t\t\t\taria-busy={isLoading || undefined}\n\t\t\t\tclassName={cn('loader-button--component', isLoading && styles.isLoading, className)}\n\t\t\t>\n\t\t\t\t<LoaderButtonContent\n\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\tloadingText={strings.loading}\n\t\t\t\t\ticon={Icon}\n\t\t\t\t\ticonPosition={iconPosition}\n\t\t\t\t\ticonOnly={props.iconOnly}\n\t\t\t\t\tsize={props.size}\n\t\t\t\t\ttruncate={props.truncate}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</LoaderButtonContent>\n\t\t\t</BaseButton>\n\t\t);\n\t},\n);\n\nLoaderButton.displayName = 'LoaderButton';\n\nexport { LoaderButton };\n","import * as React from 'react';\nimport { mergeProps } from '@base-ui/react/merge-props';\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from '../display/tooltip';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { BaseButton, type BaseButtonProps } from './base-button';\n\nexport interface TooltipButtonProps extends BaseButtonProps {\n\twithTooltip: string;\n}\n\nconst TooltipButton = React.forwardRef<HTMLButtonElement, TooltipButtonProps>(\n\t({ withTooltip, children, ...props }, ref) => {\n\t\treturn (\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger\n\t\t\t\t\trender={(triggerProps) => {\n\t\t\t\t\t\tconst mergedProps = mergeProps<'button'>(\n\t\t\t\t\t\t\tprops as unknown as React.ButtonHTMLAttributes<HTMLButtonElement>,\n\t\t\t\t\t\t\ttriggerProps as React.ButtonHTMLAttributes<HTMLButtonElement>,\n\t\t\t\t\t\t) as unknown as BaseButtonProps;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<BaseButton\n\t\t\t\t\t\t\t{...mergedProps}\n\t\t\t\t\t\t\taria-label={props['aria-label'] ?? withTooltip}\n\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\tclassName={cn('tooltip-button--component', mergedProps.className)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</BaseButton>\n\t\t\t\t\t\t);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<TooltipContent>\n\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"text-inherit\">{withTooltip}</Text>\n\t\t\t\t</TooltipContent>\n\t\t\t</Tooltip>\n\t\t);\n\t},\n);\n\nTooltipButton.displayName = 'TooltipButton';\n\nexport { TooltipButton };\n","/**\n * Button — everyday action/link wrapper around the base button presentation.\n *\n * Action mode renders one native `<button>`. Supplying `href` switches to one\n * native `<a>` with the same provider-driven variants, sizes, loading state,\n * and optional tooltip. The link path deliberately does not use Base UI\n * Button's non-native `render` mode because that mode adds button semantics to\n * the replacement element; navigation keeps native link semantics instead.\n */\nimport * as React from 'react';\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from '../display/tooltip';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport {\n\tBaseButton,\n\tBaseButtonLink,\n\ttype BaseButtonLinkProps,\n\ttype BaseButtonProps,\n} from './base-button';\nimport {\n\tLoaderButton,\n\tLoaderButtonContent,\n\ttype LoaderButtonProps,\n\tuseLoaderButtonState,\n} from './loader-button';\nimport { TooltipButton } from './tooltip-button';\n\ntype ButtonEnhancementProps = Pick<\n\tLoaderButtonProps,\n\t'loading' | 'handlesLoading' | 'strings'\n> & {\n\t/** Tooltip copy shown on hover and focus. Supply it for icon-only buttons. */\n\twithTooltip?: string;\n};\n\ntype ButtonAnchorAttributes = Pick<\n\tReact.AnchorHTMLAttributes<HTMLAnchorElement>,\n\t| 'download'\n\t| 'hrefLang'\n\t| 'media'\n\t| 'ping'\n\t| 'referrerPolicy'\n\t| 'rel'\n\t| 'target'\n>;\n\n/** Shared all-mode props for generic wrappers that accept either action mode or link mode. */\nexport type ButtonProps = BaseButtonProps &\n\tButtonEnhancementProps &\n\tButtonAnchorAttributes & {\n\t\t/** Destination for the entry, when it navigates. */\n\t\thref?: string;\n\t};\n\n/** Precise props for consumers that explicitly model a navigation button. */\nexport type ButtonLinkProps = Omit<BaseButtonLinkProps, 'href' | 'type'> &\n\tButtonEnhancementProps & {\n\t\t/** Destination for the entry, when it navigates. */\n\t\thref: string;\n\t};\n\n/** Precise props for consumers that explicitly model an action button. */\nexport type ButtonActionProps = BaseButtonProps &\n\tButtonEnhancementProps & {\n\t\t/** Destination for the entry, when it navigates. */\n\t\thref?: undefined;\n\t\tdownload?: never;\n\t\threfLang?: never;\n\t\tmedia?: never;\n\t\tping?: never;\n\t\treferrerPolicy?: never;\n\t\trel?: never;\n\t\ttarget?: never;\n\t};\n\nfunction usesLoaderPath({\n\tloading,\n\thandlesLoading,\n\tstrings,\n}: ButtonEnhancementProps) {\n\treturn (\n\t\tloading === true ||\n\t\tBoolean(handlesLoading) ||\n\t\tstrings !== undefined\n\t);\n}\n\nconst LoadingButtonLink = React.forwardRef<HTMLAnchorElement, ButtonLinkProps>(\n\t(\n\t\t{\n\t\t\tloading,\n\t\t\thandlesLoading,\n\t\t\tstrings,\n\t\t\ticon,\n\t\t\ticonPosition = 'left',\n\t\t\tchildren,\n\t\t\tdisabled,\n\t\t\tsize,\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst loader = useLoaderButtonState({\n\t\t\tloading,\n\t\t\thandlesLoading,\n\t\t\tstrings,\n\t\t});\n\n\t\treturn (\n\t\t\t<BaseButtonLink\n\t\t\t\t{...props}\n\t\t\t\tref={ref}\n\t\t\t\tsize={size}\n\t\t\t\tdisabled={disabled || loader.isLoading}\n\t\t\t\taria-busy={loader.isLoading || undefined}\n\t\t\t\tclassName={cn('loader-button--component', className)}\n\t\t\t>\n\t\t\t\t<LoaderButtonContent\n\t\t\t\t\tisLoading={loader.isLoading}\n\t\t\t\t\tloadingText={loader.strings.loading}\n\t\t\t\t\ticon={icon}\n\t\t\t\t\ticonPosition={iconPosition}\n\t\t\t\t\ticonOnly={props.iconOnly}\n\t\t\t\t\tsize={size}\n\t\t\t\t\ttruncate={props.truncate}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</LoaderButtonContent>\n\t\t\t</BaseButtonLink>\n\t\t);\n\t},\n);\n\nLoadingButtonLink.displayName = 'LoadingButtonLink';\n\nconst ButtonLink = React.forwardRef<HTMLAnchorElement, ButtonLinkProps>(\n\t({ withTooltip: _withTooltip, ...props }, ref) => {\n\t\tif (usesLoaderPath(props)) {\n\t\t\treturn <LoadingButtonLink ref={ref} {...props} />;\n\t\t}\n\n\t\tconst {\n\t\t\tloading: _loading,\n\t\t\thandlesLoading: _handlesLoading,\n\t\t\tstrings: _strings,\n\t\t\t...linkProps\n\t\t} = props;\n\t\treturn <BaseButtonLink ref={ref} {...linkProps} />;\n\t},\n);\n\nButtonLink.displayName = 'ButtonLink';\n\nfunction toLinkProps(\n\tprops: Omit<\n\t\tButtonProps,\n\t\t'href' | 'withTooltip' | 'loading' | 'handlesLoading' | 'strings'\n\t>,\n): Omit<ButtonLinkProps, 'href' | keyof ButtonEnhancementProps> {\n\tconst {\n\t\ttype: _type,\n\t\tform: _form,\n\t\tformAction: _formAction,\n\t\tformEncType: _formEncType,\n\t\tformMethod: _formMethod,\n\t\tformNoValidate: _formNoValidate,\n\t\tformTarget: _formTarget,\n\t\tname: _name,\n\t\tvalue: _value,\n\t\tnativeButton: _nativeButton,\n\t\tfocusableWhenDisabled: _focusableWhenDisabled,\n\t\trender: _render,\n\t\t...linkProps\n\t} = props;\n\n\treturn linkProps as unknown as Omit<\n\t\tButtonLinkProps,\n\t\t'href' | keyof ButtonEnhancementProps\n\t>;\n}\n\nconst ButtonImplementation = React.forwardRef<\n\tHTMLButtonElement | HTMLAnchorElement,\n\tButtonProps\n>(\n\t(\n\t\t{\n\t\t\thref,\n\t\t\twithTooltip,\n\t\t\tloading,\n\t\t\thandlesLoading,\n\t\t\tstrings,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tif (href !== undefined) {\n\t\t\tconst linkProps = toLinkProps(props);\n\t\t\tconst link = (\n\t\t\t\t<ButtonLink\n\t\t\t\t\t{...linkProps}\n\t\t\t\t\tref={ref as React.ForwardedRef<HTMLAnchorElement>}\n\t\t\t\t\thref={href}\n\t\t\t\t\tloading={loading}\n\t\t\t\t\thandlesLoading={handlesLoading}\n\t\t\t\t\tstrings={strings}\n\t\t\t\t\taria-label={props['aria-label'] ?? withTooltip}\n\t\t\t\t\tclassName={cn('button--component', linkProps.className)}\n\t\t\t\t/>\n\t\t\t);\n\n\t\t\tif (withTooltip) {\n\t\t\t\treturn (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger render={link} />\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"text-inherit\">{withTooltip}</Text>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn link;\n\t\t}\n\n\t\tconst {\n\t\t\tdownload: _download,\n\t\t\threfLang: _hrefLang,\n\t\t\tmedia: _media,\n\t\t\tping: _ping,\n\t\t\treferrerPolicy: _referrerPolicy,\n\t\t\trel: _rel,\n\t\t\ttarget: _target,\n\t\t\t...baseProps\n\t\t} = props;\n\t\tconst actionProps = {\n\t\t\t...baseProps,\n\t\t\tclassName: cn('button--component', baseProps.className),\n\t\t};\n\n\t\tif (usesLoaderPath({ loading, handlesLoading, strings })) {\n\t\t\tif (withTooltip) {\n\t\t\t\treturn (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger\n\t\t\t\t\t\t\trender={(triggerProps) => (\n\t\t\t\t\t\t\t\t<LoaderButton\n\t\t\t\t\t\t\t\t\t{...actionProps}\n\t\t\t\t\t\t\t\t\t{...triggerProps}\n\t\t\t\t\t\t\t\t\tref={ref as React.ForwardedRef<HTMLButtonElement>}\n\t\t\t\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\t\t\t\thandlesLoading={handlesLoading}\n\t\t\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t\t\t\taria-label={baseProps['aria-label'] ?? withTooltip}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t(triggerProps as { className?: string }).className,\n\t\t\t\t\t\t\t\t\t\tactionProps.className,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{baseProps.children}\n\t\t\t\t\t\t\t\t</LoaderButton>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"text-inherit\">{withTooltip}</Text>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<LoaderButton\n\t\t\t\t\t{...actionProps}\n\t\t\t\t\tref={ref as React.ForwardedRef<HTMLButtonElement>}\n\t\t\t\t\tloading={loading}\n\t\t\t\t\thandlesLoading={handlesLoading}\n\t\t\t\t\tstrings={strings}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\tif (withTooltip) {\n\t\t\treturn (\n\t\t\t\t<TooltipButton\n\t\t\t\t\t{...actionProps}\n\t\t\t\t\tref={ref as React.ForwardedRef<HTMLButtonElement>}\n\t\t\t\t\twithTooltip={withTooltip}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<BaseButton\n\t\t\t\t{...actionProps}\n\t\t\t\tref={ref as React.ForwardedRef<HTMLButtonElement>}\n\t\t\t/>\n\t\t);\n\t},\n);\n\ntype ButtonComponent = {\n\t(props: ButtonLinkProps & React.RefAttributes<HTMLAnchorElement>): React.ReactElement | null;\n\t(props: ButtonActionProps & React.RefAttributes<HTMLButtonElement>): React.ReactElement | null;\n\t(\n\t\tprops: ButtonProps &\n\t\t\tReact.RefAttributes<HTMLButtonElement | HTMLAnchorElement>,\n\t): React.ReactElement | null;\n\tdisplayName?: string;\n};\n\nconst Button = ButtonImplementation as ButtonComponent;\nButton.displayName = 'Button';\n\nexport { Button };\n","/**\n * TextButton — link-styled button (underline, primary tint, no padding).\n *\n * Wraps `BaseButton` with `tone=\"primary\" buttonStyle=\"ghost\"`. Routine\n * usage omits `size`; the shared component scale controls typography.\n */\nimport * as React from 'react';\nimport { focusRecipes } from '../../../lib/focus-recipes';\nimport { cn } from '../../../lib/utils';\nimport { useDensityConfig, type ComponentScale } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { BaseButton } from './base-button';\n\nexport type TextButtonSize = ComponentScale;\n\n// The default size matches default body copy (text-sm), so a text action set beside\n// a sentence or a row value reads at the same size; `sm` is the compact 13px role.\nconst sizeClasses: Record<TextButtonSize, string> = {\n\tsm: 'text-pxs leading-none h-auto min-h-0 px-0 py-0',\n\tmd: 'text-sm leading-none h-auto min-h-0 px-0 py-0',\n\tlg: 'text-sm leading-none h-auto min-h-0 px-0 py-0',\n};\n\nexport type TextButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'size'> & {\n\t/** Size preset. `md` (default) matches body text; `sm` is the compact 13px role. Defaults to `UIProvider.density.defaultScale`. */\n\tsize?: TextButtonSize;\n\tchildren: React.ReactNode;\n};\n\nexport const TextButton = React.forwardRef<HTMLButtonElement, TextButtonProps>(\n\t({ className, type = 'button', size, disabled, ...props }, ref) => {\n\t\tconst { defaultScale } = useDensityConfig();\n\t\tconst resolvedSize = resolveComponentScale(size, defaultScale);\n\t\treturn (\n\t\t\t<BaseButton\n\t\t\t\tref={ref}\n\t\t\t\ttype={type}\n\t\t\t\ttone=\"primary\"\n\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\tsize={resolvedSize}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn('text-button--component',\n\t\t\t\t\t// `ghost` supplies the transparent resting state and the accent\n\t\t\t\t\t// colour, but its hover tint assumes a padded hit area. At\n\t\t\t\t\t// `px-0 h-auto` that tint paints a bare rectangle around the\n\t\t\t\t\t// glyphs, so the underline carries hover on its own. Both\n\t\t\t\t\t// variants are cleared: the light and dark tints are separate\n\t\t\t\t\t// declarations, so overriding one leaves the other painting.\n\t\t\t\t\t'hover:bg-transparent dark:hover:bg-transparent',\n\t\t\t\t\t'inline-flex items-center justify-center underline decoration-border underline-offset-[0.2em] transition-colors hover:decoration-current',\n\t\t\t\t\t// Inline text has no padding: the focus edge sits outside it, not on the border.\n\t\t\t\t\t`text-primary-accent focus-visible:border-transparent ${focusRecipes.text}`,\n\t\t\t\t\t'disabled:pointer-events-none disabled:opacity-50',\n\t\t\t\t\tsizeClasses[resolvedSize],\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\n\nTextButton.displayName = 'TextButton';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAOA,IAAM6B,KAAuB,EAAE,iBAAc,iBAA8D,CAAC,MAC1GC,MAAgB,aAAa,0BAA0B;AAEzD,SAAS9B,EAAY,EACnB,cACA,iBAAc,cACd,GAAGgC,KACyE;CAC5E,OACE,kBAAC,OAAD;EACE,MAAK;EACL,aAAU;EACV,oBAAkBF;EAClB,WAAWZ,EAAG,2BAA2Be,CAAS;EAClD,GAAID;CACL,CAAA;AAEL;AAEA,SAAS/B,EAAgB,EACvB,cACA,WACA,GAAG+B,KAC+B;CAClC,OAAOG,EAAU;EACf,gBAAgB;EAChB,OAAOC,EACL,EACE,WAAWlB,EAAG,gCAAgCe,CAAS,EACzD,GACAD,CACF;EACA;EACA,OAAO,EACL,MAAM,oBACR;CACF,CAAC;AACH;AAEA,SAAS9B,EAAqB,EAC5B,cACA,iBAAc,YACd,GAAG8B,KACsC;CACzC,OACE,kBAACZ,GAAD;EACE,aAAU;EACG;EACb,WAAWF,EAAG,qCAAqCe,CAAS;EAC5D,GAAID;CACL,CAAA;AAEL;;;AC1DA,IAAaM,IAAqB;CAGjC,MAAM;CAEN,MAAM;CACN,WAAW;AACZ;;;ACyBA,SAASC,EAAY,EAAE,cAAW,GAAGP,KAA2B;CAC/D,OACC,kBAAC7B,GAAD;EAAsB,WAAWe,EAAG,2BAA2Bd,EAAO,MAAM6B,CAAS;EAAG,GAAID;CAAQ,CAAA;AAEtG;AAEA,SAASQ,EAAgB,GAAyD;CACjF,OAAO,OAAOC,KAAY,YAAY,OAAOA,KAAY,YAAY,OAAOA,KAAY;AACzF;AAGA,SAASC,EAAgB,EAAE,aAAU,cAAW,GAAGV,KAA+B;CACjF,OACC,kBAAC3B,GAAD;EAA0B,WAAWa,EAAG,gCAAgCd,EAAO,MAAM6B,CAAS;EAAG,GAAID;EACnG,UAAAQ,EAAgBG,CAAQ,IACxB,kBAACtB,GAAD;GAAM,KAAI;GAAO,MAAK;GAAU,QAAO;GAAS,YAAW;GAAQ,WAAU;GAC3E;EACI,CAAA,IAENsB;CAEwB,CAAA;AAE5B;AAGA,SAASC,EAAqB,EAAE,cAAW,GAAGZ,KAAoC;CACjF,OACC,kBAAC1B,GAAD;EACC,WAAWY,EAAG,qCAAqCd,EAAO,WAAW6B,CAAS;EAC9E,GAAID;CACJ,CAAA;AAEH;;;ACjEA,IAAaa,IAAgB;CAC5B,kBAAkB;CAIlB,oBAAoB;CACpB,sBAAsB;CACtB,oBAAoB;CACpB,wBAAwB;CACxB,oBAAoB;CACpB,oBAAoB;CACpB,iBAAiB;CACjB,WAAW;CACX,MAAM;CACN,SAAS;AACV,GCTaC,IAAiBC,EAAI,6TAA6TzB,EAAa,MAAM,6GAA6G;CAC7d,UAAU;EACR,MAAM;GAAC,SAAS;GAAI,SAAS;GAAI,WAAW;GAAI,aAAa;GAAI,SAAS;GAAI,SAAS;GAAI,MAAM;EAAE;EACnG,aAAa;GACX,OAAO,sBAAsBuB,EAAc;GAC3C,SAAS;GACT,OAAO;EACT;EAIA,MAAM;GACJ,IAAI,iBAAiB1B,EAAmB,mBAAmB,GAAG;GAC9D,IAAI,cAAcA,EAAmB,mBAAmB,GAAG;GAC3D,IAAI,cAAcA,EAAmB,mBAAmB,GAAG;EAC7D;EACA,UAAU;GAAC,MAAM;GAAa,OAAO;EAAE;EACvC,UAAU;GAAC,MAAM;GAAoC,OAAO;EAAE;EAC9D,WAAW;GAAC,MAAM;GAAU,OAAO;EAAE;CACvC;CACA,kBAAkB;EAChB;GAAC,MAAM;GAAQ,aAAa,CAAC,WAAW,OAAO;GAAG,OAAO0B,EAAc;EAAe;EACtF;GAAC,MAAM;GAAW,aAAa,CAAC,WAAW,OAAO;GAAG,OAAOA,EAAc;EAAkB;EAC5F;GAAC,MAAM;GAAW,aAAa,CAAC,WAAW,OAAO;GAAG,OAAOA,EAAc;EAAkB;EAC5F;GAAC,MAAM;GAAe,aAAa,CAAC,WAAW,OAAO;GAAG,OAAOA,EAAc;EAAsB;EACpG;GAAC,MAAM;GAAa,aAAa,CAAC,WAAW,OAAO;GAAG,OAAOA,EAAc;EAAoB;EAChG;GAAC,MAAM;GAAW,aAAa,CAAC,WAAW,OAAO;GAAG,OAAOA,EAAc;EAAkB;EAC5F;GAAC,MAAM;GAAW,aAAa,CAAC,WAAW,OAAO;GAAG,OAAOA,EAAc;EAAkB;EAC5F;GAAC,MAAM;GAAW,aAAa;GAAS,OAAO;EAAoC;EACnF;GAAC,MAAM;GAAW,aAAa;GAAW,OAAO;EAAuC;EACxF;GAAC,MAAM;GAAW,aAAa;GAAS,OAAO;EAAqB;EACpE;GAAC,MAAM;GAAW,aAAa;GAAS,OAAO;EAA+B;EAC9E;GAAC,MAAM;GAAW,aAAa;GAAW,OAAO;EAA8B;EAC/E;GAAC,MAAM;GAAW,aAAa;GAAS,OAAO;EAAiB;EAChE;GAAC,MAAM;GAAa,aAAa;GAAS,OAAO;EAAwC;EAEzF;GAAC,MAAM;GAAa,aAAa;GAAW,OAAO;EAAwC;EAC3F;GAAC,MAAM;GAAa,aAAa;GAAS,OAAO;EAA2B;EAC5E;GAAC,MAAM;GAAe,aAAa;GAAS,OAAO;EAA4C;EAC/F;GAAC,MAAM;GAAe,aAAa;GAAW,OAAO;EAAwC;EAC7F;GAAC,MAAM;GAAe,aAAa;GAAS,OAAO;EAAkB;EACrE;GAAC,MAAM;GAAW,aAAa;GAAS,OAAO;EAAoC;EACnF;GAAC,MAAM;GAAW,aAAa;GAAW,OAAO;EAAgC;EACjF;GAAC,MAAM;GAAW,aAAa;GAAS,OAAO;EAAc;EAC7D;GAAC,MAAM;GAAW,aAAa;GAAS,OAAO;EAAoC;EACnF;GAAC,MAAM;GAAW,aAAa;GAAW,OAAO;EAAuC;EACxF;GAAC,MAAM;GAAW,aAAa;GAAS,OAAO;EAAqB;EACpE;GAAC,MAAM;GAAQ,aAAa;GAAS,OAAO;EAA8B;EAC1E;GAAC,MAAM;GAAQ,aAAa;GAAW,OAAO;EAA0B;EACxE;GAAC,MAAM;GAAQ,aAAa;GAAS,OAAO;EAAW;EAGvD;GAAC,MAAM;GAAM,UAAU;GAAO,OAAO;EAAiB;EACtD;GAAC,MAAM;GAAM,UAAU;GAAO,OAAO;EAAc;EACnD;GAAC,MAAM;GAAM,UAAU;GAAO,OAAO;EAAiB;EACtD;GAAC,MAAM;GAAM,UAAU;GAAM,OAAO;EAAgB;EACpD;GAAC,MAAM;GAAM,UAAU;GAAM,OAAO;EAAa;EACjD;GAAC,MAAM;GAAM,UAAU;GAAM,OAAO;EAAgB;CACtD;CACA,iBAAiB;EAAC,MAAM;EAAa,aAAa;EAAW,MAAM;EAAM,UAAU;EAAO,WAAW;EAAO,UAAU;CAAK;AAC7H,CAAC;;;AChED,SAAgBG,EAAsB,GAAkB,GAAyC;CAChG,IAAMC,IAAUC,EAA2B,IAAI,GACzCC,IAAcD,EAAO,EAAK,GAC1BE,IAAaF,EAAO,EAAK,GACzBG,IAAUH,EAAO,EAAK,GACtBI,IAAMC,GAAsC,MAAQ;EACzD,EAAQ,UAAUC;EAClB,IAAMC,UAAc;GAAC,EAAY,UAAU;EAAK,GAC1CC,UAAa;GAElB,AAAI,CAACN,EAAW,WAAW,CAACI,GAAM,QAAQ,WAAW,MAAG,EAAY,UAAU;EAC/E;EAEA,AADAA,GAAM,iBAAiB,SAASC,CAAK,GACrCD,GAAM,iBAAiB,QAAQE,CAAI;EACnC,IAAMC,IAAU,OAAOC,KAAiB,aAAcA,EAA0CJ,CAAI,IAAI,KAAA;EAExG,OADII,KAAgB,OAAOA,KAAiB,eAAY,EAAa,UAAUJ,UAClE;GAIZ,AAHAA,GAAM,oBAAoB,SAASC,CAAK,GACxCD,GAAM,oBAAoB,QAAQE,CAAI,GAClCT,EAAQ,YAAYO,MAAM,EAAQ,UAAU,OAC5C,OAAOG,KAAY,aAAYA,EAAQ,IAClC,OAAOC,KAAiB,aAAYA,EAAa,IAAI,IACrDA,MAAc,EAAa,UAAU;EAC/C;CACD,GAAG,CAACA,CAAY,CAAC;CAyCjB,OAvCAC,QAAsB;EACrB,IAAML,IAAOP,EAAQ,SACfa,IAAWV,EAAW;EAE5B,IADA,EAAW,UAAUW,GACjB,CAACP,GAAM;EACX,IAAMQ,IAAMR,EAAK;EAGjB,IAFI,CAACO,KAAW,CAACD,MAAU,EAAY,UAAUE,EAAI,kBAAkBR,IACnEO,KAAW,CAACD,MAAU,EAAQ,UAAUX,EAAY,WAAWa,EAAI,kBAAkBR,IACrF,CAACO,KAAWD,GAAU;GACzB,IAAMG,IAAWZ,EAAQ;GAEzB,AADA,EAAQ,UAAU,IACdY,KAAYT,EAAK,eAAe,CAACA,EAAK,QAAQ,gCAAgC,MAAMQ,EAAI,kBAAkBA,EAAI,QAAQA,EAAI,kBAAkBA,EAAI,oBAAkBR,EAAK,MAAM,EAAC,eAAc,GAAI,CAAC;EACtM;EACA,IAAI,CAACO,KAAW,CAACV,EAAQ,SAAS;EAClC,IAAMa,UAAwB;GAG7B,AAFAF,EAAI,oBAAoB,WAAWP,GAAO,EAAI,GAC9CO,EAAI,oBAAoB,eAAeG,GAAS,EAAI,GACpDH,EAAI,oBAAoB,WAAWI,GAAU,EAAI;EAClD,GACMC,UAAe;GAGpB,AAFA,EAAY,UAAU,IACtB,EAAQ,UAAU,IAClBH,EAAgB;EACjB,GACMT,KAAS,MAAsB;GAEpC,AAAIa,EAAM,WAAWd,KAAQc,EAAM,WAAWN,EAAI,QAAQM,EAAM,WAAWN,EAAI,mBAAiBK,EAAO;EACxG,GACMF,KAAW,MAAwB;GACxC,AAAKX,EAAK,SAASc,EAAM,MAAc,KAAGD,EAAO;EAClD,GACMD,KAAY,MAAyB;GAC1C,AAAIE,EAAM,QAAQ,SAAOD,EAAO;EACjC;EAIA,OAHAL,EAAI,iBAAiB,WAAWP,GAAO,EAAI,GAC3CO,EAAI,iBAAiB,eAAeG,GAAS,EAAI,GACjDH,EAAI,iBAAiB,WAAWI,GAAU,EAAI,GACvCF;CACR,CAAC,GACMZ;AACR;;;ACvCA,SAASiB,EAAgB,EAAC,SAAM,gBAAa,SAAM,cAAW,IAAO,eAAY,IAAO,cAAW,MAA2B;CAC5H,IAAMC,IAAWzD,EAAgB,GAC3B,EAAC,oBAAgBC,EAAiB,GAElCyD,IAAW;EAAC,MAAMC,KAAQF,EAAS;EAAa,aAAaG,MAAgBD,MAAS,KAAA,IAAYF,EAAS,qBAAqB;EAAU,MAAMvD,EAAsB2D,GAAMC,CAAY;EAAG;EAAU;EAAW;CAAQ;CAC9N,OAAO;EACL,GAAGJ;EACH,SAAS3B,EAAe2B,CAAQ;EAChC,YAAY;GAAC,aAAa;GAAU,aAAaA,EAAS;GAAM,cAAcA,EAAS;GAAa,aAAaA,EAAS;GAAM,kBAAkBK,KAAY,KAAA;GAAW,mBAAmBC,KAAa,KAAA;GAAW,iBAAiBC,KAAY,KAAA;EAAS;CAC5P;AACF;AAEA,SAASC,EAAQ,EAAC,MAAMC,GAAM,kBAAe,QAAQ,cAAW,IAAO,eAAuF;CAC5J,IAAMC,IAAQD,KAAQ,kBAACA,GAAD;EAAM,WAAU;EAAqB,eAAY;CAAQ,CAAA;CAG/E,OAAO,kBAAA3E,GAAA,EAAA,UAAA;EAAG6E,MAAiB,UAAUD;EADvBH,MAAa,OAAOrC,KAAa,YAAY,OAAOA,KAAa,YAAY,kBAAC,QAAD;GAAM,WAAU;GAAoB;EAAe,CAAA,IAAIA;EAC/FyC,MAAiB,WAAWD;CAAQ,EAAA,CAAA;AACzF;AAEA,IAAaE,IAAaC,EAAyC,SAAoB,EAAC,SAAM,gBAAa,SAAM,aAAU,cAAW,aAAU,SAAM,iBAAc,cAAW,aAAU,GAAGtD,KAAQ,GAAK;CACvM,IAAMuD,IAAehB,EAAgB;EAAC;EAAM;EAAa;EAAM;EAAU;EAAW;EAAU;CAAQ,CAAC,GACjGiB,IAAWxC,EAAsBhB,EAAM,iBAAiB,MAAQA,EAAM,iBAAiB,QAAQsB,CAAG;CACxG,OAAO,kBAAC9C,GAAD;EAAiB,GAAIwB;EAAO,GAAIuD,EAAa;EAAY,KAAKC;EAAU,YAAY,MAAUtE,EAAG,0BAA0BqE,EAAa,SAAS,OAAOtD,KAAc,aAAaA,EAAUwD,CAAK,IAAIxD,CAAS;EAAG,UAAA,kBAACgD,GAAD;GAAe;GAAoB;GAAwB;GAAW;EAAkB,CAAA;CAAkB,CAAA;AACrU,CAAC,GAGYS,IAAiBJ,EAAmD,SAAwB,EAAC,SAAM,gBAAa,SAAM,aAAU,cAAW,aAAU,SAAM,iBAAc,cAAW,aAAU,cAAW,IAAO,aAAU,YAAS,QAAK,WAAQ,GAAGtD,KAAQ,GAAK;CAC3Q,IAAMuD,IAAehB,EAAgB;EAAC;EAAM;EAAa;EAAM;EAAU;EAAW;EAAU;CAAQ,CAAC,GACjGoB,IAAY,IAAI,IAAIC,GAAK,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO,CAAC;CAE3D,OADIC,GAAQ,YAAY,MAAM,aAAgBF,EAAU,QAAMA,EAAU,IAAI,YAAY,GAAGA,EAAU,IAAI,UAAU,IAC5G,kBAAC,KAAD;EAAG,GAAI3D;EAAO,GAAIuD,EAAa;EAAiB;EAAa;EAAQ,KAAKI,EAAU,OAAO,CAAC,GAAGA,CAAS,CAAC,CAAC,KAAK,GAAG,IAAI,KAAA;EAAW,iBAAeG,KAAY9D,EAAM,oBAAoB,KAAA;EAAW,UAAU8D,IAAW,KAAKC;EAAU,WAAW7E,EAAG,0BAA0BqE,EAAa,SAAStD,CAAS;EAAG,UAAU,MAAU;GACxU,IAAI6D,GAAU;IAAyB,AAAxBxB,EAAM,eAAe,GAAGA,EAAM,gBAAgB;IAAG;GAAO;GACvE,IAAUA,CAAK;EACjB;EAAG,UAAA,kBAACW,GAAD;GAAe;GAAoB;GAAwB;GAAW;EAAkB,CAAA;CAAI,CAAA;AACjG,CAAC,GCjDYe,IAAoD;CAChE,SAAS;CACT,WAAW;AACZ;AAoBA,SAAgBC,EAAqB,EACpC,aAAU,IACV,mBACA,SAASC,KACsB;CAC/B,IAAMC,IAAUC,EAAWJ,GAA6BE,CAAW,GAC7D,CAACG,GAAWC,KAAgBC,EAASC,CAAO,GAC5C,GAAGC,KAAyBF,EAAS,EAAK;CA4BhD,OA1BAG,QAAgB;EACf,AAAIF,KACHF,EAAa,EAAI;CAEnB,GAAG,CAACE,CAAO,CAAC,GAEZE,QAAgB;EACf,AAAIC,KAAkBH,KACrBF,EAAa,EAAI;CAEnB,GAAG,CAACE,GAASG,CAAc,CAAC,GAE5BD,QAAgB;EACf,IAAIE;EAQJ,OAPI,CAACJ,KAAWH,MACfI,EAAsB,EAAI,GAC1B,IAAY,iBAAiB;GAE5B,AADAH,EAAa,EAAK,GAClBG,EAAsB,EAAK;EAC5B,GAAG,GAAG,UAEM;GACZ,AAAIG,KAAW,aAAaA,CAAS;EACtC;CACD,GAAG,CAACJ,GAASH,CAAS,CAAC,GAEhB;EAAE;EAAW;CAAQ;AAC7B;AAcA,SAAgBQ,EAAoB,EACnC,cACA,gBACA,MAAM3B,GACN,kBAAe,QACf,cAAW,IACX,MAAM4B,GACN,cAAW,IACX,eAC4B;CAC5B,IAAMrE,IAAU4D,IAAYU,IAAcpE,GACpCqE,IAAe,OAAOvE,KAAY,YAAY,OAAOA,KAAY,YAAY,OAAOA,KAAY;CAEtG,OACC,kBAAAhC,GAAA,EAAA,UAAA;EACE,CAAC,CAAC4F,KACF,kBAACY,GAAD;GACC,WAAW/F,EAAGR,EAAO,MAAMA,EAAO,OAAO;GACzC,eAAY;EACZ,CAAA;EAED,CAAC,CAACwE,KAAQE,MAAiB,UAAU,CAACiB,KACtC,kBAACnB,GAAD;GACC,WAAWxE,EAAO;GAClB,eAAY;EACZ,CAAA;EAED2F,KAAavB,IACb,kBAAC,QAAD;GAAM,WAAU;GAAW,UAAAiC;EAAkB,CAAA,IAC1CC,IACH,kBAAC3F,GAAD;GAAM,KAAI;GAAO,MAAK;GAAU,QAAO;GAAS,YAAW;GAAQ,WAAWH,EAAG,gBAAgB8D,KAAY,kBAAkB;GAC7H,UAAAvC;EACI,CAAA,IACHA;EACH,CAAC,CAACyC,KAAQE,MAAiB,WAAW,CAACiB,KACvC,kBAACnB,GAAD;GACC,WAAWxE,EAAO;GAClB,eAAY;EACZ,CAAA;CAED,EAAA,CAAA;AAEJ;AAEA,IAAMwG,IAAevG,EAAM,YAEzB,EACC,aAAU,IACV,mBACA,SAASuF,GACT,MAAMhB,GACN,kBAAe,QACf,aACA,aACA,cACA,GAAGlD,KAEJ,MACI;CACJ,IAAM,EAAE,cAAW,eAAYiE,EAAqB;EACnD;EACA;EACA,SAASC;CACV,CAAC;CAED,OACC,kBAACb,GAAD;EACC,GAAIrD;EACC;EACL,UAAU8D,KAAYO;EACtB,aAAWA,KAAa,KAAA;EACxB,WAAWnF,EAAG,4BAA4BmF,KAAa3F,EAAO,WAAWuB,CAAS;EAElF,UAAA,kBAAC4E,GAAD;GACY;GACX,aAAaV,EAAQ;GACrB,MAAMjB;GACQ;GACd,UAAUlD,EAAM;GAChB,MAAMA,EAAM;GACZ,UAAUA,EAAM;GAEf;EACmB,CAAA;CACV,CAAA;AAEd,CACD;AAEA,EAAa,cAAc;;;AClK3B,IAAMmF,IAAgBvG,EAAM,YAC1B,EAAE,gBAAa,aAAU,GAAGoB,KAAS,MAEpC,kBAACP,GAAD,EAAA,UAAA,CACC,kBAACF,GAAD,EACC,SAAS,MAAiB;CACzB,IAAM6F,IAAchF,EACnBJ,GACAqF,CACD;CACA,OACC,kBAAChC,GAAD;EACA,GAAI+B;EACJ,cAAYpF,EAAM,iBAAiBsF;EAC9B;EACL,WAAWpG,EAAG,6BAA6BkG,EAAY,SAAS;EAE/D;CACU,CAAA;AAEb,EACA,CAAA,GACD,kBAAC5F,GAAD,EAAA,UACC,kBAACH,GAAD;CAAM,KAAI;CAAO,MAAK;CAAU,WAAU;CAAgB,UAAAiG;AAAkB,CAAA,EAC7D,CAAA,CACR,EAAA,CAAA,CAGZ;AAEA,EAAc,cAAc;;;ACkC5B,SAASC,EAAe,EACvB,YACA,mBACA,cAC0B;CAC1B,OACCf,MAAY,MACZ,EAAQG,KACRR,MAAY,KAAA;AAEd;AAEA,IAAMqB,IAAoB3G,EAAM,YAE9B,EACC,YACA,mBACA,YACA,SACA,kBAAe,QACf,aACA,aACA,SACA,cACA,GAAGmB,KAEJ,MACI;CACJ,IAAMyF,IAASxB,EAAqB;EACnC;EACA;EACA;CACD,CAAC;CAED,OACC,kBAACP,GAAD;EACC,GAAI1D;EACC;EACC;EACN,UAAU8D,KAAY2B,EAAO;EAC7B,aAAWA,EAAO,aAAa,KAAA;EAC/B,WAAWvG,EAAG,4BAA4Be,CAAS;EAEnD,UAAA,kBAAC4E,GAAD;GACC,WAAWY,EAAO;GAClB,aAAaA,EAAO,QAAQ;GACtB;GACQ;GACd,UAAUzF,EAAM;GACV;GACN,UAAUA,EAAM;GAEf;EACmB,CAAA;CACN,CAAA;AAElB,CACD;AAEA,EAAkB,cAAc;AAEhC,IAAM0F,IAAa7G,EAAM,YACvB,EAAE,aAAa8G,GAAc,GAAG3F,KAAS,MAAQ;CACjD,IAAIuF,EAAevF,CAAK,GACvB,OAAO,kBAACwF,GAAD;EAAwB;EAAK,GAAIxF;CAAQ,CAAA;CAGjD,IAAM,EACL,SAAS4F,GACT,gBAAgBC,GAChB,SAASC,GACT,GAAGC,MACA/F;CACJ,OAAO,kBAAC0D,GAAD;EAAqB;EAAK,GAAIqC;CAAY,CAAA;AAClD,CACD;AAEA,EAAW,cAAc;AAEzB,SAASC,EACR,GAI+D;CAC/D,IAAM,EACL,MAAMC,GACN,MAAMC,GACN,YAAYC,GACZ,aAAaC,GACb,YAAYC,GACZ,gBAAgBC,GAChB,YAAYC,GACZ,MAAMC,GACN,OAAOC,GACP,cAAcC,GACd,uBAAuBC,GACvB,QAAQC,GACR,GAAGb,MACA/F;CAEJ,OAAO+F;AAIR;AAmIA,IAAMc,IAjIuBhI,EAAM,YAKjC,EACC,SACA,gBACA,YACA,mBACA,YACA,GAAGmB,KAEJ,MACI;CACJ,IAAI8G,MAAS,KAAA,GAAW;EACvB,IAAMf,IAAYC,EAAYhG,CAAK,GAC7B+G,IACL,kBAACrB,GAAD;GACC,GAAIK;GACC;GACC;GACG;GACO;GACP;GACT,cAAY/F,EAAM,iBAAiBsF;GACnC,WAAWpG,EAAG,qBAAqB6G,EAAU,SAAS;EACtD,CAAA;EAcF,OAXIT,IAEF,kBAAC7F,GAAD,EAAA,UAAA,CACC,kBAACF,GAAD,EAAgB,QAAQwH,EAAO,CAAA,GAC/B,kBAACvH,GAAD,EAAA,UACC,kBAACH,GAAD;GAAM,KAAI;GAAO,MAAK;GAAU,WAAU;GAAgB,UAAAiG;EAAkB,CAAA,EAC7D,CAAA,CACR,EAAA,CAAA,IAIJyB;CACR;CAEA,IAAM,EACL,UAAUC,GACV,UAAUC,GACV,OAAOC,GACP,MAAMC,GACN,gBAAgBC,GAChB,KAAKC,GACL,QAAQC,GACR,GAAGC,MACAvH,GACEwH,IAAc;EACnB,GAAGD;EACH,WAAWrI,EAAG,qBAAqBqI,EAAU,SAAS;CACvD;CAqDA,OAnDIhC,EAAe;EAAE;EAAS;EAAgB;CAAQ,CAAC,IAClDD,IAEF,kBAAC7F,GAAD,EAAA,UAAA,CACC,kBAACF,GAAD,EACC,SAAS,MACR,kBAAC2F,GAAD;EACC,GAAIsC;EACJ,GAAInC;EACC;EACI;EACO;EACP;EACT,cAAYkC,EAAU,iBAAiBjC;EACvC,WAAWpG,EACTmG,EAAwC,WACzCmC,EAAY,SACb;EAEC,UAAAD,EAAU;CACE,CAAA,EAEf,CAAA,GACD,kBAAC/H,GAAD,EAAA,UACC,kBAACH,GAAD;EAAM,KAAI;EAAO,MAAK;EAAU,WAAU;EAAgB,UAAAiG;CAAkB,CAAA,EAC7D,CAAA,CACR,EAAA,CAAA,IAKV,kBAACJ,GAAD;EACC,GAAIsC;EACC;EACI;EACO;EACP;CACT,CAAA,IAIClC,IAEF,kBAACH,GAAD;EACC,GAAIqC;EACC;EACQ;CACb,CAAA,IAKF,kBAACnE,GAAD;EACC,GAAImE;EACC;CACL,CAAA;AAEH,CAac;AACf,EAAO,cAAc;;;AC3SrB,IAAMC,KAA8C;CACnD,IAAI;CACJ,IAAI;CACJ,IAAI;AACL,GAQaC,IAAa5I,EAAM,YAC9B,EAAE,cAAW,UAAO,UAAU,SAAM,aAAU,GAAGkB,KAAS,MAAQ;CAClE,IAAM,EAAE,oBAAiBhB,EAAiB,GACpC2I,IAAe1I,EAAsB2D,GAAMC,CAAY;CAC7D,OACC,kBAACQ,GAAD;EACM;EACC;EACN,MAAK;EACL,aAAY;EACZ,MAAMsE;EACI;EACV,WAAWzI,EAAG,0BAOb,kDACA,2IAEA,wDAAwDI,EAAa,QACrE,oDACAmI,GAAYE,IACZ1H,CACD;EACA,GAAID;CACJ,CAAA;AAEH,CACD;AAEA,EAAW,cAAc"}
@@ -1,68 +0,0 @@
1
- "use client";
2
- import { i as e } from "./ui-provider-CQCuCBcy.js";
3
- import { t } from "./utils-CF3c95Io.js";
4
- import { n } from "./buttons-BbfzgczK.js";
5
- import { t as r } from "./structure-C0V0_Fyf.js";
6
- import { a as i, c as a, d as o, f as s, l as c, u as l } from "./smart-card-CqkzQsK-.js";
7
- import { t as u } from "./action-menu-CHgs8vmj.js";
8
- import { t as d } from "./separator-GNfPG-90.js";
9
- import { forwardRef as f } from "react";
10
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
11
- //#region src/components/base/cards/partials/smart-card-skeleton.tsx
12
- function h({ title: n, lines: u = 2, surface: d, className: f }) {
13
- let { defaultSurface: h } = e(), g = d ?? h ?? "card", _ = ({ barClassName: e }) => /* @__PURE__ */ p("div", { className: t("animate-pulse rounded-radius-xs bg-muted", e) });
14
- return /* @__PURE__ */ m(c, {
15
- "data-surface": g,
16
- className: t("smart-card-skeleton--component", s[g], "py-surface", f),
17
- children: [/* @__PURE__ */ p(a, {
18
- className: "flex-col gap-normal px-surface pb-0",
19
- children: o(n) ? /* @__PURE__ */ p(l, { children: n }) : /* @__PURE__ */ p(_, { barClassName: "h-4 w-32" })
20
- }), /* @__PURE__ */ p(i, {
21
- className: "px-surface py-0",
22
- children: /* @__PURE__ */ p(r, {
23
- gap: "lg",
24
- children: Array.from({ length: u }, (e, n) => /* @__PURE__ */ p(_, { barClassName: t("h-4", n === 0 ? "w-full" : "w-3/4") }, `skel-${String(n)}`))
25
- })
26
- })]
27
- });
28
- }
29
- h.displayName = "SmartCardSkeleton";
30
- //#endregion
31
- //#region src/components/base/cards/card-actions.tsx
32
- var g = f(function({ children: e, icon: r, hidden: i = !1, fullWidth: a = !0, className: o, ...s }, c) {
33
- return i ? null : /* @__PURE__ */ p(n, {
34
- ref: c,
35
- type: "button",
36
- tone: "primary",
37
- fullWidth: a,
38
- icon: r,
39
- className: t("card-primary-action--component", o),
40
- ...s,
41
- children: e
42
- });
43
- });
44
- function _({ actions: e, separator: n = !1, align: r = "start", compact: i = !1, fullWidthPrimary: a = !1, className: o, buttonClassName: s, renderLink: c }) {
45
- let l = e.filter((e) => e.visible !== !1);
46
- if (l.length === 0) return null;
47
- let f = {
48
- start: "justify-start",
49
- end: "justify-end",
50
- between: "justify-between",
51
- stretch: "justify-stretch"
52
- }[r];
53
- return /* @__PURE__ */ m("div", {
54
- className: t("card-action-strip--component", o),
55
- children: [!!n && /* @__PURE__ */ p(d, { className: t(i ? "mb-space-sm" : "mb-space-md") }), /* @__PURE__ */ p(u, {
56
- actions: l,
57
- size: i ? "sm" : "md",
58
- className: t("flex-wrap", f, r === "stretch" && "[&>.base-button--component]:flex-1", a && "[&>.base-button--component:first-child]:flex-1"),
59
- buttonClassName: t(i ? "min-w-0" : "min-w-24", s),
60
- renderLink: c
61
- })]
62
- });
63
- }
64
- g.displayName = "CardPrimaryAction", _.displayName = "CardActionStrip";
65
- //#endregion
66
- export { g as n, h as r, _ as t };
67
-
68
- //# sourceMappingURL=cards-4JTWqvVe.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cards-4JTWqvVe.js","names":["useCardConfig","Stack","CardContent","CardHeader","hasRenderableContent","SURFACE_CLASSES","CardShell","CardTitle","ActionButtons","Separator","SmartCardSkeleton","resolvedSurface","surface","defaultSurface","SkeletonBar","cn","barClassName","className","title","lines","i","CardPrimaryAction","forwardRef","props","hidden","Button","CardActionStrip","visible","actions","action","alignClassName","align","separator","compact","fullWidthPrimary","buttonClassName"],"sources":["../src/components/base/cards/partials/smart-card-skeleton.tsx","../src/components/base/cards/card-actions.tsx"],"sourcesContent":["/**\n * SmartCardSkeleton — placeholder shell rendered while a SmartCard's\n * data is loading. Picks up the canonical card surface so the loading\n * state visually matches the eventual `SmartCard` it'll replace.\n */\nimport { Stack } from '../../structure';\nimport { cn } from '../../../../lib/utils';\nimport { useCardConfig } from '../../../../lib/ui-provider';\n\nimport { SURFACE_CLASSES } from '../smart-card.tokens';\n\nimport { CardContent, CardHeader, CardShell, CardTitle } from './card-primitives';\nimport { hasRenderableContent } from './has-renderable-content';\nimport type { SmartCardSkeletonProps } from '../smart-card.types';\nexport type { SmartCardSkeletonProps } from '../smart-card.types';\n\nexport function SmartCardSkeleton({ title, lines = 2, surface, className }: SmartCardSkeletonProps) {\n\tconst { defaultSurface } = useCardConfig();\n\tconst resolvedSurface = surface ?? defaultSurface ?? 'card';\n\tconst SkeletonBar = ({ barClassName }: { barClassName?: string }) => (\n\t\t<div className={cn('animate-pulse rounded-radius-xs bg-muted', barClassName)} />\n\t);\n\n\treturn (\n\t\t<CardShell\n\t\t\tdata-surface={resolvedSurface}\n\t\t\tclassName={cn('smart-card-skeleton--component', SURFACE_CLASSES[resolvedSurface], 'py-surface', className)}\n\t\t>\n\t\t\t<CardHeader className=\"flex-col gap-normal px-surface pb-0\">\n\t\t\t\t{hasRenderableContent(title) ? <CardTitle>{title}</CardTitle> : <SkeletonBar barClassName=\"h-4 w-32\" />}\n\t\t\t</CardHeader>\n\t\t\t<CardContent className=\"px-surface py-0\">\n\t\t\t\t<Stack gap=\"lg\">\n\t\t\t\t\t{Array.from({ length: lines }, (_, i) => (\n\t\t\t\t\t\t<SkeletonBar key={`skel-${String(i)}`} barClassName={cn('h-4', i === 0 ? 'w-full' : 'w-3/4')} />\n\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\t\t\t</CardContent>\n\t\t</CardShell>\n\t);\n}\n\nSmartCardSkeleton.displayName = 'SmartCardSkeleton';\n","/**\n * Card action recipes — package-owned chrome for body/footer card actions.\n *\n * Use these instead of hand-rolled footer button rows in resource cards.\n */\nimport { forwardRef, type ComponentProps, type ReactElement, type ReactNode } from 'react';\nimport type { LucideIcon } from 'lucide-react';\n\nimport { Button } from '../buttons';\nimport {\n\tActionButtons,\n\ttype ActionMenuAction,\n\ttype ActionMenuLinkRenderProps,\n} from '../action-menu';\nimport { Separator } from '../display/separator';\nimport { cn } from '../../../lib/utils';\n\nexport interface CardPrimaryActionProps\n\textends Omit<ComponentProps<typeof Button>, 'variant' | 'fullWidth' | 'children'> {\n\tchildren: ReactNode;\n\ticon?: LucideIcon;\n\t/** Renders the action as an anchor to this destination. */\n\thref?: string;\n\t/** Omits the action without changing the others' order. */\n\thidden?: boolean;\n\t/** Stretches the action to the row's width. */\n\tfullWidth?: boolean;\n}\n\nexport const CardPrimaryAction = forwardRef<HTMLButtonElement, CardPrimaryActionProps>(function CardPrimaryAction({\n\tchildren,\n\ticon,\n\thidden = false,\n\tfullWidth = true,\n\tclassName,\n\t...props\n}: CardPrimaryActionProps, ref) {\n\tif (hidden) return null;\n\n\treturn (\n\t\t<Button\n\t\t\tref={ref}\n\t\t\ttype=\"button\"\n\t\t\ttone=\"primary\"\n\t\t\tfullWidth={fullWidth}\n\t\t\ticon={icon}\n\t\t\tclassName={cn('card-primary-action--component', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</Button>\n\t);\n});\n\nexport interface CardActionStripProps {\n\t/** Actions to render, in order. */\n\tactions: readonly ActionMenuAction[];\n\t/** Draws a rule above the action row. */\n\tseparator?: boolean;\n\t/** Horizontal alignment of the action row. */\n\talign?: 'start' | 'end' | 'between' | 'stretch';\n\t/** Tightens the row for dense cards. */\n\tcompact?: boolean;\n\t/** Stretches only the primary action. */\n\tfullWidthPrimary?: boolean;\n\tclassName?: string;\n\t/** Merged onto every button in the row. */\n\tbuttonClassName?: string;\n\t/** Renders actions carrying an `href` through the consumer's router. */\n\trenderLink?: (props: ActionMenuLinkRenderProps) => ReactElement;\n}\n\nexport function CardActionStrip({\n\tactions,\n\tseparator = false,\n\talign = 'start',\n\tcompact = false,\n\tfullWidthPrimary = false,\n\tclassName,\n\tbuttonClassName,\n\trenderLink,\n}: CardActionStripProps) {\n\tconst visible = actions.filter((action) => action.visible !== false);\n\tif (visible.length === 0) return null;\n\n\tconst alignClassName = {\n\t\tstart: 'justify-start',\n\t\tend: 'justify-end',\n\t\tbetween: 'justify-between',\n\t\tstretch: 'justify-stretch',\n\t}[align];\n\n\treturn (\n\t\t<div className={cn('card-action-strip--component', className)}>\n\t\t\t{!!separator && <Separator className={cn(compact ? 'mb-space-sm' : 'mb-space-md')} />}\n\t\t\t<ActionButtons\n\t\t\t\tactions={visible}\n\t\t\t\tsize={compact ? 'sm' : 'md'}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'flex-wrap',\n\t\t\t\t\talignClassName,\n\t\t\t\t\talign === 'stretch' && '[&>.base-button--component]:flex-1',\n\t\t\t\t\tfullWidthPrimary && '[&>.base-button--component:first-child]:flex-1',\n\t\t\t\t)}\n\t\t\t\tbuttonClassName={cn(\n\t\t\t\t\tcompact ? 'min-w-0' : 'min-w-24',\n\t\t\t\t\tbuttonClassName,\n\t\t\t\t)}\n\t\t\t\trenderLink={renderLink}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nCardPrimaryAction.displayName = 'CardPrimaryAction';\nCardActionStrip.displayName = 'CardActionStrip';\n"],"mappings":";;;;;;;;;;;AAgBA,SAAgBU,EAAkB,EAAE,UAAO,WAAQ,GAAG,YAAS,gBAAqC;CACnG,IAAM,EAAE,sBAAmBV,EAAc,GACnCW,IAAkBC,KAAWC,KAAkB,QAC/CC,KAAe,EAAE,sBACtB,kBAAC,OAAD,EAAK,WAAWC,EAAG,4CAA4CC,CAAY,EAAI,CAAA;CAGhF,OACC,kBAACV,GAAD;EACC,gBAAcK;EACd,WAAWI,EAAG,kCAAkCV,EAAgBM,IAAkB,cAAcM,CAAS;EAF1G,UAAA,CAIC,kBAACd,GAAD;GAAY,WAAU;GACpB,UAAAC,EAAqBc,CAAK,IAAI,kBAACX,GAAD,EAAA,UAAYW,EAAiB,CAAA,IAAI,kBAACJ,GAAD,EAAa,cAAa,WAAY,CAAA;EAC3F,CAAA,GACZ,kBAACZ,GAAD;GAAa,WAAU;GACtB,UAAA,kBAACD,GAAD;IAAO,KAAI;IACT,UAAA,MAAM,KAAK,EAAE,QAAQkB,EAAM,IAAI,GAAG,MAClC,kBAACL,GAAD,EAAuC,cAAcC,EAAG,OAAOK,MAAM,IAAI,WAAW,OAAO,EAAI,GAA7E,QAAQ,OAAOA,CAAC,GAA6D,CAC/F;GACK,CAAA;EACK,CAAA,CACH;;AAEb;AAEA,EAAkB,cAAc;;;ACbhC,IAAaC,IAAoBC,EAAsD,SAA2B,EACjH,aACA,SACA,YAAS,IACT,eAAY,IACZ,cACA,GAAGC,KACuB,GAAK;CAG/B,OAFIC,IAAe,OAGlB,kBAACC,GAAD;EACM;EACL,MAAK;EACL,MAAK;EACM;EACL;EACN,WAAWV,EAAG,kCAAkCE,CAAS;EACzD,GAAIM;EAEH;CACM,CAAA;AAEV,CAAC;AAoBD,SAAgBG,EAAgB,EAC/B,YACA,eAAY,IACZ,WAAQ,SACR,aAAU,IACV,sBAAmB,IACnB,cACA,oBACA,iBACwB;CACxB,IAAMC,IAAUC,EAAQ,QAAQ,MAAWC,EAAO,YAAY,EAAK;CACnE,IAAIF,EAAQ,WAAW,GAAG,OAAO;CAEjC,IAAMG,IAAiB;EACtB,OAAO;EACP,KAAK;EACL,SAAS;EACT,SAAS;CACV,EAAEC;CAEF,OACC,kBAAC,OAAD;EAAK,WAAWhB,EAAG,gCAAgCE,CAAS;EAA5D,UAAA,CACE,CAAC,CAACe,KAAa,kBAACvB,GAAD,EAAW,WAAWM,EAAGkB,IAAU,gBAAgB,aAAa,EAAI,CAAA,GACpF,kBAACzB,GAAD;GACC,SAASmB;GACT,MAAMM,IAAU,OAAO;GACvB,WAAWlB,EACV,aACAe,GACAC,MAAU,aAAa,sCACvBG,KAAoB,gDACrB;GACA,iBAAiBnB,EAChBkB,IAAU,YAAY,YACtBE,CACD;GACY;EACZ,CAAA,CACG;;AAEP;AAEA,EAAkB,cAAc,qBAChC,EAAgB,cAAc"}