themelia-react-ui 2.0.1 → 2.0.3

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 (490) hide show
  1. package/CHANGELOG.md +317 -131
  2. package/README.md +25 -9
  3. package/THIRD_PARTY_NOTICES.md +7 -0
  4. package/dist/{accordion-B6a3vVgA.js → accordion-Cjb6sx0G.js} +14 -13
  5. package/dist/accordion-Cjb6sx0G.js.map +1 -0
  6. package/dist/action-menu-CllU52Mm.js +280 -0
  7. package/dist/action-menu-CllU52Mm.js.map +1 -0
  8. package/dist/affordance-geometry.generated-tF36bREk.js +140 -0
  9. package/dist/affordance-geometry.generated-tF36bREk.js.map +1 -0
  10. package/dist/ai-artifact-DvTwDVyL.js +1148 -0
  11. package/dist/ai-artifact-DvTwDVyL.js.map +1 -0
  12. package/dist/{app-shell-ZK5RWdo6.js → app-shell-C4FhvCqF.js} +5 -5
  13. package/dist/{app-shell-ZK5RWdo6.js.map → app-shell-C4FhvCqF.js.map} +1 -1
  14. package/dist/attachment-BxDfL2mw.js +246 -0
  15. package/dist/attachment-BxDfL2mw.js.map +1 -0
  16. package/dist/{auth-CYxKfo69.js → auth-BGua8ouh.js} +58 -54
  17. package/dist/auth-BGua8ouh.js.map +1 -0
  18. package/dist/{avatar-BBnEJIx8.js → avatar-DAPlDvhJ.js} +7 -7
  19. package/dist/avatar-DAPlDvhJ.js.map +1 -0
  20. package/dist/{badge-MrKVNzW9.js → badge-HpFqoqSY.js} +40 -40
  21. package/dist/badge-HpFqoqSY.js.map +1 -0
  22. package/dist/base/accordion.js +1 -1
  23. package/dist/base/action-menu.js +1 -1
  24. package/dist/base/attachment.js +1 -1
  25. package/dist/base/avatar.js +1 -1
  26. package/dist/base/badge.js +1 -1
  27. package/dist/base/batch-action-bar.js +1 -1
  28. package/dist/base/buttons.js +1 -1
  29. package/dist/base/cards.js +2 -2
  30. package/dist/base/carousel.js +40 -36
  31. package/dist/base/carousel.js.map +1 -1
  32. package/dist/base/cascader.js +92 -92
  33. package/dist/base/cascader.js.map +1 -1
  34. package/dist/base/chart.js +1 -1
  35. package/dist/base/choice-inputs.js +2 -2
  36. package/dist/base/code-block.js +1 -1
  37. package/dist/base/combobox.js +2 -2
  38. package/dist/base/command.js +1 -1
  39. package/dist/base/copyable.js +1 -1
  40. package/dist/base/date-pickers.js +2 -2
  41. package/dist/base/display.js +6 -6
  42. package/dist/base/feedback.js +3 -3
  43. package/dist/base/forms-numeric.js +1 -1
  44. package/dist/base/forms.js +2 -2
  45. package/dist/base/inline-edit.js +14 -14
  46. package/dist/base/inline-edit.js.map +1 -1
  47. package/dist/base/item.js +1 -1
  48. package/dist/base/media-gallery.js +1 -1
  49. package/dist/base/metadata-list.js +1 -1
  50. package/dist/base/navigation.js +6 -6
  51. package/dist/base/popover-menu.js +1 -1
  52. package/dist/base/popover.js +1 -1
  53. package/dist/base/qr-code.js +1 -1
  54. package/dist/base/repeaters.js +171 -176
  55. package/dist/base/repeaters.js.map +1 -1
  56. package/dist/base/sheet.js +1 -1
  57. package/dist/base/sidebar.js +1 -1
  58. package/dist/base/signature-pad.js +6 -6
  59. package/dist/base/skeleton.js +1 -1
  60. package/dist/base/spinner.js +79 -2
  61. package/dist/base/spinner.js.map +1 -0
  62. package/dist/base/structure.js +1 -1
  63. package/dist/base/table.js +1 -1
  64. package/dist/base/text-inputs.js +2 -2
  65. package/dist/base/toaster.js +46 -45
  66. package/dist/base/toaster.js.map +1 -1
  67. package/dist/base/tree.js +1 -1
  68. package/dist/base/upload-queue.js +1 -1
  69. package/dist/base/upload.js +3 -3
  70. package/dist/base/value-inputs.js +1 -1
  71. package/dist/{batch-action-bar-BZGDG-Si.js → batch-action-bar-DnUJ21NQ.js} +6 -5
  72. package/dist/batch-action-bar-DnUJ21NQ.js.map +1 -0
  73. package/dist/blocks/admin.js +42 -42
  74. package/dist/blocks/admin.js.map +1 -1
  75. package/dist/blocks/ai.js +260 -240
  76. package/dist/blocks/ai.js.map +1 -1
  77. package/dist/blocks/analytics/usage-card.js +1 -1
  78. package/dist/blocks/analytics.js +620 -585
  79. package/dist/blocks/analytics.js.map +1 -1
  80. package/dist/blocks/collaboration.js +1 -1
  81. package/dist/blocks/commerce/receipt.js +1 -1
  82. package/dist/blocks/commerce.js +1152 -1109
  83. package/dist/blocks/commerce.js.map +1 -1
  84. package/dist/blocks/data-display.js +2 -2
  85. package/dist/blocks/onboarding.js +48 -39
  86. package/dist/blocks/onboarding.js.map +1 -1
  87. package/dist/blocks/planning.js +13 -12
  88. package/dist/blocks/planning.js.map +1 -1
  89. package/dist/blocks/timelines.js +1 -1
  90. package/dist/{breadcrumbs-D5t7I023.js → breadcrumbs-C-oqs1sQ.js} +5 -5
  91. package/dist/breadcrumbs-C-oqs1sQ.js.map +1 -0
  92. package/dist/{button-QYwiyhD2.js → button-DVzspB_G.js} +2 -2
  93. package/dist/{button-QYwiyhD2.js.map → button-DVzspB_G.js.map} +1 -1
  94. package/dist/{buttons-SbIcm1HJ.js → buttons-DPZekJFu.js} +20 -15
  95. package/dist/buttons-DPZekJFu.js.map +1 -0
  96. package/dist/cards-BaBZR-AU.js +68 -0
  97. package/dist/cards-BaBZR-AU.js.map +1 -0
  98. package/dist/{chart-QfrARkXl.js → chart-ZOYyK2xG.js} +58 -55
  99. package/dist/chart-ZOYyK2xG.js.map +1 -0
  100. package/dist/{checkbox-DhB6K0bK.js → checkbox-AWIhNhmo.js} +2 -2
  101. package/dist/{checkbox-DhB6K0bK.js.map → checkbox-AWIhNhmo.js.map} +1 -1
  102. package/dist/{choice-inputs-t6w3ATNz.js → choice-inputs-CNHvARCJ.js} +49 -45
  103. package/dist/choice-inputs-CNHvARCJ.js.map +1 -0
  104. package/dist/{code-block-Dgbu-CU3.js → code-block-DeneBJR_.js} +8 -8
  105. package/dist/code-block-DeneBJR_.js.map +1 -0
  106. package/dist/{collapsible-D8AEGU1-.js → collapsible-C-_l4hpy.js} +3 -3
  107. package/dist/{collapsible-D8AEGU1-.js.map → collapsible-C-_l4hpy.js.map} +1 -1
  108. package/dist/{collection-content-uK16Grv0.js → collection-content-By56pLog.js} +3 -3
  109. package/dist/{collection-content-uK16Grv0.js.map → collection-content-By56pLog.js.map} +1 -1
  110. package/dist/combobox-DaHESuiL.js +355 -0
  111. package/dist/combobox-DaHESuiL.js.map +1 -0
  112. package/dist/{combobox-DLl0bfiq.js → combobox-Dxo2fAYQ.js} +289 -279
  113. package/dist/combobox-Dxo2fAYQ.js.map +1 -0
  114. package/dist/{command-kNR20o7x.js → command-C25VMRII.js} +7 -7
  115. package/dist/{command-kNR20o7x.js.map → command-C25VMRII.js.map} +1 -1
  116. package/dist/{comments-BpDuCUUu.js → comments-DD0DUPwJ.js} +114 -105
  117. package/dist/comments-DD0DUPwJ.js.map +1 -0
  118. package/dist/components/base/badge/badge.recipes.d.ts +1 -1
  119. package/dist/components/base/buttons/loader-button.d.ts +2 -1
  120. package/dist/components/base/cards/card.recipes.d.ts +2 -3
  121. package/dist/components/base/cards/partials/smart-card-skeleton.d.ts +3 -13
  122. package/dist/components/base/cards/smart-card.types.d.ts +11 -4
  123. package/dist/components/base/chart/chart.d.ts +2 -5
  124. package/dist/components/base/combobox/combobox-field.d.ts +16 -0
  125. package/dist/components/base/combobox/combobox.strings.d.ts +7 -0
  126. package/dist/components/base/combobox/index.d.ts +30 -4
  127. package/dist/components/base/forms/form-sizing.d.ts +11 -3
  128. package/dist/components/base/navigation/pagination.d.ts +5 -2
  129. package/dist/components/base/popover/popover.recipes.d.ts +15 -1
  130. package/dist/components/base/table/index.d.ts +9 -2
  131. package/dist/components/base/text-inputs/input-group.d.ts +2 -2
  132. package/dist/components/blocks/ai/ai-shimmer/ai-shimmer.d.ts +1 -1
  133. package/dist/components/blocks/ai/ai-shimmer/types.d.ts +3 -0
  134. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +3 -1
  135. package/dist/components/blocks/data-display/inline-stat/inline-stat.d.ts +16 -8
  136. package/dist/components/features/activities/partials/activity-marker.d.ts +6 -3
  137. package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +5 -0
  138. package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +220 -0
  139. package/dist/components/features/appointment-calendar/appointment-calendar.utils.d.ts +41 -0
  140. package/dist/components/features/appointment-calendar/index.d.ts +3 -0
  141. package/dist/components/features/appointment-calendar/partials/appointment-agenda.d.ts +32 -0
  142. package/dist/components/features/appointment-calendar/partials/appointment-month.d.ts +13 -0
  143. package/dist/components/features/combobox/combobox.strings.d.ts +15 -1
  144. package/dist/components/features/combobox/types.d.ts +4 -0
  145. package/dist/components/features/media-library/media-library.strings.d.ts +2 -0
  146. package/dist/components/features/rich-text-editor/index.d.ts +1 -1
  147. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +6 -0
  148. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +9 -1
  149. package/dist/components/features/table/table-header.d.ts +1 -1
  150. package/dist/components/features/table/table.strings.d.ts +55 -1
  151. package/dist/components/features/table/table.types.d.ts +17 -4
  152. package/dist/components/features/theme-tweaker/theme-tweaker.types.d.ts +5 -0
  153. package/dist/components/primitives/number.d.ts +4 -2
  154. package/dist/components/primitives/value.d.ts +3 -1
  155. package/dist/components/typography/text-link.d.ts +4 -0
  156. package/dist/components/ui/combobox-dismiss.d.ts +16 -0
  157. package/dist/components/ui/combobox.d.ts +16 -7
  158. package/dist/components/ui/dialog.d.ts +1 -1
  159. package/dist/components/ui/item.d.ts +8 -8
  160. package/dist/components/ui/popover.d.ts +1 -1
  161. package/dist/components/ui/sheet.d.ts +1 -1
  162. package/dist/components/ui/tabs.d.ts +1 -1
  163. package/dist/{containers-DmWiJa2I.js → containers-Mu1LMGV1.js} +2 -2
  164. package/dist/{containers-DmWiJa2I.js.map → containers-Mu1LMGV1.js.map} +1 -1
  165. package/dist/{copyable-B3Gwgdqc.js → copyable-ClBuk_UK.js} +4 -4
  166. package/dist/{copyable-B3Gwgdqc.js.map → copyable-ClBuk_UK.js.map} +1 -1
  167. package/dist/{data-display-DafIvCl5.js → data-display-DT_khPl_.js} +98 -87
  168. package/dist/data-display-DT_khPl_.js.map +1 -0
  169. package/dist/{date-BgK3bTdo.js → date-DCrsDTZc.js} +5 -5
  170. package/dist/{date-BgK3bTdo.js.map → date-DCrsDTZc.js.map} +1 -1
  171. package/dist/{date-picker-CF-DtUpF.js → date-picker-B2K3ucWn.js} +594 -593
  172. package/dist/date-picker-B2K3ucWn.js.map +1 -0
  173. package/dist/date-pickers-Ds8gLaoP.js +175 -0
  174. package/dist/date-pickers-Ds8gLaoP.js.map +1 -0
  175. package/dist/{display-DsQTVzMz.js → display-hAc1HjpI.js} +49 -49
  176. package/dist/display-hAc1HjpI.js.map +1 -0
  177. package/dist/dropdown-menu-Cl4X7L5S.js +193 -0
  178. package/dist/dropdown-menu-Cl4X7L5S.js.map +1 -0
  179. package/dist/editable-text-recipe-Cn61kEcv.js +10 -0
  180. package/dist/editable-text-recipe-Cn61kEcv.js.map +1 -0
  181. package/dist/features/activities.js +398 -375
  182. package/dist/features/activities.js.map +1 -1
  183. package/dist/features/ai-chat.js +188 -179
  184. package/dist/features/ai-chat.js.map +1 -1
  185. package/dist/features/appointment-calendar.js +683 -0
  186. package/dist/features/appointment-calendar.js.map +1 -0
  187. package/dist/features/async-preview.js +109 -107
  188. package/dist/features/async-preview.js.map +1 -1
  189. package/dist/features/combobox.js +1 -1
  190. package/dist/features/comments.js +1 -1
  191. package/dist/features/data-view.js +137 -137
  192. package/dist/features/data-view.js.map +1 -1
  193. package/dist/features/email-composer.js +255 -255
  194. package/dist/features/email-composer.js.map +1 -1
  195. package/dist/features/event-calendar.js +254 -248
  196. package/dist/features/event-calendar.js.map +1 -1
  197. package/dist/features/filters.js +1 -1
  198. package/dist/features/global-search.js +35 -32
  199. package/dist/features/global-search.js.map +1 -1
  200. package/dist/features/kanban.js +118 -117
  201. package/dist/features/kanban.js.map +1 -1
  202. package/dist/features/map.js +233 -231
  203. package/dist/features/map.js.map +1 -1
  204. package/dist/features/media-library.js +789 -775
  205. package/dist/features/media-library.js.map +1 -1
  206. package/dist/features/mentions.js +1 -1
  207. package/dist/features/overlays.js +1 -1
  208. package/dist/features/products.js +922 -902
  209. package/dist/features/products.js.map +1 -1
  210. package/dist/features/questionnaire.js +28 -24
  211. package/dist/features/questionnaire.js.map +1 -1
  212. package/dist/features/resource-assignment.js +18 -15
  213. package/dist/features/resource-assignment.js.map +1 -1
  214. package/dist/features/resource.js +12 -12
  215. package/dist/features/resource.js.map +1 -1
  216. package/dist/features/rich-text-editor.js +2 -2
  217. package/dist/features/schema-form.js +15 -13
  218. package/dist/features/schema-form.js.map +1 -1
  219. package/dist/features/suggestions.js +3 -3
  220. package/dist/features/sync.js +11 -5
  221. package/dist/features/sync.js.map +1 -1
  222. package/dist/features/table.js +1 -1
  223. package/dist/features/theme-tweaker.js +493 -489
  224. package/dist/features/theme-tweaker.js.map +1 -1
  225. package/dist/feedback-BYIhtitP.js +239 -0
  226. package/dist/feedback-BYIhtitP.js.map +1 -0
  227. package/dist/{field-affordance-recipes-qQeIf4lG.js → field-affordance-recipes-DZhnIL_Y.js} +11 -18
  228. package/dist/field-affordance-recipes-DZhnIL_Y.js.map +1 -0
  229. package/dist/{filters-BkHH53uv.js → filters-DJVAveHA.js} +589 -580
  230. package/dist/filters-DJVAveHA.js.map +1 -0
  231. package/dist/{form-field-DUt4UxSV.js → form-field-CwH9y77i.js} +6 -5
  232. package/dist/form-field-CwH9y77i.js.map +1 -0
  233. package/dist/{form-sizing-By94KzXE.js → form-sizing-BdP_Mf5p.js} +39 -44
  234. package/dist/form-sizing-BdP_Mf5p.js.map +1 -0
  235. package/dist/{forms-Bzha-Y3B.js → forms-B9G_xwzi.js} +8 -8
  236. package/dist/{forms-Bzha-Y3B.js.map → forms-B9G_xwzi.js.map} +1 -1
  237. package/dist/{forms-numeric-C0bvjRPZ.js → forms-numeric-B_jraJaQ.js} +309 -309
  238. package/dist/forms-numeric-B_jraJaQ.js.map +1 -0
  239. package/dist/{header-BOefOKd1.js → header-BSfIEWbI.js} +160 -153
  240. package/dist/header-BSfIEWbI.js.map +1 -0
  241. package/dist/{hooks-9k_TtmKh.js → hooks-ClH9thn4.js} +2 -2
  242. package/dist/{hooks-9k_TtmKh.js.map → hooks-ClH9thn4.js.map} +1 -1
  243. package/dist/{icon-badge-CAuKupo9.js → icon-badge-DYKIwvOV.js} +4 -4
  244. package/dist/{icon-badge-CAuKupo9.js.map → icon-badge-DYKIwvOV.js.map} +1 -1
  245. package/dist/index.js +3 -3
  246. package/dist/input-CZw8iU99.js +21 -0
  247. package/dist/input-CZw8iU99.js.map +1 -0
  248. package/dist/input-DQdEd0YD.js +263 -0
  249. package/dist/input-DQdEd0YD.js.map +1 -0
  250. package/dist/{interaction-recipes-CHr0dJUs.js → interaction-recipes-XR9ZpVYL.js} +2 -1
  251. package/dist/interaction-recipes-XR9ZpVYL.js.map +1 -0
  252. package/dist/item-K5_ghvze.js +275 -0
  253. package/dist/item-K5_ghvze.js.map +1 -0
  254. package/dist/layout/app-shell.js +1 -1
  255. package/dist/layout/auth.js +1 -1
  256. package/dist/layout/containers.js +1 -1
  257. package/dist/layout/header.js +1 -1
  258. package/dist/layout/hooks.js +1 -1
  259. package/dist/layout/navigation.js +1 -1
  260. package/dist/layout/page.js +1 -1
  261. package/dist/layout/settings.js +1 -1
  262. package/dist/layout/sidebar.js +2 -2
  263. package/dist/layout/workspace.js +1 -1
  264. package/dist/layout.js +10 -10
  265. package/dist/lib/affordance-geometry.generated.d.ts +71 -0
  266. package/dist/lib/editable-text-recipe.d.ts +4 -4
  267. package/dist/lib/field-affordance-recipes.d.ts +2 -2
  268. package/dist/lib/interaction-recipes.d.ts +5 -0
  269. package/dist/lib/theme-mode-css.d.ts +7 -0
  270. package/dist/lib/tone-recipes.d.ts +8 -0
  271. package/dist/lib/ui-provider/types.d.ts +2 -2
  272. package/dist/lib/use-popup-focus-recovery.d.ts +8 -0
  273. package/dist/lib/utils.js +1 -1
  274. package/dist/{media-gallery-DcTtAaeC.js → media-gallery-3zIVLMWH.js} +8 -8
  275. package/dist/media-gallery-3zIVLMWH.js.map +1 -0
  276. package/dist/{mentions-D-uyCh01.js → mentions-CGlEJ15c.js} +144 -142
  277. package/dist/mentions-CGlEJ15c.js.map +1 -0
  278. package/dist/{message-CdHgIWKf.js → message-DZ_ruyUV.js} +6 -5
  279. package/dist/message-DZ_ruyUV.js.map +1 -0
  280. package/dist/{metadata-list-X5rYAKSB.js → metadata-list-8N16ZMW_.js} +130 -119
  281. package/dist/metadata-list-8N16ZMW_.js.map +1 -0
  282. package/dist/{navigation-D3KwXmaq.js → navigation-Bnotn4AQ.js} +19 -19
  283. package/dist/navigation-Bnotn4AQ.js.map +1 -0
  284. package/dist/{navigation-HJf5zxlH.js → navigation-BzhHI3lo.js} +36 -35
  285. package/dist/navigation-BzhHI3lo.js.map +1 -0
  286. package/dist/{navigation-row-recipes-BVowojQw.js → navigation-row-recipes-BFLCk_Aq.js} +2 -2
  287. package/dist/{navigation-row-recipes-BVowojQw.js.map → navigation-row-recipes-BFLCk_Aq.js.map} +1 -1
  288. package/dist/{number-DMhe-Vsk.js → number-DbV1Dija.js} +36 -34
  289. package/dist/{number-DMhe-Vsk.js.map → number-DbV1Dija.js.map} +1 -1
  290. package/dist/{overflow-tab-bar-sQHXLlwQ.js → overflow-tab-bar-CWY7Nogn.js} +105 -103
  291. package/dist/overflow-tab-bar-CWY7Nogn.js.map +1 -0
  292. package/dist/{overlays-I0axtYA6.js → overlays-tMkF-VAN.js} +282 -278
  293. package/dist/overlays-tMkF-VAN.js.map +1 -0
  294. package/dist/{page-B5dTH9gE.js → page-CL9YeH_V.js} +8 -8
  295. package/dist/{page-B5dTH9gE.js.map → page-CL9YeH_V.js.map} +1 -1
  296. package/dist/{page-header-commands-DjzFEq3E.js → page-header-commands-DOb6WsfD.js} +5 -5
  297. package/dist/{page-header-commands-DjzFEq3E.js.map → page-header-commands-DOb6WsfD.js.map} +1 -1
  298. package/dist/pagination-BL25hu2s.js +158 -0
  299. package/dist/pagination-BL25hu2s.js.map +1 -0
  300. package/dist/{popover-Di55PyAI.js → popover-gnTOhbFM.js} +69 -66
  301. package/dist/popover-gnTOhbFM.js.map +1 -0
  302. package/dist/popover-menu-Cn9rUkdc.js +100 -0
  303. package/dist/popover-menu-Cn9rUkdc.js.map +1 -0
  304. package/dist/{popover.recipes-Bdyhj2db.js → popover.recipes-D3j8R8Yp.js} +17 -10
  305. package/dist/popover.recipes-D3j8R8Yp.js.map +1 -0
  306. package/dist/{primitives-B-CkiEMU.js → primitives-BFK08r9M.js} +45 -44
  307. package/dist/primitives-BFK08r9M.js.map +1 -0
  308. package/dist/primitives.js +4 -4
  309. package/dist/{progress-rnS8-uAW.js → progress-B1VnCT0K.js} +5 -5
  310. package/dist/{progress-rnS8-uAW.js.map → progress-B1VnCT0K.js.map} +1 -1
  311. package/dist/{receipt-D0oswZ0p.js → receipt-BVSOH3Xo.js} +9 -6
  312. package/dist/{receipt-D0oswZ0p.js.map → receipt-BVSOH3Xo.js.map} +1 -1
  313. package/dist/{rich-text-DvGulsNJ.js → rich-text-GOUyKQ-s.js} +3 -3
  314. package/dist/{rich-text-DvGulsNJ.js.map → rich-text-GOUyKQ-s.js.map} +1 -1
  315. package/dist/{rich-text-editor-sMU_Scqm.js → rich-text-editor-cRLC-eBK.js} +418 -426
  316. package/dist/rich-text-editor-cRLC-eBK.js.map +1 -0
  317. package/dist/rich-text-editor-toolbar-DfXg0-VC.js +94 -0
  318. package/dist/rich-text-editor-toolbar-DfXg0-VC.js.map +1 -0
  319. package/dist/{scroll-area-Bt_vXY2b.js → scroll-area-DcI-M1UT.js} +2 -2
  320. package/dist/{scroll-area-Bt_vXY2b.js.map → scroll-area-DcI-M1UT.js.map} +1 -1
  321. package/dist/{separator-C8DlRGwF.js → separator-BDV-Y648.js} +3 -3
  322. package/dist/{separator-C8DlRGwF.js.map → separator-BDV-Y648.js.map} +1 -1
  323. package/dist/{separator-CYHnjsAb.js → separator-Bom7NsGO.js} +2 -2
  324. package/dist/{separator-CYHnjsAb.js.map → separator-Bom7NsGO.js.map} +1 -1
  325. package/dist/services/actions.js +1 -1
  326. package/dist/{settings-CQW3b-Cu.js → settings-ybnjVwbd.js} +20 -19
  327. package/dist/settings-ybnjVwbd.js.map +1 -0
  328. package/dist/{sheet-4SEvVYzA.js → sheet-ijlsjq-n.js} +76 -73
  329. package/dist/sheet-ijlsjq-n.js.map +1 -0
  330. package/dist/{sidebar-C7WWR29L.js → sidebar-Db6gkh3U.js} +183 -182
  331. package/dist/sidebar-Db6gkh3U.js.map +1 -0
  332. package/dist/{sidebar-d7Dg80ln.js → sidebar-DkTO4VTO.js} +14 -13
  333. package/dist/{sidebar-d7Dg80ln.js.map → sidebar-DkTO4VTO.js.map} +1 -1
  334. package/dist/{skeleton-Cz890JZF.js → skeleton-Byjnt7qr.js} +3 -3
  335. package/dist/{skeleton-Cz890JZF.js.map → skeleton-Byjnt7qr.js.map} +1 -1
  336. package/dist/smart-card-DiC5aac3.js +604 -0
  337. package/dist/smart-card-DiC5aac3.js.map +1 -0
  338. package/dist/{structure-DC2dygdA.js → structure-BmisBK-3.js} +2 -2
  339. package/dist/{structure-DC2dygdA.js.map → structure-BmisBK-3.js.map} +1 -1
  340. package/dist/style.css +1 -1
  341. package/dist/table-BweFy_P9.js +1530 -0
  342. package/dist/table-BweFy_P9.js.map +1 -0
  343. package/dist/{table-CIKyLUsy.js → table-DsfzoUia.js} +75 -63
  344. package/dist/table-DsfzoUia.js.map +1 -0
  345. package/dist/{tabs-DwBJfjxX.js → tabs-CDocW5D1.js} +14 -13
  346. package/dist/tabs-CDocW5D1.js.map +1 -0
  347. package/dist/text-inputs-f9Ia-aCi.js +353 -0
  348. package/dist/text-inputs-f9Ia-aCi.js.map +1 -0
  349. package/dist/theme-mode-css-BB-_RYab.js +14 -0
  350. package/dist/theme-mode-css-BB-_RYab.js.map +1 -0
  351. package/dist/theme-scope-BJ6eE2xt.js +50 -0
  352. package/dist/theme-scope-BJ6eE2xt.js.map +1 -0
  353. package/dist/theme.css +285 -228
  354. package/dist/themes/green.css +16 -12
  355. package/dist/timelines-CwM_9IhD.js +457 -0
  356. package/dist/timelines-CwM_9IhD.js.map +1 -0
  357. package/dist/{tone-recipes-CPoExcTE.js → tone-recipes-BPsRAvhu.js} +5 -2
  358. package/dist/tone-recipes-BPsRAvhu.js.map +1 -0
  359. package/dist/{tooltip-CsfgrfS7.js → tooltip-yiRJUFjp.js} +4 -4
  360. package/dist/{tooltip-CsfgrfS7.js.map → tooltip-yiRJUFjp.js.map} +1 -1
  361. package/dist/{tree-BiKhg8AY.js → tree-WnKQzwbq.js} +9 -9
  362. package/dist/{tree-BiKhg8AY.js.map → tree-WnKQzwbq.js.map} +1 -1
  363. package/dist/typography/rich-text.js +1 -1
  364. package/dist/{typography-DTRkE9zL.js → typography-UTnveOEy.js} +6 -6
  365. package/dist/typography-UTnveOEy.js.map +1 -0
  366. package/dist/typography.js +2 -2
  367. package/dist/{ui-provider-1D_NSYzO.js → ui-provider-C_U0Xma4.js} +3 -3
  368. package/dist/ui-provider-C_U0Xma4.js.map +1 -0
  369. package/dist/ui-provider.js +2 -2
  370. package/dist/{upload-BO8-CLN6.js → upload-CXyxmQBP.js} +13 -12
  371. package/dist/upload-CXyxmQBP.js.map +1 -0
  372. package/dist/{upload-queue-EOC8g1gf.js → upload-queue-Boscubn9.js} +11 -9
  373. package/dist/upload-queue-Boscubn9.js.map +1 -0
  374. package/dist/{usage-card-obRaBskq.js → usage-card-BhO5eqkX.js} +53 -37
  375. package/dist/usage-card-BhO5eqkX.js.map +1 -0
  376. package/dist/use-popup-focus-recovery-C0QPvgOR.js +36 -0
  377. package/dist/use-popup-focus-recovery-C0QPvgOR.js.map +1 -0
  378. package/dist/{utils-l5LpDw2z.js → utils-BRhFDwuU.js} +59 -44
  379. package/dist/utils-BRhFDwuU.js.map +1 -0
  380. package/dist/{value-inputs-TAYMX111.js → value-inputs-TaX4OjNk.js} +268 -252
  381. package/dist/value-inputs-TaX4OjNk.js.map +1 -0
  382. package/dist/{value-typography-b8wpz1eX.js → value-typography-BP8OG6h5.js} +2 -2
  383. package/dist/{value-typography-b8wpz1eX.js.map → value-typography-BP8OG6h5.js.map} +1 -1
  384. package/dist/{workspace-DH0v0KcB.js → workspace-B-OEm3Kf.js} +34 -33
  385. package/dist/workspace-B-OEm3Kf.js.map +1 -0
  386. package/docs/consumer-skill/SKILL.md +3 -3
  387. package/docs/consumer-skill/references/agents-md.md +1 -1
  388. package/docs/consumer-skill/references/composition.md +8 -6
  389. package/docs/consumer-skill/references/installation.md +6 -0
  390. package/docs/consumer-skill/references/integration.md +4 -3
  391. package/docs/consumer-skill/references/public-api.json +105 -2
  392. package/docs/consumer-skill/references/review.md +7 -0
  393. package/docs/consumer-skill/references/theming.md +71 -6
  394. package/docs/consumer-skill/references/tokens.json +1 -1
  395. package/docs/consumer-skill/references/workflows.md +26 -0
  396. package/docs/consumer-skill/scripts/composition-policy.mjs +3 -2
  397. package/docs/consumer-skill/scripts/surface-policy.mjs +11 -0
  398. package/package.json +8 -4
  399. package/dist/accordion-B6a3vVgA.js.map +0 -1
  400. package/dist/action-menu-TzCoSlwL.js +0 -280
  401. package/dist/action-menu-TzCoSlwL.js.map +0 -1
  402. package/dist/affordance-geometry.generated-B5iu-Mkr.js +0 -69
  403. package/dist/affordance-geometry.generated-B5iu-Mkr.js.map +0 -1
  404. package/dist/ai-artifact-BMJdv-6q.js +0 -1115
  405. package/dist/ai-artifact-BMJdv-6q.js.map +0 -1
  406. package/dist/attachment-BtfhGm8i.js +0 -245
  407. package/dist/attachment-BtfhGm8i.js.map +0 -1
  408. package/dist/auth-CYxKfo69.js.map +0 -1
  409. package/dist/avatar-BBnEJIx8.js.map +0 -1
  410. package/dist/badge-MrKVNzW9.js.map +0 -1
  411. package/dist/batch-action-bar-BZGDG-Si.js.map +0 -1
  412. package/dist/breadcrumbs-D5t7I023.js.map +0 -1
  413. package/dist/buttons-SbIcm1HJ.js.map +0 -1
  414. package/dist/cards-CiiHpKYd.js +0 -66
  415. package/dist/cards-CiiHpKYd.js.map +0 -1
  416. package/dist/chart-QfrARkXl.js.map +0 -1
  417. package/dist/choice-inputs-t6w3ATNz.js.map +0 -1
  418. package/dist/code-block-Dgbu-CU3.js.map +0 -1
  419. package/dist/combobox-2Ic8N9bL.js +0 -278
  420. package/dist/combobox-2Ic8N9bL.js.map +0 -1
  421. package/dist/combobox-DLl0bfiq.js.map +0 -1
  422. package/dist/comments-BpDuCUUu.js.map +0 -1
  423. package/dist/data-display-DafIvCl5.js.map +0 -1
  424. package/dist/date-picker-CF-DtUpF.js.map +0 -1
  425. package/dist/date-pickers-BmzxJl5l.js +0 -174
  426. package/dist/date-pickers-BmzxJl5l.js.map +0 -1
  427. package/dist/display-DsQTVzMz.js.map +0 -1
  428. package/dist/dropdown-menu-E2qmdC7o.js +0 -193
  429. package/dist/dropdown-menu-E2qmdC7o.js.map +0 -1
  430. package/dist/editable-text-recipe-Bkm6wKHp.js +0 -10
  431. package/dist/editable-text-recipe-Bkm6wKHp.js.map +0 -1
  432. package/dist/feedback-qNuMBtRH.js +0 -233
  433. package/dist/feedback-qNuMBtRH.js.map +0 -1
  434. package/dist/field-affordance-recipes-qQeIf4lG.js.map +0 -1
  435. package/dist/filters-BkHH53uv.js.map +0 -1
  436. package/dist/form-field-DUt4UxSV.js.map +0 -1
  437. package/dist/form-sizing-By94KzXE.js.map +0 -1
  438. package/dist/forms-numeric-C0bvjRPZ.js.map +0 -1
  439. package/dist/header-BOefOKd1.js.map +0 -1
  440. package/dist/input-DWhBBBww.js +0 -262
  441. package/dist/input-DWhBBBww.js.map +0 -1
  442. package/dist/input-Ddi_LSYv.js +0 -20
  443. package/dist/input-Ddi_LSYv.js.map +0 -1
  444. package/dist/interaction-recipes-CHr0dJUs.js.map +0 -1
  445. package/dist/item-DEmDiTlD.js +0 -265
  446. package/dist/item-DEmDiTlD.js.map +0 -1
  447. package/dist/media-gallery-DcTtAaeC.js.map +0 -1
  448. package/dist/mentions-D-uyCh01.js.map +0 -1
  449. package/dist/message-CdHgIWKf.js.map +0 -1
  450. package/dist/metadata-list-X5rYAKSB.js.map +0 -1
  451. package/dist/navigation-D3KwXmaq.js.map +0 -1
  452. package/dist/navigation-HJf5zxlH.js.map +0 -1
  453. package/dist/overflow-tab-bar-sQHXLlwQ.js.map +0 -1
  454. package/dist/overlays-I0axtYA6.js.map +0 -1
  455. package/dist/pagination-3bPA_a6K.js +0 -149
  456. package/dist/pagination-3bPA_a6K.js.map +0 -1
  457. package/dist/popover-Di55PyAI.js.map +0 -1
  458. package/dist/popover-menu-B71Tn2Qz.js +0 -99
  459. package/dist/popover-menu-B71Tn2Qz.js.map +0 -1
  460. package/dist/popover.recipes-Bdyhj2db.js.map +0 -1
  461. package/dist/primitives-B-CkiEMU.js.map +0 -1
  462. package/dist/rich-text-editor-sMU_Scqm.js.map +0 -1
  463. package/dist/rich-text-editor.recipes-CadiF_Uu.js +0 -88
  464. package/dist/rich-text-editor.recipes-CadiF_Uu.js.map +0 -1
  465. package/dist/settings-CQW3b-Cu.js.map +0 -1
  466. package/dist/sheet-4SEvVYzA.js.map +0 -1
  467. package/dist/sidebar-C7WWR29L.js.map +0 -1
  468. package/dist/smart-card-lFKxn5Hu.js +0 -595
  469. package/dist/smart-card-lFKxn5Hu.js.map +0 -1
  470. package/dist/spinner-fa3h1Aif.js +0 -80
  471. package/dist/spinner-fa3h1Aif.js.map +0 -1
  472. package/dist/table-CIKyLUsy.js.map +0 -1
  473. package/dist/table-CrcLN9Io.js +0 -1458
  474. package/dist/table-CrcLN9Io.js.map +0 -1
  475. package/dist/tabs-DwBJfjxX.js.map +0 -1
  476. package/dist/text-inputs-aaK9wcDT.js +0 -326
  477. package/dist/text-inputs-aaK9wcDT.js.map +0 -1
  478. package/dist/theme-scope-kStaAer0.js +0 -39
  479. package/dist/theme-scope-kStaAer0.js.map +0 -1
  480. package/dist/timelines-C_SBwHNP.js +0 -442
  481. package/dist/timelines-C_SBwHNP.js.map +0 -1
  482. package/dist/tone-recipes-CPoExcTE.js.map +0 -1
  483. package/dist/typography-DTRkE9zL.js.map +0 -1
  484. package/dist/ui-provider-1D_NSYzO.js.map +0 -1
  485. package/dist/upload-BO8-CLN6.js.map +0 -1
  486. package/dist/upload-queue-EOC8g1gf.js.map +0 -1
  487. package/dist/usage-card-obRaBskq.js.map +0 -1
  488. package/dist/utils-l5LpDw2z.js.map +0 -1
  489. package/dist/value-inputs-TAYMX111.js.map +0 -1
  490. package/dist/workspace-DH0v0KcB.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-CYxKfo69.js","names":["_Fragment","_Fragment","React","_Fragment","useDensityConfig","resolveComponentScale","cn","buttonVariants","Button","DisplayLabel","Heading","Text","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 shadow-sm'\n\t\t\t\t\t: 'border-0 bg-transparent 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\">\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\tclassName=\"auth-card--title border-0 pb-0 text-base leading-tight\"\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',\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'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\">\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\">\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\tclassName=\"auth-split-panel--title border-0 pb-0 text-base leading-tight\"\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\"\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\tclassName={cn(\n\t\t\t\t\t\t\t'max-w-full whitespace-normal break-words text-inherit leading-tight',\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\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 leading-snug',\n\t\t\t\t\t\t\t\tselected ? 'text-inherit opacity-75' : '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":";;;;;;;;;;;;;;;;;;;AAOA,SAAgB8B,GAAS,EACxB,aAAU,QACV,YACA,UACA,gBACA,cACA,WACA,UACA,WACA,aACA,cACA,oBACA,mBACA,qBACA,oBACA,GAAGC,KACc;CACjB,IAAMC,IAAY,GAAQC,KAAWC,KAASC,KAAeC;CAE7D,OACC,kBAACnB,GAAD;EACC,aAAU;EACV,gBAAcoB;EACd,WAAW/B,EACV,wBACA,6BAIA+B,MAAY,SACT,0EACA,uCACHC,CACD;EACA,GAAIP;EAdL,UAAA;GAgBE,CAAC,CAACQ,KACF,kBAAC,OAAD;IAAK,WAAWjC,EAAG,oBAAoB,kDAAkDkC,CAAc;IACrG,UAAAD;GACG,CAAA;GAGL,CAAC,CAACP,KACF,kBAAC,UAAD;IAAQ,WAAW1B,EAAG,6BAA6B+B,MAAY,SAAS,mBAAmB,OAAOI,CAAe;IAChH,UAAA,kBAAC1B,GAAD;KAAO,WAAU;KAAa,KAAI;KAAK,OAAM;KAAQ,SAAQ;KAAU,WAAU;KAAjF,UAAA,CACC,kBAACA,GAAD;MAAO,KAAI;MAAS,WAAU;MAA9B,UAAA;OACE,CAAC,CAACkB,KACF,kBAACxB,GAAD;QAAc,KAAI;QAAM,WAAU;QAChC,UAAAwB;OACY,CAAA;OAEd,CAAC,CAACC,KACF,kBAACxB,GAAD;QACC,KAAI;QACJ,oBAAmB;QACnB,WAAU;QAET,UAAAwB;OACO,CAAA;OAET,CAAC,CAACC,KACF,kBAACxB,GAAD;QAAM,KAAI;QAAM,MAAK;QAAY,YAAW;QAAU,WAAU;QAC9D,UAAAwB;OACI,CAAA;MAED;KACN,CAAA,GAAA,CAAC,CAACC,KAAa,kBAAC,OAAD;MAAK,WAAU;MAAkC,UAAAA;KAAe,CAAA,CAC1E;;GACA,CAAA;GAGT,kBAACpB,GAAD;IACC,SAASqB,MAAY,SAAS,OAAO;IACrC,WAAW/B,EACV,sBACA,WACAoC,CACD;IAEA,UAAA,kBAAC,OAAD;KAAK,WAAWpC,EAAG,2BAA2B+B,MAAY,UAAU,aAAa;KAAjF,UAAA,CACC,CAAC,CAACM,KAAU,kBAAC,OAAD;MAAK,WAAU;MAAyC,UAAAA;KAAY,CAAA,GAChFC,CACI;;GACO,CAAA;GAEZ,CAAC,CAACC,KACF,kBAAC3B,GAAD;IACC,SAAQ;IACR,WAAWZ,EAAG,qBAAqB,+CAA+CwC,CAAe;IAEhG,UAAAD;GACU,CAAA;EAEH;;AAEb;;;AC1FA,SAAgBE,EAAkB,GAAwD;CACzF,OAAO,GACNC,KACC,OAAOA,KAAU,YACjB,CAACC,EAAeD,CAAK,MACpB,UAAUA,KAAS,WAAWA,KAAS,iBAAiBA,KAAS,UAAUA;AAE/E;AAEA,SAAgBE,EAAa,EAC5B,WAAQ,CAAC,GACT,kBACwB,CAAC,GAAuB;CAChD,IAAMC,IAAqBzB,EAAsB,EAAE,cAAW,CAAC;CAM/D,OAAO;EACN,OANoB0B,QACdC,EAAM,QAAQ,MAASC,EAAK,YAAY,EAAK,GACnD,CAACD,CAAK,CAIC;EACP,YAAYF;CACb;AACD;AAEA,SAAgBI,EAAa,EAC5B,aAAU,QACV,UACA,WACA,iBAAc,CAAC,GACf,iBAAc,CAAC,GACf,mBAAgB,CAAC,GACjB,qBACA,aACA,qBAAkB,CAAC,GACnB,eACA,kBACwB,CAAC,GAAuB;CAChD,IAAMJ,IAAqBzB,EAAsB,EAAE,cAAW,CAAC,GACzD8B,IAAqBJ,QACpBK,EAAY,QAAQ,MAASH,EAAK,YAAY,EAAK,GACzD,CAACG,CAAW,CACb,GACMC,IAAqBN,QACpBO,EAAY,QAAQ,MAASL,EAAK,YAAY,EAAK,GACzD,CAACK,CAAW,CACb,GACMC,IAAuBR,QACtBS,EAAc,QAAQ,MAASP,EAAK,YAAY,EAAK,GAC3D,CAACO,CAAa,CACf,GACMC,IAAyBV,QACxBW,EAAgB,QAAQ,MAAaC,EAAS,YAAY,EAAK,GACrE,CAACD,CAAe,CACjB,GACME,IAAW,GAChBjB,MACED,EAAkBC,CAAK,IACrBA,EAAM,QAAQA,EAAM,SAASA,EAAM,cACnCA,KAECkB,IAAe,GACpBC,KACCtB,KACAuB,KACAZ,EAAmB,SAAS,KAC5BE,EAAmB,SAAS,KAC5BE,EAAqB,SAAS,IAE1BS,IAAgB,EAAQC;CAE9B,OAAO;EAKN,SAASC,MAAY,WAAW,CAACF,IAAgB,SAASE;EAC1D;EACA;EACA;EACA,oBAAoBT,EAAuB,SAAS;EACpD,YAAYX;EACZ,aAAaK;EACb,aAAaE;EACb,eAAeE;EACf,iBAAiBE;CAClB;AACD;;;AC3FA,IAAaU,IAA4C;CACxD,eAAe;CACf,sBAAsB;CACtB,kBAAkB;CAClB,kBAAkB;CAClB,oBAAoB;AACrB,GAMaC,IAAwD,EACpE,OAAO,uBACR,GAMaC,IAAgE,EAC5E,OAAO,yBACR,GAOaC,IAA0D;CACtE,OAAO;CACP,SAAS;AACV;;;AC9BA,SAAgBC,EAAgB,EAC/B,UACA,gBACA,eAAY,KACZ,eACA,cACA,SAASC,GACT,GAAG9C,KACqB;CACxB,IAAM+C,IAAUC,EAAWN,GAA+BI,CAAW,GAC/D,EAAE,OAAOG,GAAc,YAAY7B,MAAuBD,EAAa;EAC5E;EACA;CACD,CAAC;CAMD,OAJI8B,EAAa,WAAW,IACpB,OAIP,kBAAC,OAAD;EACC,cAAYjD,EAAM,iBAAiB+C,EAAQ;EAC3C,WAAWxE,EACV,gCACA,wFACAgC,CACD;EACA,GAAIP;EAPL,UAAA,CASE,CAAC,CAACkD,KACF,kBAAC,QAAD;GAAM,WAAU;GAA2E,eAAY;GACrG,UAAAA;EACI,CAAA,GAEND,EAAa,KAAK,GAAM,MAAU;GAClC,IAAME,IAAW/B,EAAmB;IACnC,MAAMG,EAAK;IACX,QAAQA,EAAK;IACb,KAAKA,EAAK;IACV,UAAUA,EAAK;IACf,UAAUA,EAAK;IACf,SAASA,EAAK;IACd,WAAWhD,EACV,2BACA,iEACAgD,EAAK,YAAY,gCAClB;IACA,UACC,kBAAC3C,GAAD;KAAM,KAAI;KAAO,MAAK;KAAK,WAAU;KACnC,UAAA2C,EAAK;IACD,CAAA;GAER,CAAC;GAED,OACC,kBAAC6B,IAAD,EAAA,UAAA,CACEC,IAAQ,KACR,kBAACzE,GAAD;IACC,KAAI;IACJ,MAAK;IACL,MAAK;IACL,eAAY;IACZ,WAAU;IAET,UAAA0E;GACI,CAAA,GAENH,CACQ,EAAA,GAbK5B,EAAK,MAAM8B,CAahB;EAEZ,CAAC,CACG;;AAEP;;;AC/DA,IAAME,IAAwB;AAE9B,SAASC,IAAa;CACrB,OACC,kBAAC,OAAD;EAAK,gBAAa;EACjB,eAAY;EACZ,WAAU;EACV,SAAQ;EACR,OAAM;EAJP,UAAA;GAMC,kBAAC,QAAD;IAAM,MAAK;IAAU,GAAE;GAA8L,CAAA;GACrN,kBAAC,QAAD;IAAM,MAAK;IAAU,GAAE;GAA6N,CAAA;GACpP,kBAAC,QAAD;IAAM,MAAK;IAAU,GAAE;GAAqM,CAAA;GAC5N,kBAAC,QAAD;IAAM,MAAK;IAAU,GAAE;GAAgM,CAAA;EACnN;;AAEP;AAEA,SAASC,IAAgB;CACxB,OACC,kBAAC,OAAD;EAAK,gBAAa;EAAqB,eAAY;EAAO,WAAU;EAAY,SAAQ;EAAxF,UAAA;GACC,kBAAC,QAAD;IAAM,MAAK;IAAU,GAAE;GAAiB,CAAA;GACxC,kBAAC,QAAD;IAAM,MAAK;IAAU,GAAE;GAAmB,CAAA;GAC1C,kBAAC,QAAD;IAAM,MAAK;IAAU,GAAE;GAAkB,CAAA;GACzC,kBAAC,QAAD;IAAM,MAAK;IAAU,GAAE;GAAoB,CAAA;EACvC;;AAEP;AAEA,SAASC,IAAa;CACrB,OACC,kBAAC,OAAD;EAAK,gBAAa;EAAqB,eAAY;EAAO,WAAU;EAAY,SAAQ;EAAY,MAAK;EACxG,UAAA,kBAAC,QAAD,EAAM,GAAE,gmBAAimB,CAAA;CACrmB,CAAA;AAEP;AAEA,SAASC,IAAY;CACpB,OACC,kBAAC,OAAD;EAAK,gBAAa;EAAqB,eAAY;EAAO,WAAU;EAAY,SAAQ;EAAY,MAAK;EACxG,UAAA,kBAAC,QAAD,EAAM,GAAE,8bAA+b,CAAA;CACnc,CAAA;AAEP;AAEA,SAASC,EAAa,EAAE,eAA8C;CACrE,IAAI3B,EAAS,MAAM,OAAO,kBAAAhE,GAAA,EAAA,UAAGgE,EAAS,KAAO,CAAA;CAC7C,QAAQA,EAAS,UAAjB;EACC,KAAK,UACJ,OAAO,kBAACuB,GAAD,CAAa,CAAA;EACrB,KAAK,UACJ,OAAO,kBAACE,GAAD,CAAa,CAAA;EACrB,KAAK,aACJ,OAAO,kBAACD,GAAD,CAAgB,CAAA;EACxB,KAAK,SACJ,OAAO,kBAACE,GAAD,CAAY,CAAA;EACpB,SACC,OAAO,kBAACE,GAAD;GAAU,WAAU;GAAY,eAAY;EAAQ,CAAA;CAC7D;AACD;AAEA,SAAgBC,EAAyB,EACxC,aACA,eACA,gBACiC;CACjC,IAAM,EAAE,oBAAiBzF,EAAiB,GACpC0F,IAAOzF,EAAsB,KAAA,GAAW0F,CAAY,GACpD5C,IAAqBzB,EAAsB,EAAE,cAAW,CAAC,GACzDsE,IACL,kBAAAhG,GAAA,EAAA,UAAA,CACC,kBAAC2F,GAAD,EAAwB,YAAW,CAAA,GACnC,kBAAChF,GAAD;EAAM,KAAI;EAAO,WAAU;EACzB,UAAAqD,EAAS;CACL,CAAA,CACL,EAAA,CAAA,GAEGiC,IAAkB3F,EACvBgF,GACA/E,EAAe;EAAC;EAAM,MAAM;EAAa,aAAa;EAAW,WAAW;CAAI,CAAC,GACjFyD,EAAS,YAAY,kCACrB1B,CACD;CAeA,OAbI0B,EAAS,OACLb,EAAmB;EACzB,MAAMa,EAAS;EACf,QAAQA,EAAS;EACjB,KAAKA,EAAS;EACd,UAAUA,EAAS;EACnB,UAAUA,EAAS;EACnB,SAASA,EAAS;EAClB,WAAWiC;EACX,UAAUD;CACX,CAAC,IAID,kBAACxF,GAAD;EACC,MAAK;EACL,MAAK;EACL,aAAY;EACZ,WAAA;EACA,UAAUwD,EAAS;EACnB,WAAW1D,EAAG,0CAA0CgC,CAAS;EACjE,UAAU,MAAU0B,EAAS,UAAUkC,CAAK;EAE3C,UAAAF;CACM,CAAA;AAEV;AAEA,SAAgBG,GAAoB,EACnC,cACA,YAAS,SACT,eACA,cACA,SAAStB,GACT,GAAG9C,KACyB;CAC5B,IAAM+C,IAAUC,EAAWL,GAAmCG,CAAW,GACnEuB,IAAmBC,GAAW,QAAQ,MAAarC,EAAS,YAAY,EAAK,KAAK,CAAC;CAMzF,OAJIoC,EAAiB,WAAW,IACxB,OAIP,kBAACtF,GAAD;EACC,SAASwF,MAAW,SAAS;GAAE,MAAM;GAAG,IAAI;EAAE,IAAI;EAClD,KAAI;EACJ,MAAK;EACL,cAAYvE,EAAM,iBAAiB+C,EAAQ;EAC3C,eAAawB;EACb,WAAWhG,EACV,oCACAgC,CACD;EACA,GAAIP;EAEH,UAAAqE,EAAiB,KAAK,MACtB,kBAACP,GAAD;GAEW;GACE;EACZ,GAHK7B,EAAS,MAAM,OAAOA,EAAS,KAAK,CAGzC,CACD;CACI,CAAA;AAER;;;AC3JA,IAAMuC,KAA6E;CAClF,MAAM;CACN,OAAO;AACR;AAEA,SAAgBC,EAAe,EAC9B,YACA,UACA,gBACA,UACA,aACA,WACA,aACA,aAAU,SACV,cACA,qBACA,GAAGzE,KACoB;CACvB,IAAM0E,IAAW,GAAQxE,KAAWC,KAASC,IACvCuE,IAAkBC,GAAU,QAAQ,MAAYC,EAAQ,KAAK,KAAK,CAAC;CAEzE,OACC,kBAAC7F,GAAD;EACC,QAAQ,kBAAC,SAAD,CAAQ,CAAA;EAChB,KAAI;EACJ,SAAQ;EACR,aAAU;EACV,gBAAcsB;EACd,WAAW/B,EACV,+BACA,4CACAiG,GAAclE,IACdC,CACD;EACA,GAAIP;EAEJ,UAAA,kBAAChB,GAAD;GACC,KAAI;GACJ,SAAQ;GACR,WAAWT,EACV,6BACA,wCACAoC,CACD;GAPD,UAAA;IASE,CAAC,CAACH,KACF,kBAAC,OAAD;KAAK,WAAU;KACb,UAAAA;IACG,CAAA;IAGL,CAAC,CAACkE,KACF,kBAAC1F,GAAD;KAAO,KAAI;KAAK,WAAU;KAA1B,UAAA;MACE,CAAC,CAACkB,KACF,kBAACxB,GAAD;OAAc,KAAI;OAAM,WAAU;OAChC,UAAAwB;MACY,CAAA;MAEd,CAAC,CAACC,KACF,kBAACxB,GAAD;OACC,KAAI;OACJ,oBAAmB;OACnB,WAAU;OAET,UAAAwB;MACO,CAAA;MAET,CAAC,CAACC,KACF,kBAACxB,GAAD;OACC,KAAI;OACJ,MAAK;OACL,YAAW;OACX,WAAU;OAET,UAAAwB;MACI,CAAA;KAED;;IAGPuE,EAAgB,SAAS,KACzB,kBAACpF,GAAD;KAAW,WAAU;KACnB,UAAAoF,EAAgB,KAAK,GAAS,MAC9B,kBAAClF,GAAD;MAEC,SAAQ;MACR,WAAU;MAHX,UAAA,CAKE,CAAC,CAACoF,EAAQ,QACV,kBAACxF,GAAD;OAAW,SAAQ;OAAO,WAAU;OAClC,UAAAwF,EAAQ;MACC,CAAA,GAEZ,kBAACrF,GAAD;OAAa,WAAU;OAAvB,UAAA,CACC,kBAACE,GAAD,EAAA,UAAYmF,EAAQ,MAAiB,CAAA,GACpC,CAAC,CAACA,EAAQ,eACV,kBAACvF,GAAD;QAAiB,OAAM;QAAQ,UAAAuF,EAAQ;OAA6B,CAAA,CAEzD;MACR,CAAA,CAAA;KAfA,GAAAA,EAAQ,MAAMxB,CAed,CACN;IACS,CAAA;IAGXxC;IAEA,CAAC,CAACC,KACF,kBAAC,OAAD;KAAK,WAAU;KACb,UAAAA;IACG,CAAA;GAEA;;CACD,CAAA;AAET;;;AC1GA,IAAMgE,KAAkE;CACvE,IAAI;CACJ,IAAI;CACJ,IAAI;AACL;AAEA,SAASC,GAAkB,GAAmE;CAC7F,OAAO,EAAQ,MAAS,OAAOC,KAAU,YAAa9D,EAAe8D,CAAK;AAC3E;AAEA,SAASC,GAAmB,GAAmC;CAC9D,IAAMC,IAAU,GAAQjE,EAAM,SAASA,EAAM;CAE7C,OACC,kBAAA/C,GAAA,EAAA,UAAA,CACE,CAAC,CAAC+C,EAAM,QACR,kBAAC,OAAD;EAAK,WAAU;EACb,UAAAA,EAAM;CACH,CAAA,GAEL,CAAC,CAACiE,KACF,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,CAAC,CAACjE,EAAM,SACR,kBAACrC,GAAD;GAAM,KAAI;GAAM,QAAO;GAAW,WAAU;GAC1C,UAAAqC,EAAM;EACF,CAAA,GAEN,CAAC,CAACA,EAAM,eACR,kBAACrC,GAAD;GACC,KAAI;GACJ,MAAK;GACL,MAAK;GACL,WAAU;GAET,UAAAqC,EAAM;EACF,CAAA,CAEH;CAEL,CAAA,CAAA,EAAA,CAAA;AAEJ;AAEA,SAASkE,GAAY,EACpB,UACA,iBAKE;CACF,IAAI,CAAClE,GAAO,OAAO;CAEnB,IAAI,CAACD,EAAkBC,CAAK,GAC3B,OACC,kBAAC,OAAD;EAAK,WAAU;EACb,UAAAA;CACG,CAAA;CAIP,IAAMgD,IAAUgB,GAAmBhE,CAAK,GAClCV,IAAYhC,EACjB,qBACA,mGACA0C,EAAM,QAAQ,qCACf;CAWA,OATIA,EAAM,OACFmE,EAAW;EACjB,MAAMnE,EAAM;EACZ,cAAcA,EAAM;EACpB;EACA,UAAUgD;CACX,CAAC,IAGK,kBAAC,OAAD;EAAgB;EAAY,UAAAA;CAAa,CAAA;AACjD;AAEA,SAASoB,GAAiB,GAAqC;CAI9D,OAHKL,IACD9D,EAAe8D,CAAK,IAAUA,IAC9BD,GAAkBC,CAAK,IAAU,kBAACP,GAAD,EAAgB,GAAIO,EAAQ,CAAA,IAC1D,OAHY;AAIpB;AAEA,SAAgBM,EAAU,EACzB,aACA,SAASC,IAAc,QACvB,UAAO,MACP,WAAQ,UACR,UACA,YACA,UACA,gBACA,cACA,WACA,cACA,uBACA,eACA,aACA,WACA,gBACA,gBACA,kBACA,qBACA,oBACA,2BAAwB,SACxB,mBACA,eACA,eAAY,QACZ,iBAAc,UACd,eACA,cACA,kBACA,mBACA,kBACA,yBACA,uBACA,wBACA,oBACA,SAASzC,GACT,GAAG9C,KACe;CAClB,IAAM+C,IAAUC,EAAWP,GAAyBK,CAAW,GACzD,EACL,YACA,cACA,iBACA,mBACA,wBACA,YAAY1B,GACZ,aAAaK,GACb,aAAaE,GACb,eAAeE,GACf,iBAAiBE,MACdP,EAAa;EAChB,SAAS+D;EACT;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,CAAC,GACKC,KAAUhD,MAAY,WAAWF,IACjC0C,KAAQK,GAAiB9C,CAAU,GACnCkD,IAAaC,MAAc,QAC3BC,KAAmBC,MAAgB,WACnCC,KAAY3D,KAAWiD,GAAY;EAAE;EAAO,YAAY/D;CAAmB,CAAC,IAAI,MAEhF0E,KACL,kBAAC9G,GAAD;EACC,QAAQ,kBAAC,QAAD,CAAO,CAAA;EACf,KAAI;EACJ,OAAO+G,MAAU,UAAU,UAAU;EACrC,SAAQ;EACR,WAAWxH,EACV,oBACAqB,EAAgB;GAAE,UAAU;GAAQ,QAAQ;EAAK,CAAC,GAClD,4CACAoG,CACD;EAEA,UAAA,kBAAChH,GAAD;GACC,KAAI;GACJ,WAAWT,EACV,qBACA,UACAuG,GAAWf,IACXkC,CACD;GAPD,UAAA;IASEJ;IAED,kBAAC9F,IAAD;KACC,SAASyC,MAAY,SAAS,SAAS;KAC9B;KACF;KACM;KACF;KACH;KACR,OAAO0D;KACP,gBAAgBC;KAChB,QAAQC;KACR,WAAWC;KACX,kBAAkBC;KAXnB,UAAA,CAaE,CAAC,CAACC,MACF,kBAACvH,GAAD;MAAO,KAAI;MAAK,WAAU;MAA1B,UAAA,CACC,kBAACoF,IAAD;OACC,WAAWrC;OACX,QAAQyE;OACR,YAAYpF;OACZ,SAAS,EAAE,OAAO2B,EAAQ,qBAAqB;MAC/C,CAAA,GACD,kBAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACC,kBAAC,QAAD;SAAM,WAAU;SAAgC,eAAY;QAAQ,CAAA;QACpE,kBAACnE,GAAD;SAAM,KAAI;SAAO,MAAK;SAAK,MAAK;SAC9B,UAAA6H,MAAiB1D,EAAQ;QACrB,CAAA;QACN,kBAAC,QAAD;SAAM,WAAU;SAAgC,eAAY;QAAQ,CAAA;OAChE;MACC,CAAA,CAAA;KAEP,CAAA,GAAAlC,CACQ;;IAET,CAAC,CAACsB,KACF,kBAACnD,GAAD;KACC,KAAI;KACJ,OAAM;KACN,WAAWT,EACV,0BACA,eACAwC,CACD;KAPD,UAAA;MASE,CAAC,CAACqB,KAAY,kBAAC,OAAD;OAAK,WAAU;OAAyB,UAAAA;MAAc,CAAA;MACpE,CAAC,CAACC,KACF,kBAAC,OAAD;OAAK,WAAU;OACb,UAAAA;MACG,CAAA;MAELR,EAAqB,SAAS,KAC9B,kBAACgB,GAAD;OACC,WAAU;OACV,OAAOhB;OACP,aAAa,kBAAC6E,IAAD,EAAQ,WAAU,eAAgB,CAAA;OAC/C,YAAYtF;OACZ,SAAS,EAAE,OAAO2B,EAAQ,mBAAmB;MAC7C,CAAA;MAEDtB,EAAmB,SAAS,KAC5B,kBAACoB,GAAD;OACC,WAAU;OACV,OAAOpB;OACP,YAAYL;OACZ,SAAS,EAAE,OAAO2B,EAAQ,iBAAiB;MAC3C,CAAA;MAEDpB,EAAmB,SAAS,KAC5B,kBAACkB,GAAD;OACC,WAAU;OACV,OAAOlB;OACP,YAAYP;OACZ,SAAS,EAAE,OAAO2B,EAAQ,iBAAiB;MAC3C,CAAA;MAED,CAAC,CAACjC,KAAU,kBAAC,OAAD;OAAK,WAAU;OAAsB,UAAAA;MAAY,CAAA;KACxD;;GAEF;;CACD,CAAA;CAoBR,OAjBK0E,KAkBJ,kBAAC,OAAD;EACC,aAAU;EACV,gBAAa;EACb,mBAAiBE;EACjB,qBAAmBE;EACnB,WAAWrH,EACV,yBACA,iEACAgC,CACD;EACA,GAAIP;EAEJ,UAAA,kBAAC,OAAD;GACC,WAAWzB,EACV,yDACAkH,IACG,kEACA,iEACHkB,CACD;GAPD,UAAA;IASE,CAAC,CAAClB,KACF,kBAAC,OAAD;KACC,WAAWlH,EACV,2BACAoH,KAAmB,UAAU,gCAC7BiB,CACD;KAEC,UAAA5B;IACG,CAAA;IAELc;IACA,CAACL,KACD,kBAAC,OAAD;KACC,WAAWlH,EACV,2BACAoH,KAAmB,UAAU,gCAC7BiB,CACD;KAEC,UAAA5B;IACG,CAAA;GAEF;;CACD,CAAA,IA7DJ,kBAAC,OAAD;EACC,aAAU;EACV,gBAAcxC,MAAY,SAAS,SAAS;EAC5C,WAAWjE,EACV,yBACA,iEACAgC,CACD;EACA,GAAIP;EAEH,UAAA8F;CACG,CAAA;AAoDR;;;ACnVA,SAAgBe,EAAS,EAAE,cAAW,GAAG7G,KAAwB;CAChE,IAAM,EAAE,aAAU,GAAG8G,MAAc9G;CAEnC,OACC,kBAACjB,GAAD;EACC,SAAS,MAAgB,kBAAC,QAAD;GAAM,GAAI+H;GAAW,GAAIC;EAAc,CAAA;EAChE,SAAS;EACT,KAAI;EACJ,aAAU;EACV,WAAWxI,EAAG,wBAAwBgC,CAAS;EAE9C;CACI,CAAA;AAER;AAMA,SAAgByG,EAAY,EAAE,cAAW,GAAGhH,KAA2B;CACtE,OACC,kBAAC,OAAD;EACC,aAAU;EACV,WAAWzB,EACV,4BACA,qFACAgC,CACD;EACA,GAAIP;CACJ,CAAA;AAEH;;;ACvBA,SAASiH,EAAmB,GAA6B;CACxD,OAAOC,EAAQ,MAAM,MAAW,CAACC,EAAO,QAAQ;AACjD;AAEA,SAAgBC,EAAoB,EACnC,aAAU,CAAC,GACX,UACA,iBACA,qBAC+B,CAAC,GAA8B;CAC9D,IAAMC,IAAiBlJ,EAAM,cAAc+I,EAAQ,QAAQ,MAAWC,EAAO,YAAY,EAAK,GAAG,CAACD,CAAO,CAAC,GACpGI,IAAgBC,KAAgBN,EAAmBI,CAAc,CAAC,EAAE,IACpE,CAACG,GAAeC,KAAoBtJ,EAAM,SAA6BmJ,CAAa,GACpFI,IAAeC,MAAU,KAAA,GACzBC,IAAgBF,IAAeC,IAAQH,GACvCK,IAAiBR,EAAe,MAAM,MAAWF,EAAO,OAAOS,CAAa,GAE5EE,IAAW3J,EAAM,aACrB,MAAsB;EACtB,IAAM4J,IAAaV,EAAe,MAAM,MAAWF,EAAO,OAAOa,CAAS;EAC1E,AAAKD,KAAc,GAAW,aAEzBL,KACJD,EAAiBO,CAAS,GAG3BC,IAAgBD,GAAWD,CAAU;CACtC,GACA;EAACL;EAAcO;EAAeZ;CAAc,CAC7C;CAOA,OALAxH,EAAM,gBAAgB;EACrB,AAAI6H,KAAgBG,KAAkBR,EAAe,WAAW,KAChEI,EAAiBR,EAAmBI,CAAc,CAAC,EAAE,EAAE;CACxD,GAAG;EAACK;EAAcG;EAAgBR;CAAc,CAAC,GAE1C;EACN,OAAOO;EACP;EACA,SAASP;EACT;CACD;AACD;AAEA,SAAgBa,GAAiB,EAChC,aAAU,CAAC,GACX,UACA,iBACA,kBACA,YAAS,SACT,YACA,cACA,SAASpF,GACT,GAAG9C,KACsB;CACzB,IAAM+C,IAAUC,EAAWJ,GAAgCE,CAAW,GAChE,EAAG,cAAeqF,GAAW,GAAGC,MAAcpI,GAC9C,EACL,OAAO4H,GACP,SAASP,GACT,gBACGD,EAAoB;EACvB;EACA;EACA;EACA;CACD,CAAC;CAED,IAAIC,EAAe,WAAW,GAC7B,OAAO;CAER,IAAMgB,IAAY9D,MAAW,aACvB+D,IAAgBjB,EAAe,KAAK,MAAW;EACpD,IAAMkB,IAAWpB,EAAO,OAAOS,GACzBY,IACL,kBAAApK,GAAA,EAAA,UAAA,CACE,CAAC,CAAC+I,EAAO,QACT,kBAAC,QAAD;GAAM,WAAU;GAA2C,eAAY;GACrE,UAAAA,EAAO;EACH,CAAA,GAEP,kBAACnI,GAAD;GAAO,QAAQ,kBAAC,QAAD,CAAO,CAAA;GAAG,KAAI;GAAQ,WAAU;GAA/C,UAAA,CACC,kBAACJ,GAAD;IACC,KAAI;IACJ,QAAO;IACP,WAAWL,EACV,uEACA8J,IAAY,4DAA4D,YACzE;IAEC,UAAAlB,EAAO;GACH,CAAA,GACL,CAAC,CAACA,EAAO,eACT,kBAACvI,GAAD;IACC,KAAI;IACJ,MAAK;IACL,WAAWL,EACV,iCACA8J,IAAY,kDAAkD,2BAC9DE,IAAW,4BAA4B,uBACxC;IAEC,UAAApB,EAAO;GACH,CAAA,CAED;EACN,CAAA,CAAA,EAAA,CAAA;EAEH,OACC,kBAAC,UAAD;GAEC,MAAK;GACL,gBAAcoB;GACd,UAAUpB,EAAO;GACjB,WAAW5I,EACV,8BACA,sQAAsQO,EAAa,MAAM,gFACzRD,EAAsB;IAAC,MAAM;IAAM,MAAM;IAAM,QAAQ;IAAU,OAAO;IAAM,YAAY;GAAM,CAAC,GACjG0J,IAAW,0DAA0DF,IAAY,qDAAqDjJ,EAAmB,aAAa,8CAA8CA,EAAmB,YACvOiJ,KACC,qIACDE,KAAY,qCACb;GACA,eAAeT,EAASX,EAAO,EAAE;GAEhC,UAAAkB,IACA,kBAAC,QAAD;IAAM,WAAU;IACd,UAAAG;GACI,CAAA,IAEN,kBAACxJ,GAAD;IAAO,QAAQ,kBAAC,QAAD,CAAO,CAAA;IAAG,WAAU;IAAa,KAAI;IAAK,MAAM;IAAO,WAAU;IAC9E,UAAAwJ;GACK,CAAA;EAED,GAxBFrB,EAAO,EAwBL;CAEV,CAAC;CAED,OACC,kBAACnI,GAAD;EAAO,KAAI;EAAK,WAAWT,EAAG,iCAAiCgC,CAAS;EAAG,GAAI6H;EAA/E,UAAA,CACEK,MAAY,QAAQA,MAAY,MAChC,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACC,kBAAC,QAAD;KAAM,WAAU;KAAgC,eAAY;IAAQ,CAAA;IACpE,kBAAC7J,GAAD;KAAM,KAAI;KAAO,MAAK;KAAK,MAAK;KAC9B,UAAA6J,KAAW1F,EAAQ;IACf,CAAA;IACN,kBAAC,QAAD;KAAM,WAAU;KAAgC,eAAY;IAAQ,CAAA;GAChE;EAGL,CAAA,GAAAwB,MAAW,cACX,kBAAC,OAAD;GACC,MAAK;GACL,cAAY4D,KAAapF,EAAQ;GACjC,eAAawB;GACb,WAAU;GAET,UAAA+D;EACG,CAAA,IAEL,kBAACvJ,GAAD;GACC,SAASwF,MAAW,SAAS;IAAE,MAAM;IAAG,IAAI;GAAE,IAAI;GAClD,KAAI;GACJ,MAAK;GACL,cAAY4D,KAAapF,EAAQ;GACjC,eAAawB;GACb,WAAU;GAET,UAAA+D;EACI,CAAA,CAED;;AAET"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"avatar-BBnEJIx8.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-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3 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":"badge-MrKVNzW9.js","names":["Badge","React","styles","React","BaseBadge","useBadgeConfig","useDensityConfig","resolveComponentScale","cn","Text","toneRecipes","React$1","Badge$1","props","useRender","asChild","children","className","badgeRecipes","toneClassMap","sizeClassMap","Badge","toneProp","sizeProp","resolvedSize","defaultScale","tone","defaultTone","isSimpleText","inline","pending","pulse","dot","important","TriangleAlert"],"sources":["../src/components/ui/badge.tsx","../src/components/base/badge/badge.recipes.ts","../src/components/base/badge/badge.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useRender } from '@base-ui/react/use-render';\nimport { cn } from '../../lib/utils';\n\nfunction Badge({ className, asChild = false, children, ...props }:\n\tReact.ComponentProps<'span'> & { asChild?: boolean }) {\n\treturn useRender({\n\t\tdefaultTagName: 'span',\n\t\trender: asChild && React.isValidElement(children) ? children : undefined,\n\t\tprops: { ...props, 'data-slot': 'badge', className: cn(className), ...(asChild ? {} : { children }) },\n\t});\n}\n\nexport { Badge };\n","import { toneRecipes } from '../../../lib/tone-recipes';\n\n/** Private Tailwind recipes; public props and DOM hooks remain owned by the component. */\nexport const badgeRecipes = {\n\t// Content-sized in both axes (`w-fit h-fit`) so the badge never stretches yet\n\t// follows its parent's alignment: centred in an `items-center` row, at the\n\t// start edge of a left-aligned column. No `self-*` override of the parent.\n\troot: \"inline-flex items-center justify-center shrink-0 h-fit rounded-radius font-sans font-medium border border-transparent w-fit max-w-full whitespace-nowrap overflow-visible box-border align-middle\",\n\t// The two text-xs sizes take one and a half 2xs steps of block padding (3px at\n\t// the default space scale): taller chips at the same type size, so sm reads 20px\n\t// and md 23px. Written from the root space scale so scoped spacing applies.\n\t// Inline badges keep the 2xs step to sit inside a running line of text.\n\tsizeSm: \"min-h-0 py-[calc(0.1875rem*var(--space-scale))] px-control-xs gap-space-xs text-xs leading-none\",\n\tsizeMd: \"min-h-0 py-[calc(0.1875rem*var(--space-scale))] px-control-xs gap-space-xs text-xs leading-tight\",\n\tsizeLg: \"min-h-0 py-space-xs px-control-sm gap-space-sm text-sm leading-tight\",\n\tisInline: \"inline-flex align-baseline text-xs py-space-2xs px-control-xs leading-none\",\n\tisPending: \"[&_.badge-dot]:bg-transparent [&_.badge-dot]:border-[1.5px] [&_.badge-dot]:border-current\",\n\tisPulse: \"[&_.badge-dot]:animate-badge-pulse motion-reduce:[&_.badge-dot]:animate-none\",\n\tdot: \"badge-dot size-1.5 rounded-full shrink-0 bg-current\",\n\ticon: \"size-icon-sm shrink-0\",\n\tlabel: \"inline-flex min-w-0 max-w-full items-center gap-space-xs overflow-hidden text-ellipsis whitespace-nowrap\",\n\ttonePrimary: \"bg-primary text-primary-foreground border-primary\",\n\ttoneNeutral: \"bg-foreground/8 text-foreground border-transparent\",\n\ttoneSecondary: \"bg-foreground/8 text-foreground border-transparent\",\n\ttoneSuccess: `${toneRecipes.success.tint} ${toneRecipes.success.ink} ${toneRecipes.success.edge}`,\n\ttoneInfo: `${toneRecipes.info.tint} ${toneRecipes.info.ink} ${toneRecipes.info.edge}`,\n\ttoneWarning: `${toneRecipes.warning.tint} ${toneRecipes.warning.ink} ${toneRecipes.warning.edge}`,\n\ttoneDestructive: `${toneRecipes.destructive.tint} ${toneRecipes.destructive.ink} ${toneRecipes.destructive.edge}`,\n} as const satisfies Record<string, string>;\n","/**\n * Badge — blocks badge with canonical semantic tones, package display scale, optional dot indicator\n * (with pulse + pending states), inline mode, and an `important` flag that swaps in a warning icon.\n */\nimport { TriangleAlert } from 'lucide-react';\nimport * as React from \"react\"\n\nimport { Badge as BaseBadge } from \"../../ui/badge\"\nimport { Text } from '../../typography';\nimport {\n\tuseBadgeConfig,\n\tuseDensityConfig,\n\ttype BadgeSize,\n\ttype BadgeTone,\n} from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { cn } from '../../../lib/utils';\nimport { badgeRecipes as styles } from './badge.recipes';\n\nexport interface BadgeProps extends Omit<React.ComponentProps<'span'>, 'content'> {\n\t/** Semantic tone. Falls back to `UIProvider.badge.defaultTone`, then `neutral`: an untoned badge carries no state. */\n\ttone?: BadgeTone\n\t/** Display scale. Falls back to `UIProvider.density.defaultScale`. */\n\tsize?: BadgeSize\n\t/** Renders inline with surrounding text rather than as a standalone chip. */\n\tinline?: boolean;\n\t/** Shows a status dot before the label. */\n\tdot?: boolean;\n\t/** Animates the dot, for live or in-progress states. Requires `dot`. */\n\tpulse?: boolean;\n\t/** Draws the dot hollow, marking a state that has not started. Requires `dot`. */\n\tpending?: boolean;\n\t/** Swaps in a warning icon ahead of the label. */\n\timportant?: boolean;\n}\n\nconst toneClassMap: Record<BadgeTone, string> = {\n\tneutral: styles.toneNeutral,\n\tprimary: styles.tonePrimary,\n\tsecondary: styles.toneSecondary,\n\tdestructive: styles.toneDestructive,\n\tsuccess: styles.toneSuccess,\n\twarning: styles.toneWarning,\n\tinfo: styles.toneInfo,\n};\n\nconst sizeClassMap: Record<BadgeSize, string> = {\n\tsm: styles.sizeSm,\n\tmd: styles.sizeMd,\n\tlg: styles.sizeLg,\n};\n\n/**\n * Blocks Badge using shared Tailwind recipes and stable semantic BEM hooks.\n */\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(function Badge({\n\ttone: toneProp,\n\tclassName,\n\tsize: sizeProp,\n\tinline = false,\n\tdot = false,\n\tpending = false,\n\tpulse = false,\n\timportant = false,\n\tchildren,\n\t...props\n}: BadgeProps, ref) {\n\tconst { defaultTone } = useBadgeConfig();\n\tconst { defaultScale } = useDensityConfig();\n\tconst resolvedSize = resolveComponentScale(sizeProp, defaultScale);\n\tconst tone = toneProp ?? defaultTone ?? 'neutral';\n\tconst isSimpleText = typeof children === 'string' || typeof children === 'number' || typeof children === 'bigint';\n\n\treturn (\n\t\t<BaseBadge\n\t\t\tref={ref}\n\t\t\tdata-slot=\"badge\"\n\t\t\tdata-tone={tone}\n\t\t\tdata-size={resolvedSize}\n\t\t\tdata-inline={inline || undefined}\n\t\t\tdata-pending={pending || undefined}\n\t\t\tclassName={cn(\n\t\t\t\t'badge--component',\n\t\t\t\tstyles.root,\n\t\t\t\ttoneClassMap[tone],\n\t\t\t\tsizeClassMap[resolvedSize],\n\t\t\t\tinline && styles.isInline,\n\t\t\t\tpending && styles.isPending,\n\t\t\t\tpulse && styles.isPulse,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{!!dot && <span aria-hidden=\"true\" className={styles.dot} />}\n\t\t\t{!!important && !dot && <TriangleAlert aria-hidden=\"true\" className={styles.icon} />}\n\t\t\t<span className={styles.label}>\n\t\t\t\t{isSimpleText ? (\n\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight={resolvedSize === 'sm' || inline ? 'none' : 'tight'} className=\"text-inherit\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</Text>\n\t\t\t\t) : children}\n\t\t\t</span>\n\t\t</BaseBadge>\n\t);\n});\n\nBadge.displayName = 'Badge';\n"],"mappings":";;;;;;;;;;AAIA,SAASA,EAAM,EAAE,cAAW,aAAU,IAAO,aAAU,GAAGa,KACH;CACtD,OAAOC,EAAU;EAChB,gBAAgB;EAChB,QAAQC,KAAWd,EAAM,eAAee,CAAQ,IAAIA,IAAW,KAAA;EAC/D,OAAO;GAAE,GAAGH;GAAO,aAAa;GAAS,WAAWL,EAAGS,CAAS;GAAG,GAAIF,IAAU,CAAC,IAAI,EAAE,YAAS;EAAG;CACrG,CAAC;AACF;;;ACRA,IAAaG,IAAe;CAI3B,MAAM;CAKN,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,UAAU;CACV,WAAW;CACX,SAAS;CACT,KAAK;CACL,MAAM;CACN,OAAO;CACP,aAAa;CACb,aAAa;CACb,eAAe;CACf,aAAa,GAAGR,EAAY,QAAQ,KAAK,GAAGA,EAAY,QAAQ,IAAI,GAAGA,EAAY,QAAQ;CAC3F,UAAU,GAAGA,EAAY,KAAK,KAAK,GAAGA,EAAY,KAAK,IAAI,GAAGA,EAAY,KAAK;CAC/E,aAAa,GAAGA,EAAY,QAAQ,KAAK,GAAGA,EAAY,QAAQ,IAAI,GAAGA,EAAY,QAAQ;CAC3F,iBAAiB,GAAGA,EAAY,YAAY,KAAK,GAAGA,EAAY,YAAY,IAAI,GAAGA,EAAY,YAAY;AAC5G,GCQMS,IAA0C;CAC/C,SAASjB,EAAO;CAChB,SAASA,EAAO;CAChB,WAAWA,EAAO;CAClB,aAAaA,EAAO;CACpB,SAASA,EAAO;CAChB,SAASA,EAAO;CAChB,MAAMA,EAAO;AACd,GAEMkB,IAA0C;CAC/C,IAAIlB,EAAO;CACX,IAAIA,EAAO;CACX,IAAIA,EAAO;AACZ,GAKamB,IAAQlB,EAAM,WAAwC,SAAe,EACjF,MAAMmB,GACN,cACA,MAAMC,GACN,YAAS,IACT,SAAM,IACN,aAAU,IACV,WAAQ,IACR,eAAY,IACZ,aACA,GAAGV,KACW,GAAK;CACnB,IAAM,EAAE,mBAAgBR,EAAe,GACjC,EAAE,oBAAiBC,EAAiB,GACpCkB,IAAejB,EAAsBgB,GAAUE,CAAY,GAC3DC,IAAOJ,KAAYK,KAAe,WAClCC,IAAe,OAAOZ,KAAa,YAAY,OAAOA,KAAa,YAAY,OAAOA,KAAa;CAEzG,OACC,kBAACZ,GAAD;EACM;EACL,aAAU;EACV,aAAWsB;EACX,aAAWF;EACX,eAAaK,KAAU,KAAA;EACvB,gBAAcC,KAAW,KAAA;EACzB,WAAWtB,EACV,oBACAN,EAAO,MACPiB,EAAaO,IACbN,EAAaI,IACbK,KAAU3B,EAAO,UACjB4B,KAAW5B,EAAO,WAClB6B,KAAS7B,EAAO,SAChBe,CACD;EACA,GAAIJ;EAjBL,UAAA;GAmBE,CAAC,CAACmB,KAAO,kBAAC,QAAD;IAAM,eAAY;IAAO,WAAW9B,EAAO;GAAM,CAAA;GAC1D,CAAC,CAAC+B,KAAa,CAACD,KAAO,kBAACE,GAAD;IAAe,eAAY;IAAO,WAAWhC,EAAO;GAAO,CAAA;GACnF,kBAAC,QAAD;IAAM,WAAWA,EAAO;IACtB,UAAA0B,IACA,kBAACnB,GAAD;KAAM,KAAI;KAAO,MAAK;KAAU,QAAO;KAAS,YAAYe,MAAiB,QAAQK,IAAS,SAAS;KAAS,WAAU;KACxH;IACI,CAAA,IACHb;GACC,CAAA;EACI;;AAEb,CAAC;AAED,EAAM,cAAc"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"batch-action-bar-BZGDG-Si.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'fixed bottom-[calc(var(--spacing-space-xl)+env(safe-area-inset-bottom,0px))] left-1/2 w-max max-w-[calc(100%-2*var(--spacing-space-xl))] -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\" 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":"breadcrumbs-D5t7I023.js","names":["useDensityConfig","resolveComponentScale","cn","Text","focusRecipes","Slot","BreadcrumbList","props","className","BreadcrumbItem","BreadcrumbLink","asChild","BreadcrumbPage","BreadcrumbSeparator","children","ChevronRight","defaultBreadcrumbsStrings","hashString","hash","i","value","labelToKey","label","defaultRenderLink","BreadcrumbLabel","sizeConfig","Breadcrumbs","forwardRef","sizeProp","stringsProp","ariaLabel","size","defaultScale","strings","useStrings","breadcrumbs","itemSizeClass","listSpacingClass","separatorSpacingClass","baseColorClass","isLast","index","itemKey","item","renderedLabel","Fragment","renderLink"],"sources":["../src/components/ui/breadcrumb.tsx","../src/components/base/navigation/breadcrumbs.tsx"],"sourcesContent":["import { ChevronRight, MoreHorizontal } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Slot } from './slot';\nimport { cn } from '../../lib/utils';\n\nfunction Breadcrumb({ ...props }: React.ComponentProps<'nav'>) {\n\treturn (\n\t\t<nav\n\t\t\taria-label=\"breadcrumb\"\n\t\t\tdata-slot=\"breadcrumb\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<'ol'>) {\n\treturn (\n\t\t<ol\n\t\t\tdata-slot=\"breadcrumb-list\"\n\t\t\tclassName={cn(\n\t\t\t\t'text-muted-foreground flex flex-wrap items-center text-sm break-words',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<'li'>) {\n\treturn (\n\t\t<li\n\t\t\tdata-slot=\"breadcrumb-item\"\n\t\t\tclassName={cn('inline-flex items-center', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction BreadcrumbLink({\n\tasChild,\n\tclassName,\n\t...props\n}: React.ComponentProps<'a'> & {\n\tasChild?: boolean;\n}) {\n\tconst Comp = asChild ? Slot : 'a';\n\n\treturn (\n\t\t<Comp\n\t\t\tdata-slot=\"breadcrumb-link\"\n\t\t\tclassName={cn('hover:text-foreground transition-colors', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<'span'>) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"breadcrumb-page\"\n\t\t\trole=\"link\"\n\t\t\taria-disabled=\"true\"\n\t\t\taria-current=\"page\"\n\t\t\tclassName={cn('text-foreground font-normal', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction BreadcrumbSeparator({\n\tchildren,\n\tclassName,\n\t...props\n}: React.ComponentProps<'li'>) {\n\treturn (\n\t\t<li\n\t\t\tdata-slot=\"breadcrumb-separator\"\n\t\t\trole=\"presentation\"\n\t\t\tclassName={cn('[&>svg]:size-3.5', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children ?? <ChevronRight />}\n\t\t</li>\n\t);\n}\n\nfunction BreadcrumbEllipsis({ className, ...props }: React.ComponentProps<'span'>) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"breadcrumb-ellipsis\"\n\t\t\trole=\"presentation\"\n\t\t\tclassName={cn('flex size-9 items-center justify-center', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<MoreHorizontal className=\"size-4\" />\n\t\t\t<span className=\"sr-only\">More</span>\n\t\t</span>\n\t);\n}\n\nexport {\n\tBreadcrumb,\n\tBreadcrumbList,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n\tBreadcrumbEllipsis,\n};\n\n","/**\n * Breadcrumbs — page hierarchy trail. Last item is rendered as the current\n * page (non-link); preceding items become links when an `href` is provided.\n * The public scale follows the shared component scale; CSS variables control\n * display spacing and typography across the library.\n */\nimport { forwardRef, Fragment, type ComponentPropsWithoutRef, type ReactNode } from 'react';\nimport {\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n} from '../../ui/breadcrumb';\nimport { useDensityConfig, type ComponentScale } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { Text } from '../../typography';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport { focusRecipes } from '../../../lib/focus-recipes';\n\nexport interface BreadcrumbItemType {\n\tlabel: ReactNode;\n\thref?: string;\n\thandle?: string;\n}\n\nexport type BreadcrumbSize = ComponentScale;\n\nexport interface BreadcrumbsStrings {\n\tnavigationLabel: string;\n}\n\nexport const defaultBreadcrumbsStrings: BreadcrumbsStrings = {\n\tnavigationLabel: 'Breadcrumb',\n};\n\ntype BreadcrumbLinkRenderer = (props: {\n\thref?: string;\n\tchildren: ReactNode;\n\tclassName?: string;\n\t'aria-label'?: string;\n}) => ReactNode;\n\nexport interface BreadcrumbsProps extends Omit<ComponentPropsWithoutRef<'nav'>, 'children'> {\n\t/** Trail entries, root first. */\n\tbreadcrumbs: BreadcrumbItemType[];\n\t/** Typography scale for the trail. */\n\tsize?: BreadcrumbSize;\n\t/** Renders entries carrying an `href` through the consumer's router. */\n\trenderLink?: BreadcrumbLinkRenderer;\n\t/** Overrides the trail's own copy. */\n\tstrings?: StringsProp<BreadcrumbsStrings>;\n}\n\nconst hashString = (value: string): string => {\n\tlet hash = 0;\n\tfor (let i = 0; i < value.length; i += 1) {\n\t\thash = (hash << 5) - hash + value.charCodeAt(i);\n\t\thash |= 0;\n\t}\n\n\treturn Math.abs(hash).toString(36);\n};\n\nconst labelToKey = (label: ReactNode): string => {\n\tif (typeof label === 'string' || typeof label === 'number') return String(label);\n\treturn 'breadcrumb';\n};\n\nconst defaultRenderLink: BreadcrumbLinkRenderer = ({ href, children, ...props }) => (\n\t<a href={href} {...props}>{children}</a>\n);\n\nfunction BreadcrumbLabel({ children }: { children: ReactNode }) {\n\tif (\n\t\ttypeof children !== 'string' &&\n\t\ttypeof children !== 'number' &&\n\t\ttypeof children !== 'bigint'\n\t) {\n\t\treturn children;\n\t}\n\n\treturn (\n\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t{children}\n\t\t</Text>\n\t);\n}\n\nconst sizeConfig: Record<BreadcrumbSize, { item: string; list: string; separator: string; color: string }> = {\n\tsm: {\n\t\titem: 'text-pxs',\n\t\tlist: '!gap-space-sm',\n\t\tseparator: '!mx-space-2xs',\n\t\t// Full-strength secondary ink at every size; a translucent ancestor link fails text contrast.\n\t\tcolor: 'text-muted-foreground',\n\t},\n\tmd: {\n\t\titem: 'text-sm',\n\t\tlist: '!gap-space-md',\n\t\tseparator: '!mx-space-sm',\n\t\tcolor: 'text-muted-foreground',\n\t},\n\tlg: {\n\t\titem: 'text-base',\n\t\tlist: '!gap-space-lg',\n\t\tseparator: '!mx-space-md',\n\t\tcolor: 'text-muted-foreground',\n\t},\n};\n\nexport const Breadcrumbs = forwardRef<HTMLElement, BreadcrumbsProps>(function Breadcrumbs({\n\tbreadcrumbs,\n\tsize: sizeProp,\n\tclassName,\n\trenderLink = defaultRenderLink,\n\tstrings: stringsProp,\n\t'aria-label': ariaLabel,\n\t...props\n}, ref) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(sizeProp, defaultScale);\n\tconst strings = useStrings(defaultBreadcrumbsStrings, stringsProp);\n\tif (breadcrumbs.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst { item: itemSizeClass, list: listSpacingClass, separator: separatorSpacingClass, color: baseColorClass } =\n\t\tsizeConfig[size];\n\n\treturn (\n\t\t<nav\n\t\t\tref={ref}\n\t\t\taria-label={ariaLabel ?? strings.navigationLabel}\n\t\t\tdata-slot=\"breadcrumb\"\n\t\t\tclassName={cn('breadcrumbs--component font-sans', baseColorClass, className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<BreadcrumbList className={cn('m-0 p-0 list-none flex flex-wrap items-center break-words', listSpacingClass)}>\n\t\t\t\t{breadcrumbs.map((item, index) => {\n\t\t\t\t\tconst isLast = index === breadcrumbs.length - 1;\n\t\t\t\t\tconst itemKey = item.handle ?? item.href ?? `crumb-${hashString(labelToKey(item.label))}-${index}`;\n\t\t\t\t\tconst renderedLabel = <BreadcrumbLabel>{item.label}</BreadcrumbLabel>;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Fragment key={itemKey}>\n\t\t\t\t\t\t\t<BreadcrumbItem className={cn(itemSizeClass, 'font-medium')}>\n\t\t\t\t\t\t\t\t{isLast || !item.href ? (\n\t\t\t\t\t\t\t\t\t<BreadcrumbPage>\n\t\t\t\t\t\t\t\t\t\t<BreadcrumbLabel>{item.label}</BreadcrumbLabel>\n\t\t\t\t\t\t\t\t\t</BreadcrumbPage>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<BreadcrumbLink asChild className={`text-inherit no-underline rounded-inner ${focusRecipes.text}`}>\n\t\t\t\t\t\t\t\t\t\t{renderLink({ href: item.href, children: renderedLabel })}\n\t\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t{!isLast && (\n\t\t\t\t\t\t\t\t<BreadcrumbSeparator\n\t\t\t\t\t\t\t\t\trole=\"listitem\"\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\tclassName={cn(separatorSpacingClass)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</BreadcrumbList>\n\t\t</nav>\n\t);\n});\n\nBreadcrumbs.displayName = 'Breadcrumbs';\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"buttons-SbIcm1HJ.js","names":["ButtonGroup","ButtonGroupText","ButtonGroupSeparator","ButtonGroupPrimitive","styles","ButtonGroupTextPrimitive","ButtonGroupSeparatorPrimitive","_Fragment","PrimitiveButton","_Fragment","styles","React","React","React","React","useButtonConfig","useDensityConfig","resolveComponentScale","cn","affordanceGeometry","Separator","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","Text","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\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\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{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\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\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-4 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":"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"}
@@ -1,66 +0,0 @@
1
- "use client";
2
- import { t as e } from "./utils-l5LpDw2z.js";
3
- import { n as t } from "./buttons-SbIcm1HJ.js";
4
- import { t as n } from "./structure-DC2dygdA.js";
5
- import { a as r, c as i, f as a, l as o, u as s } from "./smart-card-lFKxn5Hu.js";
6
- import { t as c } from "./action-menu-TzCoSlwL.js";
7
- import { t as l } from "./separator-C8DlRGwF.js";
8
- import { forwardRef as u } from "react";
9
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
10
- //#region src/components/base/cards/partials/smart-card-skeleton.tsx
11
- function p({ title: t, lines: c = 2, className: l }) {
12
- let u = ({ barClassName: t }) => /* @__PURE__ */ d("div", { className: e("animate-pulse rounded-radius-xs bg-muted", t) });
13
- return /* @__PURE__ */ f(o, {
14
- className: e("smart-card-skeleton--component", a.card, "gap-space-xl py-surface", l),
15
- children: [/* @__PURE__ */ d(i, {
16
- className: "flex-col gap-normal px-surface pb-0",
17
- children: t ? /* @__PURE__ */ d(s, { children: t }) : /* @__PURE__ */ d(u, { barClassName: "h-4 w-32" })
18
- }), /* @__PURE__ */ d(r, {
19
- className: "px-surface py-0",
20
- children: /* @__PURE__ */ d(n, {
21
- gap: "lg",
22
- children: Array.from({ length: c }, (t, n) => /* @__PURE__ */ d(u, { barClassName: e("h-4", n === 0 ? "w-full" : "w-3/4") }, `skel-${String(n)}`))
23
- })
24
- })]
25
- });
26
- }
27
- p.displayName = "SmartCardSkeleton";
28
- //#endregion
29
- //#region src/components/base/cards/card-actions.tsx
30
- var m = u(function({ children: n, icon: r, hidden: i = !1, fullWidth: a = !0, className: o, ...s }, c) {
31
- return i ? null : /* @__PURE__ */ d(t, {
32
- ref: c,
33
- type: "button",
34
- tone: "primary",
35
- fullWidth: a,
36
- icon: r,
37
- className: e("card-primary-action--component", o),
38
- ...s,
39
- children: n
40
- });
41
- });
42
- function h({ actions: t, separator: n = !1, align: r = "start", compact: i = !1, fullWidthPrimary: a = !1, className: o, buttonClassName: s, renderLink: u }) {
43
- let p = t.filter((e) => e.visible !== !1);
44
- if (p.length === 0) return null;
45
- let m = {
46
- start: "justify-start",
47
- end: "justify-end",
48
- between: "justify-between",
49
- stretch: "justify-stretch"
50
- }[r];
51
- return /* @__PURE__ */ f("div", {
52
- className: e("card-action-strip--component", o),
53
- children: [!!n && /* @__PURE__ */ d(l, { className: e(i ? "mb-space-sm" : "mb-space-md") }), /* @__PURE__ */ d(c, {
54
- actions: p,
55
- size: i ? "sm" : "md",
56
- className: e("flex-wrap", m, r === "stretch" && "[&>.base-button--component]:flex-1", a && "[&>.base-button--component:first-child]:flex-1"),
57
- buttonClassName: e(i ? "min-w-0" : "min-w-24", s),
58
- renderLink: u
59
- })]
60
- });
61
- }
62
- m.displayName = "CardPrimaryAction", h.displayName = "CardActionStrip";
63
- //#endregion
64
- export { m as n, p as r, h as t };
65
-
66
- //# sourceMappingURL=cards-CiiHpKYd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cards-CiiHpKYd.js","names":["cn","Button","Stack","CardContent","CardHeader","SURFACE_CLASSES","CardShell","CardTitle","ActionButtons","Separator","SmartCardSkeleton","SkeletonBar","barClassName","className","title","lines","i","CardPrimaryAction","forwardRef","props","hidden","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 type { ReactNode } from 'react';\n\nimport { Stack } from '../../structure';\nimport { cn } from '../../../../lib/utils';\n\nimport { SURFACE_CLASSES } from '../smart-card.tokens';\n\nimport { CardContent, CardHeader, CardShell, CardTitle } from './card-primitives';\n\nexport interface SmartCardSkeletonProps {\n\t/** Surface title. */\n\ttitle?: ReactNode;\n\tlines?: number;\n\tclassName?: string;\n}\n\nexport function SmartCardSkeleton({ title, lines = 2, className }: SmartCardSkeletonProps) {\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\tclassName={cn('smart-card-skeleton--component', SURFACE_CLASSES.card, 'gap-space-xl 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{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":";;;;;;;;;;AAqBA,SAAgBU,EAAkB,EAAE,UAAO,WAAQ,GAAG,gBAAqC;CAC1F,IAAMC,KAAe,EAAE,sBACtB,kBAAC,OAAD,EAAK,WAAWX,EAAG,4CAA4CY,CAAY,EAAI,CAAA;CAGhF,OACC,kBAACN,GAAD;EACC,WAAWN,EAAG,kCAAkCK,EAAgB,MAAM,2BAA2BQ,CAAS;EAD3G,UAAA,CAGC,kBAACT,GAAD;GAAY,WAAU;GACpB,UAAAU,IAAQ,kBAACP,GAAD,EAAA,UAAYO,EAAiB,CAAA,IAAI,kBAACH,GAAD,EAAa,cAAa,WAAY,CAAA;EACrE,CAAA,GACZ,kBAACR,GAAD;GAAa,WAAU;GACtB,UAAA,kBAACD,GAAD;IAAO,KAAI;IACT,UAAA,MAAM,KAAK,EAAE,QAAQa,EAAM,IAAI,GAAG,MAClC,kBAACJ,GAAD,EAAuC,cAAcX,EAAG,OAAOgB,MAAM,IAAI,WAAW,OAAO,EAAI,GAA7E,QAAQ,OAAOA,CAAC,GAA6D,CAC/F;GACK,CAAA;EACK,CAAA,CACH;;AAEb;AAEA,EAAkB,cAAc;;;ACfhC,IAAaC,IAAoBC,EAAsD,SAA2B,EACjH,aACA,SACA,YAAS,IACT,eAAY,IACZ,cACA,GAAGC,KACuB,GAAK;CAG/B,OAFIC,IAAe,OAGlB,kBAACnB,GAAD;EACM;EACL,MAAK;EACL,MAAK;EACM;EACL;EACN,WAAWD,EAAG,kCAAkCa,CAAS;EACzD,GAAIM;EAEH;CACM,CAAA;AAEV,CAAC;AAoBD,SAAgBE,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,WAAW1B,EAAG,gCAAgCa,CAAS;EAA5D,UAAA,CACE,CAAC,CAACc,KAAa,kBAAClB,GAAD,EAAW,WAAWT,EAAG4B,IAAU,gBAAgB,aAAa,EAAI,CAAA,GACpF,kBAACpB,GAAD;GACC,SAASc;GACT,MAAMM,IAAU,OAAO;GACvB,WAAW5B,EACV,aACAyB,GACAC,MAAU,aAAa,sCACvBG,KAAoB,gDACrB;GACA,iBAAiB7B,EAChB4B,IAAU,YAAY,YACtBE,CACD;GACY;EACZ,CAAA,CACG;;AAEP;AAEA,EAAkB,cAAc,qBAChC,EAAgB,cAAc"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"chart-QfrARkXl.js","names":["React","_Fragment","NumberValue","cn","Text","surfaceInsetClasses","Number","React$1","Fragment$1","RechartsPrimitive","THEMES","INITIAL_DIMENSION","ChartContext","useChart","context","ChartContainer","props","uniqueId","chartId","id","className","ChartStyle","colorConfig","config","item","theme","prefix","key","itemConfig","color","ChartTooltip","ChartTooltipContent","tooltipLabel","hideLabel","payload","labelKey","getPayloadConfigFromPayload","value","label","labelFormatter","labelClassName","active","nestLabel","indicator","popoverRecipes","nameKey","payloadFill","indicatorColor","formatter","index","hideIndicator","ChartLegend","ChartLegendContent","verticalAlign","fallbackLabel","hideIcon","payloadPayload","configLabelKey"],"sources":["../src/components/base/chart/chart.tsx"],"sourcesContent":["/**\n * Chart — Recharts helpers with shadcn-compatible configuration.\n *\n * Localized from the shadcn/ReUI chart helper into the base layer so chart\n * chrome uses this library's tokens, tooltip density, and BEM DOM hooks.\n * The Recharts peer stays isolated to the exact `base/chart` entrypoint.\n */\nimport * as React from 'react';\nimport * as RechartsPrimitive from 'recharts';\n\nimport { Number as NumberValue } from '../../primitives';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { popoverRecipes, surfaceInsetClasses } from '../popover/popover.recipes';\n\nconst THEMES = { light: '', dark: '.dark' } as const;\nconst INITIAL_DIMENSION = { width: 320, height: 200 } as const;\n\nexport type ChartConfig = Record<\n\tstring,\n\t{\n\t\t/** Axis label for the hovered position. Supplied by Recharts. */\n\t\tlabel?: React.ReactNode;\n\t\t/** Leading glyph. */\n\t\ticon?: React.ComponentType;\n\t} & (\n\t\t| { color?: string; theme?: never }\n\t\t| { color?: never; theme: Record<keyof typeof THEMES, string> }\n\t)\n>;\n\nexport type ChartPayloadItem = {\n\tdataKey?: string | number;\n\t/** Series name. */\n\tname?: string | number;\n\t/** The series value at the hovered point. */\n\tvalue?: string | number | Array<string | number>;\n\ttype?: string;\n\t/** Overrides the colour of the tooltip indicator. */\n\tcolor?: string;\n\tfill?: string;\n\t/** The raw data row for the hovered point. Supplied by Recharts. */\n\tpayload?: Record<string, unknown>;\n};\n\nexport interface ChartInitialDimension {\n\twidth: number;\n\theight: number;\n}\n\ninterface ChartContextProps {\n\t/** Maps each data key to its label, colour, and icon. */\n\tconfig: ChartConfig;\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null);\n\nfunction useChart(): ChartContextProps {\n\tconst context = React.useContext(ChartContext);\n\n\tif (!context) {\n\t\tthrow new Error('useChart must be used within a <ChartContainer />');\n\t}\n\n\treturn context;\n}\n\nexport interface ChartContainerProps extends React.ComponentPropsWithoutRef<'div'> {\n\t/** Maps each data key to its label, colour, and icon. */\n\tconfig: ChartConfig;\n\tchildren: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>['children'];\n\t/** Starting width and height, so the chart renders before its container is measured. */\n\tinitialDimension?: ChartInitialDimension;\n}\n\nfunction ChartContainer({\n\tid,\n\tclassName,\n\tchildren,\n\tconfig,\n\tinitialDimension = INITIAL_DIMENSION,\n\t...props\n}: ChartContainerProps) {\n\tconst uniqueId = React.useId();\n\tconst chartId = `chart-${id ?? uniqueId.replace(/:/g, '')}`;\n\n\treturn (\n\t\t<ChartContext.Provider value={{ config }}>\n\t\t\t<div\n\t\t\t\tdata-slot=\"chart\"\n\t\t\t\tdata-chart={chartId}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'chart--component flex aspect-video w-full min-w-0 justify-center text-xs',\n\t\t\t\t\t'[&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-axis-tick-label]:fill-muted-foreground [&_.recharts-cartesian-axis-tick-value]:fill-muted-foreground',\n\t\t\t\t\t\"[&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50\",\n\t\t\t\t\t'[&_.recharts-curve.recharts-tooltip-cursor]:stroke-border',\n\t\t\t\t\t'[&_.recharts-dot[stroke=\"#fff\"]]:stroke-transparent',\n\t\t\t\t\t'[&_.recharts-layer]:outline-hidden',\n\t\t\t\t\t\"[&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border\",\n\t\t\t\t\t'[&_.recharts-radial-bar-background-sector]:fill-muted',\n\t\t\t\t\t'[&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted',\n\t\t\t\t\t\"[&_.recharts-reference-line_[stroke='#ccc']]:stroke-border\",\n\t\t\t\t\t'[&_.recharts-sector]:outline-hidden',\n\t\t\t\t\t'[&_.recharts-sector[stroke=\"#fff\"]]:stroke-transparent',\n\t\t\t\t\t'[&_.recharts-surface]:outline-hidden',\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<ChartStyle id={chartId} config={config} />\n\t\t\t\t<RechartsPrimitive.ResponsiveContainer initialDimension={initialDimension}>\n\t\t\t\t\t{children}\n\t\t\t\t</RechartsPrimitive.ResponsiveContainer>\n\t\t\t</div>\n\t\t</ChartContext.Provider>\n\t);\n}\n\nfunction ChartStyle({ id, config }: { id: string; config: ChartConfig }) {\n\tconst colorConfig = Object.entries(config).filter(([, item]) => item.theme ?? item.color);\n\n\tif (!colorConfig.length) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<style\n\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t__html: Object.entries(THEMES)\n\t\t\t\t\t.map(\n\t\t\t\t\t\t([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n\t.map(([key, itemConfig]) => {\n\t\tconst color =\n\t\t\titemConfig.theme?.[theme as keyof typeof itemConfig.theme] ??\n\t\t\titemConfig.color;\n\t\treturn color ? ` --color-${key}: ${color};` : null;\n\t})\n\t.join('\\n')}\n}\n`,\n\t\t\t\t\t)\n\t\t\t\t\t.join('\\n'),\n\t\t\t}}\n\t\t/>\n\t);\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip;\n\nexport interface ChartTooltipContentProps extends React.ComponentPropsWithoutRef<'div'> {\n\t/** Whether the tooltip is showing. Supplied by Recharts. */\n\tactive?: boolean;\n\t/** Data points under the cursor. Supplied by Recharts. */\n\tpayload?: ChartPayloadItem[];\n\t/** Axis label for the hovered position. Supplied by Recharts. */\n\tlabel?: React.ReactNode;\n\t/** Merged onto the tooltip label. */\n\tlabelClassName?: string;\n\t/** Formats the tooltip label. */\n\tlabelFormatter?: (label: React.ReactNode, payload: ChartPayloadItem[]) => React.ReactNode;\n\t/** Formats each tooltip value. */\n\tformatter?: (\n\t\t/** The series value at the hovered point. */\n\t\tvalue: NonNullable<ChartPayloadItem['value']>,\n\t\t/** Series name. */\n\t\tname: NonNullable<ChartPayloadItem['name']>,\n\t\titem: ChartPayloadItem,\n\t\tindex: number,\n\t\t/** The raw data row for the hovered point. Supplied by Recharts. */\n\t\tpayload?: Record<string, unknown>,\n\t) => React.ReactNode;\n\t/** Overrides the colour of the tooltip indicator. */\n\tcolor?: string;\n\t/** Hides the tooltip label row. */\n\thideLabel?: boolean;\n\t/** Hides the colour indicator beside each value. */\n\thideIndicator?: boolean;\n\t/** Shape of the colour indicator. */\n\tindicator?: 'line' | 'dot' | 'dashed';\n\t/** Key in the payload holding each series name. */\n\tnameKey?: string;\n\t/** Key in the payload holding the tooltip label. */\n\tlabelKey?: string;\n}\n\nfunction ChartTooltipContent({\n\tactive,\n\tpayload,\n\tclassName,\n\tindicator = 'dot',\n\thideLabel = false,\n\thideIndicator = false,\n\tlabel,\n\tlabelFormatter,\n\tlabelClassName,\n\tformatter,\n\tcolor,\n\tnameKey,\n\tlabelKey,\n}: ChartTooltipContentProps) {\n\tconst { config } = useChart();\n\n\tconst tooltipLabel = React.useMemo(() => {\n\t\tif (hideLabel || !payload?.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst [item] = payload;\n\t\tconst key = `${labelKey ?? item?.dataKey ?? item?.name ?? 'value'}`;\n\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key);\n\t\tconst value =\n\t\t\t!labelKey && typeof label === 'string'\n\t\t\t\t? (config[label]?.label ?? label)\n\t\t\t\t: itemConfig?.label;\n\n\t\tif (labelFormatter) {\n\t\t\treturn (\n\t\t\t\t<Text\n\t\t\t\t\ttag=\"div\"\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\tclassName={cn('chart--tooltip-label', labelClassName)}\n\t\t\t\t>\n\t\t\t\t\t{labelFormatter(value, payload)}\n\t\t\t\t</Text>\n\t\t\t);\n\t\t}\n\n\t\tif (!value) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn (\n\t\t\t<Text\n\t\t\t\ttag=\"div\"\n\t\t\t\tsize=\"xs\"\n\t\t\t\tweight=\"medium\"\n\t\t\t\tclassName={cn('chart--tooltip-label', labelClassName)}\n\t\t\t>\n\t\t\t\t{value}\n\t\t\t</Text>\n\t\t);\n\t}, [\n\t\tlabel,\n\t\tlabelFormatter,\n\t\tpayload,\n\t\thideLabel,\n\t\tlabelClassName,\n\t\tconfig,\n\t\tlabelKey,\n\t]);\n\n\tif (!active || !payload?.length) {\n\t\treturn null;\n\t}\n\n\tconst nestLabel = payload.length === 1 && indicator !== 'dot';\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t// The shared anchored-surface chrome (border, fill, elevation) of popovers and menus.\n\t\t\t\t'chart--tooltip grid min-w-32 items-start gap-space-sm text-xs',\n\t\t\t\tpopoverRecipes.surface,\n\t\t\t\tsurfaceInsetClasses.compact,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{!nestLabel && tooltipLabel}\n\t\t\t<div className=\"grid gap-space-sm\">\n\t\t\t\t{payload\n\t\t\t\t\t.filter((item) => item.type !== 'none')\n\t\t\t\t\t.map((item, index) => {\n\t\t\t\t\t\tconst key = `${nameKey ?? item.name ?? item.dataKey ?? 'value'}`;\n\t\t\t\t\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key);\n\t\t\t\t\t\tconst payloadFill =\n\t\t\t\t\t\t\ttypeof item.payload?.fill === 'string'\n\t\t\t\t\t\t\t\t? item.payload.fill\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tconst indicatorColor = color ?? payloadFill ?? item.color ?? item.fill;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={`${item.dataKey ?? item.name ?? 'value'}-${index}`}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'chart--tooltip-item flex w-full flex-wrap items-stretch gap-space-md [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground',\n\t\t\t\t\t\t\t\t\tindicator === 'dot' && 'items-center',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{!!formatter && item.value !== undefined && item.name !== undefined ? (\n\t\t\t\t\t\t\t\t\tformatter(item.value, item.name, item, index, item.payload)\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{itemConfig?.icon ? (\n\t\t\t\t\t\t\t\t\t\t\t<itemConfig.icon />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t!hideIndicator && (\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'shrink-0 rounded-[2px] border-[var(--color-border)] bg-[var(--color-bg)]',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tindicator === 'dot' && 'size-2.5',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tindicator === 'line' && 'h-3 w-1',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tindicator === 'dashed' &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'h-0 w-0 border-[1.5px] border-dashed bg-transparent',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnestLabel && indicator === 'dashed' && 'my-0.5',\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'--color-bg': indicatorColor,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'--color-border': indicatorColor,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t} as React.CSSProperties\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'flex flex-1 justify-between gap-space-lg leading-none',\n\t\t\t\t\t\t\t\t\t\t\t\tnestLabel ? 'items-end' : 'items-center',\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"grid gap-space-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t{nestLabel && tooltipLabel}\n\t\t\t\t\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\t\t\t\t{itemConfig?.label ?? item.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{item.value !== undefined && (\n\t\t\t\t\t\t\t\t\t\t\t\ttypeof item.value === 'number' ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NumberValue value={item.value} size=\"xs\" weight=\"medium\" align=\"right\" />\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Ranges and formatted values stay in the sans UI font with tabular figures.\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{Array.isArray(item.value) ? item.value.join(' - ') : String(item.value)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\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</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nconst ChartLegend = RechartsPrimitive.Legend;\n\nexport interface ChartLegendContentProps extends React.ComponentPropsWithoutRef<'div'> {\n\thideIcon?: boolean;\n\t/** Legend entries, one per series. Supplied by Recharts. */\n\tpayload?: ChartPayloadItem[];\n\tverticalAlign?: 'top' | 'bottom' | 'middle';\n\t/** Key in the payload holding each series name. */\n\tnameKey?: string;\n}\n\nfunction ChartLegendContent({\n\tclassName,\n\thideIcon = false,\n\tpayload,\n\tverticalAlign = 'bottom',\n\tnameKey,\n}: ChartLegendContentProps) {\n\tconst { config } = useChart();\n\n\tif (!payload?.length) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'chart--legend flex flex-wrap items-center justify-center gap-x-space-xl gap-y-space-md text-xs',\n\t\t\t\tverticalAlign === 'top' ? 'pb-space-lg' : 'pt-space-lg',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{payload\n\t\t\t\t.filter((item) => item.type !== 'none')\n\t\t\t\t.map((item, index) => {\n\t\t\t\t\tconst key = `${nameKey ?? item.dataKey ?? 'value'}`;\n\t\t\t\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key);\n\t\t\t\t\tconst fallbackLabel = item.value ?? item.name ?? item.dataKey ?? key;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={`${item.value ?? key}-${index}`}\n\t\t\t\t\t\t\tclassName=\"chart--legend-item flex items-center gap-space-sm [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{itemConfig?.icon && !hideIcon ? (\n\t\t\t\t\t\t\t\t<itemConfig.icon />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName=\"h-2 w-2 shrink-0 rounded-[2px]\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tbackgroundColor: item.color,\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)}\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\">\n\t\t\t\t\t\t\t\t{itemConfig?.label ?? fallbackLabel}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t</div>\n\t);\n}\n\nfunction getPayloadConfigFromPayload(\n\tconfig: ChartConfig,\n\tpayload: unknown,\n\tkey: string,\n) {\n\tif (typeof payload !== 'object' || payload === null) {\n\t\treturn undefined;\n\t}\n\n\tconst payloadPayload =\n\t\t'payload' in payload &&\n\t\ttypeof payload.payload === 'object' &&\n\t\tpayload.payload !== null\n\t\t\t? payload.payload\n\t\t\t: undefined;\n\n\tlet configLabelKey = key;\n\n\tif (\n\t\tkey in payload &&\n\t\ttypeof payload[key as keyof typeof payload] === 'string'\n\t) {\n\t\tconfigLabelKey = payload[key as keyof typeof payload] as string;\n\t} else if (\n\t\tpayloadPayload &&\n\t\tkey in payloadPayload &&\n\t\ttypeof payloadPayload[key as keyof typeof payloadPayload] === 'string'\n\t) {\n\t\tconfigLabelKey = payloadPayload[\n\t\t\tkey as keyof typeof payloadPayload\n\t\t] as string;\n\t}\n\n\treturn configLabelKey in config ? config[configLabelKey] : config[key];\n}\n\nexport {\n\tChartContainer,\n\tChartTooltip,\n\tChartTooltipContent,\n\tChartLegend,\n\tChartLegendContent,\n\tChartStyle,\n};\n"],"mappings":"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"}