themelia-react-ui 2.0.5 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (489) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/MIGRATION.md +119 -0
  3. package/README.md +13 -6
  4. package/dist/{accordion-B9MHG0cT.js → accordion-0tQUZ20r.js} +7 -7
  5. package/dist/accordion-0tQUZ20r.js.map +1 -0
  6. package/dist/{action-menu-Dr8K-ghE.js → action-menu-C0gjzLyE.js} +7 -7
  7. package/dist/{action-menu-Dr8K-ghE.js.map → action-menu-C0gjzLyE.js.map} +1 -1
  8. package/dist/{ai-artifact-C58tQcBy.js → ai-artifact-CGGpQryR.js} +172 -157
  9. package/dist/ai-artifact-CGGpQryR.js.map +1 -0
  10. package/dist/{app-shell-B_IuNWOo.js → app-shell-EHuuRDGy.js} +5 -5
  11. package/dist/{app-shell-B_IuNWOo.js.map → app-shell-EHuuRDGy.js.map} +1 -1
  12. package/dist/{attachment-Dg_69lPS.js → attachment-BCpA4e7i.js} +8 -8
  13. package/dist/{attachment-Dg_69lPS.js.map → attachment-BCpA4e7i.js.map} +1 -1
  14. package/dist/{auth-DTkkshS8.js → auth-B0girIk_.js} +15 -15
  15. package/dist/auth-B0girIk_.js.map +1 -0
  16. package/dist/{avatar-CeZaFmNH.js → avatar-B9Jnp-T-.js} +3 -3
  17. package/dist/{avatar-CeZaFmNH.js.map → avatar-B9Jnp-T-.js.map} +1 -1
  18. package/dist/{badge-xIiV_E7f.js → badge-wWauMgAt.js} +3 -3
  19. package/dist/{badge-xIiV_E7f.js.map → badge-wWauMgAt.js.map} +1 -1
  20. package/dist/base/accordion.js +1 -1
  21. package/dist/base/action-menu.js +1 -1
  22. package/dist/base/attachment.js +1 -1
  23. package/dist/base/avatar.js +1 -1
  24. package/dist/base/badge.js +1 -1
  25. package/dist/base/batch-action-bar.js +1 -1
  26. package/dist/base/buttons.js +1 -1
  27. package/dist/base/cards.js +2 -2
  28. package/dist/base/carousel.js +3 -3
  29. package/dist/base/cascader.js +1 -1
  30. package/dist/base/chart.js +1 -1
  31. package/dist/base/choice-inputs.js +2 -2
  32. package/dist/base/code-block.js +1 -1
  33. package/dist/base/combobox.js +1 -1
  34. package/dist/base/command.js +1 -1
  35. package/dist/base/copyable.js +1 -1
  36. package/dist/base/date-pickers.js +2 -2
  37. package/dist/base/display.js +6 -6
  38. package/dist/base/feedback.js +4 -4
  39. package/dist/base/forms-numeric.js +1 -1
  40. package/dist/base/forms.js +2 -2
  41. package/dist/base/inline-edit.js +8 -8
  42. package/dist/base/item.js +1 -1
  43. package/dist/base/media-gallery.js +1 -1
  44. package/dist/base/metadata-list.js +1 -1
  45. package/dist/base/navigation.js +6 -6
  46. package/dist/base/popover-menu.js +1 -1
  47. package/dist/base/popover.js +1 -1
  48. package/dist/base/qr-code.js +1 -1
  49. package/dist/base/repeaters.js +195 -188
  50. package/dist/base/repeaters.js.map +1 -1
  51. package/dist/base/sheet.js +1 -1
  52. package/dist/base/sidebar.js +2 -2
  53. package/dist/base/signature-pad.js +7 -7
  54. package/dist/base/skeleton.js +1 -1
  55. package/dist/base/spinner.js +5 -5
  56. package/dist/base/spinner.js.map +1 -1
  57. package/dist/base/structure.js +1 -1
  58. package/dist/base/table.js +1 -1
  59. package/dist/base/text-inputs.js +2 -2
  60. package/dist/base/toaster.js +1 -1
  61. package/dist/base/tree.js +1 -1
  62. package/dist/base/upload-queue.js +1 -1
  63. package/dist/base/upload.js +3 -3
  64. package/dist/base/value-inputs.js +1 -1
  65. package/dist/{batch-action-bar-Cb8cuvyy.js → batch-action-bar-BoqWIIpV.js} +5 -5
  66. package/dist/{batch-action-bar-Cb8cuvyy.js.map → batch-action-bar-BoqWIIpV.js.map} +1 -1
  67. package/dist/blocks/admin.js +17 -17
  68. package/dist/blocks/ai.js +227 -221
  69. package/dist/blocks/ai.js.map +1 -1
  70. package/dist/blocks/analytics/usage-card.js +1 -1
  71. package/dist/blocks/analytics.js +424 -449
  72. package/dist/blocks/analytics.js.map +1 -1
  73. package/dist/blocks/collaboration.js +1 -1
  74. package/dist/blocks/commerce/receipt.js +1 -1
  75. package/dist/blocks/commerce.js +225 -220
  76. package/dist/blocks/commerce.js.map +1 -1
  77. package/dist/blocks/data-display.js +2 -2
  78. package/dist/blocks/onboarding.js +5 -5
  79. package/dist/blocks/planning.js +11 -11
  80. package/dist/blocks/timelines.js +1 -1
  81. package/dist/{breadcrumbs-J-K2kl4c.js → breadcrumbs-Bp9Ke7kd.js} +4 -4
  82. package/dist/breadcrumbs-Bp9Ke7kd.js.map +1 -0
  83. package/dist/{button-S2Cubiiz.js → button-ChBovTx0.js} +2 -2
  84. package/dist/{button-S2Cubiiz.js.map → button-ChBovTx0.js.map} +1 -1
  85. package/dist/{buttons-BedGfygC.js → buttons-DeW0bQeK.js} +6 -6
  86. package/dist/{buttons-BedGfygC.js.map → buttons-DeW0bQeK.js.map} +1 -1
  87. package/dist/{cards-rNX1M4Xn.js → cards-CNXnmvV5.js} +8 -8
  88. package/dist/{cards-rNX1M4Xn.js.map → cards-CNXnmvV5.js.map} +1 -1
  89. package/dist/{cascader-B1MiqkBq.js → cascader-CrAl9zD5.js} +15 -15
  90. package/dist/{cascader-B1MiqkBq.js.map → cascader-CrAl9zD5.js.map} +1 -1
  91. package/dist/{chart-Darg_0Kv.js → chart-I7ROnsl8.js} +5 -5
  92. package/dist/{chart-Darg_0Kv.js.map → chart-I7ROnsl8.js.map} +1 -1
  93. package/dist/{checkbox-fflqmODR.js → checkbox-MoyHIAPs.js} +3 -3
  94. package/dist/{checkbox-fflqmODR.js.map → checkbox-MoyHIAPs.js.map} +1 -1
  95. package/dist/{choice-inputs-zUgBZfE4.js → choice-inputs-DHGtx0QV.js} +122 -110
  96. package/dist/choice-inputs-DHGtx0QV.js.map +1 -0
  97. package/dist/{code-block-BzmM9Eig.js → code-block-BSJyq9e-.js} +7 -7
  98. package/dist/{code-block-BzmM9Eig.js.map → code-block-BSJyq9e-.js.map} +1 -1
  99. package/dist/{collapsible-BkAI_XD4.js → collapsible-BzJ91LUG.js} +3 -3
  100. package/dist/{collapsible-BkAI_XD4.js.map → collapsible-BzJ91LUG.js.map} +1 -1
  101. package/dist/{collection-content-gDh1v6O4.js → collection-content-CSnwtOTH.js} +3 -3
  102. package/dist/{collection-content-gDh1v6O4.js.map → collection-content-CSnwtOTH.js.map} +1 -1
  103. package/dist/{combobox-BEx0vJgF.js → combobox-Bcvu5J8O.js} +11 -10
  104. package/dist/{combobox-BEx0vJgF.js.map → combobox-Bcvu5J8O.js.map} +1 -1
  105. package/dist/combobox-C2JiSQPc.js +915 -0
  106. package/dist/combobox-C2JiSQPc.js.map +1 -0
  107. package/dist/{command-CrlPIL6m.js → command-9e52NPgK.js} +6 -6
  108. package/dist/{command-CrlPIL6m.js.map → command-9e52NPgK.js.map} +1 -1
  109. package/dist/{comments-Dmpp0YIc.js → comments-BsgErEqd.js} +33 -28
  110. package/dist/comments-BsgErEqd.js.map +1 -0
  111. package/dist/components/base/choice-inputs/choice-types.d.ts +4 -0
  112. package/dist/components/base/choice-inputs/pill-radio-group.d.ts +7 -6
  113. package/dist/components/base/combobox/combobox-field.d.ts +2 -2
  114. package/dist/components/base/date-pickers/date-picker-internals.d.ts +3 -1
  115. package/dist/components/base/date-pickers/datepicker.types.d.ts +10 -4
  116. package/dist/components/base/date-pickers/time-picker.d.ts +17 -3
  117. package/dist/components/base/feedback/state-display.d.ts +5 -1
  118. package/dist/components/base/feedback/state-display.strings.d.ts +9 -0
  119. package/dist/components/base/forms/form-field.d.ts +7 -2
  120. package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -1
  121. package/dist/components/base/forms-numeric/decimal-input.d.ts +2 -2
  122. package/dist/components/base/forms-numeric/dimensions-input.d.ts +4 -1
  123. package/dist/components/base/forms-numeric/numeric-composite-field.d.ts +12 -0
  124. package/dist/components/base/forms-numeric/weight-input.d.ts +6 -1
  125. package/dist/components/base/navigation/language-switcher.d.ts +12 -4
  126. package/dist/components/base/repeaters/key-value-editor.d.ts +2 -1
  127. package/dist/components/base/sidebar/sidebar.d.ts +2 -0
  128. package/dist/components/base/upload/avatar-upload.d.ts +2 -1
  129. package/dist/components/base/upload/image-upload.d.ts +2 -1
  130. package/dist/components/blocks/ai/ai-citation/types.d.ts +2 -0
  131. package/dist/components/blocks/ai/ai-reasoning/types.d.ts +2 -0
  132. package/dist/components/blocks/ai/ai-sources/types.d.ts +2 -0
  133. package/dist/components/blocks/ai/ai-tool-call/types.d.ts +2 -0
  134. package/dist/components/blocks/analytics/metric/metric.d.ts +4 -0
  135. package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
  136. package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +4 -5
  137. package/dist/components/blocks/analytics/types.d.ts +2 -2
  138. package/dist/components/blocks/commerce/order-status/types.d.ts +4 -0
  139. package/dist/components/blocks/data-display/empty-state/empty-state.types.d.ts +4 -3
  140. package/dist/components/features/activities/activities.types.d.ts +18 -11
  141. package/dist/components/features/activities/hooks/use-activity-resources.d.ts +2 -1
  142. package/dist/components/features/ai-chat/hooks/use-ai-chat-scroll.d.ts +1 -1
  143. package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +1 -1
  144. package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +4 -2
  145. package/dist/components/features/combobox/async-resource-combobox.d.ts +2 -2
  146. package/dist/components/features/combobox/combobox.d.ts +2 -2
  147. package/dist/components/features/combobox/hooks/use-combobox-core.d.ts +2 -1
  148. package/dist/components/features/combobox/hooks/use-combobox-state.d.ts +1 -0
  149. package/dist/components/features/combobox/hooks/use-load-more.d.ts +1 -0
  150. package/dist/components/features/combobox/types.d.ts +37 -8
  151. package/dist/components/features/email-composer/types.d.ts +3 -1
  152. package/dist/components/features/filters/facets/date-facet.d.ts +4 -2
  153. package/dist/components/features/filters/facets/range-facet.d.ts +12 -0
  154. package/dist/components/features/filters/filters.types.d.ts +3 -3
  155. package/dist/components/features/filters/partials/date-filter-content.d.ts +3 -2
  156. package/dist/components/features/filters/partials/filter-popover-content.d.ts +4 -2
  157. package/dist/components/features/filters/partials/range-filter-content.d.ts +12 -0
  158. package/dist/components/features/filters/utils/filter-utils.d.ts +5 -1
  159. package/dist/components/features/media-library/hooks/use-media-library.d.ts +1 -1
  160. package/dist/components/features/media-library/media-library.d.ts +1 -1
  161. package/dist/components/features/media-library/media-library.strings.d.ts +6 -0
  162. package/dist/components/features/media-library/media-library.types.d.ts +36 -8
  163. package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
  164. package/dist/components/features/mentions/hooks/use-mentions.d.ts +16 -1
  165. package/dist/components/features/mentions/partials/mention-inline-suggestions.d.ts +5 -1
  166. package/dist/components/features/mentions/utils/split-html-by-mentions.d.ts +1 -7
  167. package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +2 -2
  168. package/dist/components/features/products/products.types.d.ts +2 -2
  169. package/dist/components/features/questionnaire/questionnaire.types.d.ts +3 -0
  170. package/dist/components/features/resource/resource.d.ts +1 -1
  171. package/dist/components/features/resource/resource.types.d.ts +2 -0
  172. package/dist/components/features/rich-text-editor/form-rich-text-editor.d.ts +1 -1
  173. package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +1 -1
  174. package/dist/components/features/rich-text-editor/partials/editor-field-aria.d.ts +14 -0
  175. package/dist/components/features/rich-text-editor/partials/rich-text-editor-toolbar.d.ts +3 -1
  176. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
  177. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +17 -3
  178. package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +5 -1
  179. package/dist/components/features/schema-form/partials/schema-form-field.d.ts +3 -1
  180. package/dist/components/features/schema-form/schema-form.utils.d.ts +1 -1
  181. package/dist/components/features/suggestions/suggestions.types.d.ts +1 -1
  182. package/dist/components/features/table/data-table.d.ts +1 -1
  183. package/dist/components/features/table/index.d.ts +1 -0
  184. package/dist/components/features/table/table-body.d.ts +1 -1
  185. package/dist/components/features/table/table-helpers.d.ts +6 -3
  186. package/dist/components/features/table/table.strings.d.ts +3 -0
  187. package/dist/components/features/table/table.types.d.ts +17 -1
  188. package/dist/components/layout/header/header.types.d.ts +3 -2
  189. package/dist/components/layout/layout.types.d.ts +5 -3
  190. package/dist/components/layout/navigation/side-nav.d.ts +3 -2
  191. package/dist/components/layout/normalize-layout-path.d.ts +1 -0
  192. package/dist/components/layout/settings/settings.d.ts +1 -1
  193. package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
  194. package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +3 -1
  195. package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -0
  196. package/dist/components/layout/sidebar/sidebar.types.d.ts +2 -0
  197. package/dist/components/primitives/link.d.ts +3 -2
  198. package/dist/components/primitives/money.d.ts +1 -1
  199. package/dist/components/primitives/number.d.ts +1 -1
  200. package/dist/components/typography/rich-text/rich-text-tree.d.ts +7 -5
  201. package/dist/{containers-CIxwbZt5.js → containers-CSdc32h9.js} +2 -2
  202. package/dist/{containers-CIxwbZt5.js.map → containers-CSdc32h9.js.map} +1 -1
  203. package/dist/{copyable-DIznBqiT.js → copyable-3fdHfMR3.js} +4 -4
  204. package/dist/{copyable-DIznBqiT.js.map → copyable-3fdHfMR3.js.map} +1 -1
  205. package/dist/{data-display-BdgCAw8T.js → data-display-Cmj-xZYl.js} +16 -15
  206. package/dist/data-display-Cmj-xZYl.js.map +1 -0
  207. package/dist/{date-Cq8ioE4o.js → date-Br0FicVv.js} +4 -4
  208. package/dist/{date-Cq8ioE4o.js.map → date-Br0FicVv.js.map} +1 -1
  209. package/dist/date-picker-CyQlFYsP.js +1617 -0
  210. package/dist/date-picker-CyQlFYsP.js.map +1 -0
  211. package/dist/date-pickers-tj2MXmXd.js +185 -0
  212. package/dist/date-pickers-tj2MXmXd.js.map +1 -0
  213. package/dist/{display-KsZLw9Ov.js → display-CT_N2a3w.js} +7 -7
  214. package/dist/{display-KsZLw9Ov.js.map → display-CT_N2a3w.js.map} +1 -1
  215. package/dist/{dropdown-menu-CLs8Lihj.js → dropdown-menu-C08iIugv.js} +6 -6
  216. package/dist/{dropdown-menu-CLs8Lihj.js.map → dropdown-menu-C08iIugv.js.map} +1 -1
  217. package/dist/features/activities.js +283 -270
  218. package/dist/features/activities.js.map +1 -1
  219. package/dist/features/ai-chat.js +40 -27
  220. package/dist/features/ai-chat.js.map +1 -1
  221. package/dist/features/appointment-calendar.js +126 -126
  222. package/dist/features/appointment-calendar.js.map +1 -1
  223. package/dist/features/async-preview.js +9 -9
  224. package/dist/features/combobox.js +1 -1
  225. package/dist/features/comments.js +1 -1
  226. package/dist/features/data-view.js +10 -10
  227. package/dist/features/email-composer.js +24 -19
  228. package/dist/features/email-composer.js.map +1 -1
  229. package/dist/features/event-calendar.js +129 -125
  230. package/dist/features/event-calendar.js.map +1 -1
  231. package/dist/features/filters.js +2 -2
  232. package/dist/features/global-search.js +16 -20
  233. package/dist/features/global-search.js.map +1 -1
  234. package/dist/features/kanban.js +18 -28
  235. package/dist/features/kanban.js.map +1 -1
  236. package/dist/features/map/style.css +15 -0
  237. package/dist/features/map.js +331 -314
  238. package/dist/features/map.js.map +1 -1
  239. package/dist/features/media-library.js +1044 -866
  240. package/dist/features/media-library.js.map +1 -1
  241. package/dist/features/mentions.js +2 -2
  242. package/dist/features/overlays.js +1 -1
  243. package/dist/features/products.js +978 -964
  244. package/dist/features/products.js.map +1 -1
  245. package/dist/features/questionnaire.js +159 -152
  246. package/dist/features/questionnaire.js.map +1 -1
  247. package/dist/features/resource-assignment.js +8 -8
  248. package/dist/features/resource.js +74 -71
  249. package/dist/features/resource.js.map +1 -1
  250. package/dist/features/rich-text-editor.js +28 -19
  251. package/dist/features/rich-text-editor.js.map +1 -1
  252. package/dist/features/schema-form.js +297 -256
  253. package/dist/features/schema-form.js.map +1 -1
  254. package/dist/features/suggestions.js +57 -50
  255. package/dist/features/suggestions.js.map +1 -1
  256. package/dist/features/sync.js +3 -3
  257. package/dist/features/table.js +1 -1
  258. package/dist/features/theme-tweaker.js +400 -399
  259. package/dist/features/theme-tweaker.js.map +1 -1
  260. package/dist/feedback-Dzo1xtAU.js +246 -0
  261. package/dist/feedback-Dzo1xtAU.js.map +1 -0
  262. package/dist/{field-affordance-recipes-DWcNcOjh.js → field-affordance-recipes-D6H7tVJi.js} +2 -2
  263. package/dist/{field-affordance-recipes-DWcNcOjh.js.map → field-affordance-recipes-D6H7tVJi.js.map} +1 -1
  264. package/dist/field-control-attributes-B6i335wr.js +18 -0
  265. package/dist/field-control-attributes-B6i335wr.js.map +1 -0
  266. package/dist/{field-state-recipes-BVA2CWHo.js → field-state-recipes-7sza8QbC.js} +4 -2
  267. package/dist/{field-state-recipes-BVA2CWHo.js.map → field-state-recipes-7sza8QbC.js.map} +1 -1
  268. package/dist/{filters-DzgSJpMK.js → filters-Dl80yYtN.js} +763 -605
  269. package/dist/filters-Dl80yYtN.js.map +1 -0
  270. package/dist/form-field-CAPdwdnZ.js +74 -0
  271. package/dist/form-field-CAPdwdnZ.js.map +1 -0
  272. package/dist/{form-sizing-Bs2qFUeE.js → form-sizing-CgcrUbLU.js} +2 -2
  273. package/dist/{form-sizing-Bs2qFUeE.js.map → form-sizing-CgcrUbLU.js.map} +1 -1
  274. package/dist/{forms-C0RGnJTe.js → forms-B3W8CH7-.js} +8 -8
  275. package/dist/{forms-C0RGnJTe.js.map → forms-B3W8CH7-.js.map} +1 -1
  276. package/dist/forms-numeric-CwjQJe-O.js +991 -0
  277. package/dist/forms-numeric-CwjQJe-O.js.map +1 -0
  278. package/dist/{header-DMMxG__r.js → header-ZIIsRKxP.js} +113 -113
  279. package/dist/header-ZIIsRKxP.js.map +1 -0
  280. package/dist/hooks/use-files.d.ts +2 -0
  281. package/dist/{hooks-DB6CJ4MR.js → hooks-BitHSh-Y.js} +3 -3
  282. package/dist/{hooks-DB6CJ4MR.js.map → hooks-BitHSh-Y.js.map} +1 -1
  283. package/dist/{icon-badge-DZF-YjQp.js → icon-badge-npxF1SLX.js} +2 -2
  284. package/dist/{icon-badge-DZF-YjQp.js.map → icon-badge-npxF1SLX.js.map} +1 -1
  285. package/dist/index.js +1 -1
  286. package/dist/{input-CvyDQlY7.js → input-7KAc7XQL.js} +6 -6
  287. package/dist/{input-CvyDQlY7.js.map → input-7KAc7XQL.js.map} +1 -1
  288. package/dist/{input-DMBwAZmr.js → input-DIREVYHs.js} +3 -3
  289. package/dist/{input-DMBwAZmr.js.map → input-DIREVYHs.js.map} +1 -1
  290. package/dist/{interaction-recipes-XR9ZpVYL.js → interaction-recipes-4wZ2tvfb.js} +2 -2
  291. package/dist/{interaction-recipes-XR9ZpVYL.js.map → interaction-recipes-4wZ2tvfb.js.map} +1 -1
  292. package/dist/{item-DjCcM18E.js → item-FfWnaYST.js} +99 -98
  293. package/dist/item-FfWnaYST.js.map +1 -0
  294. package/dist/layout/app-shell.js +1 -1
  295. package/dist/layout/auth.js +1 -1
  296. package/dist/layout/containers.js +1 -1
  297. package/dist/layout/header.js +1 -1
  298. package/dist/layout/hooks.js +1 -1
  299. package/dist/layout/navigation.js +1 -1
  300. package/dist/layout/page.js +1 -1
  301. package/dist/layout/settings.js +1 -1
  302. package/dist/layout/sidebar.js +2 -2
  303. package/dist/layout/workspace.js +1 -1
  304. package/dist/layout.js +11 -11
  305. package/dist/layout.types-E_GAApzO.js +30 -0
  306. package/dist/layout.types-E_GAApzO.js.map +1 -0
  307. package/dist/lib/field-control-attributes.d.ts +11 -0
  308. package/dist/lib/field-state-recipes.d.ts +2 -0
  309. package/dist/lib/format.d.ts +1 -0
  310. package/dist/lib/surface-recipes.d.ts +1 -1
  311. package/dist/lib/token-merge.generated.d.ts +6 -6
  312. package/dist/lib/utils.js +1 -1
  313. package/dist/{media-gallery-C-vChPmE.js → media-gallery-C81DAnKI.js} +6 -6
  314. package/dist/{media-gallery-C-vChPmE.js.map → media-gallery-C81DAnKI.js.map} +1 -1
  315. package/dist/{mentions-0_4nWuI-.js → mentions-qOnedSt4.js} +236 -167
  316. package/dist/mentions-qOnedSt4.js.map +1 -0
  317. package/dist/message-BJHnn43M.js +135 -0
  318. package/dist/message-BJHnn43M.js.map +1 -0
  319. package/dist/{metadata-list-C3MkU-Om.js → metadata-list-XkqZ_UXH.js} +11 -11
  320. package/dist/{metadata-list-C3MkU-Om.js.map → metadata-list-XkqZ_UXH.js.map} +1 -1
  321. package/dist/{navigation-DaRjthVk.js → navigation-BgtPJAhi.js} +119 -119
  322. package/dist/navigation-BgtPJAhi.js.map +1 -0
  323. package/dist/{navigation-C90-oQFq.js → navigation-Bt-v7rWP.js} +52 -46
  324. package/dist/navigation-Bt-v7rWP.js.map +1 -0
  325. package/dist/normalize-layout-path-BmEgg6fu.js +14 -0
  326. package/dist/normalize-layout-path-BmEgg6fu.js.map +1 -0
  327. package/dist/{number-CRU3kGuk.js → number-CYqBcrSj.js} +78 -86
  328. package/dist/number-CYqBcrSj.js.map +1 -0
  329. package/dist/{overflow-tab-bar-IVFVQFV6.js → overflow-tab-bar-BQCA2Zn2.js} +7 -7
  330. package/dist/{overflow-tab-bar-IVFVQFV6.js.map → overflow-tab-bar-BQCA2Zn2.js.map} +1 -1
  331. package/dist/{overlays-BSgCtM2v.js → overlays-CC8zI3Du.js} +264 -260
  332. package/dist/overlays-CC8zI3Du.js.map +1 -0
  333. package/dist/{page-DUUKDAjo.js → page-BoQ1VaFJ.js} +13 -13
  334. package/dist/{page-DUUKDAjo.js.map → page-BoQ1VaFJ.js.map} +1 -1
  335. package/dist/{page-header-commands-7P3sfE9u.js → page-header-commands-DIKspJfx.js} +4 -4
  336. package/dist/{page-header-commands-7P3sfE9u.js.map → page-header-commands-DIKspJfx.js.map} +1 -1
  337. package/dist/{pagination-CgCjElfu.js → pagination-Br8TdV9A.js} +4 -4
  338. package/dist/{pagination-CgCjElfu.js.map → pagination-Br8TdV9A.js.map} +1 -1
  339. package/dist/{popover-B85RenIl.js → popover-k8TdUcAt.js} +10 -10
  340. package/dist/popover-k8TdUcAt.js.map +1 -0
  341. package/dist/{popover-menu-DlnQ2zlR.js → popover-menu-yn-o0kyA.js} +7 -7
  342. package/dist/{popover-menu-DlnQ2zlR.js.map → popover-menu-yn-o0kyA.js.map} +1 -1
  343. package/dist/{popover.recipes-DdiEp0rd.js → popover.recipes-DJ0AkUan.js} +2 -2
  344. package/dist/{popover.recipes-DdiEp0rd.js.map → popover.recipes-DJ0AkUan.js.map} +1 -1
  345. package/dist/{portal-recipes-BpsV_iRw.js → portal-recipes-DyUXqUtD.js} +2 -2
  346. package/dist/{portal-recipes-BpsV_iRw.js.map → portal-recipes-DyUXqUtD.js.map} +1 -1
  347. package/dist/{primitives-ByWgGUgt.js → primitives-BkkQjYl7.js} +22 -17
  348. package/dist/primitives-BkkQjYl7.js.map +1 -0
  349. package/dist/primitives.js +4 -4
  350. package/dist/{progress-BJhQP9WX.js → progress-DZFXXzPs.js} +4 -4
  351. package/dist/{progress-BJhQP9WX.js.map → progress-DZFXXzPs.js.map} +1 -1
  352. package/dist/{receipt-tOc7B3hw.js → receipt-C7LhOg7Q.js} +6 -6
  353. package/dist/{receipt-tOc7B3hw.js.map → receipt-C7LhOg7Q.js.map} +1 -1
  354. package/dist/rich-text-BnTzZjIo.js +45 -0
  355. package/dist/rich-text-BnTzZjIo.js.map +1 -0
  356. package/dist/rich-text-editor-CAurDwT5.js +1273 -0
  357. package/dist/rich-text-editor-CAurDwT5.js.map +1 -0
  358. package/dist/{rich-text-editor-toolbar-laT3tpBT.js → rich-text-editor-toolbar-DbXig7Jk.js} +36 -35
  359. package/dist/rich-text-editor-toolbar-DbXig7Jk.js.map +1 -0
  360. package/dist/rich-text-tree-BqyQ_7-R.js +66 -0
  361. package/dist/rich-text-tree-BqyQ_7-R.js.map +1 -0
  362. package/dist/{sanitize-html-DsQmI48u.js → sanitize-html-BWkH4dLM.js} +29 -16
  363. package/dist/sanitize-html-BWkH4dLM.js.map +1 -0
  364. package/dist/{scroll-area-B0dB2cBi.js → scroll-area-Bj6CRUif.js} +2 -2
  365. package/dist/{scroll-area-B0dB2cBi.js.map → scroll-area-Bj6CRUif.js.map} +1 -1
  366. package/dist/{separator-Bb17I4pu.js → separator-B9ewiCGO.js} +2 -2
  367. package/dist/{separator-Bb17I4pu.js.map → separator-B9ewiCGO.js.map} +1 -1
  368. package/dist/{separator-Ct_WSWTJ.js → separator-DM6gs2vu.js} +3 -3
  369. package/dist/{separator-Ct_WSWTJ.js.map → separator-DM6gs2vu.js.map} +1 -1
  370. package/dist/services/actions.js +1 -1
  371. package/dist/settings-DZPHgpx4.js +155 -0
  372. package/dist/settings-DZPHgpx4.js.map +1 -0
  373. package/dist/{sheet-BGPERY55.js → sheet-C4DHsgLk.js} +6 -6
  374. package/dist/{sheet-BGPERY55.js.map → sheet-C4DHsgLk.js.map} +1 -1
  375. package/dist/sidebar-C8BnDwTH.js +709 -0
  376. package/dist/sidebar-C8BnDwTH.js.map +1 -0
  377. package/dist/{sidebar-f9gRWXIR.js → sidebar-CmD6a-HK.js} +16 -13
  378. package/dist/sidebar-CmD6a-HK.js.map +1 -0
  379. package/dist/{skeleton-BapcJd9C.js → skeleton-DDgdhmu9.js} +5 -5
  380. package/dist/{skeleton-BapcJd9C.js.map → skeleton-DDgdhmu9.js.map} +1 -1
  381. package/dist/{smart-card-CW0hjetE.js → smart-card-B6vLxqa_.js} +8 -8
  382. package/dist/{smart-card-CW0hjetE.js.map → smart-card-B6vLxqa_.js.map} +1 -1
  383. package/dist/{structure-DuxKl954.js → structure-DZJ2wbAU.js} +2 -2
  384. package/dist/{structure-DuxKl954.js.map → structure-DZJ2wbAU.js.map} +1 -1
  385. package/dist/style.css +1 -1
  386. package/dist/{surface-recipes-BKRVW8Os.js → surface-recipes-C8mNycaY.js} +2 -2
  387. package/dist/{surface-recipes-BKRVW8Os.js.map → surface-recipes-C8mNycaY.js.map} +1 -1
  388. package/dist/{table-CFOWY9pQ.js → table-CBonSdTp.js} +534 -486
  389. package/dist/table-CBonSdTp.js.map +1 -0
  390. package/dist/{table-B4TE7iOV.js → table-CXSPHH25.js} +75 -71
  391. package/dist/table-CXSPHH25.js.map +1 -0
  392. package/dist/{tabs-e7ko9S2o.js → tabs-C4Kr_hCr.js} +50 -49
  393. package/dist/tabs-C4Kr_hCr.js.map +1 -0
  394. package/dist/{text-inputs-B1culiSK.js → text-inputs-jdkS3ReG.js} +9 -9
  395. package/dist/{text-inputs-B1culiSK.js.map → text-inputs-jdkS3ReG.js.map} +1 -1
  396. package/dist/{timelines-D3Sl9ueq.js → timelines-CoPwdJP0.js} +10 -10
  397. package/dist/{timelines-D3Sl9ueq.js.map → timelines-CoPwdJP0.js.map} +1 -1
  398. package/dist/{tooltip-8wz5S_Zr.js → tooltip-31NwIpTo.js} +4 -4
  399. package/dist/{tooltip-8wz5S_Zr.js.map → tooltip-31NwIpTo.js.map} +1 -1
  400. package/dist/{tree-CzUJHnFs.js → tree-CeYVzdFE.js} +6 -6
  401. package/dist/{tree-CzUJHnFs.js.map → tree-CeYVzdFE.js.map} +1 -1
  402. package/dist/typography/rich-text.js +1 -1
  403. package/dist/{typography-BQnine1k.js → typography-C7-YMW1S.js} +2 -2
  404. package/dist/{typography-BQnine1k.js.map → typography-C7-YMW1S.js.map} +1 -1
  405. package/dist/typography.js +1 -1
  406. package/dist/{upload-BOW6U2tI.js → upload-Hdm5gObf.js} +303 -291
  407. package/dist/upload-Hdm5gObf.js.map +1 -0
  408. package/dist/{upload-queue-qUXn1ykN.js → upload-queue-D0sYPuqo.js} +8 -8
  409. package/dist/{upload-queue-qUXn1ykN.js.map → upload-queue-D0sYPuqo.js.map} +1 -1
  410. package/dist/{usage-card-BeSLY0i0.js → usage-card-9s8hLDfn.js} +9 -9
  411. package/dist/{usage-card-BeSLY0i0.js.map → usage-card-9s8hLDfn.js.map} +1 -1
  412. package/dist/{utils-B6kKb8jB.js → utils-DhuoqFy4.js} +31 -37
  413. package/dist/utils-DhuoqFy4.js.map +1 -0
  414. package/dist/{value-inputs-skdVB2zh.js → value-inputs-D3aPgq9H.js} +15 -15
  415. package/dist/{value-inputs-skdVB2zh.js.map → value-inputs-D3aPgq9H.js.map} +1 -1
  416. package/dist/{value-typography-uAmWUAL1.js → value-typography-uSzzG9Gf.js} +32 -26
  417. package/dist/value-typography-uSzzG9Gf.js.map +1 -0
  418. package/dist/{workspace-DHeHv0qw.js → workspace-CC8Vchiu.js} +12 -12
  419. package/dist/{workspace-DHeHv0qw.js.map → workspace-CC8Vchiu.js.map} +1 -1
  420. package/docs/consumer-skill/examples/edit.tsx +3 -3
  421. package/docs/consumer-skill/references/agents-md.md +19 -19
  422. package/docs/consumer-skill/references/analytics.md +15 -0
  423. package/docs/consumer-skill/references/component-contracts.json +14724 -13057
  424. package/docs/consumer-skill/references/composition.md +21 -4
  425. package/docs/consumer-skill/references/design-contract.md +1 -0
  426. package/docs/consumer-skill/references/installation.md +51 -8
  427. package/docs/consumer-skill/references/integration.md +24 -1
  428. package/docs/consumer-skill/references/public-api.json +172 -34
  429. package/docs/consumer-skill/references/review.md +51 -11
  430. package/docs/consumer-skill/references/rhf-workflows.md +72 -0
  431. package/docs/consumer-skill/references/theming.md +7 -2
  432. package/docs/consumer-skill/references/tokens.json +1 -1
  433. package/docs/consumer-skill/scripts/composition-policy.mjs +144 -30
  434. package/docs/consumer-skill/scripts/setup-skills.mjs +46 -9
  435. package/package.json +4 -2
  436. package/templates/admin-shell-template.tsx +1 -2
  437. package/templates/customers-template.tsx +18 -16
  438. package/dist/accordion-B9MHG0cT.js.map +0 -1
  439. package/dist/ai-artifact-C58tQcBy.js.map +0 -1
  440. package/dist/auth-DTkkshS8.js.map +0 -1
  441. package/dist/breadcrumbs-J-K2kl4c.js.map +0 -1
  442. package/dist/choice-inputs-zUgBZfE4.js.map +0 -1
  443. package/dist/combobox-BwzoXFSG.js +0 -884
  444. package/dist/combobox-BwzoXFSG.js.map +0 -1
  445. package/dist/comments-Dmpp0YIc.js.map +0 -1
  446. package/dist/data-display-BdgCAw8T.js.map +0 -1
  447. package/dist/date-picker-RlIzKom_.js +0 -1551
  448. package/dist/date-picker-RlIzKom_.js.map +0 -1
  449. package/dist/date-pickers-DY-CpXS1.js +0 -179
  450. package/dist/date-pickers-DY-CpXS1.js.map +0 -1
  451. package/dist/feedback-Dm4izqFn.js +0 -240
  452. package/dist/feedback-Dm4izqFn.js.map +0 -1
  453. package/dist/filters-DzgSJpMK.js.map +0 -1
  454. package/dist/form-field-BriWAXyg.js +0 -63
  455. package/dist/form-field-BriWAXyg.js.map +0 -1
  456. package/dist/forms-numeric-DIhghX1Q.js +0 -910
  457. package/dist/forms-numeric-DIhghX1Q.js.map +0 -1
  458. package/dist/header-DMMxG__r.js.map +0 -1
  459. package/dist/item-DjCcM18E.js.map +0 -1
  460. package/dist/layout.types-Cn7aUzJp.js +0 -20
  461. package/dist/layout.types-Cn7aUzJp.js.map +0 -1
  462. package/dist/mentions-0_4nWuI-.js.map +0 -1
  463. package/dist/message-g8p7eVtN.js +0 -128
  464. package/dist/message-g8p7eVtN.js.map +0 -1
  465. package/dist/navigation-C90-oQFq.js.map +0 -1
  466. package/dist/navigation-DaRjthVk.js.map +0 -1
  467. package/dist/number-CRU3kGuk.js.map +0 -1
  468. package/dist/overlays-BSgCtM2v.js.map +0 -1
  469. package/dist/popover-B85RenIl.js.map +0 -1
  470. package/dist/primitives-ByWgGUgt.js.map +0 -1
  471. package/dist/rich-text-Dth5E882.js +0 -78
  472. package/dist/rich-text-Dth5E882.js.map +0 -1
  473. package/dist/rich-text-editor-C1fOjBTd.js +0 -1195
  474. package/dist/rich-text-editor-C1fOjBTd.js.map +0 -1
  475. package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +0 -1
  476. package/dist/safe-image-src-C6kQSMBZ.js +0 -17
  477. package/dist/safe-image-src-C6kQSMBZ.js.map +0 -1
  478. package/dist/sanitize-html-DsQmI48u.js.map +0 -1
  479. package/dist/settings-Bar5wiSo.js +0 -167
  480. package/dist/settings-Bar5wiSo.js.map +0 -1
  481. package/dist/sidebar-D-JYMMbY.js +0 -686
  482. package/dist/sidebar-D-JYMMbY.js.map +0 -1
  483. package/dist/sidebar-f9gRWXIR.js.map +0 -1
  484. package/dist/table-B4TE7iOV.js.map +0 -1
  485. package/dist/table-CFOWY9pQ.js.map +0 -1
  486. package/dist/tabs-e7ko9S2o.js.map +0 -1
  487. package/dist/upload-BOW6U2tI.js.map +0 -1
  488. package/dist/utils-B6kKb8jB.js.map +0 -1
  489. package/dist/value-typography-uAmWUAL1.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.js","names":["_jsxs","_Fragment","useFormattingConfig","useMoneyConfig","cn","Button","Text","focusRecipes","Grid","Stack","toneRecipes","rampRecipes","dotRecipes","Card","Progress","Skeleton","interactionRecipes","formatPercentage","formatNumber","formatDuration","Value","SecondaryValue","formatMoneyAmount","IconBadge","Badge","ChartContainer","ContentBlock","defaultUsageCardStrings","UsageCard","Fragment$1","defaultAnalyticsStrings","formatMetricValue","data","value","numeric","options","resolveTrend","TONE_CLASSES","ICON_SIZE","TEXT_SIZE","BADGE_PADDING","resolveTone","trend","direction","MetricTrendChip","tone","change","Icon","ArrowUp","ArrowDown","Minus","palette","valueText","sign","variant","size","className","query","subscribe","media","onChange","getSnapshot","getServerSnapshot","usePrefersReducedMotion","useSyncExternalStore","TREND_COLORS","MetricSparkline","ariaLabel","id","useId","reducedMotion","gradientId","useMemo","stroke","color","chartData","ResponsiveContainer","AreaChart","Area","animated","Bar","MetricSkeleton","cardBody","useMetricFormatOptions","formatMode","locale","defaultCurrency","SCHEME_TINT","VALUE_FONT_SIZE","VALUE_FONT_SIZE_HERO","HERO_ADAPTIVE","SPARKLINE_HEIGHT","SEGMENT_COUNT","Metric","props","rootClassName","formatOptions","formattedValue","loading","error","errorLabel","sharedProps","MetricCard","MetricCompact","MetricMinimal","MetricBordered","MetricAccent","MetricColored","MetricDefault","showIcon","Heading","showChange","showSparkline","isInteractive","tint","colorScheme","DisplayLabel","filledCount","progress","i","ArrowUpRight","MetricBar","cells","metrics","metric","showSparklines","showChanges","periodChip","period","onPeriodChange","Calendar","footerText","COLUMN_CLASS","autoColumnsFor","count","MetricGrid","columnsClass","columns","showIcons","defaultMetricComparisonStrings","toNumber","n","MetricComparison","stringsProp","strings","useStrings","currentNum","current","previousNum","previous","canCompute","delta","deltaPct","isUp","isFlat","Arrow","Equal","movement","deltaTone","title","currentPeriod","ArrowRight","previousPeriod","abs","DEFAULT_ORDER","CHART_COLORS","PIE_PALETTE","CHART_TRACK","MicroBars","max","v","MicroLine","min","range","points","MicroDots","MicroProgress","label","MicroAreaChart","gradId","MicroPie","total","a","b","cumAngle","angle","startAngle","startRad","endRad","largeArc","x1","y1","x2","y2","ChartFor","kind","COLUMNS","MetricMicroGrid","visible","cell","THEME_BG","CHART_INVERSE","CHART_INVERSE_SOFT","MetricGradient","theme","subtitle","LEVEL_COLOR","AXIS_LABEL_CLASS","textVariants","buildCalendar","sorted","startDate","endDate","dayOfWeek","mondayOffset","alignedStart","dateMap","d","weeks","monthLabels","lastMonth","currentWeek","cursor","dateStr","dayIdx","month","labelWeekIndex","m","monthNames","level","ActivityHeatmap","description","idx","arr","week","weekIdx","day","ChartCard","footer","contentClassName","chartClassName","defaultTimeDistributionRulerStrings","hour","hourLabel","TimeDistributionRuler","maxVal","hours","peakHour","getDensityClass","ratio","currentHour"],"sources":["../../src/components/blocks/analytics/analytics.strings.ts","../../src/components/blocks/analytics/format-metric-value.ts","../../src/components/blocks/analytics/atoms/metric-trend-chip.tsx","../../src/lib/use-prefers-reduced-motion.ts","../../src/components/blocks/analytics/atoms/metric-sparkline.tsx","../../src/components/blocks/analytics/atoms/metric-skeleton.tsx","../../src/components/blocks/analytics/use-metric-format-options.ts","../../src/components/blocks/analytics/metric/metric.tsx","../../src/components/blocks/analytics/metric-bar/metric-bar.tsx","../../src/components/blocks/analytics/metric-grid/metric-grid.tsx","../../src/components/blocks/analytics/metric-comparison/metric-comparison.tsx","../../src/components/blocks/analytics/metric-micro-grid/metric-micro-grid.tsx","../../src/components/blocks/analytics/metric-gradient/metric-gradient.tsx","../../src/components/blocks/analytics/activity-heatmap/activity-heatmap.tsx","../../src/components/blocks/analytics/chart-card/chart-card.tsx","../../src/components/blocks/analytics/time-ruler/types.ts","../../src/components/blocks/analytics/time-ruler/time-ruler.tsx"],"sourcesContent":["/**\n * Shared default strings for `blocks/analytics` components.\n *\n * Each component accepts a `strings` prop deep-merged over these defaults\n * so consumers override per-component without touching the rest. Day/month\n * labels live here too because they're localisable in the same way.\n */\nexport interface AnalyticsStrings {\n\t/** Fallback shown by `<Metric />` when `error` is true. */\n\tmetricErrorLabel: string;\n\t/** Default title for `<MetricComparison />` when no `title` prop is passed. */\n\tcomparisonTitle: string;\n\t/** Labels for the activity heatmap weekday rows (Mon–Sun, length 7). */\n\theatmapDayLabels: readonly [string, string, string, string, string, string, string];\n\t/** Short month names for the activity heatmap header (Jan–Dec, length 12). */\n\theatmapMonthNames: readonly [\n\t\tstring, string, string, string, string, string,\n\t\tstring, string, string, string, string, string,\n\t];\n\t/** Heatmap legend \"less\" label (left edge of intensity legend). */\n\theatmapLegendLess: string;\n\t/** Heatmap legend \"more\" label (right edge of intensity legend). */\n\theatmapLegendMore: string;\n}\n\nexport const defaultAnalyticsStrings: AnalyticsStrings = {\n\tmetricErrorLabel: 'Unable to load metric',\n\tcomparisonTitle: 'Comparison',\n\theatmapDayLabels: ['Mon', '', 'Wed', '', 'Fri', '', ''],\n\theatmapMonthNames: [\n\t\t'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n\t\t'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n\t],\n\theatmapLegendLess: 'Less',\n\theatmapLegendMore: 'More',\n};\n","/**\n * formatMetricValue — single canonical formatter for every metric surface.\n *\n * Keeps formatting logic out of the layout components so the same dataset\n * renders identically regardless of which `Metric*` variant displays it.\n * Currency values use the same formatter as the Money primitive, so a KPI and\n * a table cell show one amount the same way.\n */\nimport {\n\tEMPTY,\n\tformatNumber,\n\tformatPercentage,\n} from '../../../lib/format';\nimport { formatMoneyAmount } from '../../../lib/money-format';\nimport type { MoneyFormatMode } from '../../../lib/ui-provider';\nimport { formatDuration } from '../../primitives';\nimport type { MetricData } from './types';\n\n/** Display policy that metric components resolve from UIProvider. */\nexport interface FormatMetricValueOptions {\n\t/** BCP-47 locale. Metric components pass `UIProvider.formatting.locale`. */\n\tlocale?: string;\n\t/** Currency used when the metric has none. Defaults to `USD`, like UIProvider. */\n\tdefaultCurrency?: string;\n\t/** Money format policy. Defaults to `with_code`, like UIProvider. */\n\tmoneyFormatMode?: MoneyFormatMode;\n}\n\nexport function formatMetricValue(data: MetricData, options: FormatMetricValueOptions = {}): string {\n\tif (data.value === null || data.value === undefined) return EMPTY;\n\n\tconst value = data.value;\n\tconst numeric = typeof value === 'number' ? value : null;\n\tconst { locale } = options;\n\n\tswitch (data.valueType) {\n\t\tcase 'currency':\n\t\t\treturn numeric !== null\n\t\t\t\t? (formatMoneyAmount({\n\t\t\t\t\tamount: numeric,\n\t\t\t\t\tcurrency: data.currency ?? options.defaultCurrency ?? 'USD',\n\t\t\t\t\tlocale,\n\t\t\t\t\tformatMode: options.moneyFormatMode ?? 'with_code',\n\t\t\t\t}) ?? EMPTY)\n\t\t\t\t: String(value);\n\t\tcase 'percentage':\n\t\t\treturn numeric !== null ? formatPercentage(numeric, { locale }) : String(value);\n\t\tcase 'duration':\n\t\t\treturn numeric !== null ? formatDuration(numeric, { locale }) : String(value);\n\t\tcase 'number':\n\t\t\treturn numeric !== null ? formatNumber(numeric, { locale }) : String(value);\n\t\tcase 'text':\n\t\tdefault:\n\t\t\treturn String(value);\n\t}\n}\n\n/**\n * Resolve the effective `MetricTrend` for a metric — explicit `trend` wins,\n * otherwise we infer from `change.direction` (`up` → positive, `down` →\n * negative, `neutral`/missing → neutral).\n */\nexport function resolveTrend(data: MetricData): 'positive' | 'negative' | 'neutral' {\n\tif (data.trend) return data.trend;\n\tif (data.change?.direction === 'up') return 'positive';\n\tif (data.change?.direction === 'down') return 'negative';\n\treturn 'neutral';\n}\n","/**\n * MetricTrendChip — compact ↑/↓/→ delta indicator.\n *\n * Decouples direction (up/down/neutral) from tone (positive/negative/neutral)\n * so consumers can flip the colour for inverted metrics like churn or refund\n * rate. Four variants:\n * - `default` — coloured icon + value, no chrome\n * - `badge` — pill with tinted bg + arrow icon\n * - `compact` — coloured arrow + value, no spacing\n * - `inline` — value only with sign prefix, no icon\n */\nimport { ArrowDown, ArrowUp, Minus } from 'lucide-react';\nimport { Value } from '../../../primitives';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { MetricChange, MetricSize, MetricTrend, MetricTrendVariant } from '../types';\nimport { toneRecipes } from '../../../../lib/tone-recipes';\n\nexport interface MetricTrendChipProps {\n\tchange: MetricChange;\n\ttrend?: MetricTrend;\n\t/** Size preset. */\n\tsize?: MetricSize;\n\t/** Shell treatment. */\n\tvariant?: MetricTrendVariant;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nconst TONE_CLASSES: Record<MetricTrend, { text: string; badge: string; arrow: string }> = {\n\tpositive: { text: 'text-success', badge: `${toneRecipes.success.tint} ${toneRecipes.success.ink}`, arrow: 'text-success' },\n\tnegative: { text: 'text-destructive', badge: `${toneRecipes.destructive.tint} ${toneRecipes.destructive.ink}`, arrow: 'text-destructive' },\n\tneutral: { text: 'text-muted-foreground', badge: 'bg-muted text-muted-foreground', arrow: 'text-muted-foreground' },\n};\n\nconst ICON_SIZE: Record<MetricSize, string> = {\n\tsm: 'size-icon-sm',\n\tmd: 'size-icon-md',\n\tlg: 'size-icon',\n};\n\nconst TEXT_SIZE: Record<MetricSize, 'xxs' | 'xs' | 'sm'> = {\n\tsm: 'xxs',\n\tmd: 'xs',\n\tlg: 'sm',\n};\n\nconst BADGE_PADDING: Record<MetricSize, string> = {\n\tsm: 'px-space-sm py-space-2xs',\n\tmd: 'px-space-md py-space-2xs',\n\tlg: 'px-space-md py-space-xs',\n};\n\nfunction resolveTone(trend: MetricTrend | undefined, direction: MetricChange['direction']): MetricTrend {\n\tif (trend) return trend;\n\tif (direction === 'up') return 'positive';\n\tif (direction === 'down') return 'negative';\n\treturn 'neutral';\n}\n\nexport function MetricTrendChip({\n\tchange,\n\ttrend,\n\tsize = 'md',\n\tvariant = 'default',\n\tclassName,\n}: MetricTrendChipProps) {\n\tconst tone = resolveTone(trend, change.direction);\n\tconst Icon = change.direction === 'up' ? ArrowUp : change.direction === 'down' ? ArrowDown : Minus;\n\tconst palette = TONE_CLASSES[tone];\n\tconst valueText = String(change.value);\n\tconst sign = change.direction === 'up' ? '+' : change.direction === 'down' ? '' : '';\n\n\tif (variant === 'inline') {\n\t\treturn (\n\t\t\t<Value type=\"inherit\" size={TEXT_SIZE[size]} weight=\"medium\" className={cn('metric-trend-chip--component', palette.text, 'tabular-nums', className)}>\n\t\t\t\t{sign}{valueText}\n\t\t\t</Value>\n\t\t);\n\t}\n\n\tif (variant === 'compact') {\n\t\treturn (\n\t\t\t<span className={cn('inline-flex items-center gap-space-2xs', palette.text, className)}>\n\t\t\t\t<Icon className={ICON_SIZE[size]} strokeWidth={2.5} aria-hidden=\"true\" />\n\t\t\t\t<Value type=\"inherit\" size={TEXT_SIZE[size]} weight=\"semibold\" className=\"tabular-nums\">\n\t\t\t\t\t{valueText}\n\t\t\t\t</Value>\n\t\t\t</span>\n\t\t);\n\t}\n\n\tif (variant === 'badge') {\n\t\treturn (\n\t\t\t<span className={cn('inline-flex items-center gap-space-xs rounded-radius', palette.badge, BADGE_PADDING[size], className)}>\n\t\t\t\t<Icon className={ICON_SIZE[size]} strokeWidth={2.5} aria-hidden=\"true\" />\n\t\t\t\t<Value type=\"inherit\" size={TEXT_SIZE[size]} weight=\"semibold\" className=\"tabular-nums\">\n\t\t\t\t\t{valueText}\n\t\t\t\t</Value>\n\t\t\t\t{!!change.label && (\n\t\t\t\t\t<Text type=\"inherit\" tag=\"span\" size={TEXT_SIZE[size]}>{change.label}</Text>\n\t\t\t\t)}\n\t\t\t</span>\n\t\t);\n\t}\n\n\t// default\n\treturn (\n\t\t<span className={cn('inline-flex items-center gap-space-xs', palette.text, className)}>\n\t\t\t<Icon className={ICON_SIZE[size]} strokeWidth={2.5} aria-hidden=\"true\" />\n\t\t\t<Value type=\"inherit\" size={TEXT_SIZE[size]} weight=\"semibold\" className=\"tabular-nums\">\n\t\t\t\t{valueText}\n\t\t\t</Value>\n\t\t\t{!!change.label && (\n\t\t\t\t<Text tag=\"span\" size={TEXT_SIZE[size]} type=\"secondary\">{change.label}</Text>\n\t\t\t)}\n\t\t</span>\n\t);\n}\n\nMetricTrendChip.displayName = 'MetricTrendChip';\n","import { useSyncExternalStore } from 'react';\n\nconst query = '(prefers-reduced-motion: reduce)';\n\nfunction subscribe(onChange: () => void) {\n\tif (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return () => {};\n\tconst media = window.matchMedia(query);\n\tmedia.addEventListener('change', onChange);\n\treturn () => media.removeEventListener('change', onChange);\n}\n\nfunction getSnapshot() {\n\treturn typeof window !== 'undefined' && typeof window.matchMedia === 'function'\n\t\t? window.matchMedia(query).matches\n\t\t: false;\n}\n\n// Keep server/hydration markup still until the browser supplies its preference.\nfunction getServerSnapshot() {\n\treturn true;\n}\n\n/** Private preference owner for JavaScript-driven drawing animations. */\nexport function usePrefersReducedMotion() {\n\treturn useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n","/**\n * MetricSparkline — recharts-backed mini area chart used inside Metric\n * variants. Auto-stretches to its container; pass a fixed height (e.g.\n * `h-8 w-full`) on the wrapper. `trend` colours the stroke + gradient\n * (positive/negative/neutral); `color` overrides with any CSS colour\n * (semantic var, hex, rgb).\n */\nimport { useId, useMemo } from 'react';\nimport { Area, AreaChart, ResponsiveContainer } from 'recharts';\nimport { cn } from '../../../../lib/utils';\nimport { usePrefersReducedMotion } from '../../../../lib/use-prefers-reduced-motion';\n\nimport type { MetricTrend } from '../types';\n\nexport interface MetricSparklineProps {\n\t/** Data points to plot, in chronological order. */\n\tdata: readonly number[];\n\ttrend?: MetricTrend;\n\tcolor?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\tanimated?: boolean;\n\t'aria-label'?: string;\n}\n\nconst TREND_COLORS: Record<MetricTrend, string> = {\n\tpositive: 'var(--success)',\n\tnegative: 'var(--destructive)',\n\tneutral: 'var(--muted-foreground)',\n};\n\nexport function MetricSparkline({\n\tdata,\n\ttrend = 'neutral',\n\tcolor,\n\tclassName,\n\tanimated = true,\n\t'aria-label': ariaLabel = 'Trend sparkline',\n}: MetricSparklineProps) {\n\tconst id = useId();\n\tconst reducedMotion = usePrefersReducedMotion();\n\tconst gradientId = useMemo(() => `metric-spark-${id.replaceAll(':', '')}`, [id]);\n\tconst stroke = color ?? TREND_COLORS[trend];\n\n\tconst chartData = useMemo(() => {\n\t\tif (!Array.isArray(data) || data.length === 0) return [];\n\t\treturn data.map((value, i) => ({ i, v: value }));\n\t}, [data]);\n\n\tif (chartData.length === 0) {\n\t\treturn <div className={cn('metric-sparkline--component', 'h-full w-full', className)} aria-hidden=\"true\" />;\n\t}\n\n\treturn (\n\t\t<div className={cn('metric-sparkline--component h-full w-full', className)} role=\"img\" aria-label={ariaLabel}>\n\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\" initialDimension={{ width: 1, height: 1 }}>\n\t\t\t\t<AreaChart data={chartData} margin={{ top: 2, right: 0, bottom: 0, left: 0 }}>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={stroke} stopOpacity={0.25} />\n\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={stroke} stopOpacity={0} />\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t</defs>\n\t\t\t\t\t<Area\n\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\tdataKey=\"v\"\n\t\t\t\t\t\tstroke={stroke}\n\t\t\t\t\t\tstrokeWidth={1.75}\n\t\t\t\t\t\tfill={`url(#${gradientId})`}\n\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\tisAnimationActive={animated && !reducedMotion}\n\t\t\t\t\t\tanimationDuration={600}\n\t\t\t\t\t/>\n\t\t\t\t</AreaChart>\n\t\t\t</ResponsiveContainer>\n\t\t</div>\n\t);\n}\n\nMetricSparkline.displayName = 'MetricSparkline';\n","/**\n * MetricSkeleton — loading placeholder matching the height/spacing of every\n * `Metric` variant so the layout doesn't jump when data resolves.\n */\nimport { Card } from '../../../base/cards';\nimport { Skeleton } from '../../../base/skeleton';\nimport { Stack } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\nimport type { MetricSize, MetricVariant } from '../types';\n\nexport interface MetricSkeletonProps {\n\t/** Shell treatment. */\n\tvariant?: MetricVariant;\n\t/** Size preset. */\n\tsize?: MetricSize;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nconst Bar = ({ className }: { className?: string }) => (\n\t<Skeleton className={className} />\n);\n\nexport function MetricSkeleton({\n\tvariant = 'default',\n\tsize = 'md',\n\tclassName,\n}: MetricSkeletonProps) {\n\t// Card-shaped variants share the loaded layout: label, value with its\n\t// supporting line, then the chart band.\n\tconst cardBody = (\n\t\t<Stack gap=\"lg\">\n\t\t\t<Bar className=\"h-3 w-24\" />\n\t\t\t<Stack gap=\"md\">\n\t\t\t\t<Bar className={size === 'lg' ? 'h-9 w-40' : 'h-7 w-32'} />\n\t\t\t\t<Bar className=\"h-3 w-20\" />\n\t\t\t</Stack>\n\t\t\t<Bar className=\"h-8 w-full\" />\n\t\t</Stack>\n\t);\n\n\tif (variant === 'card' || variant === 'bordered' || variant === 'accent' || variant === 'colored') {\n\t\t// The card variant inherits the provider surface like the loaded card;\n\t\t// the bordered, accent and colored variants draw the plain card surface.\n\t\treturn (\n\t\t\t<Card\n\t\t\t\tsurface={variant === 'card' ? undefined : 'card'}\n\t\t\t\tclassName={cn('metric-skeleton--component', className)}\n\t\t\t\taria-busy=\"true\"\n\t\t\t\taria-live=\"polite\"\n\t\t\t>\n\t\t\t\t{cardBody}\n\t\t\t</Card>\n\t\t);\n\t}\n\n\tif (variant === 'compact') {\n\t\treturn (\n\t\t\t<div className={cn('flex items-center gap-space-lg', className)} aria-busy=\"true\">\n\t\t\t\t<Bar className=\"size-avatar rounded-radius\" />\n\t\t\t\t<Stack gap=\"sm\" className=\"flex-1\">\n\t\t\t\t\t<Bar className=\"h-3 w-20\" />\n\t\t\t\t\t<Bar className=\"h-4 w-28\" />\n\t\t\t\t</Stack>\n\t\t\t\t<Bar className=\"h-5 w-12 rounded-full\" />\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (variant === 'minimal') {\n\t\treturn (\n\t\t\t<div className={cn('inline-flex items-baseline gap-space-md', className)} aria-busy=\"true\">\n\t\t\t\t<Bar className=\"h-3 w-12\" />\n\t\t\t\t<Bar className=\"h-3 w-16\" />\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// default\n\treturn (\n\t\t<div className={cn('flex flex-col gap-space-sm p-surface', className)} aria-busy=\"true\">\n\t\t\t<Bar className=\"h-3 w-20\" />\n\t\t\t<Bar className=\"h-5 w-28\" />\n\t\t\t<Bar className=\"mt-1 h-6 w-full\" />\n\t\t</div>\n\t);\n}\n\nMetricSkeleton.displayName = 'MetricSkeleton';\n","import { useMemo } from 'react';\n\nimport { useFormattingConfig, useMoneyConfig } from '../../../lib/ui-provider';\n\nimport type { FormatMetricValueOptions } from './format-metric-value';\n\n/** Metric formatting policy from UIProvider: locale, default currency and money format. */\nexport function useMetricFormatOptions(): FormatMetricValueOptions {\n\tconst { locale } = useFormattingConfig();\n\tconst { defaultCurrency, formatMode } = useMoneyConfig();\n\treturn useMemo(\n\t\t() => ({ locale, defaultCurrency, moneyFormatMode: formatMode }),\n\t\t[locale, defaultCurrency, formatMode],\n\t);\n}\n","/**\n * Metric — canonical single-metric surface. One component, seven variants:\n *\n * default — flat tile (label / value / trend / sparkline) for use inside\n * MetricBar or other blocks surfaces.\n * card — standalone metric using the canonical Card surface.\n * compact — single-row icon + label + value + chip. Sidebar / list use.\n * minimal — inline `Label: value ↑12%` chip for in-flow copy.\n * bordered — soft tinted border keyed off `colorScheme`.\n * accent — dark surface card with bottom-aligned area sparkline.\n * colored — segmented progress bar (driven by `progress` prop).\n *\n * All variants share the same `MetricData` shape; only the layout changes.\n */\nimport { useMemo } from 'react';\nimport { ArrowUpRight } from 'lucide-react';\n\nimport { Card } from '../../../base/cards';\nimport { IconBadge } from '../../../base/display/icon-badge';\nimport { Stack } from '../../../base/structure';\nimport { Value } from '../../../primitives';\nimport { DisplayLabel, Heading, Text, type HeadingSize } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAnalyticsStrings } from '../analytics.strings';\nimport { MetricSkeleton } from '../atoms/metric-skeleton';\nimport { MetricSparkline } from '../atoms/metric-sparkline';\nimport { MetricTrendChip } from '../atoms/metric-trend-chip';\nimport { formatMetricValue, resolveTrend } from '../format-metric-value';\nimport { useMetricFormatOptions } from '../use-metric-format-options';\nimport type {\n\tMetricColorScheme,\n\tMetricData,\n\tMetricSize,\n\tMetricVariant,\n} from '../types';\nimport { focusRecipes } from '../../../../lib/focus-recipes';\nimport { dotRecipes, toneRecipes } from '../../../../lib/tone-recipes';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\n\nexport interface MetricProps {\n\t/** Records to render. */\n\tdata: MetricData;\n\t/** Shell treatment. */\n\tvariant?: MetricVariant;\n\t/** Size preset. */\n\tsize?: MetricSize;\n\tcolorScheme?: MetricColorScheme;\n\t/** Renders the sparkline. */\n\tshowSparkline?: boolean;\n\t/** Renders the change. */\n\tshowChange?: boolean;\n\t/** Renders the icon. */\n\tshowIcon?: boolean;\n\tloading?: boolean;\n\terror?: boolean;\n\terrorLabel?: string;\n\t/** `colored` variant only — 0-100 fill percentage. */\n\tprogress?: number;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t'aria-label'?: string;\n}\n\n// ── colour-scheme palettes (shared between bordered + colored variants) ──\nconst SCHEME_TINT: Record<MetricColorScheme, { border: string; bg: string; bar: string; dot: string; ring: string }> = {\n\tdefault: { border: 'border-border', bg: 'bg-card', bar: 'bg-foreground', dot: 'bg-foreground', ring: 'ring-border' },\n\tprimary: { border: toneRecipes.primary.edge, bg: toneRecipes.primary.wash, bar: toneRecipes.primary.solid, dot: toneRecipes.primary.solid, ring: toneRecipes.primary.halo },\n\tsuccess: { border: toneRecipes.success.edge, bg: toneRecipes.success.wash, bar: toneRecipes.success.solid, dot: toneRecipes.success.solid, ring: toneRecipes.success.halo },\n\twarning: { border: toneRecipes.warning.edge, bg: toneRecipes.warning.wash, bar: toneRecipes.warning.solid, dot: toneRecipes.warning.solid, ring: toneRecipes.warning.halo },\n\tdanger: { border: toneRecipes.destructive.edge, bg: toneRecipes.destructive.wash, bar: toneRecipes.destructive.solid, dot: toneRecipes.destructive.solid, ring: toneRecipes.destructive.halo },\n\tinfo: { border: toneRecipes.info.edge, bg: toneRecipes.info.wash, bar: toneRecipes.info.solid, dot: toneRecipes.info.solid, ring: toneRecipes.info.halo },\n};\n\n/** Compact value sizes for in-grid / in-bar usage where horizontal space is tight. */\nconst VALUE_FONT_SIZE: Record<MetricSize, HeadingSize> = {\n\tsm: 'sm',\n\tmd: 'base',\n\tlg: 'base',\n};\n\n/** Hero value sizes for standalone card / bordered / accent variants. */\nconst VALUE_FONT_SIZE_HERO: Record<MetricSize, HeadingSize> = {\n\tsm: '2xl',\n\tmd: '2xl',\n\tlg: '3xl',\n};\n\nconst HERO_ADAPTIVE: Record<MetricSize, string> = {\n\tsm: '@max-[11rem]/metric-card:text-xl',\n\tmd: '@max-[11rem]/metric-card:text-xl',\n\tlg: '@max-[16rem]/metric-card:text-2xl @max-[11rem]/metric-card:text-xl',\n};\n\nconst SPARKLINE_HEIGHT: Record<MetricSize, string> = {\n\tsm: 'h-control-sm',\n\tmd: 'h-control',\n\tlg: 'h-control-lg',\n};\n\nconst SEGMENT_COUNT = 16;\n\nexport function Metric(props: MetricProps) {\n\tconst {\n\t\tdata,\n\t\tvariant = 'default',\n\t\tsize = 'md',\n\t\tcolorScheme = 'default',\n\t\tshowSparkline = true,\n\t\tshowChange = true,\n\t\tshowIcon = true,\n\t\tloading = false,\n\t\terror = false,\n\t\terrorLabel,\n\t\tprogress = 0,\n\t\tclassName,\n\t\t'aria-label': ariaLabel,\n\t} = props;\n\tconst rootClassName = cn('metric--component', className);\n\n\tconst formatOptions = useMetricFormatOptions();\n\tconst formattedValue = useMemo(() => formatMetricValue(data, formatOptions), [data, formatOptions]);\n\tconst trend = useMemo(() => resolveTrend(data), [data]);\n\n\tif (loading) return <MetricSkeleton variant={variant} size={size} className={rootClassName} />;\n\tif (error) {\n\t\treturn (\n\t\t\t<Card className={rootClassName} contentClassName=\"flex items-center justify-center\">\n\t\t\t\t<Text type=\"inherit\">{errorLabel ?? defaultAnalyticsStrings.metricErrorLabel}</Text>\n\t\t\t</Card>\n\t\t);\n\t}\n\n\tconst sharedProps = {\n\t\tdata,\n\t\tformattedValue,\n\t\ttrend,\n\t\tsize,\n\t\tshowSparkline,\n\t\tshowChange,\n\t\tshowIcon,\n\t\tcolorScheme,\n\t\tariaLabel: ariaLabel ?? data.label,\n\t\tclassName: rootClassName,\n\t};\n\n\tswitch (variant) {\n\t\tcase 'card':\n\t\t\treturn <MetricCard {...sharedProps} />;\n\t\tcase 'compact':\n\t\t\treturn <MetricCompact {...sharedProps} />;\n\t\tcase 'minimal':\n\t\t\treturn <MetricMinimal {...sharedProps} />;\n\t\tcase 'bordered':\n\t\t\treturn <MetricBordered {...sharedProps} />;\n\t\tcase 'accent':\n\t\t\treturn <MetricAccent {...sharedProps} />;\n\t\tcase 'colored':\n\t\t\treturn <MetricColored {...sharedProps} progress={progress} />;\n\t\tdefault:\n\t\t\treturn <MetricDefault {...sharedProps} />;\n\t}\n}\n\nMetric.displayName = 'Metric';\n\n// ─────────────────────────────────────────────────────────────────────────\n// Internal sub-components — kept private. Each handles one variant only.\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface SubProps {\n\t/** Records to render. */\n\tdata: MetricData;\n\tformattedValue: string;\n\ttrend: 'positive' | 'negative' | 'neutral';\n\t/** Size preset. */\n\tsize: MetricSize;\n\t/** Renders the sparkline. */\n\tshowSparkline: boolean;\n\t/** Renders the change. */\n\tshowChange: boolean;\n\t/** Renders the icon. */\n\tshowIcon: boolean;\n\tcolorScheme: MetricColorScheme;\n\t/** Accessible name for the region. */\n\tariaLabel: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nfunction MetricDefault({ data, formattedValue, trend, size, showSparkline, showChange, showIcon, ariaLabel, className }: SubProps) {\n\tconst Icon = data.icon;\n\treturn (\n\t\t<Stack gap=\"xs\" className={className} aria-label={ariaLabel}>\n\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"sm\" className=\"min-w-0 text-muted-foreground\">\n\t\t\t\t{!!showIcon && !!Icon && <Icon className=\"size-icon-md shrink-0\" aria-hidden=\"true\" />}\n\t\t\t\t<Text size=\"xs\" type=\"secondary\" weight=\"medium\" className=\"truncate\">{data.label}</Text>\n\t\t\t</Stack>\n\t\t\t<Heading tag=\"h5\" size={VALUE_FONT_SIZE[size]} className=\"truncate tabular-nums text-inherit\" title={formattedValue}>\n\t\t\t\t{formattedValue}\n\t\t\t</Heading>\n\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"compact\" />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!!data.subtitle && <Text size=\"xs\" type=\"secondary\" className=\"truncate\">{data.subtitle}</Text>}\n\t\t\t{!!showSparkline && !!data.sparkline?.length && (\n\t\t\t\t<MetricSparkline data={data.sparkline} trend={trend} className={cn('mt-auto', SPARKLINE_HEIGHT[size])} />\n\t\t\t)}\n\t\t\t{!!data.footer && <Text size=\"xs\" type=\"discrete\" className=\"truncate\">{data.footer}</Text>}\n\t\t</Stack>\n\t);\n}\n\nfunction MetricCard({ data, formattedValue, trend, size, showSparkline, showChange, showIcon, ariaLabel, className }: SubProps) {\n\tconst Icon = data.icon;\n\tconst isInteractive = Boolean(data.href || data.onClick);\n\tconst card = (\n\t\t<Card\n\t\t\ttitle={<Text tag=\"span\" size=\"xs\" type=\"secondary\" weight=\"medium\">{data.label}</Text>}\n\t\t\ticon={!!showIcon && !!Icon ? <Icon className=\"size-icon\" aria-hidden=\"true\" /> : null}\n\t\t\ttooltip={data.tooltip}\n\t\t\tclassName={cn('@container/metric-card', isInteractive && 'relative transition-shadow hover:shadow-md [&_.card--tooltip-trigger]:relative [&_.card--tooltip-trigger]:z-10', className)}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t{isInteractive && (data.href ? <a href={data.href} onClick={data.onClick} aria-label={ariaLabel} className={`metric--action absolute inset-0 z-0 rounded-surface focus-visible:outline-none ${focusRecipes.inset}`} /> : <button type=\"button\" onClick={data.onClick} aria-label={ariaLabel} className={`metric--action ${interactionRecipes.nativeButtonReset} absolute inset-0 z-0 cursor-pointer rounded-surface focus-visible:outline-none ${focusRecipes.inset}`} />)}\n\t\t\t<Stack gap=\"normal\">\n\t\t\t\t<Stack direction=\"horizontal\" align=\"baseline\" justify=\"between\" gap=\"sm\">\n\t\t\t\t\t<Heading\n\t\t\t\t\t\ttag={size === 'sm' ? 'h5' : size === 'lg' ? 'h3' : 'h4'}\n\t\t\t\t\t\tsize={VALUE_FONT_SIZE_HERO[size]}\n\t\t\t\t\t\tclassName={cn('max-w-full break-words tabular-nums text-inherit', HERO_ADAPTIVE[size])}\n\t\t\t\t\t>\n\t\t\t\t\t\t{formattedValue}\n\t\t\t\t\t</Heading>\n\t\t\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"badge\" className=\"@max-[16rem]/metric-card:px-space-xs\" />\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t\t{!!data.subtitle && <Text type=\"secondary\">{data.subtitle}</Text>}\n\t\t\t\t{!!showSparkline && !!data.sparkline?.length && (\n\t\t\t\t\t<MetricSparkline\n\t\t\t\t\t\tdata={data.sparkline}\n\t\t\t\t\t\ttrend={trend}\n\t\t\t\t\t\tclassName={size === 'lg' ? 'h-control-lg' : 'h-control'}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{!!data.footer && <Text size=\"xs\" type=\"secondary\">{data.footer}</Text>}\n\t\t\t</Stack>\n\t\t</Card>\n\t);\n\n\treturn card;\n}\n\nfunction MetricCompact({ data, formattedValue, size, showChange, showIcon, ariaLabel, className }: SubProps) {\n\tconst Icon = data.icon;\n\treturn (\n\t\t<div className={cn('flex items-center gap-space-lg', className)} aria-label={ariaLabel}>\n\t\t\t{!!showIcon && !!Icon && <IconBadge icon={Icon} tone=\"secondary\" shape=\"square\" size=\"md\" />}\n\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"truncate\">{data.label}</Text>\n\t\t\t\t<Value type=\"inherit\" size={size === 'sm' ? 'sm' : 'base'} weight=\"bold\" className=\"block truncate tabular-nums\">\n\t\t\t\t\t{formattedValue}\n\t\t\t\t</Value>\n\t\t\t</div>\n\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"badge\" className=\"shrink-0\" />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nfunction MetricMinimal({ data, formattedValue, size, showChange, ariaLabel, className }: SubProps) {\n\treturn (\n\t\t<span className={cn('inline-flex items-baseline gap-space-md', className)} aria-label={ariaLabel}>\n\t\t\t<Text tag=\"span\" size={size === 'lg' ? 'sm' : 'xs'} type=\"secondary\">{data.label}:</Text>\n\t\t\t<Value type=\"inherit\" size={size === 'lg' ? 'sm' : 'xs'} weight=\"semibold\" className=\"tabular-nums\">{formattedValue}</Value>\n\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size=\"sm\" variant=\"inline\" />\n\t\t\t)}\n\t\t</span>\n\t);\n}\n\nfunction MetricBordered({ data, formattedValue, trend, size, showSparkline, showChange, showIcon, colorScheme, ariaLabel, className }: SubProps) {\n\tconst Icon = data.icon;\n\tconst tint = SCHEME_TINT[colorScheme];\n\t// The canonical card surface; the colour scheme retints its edge and fill.\n\treturn (\n\t\t<Card surface=\"card\" className={cn(tint.border, tint.bg, className)} aria-label={ariaLabel}>\n\t\t\t<Stack gap=\"lg\">\n\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"between\" gap=\"md\">\n\t\t\t\t\t<div className=\"flex items-center gap-space-md text-muted-foreground\">\n\t\t\t\t\t\t{!!showIcon && !!Icon && <Icon className=\"size-icon shrink-0\" aria-hidden=\"true\" />}\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" weight=\"medium\">{data.label}</Text>\n\t\t\t\t\t</div>\n\t\t\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"badge\" />\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t\t<Heading\n\t\t\t\t\ttag={size === 'lg' ? 'h3' : 'h4'}\n\t\t\t\t\tsize={VALUE_FONT_SIZE_HERO[size]}\n\t\t\t\t\tclassName=\"tabular-nums text-inherit\"\n\t\t\t\t>\n\t\t\t\t\t{formattedValue}\n\t\t\t\t</Heading>\n\t\t\t\t{!!data.subtitle && <Text size=\"xs\" type=\"secondary\">{data.subtitle}</Text>}\n\t\t\t\t{!!showSparkline && !!data.sparkline?.length && (\n\t\t\t\t\t<MetricSparkline data={data.sparkline} trend={trend} className={SPARKLINE_HEIGHT[size]} />\n\t\t\t\t)}\n\t\t\t\t{!!data.footer && <Text size=\"xs\" type=\"discrete\">{data.footer}</Text>}\n\t\t\t</Stack>\n\t\t</Card>\n\t);\n}\n\nfunction MetricAccent({ data, formattedValue, trend, size, showSparkline, showChange, showIcon, ariaLabel, className }: SubProps) {\n\tconst Icon = data.icon;\n\t// A dark-scoped card whose sparkline bleeds to the frame edge, like media:\n\t// the card owns the frame and the copy region owns the one inset.\n\treturn (\n\t\t<Card surface=\"card\" padding=\"none\" className={cn('dark', className)} aria-label={ariaLabel}>\n\t\t\t<Stack gap=\"md\" className=\"p-surface\">\n\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"between\" gap=\"lg\">\n\t\t\t\t\t<DisplayLabel className=\"text-inherit\">\n\t\t\t\t\t\t{data.label}\n\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t{!!showIcon && !!Icon && (\n\t\t\t\t\t\t<IconBadge tone=\"secondary\" shape=\"square\" size=\"sm\">\n\t\t\t\t\t\t\t<Icon className=\"size-icon-md\" aria-hidden=\"true\" />\n\t\t\t\t\t\t</IconBadge>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t\t<div className=\"flex items-baseline gap-space-md\">\n\t\t\t\t\t<Heading\n\t\t\t\t\t\ttag=\"h3\"\n\t\t\t\t\t\tsize={VALUE_FONT_SIZE_HERO[size]}\n\t\t\t\t\t\tclassName=\"tabular-nums text-inherit\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{formattedValue}\n\t\t\t\t\t</Heading>\n\t\t\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"compact\" />\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t{!!data.subtitle && <Text size=\"xs\" type=\"secondary\">{data.subtitle}</Text>}\n\t\t\t</Stack>\n\t\t\t{!!showSparkline && !!data.sparkline?.length && (\n\t\t\t\t<MetricSparkline data={data.sparkline} trend={trend} className=\"h-control-lg w-full\" />\n\t\t\t)}\n\t\t</Card>\n\t);\n}\n\nfunction MetricColored({ data, formattedValue, size, showChange, colorScheme, ariaLabel, className, progress = 0 }: SubProps & { progress?: number }) {\n\tconst tint = SCHEME_TINT[colorScheme === 'default' ? 'primary' : colorScheme];\n\tconst filledCount = Math.round((Math.min(Math.max(progress, 0), 100) / 100) * SEGMENT_COUNT);\n\treturn (\n\t\t<Card surface=\"card\" className={className} aria-label={ariaLabel}>\n\t\t\t<Stack gap=\"lg\">\n\t\t\t\t<Stack gap=\"md\">\n\t\t\t\t\t<div className=\"flex items-center gap-space-md\">\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" weight=\"medium\" className=\"truncate\">{data.label}</Text>\n\t\t\t\t\t\t<span className={cn(dotRecipes.inline, tint.dot)} aria-hidden=\"true\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t{/* A figure never breaks mid-number; its unit wraps under it instead. */}\n\t\t\t\t\t<div className=\"flex flex-wrap items-baseline gap-x-space-md\">\n\t\t\t\t\t\t<Heading\n\t\t\t\t\t\t\ttag=\"h3\"\n\t\t\t\t\t\t\tsize={VALUE_FONT_SIZE_HERO[size]}\n\t\t\t\t\t\t\tclassName=\"whitespace-nowrap tabular-nums text-inherit\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{formattedValue}\n\t\t\t\t\t\t</Heading>\n\t\t\t\t\t\t{!!data.subtitle && <Text size=\"xs\" type=\"secondary\">{data.subtitle}</Text>}\n\t\t\t\t\t</div>\n\t\t\t\t</Stack>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"flex items-center gap-space-2xs\"\n\t\t\t\t\trole=\"progressbar\"\n\t\t\t\t\taria-label={`${data.label} progress`}\n\t\t\t\t\taria-valuenow={progress}\n\t\t\t\t\taria-valuemin={0}\n\t\t\t\t\taria-valuemax={100}\n\t\t\t\t\taria-valuetext={`${progress}%`}\n\t\t\t\t>\n\t\t\t\t\t{Array.from({ length: SEGMENT_COUNT }, (_, i) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={`seg-${i}`}\n\t\t\t\t\t\t\tclassName={cn('h-6 w-1.5 rounded-radius-sm transition-colors', i < filledCount ? tint.bar : 'bg-muted')}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t\t{(!!(showChange && data.change) || !!data.footer) && (\n\t\t\t\t\t<Stack gap=\"md\">\n\t\t\t\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"default\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!data.footer && (\n\t\t\t\t\t\t\t<div className=\"inline-flex items-center gap-space-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t<ArrowUpRight className=\"size-icon-sm\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{data.footer}</Text>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</Card>\n\t);\n}\n","/**\n * MetricBar — horizontal strip of metrics with an optional period selector\n * on the leading edge. Cells are divided by hairlines so a row of 4 KPIs\n * reads as a single integrated module rather than disconnected cards.\n *\n * Variants:\n * `default` — flat hairline-divided bar with period chip on the left.\n * Best for tables/dashboards where the bar sits above content.\n * `gradient` — same layout wrapped in a tinted gradient frame for hero\n * placement.\n *\n * Always render `Metric` cells inside; never render layout-specific markup\n * directly. That keeps the formatting / colouring rules in one place.\n */\nimport { Calendar } from 'lucide-react';\nimport { Button } from '../../../base/buttons';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport { Metric } from '../metric/metric';\nimport type { MetricData, MetricPeriod, MetricSize } from '../types';\n\nexport type MetricBarVariant = 'default' | 'gradient';\n\nexport interface MetricBarProps {\n\tmetrics: MetricData[];\n\tperiod?: MetricPeriod;\n\tonPeriodChange?: (value: string) => void;\n\t/** Shell treatment. */\n\tvariant?: MetricBarVariant;\n\t/** Size preset. */\n\tsize?: MetricSize;\n\t/** Renders the sparklines. */\n\tshowSparklines?: boolean;\n\t/** Renders the changes. */\n\tshowChanges?: boolean;\n\tfooterText?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport function MetricBar({\n\tmetrics,\n\tperiod,\n\tonPeriodChange,\n\tvariant = 'default',\n\tsize = 'sm',\n\tshowSparklines = true,\n\tshowChanges = true,\n\tfooterText,\n\tclassName,\n}: MetricBarProps) {\n\tconst cells = (\n\t\t<div className=\"grid min-w-0 flex-1 grid-cols-1 divide-y divide-border @xl/metric-bar:flex @xl/metric-bar:items-stretch @xl/metric-bar:divide-x @xl/metric-bar:divide-y-0\">\n\t\t\t{metrics.map((metric) => (\n\t\t\t\t// The cell is a full-height flex column and the Metric stretches into\n\t\t\t\t// it so `MetricDefault`'s `mt-auto` sparkline resolves against real\n\t\t\t\t// leftover height. Without this, a metric carrying an optional\n\t\t\t\t// subtitle grows taller and its sparkline drops off the shared\n\t\t\t\t// baseline the rest of the strip sits on.\n\t\t\t\t<div key={metric.id} className=\"flex min-w-0 flex-col px-surface py-row-y @xl/metric-bar:min-w-36 @xl/metric-bar:flex-1\">\n\t\t\t\t\t<Metric\n\t\t\t\t\t\tdata={metric}\n\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\tshowSparkline={showSparklines}\n\t\t\t\t\t\tshowChange={showChanges}\n\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n\n\tconst periodChip = !!period && (\n\t\t<div className=\"flex shrink-0 items-center border-b border-border px-row-x py-row-y @xl/metric-bar:border-b-0 @xl/metric-bar:py-0\">\n\t\t\t<Button\n\t\t\t\ttone=\"secondary\"\n\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\tclassName=\"gap-space-sm\"\n\t\t\t\tonClick={onPeriodChange ? () => onPeriodChange(period.value) : undefined}\n\t\t\t>\n\t\t\t\t<Calendar className=\"size-icon-md\" aria-hidden=\"true\" />\n\t\t\t\t<Text type=\"inherit\" size=\"inherit\" weight=\"medium\">{period.label}</Text>\n\t\t\t</Button>\n\t\t</div>\n\t);\n\n\tif (variant === 'gradient') {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn('metric-bar--component box-border @container/metric-bar',\n\t\t\t\t\t'w-full',\n\t\t\t\t\t// A decorative frame tint: chart roles, not primary (near-black by\n\t\t\t\t\t// default) or status tones, which would state a condition.\n\t\t\t\t\t'rounded-surface bg-gradient-to-r from-chart-3/8 via-chart-2/5 to-chart-1/8 p-px',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div className=\"flex min-w-0 flex-col overflow-hidden rounded-surface bg-card text-card-foreground @xl/metric-bar:flex-row\">\n\t\t\t\t\t{periodChip && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{periodChip}\n\t\t\t\t\t\t\t<div className=\"hidden w-px bg-border @xl/metric-bar:block\" aria-hidden=\"true\" />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t{cells}\n\t\t\t\t</div>\n\t\t\t\t{!!footerText && (\n\t\t\t\t\t<div className=\"rounded-b-surface border-t border-border/60 bg-card text-card-foreground px-surface py-row-y\">\n\t\t\t\t\t\t<Text size=\"xs\" type=\"discrete\">{footerText}</Text>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'metric-bar--component box-border @container/metric-bar flex w-full flex-col overflow-hidden rounded-surface border border-border bg-card text-card-foreground shadow-sm',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"flex min-w-0 flex-col overflow-hidden @xl/metric-bar:flex-row\">\n\t\t\t\t{periodChip && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{periodChip}\n\t\t\t\t\t\t<div className=\"hidden w-px bg-border @xl/metric-bar:block\" aria-hidden=\"true\" />\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{cells}\n\t\t\t</div>\n\t\t\t{!!footerText && (\n\t\t\t\t<div className=\"border-t border-border/60 px-surface py-row-y\">\n\t\t\t\t\t<Text size=\"xs\" type=\"discrete\">{footerText}</Text>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nMetricBar.displayName = 'MetricBar';\n","/**\n * MetricGrid — responsive grid of `Metric` cells. The grid is the workhorse\n * for KPI rows on dashboards: pass a list, choose a variant, and the\n * component handles layout / column counts / spacing.\n *\n * Variants are forwarded to `Metric` so a single grid can show either\n * standalone cards, bordered tints, or compact list rows.\n *\n * Column counts default to `auto` — the grid breaks based on the cell count.\n * Override with `columns` to set the maximum number of tracks.\n *\n * Every break is a container query against the grid's own width, not the\n * viewport's. A KPI row is routinely dropped into a sidebar, a drawer, or one\n * half of a split view; keyed to the viewport, six metrics in a 300px rail on\n * a desktop screen rendered as six ~40px columns.\n */\nimport { Grid } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\n\nimport { Metric } from '../metric/metric';\nimport type {\n\tMetricColorScheme,\n\tMetricData,\n\tMetricSize,\n\tMetricVariant,\n} from '../types';\n\nexport interface MetricGridProps {\n\t/** Metrics rendered as one responsive peer collection. */\n\tmetrics: MetricData[];\n\t/** Cell variant. `card` composes the canonical Card surface. */\n\tvariant?: Extract<MetricVariant, 'card' | 'compact' | 'bordered' | 'accent' | 'colored'>;\n\t/** Shared visual size forwarded to every metric. */\n\tsize?: MetricSize;\n\t/** Shared semantic color recipe forwarded to every metric. */\n\tcolorScheme?: MetricColorScheme;\n\t/** Maximum column count; narrower parents use fewer tracks. `auto` chooses from the cell count. */\n\tcolumns?: 'auto' | 1 | 2 | 3 | 4 | 6;\n\t/** Peer spacing. Defaults to `xl`; use denser gaps explicitly for compact lists. */\n\tgap?: 'sm' | 'md' | 'lg' | 'xl';\n\t/** Show each metric's sparkline when data is available. */\n\tshowSparklines?: boolean;\n\t/** Show each metric's change indicator when data is available. */\n\tshowChanges?: boolean;\n\t/** Show each metric's icon when data is available. */\n\tshowIcons?: boolean;\n\t/** Render loading skeletons without changing the grid or card geometry. */\n\tloading?: boolean;\n\t/**\n\t * Additional classes for the component root. The root owns the query\n\t * container; the responsive `grid-cols-*` live on the grid inside it, so pin\n\t * a layout with `columns` rather than a class here.\n\t */\n\tclassName?: string;\n}\n\n// Parent-width tiers give framed metrics room for their shared surface insets,\n// primary labels and formatted values. Requested columns are a ceiling, never\n// a reason to squeeze desktop tracks into a narrow shell or drawer.\nconst COLUMN_CLASS: Record<Exclude<NonNullable<MetricGridProps['columns']>, 'auto'>, string> = {\n\t1: 'grid-cols-1',\n\t2: 'grid-cols-1 @md/metric-grid:grid-cols-2',\n\t3: 'grid-cols-1 @2xl/metric-grid:grid-cols-3',\n\t4: 'grid-cols-1 @md/metric-grid:grid-cols-2 @5xl/metric-grid:grid-cols-4',\n\t6: 'grid-cols-1 @md/metric-grid:grid-cols-2 @3xl/metric-grid:grid-cols-3 @7xl/metric-grid:grid-cols-6',\n};\n\nfunction autoColumnsFor(count: number): string {\n\tconst maximum = count <= 1 ? 1 : count === 2 ? 2 : count === 3 ? 3 : count <= 4 || count > 6 ? 4 : 6;\n\treturn COLUMN_CLASS[maximum];\n}\n\nexport function MetricGrid({\n\tmetrics,\n\tvariant = 'card',\n\tsize = 'md',\n\tcolorScheme = 'default',\n\tcolumns = 'auto',\n\tgap = 'xl',\n\tshowSparklines = true,\n\tshowChanges = true,\n\tshowIcons = true,\n\tloading = false,\n\tclassName,\n}: MetricGridProps) {\n\tconst columnsClass = columns === 'auto' ? autoColumnsFor(metrics.length) : COLUMN_CLASS[columns];\n\n\treturn (\n\t\t/*\n\t\t * The root exists to be the query container: an element cannot match its\n\t\t * own container query, so the grid whose columns react has to sit inside\n\t\t * the element being measured. Same shape as product-details-card.\n\t\t */\n\t\t<div className={cn('metric-grid--component @container/metric-grid', className)}>\n\t\t\t<Grid\n\t\t\t\tcolumns={1}\n\t\t\t\tgap={gap}\n\t\t\t\tclassName={cn('metric-grid--grid', columnsClass)}\n\t\t\t>\n\t\t\t\t{metrics.map((metric) => (\n\t\t\t\t\t<Metric\n\t\t\t\t\t\tkey={metric.id}\n\t\t\t\t\t\tdata={metric}\n\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\tcolorScheme={colorScheme}\n\t\t\t\t\t\tshowSparkline={showSparklines}\n\t\t\t\t\t\tshowChange={showChanges}\n\t\t\t\t\t\tshowIcon={showIcons}\n\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</Grid>\n\t\t</div>\n\t);\n}\n\nMetricGrid.displayName = 'MetricGrid';\n","/**\n * MetricComparison — period-over-period comparison surface.\n *\n * Renders the current and previous figures side by side as plain label/value\n * pairs (no tile per period), with a delta row below: a signed, tone-coded badge for the\n * absolute change and secondary text for the percentage. Layout stacks\n * vertically below the `sm` breakpoint.\n *\n * Accepts `MetricData` for both halves so format hints (currency, percent,\n * duration) carry over consistently. Strings overridable for i18n.\n */\nimport { ArrowDown, ArrowRight, ArrowUp, Equal } from 'lucide-react';\n\nimport { Badge } from '../../../base/badge';\nimport { Stack } from '../../../base/structure';\nimport { Value } from '../../../primitives';\nimport { DisplayLabel, Text } from '../../../typography';\nimport { type StringsProp, useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { formatNumber } from '../../../../lib/format';\n\nimport { formatMetricValue } from '../format-metric-value';\nimport { useMetricFormatOptions } from '../use-metric-format-options';\nimport type { MetricData } from '../types';\n\nexport interface MetricComparisonStrings {\n\t/** Surface title. */\n\ttitle: string;\n\tcurrentLabel: string;\n\tpreviousLabel: string;\n\tsuffix: string;\n\t/** Unit for the absolute change between two percentages. Additive; defaults to `pp`. */\n\tpointsUnit?: string;\n}\n\nexport const defaultMetricComparisonStrings: MetricComparisonStrings = {\n\ttitle: 'Comparison',\n\tcurrentLabel: 'This period',\n\tpreviousLabel: 'Previous period',\n\tsuffix: 'vs previous',\n\tpointsUnit: 'pp',\n};\n\nexport interface MetricComparisonProps {\n\tcurrent: MetricData;\n\tprevious: MetricData;\n\t/** Surface title. */\n\ttitle?: string;\n\tcurrentPeriod?: string;\n\tpreviousPeriod?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<MetricComparisonStrings>;\n}\n\nfunction toNumber(value: MetricData['value']): number | null {\n\tif (value === null || value === undefined) return null;\n\tif (typeof value === 'number') return value;\n\tconst n = Number(value);\n\treturn Number.isFinite(n) ? n : null;\n}\n\nexport function MetricComparison({\n\tcurrent,\n\tprevious,\n\ttitle,\n\tcurrentPeriod,\n\tpreviousPeriod,\n\tclassName,\n\tstrings: stringsProp,\n}: MetricComparisonProps) {\n\tconst strings = useStrings(defaultMetricComparisonStrings, stringsProp);\n\tconst formatOptions = useMetricFormatOptions();\n\n\tconst currentNum = toNumber(current.value);\n\tconst previousNum = toNumber(previous.value);\n\tconst canCompute = currentNum !== null && previousNum !== null;\n\tconst delta = canCompute ? (currentNum as number) - (previousNum as number) : 0;\n\tconst deltaPct = canCompute && (previousNum as number) !== 0\n\t\t? Math.round((delta / (previousNum as number)) * 100)\n\t\t: 0;\n\tconst isUp = delta > 0;\n\tconst isFlat = delta === 0;\n\tconst Arrow = isFlat ? Equal : isUp ? ArrowUp : ArrowDown;\n\n\t// The signed delta badge is the one place colour states the movement; the row\n\t// around it is plain, so the comparison does not sit in a tinted panel.\n\t// `current.trend` says whether this movement is good, as on Metric: a fall\n\t// in overdue balances or churn is positive.\n\tconst movement = isFlat ? 'neutral' : current.trend ?? (isUp ? 'positive' : 'negative');\n\tconst deltaTone = movement === 'positive' ? 'success' as const : movement === 'negative' ? 'destructive' as const : 'secondary' as const;\n\n\tconst formatDelta = (value: number) => {\n\t\tconst abs = Math.abs(value);\n\t\t// The absolute change between two rates is in percentage points, not a\n\t\t// percent: 9.4% → 8.2% moves 1.2 pp, while the text states the relative −13%.\n\t\tif (current.valueType === 'percentage') {\n\t\t\treturn `${formatNumber(abs * 100, { locale: formatOptions.locale, maximumFractionDigits: 1 })} ${strings.pointsUnit ?? defaultMetricComparisonStrings.pointsUnit}`;\n\t\t}\n\t\t// reuse the formatter so currency metrics render correctly\n\t\treturn formatMetricValue({ ...current, value: abs }, formatOptions);\n\t};\n\n\treturn (\n\t\t<Stack\n\t\t\tdata-component=\"metric-comparison\"\n\t\t\tdata-slot=\"metric-comparison\"\n\t\t\tgap=\"md\"\n\t\t\tclassName={cn('metric-comparison--component @container/metric-comparison', className)}\n\t\t\taria-label={title ?? strings.title}\n\t\t>\n\t\t\t{/* Plain figures, no tile per period: the grid gap separates them and the\n\t\t\t previous figure recedes through the secondary colour role. Each period\n\t\t\t badge heads the column it names. */}\n\t\t\t<div className=\"grid items-center gap-space-md grid-cols-1 @md/metric-comparison:grid-cols-[1fr_auto_1fr]\">\n\t\t\t\t<Stack gap=\"dense\" className=\"metric-comparison--current min-w-0\">\n\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\">\n\t\t\t\t\t\t<DisplayLabel className=\"text-inherit\">\n\t\t\t\t\t\t\t{strings.currentLabel}\n\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t{!!currentPeriod && (\n\t\t\t\t\t\t\t<Badge tone=\"secondary\" inline className=\"metric-comparison--period\">\n\t\t\t\t\t\t\t\t{currentPeriod}\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<Value type=\"inherit\" size=\"base\" weight=\"semibold\" className=\"tabular-nums\">\n\t\t\t\t\t\t{formatMetricValue(current, formatOptions)}\n\t\t\t\t\t</Value>\n\t\t\t\t</Stack>\n\t\t\t\t<div className=\"flex items-center text-muted-foreground @md/metric-comparison:justify-center\">\n\t\t\t\t\t<ArrowRight className=\"hidden size-icon @md/metric-comparison:block\" aria-hidden=\"true\" />\n\t\t\t\t\t<ArrowDown className=\"size-icon @md/metric-comparison:hidden\" aria-hidden=\"true\" />\n\t\t\t\t</div>\n\t\t\t\t<Stack gap=\"dense\" className=\"metric-comparison--previous min-w-0\">\n\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\">\n\t\t\t\t\t\t<DisplayLabel className=\"text-inherit\">\n\t\t\t\t\t\t\t{strings.previousLabel}\n\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t{!!previousPeriod && (\n\t\t\t\t\t\t\t<Badge tone=\"secondary\" inline className=\"metric-comparison--period\">\n\t\t\t\t\t\t\t\t{previousPeriod}\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<Value size=\"base\" weight=\"semibold\" type=\"secondary\" className=\"tabular-nums\">\n\t\t\t\t\t\t{formatMetricValue(previous, formatOptions)}\n\t\t\t\t\t</Value>\n\t\t\t\t</Stack>\n\t\t\t</div>\n\n\t\t\t{!!canCompute && (\n\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"metric-comparison--delta\">\n\t\t\t\t\t<Badge tone={deltaTone} size=\"sm\" inline>\n\t\t\t\t\t\t<Arrow className=\"size-icon-sm\" strokeWidth={2.5} aria-hidden=\"true\" />\n\t\t\t\t\t\t<Value size=\"inherit\" weight=\"semibold\" className=\"tabular-nums text-inherit\">\n\t\t\t\t\t\t\t{isUp ? '+' : isFlat ? '' : '−'}{formatDelta(delta)}\n\t\t\t\t\t\t</Value>\n\t\t\t\t\t</Badge>\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"tabular-nums\">\n\t\t\t\t\t\t{isUp ? '+' : isFlat ? '' : '−'}{Math.abs(deltaPct)}% {strings.suffix}\n\t\t\t\t\t</Text>\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</Stack>\n\t);\n}\n\nMetricComparison.displayName = 'MetricComparison';\n","/**\n * MetricMicroGrid — six-cell dense KPI overview where each cell pairs a\n * label/value with a different lightweight visualization (bars / line /\n * dots / progress / area / pie). Useful as a top-of-page summary widget\n * on a packed dashboard.\n *\n * Cells are positional: index 0 → bars, 1 → line, 2 → dots, 3 → progress,\n * 4 → area, 5 → pie. To pin a specific renderer, pass `chart` per cell.\n */\nimport { useId } from 'react';\nimport { Area, AreaChart, ResponsiveContainer } from 'recharts';\n\nimport { Progress } from '../../../base/feedback';\nimport { Stack } from '../../../base/structure';\nimport { Value } from '../../../primitives';\nimport { DisplayLabel } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\nimport { usePrefersReducedMotion } from '../../../../lib/use-prefers-reduced-motion';\n\nexport type MicroChartKind = 'bars' | 'line' | 'dots' | 'progress' | 'area' | 'pie';\n\nexport interface MicroMetricCell {\n\t/** Stable identity for this entry. */\n\tid?: string;\n\t/** Display label. */\n\tlabel: string;\n\t/** Current value. Controlled. */\n\tvalue: string;\n\t/** Records to render. */\n\tdata: readonly number[];\n\tchart?: MicroChartKind;\n}\n\nexport interface MetricMicroGridProps {\n\t/** Surface title. */\n\ttitle?: string;\n\tcells: readonly MicroMetricCell[];\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nconst DEFAULT_ORDER: MicroChartKind[] = ['bars', 'line', 'dots', 'progress', 'area', 'pie'];\n\n// Every single-series micro chart draws in the first chart colour: the cell's\n// label says what it measures, so a different hue per chart kind would be\n// decoration, and status colours (success/warning/info) would imply a state.\nconst CHART_COLORS: Record<MicroChartKind, string> = {\n\tbars: 'var(--chart-1)',\n\tline: 'var(--chart-1)',\n\tdots: 'var(--chart-1)',\n\tprogress: 'var(--chart-1)',\n\tarea: 'var(--chart-1)',\n\tpie: 'var(--chart-1)',\n};\n\n/** Categorical slices use the categorical chart roles in order. */\nconst PIE_PALETTE = ['var(--chart-1)', 'var(--chart-2)', 'var(--chart-3)'];\n\n// Every micro chart draws in one shared track height, the compact sparkline\n// height Metric uses, so a cell's chart reads at the same scale as its peers.\nconst CHART_TRACK = 'h-control-sm';\n\nfunction MicroBars({ data, color }: { data: readonly number[]; color: string }) {\n\tconst max = Math.max(...data, 1);\n\treturn (\n\t\t<div className={cn('flex items-end gap-space-2xs', CHART_TRACK)}>\n\t\t\t{data.slice(0, 6).map((v, i) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={`bar-${i}`}\n\t\t\t\t\tclassName=\"flex-1 rounded-t-radius-sm\"\n\t\t\t\t\tstyle={{ height: `${(v / max) * 100}%`, backgroundColor: color }}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\nfunction MicroLine({ data, color }: { data: readonly number[]; color: string }) {\n\tconst max = Math.max(...data, 1);\n\tconst min = Math.min(...data);\n\tconst range = max - min || 1;\n\tconst points = data.slice(0, 6);\n\treturn (\n\t\t<svg viewBox=\"0 0 60 16\" className={cn('w-full', CHART_TRACK)} preserveAspectRatio=\"none\">\n\t\t\t<polyline\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke={color}\n\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tpoints={points\n\t\t\t\t\t.map((v, i) => `${(i / Math.max(points.length - 1, 1)) * 60},${16 - ((v - min) / range) * 14}`)\n\t\t\t\t\t.join(' ')}\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\n// Dots encode position, not length, so like the line they scale between the\n// series minimum and maximum across the whole track.\nfunction MicroDots({ data, color }: { data: readonly number[]; color: string }) {\n\tconst points = data.slice(0, 5);\n\tconst max = Math.max(...points);\n\tconst min = Math.min(...points);\n\tconst range = max - min || 1;\n\treturn (\n\t\t<div className={cn('flex justify-around', CHART_TRACK)} data-intrinsic-geometry>\n\t\t\t{points.map((v, i) => (\n\t\t\t\t<div key={`dot-${i}`} className=\"relative h-full w-1.5\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute inset-x-0 h-1.5 rounded-full\"\n\t\t\t\t\t\tstyle={{ bottom: `calc(${(v - min) / range} * (100% - 0.375rem))`, backgroundColor: color }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\n/** The shared Progress meter, drawn in the grid's single chart colour and named by its cell. */\nfunction MicroProgress({ data, label }: { data: readonly number[]; label: string }) {\n\treturn (\n\t\t<Progress\n\t\t\tvalue={data[0] ?? 0}\n\t\t\tmax={data[1] ?? 100}\n\t\t\tsize=\"sm\"\n\t\t\taria-label={label}\n\t\t\tindicatorProps={{ className: 'bg-chart-1' }}\n\t\t/>\n\t);\n}\n\nfunction MicroAreaChart({ data, color }: { data: readonly number[]; color: string }) {\n\tconst id = useId();\n\tconst reducedMotion = usePrefersReducedMotion();\n\tconst gradId = `micro-area-${id.replaceAll(':', '')}`;\n\t// Like the line, the area spans the series range rather than starting at\n\t// zero: measured from the series minimum, a small change still reads.\n\tconst min = Math.min(...data);\n\tconst chartData = data.map((v, i) => ({ i, v: v - min }));\n\treturn (\n\t\t<div className={cn('w-full', CHART_TRACK)}>\n\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\" initialDimension={{ width: 1, height: 1 }}>\n\t\t\t\t<AreaChart data={chartData} margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<linearGradient id={gradId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={color} stopOpacity={0.3} />\n\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={color} stopOpacity={0} />\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t</defs>\n\t\t\t\t\t<Area type=\"monotone\" dataKey=\"v\" stroke={color} strokeWidth={1.25} fill={`url(#${gradId})`} isAnimationActive={!reducedMotion} />\n\t\t\t\t</AreaChart>\n\t\t\t</ResponsiveContainer>\n\t\t</div>\n\t);\n}\n\nfunction MicroPie({ data }: { data: readonly number[] }) {\n\tconst total = data.reduce((a, b) => a + b, 0) || 1;\n\tlet cumAngle = 0;\n\treturn (\n\t\t<svg viewBox=\"0 0 24 24\" className=\"size-control-sm\">\n\t\t\t{data.slice(0, 3).map((v, i) => {\n\t\t\t\tconst angle = (v / total) * 360;\n\t\t\t\tconst startAngle = cumAngle;\n\t\t\t\tcumAngle += angle;\n\t\t\t\tconst startRad = ((startAngle - 90) * Math.PI) / 180;\n\t\t\t\tconst endRad = ((startAngle + angle - 90) * Math.PI) / 180;\n\t\t\t\tconst largeArc = angle > 180 ? 1 : 0;\n\t\t\t\tconst x1 = 12 + 10 * Math.cos(startRad);\n\t\t\t\tconst y1 = 12 + 10 * Math.sin(startRad);\n\t\t\t\tconst x2 = 12 + 10 * Math.cos(endRad);\n\t\t\t\tconst y2 = 12 + 10 * Math.sin(endRad);\n\t\t\t\treturn (\n\t\t\t\t\t<path\n\t\t\t\t\t\tkey={`slice-${i}`}\n\t\t\t\t\t\td={`M12,12 L${x1},${y1} A10,10 0 ${largeArc},1 ${x2},${y2} Z`}\n\t\t\t\t\t\tfill={PIE_PALETTE[i % PIE_PALETTE.length]}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t})}\n\t\t</svg>\n\t);\n}\n\nfunction ChartFor({ kind, data, label }: { kind: MicroChartKind; data: readonly number[]; label: string }) {\n\tconst color = CHART_COLORS[kind];\n\tif (kind === 'bars') return <MicroBars data={data} color={color} />;\n\tif (kind === 'line') return <MicroLine data={data} color={color} />;\n\tif (kind === 'dots') return <MicroDots data={data} color={color} />;\n\tif (kind === 'progress') return <MicroProgress data={data} label={label} />;\n\tif (kind === 'area') return <MicroAreaChart data={data} color={color} />;\n\treturn <MicroPie data={data} />;\n}\n\n/**\n * Column ladders keyed by cell count, driven by the grid's own width so the\n * cells fill whatever region holds them: six cells read 2 × 3, then 3 × 2,\n * then one row on a wide dashboard.\n */\nconst COLUMNS: Record<number, string> = {\n\t1: 'grid-cols-1',\n\t2: 'grid-cols-2',\n\t3: 'grid-cols-1 @md/metric-micro-grid:grid-cols-3',\n\t4: 'grid-cols-2 @3xl/metric-micro-grid:grid-cols-4',\n\t5: 'grid-cols-2 @xl/metric-micro-grid:grid-cols-3 @5xl/metric-micro-grid:grid-cols-5',\n\t6: 'grid-cols-2 @xl/metric-micro-grid:grid-cols-3 @5xl/metric-micro-grid:grid-cols-6',\n};\n\nexport function MetricMicroGrid({ title = 'Overview', cells, className }: MetricMicroGridProps) {\n\tconst visible = cells.slice(0, 6);\n\treturn (\n\t\t<div\n\t\t\tdata-component=\"metric-micro-grid\"\n\t\t\tdata-slot=\"metric-micro-grid\"\n\t\t\tclassName={cn('metric-micro-grid--component @container/metric-micro-grid min-w-0 overflow-hidden', className)}\n\t\t\taria-label={title}\n\t\t>\n\t\t\t{/* Every cell rules its end and bottom edge; the grid overhangs the clipped\n\t\t\t root by one pixel so the outer edges draw no rule at any column count. */}\n\t\t\t<div className={cn('-me-px -mb-px grid', COLUMNS[Math.max(visible.length, 1)])}>\n\t\t\t\t{visible.map((cell, i) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={cell.id ?? cell.label}\n\t\t\t\t\t\tclassName=\"min-w-0 border-e border-b border-border/60 p-surface-xs\"\n\t\t\t\t\t>\n\t\t\t\t\t<Stack gap=\"sm\">\n\t\t\t\t\t\t<DisplayLabel className=\"truncate text-inherit\">\n\t\t\t\t\t\t\t{cell.label}\n\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t<Value type=\"inherit\" weight=\"bold\" className=\"truncate tabular-nums\">\n\t\t\t\t\t\t\t{cell.value}\n\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t<div className=\"mt-auto\">\n\t\t\t\t\t\t\t<ChartFor kind={cell.chart ?? DEFAULT_ORDER[i]} data={cell.data} label={cell.label} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Stack>\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\nMetricMicroGrid.displayName = 'MetricMicroGrid';\n","/**\n * MetricGradient — vivid full-bleed gradient hero card with embedded area\n * chart. Used at the top of marketing dashboards or analytics overview\n * pages where a single metric earns the most visual weight.\n *\n * Themes (`green` / `purple` / `warm` / `ocean`) resolve to semantic tokens;\n * the data prop accepts a `readonly MetricDataPoint[]` so consumers can pass\n * named time-series points.\n */\nimport { useId } from 'react';\nimport { Area, AreaChart, ResponsiveContainer } from 'recharts';\n\nimport { Stack } from '../../../base/structure';\nimport { DisplayLabel, Heading, Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\nimport { usePrefersReducedMotion } from '../../../../lib/use-prefers-reduced-motion';\n\nimport { MetricTrendChip } from '../atoms/metric-trend-chip';\nimport type { MetricChange, MetricDataPoint } from '../types';\n\nexport type MetricGradientTheme = 'green' | 'purple' | 'warm' | 'ocean';\n\nexport interface MetricGradientProps {\n\t/** Surface title. */\n\ttitle: string;\n\t/** Current value. Controlled. */\n\tvalue?: string;\n\tchange?: MetricChange;\n\t/** Records to render. */\n\tdata: readonly MetricDataPoint[];\n\ttheme?: MetricGradientTheme;\n\tsubtitle?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\n/**\n * Four themes, four looks. The ramps are decoration, so they draw from the\n * categorical chart roles rather than status (success/warning/destructive\n * would state a condition) or `primary` (near-black in the default theme, so\n * half the ramp vanished against the inverse panel). Retheming the chart\n * palette moves all four together: `ocean` runs blue into teal.\n */\nconst THEME_BG: Record<MetricGradientTheme, string> = {\n\tgreen: 'bg-gradient-to-br from-chart-1 via-chart-2 to-chart-1',\n\tpurple: 'bg-gradient-to-br from-chart-3 via-chart-4 to-chart-3',\n\twarm: 'bg-gradient-to-br from-chart-5 via-chart-4 to-chart-5',\n\tocean: 'bg-gradient-to-br from-chart-2 via-chart-1 to-chart-2',\n};\n\nconst CHART_INVERSE = 'var(--inverse-foreground)';\nconst CHART_INVERSE_SOFT = 'var(--inverse-muted)';\n\nexport function MetricGradient({\n\ttitle,\n\tvalue,\n\tchange,\n\tdata,\n\ttheme = 'green',\n\tsubtitle,\n\tclassName,\n}: MetricGradientProps) {\n\tconst id = useId();\n\tconst reducedMotion = usePrefersReducedMotion();\n\tconst gradientId = `metric-grad-${id.replaceAll(':', '')}`;\n\n\treturn (\n\t\t<div className={cn(\n\t\t\t\t'metric-gradient--component',\n\t\t\t\t'relative overflow-hidden rounded-surface p-surface text-inverse-foreground shadow-sm ring-1 ring-inverse-border',\n\t\t\t\tTHEME_BG[theme],\n\t\t\t\tclassName,\n\t\t\t)}>\n\t\t<Stack gap=\"md\">\n\t\t\t<Stack\n\t\t\t\tdirection=\"horizontal\"\n\t\t\t\talign=\"start\"\n\t\t\t\tjustify=\"between\"\n\t\t\t\twrap\n\t\t\t\tclassName=\"relative rounded-surface bg-inverse-background p-surface\"\n\t\t\t>\n\t\t\t\t<Stack gap=\"xs\" className=\"min-w-0\">\n\t\t\t\t\t<DisplayLabel tone=\"inverse\">{title}</DisplayLabel>\n\t\t\t\t\t{!!value && (\n\t\t\t\t\t\t<Heading tag=\"h3\" className=\"tabular-nums text-inverse-foreground\">\n\t\t\t\t\t\t\t{value}\n\t\t\t\t\t\t</Heading>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!subtitle && <Text size=\"xs\" className=\"text-inverse-muted\">{subtitle}</Text>}\n\t\t\t\t</Stack>\n\t\t\t\t{!!change && (\n\t\t\t\t\t<MetricTrendChip\n\t\t\t\t\t\tchange={change}\n\t\t\t\t\t\ttrend={change.direction === 'up' ? 'positive' : change.direction === 'down' ? 'negative' : 'neutral'}\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tvariant=\"badge\"\n\t\t\t\t\t\tclassName=\"shrink-0 !bg-inverse-surface-strong !text-inverse-foreground\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Stack>\n\n\t\t\t<div className=\"relative -mx-1 h-24\">\n\t\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\" initialDimension={{ width: 1, height: 1 }}>\n\t\t\t\t\t<AreaChart data={data as MetricDataPoint[]} margin={{ top: 4, right: 0, bottom: 0, left: 0 }}>\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t<linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={CHART_INVERSE} stopOpacity={0.3} />\n\t\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={CHART_INVERSE} stopOpacity={0} />\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t\t<Area\n\t\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\t\tdataKey=\"value\"\n\t\t\t\t\t\t\tstroke={CHART_INVERSE_SOFT}\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\tfill={`url(#${gradientId})`}\n\t\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\t\tactiveDot={{ r: 4, strokeWidth: 2, fill: CHART_INVERSE, stroke: CHART_INVERSE_SOFT }}\n\t\t\t\t\t\t\tisAnimationActive={!reducedMotion}\n\t\t\t\t\t\t\tanimationDuration={800}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</AreaChart>\n\t\t\t\t</ResponsiveContainer>\n\t\t\t</div>\n\t\t</Stack>\n\t\t</div>\n\t);\n}\n\nMetricGradient.displayName = 'MetricGradient';\n","/**\n * ActivityHeatmap — GitHub-style daily-activity calendar grid. Renders the\n * provided range as Monday-aligned columns with per-day intensity tinted\n * via the success palette. Month labels float above the grid; the legend\n * sits on the trailing edge.\n *\n * The layout uses absolute month labels with a 3-week minimum gap rule\n * so labels don't collide when a month starts mid-week.\n */\nimport { Stack } from '../../../base/structure';\nimport { Text } from '../../../typography';\nimport { textVariants } from '../../../typography/text.styles';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAnalyticsStrings } from '../analytics.strings';\nimport type { ActivityHeatmapDay, ActivityHeatmapProps, ActivityLevel } from './types';\nimport { rampRecipes } from '../../../../lib/tone-recipes';\n\nconst LEVEL_COLOR: Record<ActivityLevel, string> = {\n\t0: rampRecipes.activity[0],\n\t1: rampRecipes.activity[1],\n\t2: rampRecipes.activity[2],\n\t3: rampRecipes.activity[3],\n\t4: rampRecipes.activity[4],\n};\n\nconst AXIS_LABEL_CLASS = cn('text--component fill-current', textVariants({ size: 'xs', type: 'secondary', lineHeight: 'none' }));\n\ninterface BuiltCalendar {\n\tweeks: (ActivityHeatmapDay | null)[][];\n\tmonthLabels: { label: string; weekIndex: number }[];\n}\n\nfunction buildCalendar(\n\tdata: readonly ActivityHeatmapDay[],\n\tmonthNames: readonly string[],\n): BuiltCalendar {\n\tif (data.length === 0) return { weeks: [], monthLabels: [] };\n\n\tconst sorted = [...data].sort((a, b) => a.date.localeCompare(b.date));\n\tconst startDate = new Date(sorted[0].date + 'T00:00:00');\n\tconst endDate = new Date(sorted[sorted.length - 1].date + 'T00:00:00');\n\n\tconst dayOfWeek = startDate.getDay();\n\tconst mondayOffset = dayOfWeek === 0 ? -6 : 1 - dayOfWeek;\n\tconst alignedStart = new Date(startDate);\n\talignedStart.setDate(alignedStart.getDate() + mondayOffset);\n\n\tconst dateMap = new Map<string, ActivityLevel>();\n\tfor (const d of sorted) dateMap.set(d.date, d.level);\n\n\tconst weeks: (ActivityHeatmapDay | null)[][] = [];\n\tconst monthLabels: { label: string; weekIndex: number }[] = [];\n\tlet lastMonth = -1;\n\tlet currentWeek: (ActivityHeatmapDay | null)[] = [];\n\n\tconst cursor = new Date(alignedStart);\n\twhile (cursor <= endDate) {\n\t\t// The cursor advances in local calendar days; UTC serialization can shift\n\t\t// a positive-offset midnight into the previous date and misplace its level.\n\t\tconst dateStr = `${String(cursor.getFullYear()).padStart(4, '0')}-${String(cursor.getMonth() + 1).padStart(2, '0')}-${String(cursor.getDate()).padStart(2, '0')}`;\n\t\tconst dayIdx = (cursor.getDay() + 6) % 7;\n\n\t\tif (dayIdx === 0 && currentWeek.length > 0) {\n\t\t\tweeks.push(currentWeek);\n\t\t\tcurrentWeek = [];\n\t\t}\n\n\t\tconst month = cursor.getMonth();\n\t\tif (month !== lastMonth) {\n\t\t\tconst labelWeekIndex = dayIdx === 0 ? weeks.length : weeks.length + 1;\n\t\t\tconst existing = monthLabels.find((m) => m.weekIndex === labelWeekIndex);\n\t\t\tif (!existing) monthLabels.push({ label: monthNames[month], weekIndex: labelWeekIndex });\n\t\t\tlastMonth = month;\n\t\t}\n\n\t\tconst level = dateMap.get(dateStr) ?? 0;\n\t\tcurrentWeek.push({ date: dateStr, level });\n\t\tcursor.setDate(cursor.getDate() + 1);\n\t}\n\n\tif (currentWeek.length > 0) {\n\t\twhile (currentWeek.length < 7) currentWeek.push(null);\n\t\tweeks.push(currentWeek);\n\t}\n\n\treturn { weeks, monthLabels };\n}\n\nexport function ActivityHeatmap({\n\ttitle,\n\tdescription,\n\tdata,\n\tclassName,\n\tstrings: stringsProp,\n}: ActivityHeatmapProps) {\n\tconst strings = useStrings(defaultAnalyticsStrings, stringsProp);\n\tconst { weeks, monthLabels } = buildCalendar(data, strings.heatmapMonthNames);\n\n\treturn (\n\t\t<Stack\n\t\t\tgap=\"md\"\n\t\t\tdata-component=\"activity-heatmap\"\n\t\t\tdata-slot=\"activity-heatmap\"\n\t\t\tclassName={cn('activity-heatmap--component', className)}\n\t\t\taria-label={title}\n\t\t>\n\t\t\t{!!description && (\n\t\t\t\t<Text type=\"secondary\">\n\t\t\t\t\t{description}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t<div className=\"overflow-x-auto\" data-intrinsic-geometry>\n\t\t\t\t{/* Plot coordinates are intrinsic drawing geometry: 12px cells on\n\t\t\t\t\ta 15px pitch. Scaling UI gaps would detach days from their labels. */}\n\t\t\t\t<div className=\"inline-flex min-w-max flex-col gap-space-sm\">\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth={28 + weeks.length * 15}\n\t\t\t\t\t\theight={124}\n\t\t\t\t\t\tclassName=\"block overflow-visible\"\n\t\t\t\t\t\trole=\"img\"\n\t\t\t\t\t\taria-label={title}\n\t\t\t\t\t>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t{monthLabels\n\t\t\t\t\t\t\t\t.filter((m, idx, arr) => idx === 0 || m.weekIndex - arr[idx - 1].weekIndex >= 3)\n\t\t\t\t\t\t\t\t.map((m) => (\n\t\t\t\t\t\t\t\t\t<text key={`${m.label}-${m.weekIndex}`} className={AXIS_LABEL_CLASS} data-typography=\"text\" x={28 + m.weekIndex * 15} y={0} dominantBaseline=\"text-before-edge\">\n\t\t\t\t\t\t\t\t\t\t{m.label}\n\t\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t{strings.heatmapDayLabels.map((label, i) => label ? (\n\t\t\t\t\t\t\t\t<text key={`day-${i}`} className={AXIS_LABEL_CLASS} data-typography=\"text\" x={24} y={28 + i * 15} dominantBaseline=\"central\" textAnchor=\"end\">\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t) : null)}\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t{weeks.map((week, weekIdx) => (\n\t\t\t\t\t\t\t<g key={`w-${weekIdx}`}>\n\t\t\t\t\t\t\t\t{week.map((day, dayIdx) => (\n\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\tkey={`d-${weekIdx}-${dayIdx}`}\n\t\t\t\t\t\t\t\t\t\tx={28 + weekIdx * 15}\n\t\t\t\t\t\t\t\t\t\ty={22 + dayIdx * 15}\n\t\t\t\t\t\t\t\t\t\twidth={12}\n\t\t\t\t\t\t\t\t\t\theight={12}\n\t\t\t\t\t\t\t\t\t\trx={2.5}\n\t\t\t\t\t\t\t\t\t\tclassName={day ? LEVEL_COLOR[day.level] : 'fill-transparent'}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{day && <title>{`${day.date}: Level ${day.level}`}</title>}\n\t\t\t\t\t\t\t\t\t</rect>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</svg>\n\n\t\t\t\t\t<div className=\"activity-heatmap--legend flex items-center justify-end gap-space-sm\">\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.heatmapLegendLess}</Text>\n\t\t\t\t\t\t{([0, 1, 2, 3, 4] as ActivityLevel[]).map((level) => (\n\t\t\t\t\t\t\t<svg key={`legend-${level}`} width={12} height={12} aria-hidden=\"true\" className=\"shrink-0\">\n\t\t\t\t\t\t\t\t<rect width={12} height={12} rx={2.5} className={LEVEL_COLOR[level]} />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.heatmapLegendMore}</Text>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Stack>\n\t);\n}\n\nActivityHeatmap.displayName = 'ActivityHeatmap';\n","/**\n * ChartCard — standard admin chart surface for custom Recharts compositions.\n *\n * Use when a consumer wants this library's admin hierarchy around a bespoke\n * chart. Data, axes, series, and Recharts children stay caller-owned; the\n * component provides ChartContainer config, slots, and BEM hooks. It remains\n * card-free until the call site opts into `surface` and `padding`.\n */\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport {\n\tChartContainer,\n\ttype ChartConfig,\n\ttype ChartInitialDimension,\n} from '../../../base/chart';\nimport { ContentBlock } from '../../../base/display';\nimport type { CardSurface, ComponentScale } from '../../../../lib/component-vocabulary';\nimport { cn } from '../../../../lib/utils';\n\nexport type ChartCardPadding = ComponentScale;\nexport type ChartCardSurface = CardSurface;\n\nexport interface ChartCardProps {\n\t/** Surface title. */\n\ttitle?: ReactNode;\n\t/** Supporting copy shown under the label. */\n\tdescription?: ReactNode;\n\t/** Content at the end of the header, before the overflow menu. */\n\theaderEnd?: ReactNode;\n\t/** Status or count shown immediately after the title. */\n\ttitleSuffix?: ReactNode;\n\t/** Content below the body. */\n\tfooter?: ReactNode;\n\tconfig: ChartConfig;\n\tchildren: ComponentProps<typeof ChartContainer>['children'];\n\tinitialDimension?: ChartInitialDimension;\n\t/** Outer chrome. */\n\tsurface?: ChartCardSurface;\n\t/** Surface inset. */\n\tpadding?: ChartCardPadding;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Merged onto the content. */\n\tcontentClassName?: string;\n\t/** Merged onto the chart. */\n\tchartClassName?: string;\n}\n\nexport function ChartCard({\n\ttitle,\n\tdescription,\n\theaderEnd,\n\ttitleSuffix,\n\tfooter,\n\tconfig,\n\tchildren,\n\tinitialDimension,\n\tsurface,\n\tpadding,\n\tclassName,\n\tcontentClassName,\n\tchartClassName,\n}: ChartCardProps) {\n\treturn (\n\t\t<ContentBlock\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\theaderEnd={headerEnd}\n\t\t\ttitleSuffix={titleSuffix}\n\t\t\tfooterSlot={footer}\n\t\t\tsurface={surface}\n\t\t\tpadding={padding}\n\t\t\tclassName={cn('chart-card--component', className)}\n\t\t\tcontentClassName={cn('chart-card--content', contentClassName)}\n\t\t>\n\t\t\t<ChartContainer\n\t\t\t\tconfig={config}\n\t\t\t\tinitialDimension={initialDimension}\n\t\t\t\tclassName={cn('chart-card--chart min-h-[var(--chart-min-height)]', chartClassName)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</ChartContainer>\n\t\t</ContentBlock>\n\t);\n}\n\nChartCard.displayName = 'ChartCard';\n","import type { StringsProp } from '../../../../lib/strings';\n\nexport interface TimeDistributionRulerStrings {\n\t/** Density-band legend labels. */\n\tlegendNone: string;\n\tlegendLow: string;\n\tlegendMedium: string;\n\tlegendHigh: string;\n\t/** \"Now\" marker label. */\n\tlegendNow: string;\n\t/**\n\t * Renders an hour of the day (0–23) as the axis tick and as the leading\n\t * part of the per-hour tooltip. Zero-padded two-digit numerals are only\n\t * the English/Latin default — override this to reach any other numbering\n\t * system or clock convention.\n\t */\n\tformatHourLabel: (hour: number) => string;\n\t/**\n\t * Format function for the per-hour `title` tooltip. Receives the already\n\t * formatted `hourLabel` and the bucket's count. The default names no\n\t * domain; add the noun your data actually counts.\n\t */\n\tformatHourTitle: (hourLabel: string, count: number) => string;\n}\n\nexport const defaultTimeDistributionRulerStrings: TimeDistributionRulerStrings = {\n\tlegendNone: 'None',\n\tlegendLow: 'Low',\n\tlegendMedium: 'Medium',\n\tlegendHigh: 'High',\n\tlegendNow: 'Now',\n\tformatHourLabel: (hour) => String(hour).padStart(2, '0'),\n\tformatHourTitle: (hourLabel, count) => `${hourLabel}:00 - ${count}`,\n};\n\nexport interface TimeDistributionRulerProps {\n\thours: number[];\n\tcurrentHour?: number;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<TimeDistributionRulerStrings>;\n}\n","import { SecondaryValue } from '../../../primitives';\nimport { Stack } from '../../../base/structure';\nimport { Text } from '../../../typography/text';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultTimeDistributionRulerStrings, type TimeDistributionRulerProps } from './types';\nimport { rampRecipes } from '../../../../lib/tone-recipes';\n\nexport function TimeDistributionRuler({ hours, currentHour, className, strings: stringsProp }: TimeDistributionRulerProps) {\n\tconst strings = useStrings(defaultTimeDistributionRulerStrings, stringsProp);\n\tconst maxVal = Math.max(...hours, 1);\n\tconst peakHour = hours.indexOf(Math.max(...hours));\n\n\tfunction getDensityClass(count: number): string {\n\t\tif (count === 0) return rampRecipes.density[0];\n\t\tconst ratio = count / maxVal;\n\t\tif (ratio < 0.33) return rampRecipes.density[1];\n\t\tif (ratio < 0.66) return rampRecipes.density[2];\n\t\treturn rampRecipes.density[3];\n\t}\n\n\treturn (\n\t\t<Stack gap=\"sm\" className={cn('time-ruler--component', className)}>\n\t\t\t{/* Ruler bar */}\n\t\t\t<div className=\"relative flex h-8 gap-px overflow-hidden rounded-radius-md\">\n\t\t\t\t{hours.map((count, hour) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={hour}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'relative flex-1 transition-colors',\n\t\t\t\t\t\t\tgetDensityClass(count),\n\t\t\t\t\t\t\thour === peakHour && 'ring-1 ring-primary ring-inset',\n\t\t\t\t\t\t)}\n\t\t\t\t\t\ttitle={strings.formatHourTitle(strings.formatHourLabel(hour), count)}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t{/* Hour labels + now marker */}\n\t\t\t<div className=\"relative flex\">\n\t\t\t\t{hours.map((_, hour) => (\n\t\t\t\t\t<div key={hour} className=\"flex-1 text-center\">\n\t\t\t\t\t\t{hour % 4 === 0 && (\n\t\t\t\t\t\t\t<SecondaryValue size=\"xs\" className=\"tabular-nums\">\n\t\t\t\t\t\t\t\t{strings.formatHourLabel(hour)}\n\t\t\t\t\t\t\t</SecondaryValue>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t{/* Now marker */}\n\t\t\t{currentHour !== undefined && currentHour >= 0 && currentHour < 24 && (\n\t\t\t\t<div className=\"relative h-0\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute -top-[42px] flex flex-col items-center\"\n\t\t\t\t\t\tstyle={{ left: `${(currentHour / 24) * 100}%`, transform: 'translateX(-50%)' }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"h-0 w-0 border-x-[4px] border-b-[5px] border-x-transparent border-b-destructive\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{/* Legend */}\n\t\t\t<div className=\"flex items-center gap-space-lg\">\n\t\t\t\t<div className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t<div className={cn('h-2 w-3 rounded-radius-sm', rampRecipes.density[0])} />\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.legendNone}</Text>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t<div className={cn('h-2 w-3 rounded-radius-sm', rampRecipes.density[1])} />\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.legendLow}</Text>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t<div className={cn('h-2 w-3 rounded-radius-sm', rampRecipes.density[2])} />\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.legendMedium}</Text>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t<div className={cn('h-2 w-3 rounded-radius-sm', rampRecipes.density[3])} />\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.legendHigh}</Text>\n\t\t\t\t</div>\n\t\t\t\t{currentHour !== undefined && (\n\t\t\t\t\t<div className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t\t<div className=\"h-0 w-0 border-x-[3px] border-b-[4px] border-x-transparent border-b-destructive\" />\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.legendNow}</Text>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</Stack>\n\t);\n}\n\nTimeDistributionRuler.displayName = 'TimeDistributionRuler';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,IAAa8B,IAA4C;CACxD,kBAAkB;CAClB,iBAAiB;CACjB,kBAAkB;EAAC;EAAO;EAAI;EAAO;EAAI;EAAO;EAAI;CAAE;CACtD,mBAAmB;EAClB;EAAO;EAAO;EAAO;EAAO;EAAO;EACnC;EAAO;EAAO;EAAO;EAAO;EAAO;CACpC;CACA,mBAAmB;CACnB,mBAAmB;AACpB;;;ACPA,SAAgBC,EAAkB,GAAkB,IAAoC,CAAC,GAAW;CACnG,IAAIC,EAAK,UAAU,QAAQA,EAAK,UAAU,KAAA,GAAW,OAAA;CAErD,IAAMC,IAAQD,EAAK,OACbE,IAAU,OAAOD,KAAU,WAAWA,IAAQ,MAC9C,EAAE,cAAWE;CAEnB,QAAQH,EAAK,WAAb;EACC,KAAK,YACJ,OAAOE,MAAY,OAOhB,OAAOD,CAAK,IANXX,EAAkB;GACpB,QAAQY;GACR,UAAUF,EAAK,YAAYG,EAAQ,mBAAmB;GACtD;GACA,YAAYA,EAAQ,mBAAmB;EACxC,CAAC,KAAA;EAEH,KAAK,cACJ,OAAOD,MAAY,OAA+C,OAAOD,CAAK,IAApDhB,EAAiBiB,GAAS,EAAE,UAAO,CAAC;EAC/D,KAAK,YACJ,OAAOA,MAAY,OAA6C,OAAOD,CAAK,IAAlDd,EAAee,GAAS,EAAE,UAAO,CAAC;EAC7D,KAAK,UACJ,OAAOA,MAAY,OAA2C,OAAOD,CAAK,IAAhDf,EAAagB,GAAS,EAAE,UAAO,CAAC;EAE3D,SACC,OAAO,OAAOD,CAAK;CACrB;AACD;AAOA,SAAgBG,GAAa,GAAuD;CAInF,OAHIJ,EAAK,QAAcA,EAAK,QACxBA,EAAK,QAAQ,cAAc,OAAa,aACxCA,EAAK,QAAQ,cAAc,SAAe,aACvC;AACR;;;ACrCA,IAAMK,KAAoF;CACzF,UAAU;EAAE,MAAM;EAAgB,OAAO,GAAG3B,EAAY,QAAQ,KAAK,GAAGA,EAAY,QAAQ;EAAO,OAAO;CAAe;CACzH,UAAU;EAAE,MAAM;EAAoB,OAAO,GAAGA,EAAY,YAAY,KAAK,GAAGA,EAAY,YAAY;EAAO,OAAO;CAAmB;CACzI,SAAS;EAAE,MAAM;EAAyB,OAAO;EAAkC,OAAO;CAAwB;AACnH,GAEM4B,IAAwC;CAC7C,IAAI;CACJ,IAAI;CACJ,IAAI;AACL,GAEMC,IAAqD;CAC1D,IAAI;CACJ,IAAI;CACJ,IAAI;AACL,GAEMC,KAA4C;CACjD,IAAI;CACJ,IAAI;CACJ,IAAI;AACL;AAEA,SAASC,GAAY,GAAgC,GAAmD;CAIvG,OAHIC,MACAC,MAAc,OAAa,aAC3BA,MAAc,SAAe,aAC1B;AACR;AAEA,SAAgBC,EAAgB,EAC/B,WACA,UACA,UAAO,MACP,aAAU,WACV,gBACwB;CACxB,IAAMC,IAAOJ,GAAYC,GAAOI,EAAO,SAAS,GAC1CC,IAAOD,EAAO,cAAc,OAAOE,IAAUF,EAAO,cAAc,SAASG,IAAYC,IACvFC,IAAUd,GAAaQ,IACvBO,IAAY,OAAON,EAAO,KAAK,GAC/BO,IAAOP,EAAO,cAAc,OAAO,OAAMA,EAAO,WAAuB;CAoC7E,OAlCIQ,MAAY,WAEd,kBAAClC,GAAD;EAAO,MAAK;EAAU,MAAMmB,EAAUgB;EAAO,QAAO;EAAS,WAAWnD,EAAG,gCAAgC+C,EAAQ,MAAM,gBAAgBK,CAAS;EAAlJ,UAAA,CACEH,GAAMD,CACD;MAILE,MAAY,YAEd,kBAAC,QAAD;EAAM,WAAWlD,EAAG,0CAA0C+C,EAAQ,MAAMK,CAAS;EAArF,UAAA,CACC,kBAACT,GAAD;GAAM,WAAWT,EAAUiB;GAAO,aAAa;GAAK,eAAY;EAAQ,CAAA,GACxE,kBAACnC,GAAD;GAAO,MAAK;GAAU,MAAMmB,EAAUgB;GAAO,QAAO;GAAW,WAAU;GACvE,UAAAH;EACK,CAAA,CACF;MAIJE,MAAY,UAEd,kBAAC,QAAD;EAAM,WAAWlD,EAAG,wDAAwD+C,EAAQ,OAAOX,GAAce,IAAOC,CAAS;EAAzH,UAAA;GACC,kBAACT,GAAD;IAAM,WAAWT,EAAUiB;IAAO,aAAa;IAAK,eAAY;GAAQ,CAAA;GACxE,kBAACnC,GAAD;IAAO,MAAK;IAAU,MAAMmB,EAAUgB;IAAO,QAAO;IAAW,WAAU;IACvE,UAAAH;GACK,CAAA;GACN,CAAC,CAACN,EAAO,SACT,kBAACxC,GAAD;IAAM,MAAK;IAAU,KAAI;IAAO,MAAMiC,EAAUgB;IAAQ,UAAAT,EAAO;GAAY,CAAA;EAEvE;MAMP,kBAAC,QAAD;EAAM,WAAW1C,EAAG,yCAAyC+C,EAAQ,MAAMK,CAAS;EAApF,UAAA;GACC,kBAACT,GAAD;IAAM,WAAWT,EAAUiB;IAAO,aAAa;IAAK,eAAY;GAAQ,CAAA;GACxE,kBAACnC,GAAD;IAAO,MAAK;IAAU,MAAMmB,EAAUgB;IAAO,QAAO;IAAW,WAAU;IACvE,UAAAH;GACK,CAAA;GACN,CAAC,CAACN,EAAO,SACT,kBAACxC,GAAD;IAAM,KAAI;IAAO,MAAMiC,EAAUgB;IAAO,MAAK;IAAa,UAAAT,EAAO;GAAY,CAAA;EAEzE;;AAER;AAEA,EAAgB,cAAc;;;ACvH9B,IAAMW,IAAQ;AAEd,SAASC,GAAU,GAAsB;CACxC,IAAI,OAAO,SAAW,OAAe,OAAO,OAAO,cAAe,YAAY,aAAa,CAAC;CAC5F,IAAMC,IAAQ,OAAO,WAAWF,CAAK;CAErC,OADAE,EAAM,iBAAiB,UAAUC,CAAQ,SAC5BD,EAAM,oBAAoB,UAAUC,CAAQ;AAC1D;AAEA,SAASC,KAAc;CACtB,OAAO,OAAO,SAAW,OAAe,OAAO,OAAO,cAAe,cAClE,OAAO,WAAWJ,CAAK,CAAC,CAAC;AAE7B;AAGA,SAASK,KAAoB;CAC5B,OAAO;AACR;AAGA,SAAgBC,IAA0B;CACzC,OAAOC,GAAqBN,IAAWG,IAAaC,EAAiB;AACtE;;;ACAA,IAAMG,KAA4C;CACjD,UAAU;CACV,UAAU;CACV,SAAS;AACV;AAEA,SAAgBC,EAAgB,EAC/B,SACA,WAAQ,WACR,UACA,cACA,cAAW,IACX,cAAcC,IAAY,qBACF;CACxB,IAAMC,IAAKC,EAAM,GACXC,IAAgBP,EAAwB,GACxCQ,IAAaC,QAAc,gBAAgBJ,EAAG,WAAW,KAAK,EAAE,KAAK,CAACA,CAAE,CAAC,GACzEK,IAASC,KAAST,GAAavB,IAE/BiC,IAAYH,QACb,CAAC,MAAM,QAAQxC,CAAI,KAAKA,EAAK,WAAW,IAAU,CAAC,IAChDA,EAAK,KAAK,GAAO,OAAO;EAAE;EAAG,GAAGC;CAAM,EAAE,GAC7C,CAACD,CAAI,CAAC;CAMT,OAJI2C,EAAU,WAAW,IACjB,kBAAC,OAAD;EAAK,WAAWvE,EAAG,+BAA+B,iBAAiBoD,CAAS;EAAG,eAAY;CAAQ,CAAA,IAI1G,kBAAC,OAAD;EAAK,WAAWpD,EAAG,6CAA6CoD,CAAS;EAAG,MAAK;EAAM,cAAYW;EAClG,UAAA,kBAACS,GAAD;GAAqB,OAAM;GAAO,QAAO;GAAO,kBAAkB;IAAE,OAAO;IAAG,QAAQ;GAAE;GACvF,UAAA,kBAACC,GAAD;IAAW,MAAMF;IAAW,QAAQ;KAAE,KAAK;KAAG,OAAO;KAAG,QAAQ;KAAG,MAAM;IAAE;IAA3E,UAAA,CACC,kBAAC,QAAD,EAAA,UACC,kBAAC,kBAAD;KAAgB,IAAIJ;KAAY,IAAG;KAAI,IAAG;KAAI,IAAG;KAAI,IAAG;KAAxD,UAAA,CACC,kBAAC,QAAD;MAAM,QAAO;MAAK,WAAWE;MAAQ,aAAa;KAAO,CAAA,GACzD,kBAAC,QAAD;MAAM,QAAO;MAAO,WAAWA;MAAQ,aAAa;KAAI,CAAA,CACzC;IACX,CAAA,EAAA,CAAA,GACN,kBAACK,GAAD;KACC,MAAK;KACL,SAAQ;KACA;KACR,aAAa;KACb,MAAM,QAAQP,EAAW;KACzB,KAAK;KACL,WAAW;KACX,mBAAmBQ,KAAY,CAACT;KAChC,mBAAmB;IACnB,CAAA,CACS;;EACS,CAAA;CACjB,CAAA;AAEP;AAEA,EAAgB,cAAc;;;AC7D9B,IAAMU,KAAO,EAAE,mBACd,kBAACjE,GAAD,EAAqB,aAAY,CAAA;AAGlC,SAAgBkE,EAAe,EAC9B,aAAU,WACV,UAAO,MACP,gBACuB;CAGvB,IAAMC,IACL,kBAACzE,GAAD;EAAO,KAAI;EAAX,UAAA;GACC,kBAACuE,GAAD,EAAK,WAAU,WAAY,CAAA;GAC3B,kBAACvE,GAAD;IAAO,KAAI;IAAX,UAAA,CACC,kBAACuE,GAAD,EAAK,WAAWzB,MAAS,OAAO,aAAa,WAAa,CAAA,GAC1D,kBAACyB,GAAD,EAAK,WAAU,WAAY,CAAA,CACrB;;GACP,kBAACA,GAAD,EAAK,WAAU,aAAc,CAAA;EACvB;;CAyCR,OAtCI1B,MAAY,UAAUA,MAAY,cAAcA,MAAY,YAAYA,MAAY,YAItF,kBAACzC,GAAD;EACC,SAASyC,MAAY,SAAS,KAAA,IAAY;EAC1C,WAAWlD,EAAG,8BAA8BoD,CAAS;EACrD,aAAU;EACV,aAAU;EAET,UAAA0B;CACI,CAAA,IAIJ5B,MAAY,YAEd,kBAAC,OAAD;EAAK,WAAWlD,EAAG,kCAAkCoD,CAAS;EAAG,aAAU;EAA3E,UAAA;GACC,kBAACwB,GAAD,EAAK,WAAU,6BAA8B,CAAA;GAC7C,kBAACvE,GAAD;IAAO,KAAI;IAAK,WAAU;IAA1B,UAAA,CACC,kBAACuE,GAAD,EAAK,WAAU,WAAY,CAAA,GAC3B,kBAACA,GAAD,EAAK,WAAU,WAAY,CAAA,CACrB;;GACP,kBAACA,GAAD,EAAK,WAAU,wBAAyB,CAAA;EACpC;MAIH1B,MAAY,YAEd,kBAAC,OAAD;EAAK,WAAWlD,EAAG,2CAA2CoD,CAAS;EAAG,aAAU;EAApF,UAAA,CACC,kBAACwB,GAAD,EAAK,WAAU,WAAY,CAAA,GAC3B,kBAACA,GAAD,EAAK,WAAU,WAAY,CAAA,CACvB;MAMN,kBAAC,OAAD;EAAK,WAAW5E,EAAG,wCAAwCoD,CAAS;EAAG,aAAU;EAAjF,UAAA;GACC,kBAACwB,GAAD,EAAK,WAAU,WAAY,CAAA;GAC3B,kBAACA,GAAD,EAAK,WAAU,WAAY,CAAA;GAC3B,kBAACA,GAAD,EAAK,WAAU,kBAAmB,CAAA;EAC9B;;AAEP;AAEA,EAAe,cAAc;;;ACjF7B,SAAgBG,IAAmD;CAClE,IAAM,EAAE,cAAWjF,EAAoB,GACjC,EAAE,oBAAiB,kBAAeC,EAAe;CACvD,OAAOqE,SACC;EAAE;EAAQ;EAAiB,iBAAiBY;CAAW,IAC9D;EAACC;EAAQC;EAAiBF;CAAU,CACrC;AACD;;;ACmDA,IAAMG,IAAiH;CACtH,SAAS;EAAE,QAAQ;EAAiB,IAAI;EAAW,KAAK;EAAiB,KAAK;EAAiB,MAAM;CAAc;CACnH,SAAS;EAAE,QAAQ7E,EAAY,QAAQ;EAAM,IAAIA,EAAY,QAAQ;EAAM,KAAKA,EAAY,QAAQ;EAAO,KAAKA,EAAY,QAAQ;EAAO,MAAMA,EAAY,QAAQ;CAAK;CAC1K,SAAS;EAAE,QAAQA,EAAY,QAAQ;EAAM,IAAIA,EAAY,QAAQ;EAAM,KAAKA,EAAY,QAAQ;EAAO,KAAKA,EAAY,QAAQ;EAAO,MAAMA,EAAY,QAAQ;CAAK;CAC1K,SAAS;EAAE,QAAQA,EAAY,QAAQ;EAAM,IAAIA,EAAY,QAAQ;EAAM,KAAKA,EAAY,QAAQ;EAAO,KAAKA,EAAY,QAAQ;EAAO,MAAMA,EAAY,QAAQ;CAAK;CAC1K,QAAQ;EAAE,QAAQA,EAAY,YAAY;EAAM,IAAIA,EAAY,YAAY;EAAM,KAAKA,EAAY,YAAY;EAAO,KAAKA,EAAY,YAAY;EAAO,MAAMA,EAAY,YAAY;CAAK;CAC7L,MAAM;EAAE,QAAQA,EAAY,KAAK;EAAM,IAAIA,EAAY,KAAK;EAAM,KAAKA,EAAY,KAAK;EAAO,KAAKA,EAAY,KAAK;EAAO,MAAMA,EAAY,KAAK;CAAK;AACzJ,GAGM8E,KAAmD;CACxD,IAAI;CACJ,IAAI;CACJ,IAAI;AACL,GAGMC,IAAwD;CAC7D,IAAI;CACJ,IAAI;CACJ,IAAI;AACL,GAEMC,KAA4C;CACjD,IAAI;CACJ,IAAI;CACJ,IAAI;AACL,GAEMC,KAA+C;CACpD,IAAI;CACJ,IAAI;CACJ,IAAI;AACL,GAEMC,KAAgB;AAEtB,SAAgBC,EAAO,GAAoB;CAC1C,IAAM,EACL,SACA,aAAU,WACV,UAAO,MACP,iBAAc,WACd,mBAAgB,IAChB,gBAAa,IACb,cAAW,IACX,aAAU,IACV,WAAQ,IACR,eACA,cAAW,GACX,cACA,cAAc1B,MACX2B,GACEC,IAAgB3F,EAAG,qBAAqBoD,CAAS,GAEjDwC,IAAgBb,EAAuB,GACvCc,IAAiBzB,QAAczC,EAAkBC,GAAMgE,CAAa,GAAG,CAAChE,GAAMgE,CAAa,CAAC,GAC5FtD,IAAQ8B,QAAcpC,GAAaJ,CAAI,GAAG,CAACA,CAAI,CAAC;CAEtD,IAAIkE,GAAS,OAAO,kBAACjB,GAAD;EAAyB;EAAe;EAAM,WAAWc;CAAgB,CAAA;CAC7F,IAAII,GACH,OACC,kBAACtF,GAAD;EAAM,WAAWkF;EAAe,kBAAiB;EAChD,UAAA,kBAACzF,GAAD;GAAM,MAAK;GAAW,UAAA8F,KAActE,EAAwB;EAAuB,CAAA;CAC9E,CAAA;CAIR,IAAMuE,IAAc;EACnB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAAWlC,KAAanC,EAAK;EAC7B,WAAW+D;CACZ;CAEA,QAAQzC,GAAR;EACC,KAAK,QACJ,OAAO,kBAACgD,IAAD,EAAY,GAAID,EAAc,CAAA;EACtC,KAAK,WACJ,OAAO,kBAACE,IAAD,EAAe,GAAIF,EAAc,CAAA;EACzC,KAAK,WACJ,OAAO,kBAACG,IAAD,EAAe,GAAIH,EAAc,CAAA;EACzC,KAAK,YACJ,OAAO,kBAACI,IAAD,EAAgB,GAAIJ,EAAc,CAAA;EAC1C,KAAK,UACJ,OAAO,kBAACK,IAAD,EAAc,GAAIL,EAAc,CAAA;EACxC,KAAK,WACJ,OAAO,kBAACM,IAAD;GAAe,GAAIN;GAAuB;EAAW,CAAA;EAC7D,SACC,OAAO,kBAACO,IAAD,EAAe,GAAIP,EAAc,CAAA;CAC1C;AACD;AAEA,EAAO,cAAc;AA0BrB,SAASO,GAAc,EAAE,SAAM,mBAAgB,UAAO,SAAM,kBAAe,eAAY,aAAU,cAAW,gBAAuB;CAClI,IAAM7D,IAAOf,EAAK;CAClB,OACC,kBAACvB,GAAD;EAAO,KAAI;EAAgB;EAAW,cAAY0D;EAAlD,UAAA;GACC,kBAAC1D,GAAD;IAAO,WAAU;IAAa,OAAM;IAAS,KAAI;IAAK,WAAU;IAAhE,UAAA,CACE,CAAC,CAACoG,KAAY,CAAC,CAAC9D,KAAQ,kBAACA,GAAD;KAAM,WAAU;KAAwB,eAAY;IAAQ,CAAA,GACrF,kBAACzC,GAAD;KAAM,MAAK;KAAK,MAAK;KAAY,QAAO;KAAS,WAAU;KAAY,UAAA0B,EAAK;IAAY,CAAA,CAClF;;GACP,kBAAC8E,GAAD;IAAS,KAAI;IAAK,MAAMtB,GAAgBjC;IAAO,WAAU;IAAqC,OAAO0C;IACnG,UAAAA;GACO,CAAA;GACR,CAAC,CAACc,KAAc,CAAC,CAAC/E,EAAK,UACvB,kBAAC,OAAD;IAAK,WAAU;IACd,UAAA,kBAACY,GAAD;KAAiB,QAAQZ,EAAK;KAAQ,OAAOA,EAAK;KAAa;KAAM,SAAQ;IAAW,CAAA;GACpF,CAAA;GAEL,CAAC,CAACA,EAAK,YAAY,kBAAC1B,GAAD;IAAM,MAAK;IAAK,MAAK;IAAY,WAAU;IAAY,UAAA0B,EAAK;GAAe,CAAA;GAC9F,CAAC,CAACgF,KAAiB,CAAC,CAAChF,EAAK,WAAW,UACrC,kBAACkC,GAAD;IAAiB,MAAMlC,EAAK;IAAkB;IAAO,WAAW5B,EAAG,WAAWuF,GAAiBpC,EAAK;GAAI,CAAA;GAExG,CAAC,CAACvB,EAAK,UAAU,kBAAC1B,GAAD;IAAM,MAAK;IAAK,MAAK;IAAW,WAAU;IAAY,UAAA0B,EAAK;GAAa,CAAA;EACpF;;AAET;AAEA,SAASsE,GAAW,EAAE,SAAM,mBAAgB,UAAO,SAAM,kBAAe,eAAY,aAAU,cAAW,gBAAuB;CAC/H,IAAMvD,IAAOf,EAAK,MACZiF,IAAgB,GAAQjF,EAAK,QAAQA,EAAK;CAoChD,OAlCChC,kBAACa,GAAD;EACC,OAAO,kBAACP,GAAD;GAAM,KAAI;GAAO,MAAK;GAAK,MAAK;GAAY,QAAO;GAAU,UAAA0B,EAAK;EAAY,CAAA;EACrF,MAAQ6E,KAAc9D,IAAO,kBAACA,GAAD;GAAM,WAAU;GAAY,eAAY;EAAQ,CAAA,IAAI;EACjF,SAASf,EAAK;EACd,WAAW5B,EAAG,0BAA0B6G,KAAiB,kHAAkHzD,CAAS;EACpL,cAAYW;EALb,UAAA,CAOE8C,MAAkBjF,EAAK,OAAO,kBAAC,KAAD;GAAG,MAAMA,EAAK;GAAM,SAASA,EAAK;GAAS,cAAYmC;GAAW,WAAW,kFAAkF5D,EAAa;EAAU,CAAA,IAAI,kBAAC,UAAD;GAAQ,MAAK;GAAS,SAASyB,EAAK;GAAS,cAAYmC;GAAW,WAAW,kBAAkBnD,EAAmB,kBAAkB,kFAAkFT,EAAa;EAAU,CAAA,IACxc,kBAACE,GAAD;GAAO,KAAI;GAAX,UAAA;IACC,kBAACA,GAAD;KAAO,WAAU;KAAa,OAAM;KAAW,SAAQ;KAAU,KAAI;KAArE,UAAA,CACC,kBAACqG,GAAD;MACC,KAAKvD,MAAS,OAAO,OAAOA,MAAS,OAAO,OAAO;MACnD,MAAMkC,EAAqBlC;MAC3B,WAAWnD,EAAG,oDAAoDsF,GAAcnC,EAAK;MAEpF,UAAA0C;KACO,CAAA,GACR,CAAC,CAACc,KAAc,CAAC,CAAC/E,EAAK,UACvB,kBAACY,GAAD;MAAiB,QAAQZ,EAAK;MAAQ,OAAOA,EAAK;MAAa;MAAM,SAAQ;MAAQ,WAAU;KAAwC,CAAA,CAElI;;IACN,CAAC,CAACA,EAAK,YAAY,kBAAC1B,GAAD;KAAM,MAAK;KAAa,UAAA0B,EAAK;IAAe,CAAA;IAC/D,CAAC,CAACgF,KAAiB,CAAC,CAAChF,EAAK,WAAW,UACrC,kBAACkC,GAAD;KACC,MAAMlC,EAAK;KACJ;KACP,WAAWuB,MAAS,OAAO,iBAAiB;IAC5C,CAAA;IAED,CAAC,CAACvB,EAAK,UAAU,kBAAC1B,GAAD;KAAM,MAAK;KAAK,MAAK;KAAa,UAAA0B,EAAK;IAAa,CAAA;GAChE;EACF,CAAA,CAAA;CAGA,CAAA;AACR;AAEA,SAASuE,GAAc,EAAE,SAAM,mBAAgB,SAAM,eAAY,aAAU,cAAW,gBAAuB;CAC5G,IAAMxD,IAAOf,EAAK;CAClB,OACC,kBAAC,OAAD;EAAK,WAAW5B,EAAG,kCAAkCoD,CAAS;EAAG,cAAYW;EAA7E,UAAA;GACE,CAAC,CAAC0C,KAAY,CAAC,CAAC9D,KAAQ,kBAACxB,GAAD;IAAW,MAAMwB;IAAM,MAAK;IAAY,OAAM;IAAS,MAAK;GAAM,CAAA;GAC3F,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACC,kBAACzC,GAAD;KAAM,MAAK;KAAK,MAAK;KAAY,WAAU;KAAY,UAAA0B,EAAK;IAAY,CAAA,GACxE,kBAACZ,GAAD;KAAO,MAAK;KAAU,MAAMmC,MAAS,OAAO,OAAO;KAAQ,QAAO;KAAO,WAAU;KACjF,UAAA0C;IACK,CAAA,CACH;;GACJ,CAAC,CAACc,KAAc,CAAC,CAAC/E,EAAK,UACvB,kBAACY,GAAD;IAAiB,QAAQZ,EAAK;IAAQ,OAAOA,EAAK;IAAa;IAAM,SAAQ;IAAQ,WAAU;GAAY,CAAA;EAExG;;AAEP;AAEA,SAASwE,GAAc,EAAE,SAAM,mBAAgB,SAAM,eAAY,cAAW,gBAAuB;CAClG,OACC,kBAAC,QAAD;EAAM,WAAWpG,EAAG,2CAA2CoD,CAAS;EAAG,cAAYW;EAAvF,UAAA;GACC,kBAAC7D,GAAD;IAAM,KAAI;IAAO,MAAMiD,MAAS,OAAO,OAAO;IAAM,MAAK;IAAzD,UAAA,CAAsEvB,EAAK,OAAM,GAAO;;GACxF,kBAACZ,GAAD;IAAO,MAAK;IAAU,MAAMmC,MAAS,OAAO,OAAO;IAAM,QAAO;IAAW,WAAU;IAAgB,UAAA0C;GAAsB,CAAA;GAC1H,CAAC,CAACc,KAAc,CAAC,CAAC/E,EAAK,UACvB,kBAACY,GAAD;IAAiB,QAAQZ,EAAK;IAAQ,OAAOA,EAAK;IAAO,MAAK;IAAK,SAAQ;GAAU,CAAA;EAEjF;;AAER;AAEA,SAASyE,GAAe,EAAE,SAAM,mBAAgB,UAAO,SAAM,kBAAe,eAAY,aAAU,gBAAa,cAAW,gBAAuB;CAChJ,IAAM1D,IAAOf,EAAK,MACZkF,IAAO3B,EAAY4B;CAEzB,OACC,kBAACtG,GAAD;EAAM,SAAQ;EAAO,WAAWT,EAAG8G,EAAK,QAAQA,EAAK,IAAI1D,CAAS;EAAG,cAAYW;EAChF,UAAA,kBAAC1D,GAAD;GAAO,KAAI;GAAX,UAAA;IACC,kBAACA,GAAD;KAAO,WAAU;KAAa,OAAM;KAAS,SAAQ;KAAU,KAAI;KAAnE,UAAA,CACC,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,CAAC,CAACoG,KAAY,CAAC,CAAC9D,KAAQ,kBAACA,GAAD;OAAM,WAAU;OAAqB,eAAY;MAAQ,CAAA,GAClF,kBAACzC,GAAD;OAAM,MAAK;OAAK,MAAK;OAAY,QAAO;OAAU,UAAA0B,EAAK;MAAY,CAAA,CAC/D;KACJ,CAAA,GAAA,CAAC,CAAC+E,KAAc,CAAC,CAAC/E,EAAK,UACvB,kBAACY,GAAD;MAAiB,QAAQZ,EAAK;MAAQ,OAAOA,EAAK;MAAa;MAAM,SAAQ;KAAS,CAAA,CAEjF;;IACP,kBAAC8E,GAAD;KACC,KAAKvD,MAAS,OAAO,OAAO;KAC5B,MAAMkC,EAAqBlC;KAC3B,WAAU;KAET,UAAA0C;IACO,CAAA;IACR,CAAC,CAACjE,EAAK,YAAY,kBAAC1B,GAAD;KAAM,MAAK;KAAK,MAAK;KAAa,UAAA0B,EAAK;IAAe,CAAA;IACzE,CAAC,CAACgF,KAAiB,CAAC,CAAChF,EAAK,WAAW,UACrC,kBAACkC,GAAD;KAAiB,MAAMlC,EAAK;KAAkB;KAAO,WAAW2D,GAAiBpC;IAAQ,CAAA;IAEzF,CAAC,CAACvB,EAAK,UAAU,kBAAC1B,GAAD;KAAM,MAAK;KAAK,MAAK;KAAY,UAAA0B,EAAK;IAAa,CAAA;GAC/D;;CACF,CAAA;AAER;AAEA,SAAS0E,GAAa,EAAE,SAAM,mBAAgB,UAAO,SAAM,kBAAe,eAAY,aAAU,cAAW,gBAAuB;CACjI,IAAM3D,IAAOf,EAAK;CAGlB,OACC,kBAACnB,GAAD;EAAM,SAAQ;EAAO,SAAQ;EAAO,WAAWT,EAAG,QAAQoD,CAAS;EAAG,cAAYW;EAAlF,UAAA,CACC,kBAAC1D,GAAD;GAAO,KAAI;GAAK,WAAU;GAA1B,UAAA;IACC,kBAACA,GAAD;KAAO,WAAU;KAAa,OAAM;KAAS,SAAQ;KAAU,KAAI;KAAnE,UAAA,CACC,kBAAC2G,GAAD;MAAc,WAAU;MACtB,UAAApF,EAAK;KACO,CAAA,GACb,CAAC,CAAC6E,KAAY,CAAC,CAAC9D,KAChB,kBAACxB,GAAD;MAAW,MAAK;MAAY,OAAM;MAAS,MAAK;MAC/C,UAAA,kBAACwB,GAAD;OAAM,WAAU;OAAe,eAAY;MAAQ,CAAA;KACzC,CAAA,CAEN;;IACP,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAAC+D,GAAD;MACC,KAAI;MACJ,MAAMrB,EAAqBlC;MAC3B,WAAU;MAET,UAAA0C;KACO,CAAA,GACR,CAAC,CAACc,KAAc,CAAC,CAAC/E,EAAK,UACvB,kBAACY,GAAD;MAAiB,QAAQZ,EAAK;MAAQ,OAAOA,EAAK;MAAa;MAAM,SAAQ;KAAW,CAAA,CAErF;;IACJ,CAAC,CAACA,EAAK,YAAY,kBAAC1B,GAAD;KAAM,MAAK;KAAK,MAAK;KAAa,UAAA0B,EAAK;IAAe,CAAA;GACpE;EACN,CAAA,GAAA,CAAC,CAACgF,KAAiB,CAAC,CAAChF,EAAK,WAAW,UACrC,kBAACkC,GAAD;GAAiB,MAAMlC,EAAK;GAAkB;GAAO,WAAU;EAAuB,CAAA,CAElF;;AAER;AAEA,SAAS2E,GAAc,EAAE,SAAM,mBAAgB,SAAM,eAAY,gBAAa,cAAW,cAAW,cAAW,KAAuC;CACrJ,IAAMO,IAAO3B,EAAY4B,MAAgB,YAAY,YAAYA,IAC3DE,IAAc,KAAK,MAAO,KAAK,IAAI,KAAK,IAAIC,GAAU,CAAC,GAAG,GAAG,IAAI,MAAO1B,EAAa;CAC3F,OACC,kBAAC/E,GAAD;EAAM,SAAQ;EAAkB;EAAW,cAAYsD;EACtD,UAAA,kBAAC1D,GAAD;GAAO,KAAI;GAAX,UAAA;IACC,kBAACA,GAAD;KAAO,KAAI;KAAX,UAAA,CACC,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACC,kBAACH,GAAD;OAAM,MAAK;OAAK,MAAK;OAAY,QAAO;OAAS,WAAU;OAAY,UAAA0B,EAAK;MAAY,CAAA,GACxF,kBAAC,QAAD;OAAM,WAAW5B,EAAGQ,EAAW,QAAQsG,EAAK,GAAG;OAAG,eAAY;MAAQ,CAAA,CAClE;KAEL,CAAA,GAAA,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACC,kBAACJ,GAAD;OACC,KAAI;OACJ,MAAMrB,EAAqBlC;OAC3B,WAAU;OAET,UAAA0C;MACO,CAAA,GACR,CAAC,CAACjE,EAAK,YAAY,kBAAC1B,GAAD;OAAM,MAAK;OAAK,MAAK;OAAa,UAAA0B,EAAK;MAAe,CAAA,CACtE;KACC,CAAA,CAAA;;IACP,kBAAC,OAAD;KACC,WAAU;KACV,MAAK;KACL,cAAY,GAAGA,EAAK,MAAM;KAC1B,iBAAesF;KACf,iBAAe;KACf,iBAAe;KACf,kBAAgB,GAAGA,EAAS;KAE3B,UAAA,MAAM,KAAK,EAAE,QAAQ1B,GAAc,IAAI,GAAG,MAC1C,kBAAC,OAAD,EAEC,WAAWxF,EAAG,iDAAiDmH,IAAIF,IAAcH,EAAK,MAAM,UAAU,EACtG,GAFK,OAAOK,GAEZ,CACD;IACG,CAAA;KACH,CAAC,EAAER,KAAc/E,EAAK,WAAW,CAAC,CAACA,EAAK,WACzC,kBAACvB,GAAD;KAAO,KAAI;KAAX,UAAA,CACE,CAAC,CAACsG,KAAc,CAAC,CAAC/E,EAAK,UACvB,kBAAC,OAAD,EAAA,UACC,kBAACY,GAAD;MAAiB,QAAQZ,EAAK;MAAQ,OAAOA,EAAK;MAAa;MAAM,SAAQ;KAAW,CAAA,EACpF,CAAA,GAEL,CAAC,CAACA,EAAK,UACP,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACC,kBAACwF,IAAD;OAAc,WAAU;OAAe,eAAY;MAAQ,CAAA,GAC3D,kBAAClH,GAAD;OAAM,MAAK;OAAK,MAAK;OAAa,UAAA0B,EAAK;MAAa,CAAA,CAChD;KAEA,CAAA,CAAA;;GAEF;;CACF,CAAA;AAER;;;ACrXA,SAAgByF,GAAU,EACzB,YACA,WACA,mBACA,aAAU,WACV,UAAO,MACP,oBAAiB,IACjB,iBAAc,IACd,eACA,gBACkB;CAClB,IAAMC,IACL,kBAAC,OAAD;EAAK,WAAU;EACb,UAAAC,EAAQ,KAAK,MAMb,kBAAC,OAAD;GAAqB,WAAU;GAC9B,UAAA,kBAAC9B,GAAD;IACC,MAAM+B;IACN,SAAQ;IACF;IACN,eAAeC;IACf,YAAYC;IACZ,WAAU;GACV,CAAA;EACG,GATKF,EAAO,EASZ,CACL;CACG,CAAA,GAGAG,IAAa,CAAC,CAACC,KACpB,kBAAC,OAAD;EAAK,WAAU;EACd,UAAA,kBAAC3H,GAAD;GACC,MAAK;GACL,aAAY;GACZ,WAAU;GACV,SAAS4H,UAAuBA,EAAeD,EAAO,KAAK,IAAI,KAAA;GAJhE,UAAA,CAMC,kBAACE,IAAD;IAAU,WAAU;IAAe,eAAY;GAAQ,CAAA,GACvD,kBAAC5H,GAAD;IAAM,MAAK;IAAU,MAAK;IAAU,QAAO;IAAU,UAAA0H,EAAO;GAAY,CAAA,CACjE;;CACJ,CAAA;CAgCN,OA7BI1E,MAAY,aAEd,kBAAC,OAAD;EACC,WAAWlD,EAAG,0DACb,UAGA,mFACAoD,CACD;EAPD,UAAA,CASC,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACEuE,KACA,kBAAA9H,IAAA,EAAA,UAAA,CACE8H,GACD,kBAAC,OAAD;IAAK,WAAU;IAA6C,eAAY;GAAQ,CAAA,CAC/E,EAAA,CAAA,GAEFL,CACG;EACJ,CAAA,GAAA,CAAC,CAACS,KACF,kBAAC,OAAD;GAAK,WAAU;GACd,UAAA,kBAAC7H,GAAD;IAAM,MAAK;IAAK,MAAK;IAAY,UAAA6H;GAAiB,CAAA;EAC9C,CAAA,CAEF;MAKN,kBAAC,OAAD;EACC,WAAW/H,EACV,2KACAoD,CACD;EAJD,UAAA,CAMC,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACEuE,KACA,kBAAA9H,IAAA,EAAA,UAAA,CACE8H,GACD,kBAAC,OAAD;IAAK,WAAU;IAA6C,eAAY;GAAQ,CAAA,CAC/E,EAAA,CAAA,GAEFL,CACG;EACJ,CAAA,GAAA,CAAC,CAACS,KACF,kBAAC,OAAD;GAAK,WAAU;GACd,UAAA,kBAAC7H,GAAD;IAAM,MAAK;IAAK,MAAK;IAAY,UAAA6H;GAAiB,CAAA;EAC9C,CAAA,CAEF;;AAEP;AAEA,GAAU,cAAc;;;ACnFxB,IAAMC,KAAyF;CAC9F,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACJ;AAEA,SAASC,GAAe,GAAuB;CAE9C,OAAOD,GADSE,KAAS,IAAI,IAAIA,MAAU,IAAI,IAAIA,MAAU,IAAI,IAAIA,KAAS,KAAKA,IAAQ,IAAI,IAAI;AAEpG;AAEA,SAAgBC,GAAW,EAC1B,YACA,aAAU,QACV,UAAO,MACP,iBAAc,WACd,aAAU,QACV,SAAM,MACN,oBAAiB,IACjB,iBAAc,IACd,eAAY,IACZ,aAAU,IACV,gBACmB;CACnB,IAAMC,IAAeC,MAAY,SAASJ,GAAeV,EAAQ,MAAM,IAAIS,GAAaK;CAExF,OAMC,kBAAC,OAAD;EAAK,WAAWrI,EAAG,iDAAiDoD,CAAS;EAC5E,UAAA,kBAAChD,GAAD;GACC,SAAS;GACJ;GACL,WAAWJ,EAAG,qBAAqBoI,CAAY;GAE9C,UAAAb,EAAQ,KAAK,MACb,kBAAC9B,GAAD;IAEC,MAAM+B;IACG;IACH;IACO;IACb,eAAeC;IACf,YAAYC;IACZ,UAAUY;IACD;GACT,GATKd,EAAO,EASZ,CACD;EACI,CAAA;CACF,CAAA;AAEP;AAEA,GAAW,cAAc;;;ACjFzB,IAAae,IAA0D;CACtE,OAAO;CACP,cAAc;CACd,eAAe;CACf,QAAQ;CACR,YAAY;AACb;AAeA,SAASC,GAAS,GAA2C;CAC5D,IAAI3G,KAAU,MAA6B,OAAO;CAClD,IAAI,OAAOA,KAAU,UAAU,OAAOA;CACtC,IAAM4G,IAAI,OAAO5G,CAAK;CACtB,OAAO,OAAO,SAAS4G,CAAC,IAAIA,IAAI;AACjC;AAEA,SAAgBC,GAAiB,EAChC,YACA,aACA,UACA,kBACA,mBACA,cACA,SAASC,KACgB;CACzB,IAAMC,IAAUC,EAAWN,GAAgCI,CAAW,GAChE/C,IAAgBb,EAAuB,GAEvC+D,IAAaN,GAASO,EAAQ,KAAK,GACnCC,IAAcR,GAASS,EAAS,KAAK,GACrCC,IAAaJ,MAAe,QAAQE,MAAgB,MACpDG,IAAQD,IAAcJ,IAAyBE,IAAyB,GACxEI,IAAWF,KAAeF,MAA2B,IACxD,KAAK,MAAOG,IAASH,IAA0B,GAAG,IAClD,GACGK,IAAOF,IAAQ,GACfG,IAASH,MAAU,GACnBI,IAAQD,IAASE,KAAQH,IAAOzG,IAAUC,GAM1C4G,IAAWH,IAAS,YAAYP,EAAQ,UAAUM,IAAO,aAAa,aACtEK,IAAYD,MAAa,aAAa,YAAqBA,MAAa,aAAa,gBAAyB;CAapH,OACC,kBAACpJ,GAAD;EACC,kBAAe;EACf,aAAU;EACV,KAAI;EACJ,WAAWL,EAAG,6DAA6DoD,CAAS;EACpF,cAAYuG,KAASf,EAAQ;EAL9B,UAAA,CAUC,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACC,kBAACvI,GAAD;KAAO,KAAI;KAAQ,WAAU;KAA7B,UAAA,CACC,kBAACA,GAAD;MAAO,WAAU;MAAa,MAAA;MAAK,OAAM;MAAS,KAAI;MAAtD,UAAA,CACC,kBAAC2G,GAAD;OAAc,WAAU;OACtB,UAAA4B,EAAQ;MACI,CAAA,GACb,CAAC,CAACgB,KACF,kBAACxI,GAAD;OAAO,MAAK;OAAY,QAAA;OAAO,WAAU;OACvC,UAAAwI;MACK,CAAA,CAEF;KACP,CAAA,GAAA,kBAAC5I,GAAD;MAAO,MAAK;MAAU,MAAK;MAAO,QAAO;MAAW,WAAU;MAC5D,UAAAW,EAAkBoH,GAASnD,CAAa;KACnC,CAAA,CACD;;IACP,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAACiE,IAAD;MAAY,WAAU;MAA+C,eAAY;KAAQ,CAAA,GACzF,kBAAChH,GAAD;MAAW,WAAU;MAAyC,eAAY;KAAQ,CAAA,CAC9E;;IACL,kBAACxC,GAAD;KAAO,KAAI;KAAQ,WAAU;KAA7B,UAAA,CACC,kBAACA,GAAD;MAAO,WAAU;MAAa,MAAA;MAAK,OAAM;MAAS,KAAI;MAAtD,UAAA,CACC,kBAAC2G,GAAD;OAAc,WAAU;OACtB,UAAA4B,EAAQ;MACI,CAAA,GACb,CAAC,CAACkB,KACF,kBAAC1I,GAAD;OAAO,MAAK;OAAY,QAAA;OAAO,WAAU;OACvC,UAAA0I;MACK,CAAA,CAEF;KACP,CAAA,GAAA,kBAAC9I,GAAD;MAAO,MAAK;MAAO,QAAO;MAAW,MAAK;MAAY,WAAU;MAC9D,UAAAW,EAAkBsH,GAAUrD,CAAa;KACpC,CAAA,CACD;;GACH;EAEJ,CAAA,GAAA,CAAC,CAACsD,KACF,kBAAC7I,GAAD;GAAO,WAAU;GAAa,MAAA;GAAK,OAAM;GAAS,KAAI;GAAK,WAAU;GAArE,UAAA,CACC,kBAACe,GAAD;IAAO,MAAMsI;IAAW,MAAK;IAAK,QAAA;IAAlC,UAAA,CACC,kBAACH,GAAD;KAAO,WAAU;KAAe,aAAa;KAAK,eAAY;IAAQ,CAAA,GACtE,kBAACvI,GAAD;KAAO,MAAK;KAAU,QAAO;KAAW,WAAU;KAAlD,UAAA,CACEqI,IAAO,MAAMC,IAAS,KAAK,OAhEb,MAAkB;MACtC,IAAMS,IAAM,KAAK,IAAIlI,CAAK;MAO1B,OAJIkH,EAAQ,cAAc,eAClB,GAAGjI,EAAaiJ,IAAM,KAAK;OAAE,QAAQnE,EAAc;OAAQ,uBAAuB;MAAE,CAAC,EAAE,GAAGgD,EAAQ,cAAcL,EAA+B,eAGhJ5G,EAAkB;OAAE,GAAGoH;OAAS,OAAOgB;MAAI,GAAGnE,CAAa;KACnE,EAuDuC,CAAYuD,CAAK,CAC5C;IACD,CAAA,CAAA;GACP,CAAA,GAAA,kBAACjJ,GAAD;IAAM,MAAK;IAAK,MAAK;IAAY,WAAU;IAA3C,UAAA;KACEmJ,IAAO,MAAMC,IAAS,KAAK;KAAK,KAAK,IAAIF,CAAQ;KAAE;KAAGR,EAAQ;IAC1D;GACA,CAAA,CAAA;EAEF,CAAA,CAAA;;AAET;AAEA,GAAiB,cAAc;;;ACjI/B,IAAMoB,KAAkC;CAAC;CAAQ;CAAQ;CAAQ;CAAY;CAAQ;AAAK,GAKpFC,KAA+C;CACpD,MAAM;CACN,MAAM;CACN,MAAM;CACN,UAAU;CACV,MAAM;CACN,KAAK;AACN,GAGMC,KAAc;CAAC;CAAkB;CAAkB;AAAgB,GAInEC,IAAc;AAEpB,SAASC,GAAU,EAAE,SAAM,YAAqD;CAC/E,IAAMC,IAAM,KAAK,IAAI,GAAGzI,GAAM,CAAC;CAC/B,OACC,kBAAC,OAAD;EAAK,WAAW5B,EAAG,gCAAgCmK,CAAW;EAC5D,UAAAvI,EAAK,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,MACzB,kBAAC,OAAD;GAEC,WAAU;GACV,OAAO;IAAE,QAAQ,GAAI0I,IAAID,IAAO,IAAI;IAAI,iBAAiB/F;GAAM;EAC/D,GAHK,OAAO6C,GAGZ,CACD;CACG,CAAA;AAEP;AAEA,SAASoD,GAAU,EAAE,SAAM,YAAqD;CAC/E,IAAMF,IAAM,KAAK,IAAI,GAAGzI,GAAM,CAAC,GACzB4I,IAAM,KAAK,IAAI,GAAG5I,CAAI,GACtB6I,IAAQJ,IAAMG,KAAO,GACrBE,IAAS9I,EAAK,MAAM,GAAG,CAAC;CAC9B,OACC,kBAAC,OAAD;EAAK,SAAQ;EAAY,WAAW5B,EAAG,UAAUmK,CAAW;EAAG,qBAAoB;EAClF,UAAA,kBAAC,YAAD;GACC,MAAK;GACL,QAAQ7F;GACR,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,QAAQoG,EACN,KAAK,GAAG,MAAM,GAAIvD,IAAI,KAAK,IAAIuD,EAAO,SAAS,GAAG,CAAC,IAAK,GAAG,GAAG,MAAOJ,IAAIE,KAAOC,IAAS,IAAI,CAAC,CAC9F,KAAK,GAAG;EACV,CAAA;CACG,CAAA;AAEP;AAIA,SAASE,GAAU,EAAE,SAAM,YAAqD;CAC/E,IAAMD,IAAS9I,EAAK,MAAM,GAAG,CAAC,GACxByI,IAAM,KAAK,IAAI,GAAGK,CAAM,GACxBF,IAAM,KAAK,IAAI,GAAGE,CAAM,GACxBD,IAAQJ,IAAMG,KAAO;CAC3B,OACC,kBAAC,OAAD;EAAK,WAAWxK,EAAG,uBAAuBmK,CAAW;EAAG,2BAAA;EACtD,UAAAO,EAAO,KAAK,GAAG,MACf,kBAAC,OAAD;GAAsB,WAAU;GAC/B,UAAA,kBAAC,OAAD;IACC,WAAU;IACV,OAAO;KAAE,QAAQ,SAASJ,IAAIE,KAAOC,EAAM;KAAwB,iBAAiBnG;IAAM;GAC1F,CAAA;EACG,GALK,OAAO6C,GAKZ,CACL;CACG,CAAA;AAEP;AAGA,SAASyD,GAAc,EAAE,SAAM,YAAqD;CACnF,OACC,kBAAClK,GAAD;EACC,OAAOkB,EAAK,MAAM;EAClB,KAAKA,EAAK,MAAM;EAChB,MAAK;EACL,cAAYiJ;EACZ,gBAAgB,EAAE,WAAW,aAAa;CAC1C,CAAA;AAEH;AAEA,SAASC,GAAe,EAAE,SAAM,YAAqD;CACpF,IAAM9G,IAAKC,EAAM,GACXC,IAAgBP,EAAwB,GACxCoH,IAAS,cAAc/G,EAAG,WAAW,KAAK,EAAE,KAG5CwG,IAAM,KAAK,IAAI,GAAG5I,CAAI,GACtB2C,IAAY3C,EAAK,KAAK,GAAG,OAAO;EAAE;EAAG,GAAG0I,IAAIE;CAAI,EAAE;CACxD,OACC,kBAAC,OAAD;EAAK,WAAWxK,EAAG,UAAUmK,CAAW;EACvC,UAAA,kBAAC3F,GAAD;GAAqB,OAAM;GAAO,QAAO;GAAO,kBAAkB;IAAE,OAAO;IAAG,QAAQ;GAAE;GACvF,UAAA,kBAACC,GAAD;IAAW,MAAMF;IAAW,QAAQ;KAAE,KAAK;KAAG,OAAO;KAAG,QAAQ;KAAG,MAAM;IAAE;IAA3E,UAAA,CACC,kBAAC,QAAD,EAAA,UACC,kBAAC,kBAAD;KAAgB,IAAIwG;KAAQ,IAAG;KAAI,IAAG;KAAI,IAAG;KAAI,IAAG;KAApD,UAAA,CACC,kBAAC,QAAD;MAAM,QAAO;MAAK,WAAWzG;MAAO,aAAa;KAAM,CAAA,GACvD,kBAAC,QAAD;MAAM,QAAO;MAAO,WAAWA;MAAO,aAAa;KAAI,CAAA,CACxC;IACX,CAAA,EAAA,CAAA,GACN,kBAACI,GAAD;KAAM,MAAK;KAAW,SAAQ;KAAI,QAAQJ;KAAO,aAAa;KAAM,MAAM,QAAQyG,EAAO;KAAI,mBAAmB,CAAC7G;IAAgB,CAAA,CACvH;;EACS,CAAA;CACjB,CAAA;AAEP;AAEA,SAAS8G,GAAS,EAAE,WAAqC;CACxD,IAAMC,IAAQrJ,EAAK,QAAQ,GAAG,MAAMsJ,IAAIC,GAAG,CAAC,KAAK,GAC7CC,IAAW;CACf,OACC,kBAAC,OAAD;EAAK,SAAQ;EAAY,WAAU;EACjC,UAAAxJ,EAAK,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM;GAC/B,IAAMyJ,IAASf,IAAIW,IAAS,KACtBK,IAAaF;GACnB,KAAYC;GACZ,IAAME,KAAaD,IAAa,MAAM,KAAK,KAAM,KAC3CE,KAAWF,IAAaD,IAAQ,MAAM,KAAK,KAAM,KACjDI,IAAW,MAAQ,MACnBC,IAAK,KAAK,KAAK,KAAK,IAAIH,CAAQ,GAChCI,IAAK,KAAK,KAAK,KAAK,IAAIJ,CAAQ,GAChCK,IAAK,KAAK,KAAK,KAAK,IAAIJ,CAAM,GAC9BK,IAAK,KAAK,KAAK,KAAK,IAAIL,CAAM;GACpC,OACC,kBAAC,QAAD;IAEC,GAAG,WAAWE,EAAG,GAAGC,EAAG,YAAYF,EAAS,KAAKG,EAAG,GAAGC,EAAG;IAC1D,MAAM3B,GAAY/C,IAAI+C,GAAY;GAClC,GAHK,SAAS/C,GAGd;EAEH,CAAC;CACG,CAAA;AAEP;AAEA,SAAS2E,GAAS,EAAE,SAAM,SAAM,YAA2E;CAC1G,IAAMxH,IAAQ2F,GAAa8B;CAM3B,OALIA,MAAS,SAAe,kBAAC3B,IAAD;EAAiB;EAAa;CAAQ,CAAA,IAC9D2B,MAAS,SAAe,kBAACxB,IAAD;EAAiB;EAAa;CAAQ,CAAA,IAC9DwB,MAAS,SAAe,kBAACpB,IAAD;EAAiB;EAAa;CAAQ,CAAA,IAC9DoB,MAAS,aAAmB,kBAACnB,IAAD;EAAqB;EAAa;CAAQ,CAAA,IACtEmB,MAAS,SAAe,kBAACjB,IAAD;EAAsB;EAAa;CAAQ,CAAA,IAChE,kBAACE,IAAD,EAAgB,QAAO,CAAA;AAC/B;AAOA,IAAMgB,KAAkC;CACvC,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACJ;AAEA,SAAgBC,GAAgB,EAAE,WAAQ,YAAY,UAAO,gBAAmC;CAC/F,IAAMC,IAAU5E,EAAM,MAAM,GAAG,CAAC;CAChC,OACC,kBAAC,OAAD;EACC,kBAAe;EACf,aAAU;EACV,WAAWtH,EAAG,qFAAqFoD,CAAS;EAC5G,cAAYuG;EAIZ,UAAA,kBAAC,OAAD;GAAK,WAAW3J,EAAG,sBAAsBgM,GAAQ,KAAK,IAAIE,EAAQ,QAAQ,CAAC,EAAE;GAC3E,UAAAA,EAAQ,KAAK,GAAM,MACnB,kBAAC,OAAD;IAEC,WAAU;IAEX,UAAA,kBAAC7L,GAAD;KAAO,KAAI;KAAX,UAAA;MACC,kBAAC2G,GAAD;OAAc,WAAU;OACtB,UAAAmF,EAAK;MACO,CAAA;MACd,kBAACnL,GAAD;OAAO,MAAK;OAAU,QAAO;OAAO,WAAU;OAC5C,UAAAmL,EAAK;MACA,CAAA;MACP,kBAAC,OAAD;OAAK,WAAU;OACd,UAAA,kBAACL,IAAD;QAAU,MAAMK,EAAK,SAASnC,GAAc7C;QAAI,MAAMgF,EAAK;QAAM,OAAOA,EAAK;OAAQ,CAAA;MACjF,CAAA;KACC;;GACF,GAdCA,EAAK,MAAMA,EAAK,KAcjB,CACL;EACG,CAAA;CACD,CAAA;AAEP;AAEA,GAAgB,cAAc;;;ACzM9B,IAAMC,KAAgD;CACrD,OAAO;CACP,QAAQ;CACR,MAAM;CACN,OAAO;AACR,GAEMC,IAAgB,6BAChBC,KAAqB;AAE3B,SAAgBC,GAAe,EAC9B,UACA,UACA,WACA,SACA,WAAQ,SACR,aACA,gBACuB;CACvB,IAAMvI,IAAKC,EAAM,GACXC,IAAgBP,EAAwB,GACxCQ,IAAa,eAAeH,EAAG,WAAW,KAAK,EAAE;CAEvD,OACC,kBAAC,OAAD;EAAK,WAAWhE,EACd,8BACA,mHACAoM,GAASI,IACTpJ,CACD;EACD,UAAA,kBAAC/C,GAAD;GAAO,KAAI;GAAX,UAAA,CACC,kBAACA,GAAD;IACC,WAAU;IACV,OAAM;IACN,SAAQ;IACR,MAAA;IACA,WAAU;IALX,UAAA,CAOC,kBAACA,GAAD;KAAO,KAAI;KAAK,WAAU;KAA1B,UAAA;MACC,kBAAC2G,GAAD;OAAc,MAAK;OAAW,UAAA2C;MAAoB,CAAA;MACjD,CAAC,CAAC9H,KACF,kBAAC6E,GAAD;OAAS,KAAI;OAAK,WAAU;OAC1B,UAAA7E;MACO,CAAA;MAET,CAAC,CAAC4K,KAAY,kBAACvM,GAAD;OAAM,MAAK;OAAK,WAAU;OAAsB,UAAAuM;MAAe,CAAA;KACxE;IACN,CAAA,GAAA,CAAC,CAAC/J,KACF,kBAACF,GAAD;KACS;KACR,OAAOE,EAAO,cAAc,OAAO,aAAaA,EAAO,cAAc,SAAS,aAAa;KAC3F,MAAK;KACL,SAAQ;KACR,WAAU;IACV,CAAA,CAEI;GAEP,CAAA,GAAA,kBAAC,OAAD;IAAK,WAAU;IACd,UAAA,kBAAC8B,GAAD;KAAqB,OAAM;KAAO,QAAO;KAAO,kBAAkB;MAAE,OAAO;MAAG,QAAQ;KAAE;KACvF,UAAA,kBAACC,GAAD;MAAiB;MAA2B,QAAQ;OAAE,KAAK;OAAG,OAAO;OAAG,QAAQ;OAAG,MAAM;MAAE;MAA3F,UAAA,CACC,kBAAC,QAAD,EAAA,UACC,kBAAC,kBAAD;OAAgB,IAAIN;OAAY,IAAG;OAAI,IAAG;OAAI,IAAG;OAAI,IAAG;OAAxD,UAAA,CACC,kBAAC,QAAD;QAAM,QAAO;QAAK,WAAWkI;QAAe,aAAa;OAAM,CAAA,GAC/D,kBAAC,QAAD;QAAM,QAAO;QAAO,WAAWA;QAAe,aAAa;OAAI,CAAA,CAChD;MACX,CAAA,EAAA,CAAA,GACN,kBAAC3H,GAAD;OACC,MAAK;OACL,SAAQ;OACR,QAAQ4H;OACR,aAAa;OACb,MAAM,QAAQnI,EAAW;OACzB,KAAK;OACL,WAAW;QAAE,GAAG;QAAG,aAAa;QAAG,MAAMkI;QAAe,QAAQC;OAAmB;OACnF,mBAAmB,CAACpI;OACpB,mBAAmB;MACnB,CAAA,CACS;;IACS,CAAA;GACjB,CAAA,CACC;;CACF,CAAA;AAEP;AAEA,GAAe,cAAc;;;AC9G7B,IAAMwI,KAA6C;CAClD,GAAGnM,EAAY,SAAS;CACxB,GAAGA,EAAY,SAAS;CACxB,GAAGA,EAAY,SAAS;CACxB,GAAGA,EAAY,SAAS;CACxB,GAAGA,EAAY,SAAS;AACzB,GAEMoM,KAAmB3M,EAAG,gCAAgC4M,EAAa;CAAE,MAAM;CAAM,MAAM;CAAa,YAAY;AAAO,CAAC,CAAC;AAO/H,SAASC,GACR,GACA,GACgB;CAChB,IAAIjL,EAAK,WAAW,GAAG,OAAO;EAAE,OAAO,CAAC;EAAG,aAAa,CAAC;CAAE;CAE3D,IAAMkL,IAAS,CAAC,GAAGlL,CAAI,CAAC,CAAC,MAAM,GAAG,MAAMsJ,EAAE,KAAK,cAAcC,EAAE,IAAI,CAAC,GAC9D4B,oBAAY,IAAI,KAAKD,EAAO,EAAE,CAAC,OAAO,WAAW,GACjDE,oBAAU,IAAI,KAAKF,EAAOA,EAAO,SAAS,EAAE,CAAC,OAAO,WAAW,GAE/DG,IAAYF,EAAU,OAAO,GAC7BG,IAAeD,MAAc,IAAI,KAAK,IAAIA,GAC1CE,IAAe,IAAI,KAAKJ,CAAS;CACvC,EAAa,QAAQI,EAAa,QAAQ,IAAID,CAAY;CAE1D,IAAME,oBAAU,IAAI,IAA2B;CAC/C,KAAK,IAAMC,KAAKP,GAAQ,EAAQ,IAAIO,EAAE,MAAMA,EAAE,KAAK;CAEnD,IAAMC,IAAyC,CAAC,GAC1CC,IAAsD,CAAC,GACzDC,IAAY,IACZC,IAA6C,CAAC,GAE5CC,IAAS,IAAI,KAAKP,CAAY;CACpC,OAAOO,KAAUV,IAAS;EAGzB,IAAMW,IAAU,GAAG,OAAOD,EAAO,YAAY,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,OAAOA,EAAO,SAAS,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,OAAOA,EAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,KACxJE,KAAUF,EAAO,OAAO,IAAI,KAAK;EAEvC,AAAIE,MAAW,KAAKH,EAAY,SAAS,MACxCH,EAAM,KAAKG,CAAW,GACtB,IAAc,CAAC;EAGhB,IAAMI,IAAQH,EAAO,SAAS;EAC9B,IAAIG,MAAUL,GAAW;GACxB,IAAMM,IAAiBF,MAAW,IAAIN,EAAM,SAASA,EAAM,SAAS;GAGpE,AAFiBC,EAAY,MAAM,MAAMQ,EAAE,cAAcD,CACpD,KAAUP,EAAY,KAAK;IAAE,OAAOS,EAAWH;IAAQ,WAAWC;GAAe,CAAC,GACvF,IAAYD;EACb;EAEA,IAAMI,IAAQb,EAAQ,IAAIO,CAAO,KAAK;EAEtC,AADAF,EAAY,KAAK;GAAE,MAAME;GAAS;EAAM,CAAC,GACzCD,EAAO,QAAQA,EAAO,QAAQ,IAAI,CAAC;CACpC;CAEA,IAAID,EAAY,SAAS,GAAG;EAC3B,OAAOA,EAAY,SAAS,IAAG,EAAY,KAAK,IAAI;EACpD,EAAM,KAAKA,CAAW;CACvB;CAEA,OAAO;EAAE;EAAO;CAAY;AAC7B;AAEA,SAAgBS,GAAgB,EAC/B,UACA,gBACA,SACA,cACA,SAASvF,KACe;CACxB,IAAMC,IAAUC,EAAWnH,GAAyBiH,CAAW,GACzD,EAAE,UAAO,mBAAgBkE,GAAcjL,GAAMgH,EAAQ,iBAAiB;CAE5E,OACC,kBAACvI,GAAD;EACC,KAAI;EACJ,kBAAe;EACf,aAAU;EACV,WAAWL,EAAG,+BAA+BoD,CAAS;EACtD,cAAYuG;EALb,UAAA,CAOE,CAAC,CAACwE,KACF,kBAACjO,GAAD;GAAM,MAAK;GACT,UAAAiO;EACI,CAAA,GAEP,kBAAC,OAAD;GAAK,WAAU;GAAkB,2BAAA;GAGhC,UAAA,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACC,kBAAC,OAAD;KACC,OAAO,KAAKb,EAAM,SAAS;KAC3B,QAAQ;KACR,WAAU;KACV,MAAK;KACL,cAAY3D;KALb,UAAA,CAOC,kBAAC,KAAD,EAAA,UAAA,CACE4D,EACC,QAAQ,GAAG,GAAK,MAAQa,MAAQ,KAAKL,EAAE,YAAYM,EAAID,IAAM,EAAE,CAAC,aAAa,CAAC,CAAC,CAC/E,KAAK,MACL,kBAAC,QAAD;MAAwC,WAAWzB;MAAkB,mBAAgB;MAAO,GAAG,KAAKoB,EAAE,YAAY;MAAI,GAAG;MAAG,kBAAiB;MAC3I,UAAAA,EAAE;KACE,GAFK,GAAGA,EAAE,MAAM,GAAGA,EAAE,WAErB,CACN,GACDnF,EAAQ,iBAAiB,KAAK,GAAO,MAAMiC,IAC3C,kBAAC,QAAD;MAAuB,WAAW8B;MAAkB,mBAAgB;MAAO,GAAG;MAAI,GAAG,KAAKxF,IAAI;MAAI,kBAAiB;MAAU,YAAW;MACtI,UAAA0D;KACI,GAFK,OAAO1D,GAEZ,IACH,IAAI,CACN,EAAA,CAAA,GACFmG,EAAM,KAAK,GAAM,MACjB,kBAAC,KAAD,EAAA,UACEgB,EAAK,KAAK,GAAK,MACf,kBAAC,QAAD;MAEC,GAAG,KAAKC,IAAU;MAClB,GAAG,KAAKX,IAAS;MACjB,OAAO;MACP,QAAQ;MACR,IAAI;MACJ,WAAWY,IAAM9B,GAAY8B,EAAI,SAAS;MAEzC,UAAAA,KAAO,kBAAC,SAAD,EAAA,UAAQ,GAAGA,EAAI,KAAK,UAAUA,EAAI,QAAe,CAAA;KACpD,GATA,KAAKD,EAAQ,GAAGX,GAShB,CACN,EACC,GAdK,KAAKW,GAcV,CACH,CACG;IAEL,CAAA,GAAA,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACC,kBAACrO,GAAD;OAAM,MAAK;OAAK,MAAK;OAAa,UAAA0I,EAAQ;MAAwB,CAAA;MAChE;OAAC;OAAG;OAAG;OAAG;OAAG;MAAC,CAAC,CAAqB,KAAK,MAC1C,kBAAC,OAAD;OAA6B,OAAO;OAAI,QAAQ;OAAI,eAAY;OAAO,WAAU;OAChF,UAAA,kBAAC,QAAD;QAAM,OAAO;QAAI,QAAQ;QAAI,IAAI;QAAK,WAAW8D,GAAYuB;OAAS,CAAA;MAClE,GAFK,UAAUA,GAEf,CACL;MACD,kBAAC/N,GAAD;OAAM,MAAK;OAAK,MAAK;OAAa,UAAA0I,EAAQ;MAAwB,CAAA;KAC9D;IACD,CAAA,CAAA;;EACD,CAAA,CACC;;AAET;AAEA,GAAgB,cAAc;;;AC5H9B,SAAgB6F,GAAU,EACzB,UACA,gBACA,cACA,gBACA,WACA,WACA,aACA,qBACA,YACA,YACA,cACA,qBACA,qBACkB;CAClB,OACC,kBAACnN,IAAD;EACQ;EACM;EACF;EACE;EACb,YAAYoN;EACH;EACA;EACT,WAAW1O,EAAG,yBAAyBoD,CAAS;EAChD,kBAAkBpD,EAAG,uBAAuB2O,CAAgB;EAE5D,UAAA,kBAACtN,IAAD;GACS;GACU;GAClB,WAAWrB,EAAG,qDAAqD4O,CAAc;GAEhF;EACc,CAAA;CACH,CAAA;AAEhB;AAEA,GAAU,cAAc;;;AC7DxB,IAAaC,KAAoE;CAChF,YAAY;CACZ,WAAW;CACX,cAAc;CACd,YAAY;CACZ,WAAW;CACX,kBAAkB,MAAS,OAAOC,CAAI,CAAC,CAAC,SAAS,GAAG,GAAG;CACvD,kBAAkB,GAAW,MAAU,GAAGC,EAAU,QAAQ7G;AAC7D;;;ACxBA,SAAgB8G,EAAsB,EAAE,UAAO,gBAAa,cAAW,SAASrG,KAA2C;CAC1H,IAAMC,IAAUC,EAAWgG,IAAqClG,CAAW,GACrEsG,IAAS,KAAK,IAAI,GAAGC,GAAO,CAAC,GAC7BC,IAAWD,EAAM,QAAQ,KAAK,IAAI,GAAGA,CAAK,CAAC;CAEjD,SAASE,EAAgB,GAAuB;EAC/C,IAAIlH,MAAU,GAAG,OAAO3H,EAAY,QAAQ;EAC5C,IAAM8O,IAAQnH,IAAQ+G;EAGtB,OAFII,IAAQ,MAAa9O,EAAY,QAAQ,KACzC8O,IAAQ,MAAa9O,EAAY,QAAQ,KACtCA,EAAY,QAAQ;CAC5B;CAEA,OACC,kBAACF,GAAD;EAAO,KAAI;EAAK,WAAWL,EAAG,yBAAyBoD,CAAS;EAAhE,UAAA;GAEC,kBAAC,OAAD;IAAK,WAAU;IACb,UAAA8L,EAAM,KAAK,GAAO,MAClB,kBAAC,OAAD;KAEC,WAAWlP,EACV,qCACAoP,EAAgBlH,CAAK,GACrB4G,MAASK,KAAY,gCACtB;KACA,OAAOvG,EAAQ,gBAAgBA,EAAQ,gBAAgBkG,CAAI,GAAG5G,CAAK;IACnE,GAPK4G,CAOL,CACD;GACG,CAAA;GAEL,kBAAC,OAAD;IAAK,WAAU;IACb,UAAAI,EAAM,KAAK,GAAG,MACd,kBAAC,OAAD;KAAgB,WAAU;KACxB,UAAAJ,IAAO,KAAM,KACb,kBAAC7N,GAAD;MAAgB,MAAK;MAAK,WAAU;MAClC,UAAA2H,EAAQ,gBAAgBkG,CAAI;KACd,CAAA;IAEb,GANKA,CAML,CACL;GACG,CAAA;GAEJQ,MAAgB,KAAA,KAAaA,KAAe,KAAKA,IAAc,MAC/D,kBAAC,OAAD;IAAK,WAAU;IACd,UAAA,kBAAC,OAAD;KACC,WAAU;KACV,OAAO;MAAE,MAAM,GAAIA,IAAc,KAAM,IAAI;MAAI,WAAW;KAAmB;KAE7E,UAAA,kBAAC,OAAD,EACC,WAAU,kFACV,CAAA;IACG,CAAA;GACD,CAAA;GAGN,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACC,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACC,kBAAC,OAAD,EAAK,WAAWtP,EAAG,6BAA6BO,EAAY,QAAQ,EAAE,EAAI,CAAA,GAC1E,kBAACL,GAAD;OAAM,MAAK;OAAK,MAAK;OAAa,UAAA0I,EAAQ;MAAiB,CAAA,CACvD;;KACL,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACC,kBAAC,OAAD,EAAK,WAAW5I,EAAG,6BAA6BO,EAAY,QAAQ,EAAE,EAAI,CAAA,GAC1E,kBAACL,GAAD;OAAM,MAAK;OAAK,MAAK;OAAa,UAAA0I,EAAQ;MAAgB,CAAA,CACtD;;KACL,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACC,kBAAC,OAAD,EAAK,WAAW5I,EAAG,6BAA6BO,EAAY,QAAQ,EAAE,EAAI,CAAA,GAC1E,kBAACL,GAAD;OAAM,MAAK;OAAK,MAAK;OAAa,UAAA0I,EAAQ;MAAmB,CAAA,CACzD;;KACL,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACC,kBAAC,OAAD,EAAK,WAAW5I,EAAG,6BAA6BO,EAAY,QAAQ,EAAE,EAAI,CAAA,GAC1E,kBAACL,GAAD;OAAM,MAAK;OAAK,MAAK;OAAa,UAAA0I,EAAQ;MAAiB,CAAA,CACvD;;KACJ0G,MAAgB,KAAA,KAChB,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACC,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA,GAClG,kBAACpP,GAAD;OAAM,MAAK;OAAK,MAAK;OAAa,UAAA0I,EAAQ;MAAgB,CAAA,CACtD;;IAEF;;EACC;;AAET;AAEA,EAAsB,cAAc"}
1
+ {"version":3,"file":"analytics.js","names":["_jsxs","_Fragment","useFormattingConfig","useMoneyConfig","cn","Button","Text","focusRecipes","Grid","Stack","toneRecipes","rampRecipes","dotRecipes","Card","Progress","Skeleton","interactionRecipes","formatPercentRatio","formatNumber","formatPercentage","formatDuration","Value","SecondaryValue","formatMoneyAmount","IconBadge","Badge","ChartContainer","ContentBlock","defaultUsageCardStrings","UsageCard","Fragment$1","defaultAnalyticsStrings","formatMetricValue","data","value","numeric","options","resolveTrend","TONE_CLASSES","ICON_SIZE","TEXT_SIZE","BADGE_PADDING","resolveTone","trend","direction","MetricTrendChip","tone","change","Icon","ArrowUp","ArrowDown","Minus","palette","valueText","sign","variant","size","className","query","subscribe","media","onChange","getSnapshot","getServerSnapshot","usePrefersReducedMotion","useSyncExternalStore","TREND_COLORS","MetricSparkline","ariaLabel","id","useId","reducedMotion","gradientId","useMemo","stroke","color","chartData","ResponsiveContainer","AreaChart","Area","animated","Bar","MetricSkeleton","cardBody","useMetricFormatOptions","formatMode","locale","defaultCurrency","metricToneRecipes","legacyMetricTones","VALUE_FONT_SIZE","VALUE_FONT_SIZE_HERO","HERO_ADAPTIVE","SPARKLINE_HEIGHT","SEGMENT_COUNT","Metric","props","rootClassName","formatOptions","formattedValue","loading","error","errorLabel","legacyTone","colorScheme","sharedProps","MetricCard","MetricCompact","MetricMinimal","MetricBordered","MetricAccent","MetricColored","MetricDefault","showIcon","Heading","showChange","showSparkline","isInteractive","tint","DisplayLabel","filledCount","progress","i","ArrowUpRight","MetricBar","cells","metrics","metric","showSparklines","showChanges","periodChip","period","onPeriodChange","Calendar","footerText","COLUMN_CLASS","autoColumnsFor","count","MetricGrid","columnsClass","columns","showIcons","defaultMetricComparisonStrings","toNumber","n","MetricComparison","stringsProp","strings","useStrings","currentNum","current","previousNum","previous","delta","canCompute","isUp","isFlat","ratio","relativeChange","Arrow","Equal","movement","deltaTone","title","currentPeriod","ArrowRight","previousPeriod","abs","DEFAULT_ORDER","CHART_COLORS","PIE_PALETTE","CHART_TRACK","MicroBars","max","v","MicroLine","min","range","points","MicroDots","MicroProgress","label","MicroAreaChart","gradId","MicroPie","total","a","b","cumAngle","angle","startAngle","startRad","endRad","largeArc","x1","y1","x2","y2","ChartFor","kind","COLUMNS","MetricMicroGrid","visible","cell","THEME_BG","CHART_INVERSE","CHART_INVERSE_SOFT","MetricGradient","theme","subtitle","LEVEL_COLOR","AXIS_LABEL_CLASS","textVariants","buildCalendar","sorted","startDate","endDate","dayOfWeek","mondayOffset","alignedStart","dateMap","d","weeks","monthLabels","lastMonth","currentWeek","cursor","dateStr","dayIdx","month","labelWeekIndex","m","monthNames","level","ActivityHeatmap","description","idx","arr","week","weekIdx","day","ChartCard","footer","contentClassName","chartClassName","defaultTimeDistributionRulerStrings","hour","hourLabel","TimeDistributionRuler","maxVal","hours","peakHour","getDensityClass","currentHour"],"sources":["../../src/components/blocks/analytics/analytics.strings.ts","../../src/components/blocks/analytics/format-metric-value.ts","../../src/components/blocks/analytics/atoms/metric-trend-chip.tsx","../../src/lib/use-prefers-reduced-motion.ts","../../src/components/blocks/analytics/atoms/metric-sparkline.tsx","../../src/components/blocks/analytics/atoms/metric-skeleton.tsx","../../src/components/blocks/analytics/use-metric-format-options.ts","../../src/components/blocks/analytics/metric/metric.tsx","../../src/components/blocks/analytics/metric-bar/metric-bar.tsx","../../src/components/blocks/analytics/metric-grid/metric-grid.tsx","../../src/components/blocks/analytics/metric-comparison/metric-comparison.tsx","../../src/components/blocks/analytics/metric-micro-grid/metric-micro-grid.tsx","../../src/components/blocks/analytics/metric-gradient/metric-gradient.tsx","../../src/components/blocks/analytics/activity-heatmap/activity-heatmap.tsx","../../src/components/blocks/analytics/chart-card/chart-card.tsx","../../src/components/blocks/analytics/time-ruler/types.ts","../../src/components/blocks/analytics/time-ruler/time-ruler.tsx"],"sourcesContent":["/**\n * Shared default strings for `blocks/analytics` components.\n *\n * Each component accepts a `strings` prop deep-merged over these defaults\n * so consumers override per-component without touching the rest. Day/month\n * labels live here too because they're localisable in the same way.\n */\nexport interface AnalyticsStrings {\n\t/** Fallback shown by `<Metric />` when `error` is true. */\n\tmetricErrorLabel: string;\n\t/** Default title for `<MetricComparison />` when no `title` prop is passed. */\n\tcomparisonTitle: string;\n\t/** Labels for the activity heatmap weekday rows (Mon–Sun, length 7). */\n\theatmapDayLabels: readonly [string, string, string, string, string, string, string];\n\t/** Short month names for the activity heatmap header (Jan–Dec, length 12). */\n\theatmapMonthNames: readonly [\n\t\tstring, string, string, string, string, string,\n\t\tstring, string, string, string, string, string,\n\t];\n\t/** Heatmap legend \"less\" label (left edge of intensity legend). */\n\theatmapLegendLess: string;\n\t/** Heatmap legend \"more\" label (right edge of intensity legend). */\n\theatmapLegendMore: string;\n}\n\nexport const defaultAnalyticsStrings: AnalyticsStrings = {\n\tmetricErrorLabel: 'Unable to load metric',\n\tcomparisonTitle: 'Comparison',\n\theatmapDayLabels: ['Mon', '', 'Wed', '', 'Fri', '', ''],\n\theatmapMonthNames: [\n\t\t'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n\t\t'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n\t],\n\theatmapLegendLess: 'Less',\n\theatmapLegendMore: 'More',\n};\n","/**\n * formatMetricValue — single canonical formatter for every metric surface.\n *\n * Keeps formatting logic out of the layout components so the same dataset\n * renders identically regardless of which `Metric*` variant displays it.\n * Currency values use the same formatter as the Money primitive, so a KPI and\n * a table cell show one amount the same way.\n */\nimport {\n\tEMPTY,\n\tformatNumber,\n\tformatPercentage,\n} from '../../../lib/format';\nimport { formatMoneyAmount } from '../../../lib/money-format';\nimport type { MoneyFormatMode } from '../../../lib/ui-provider';\nimport { formatDuration } from '../../primitives';\nimport type { MetricData } from './types';\n\n/** Display policy that metric components resolve from UIProvider. */\nexport interface FormatMetricValueOptions {\n\t/** BCP-47 locale. Metric components pass `UIProvider.formatting.locale`. */\n\tlocale?: string;\n\t/** Currency used when the metric has none. Defaults to `USD`, like UIProvider. */\n\tdefaultCurrency?: string;\n\t/** Money format policy. Defaults to `with_code`, like UIProvider. */\n\tmoneyFormatMode?: MoneyFormatMode;\n}\n\nexport function formatMetricValue(data: MetricData, options: FormatMetricValueOptions = {}): string {\n\tif (data.value === null || data.value === undefined) return EMPTY;\n\n\tconst value = data.value;\n\tconst numeric = typeof value === 'number' ? value : null;\n\tconst { locale } = options;\n\n\tswitch (data.valueType) {\n\t\tcase 'currency':\n\t\t\treturn numeric !== null\n\t\t\t\t? (formatMoneyAmount({\n\t\t\t\t\tamount: numeric,\n\t\t\t\t\tcurrency: data.currency ?? options.defaultCurrency ?? 'USD',\n\t\t\t\t\tlocale,\n\t\t\t\t\tformatMode: options.moneyFormatMode ?? 'with_code',\n\t\t\t\t}) ?? EMPTY)\n\t\t\t\t: String(value);\n\t\tcase 'percentage':\n\t\t\treturn numeric !== null ? formatPercentage(numeric, { locale }) : String(value);\n\t\tcase 'duration':\n\t\t\treturn numeric !== null ? formatDuration(numeric, { locale }) : String(value);\n\t\tcase 'number':\n\t\t\treturn numeric !== null ? formatNumber(numeric, { locale }) : String(value);\n\t\tcase 'text':\n\t\tdefault:\n\t\t\treturn String(value);\n\t}\n}\n\n/**\n * Resolve the effective `MetricTrend` for a metric — explicit `trend` wins,\n * otherwise we infer from `change.direction` (`up` → positive, `down` →\n * negative, `neutral`/missing → neutral).\n */\nexport function resolveTrend(data: MetricData): 'positive' | 'negative' | 'neutral' {\n\tif (data.trend) return data.trend;\n\tif (data.change?.direction === 'up') return 'positive';\n\tif (data.change?.direction === 'down') return 'negative';\n\treturn 'neutral';\n}\n","/**\n * MetricTrendChip — compact ↑/↓/→ delta indicator.\n *\n * Decouples direction (up/down/neutral) from tone (positive/negative/neutral)\n * so consumers can flip the colour for inverted metrics like churn or refund\n * rate. Four variants:\n * - `default` — coloured icon + value, no chrome\n * - `badge` — pill with tinted bg + arrow icon\n * - `compact` — coloured arrow + value, no spacing\n * - `inline` — value only with sign prefix, no icon\n */\nimport { ArrowDown, ArrowUp, Minus } from 'lucide-react';\nimport { Value } from '../../../primitives';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { MetricChange, MetricSize, MetricTrend, MetricTrendVariant } from '../types';\nimport { toneRecipes } from '../../../../lib/tone-recipes';\n\nexport interface MetricTrendChipProps {\n\tchange: MetricChange;\n\ttrend?: MetricTrend;\n\t/** Size preset. */\n\tsize?: MetricSize;\n\t/** Shell treatment. */\n\tvariant?: MetricTrendVariant;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nconst TONE_CLASSES: Record<MetricTrend, { text: string; badge: string; arrow: string }> = {\n\tpositive: { text: 'text-success', badge: `${toneRecipes.success.tint} ${toneRecipes.success.ink}`, arrow: 'text-success' },\n\tnegative: { text: 'text-destructive', badge: `${toneRecipes.destructive.tint} ${toneRecipes.destructive.ink}`, arrow: 'text-destructive' },\n\tneutral: { text: 'text-muted-foreground', badge: 'bg-muted text-muted-foreground', arrow: 'text-muted-foreground' },\n};\n\nconst ICON_SIZE: Record<MetricSize, string> = {\n\tsm: 'size-icon-sm',\n\tmd: 'size-icon-md',\n\tlg: 'size-icon',\n};\n\nconst TEXT_SIZE: Record<MetricSize, 'xxs' | 'xs' | 'sm'> = {\n\tsm: 'xxs',\n\tmd: 'xs',\n\tlg: 'sm',\n};\n\nconst BADGE_PADDING: Record<MetricSize, string> = {\n\tsm: 'px-space-sm py-space-2xs',\n\tmd: 'px-space-md py-space-2xs',\n\tlg: 'px-space-md py-space-xs',\n};\n\nfunction resolveTone(trend: MetricTrend | undefined, direction: MetricChange['direction']): MetricTrend {\n\tif (trend) return trend;\n\tif (direction === 'up') return 'positive';\n\tif (direction === 'down') return 'negative';\n\treturn 'neutral';\n}\n\nexport function MetricTrendChip({\n\tchange,\n\ttrend,\n\tsize = 'md',\n\tvariant = 'default',\n\tclassName,\n}: MetricTrendChipProps) {\n\tconst tone = resolveTone(trend, change.direction);\n\tconst Icon = change.direction === 'up' ? ArrowUp : change.direction === 'down' ? ArrowDown : Minus;\n\tconst palette = TONE_CLASSES[tone];\n\tconst valueText = String(change.value);\n\tconst sign = change.direction === 'up' ? '+' : change.direction === 'down' ? '' : '';\n\n\tif (variant === 'inline') {\n\t\treturn (\n\t\t\t<Value type=\"inherit\" size={TEXT_SIZE[size]} weight=\"medium\" className={cn('metric-trend-chip--component', palette.text, 'tabular-nums', className)}>\n\t\t\t\t{sign}{valueText}\n\t\t\t</Value>\n\t\t);\n\t}\n\n\tif (variant === 'compact') {\n\t\treturn (\n\t\t\t<span className={cn('inline-flex items-center gap-space-2xs', palette.text, className)}>\n\t\t\t\t<Icon className={ICON_SIZE[size]} strokeWidth={2.5} aria-hidden=\"true\" />\n\t\t\t\t<Value type=\"inherit\" size={TEXT_SIZE[size]} weight=\"semibold\" className=\"tabular-nums\">\n\t\t\t\t\t{valueText}\n\t\t\t\t</Value>\n\t\t\t</span>\n\t\t);\n\t}\n\n\tif (variant === 'badge') {\n\t\treturn (\n\t\t\t<span className={cn('inline-flex items-center gap-space-xs rounded-radius', palette.badge, BADGE_PADDING[size], className)}>\n\t\t\t\t<Icon className={ICON_SIZE[size]} strokeWidth={2.5} aria-hidden=\"true\" />\n\t\t\t\t<Value type=\"inherit\" size={TEXT_SIZE[size]} weight=\"semibold\" className=\"tabular-nums\">\n\t\t\t\t\t{valueText}\n\t\t\t\t</Value>\n\t\t\t\t{!!change.label && (\n\t\t\t\t\t<Text type=\"inherit\" tag=\"span\" size={TEXT_SIZE[size]}>{change.label}</Text>\n\t\t\t\t)}\n\t\t\t</span>\n\t\t);\n\t}\n\n\t// default\n\treturn (\n\t\t<span className={cn('inline-flex items-center gap-space-xs', palette.text, className)}>\n\t\t\t<Icon className={ICON_SIZE[size]} strokeWidth={2.5} aria-hidden=\"true\" />\n\t\t\t<Value type=\"inherit\" size={TEXT_SIZE[size]} weight=\"semibold\" className=\"tabular-nums\">\n\t\t\t\t{valueText}\n\t\t\t</Value>\n\t\t\t{!!change.label && (\n\t\t\t\t<Text tag=\"span\" size={TEXT_SIZE[size]} type=\"secondary\">{change.label}</Text>\n\t\t\t)}\n\t\t</span>\n\t);\n}\n\nMetricTrendChip.displayName = 'MetricTrendChip';\n","import { useSyncExternalStore } from 'react';\n\nconst query = '(prefers-reduced-motion: reduce)';\n\nfunction subscribe(onChange: () => void) {\n\tif (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return () => {};\n\tconst media = window.matchMedia(query);\n\tmedia.addEventListener('change', onChange);\n\treturn () => media.removeEventListener('change', onChange);\n}\n\nfunction getSnapshot() {\n\treturn typeof window !== 'undefined' && typeof window.matchMedia === 'function'\n\t\t? window.matchMedia(query).matches\n\t\t: false;\n}\n\n// Keep server/hydration markup still until the browser supplies its preference.\nfunction getServerSnapshot() {\n\treturn true;\n}\n\n/** Private preference owner for JavaScript-driven drawing animations. */\nexport function usePrefersReducedMotion() {\n\treturn useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n","/**\n * MetricSparkline — recharts-backed mini area chart used inside Metric\n * variants. Auto-stretches to its container; pass a fixed height (e.g.\n * `h-8 w-full`) on the wrapper. `trend` colours the stroke + gradient\n * (positive/negative/neutral); `color` overrides with any CSS colour\n * (semantic var, hex, rgb).\n */\nimport { useId, useMemo } from 'react';\nimport { Area, AreaChart, ResponsiveContainer } from 'recharts';\nimport { cn } from '../../../../lib/utils';\nimport { usePrefersReducedMotion } from '../../../../lib/use-prefers-reduced-motion';\n\nimport type { MetricTrend } from '../types';\n\nexport interface MetricSparklineProps {\n\t/** Data points to plot, in chronological order. */\n\tdata: readonly number[];\n\ttrend?: MetricTrend;\n\tcolor?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\tanimated?: boolean;\n\t'aria-label'?: string;\n}\n\nconst TREND_COLORS: Record<MetricTrend, string> = {\n\tpositive: 'var(--success)',\n\tnegative: 'var(--destructive)',\n\tneutral: 'var(--muted-foreground)',\n};\n\nexport function MetricSparkline({\n\tdata,\n\ttrend = 'neutral',\n\tcolor,\n\tclassName,\n\tanimated = true,\n\t'aria-label': ariaLabel = 'Trend sparkline',\n}: MetricSparklineProps) {\n\tconst id = useId();\n\tconst reducedMotion = usePrefersReducedMotion();\n\tconst gradientId = useMemo(() => `metric-spark-${id.replaceAll(':', '')}`, [id]);\n\tconst stroke = color ?? TREND_COLORS[trend];\n\n\tconst chartData = useMemo(() => {\n\t\tif (!Array.isArray(data) || data.length === 0) return [];\n\t\treturn data.map((value, i) => ({ i, v: value }));\n\t}, [data]);\n\n\tif (chartData.length === 0) {\n\t\treturn <div className={cn('metric-sparkline--component', 'h-full w-full', className)} aria-hidden=\"true\" />;\n\t}\n\n\treturn (\n\t\t<div className={cn('metric-sparkline--component h-full w-full', className)} role=\"img\" aria-label={ariaLabel}>\n\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\" initialDimension={{ width: 1, height: 1 }}>\n\t\t\t\t<AreaChart data={chartData} margin={{ top: 2, right: 0, bottom: 0, left: 0 }}>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={stroke} stopOpacity={0.25} />\n\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={stroke} stopOpacity={0} />\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t</defs>\n\t\t\t\t\t<Area\n\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\tdataKey=\"v\"\n\t\t\t\t\t\tstroke={stroke}\n\t\t\t\t\t\tstrokeWidth={1.75}\n\t\t\t\t\t\tfill={`url(#${gradientId})`}\n\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\tisAnimationActive={animated && !reducedMotion}\n\t\t\t\t\t\tanimationDuration={600}\n\t\t\t\t\t/>\n\t\t\t\t</AreaChart>\n\t\t\t</ResponsiveContainer>\n\t\t</div>\n\t);\n}\n\nMetricSparkline.displayName = 'MetricSparkline';\n","/**\n * MetricSkeleton — loading placeholder matching the height/spacing of every\n * `Metric` variant so the layout doesn't jump when data resolves.\n */\nimport { Card } from '../../../base/cards';\nimport { Skeleton } from '../../../base/skeleton';\nimport { Stack } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\nimport type { MetricSize, MetricVariant } from '../types';\n\nexport interface MetricSkeletonProps {\n\t/** Shell treatment. */\n\tvariant?: MetricVariant;\n\t/** Size preset. */\n\tsize?: MetricSize;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nconst Bar = ({ className }: { className?: string }) => (\n\t<Skeleton className={className} />\n);\n\nexport function MetricSkeleton({\n\tvariant = 'default',\n\tsize = 'md',\n\tclassName,\n}: MetricSkeletonProps) {\n\t// Card-shaped variants share the loaded layout: label, value with its\n\t// supporting line, then the chart band.\n\tconst cardBody = (\n\t\t<Stack gap=\"lg\">\n\t\t\t<Bar className=\"h-3 w-24\" />\n\t\t\t<Stack gap=\"md\">\n\t\t\t\t<Bar className={size === 'lg' ? 'h-9 w-40' : 'h-7 w-32'} />\n\t\t\t\t<Bar className=\"h-3 w-20\" />\n\t\t\t</Stack>\n\t\t\t<Bar className=\"h-8 w-full\" />\n\t\t</Stack>\n\t);\n\n\tif (variant === 'card' || variant === 'bordered' || variant === 'accent' || variant === 'colored') {\n\t\t// The card variant inherits the provider surface like the loaded card;\n\t\t// the bordered, accent and colored variants draw the plain card surface.\n\t\treturn (\n\t\t\t<Card\n\t\t\t\tsurface={variant === 'card' ? undefined : 'card'}\n\t\t\t\tclassName={cn('metric-skeleton--component', className)}\n\t\t\t\taria-busy=\"true\"\n\t\t\t\taria-live=\"polite\"\n\t\t\t>\n\t\t\t\t{cardBody}\n\t\t\t</Card>\n\t\t);\n\t}\n\n\tif (variant === 'compact') {\n\t\treturn (\n\t\t\t<div className={cn('flex items-center gap-space-lg', className)} aria-busy=\"true\">\n\t\t\t\t<Bar className=\"size-avatar rounded-radius\" />\n\t\t\t\t<Stack gap=\"sm\" className=\"flex-1\">\n\t\t\t\t\t<Bar className=\"h-3 w-20\" />\n\t\t\t\t\t<Bar className=\"h-4 w-28\" />\n\t\t\t\t</Stack>\n\t\t\t\t<Bar className=\"h-5 w-12 rounded-full\" />\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (variant === 'minimal') {\n\t\treturn (\n\t\t\t<div className={cn('inline-flex items-baseline gap-space-md', className)} aria-busy=\"true\">\n\t\t\t\t<Bar className=\"h-3 w-12\" />\n\t\t\t\t<Bar className=\"h-3 w-16\" />\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// default\n\treturn (\n\t\t<div className={cn('flex flex-col gap-space-sm p-surface', className)} aria-busy=\"true\">\n\t\t\t<Bar className=\"h-3 w-20\" />\n\t\t\t<Bar className=\"h-5 w-28\" />\n\t\t\t<Bar className=\"mt-1 h-6 w-full\" />\n\t\t</div>\n\t);\n}\n\nMetricSkeleton.displayName = 'MetricSkeleton';\n","import { useMemo } from 'react';\n\nimport { useFormattingConfig, useMoneyConfig } from '../../../lib/ui-provider';\n\nimport type { FormatMetricValueOptions } from './format-metric-value';\n\n/** Metric formatting policy from UIProvider: locale, default currency and money format. */\nexport function useMetricFormatOptions(): FormatMetricValueOptions {\n\tconst { locale } = useFormattingConfig();\n\tconst { defaultCurrency, formatMode } = useMoneyConfig();\n\treturn useMemo(\n\t\t() => ({ locale, defaultCurrency, moneyFormatMode: formatMode }),\n\t\t[locale, defaultCurrency, formatMode],\n\t);\n}\n","/**\n * Metric — canonical single-metric surface. One component, seven variants:\n *\n * default — flat tile (label / value / trend / sparkline) for use inside\n * MetricBar or other blocks surfaces.\n * card — standalone metric using the canonical Card surface.\n * compact — single-row icon + label + value + chip. Sidebar / list use.\n * minimal — inline `Label: value ↑12%` chip for in-flow copy.\n * bordered — soft tinted border keyed off `tone`.\n * accent — dark surface card with bottom-aligned area sparkline.\n * colored — segmented progress bar (driven by `progress` prop).\n *\n * All variants share the same `MetricData` shape; only the layout changes.\n */\nimport { useMemo } from 'react';\nimport { ArrowUpRight } from 'lucide-react';\n\nimport { Card } from '../../../base/cards';\nimport { IconBadge } from '../../../base/display/icon-badge';\nimport { Stack } from '../../../base/structure';\nimport { Value } from '../../../primitives';\nimport { DisplayLabel, Heading, Text, type HeadingSize } from '../../../typography';\nimport type { SemanticTone } from '../../../../lib/component-vocabulary';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAnalyticsStrings } from '../analytics.strings';\nimport { MetricSkeleton } from '../atoms/metric-skeleton';\nimport { MetricSparkline } from '../atoms/metric-sparkline';\nimport { MetricTrendChip } from '../atoms/metric-trend-chip';\nimport { formatMetricValue, resolveTrend } from '../format-metric-value';\nimport { useMetricFormatOptions } from '../use-metric-format-options';\nimport type {\n\tMetricColorScheme,\n\tMetricData,\n\tMetricSize,\n\tMetricVariant,\n} from '../types';\nimport { focusRecipes } from '../../../../lib/focus-recipes';\nimport { dotRecipes, toneRecipes } from '../../../../lib/tone-recipes';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\n\nexport interface MetricProps {\n\t/** Records to render. */\n\tdata: MetricData;\n\t/** Shell treatment. */\n\tvariant?: MetricVariant;\n\t/** Size preset. */\n\tsize?: MetricSize;\n\t/** Tone for bordered surfaces and colored progress. Takes precedence over colorScheme. */\n\ttone?: SemanticTone;\n\t/** @deprecated Use tone. */\n\tcolorScheme?: MetricColorScheme;\n\t/** Renders the sparkline. */\n\tshowSparkline?: boolean;\n\t/** Renders the change. */\n\tshowChange?: boolean;\n\t/** Renders the icon. */\n\tshowIcon?: boolean;\n\tloading?: boolean;\n\terror?: boolean;\n\terrorLabel?: string;\n\t/** `colored` variant only — 0-100 fill percentage. */\n\tprogress?: number;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t'aria-label'?: string;\n}\n\nconst metricToneRecipes = {\n\t...toneRecipes,\n\tneutral: { edge: 'border-border', wash: 'bg-card', solid: 'bg-foreground' },\n\tsecondary: { edge: 'border-border', wash: 'bg-secondary text-secondary-foreground', solid: 'bg-secondary-foreground' },\n} satisfies Record<SemanticTone, { edge: string; wash: string; solid: string }>;\n\nconst legacyMetricTones: Record<MetricColorScheme, SemanticTone> = {\n\tdefault: 'neutral',\n\tprimary: 'primary',\n\tsuccess: 'success',\n\twarning: 'warning',\n\tdanger: 'destructive',\n\tinfo: 'info',\n};\n\n/** Compact value sizes for in-grid / in-bar usage where horizontal space is tight. */\nconst VALUE_FONT_SIZE: Record<MetricSize, HeadingSize> = {\n\tsm: 'sm',\n\tmd: 'base',\n\tlg: 'base',\n};\n\n/** Hero value sizes for standalone card / bordered / accent variants. */\nconst VALUE_FONT_SIZE_HERO: Record<MetricSize, HeadingSize> = {\n\tsm: '2xl',\n\tmd: '2xl',\n\tlg: '3xl',\n};\n\nconst HERO_ADAPTIVE: Record<MetricSize, string> = {\n\tsm: '@max-[11rem]/metric-card:text-xl',\n\tmd: '@max-[11rem]/metric-card:text-xl',\n\tlg: '@max-[16rem]/metric-card:text-2xl @max-[11rem]/metric-card:text-xl',\n};\n\nconst SPARKLINE_HEIGHT: Record<MetricSize, string> = {\n\tsm: 'h-control-sm',\n\tmd: 'h-control',\n\tlg: 'h-control-lg',\n};\n\nconst SEGMENT_COUNT = 16;\n\nexport function Metric(props: MetricProps) {\n\tconst {\n\t\tdata,\n\t\tvariant = 'default',\n\t\tsize = 'md',\n\t\ttone,\n\t\tcolorScheme = 'default',\n\t\tshowSparkline = true,\n\t\tshowChange = true,\n\t\tshowIcon = true,\n\t\tloading = false,\n\t\terror = false,\n\t\terrorLabel,\n\t\tprogress = 0,\n\t\tclassName,\n\t\t'aria-label': ariaLabel,\n\t} = props;\n\tconst rootClassName = cn('metric--component', className);\n\n\tconst formatOptions = useMetricFormatOptions();\n\tconst formattedValue = useMemo(() => formatMetricValue(data, formatOptions), [data, formatOptions]);\n\tconst trend = useMemo(() => resolveTrend(data), [data]);\n\n\tif (loading) return <MetricSkeleton variant={variant} size={size} className={rootClassName} />;\n\tif (error) {\n\t\treturn (\n\t\t\t<Card className={rootClassName} contentClassName=\"flex items-center justify-center\">\n\t\t\t\t<Text type=\"inherit\">{errorLabel ?? defaultAnalyticsStrings.metricErrorLabel}</Text>\n\t\t\t</Card>\n\t\t);\n\t}\n\n\tconst legacyTone = legacyMetricTones[colorScheme];\n\t// Colored metrics have historically shown primary progress by default.\n\tconst resolvedTone = tone ?? (variant === 'colored' && legacyTone === 'neutral' ? 'primary' : legacyTone);\n\tconst sharedProps = {\n\t\tdata,\n\t\tformattedValue,\n\t\ttrend,\n\t\tsize,\n\t\tshowSparkline,\n\t\tshowChange,\n\t\tshowIcon,\n\t\ttone: resolvedTone,\n\t\tariaLabel: ariaLabel ?? data.label,\n\t\tclassName: rootClassName,\n\t};\n\n\tswitch (variant) {\n\t\tcase 'card':\n\t\t\treturn <MetricCard {...sharedProps} />;\n\t\tcase 'compact':\n\t\t\treturn <MetricCompact {...sharedProps} />;\n\t\tcase 'minimal':\n\t\t\treturn <MetricMinimal {...sharedProps} />;\n\t\tcase 'bordered':\n\t\t\treturn <MetricBordered {...sharedProps} />;\n\t\tcase 'accent':\n\t\t\treturn <MetricAccent {...sharedProps} />;\n\t\tcase 'colored':\n\t\t\treturn <MetricColored {...sharedProps} progress={progress} />;\n\t\tdefault:\n\t\t\treturn <MetricDefault {...sharedProps} />;\n\t}\n}\n\nMetric.displayName = 'Metric';\n\n// ─────────────────────────────────────────────────────────────────────────\n// Internal sub-components — kept private. Each handles one variant only.\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface SubProps {\n\t/** Records to render. */\n\tdata: MetricData;\n\tformattedValue: string;\n\ttrend: 'positive' | 'negative' | 'neutral';\n\t/** Size preset. */\n\tsize: MetricSize;\n\t/** Renders the sparkline. */\n\tshowSparkline: boolean;\n\t/** Renders the change. */\n\tshowChange: boolean;\n\t/** Renders the icon. */\n\tshowIcon: boolean;\n\ttone: SemanticTone;\n\t/** Accessible name for the region. */\n\tariaLabel: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nfunction MetricDefault({ data, formattedValue, trend, size, showSparkline, showChange, showIcon, ariaLabel, className }: SubProps) {\n\tconst Icon = data.icon;\n\treturn (\n\t\t<Stack gap=\"xs\" className={className} aria-label={ariaLabel}>\n\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"sm\" className=\"min-w-0 text-muted-foreground\">\n\t\t\t\t{!!showIcon && !!Icon && <Icon className=\"size-icon-md shrink-0\" aria-hidden=\"true\" />}\n\t\t\t\t<Text size=\"xs\" type=\"secondary\" weight=\"medium\" className=\"truncate\">{data.label}</Text>\n\t\t\t</Stack>\n\t\t\t<Heading tag=\"h5\" size={VALUE_FONT_SIZE[size]} className=\"truncate tabular-nums text-inherit\" title={formattedValue}>\n\t\t\t\t{formattedValue}\n\t\t\t</Heading>\n\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"compact\" />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!!data.subtitle && <Text size=\"xs\" type=\"secondary\" className=\"truncate\">{data.subtitle}</Text>}\n\t\t\t{!!showSparkline && !!data.sparkline?.length && (\n\t\t\t\t<MetricSparkline data={data.sparkline} trend={trend} className={cn('mt-auto', SPARKLINE_HEIGHT[size])} />\n\t\t\t)}\n\t\t\t{!!data.footer && <Text size=\"xs\" type=\"discrete\" className=\"truncate\">{data.footer}</Text>}\n\t\t</Stack>\n\t);\n}\n\nfunction MetricCard({ data, formattedValue, trend, size, showSparkline, showChange, showIcon, ariaLabel, className }: SubProps) {\n\tconst Icon = data.icon;\n\tconst isInteractive = Boolean(data.href || data.onClick);\n\tconst card = (\n\t\t<Card\n\t\t\ttitle={<Text tag=\"span\" size=\"xs\" type=\"secondary\" weight=\"medium\">{data.label}</Text>}\n\t\t\ticon={!!showIcon && !!Icon ? <Icon className=\"size-icon\" aria-hidden=\"true\" /> : null}\n\t\t\ttooltip={data.tooltip}\n\t\t\tclassName={cn('@container/metric-card', isInteractive && 'relative transition-shadow hover:shadow-md [&_.card--tooltip-trigger]:relative [&_.card--tooltip-trigger]:z-10', className)}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t{isInteractive && (data.href ? <a href={data.href} onClick={data.onClick} aria-label={ariaLabel} className={`metric--action absolute inset-0 z-0 rounded-surface focus-visible:outline-none ${focusRecipes.inset}`} /> : <button type=\"button\" onClick={data.onClick} aria-label={ariaLabel} className={`metric--action ${interactionRecipes.nativeButtonReset} absolute inset-0 z-0 cursor-pointer rounded-surface focus-visible:outline-none ${focusRecipes.inset}`} />)}\n\t\t\t<Stack gap=\"normal\">\n\t\t\t\t<Stack direction=\"horizontal\" align=\"baseline\" justify=\"between\" gap=\"sm\">\n\t\t\t\t\t<Heading\n\t\t\t\t\t\ttag={size === 'sm' ? 'h5' : size === 'lg' ? 'h3' : 'h4'}\n\t\t\t\t\t\tsize={VALUE_FONT_SIZE_HERO[size]}\n\t\t\t\t\t\tclassName={cn('max-w-full break-words tabular-nums text-inherit', HERO_ADAPTIVE[size])}\n\t\t\t\t\t>\n\t\t\t\t\t\t{formattedValue}\n\t\t\t\t\t</Heading>\n\t\t\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"badge\" className=\"@max-[16rem]/metric-card:px-space-xs\" />\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t\t{!!data.subtitle && <Text type=\"secondary\">{data.subtitle}</Text>}\n\t\t\t\t{!!showSparkline && !!data.sparkline?.length && (\n\t\t\t\t\t<MetricSparkline\n\t\t\t\t\t\tdata={data.sparkline}\n\t\t\t\t\t\ttrend={trend}\n\t\t\t\t\t\tclassName={size === 'lg' ? 'h-control-lg' : 'h-control'}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{!!data.footer && <Text size=\"xs\" type=\"secondary\">{data.footer}</Text>}\n\t\t\t</Stack>\n\t\t</Card>\n\t);\n\n\treturn card;\n}\n\nfunction MetricCompact({ data, formattedValue, size, showChange, showIcon, ariaLabel, className }: SubProps) {\n\tconst Icon = data.icon;\n\treturn (\n\t\t<div className={cn('flex items-center gap-space-lg', className)} aria-label={ariaLabel}>\n\t\t\t{!!showIcon && !!Icon && <IconBadge icon={Icon} tone=\"secondary\" shape=\"square\" size=\"md\" />}\n\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"truncate\">{data.label}</Text>\n\t\t\t\t<Value type=\"inherit\" size={size === 'sm' ? 'sm' : 'base'} weight=\"bold\" className=\"block truncate tabular-nums\">\n\t\t\t\t\t{formattedValue}\n\t\t\t\t</Value>\n\t\t\t</div>\n\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"badge\" className=\"shrink-0\" />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nfunction MetricMinimal({ data, formattedValue, size, showChange, ariaLabel, className }: SubProps) {\n\treturn (\n\t\t<span className={cn('inline-flex items-baseline gap-space-md', className)} aria-label={ariaLabel}>\n\t\t\t<Text tag=\"span\" size={size === 'lg' ? 'sm' : 'xs'} type=\"secondary\">{data.label}:</Text>\n\t\t\t<Value type=\"inherit\" size={size === 'lg' ? 'sm' : 'xs'} weight=\"semibold\" className=\"tabular-nums\">{formattedValue}</Value>\n\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size=\"sm\" variant=\"inline\" />\n\t\t\t)}\n\t\t</span>\n\t);\n}\n\nfunction MetricBordered({ data, formattedValue, trend, size, showSparkline, showChange, showIcon, tone, ariaLabel, className }: SubProps) {\n\tconst Icon = data.icon;\n\tconst tint = metricToneRecipes[tone];\n\treturn (\n\t\t<Card surface=\"card\" className={cn(tint.edge, tint.wash, className)} aria-label={ariaLabel}>\n\t\t\t<Stack gap=\"lg\">\n\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"between\" gap=\"md\">\n\t\t\t\t\t<div className=\"flex items-center gap-space-md text-muted-foreground\">\n\t\t\t\t\t\t{!!showIcon && !!Icon && <Icon className=\"size-icon shrink-0\" aria-hidden=\"true\" />}\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" weight=\"medium\">{data.label}</Text>\n\t\t\t\t\t</div>\n\t\t\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"badge\" />\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t\t<Heading\n\t\t\t\t\ttag={size === 'lg' ? 'h3' : 'h4'}\n\t\t\t\t\tsize={VALUE_FONT_SIZE_HERO[size]}\n\t\t\t\t\tclassName=\"tabular-nums text-inherit\"\n\t\t\t\t>\n\t\t\t\t\t{formattedValue}\n\t\t\t\t</Heading>\n\t\t\t\t{!!data.subtitle && <Text size=\"xs\" type=\"secondary\">{data.subtitle}</Text>}\n\t\t\t\t{!!showSparkline && !!data.sparkline?.length && (\n\t\t\t\t\t<MetricSparkline data={data.sparkline} trend={trend} className={SPARKLINE_HEIGHT[size]} />\n\t\t\t\t)}\n\t\t\t\t{!!data.footer && <Text size=\"xs\" type=\"discrete\">{data.footer}</Text>}\n\t\t\t</Stack>\n\t\t</Card>\n\t);\n}\n\nfunction MetricAccent({ data, formattedValue, trend, size, showSparkline, showChange, showIcon, ariaLabel, className }: SubProps) {\n\tconst Icon = data.icon;\n\t// A dark-scoped card whose sparkline bleeds to the frame edge, like media:\n\t// the card owns the frame and the copy region owns the one inset.\n\treturn (\n\t\t<Card surface=\"card\" padding=\"none\" className={cn('dark', className)} aria-label={ariaLabel}>\n\t\t\t<Stack gap=\"md\" className=\"p-surface\">\n\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"between\" gap=\"lg\">\n\t\t\t\t\t<DisplayLabel className=\"text-inherit\">\n\t\t\t\t\t\t{data.label}\n\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t{!!showIcon && !!Icon && (\n\t\t\t\t\t\t<IconBadge tone=\"secondary\" shape=\"square\" size=\"sm\">\n\t\t\t\t\t\t\t<Icon className=\"size-icon-md\" aria-hidden=\"true\" />\n\t\t\t\t\t\t</IconBadge>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t\t<div className=\"flex items-baseline gap-space-md\">\n\t\t\t\t\t<Heading\n\t\t\t\t\t\ttag=\"h3\"\n\t\t\t\t\t\tsize={VALUE_FONT_SIZE_HERO[size]}\n\t\t\t\t\t\tclassName=\"tabular-nums text-inherit\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{formattedValue}\n\t\t\t\t\t</Heading>\n\t\t\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"compact\" />\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t{!!data.subtitle && <Text size=\"xs\" type=\"secondary\">{data.subtitle}</Text>}\n\t\t\t</Stack>\n\t\t\t{!!showSparkline && !!data.sparkline?.length && (\n\t\t\t\t<MetricSparkline data={data.sparkline} trend={trend} className=\"h-control-lg w-full\" />\n\t\t\t)}\n\t\t</Card>\n\t);\n}\n\nfunction MetricColored({ data, formattedValue, size, showChange, tone, ariaLabel, className, progress = 0 }: SubProps & { progress?: number }) {\n\tconst tint = metricToneRecipes[tone];\n\tconst filledCount = Math.round((Math.min(Math.max(progress, 0), 100) / 100) * SEGMENT_COUNT);\n\treturn (\n\t\t<Card surface=\"card\" className={className} aria-label={ariaLabel}>\n\t\t\t<Stack gap=\"lg\">\n\t\t\t\t<Stack gap=\"md\">\n\t\t\t\t\t<div className=\"flex items-center gap-space-md\">\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" weight=\"medium\" className=\"truncate\">{data.label}</Text>\n\t\t\t\t\t\t<span className={cn(dotRecipes.inline, tint.solid)} aria-hidden=\"true\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t{/* A figure never breaks mid-number; its unit wraps under it instead. */}\n\t\t\t\t\t<div className=\"flex flex-wrap items-baseline gap-x-space-md\">\n\t\t\t\t\t\t<Heading\n\t\t\t\t\t\t\ttag=\"h3\"\n\t\t\t\t\t\t\tsize={VALUE_FONT_SIZE_HERO[size]}\n\t\t\t\t\t\t\tclassName=\"whitespace-nowrap tabular-nums text-inherit\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{formattedValue}\n\t\t\t\t\t\t</Heading>\n\t\t\t\t\t\t{!!data.subtitle && <Text size=\"xs\" type=\"secondary\">{data.subtitle}</Text>}\n\t\t\t\t\t</div>\n\t\t\t\t</Stack>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"flex items-center gap-space-2xs\"\n\t\t\t\t\trole=\"progressbar\"\n\t\t\t\t\taria-label={`${data.label} progress`}\n\t\t\t\t\taria-valuenow={progress}\n\t\t\t\t\taria-valuemin={0}\n\t\t\t\t\taria-valuemax={100}\n\t\t\t\t\taria-valuetext={`${progress}%`}\n\t\t\t\t>\n\t\t\t\t\t{Array.from({ length: SEGMENT_COUNT }, (_, i) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={`seg-${i}`}\n\t\t\t\t\t\t\tclassName={cn('h-6 w-1.5 rounded-radius-sm transition-colors', i < filledCount ? tint.solid : 'bg-muted')}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t\t{(!!(showChange && data.change) || !!data.footer) && (\n\t\t\t\t\t<Stack gap=\"md\">\n\t\t\t\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"default\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!data.footer && (\n\t\t\t\t\t\t\t<div className=\"inline-flex items-center gap-space-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t<ArrowUpRight className=\"size-icon-sm\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{data.footer}</Text>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</Card>\n\t);\n}\n","/**\n * MetricBar — horizontal strip of metrics with an optional period selector\n * on the leading edge. Cells are divided by hairlines so a row of 4 KPIs\n * reads as a single integrated module rather than disconnected cards.\n *\n * Variants:\n * `default` — flat hairline-divided bar with period chip on the left.\n * Best for tables/dashboards where the bar sits above content.\n * `gradient` — same layout wrapped in a tinted gradient frame for hero\n * placement.\n *\n * Always render `Metric` cells inside; never render layout-specific markup\n * directly. That keeps the formatting / colouring rules in one place.\n */\nimport { Calendar } from 'lucide-react';\nimport { Button } from '../../../base/buttons';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport { Metric } from '../metric/metric';\nimport type { MetricData, MetricPeriod, MetricSize } from '../types';\n\nexport type MetricBarVariant = 'default' | 'gradient';\n\nexport interface MetricBarProps {\n\tmetrics: MetricData[];\n\tperiod?: MetricPeriod;\n\tonPeriodChange?: (value: string) => void;\n\t/** Shell treatment. */\n\tvariant?: MetricBarVariant;\n\t/** Size preset. */\n\tsize?: MetricSize;\n\t/** Renders the sparklines. */\n\tshowSparklines?: boolean;\n\t/** Renders the changes. */\n\tshowChanges?: boolean;\n\tfooterText?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport function MetricBar({\n\tmetrics,\n\tperiod,\n\tonPeriodChange,\n\tvariant = 'default',\n\tsize = 'sm',\n\tshowSparklines = true,\n\tshowChanges = true,\n\tfooterText,\n\tclassName,\n}: MetricBarProps) {\n\tconst cells = (\n\t\t<div className=\"grid min-w-0 flex-1 grid-cols-1 divide-y divide-border @xl/metric-bar:flex @xl/metric-bar:items-stretch @xl/metric-bar:divide-x @xl/metric-bar:divide-y-0\">\n\t\t\t{metrics.map((metric) => (\n\t\t\t\t// The cell is a full-height flex column and the Metric stretches into\n\t\t\t\t// it so `MetricDefault`'s `mt-auto` sparkline resolves against real\n\t\t\t\t// leftover height. Without this, a metric carrying an optional\n\t\t\t\t// subtitle grows taller and its sparkline drops off the shared\n\t\t\t\t// baseline the rest of the strip sits on.\n\t\t\t\t<div key={metric.id} className=\"flex min-w-0 flex-col px-surface py-row-y @xl/metric-bar:min-w-36 @xl/metric-bar:flex-1\">\n\t\t\t\t\t<Metric\n\t\t\t\t\t\tdata={metric}\n\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\tshowSparkline={showSparklines}\n\t\t\t\t\t\tshowChange={showChanges}\n\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n\n\tconst periodChip = !!period && (\n\t\t<div className=\"flex shrink-0 items-center border-b border-border px-row-x py-row-y @xl/metric-bar:border-b-0 @xl/metric-bar:py-0\">\n\t\t\t<Button\n\t\t\t\ttone=\"secondary\"\n\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\tclassName=\"gap-space-sm\"\n\t\t\t\tonClick={onPeriodChange ? () => onPeriodChange(period.value) : undefined}\n\t\t\t>\n\t\t\t\t<Calendar className=\"size-icon-md\" aria-hidden=\"true\" />\n\t\t\t\t<Text type=\"inherit\" size=\"inherit\" weight=\"medium\">{period.label}</Text>\n\t\t\t</Button>\n\t\t</div>\n\t);\n\n\tif (variant === 'gradient') {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn('metric-bar--component box-border @container/metric-bar',\n\t\t\t\t\t'w-full',\n\t\t\t\t\t// A decorative frame tint: chart roles, not primary (near-black by\n\t\t\t\t\t// default) or status tones, which would state a condition.\n\t\t\t\t\t'rounded-surface bg-gradient-to-r from-chart-3/8 via-chart-2/5 to-chart-1/8 p-px',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div className=\"flex min-w-0 flex-col overflow-hidden rounded-surface bg-card text-card-foreground @xl/metric-bar:flex-row\">\n\t\t\t\t\t{periodChip && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{periodChip}\n\t\t\t\t\t\t\t<div className=\"hidden w-px bg-border @xl/metric-bar:block\" aria-hidden=\"true\" />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t{cells}\n\t\t\t\t</div>\n\t\t\t\t{!!footerText && (\n\t\t\t\t\t<div className=\"rounded-b-surface border-t border-border/60 bg-card text-card-foreground px-surface py-row-y\">\n\t\t\t\t\t\t<Text size=\"xs\" type=\"discrete\">{footerText}</Text>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'metric-bar--component box-border @container/metric-bar flex w-full flex-col overflow-hidden rounded-surface border border-border bg-card text-card-foreground shadow-sm',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"flex min-w-0 flex-col overflow-hidden @xl/metric-bar:flex-row\">\n\t\t\t\t{periodChip && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{periodChip}\n\t\t\t\t\t\t<div className=\"hidden w-px bg-border @xl/metric-bar:block\" aria-hidden=\"true\" />\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{cells}\n\t\t\t</div>\n\t\t\t{!!footerText && (\n\t\t\t\t<div className=\"border-t border-border/60 px-surface py-row-y\">\n\t\t\t\t\t<Text size=\"xs\" type=\"discrete\">{footerText}</Text>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nMetricBar.displayName = 'MetricBar';\n","/**\n * MetricGrid — responsive grid of `Metric` cells. The grid is the workhorse\n * for KPI rows on dashboards: pass a list, choose a variant, and the\n * component handles layout / column counts / spacing.\n *\n * Variants are forwarded to `Metric` so a single grid can show either\n * standalone cards, bordered tints, or compact list rows.\n *\n * Column counts default to `auto` — the grid breaks based on the cell count.\n * Override with `columns` to set the maximum number of tracks.\n *\n * Every break is a container query against the grid's own width, not the\n * viewport's. A KPI row is routinely dropped into a sidebar, a drawer, or one\n * half of a split view; keyed to the viewport, six metrics in a 300px rail on\n * a desktop screen rendered as six ~40px columns.\n */\nimport { Grid } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\n\nimport { Metric, type MetricProps } from '../metric/metric';\nimport type {\n\tMetricData,\n\tMetricSize,\n\tMetricVariant,\n} from '../types';\n\nexport interface MetricGridProps extends Pick<MetricProps, 'tone' | 'colorScheme'> {\n\t/** Metrics rendered as one responsive peer collection. */\n\tmetrics: MetricData[];\n\t/** Cell variant. `card` composes the canonical Card surface. */\n\tvariant?: Extract<MetricVariant, 'card' | 'compact' | 'bordered' | 'accent' | 'colored'>;\n\t/** Shared visual size forwarded to every metric. */\n\tsize?: MetricSize;\n\t/** Maximum column count; narrower parents use fewer tracks. `auto` chooses from the cell count. */\n\tcolumns?: 'auto' | 1 | 2 | 3 | 4 | 6;\n\t/** Peer spacing. Defaults to `xl`; use denser gaps explicitly for compact lists. */\n\tgap?: 'sm' | 'md' | 'lg' | 'xl';\n\t/** Show each metric's sparkline when data is available. */\n\tshowSparklines?: boolean;\n\t/** Show each metric's change indicator when data is available. */\n\tshowChanges?: boolean;\n\t/** Show each metric's icon when data is available. */\n\tshowIcons?: boolean;\n\t/** Render loading skeletons without changing the grid or card geometry. */\n\tloading?: boolean;\n\t/**\n\t * Additional classes for the component root. The root owns the query\n\t * container; the responsive `grid-cols-*` live on the grid inside it, so pin\n\t * a layout with `columns` rather than a class here.\n\t */\n\tclassName?: string;\n}\n\n// Parent-width tiers give framed metrics room for their shared surface insets,\n// primary labels and formatted values. Requested columns are a ceiling, never\n// a reason to squeeze desktop tracks into a narrow shell or drawer.\nconst COLUMN_CLASS: Record<Exclude<NonNullable<MetricGridProps['columns']>, 'auto'>, string> = {\n\t1: 'grid-cols-1',\n\t2: 'grid-cols-1 @md/metric-grid:grid-cols-2',\n\t3: 'grid-cols-1 @2xl/metric-grid:grid-cols-3',\n\t4: 'grid-cols-1 @md/metric-grid:grid-cols-2 @5xl/metric-grid:grid-cols-4',\n\t6: 'grid-cols-1 @md/metric-grid:grid-cols-2 @3xl/metric-grid:grid-cols-3 @7xl/metric-grid:grid-cols-6',\n};\n\nfunction autoColumnsFor(count: number): string {\n\tconst maximum = count <= 1 ? 1 : count === 2 ? 2 : count === 3 ? 3 : count <= 4 || count > 6 ? 4 : 6;\n\treturn COLUMN_CLASS[maximum];\n}\n\nexport function MetricGrid({\n\tmetrics,\n\tvariant = 'card',\n\tsize = 'md',\n\ttone,\n\tcolorScheme = 'default',\n\tcolumns = 'auto',\n\tgap = 'xl',\n\tshowSparklines = true,\n\tshowChanges = true,\n\tshowIcons = true,\n\tloading = false,\n\tclassName,\n}: MetricGridProps) {\n\tconst columnsClass = columns === 'auto' ? autoColumnsFor(metrics.length) : COLUMN_CLASS[columns];\n\n\treturn (\n\t\t/*\n\t\t * The root exists to be the query container: an element cannot match its\n\t\t * own container query, so the grid whose columns react has to sit inside\n\t\t * the element being measured. Same shape as product-details-card.\n\t\t */\n\t\t<div className={cn('metric-grid--component @container/metric-grid', className)}>\n\t\t\t<Grid\n\t\t\t\tcolumns={1}\n\t\t\t\tgap={gap}\n\t\t\t\tclassName={cn('metric-grid--grid', columnsClass)}\n\t\t\t>\n\t\t\t\t{metrics.map((metric) => (\n\t\t\t\t\t<Metric\n\t\t\t\t\t\tkey={metric.id}\n\t\t\t\t\t\tdata={metric}\n\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\ttone={tone}\n\t\t\t\t\t\tcolorScheme={colorScheme}\n\t\t\t\t\t\tshowSparkline={showSparklines}\n\t\t\t\t\t\tshowChange={showChanges}\n\t\t\t\t\t\tshowIcon={showIcons}\n\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</Grid>\n\t\t</div>\n\t);\n}\n\nMetricGrid.displayName = 'MetricGrid';\n","/**\n * MetricComparison — period-over-period comparison surface.\n *\n * Renders the current and previous figures side by side as plain label/value\n * pairs (no tile per period), with a delta row below: a signed, tone-coded badge for the\n * absolute change and secondary text for the percentage. Layout stacks\n * vertically below the `sm` breakpoint.\n *\n * Accepts `MetricData` for both halves so format hints (currency, percent,\n * duration) carry over consistently. Strings overridable for i18n.\n */\nimport { ArrowDown, ArrowRight, ArrowUp, Equal } from 'lucide-react';\n\nimport { Badge } from '../../../base/badge';\nimport { Stack } from '../../../base/structure';\nimport { Value } from '../../../primitives';\nimport { DisplayLabel, Text } from '../../../typography';\nimport { type StringsProp, useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { formatNumber, formatPercentRatio } from '../../../../lib/format';\n\nimport { formatMetricValue } from '../format-metric-value';\nimport { useMetricFormatOptions } from '../use-metric-format-options';\nimport type { MetricData } from '../types';\n\nexport interface MetricComparisonStrings {\n\t/** Surface title. */\n\ttitle: string;\n\tcurrentLabel: string;\n\tpreviousLabel: string;\n\tsuffix: string;\n\t/** Copy shown when the relative change cannot be calculated. */\n\tnoBaseline?: string;\n\t/** Unit for the absolute change between two percentages. Additive; defaults to `pp`. */\n\tpointsUnit?: string;\n}\n\nexport const defaultMetricComparisonStrings: MetricComparisonStrings = {\n\ttitle: 'Comparison',\n\tcurrentLabel: 'This period',\n\tpreviousLabel: 'Previous period',\n\tsuffix: 'vs previous',\n\tnoBaseline: 'Relative change unavailable',\n\tpointsUnit: 'pp',\n};\n\nexport interface MetricComparisonProps {\n\tcurrent: MetricData;\n\tprevious: MetricData;\n\t/** Surface title. */\n\ttitle?: string;\n\tcurrentPeriod?: string;\n\tpreviousPeriod?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<MetricComparisonStrings>;\n}\n\nfunction toNumber(value: MetricData['value']): number | null {\n\tif (value === null || value === undefined) return null;\n\tconst n = Number(value);\n\treturn Number.isFinite(n) ? n : null;\n}\n\nexport function MetricComparison({\n\tcurrent,\n\tprevious,\n\ttitle,\n\tcurrentPeriod,\n\tpreviousPeriod,\n\tclassName,\n\tstrings: stringsProp,\n}: MetricComparisonProps) {\n\tconst strings = useStrings(defaultMetricComparisonStrings, stringsProp);\n\tconst formatOptions = useMetricFormatOptions();\n\n\tconst currentNum = toNumber(current.value);\n\tconst previousNum = toNumber(previous.value);\n\tconst delta = currentNum !== null && previousNum !== null ? currentNum - previousNum : null;\n\tconst canCompute = delta !== null && Number.isFinite(delta);\n\tconst isUp = delta !== null && delta > 0;\n\tconst isFlat = delta === 0;\n\t// Keep relative movement in the same direction as the absolute change.\n\tconst ratio = delta !== null && previousNum ? delta / Math.abs(previousNum) : null;\n\tconst relativeChange = ratio !== null && Number.isFinite(ratio)\n\t\t? formatPercentRatio(isFlat ? 0 : ratio, formatOptions.locale, {\n\t\t\tmaximumFractionDigits: 0,\n\t\t\tsignDisplay: isFlat ? 'auto' : 'always',\n\t\t})\n\t\t: null;\n\tconst Arrow = isFlat ? Equal : isUp ? ArrowUp : ArrowDown;\n\n\t// The signed delta badge is the one place colour states the movement; the row\n\t// around it is plain, so the comparison does not sit in a tinted panel.\n\t// `current.trend` says whether this movement is good, as on Metric: a fall\n\t// in overdue balances or churn is positive.\n\tconst movement = isFlat ? 'neutral' : current.trend ?? (isUp ? 'positive' : 'negative');\n\tconst deltaTone = movement === 'positive' ? 'success' as const : movement === 'negative' ? 'destructive' as const : 'secondary' as const;\n\n\tconst formatDelta = (value: number) => {\n\t\tconst abs = Math.abs(value);\n\t\t// The absolute change between two rates is in percentage points, not a\n\t\t// percent: 9.4% → 8.2% moves 1.2 pp, while the text states the relative −13%.\n\t\tif (current.valueType === 'percentage') {\n\t\t\treturn `${formatNumber(abs * 100, { locale: formatOptions.locale, maximumFractionDigits: 1 })} ${strings.pointsUnit ?? defaultMetricComparisonStrings.pointsUnit}`;\n\t\t}\n\t\t// reuse the formatter so currency metrics render correctly\n\t\treturn formatMetricValue({ ...current, value: abs }, formatOptions);\n\t};\n\n\treturn (\n\t\t<Stack\n\t\t\tdata-component=\"metric-comparison\"\n\t\t\tdata-slot=\"metric-comparison\"\n\t\t\tgap=\"md\"\n\t\t\tclassName={cn('metric-comparison--component @container/metric-comparison', className)}\n\t\t\taria-label={title ?? strings.title}\n\t\t>\n\t\t\t{/* Plain figures, no tile per period: the grid gap separates them and the\n\t\t\t previous figure recedes through the secondary colour role. Each period\n\t\t\t badge heads the column it names. */}\n\t\t\t<div className=\"grid items-center gap-space-md grid-cols-1 @md/metric-comparison:grid-cols-[1fr_auto_1fr]\">\n\t\t\t\t<Stack gap=\"dense\" className=\"metric-comparison--current min-w-0\">\n\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\">\n\t\t\t\t\t\t<DisplayLabel className=\"text-inherit\">\n\t\t\t\t\t\t\t{strings.currentLabel}\n\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t{!!currentPeriod && (\n\t\t\t\t\t\t\t<Badge tone=\"secondary\" inline className=\"metric-comparison--period\">\n\t\t\t\t\t\t\t\t{currentPeriod}\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<Value type=\"inherit\" size=\"base\" weight=\"semibold\" className=\"tabular-nums\">\n\t\t\t\t\t\t{formatMetricValue(current, formatOptions)}\n\t\t\t\t\t</Value>\n\t\t\t\t</Stack>\n\t\t\t\t<div className=\"flex items-center text-muted-foreground @md/metric-comparison:justify-center\">\n\t\t\t\t\t<ArrowRight className=\"hidden size-icon @md/metric-comparison:block\" aria-hidden=\"true\" />\n\t\t\t\t\t<ArrowDown className=\"size-icon @md/metric-comparison:hidden\" aria-hidden=\"true\" />\n\t\t\t\t</div>\n\t\t\t\t<Stack gap=\"dense\" className=\"metric-comparison--previous min-w-0\">\n\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\">\n\t\t\t\t\t\t<DisplayLabel className=\"text-inherit\">\n\t\t\t\t\t\t\t{strings.previousLabel}\n\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t{!!previousPeriod && (\n\t\t\t\t\t\t\t<Badge tone=\"secondary\" inline className=\"metric-comparison--period\">\n\t\t\t\t\t\t\t\t{previousPeriod}\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<Value size=\"base\" weight=\"semibold\" type=\"secondary\" className=\"tabular-nums\">\n\t\t\t\t\t\t{formatMetricValue(previous, formatOptions)}\n\t\t\t\t\t</Value>\n\t\t\t\t</Stack>\n\t\t\t</div>\n\n\t\t\t{!!canCompute && (\n\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"metric-comparison--delta\">\n\t\t\t\t\t<Badge tone={deltaTone} size=\"sm\" inline>\n\t\t\t\t\t\t<Arrow className=\"size-icon-sm\" strokeWidth={2.5} aria-hidden=\"true\" />\n\t\t\t\t\t\t<Value size=\"inherit\" weight=\"semibold\" className=\"tabular-nums text-inherit\">\n\t\t\t\t\t\t\t{isUp ? '+' : isFlat ? '' : '−'}{formatDelta(delta)}\n\t\t\t\t\t\t</Value>\n\t\t\t\t\t</Badge>\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"tabular-nums\">\n\t\t\t\t\t\t{relativeChange\n\t\t\t\t\t\t\t? `${relativeChange} ${strings.suffix}`\n\t\t\t\t\t\t\t: strings.noBaseline ?? defaultMetricComparisonStrings.noBaseline}\n\t\t\t\t\t</Text>\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</Stack>\n\t);\n}\n\nMetricComparison.displayName = 'MetricComparison';\n","/**\n * MetricMicroGrid — six-cell dense KPI overview where each cell pairs a\n * label/value with a different lightweight visualization (bars / line /\n * dots / progress / area / pie). Useful as a top-of-page summary widget\n * on a packed dashboard.\n *\n * Cells are positional: index 0 → bars, 1 → line, 2 → dots, 3 → progress,\n * 4 → area, 5 → pie. To pin a specific renderer, pass `chart` per cell.\n */\nimport { useId } from 'react';\nimport { Area, AreaChart, ResponsiveContainer } from 'recharts';\n\nimport { Progress } from '../../../base/feedback';\nimport { Stack } from '../../../base/structure';\nimport { Value } from '../../../primitives';\nimport { DisplayLabel } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\nimport { usePrefersReducedMotion } from '../../../../lib/use-prefers-reduced-motion';\n\nexport type MicroChartKind = 'bars' | 'line' | 'dots' | 'progress' | 'area' | 'pie';\n\nexport interface MicroMetricCell {\n\t/** Stable identity for this entry. */\n\tid?: string;\n\t/** Display label. */\n\tlabel: string;\n\t/** Current value. Controlled. */\n\tvalue: string;\n\t/** Records to render. */\n\tdata: readonly number[];\n\tchart?: MicroChartKind;\n}\n\nexport interface MetricMicroGridProps {\n\t/** Surface title. */\n\ttitle?: string;\n\tcells: readonly MicroMetricCell[];\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nconst DEFAULT_ORDER: MicroChartKind[] = ['bars', 'line', 'dots', 'progress', 'area', 'pie'];\n\n// Every single-series micro chart draws in the first chart colour: the cell's\n// label says what it measures, so a different hue per chart kind would be\n// decoration, and status colours (success/warning/info) would imply a state.\nconst CHART_COLORS: Record<MicroChartKind, string> = {\n\tbars: 'var(--chart-1)',\n\tline: 'var(--chart-1)',\n\tdots: 'var(--chart-1)',\n\tprogress: 'var(--chart-1)',\n\tarea: 'var(--chart-1)',\n\tpie: 'var(--chart-1)',\n};\n\n/** Categorical slices use the categorical chart roles in order. */\nconst PIE_PALETTE = ['var(--chart-1)', 'var(--chart-2)', 'var(--chart-3)'];\n\n// Every micro chart draws in one shared track height, the compact sparkline\n// height Metric uses, so a cell's chart reads at the same scale as its peers.\nconst CHART_TRACK = 'h-control-sm';\n\nfunction MicroBars({ data, color }: { data: readonly number[]; color: string }) {\n\tconst max = Math.max(...data, 1);\n\treturn (\n\t\t<div className={cn('flex items-end gap-space-2xs', CHART_TRACK)}>\n\t\t\t{data.slice(0, 6).map((v, i) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={`bar-${i}`}\n\t\t\t\t\tclassName=\"flex-1 rounded-t-radius-sm\"\n\t\t\t\t\tstyle={{ height: `${(v / max) * 100}%`, backgroundColor: color }}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\nfunction MicroLine({ data, color }: { data: readonly number[]; color: string }) {\n\tconst max = Math.max(...data, 1);\n\tconst min = Math.min(...data);\n\tconst range = max - min || 1;\n\tconst points = data.slice(0, 6);\n\treturn (\n\t\t<svg viewBox=\"0 0 60 16\" className={cn('w-full', CHART_TRACK)} preserveAspectRatio=\"none\">\n\t\t\t<polyline\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke={color}\n\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tpoints={points\n\t\t\t\t\t.map((v, i) => `${(i / Math.max(points.length - 1, 1)) * 60},${16 - ((v - min) / range) * 14}`)\n\t\t\t\t\t.join(' ')}\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\n// Dots encode position, not length, so like the line they scale between the\n// series minimum and maximum across the whole track.\nfunction MicroDots({ data, color }: { data: readonly number[]; color: string }) {\n\tconst points = data.slice(0, 5);\n\tconst max = Math.max(...points);\n\tconst min = Math.min(...points);\n\tconst range = max - min || 1;\n\treturn (\n\t\t<div className={cn('flex justify-around', CHART_TRACK)} data-intrinsic-geometry>\n\t\t\t{points.map((v, i) => (\n\t\t\t\t<div key={`dot-${i}`} className=\"relative h-full w-1.5\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute inset-x-0 h-1.5 rounded-full\"\n\t\t\t\t\t\tstyle={{ bottom: `calc(${(v - min) / range} * (100% - 0.375rem))`, backgroundColor: color }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\n/** The shared Progress meter, drawn in the grid's single chart colour and named by its cell. */\nfunction MicroProgress({ data, label }: { data: readonly number[]; label: string }) {\n\treturn (\n\t\t<Progress\n\t\t\tvalue={data[0] ?? 0}\n\t\t\tmax={data[1] ?? 100}\n\t\t\tsize=\"sm\"\n\t\t\taria-label={label}\n\t\t\tindicatorProps={{ className: 'bg-chart-1' }}\n\t\t/>\n\t);\n}\n\nfunction MicroAreaChart({ data, color }: { data: readonly number[]; color: string }) {\n\tconst id = useId();\n\tconst reducedMotion = usePrefersReducedMotion();\n\tconst gradId = `micro-area-${id.replaceAll(':', '')}`;\n\t// Like the line, the area spans the series range rather than starting at\n\t// zero: measured from the series minimum, a small change still reads.\n\tconst min = Math.min(...data);\n\tconst chartData = data.map((v, i) => ({ i, v: v - min }));\n\treturn (\n\t\t<div className={cn('w-full', CHART_TRACK)}>\n\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\" initialDimension={{ width: 1, height: 1 }}>\n\t\t\t\t<AreaChart data={chartData} margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<linearGradient id={gradId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={color} stopOpacity={0.3} />\n\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={color} stopOpacity={0} />\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t</defs>\n\t\t\t\t\t<Area type=\"monotone\" dataKey=\"v\" stroke={color} strokeWidth={1.25} fill={`url(#${gradId})`} isAnimationActive={!reducedMotion} />\n\t\t\t\t</AreaChart>\n\t\t\t</ResponsiveContainer>\n\t\t</div>\n\t);\n}\n\nfunction MicroPie({ data }: { data: readonly number[] }) {\n\tconst total = data.reduce((a, b) => a + b, 0) || 1;\n\tlet cumAngle = 0;\n\treturn (\n\t\t<svg viewBox=\"0 0 24 24\" className=\"size-control-sm\">\n\t\t\t{data.slice(0, 3).map((v, i) => {\n\t\t\t\tconst angle = (v / total) * 360;\n\t\t\t\tconst startAngle = cumAngle;\n\t\t\t\tcumAngle += angle;\n\t\t\t\tconst startRad = ((startAngle - 90) * Math.PI) / 180;\n\t\t\t\tconst endRad = ((startAngle + angle - 90) * Math.PI) / 180;\n\t\t\t\tconst largeArc = angle > 180 ? 1 : 0;\n\t\t\t\tconst x1 = 12 + 10 * Math.cos(startRad);\n\t\t\t\tconst y1 = 12 + 10 * Math.sin(startRad);\n\t\t\t\tconst x2 = 12 + 10 * Math.cos(endRad);\n\t\t\t\tconst y2 = 12 + 10 * Math.sin(endRad);\n\t\t\t\treturn (\n\t\t\t\t\t<path\n\t\t\t\t\t\tkey={`slice-${i}`}\n\t\t\t\t\t\td={`M12,12 L${x1},${y1} A10,10 0 ${largeArc},1 ${x2},${y2} Z`}\n\t\t\t\t\t\tfill={PIE_PALETTE[i % PIE_PALETTE.length]}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t})}\n\t\t</svg>\n\t);\n}\n\nfunction ChartFor({ kind, data, label }: { kind: MicroChartKind; data: readonly number[]; label: string }) {\n\tconst color = CHART_COLORS[kind];\n\tif (kind === 'bars') return <MicroBars data={data} color={color} />;\n\tif (kind === 'line') return <MicroLine data={data} color={color} />;\n\tif (kind === 'dots') return <MicroDots data={data} color={color} />;\n\tif (kind === 'progress') return <MicroProgress data={data} label={label} />;\n\tif (kind === 'area') return <MicroAreaChart data={data} color={color} />;\n\treturn <MicroPie data={data} />;\n}\n\n/**\n * Column ladders keyed by cell count, driven by the grid's own width so the\n * cells fill whatever region holds them: six cells read 2 × 3, then 3 × 2,\n * then one row on a wide dashboard.\n */\nconst COLUMNS: Record<number, string> = {\n\t1: 'grid-cols-1',\n\t2: 'grid-cols-2',\n\t3: 'grid-cols-1 @md/metric-micro-grid:grid-cols-3',\n\t4: 'grid-cols-2 @3xl/metric-micro-grid:grid-cols-4',\n\t5: 'grid-cols-2 @xl/metric-micro-grid:grid-cols-3 @5xl/metric-micro-grid:grid-cols-5',\n\t6: 'grid-cols-2 @xl/metric-micro-grid:grid-cols-3 @5xl/metric-micro-grid:grid-cols-6',\n};\n\nexport function MetricMicroGrid({ title = 'Overview', cells, className }: MetricMicroGridProps) {\n\tconst visible = cells.slice(0, 6);\n\treturn (\n\t\t<div\n\t\t\tdata-component=\"metric-micro-grid\"\n\t\t\tdata-slot=\"metric-micro-grid\"\n\t\t\tclassName={cn('metric-micro-grid--component @container/metric-micro-grid min-w-0 overflow-hidden', className)}\n\t\t\taria-label={title}\n\t\t>\n\t\t\t{/* Every cell rules its end and bottom edge; the grid overhangs the clipped\n\t\t\t root by one pixel so the outer edges draw no rule at any column count. */}\n\t\t\t<div className={cn('-me-px -mb-px grid', COLUMNS[Math.max(visible.length, 1)])}>\n\t\t\t\t{visible.map((cell, i) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={cell.id ?? cell.label}\n\t\t\t\t\t\tclassName=\"min-w-0 border-e border-b border-border/60 p-surface-xs\"\n\t\t\t\t\t>\n\t\t\t\t\t<Stack gap=\"sm\">\n\t\t\t\t\t\t<DisplayLabel className=\"truncate text-inherit\">\n\t\t\t\t\t\t\t{cell.label}\n\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t<Value type=\"inherit\" weight=\"bold\" className=\"truncate tabular-nums\">\n\t\t\t\t\t\t\t{cell.value}\n\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t<div className=\"mt-auto\">\n\t\t\t\t\t\t\t<ChartFor kind={cell.chart ?? DEFAULT_ORDER[i]} data={cell.data} label={cell.label} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Stack>\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\nMetricMicroGrid.displayName = 'MetricMicroGrid';\n","/**\n * MetricGradient — vivid full-bleed gradient hero card with embedded area\n * chart. Used at the top of marketing dashboards or analytics overview\n * pages where a single metric earns the most visual weight.\n *\n * Themes (`green` / `purple` / `warm` / `ocean`) resolve to semantic tokens;\n * the data prop accepts a `readonly MetricDataPoint[]` so consumers can pass\n * named time-series points.\n */\nimport { useId } from 'react';\nimport { Area, AreaChart, ResponsiveContainer } from 'recharts';\n\nimport { Stack } from '../../../base/structure';\nimport { DisplayLabel, Heading, Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\nimport { usePrefersReducedMotion } from '../../../../lib/use-prefers-reduced-motion';\n\nimport { MetricTrendChip } from '../atoms/metric-trend-chip';\nimport type { MetricChange, MetricDataPoint } from '../types';\n\nexport type MetricGradientTheme = 'green' | 'purple' | 'warm' | 'ocean';\n\nexport interface MetricGradientProps {\n\t/** Surface title. */\n\ttitle: string;\n\t/** Current value. Controlled. */\n\tvalue?: string;\n\tchange?: MetricChange;\n\t/** Records to render. */\n\tdata: readonly MetricDataPoint[];\n\ttheme?: MetricGradientTheme;\n\tsubtitle?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\n/**\n * Four themes, four looks. The ramps are decoration, so they draw from the\n * categorical chart roles rather than status (success/warning/destructive\n * would state a condition) or `primary` (near-black in the default theme, so\n * half the ramp vanished against the inverse panel). Retheming the chart\n * palette moves all four together: `ocean` runs blue into teal.\n */\nconst THEME_BG: Record<MetricGradientTheme, string> = {\n\tgreen: 'bg-gradient-to-br from-chart-1 via-chart-2 to-chart-1',\n\tpurple: 'bg-gradient-to-br from-chart-3 via-chart-4 to-chart-3',\n\twarm: 'bg-gradient-to-br from-chart-5 via-chart-4 to-chart-5',\n\tocean: 'bg-gradient-to-br from-chart-2 via-chart-1 to-chart-2',\n};\n\nconst CHART_INVERSE = 'var(--inverse-foreground)';\nconst CHART_INVERSE_SOFT = 'var(--inverse-muted)';\n\nexport function MetricGradient({\n\ttitle,\n\tvalue,\n\tchange,\n\tdata,\n\ttheme = 'green',\n\tsubtitle,\n\tclassName,\n}: MetricGradientProps) {\n\tconst id = useId();\n\tconst reducedMotion = usePrefersReducedMotion();\n\tconst gradientId = `metric-grad-${id.replaceAll(':', '')}`;\n\n\treturn (\n\t\t<div className={cn(\n\t\t\t\t'metric-gradient--component',\n\t\t\t\t'relative overflow-hidden rounded-surface p-surface text-inverse-foreground shadow-sm ring-1 ring-inverse-border',\n\t\t\t\tTHEME_BG[theme],\n\t\t\t\tclassName,\n\t\t\t)}>\n\t\t<Stack gap=\"md\">\n\t\t\t<Stack\n\t\t\t\tdirection=\"horizontal\"\n\t\t\t\talign=\"start\"\n\t\t\t\tjustify=\"between\"\n\t\t\t\twrap\n\t\t\t\tclassName=\"relative rounded-surface bg-inverse-background p-surface\"\n\t\t\t>\n\t\t\t\t<Stack gap=\"xs\" className=\"min-w-0\">\n\t\t\t\t\t<DisplayLabel tone=\"inverse\">{title}</DisplayLabel>\n\t\t\t\t\t{!!value && (\n\t\t\t\t\t\t<Heading tag=\"h3\" className=\"tabular-nums text-inverse-foreground\">\n\t\t\t\t\t\t\t{value}\n\t\t\t\t\t\t</Heading>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!subtitle && <Text size=\"xs\" className=\"text-inverse-muted\">{subtitle}</Text>}\n\t\t\t\t</Stack>\n\t\t\t\t{!!change && (\n\t\t\t\t\t<MetricTrendChip\n\t\t\t\t\t\tchange={change}\n\t\t\t\t\t\ttrend={change.direction === 'up' ? 'positive' : change.direction === 'down' ? 'negative' : 'neutral'}\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tvariant=\"badge\"\n\t\t\t\t\t\tclassName=\"shrink-0 !bg-inverse-surface-strong !text-inverse-foreground\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Stack>\n\n\t\t\t<div className=\"relative -mx-1 h-24\">\n\t\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\" initialDimension={{ width: 1, height: 1 }}>\n\t\t\t\t\t<AreaChart data={data as MetricDataPoint[]} margin={{ top: 4, right: 0, bottom: 0, left: 0 }}>\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t<linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={CHART_INVERSE} stopOpacity={0.3} />\n\t\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={CHART_INVERSE} stopOpacity={0} />\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t\t<Area\n\t\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\t\tdataKey=\"value\"\n\t\t\t\t\t\t\tstroke={CHART_INVERSE_SOFT}\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\tfill={`url(#${gradientId})`}\n\t\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\t\tactiveDot={{ r: 4, strokeWidth: 2, fill: CHART_INVERSE, stroke: CHART_INVERSE_SOFT }}\n\t\t\t\t\t\t\tisAnimationActive={!reducedMotion}\n\t\t\t\t\t\t\tanimationDuration={800}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</AreaChart>\n\t\t\t\t</ResponsiveContainer>\n\t\t\t</div>\n\t\t</Stack>\n\t\t</div>\n\t);\n}\n\nMetricGradient.displayName = 'MetricGradient';\n","/**\n * ActivityHeatmap — GitHub-style daily-activity calendar grid. Renders the\n * provided range as Monday-aligned columns with per-day intensity tinted\n * via the success palette. Month labels float above the grid; the legend\n * sits on the trailing edge.\n *\n * The layout uses absolute month labels with a 3-week minimum gap rule\n * so labels don't collide when a month starts mid-week.\n */\nimport { Stack } from '../../../base/structure';\nimport { Text } from '../../../typography';\nimport { textVariants } from '../../../typography/text.styles';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAnalyticsStrings } from '../analytics.strings';\nimport type { ActivityHeatmapDay, ActivityHeatmapProps, ActivityLevel } from './types';\nimport { rampRecipes } from '../../../../lib/tone-recipes';\n\nconst LEVEL_COLOR: Record<ActivityLevel, string> = {\n\t0: rampRecipes.activity[0],\n\t1: rampRecipes.activity[1],\n\t2: rampRecipes.activity[2],\n\t3: rampRecipes.activity[3],\n\t4: rampRecipes.activity[4],\n};\n\nconst AXIS_LABEL_CLASS = cn('text--component fill-current', textVariants({ size: 'xs', type: 'secondary', lineHeight: 'none' }));\n\ninterface BuiltCalendar {\n\tweeks: (ActivityHeatmapDay | null)[][];\n\tmonthLabels: { label: string; weekIndex: number }[];\n}\n\nfunction buildCalendar(\n\tdata: readonly ActivityHeatmapDay[],\n\tmonthNames: readonly string[],\n): BuiltCalendar {\n\tif (data.length === 0) return { weeks: [], monthLabels: [] };\n\n\tconst sorted = [...data].sort((a, b) => a.date.localeCompare(b.date));\n\tconst startDate = new Date(sorted[0].date + 'T00:00:00');\n\tconst endDate = new Date(sorted[sorted.length - 1].date + 'T00:00:00');\n\n\tconst dayOfWeek = startDate.getDay();\n\tconst mondayOffset = dayOfWeek === 0 ? -6 : 1 - dayOfWeek;\n\tconst alignedStart = new Date(startDate);\n\talignedStart.setDate(alignedStart.getDate() + mondayOffset);\n\n\tconst dateMap = new Map<string, ActivityLevel>();\n\tfor (const d of sorted) dateMap.set(d.date, d.level);\n\n\tconst weeks: (ActivityHeatmapDay | null)[][] = [];\n\tconst monthLabels: { label: string; weekIndex: number }[] = [];\n\tlet lastMonth = -1;\n\tlet currentWeek: (ActivityHeatmapDay | null)[] = [];\n\n\tconst cursor = new Date(alignedStart);\n\twhile (cursor <= endDate) {\n\t\t// The cursor advances in local calendar days; UTC serialization can shift\n\t\t// a positive-offset midnight into the previous date and misplace its level.\n\t\tconst dateStr = `${String(cursor.getFullYear()).padStart(4, '0')}-${String(cursor.getMonth() + 1).padStart(2, '0')}-${String(cursor.getDate()).padStart(2, '0')}`;\n\t\tconst dayIdx = (cursor.getDay() + 6) % 7;\n\n\t\tif (dayIdx === 0 && currentWeek.length > 0) {\n\t\t\tweeks.push(currentWeek);\n\t\t\tcurrentWeek = [];\n\t\t}\n\n\t\tconst month = cursor.getMonth();\n\t\tif (month !== lastMonth) {\n\t\t\tconst labelWeekIndex = dayIdx === 0 ? weeks.length : weeks.length + 1;\n\t\t\tconst existing = monthLabels.find((m) => m.weekIndex === labelWeekIndex);\n\t\t\tif (!existing) monthLabels.push({ label: monthNames[month], weekIndex: labelWeekIndex });\n\t\t\tlastMonth = month;\n\t\t}\n\n\t\tconst level = dateMap.get(dateStr) ?? 0;\n\t\tcurrentWeek.push({ date: dateStr, level });\n\t\tcursor.setDate(cursor.getDate() + 1);\n\t}\n\n\tif (currentWeek.length > 0) {\n\t\twhile (currentWeek.length < 7) currentWeek.push(null);\n\t\tweeks.push(currentWeek);\n\t}\n\n\treturn { weeks, monthLabels };\n}\n\nexport function ActivityHeatmap({\n\ttitle,\n\tdescription,\n\tdata,\n\tclassName,\n\tstrings: stringsProp,\n}: ActivityHeatmapProps) {\n\tconst strings = useStrings(defaultAnalyticsStrings, stringsProp);\n\tconst { weeks, monthLabels } = buildCalendar(data, strings.heatmapMonthNames);\n\n\treturn (\n\t\t<Stack\n\t\t\tgap=\"md\"\n\t\t\tdata-component=\"activity-heatmap\"\n\t\t\tdata-slot=\"activity-heatmap\"\n\t\t\tclassName={cn('activity-heatmap--component', className)}\n\t\t\taria-label={title}\n\t\t>\n\t\t\t{!!description && (\n\t\t\t\t<Text type=\"secondary\">\n\t\t\t\t\t{description}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t<div className=\"overflow-x-auto\" data-intrinsic-geometry>\n\t\t\t\t{/* Plot coordinates are intrinsic drawing geometry: 12px cells on\n\t\t\t\t\ta 15px pitch. Scaling UI gaps would detach days from their labels. */}\n\t\t\t\t<div className=\"inline-flex min-w-max flex-col gap-space-sm\">\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth={28 + weeks.length * 15}\n\t\t\t\t\t\theight={124}\n\t\t\t\t\t\tclassName=\"block overflow-visible\"\n\t\t\t\t\t\trole=\"img\"\n\t\t\t\t\t\taria-label={title}\n\t\t\t\t\t>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t{monthLabels\n\t\t\t\t\t\t\t\t.filter((m, idx, arr) => idx === 0 || m.weekIndex - arr[idx - 1].weekIndex >= 3)\n\t\t\t\t\t\t\t\t.map((m) => (\n\t\t\t\t\t\t\t\t\t<text key={`${m.label}-${m.weekIndex}`} className={AXIS_LABEL_CLASS} data-typography=\"text\" x={28 + m.weekIndex * 15} y={0} dominantBaseline=\"text-before-edge\">\n\t\t\t\t\t\t\t\t\t\t{m.label}\n\t\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t{strings.heatmapDayLabels.map((label, i) => label ? (\n\t\t\t\t\t\t\t\t<text key={`day-${i}`} className={AXIS_LABEL_CLASS} data-typography=\"text\" x={24} y={28 + i * 15} dominantBaseline=\"central\" textAnchor=\"end\">\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t) : null)}\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t{weeks.map((week, weekIdx) => (\n\t\t\t\t\t\t\t<g key={`w-${weekIdx}`}>\n\t\t\t\t\t\t\t\t{week.map((day, dayIdx) => (\n\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\tkey={`d-${weekIdx}-${dayIdx}`}\n\t\t\t\t\t\t\t\t\t\tx={28 + weekIdx * 15}\n\t\t\t\t\t\t\t\t\t\ty={22 + dayIdx * 15}\n\t\t\t\t\t\t\t\t\t\twidth={12}\n\t\t\t\t\t\t\t\t\t\theight={12}\n\t\t\t\t\t\t\t\t\t\trx={2.5}\n\t\t\t\t\t\t\t\t\t\tclassName={day ? LEVEL_COLOR[day.level] : 'fill-transparent'}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{day && <title>{`${day.date}: Level ${day.level}`}</title>}\n\t\t\t\t\t\t\t\t\t</rect>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</svg>\n\n\t\t\t\t\t<div className=\"activity-heatmap--legend flex items-center justify-end gap-space-sm\">\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.heatmapLegendLess}</Text>\n\t\t\t\t\t\t{([0, 1, 2, 3, 4] as ActivityLevel[]).map((level) => (\n\t\t\t\t\t\t\t<svg key={`legend-${level}`} width={12} height={12} aria-hidden=\"true\" className=\"shrink-0\">\n\t\t\t\t\t\t\t\t<rect width={12} height={12} rx={2.5} className={LEVEL_COLOR[level]} />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.heatmapLegendMore}</Text>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Stack>\n\t);\n}\n\nActivityHeatmap.displayName = 'ActivityHeatmap';\n","/**\n * ChartCard — standard admin chart surface for custom Recharts compositions.\n *\n * Use when a consumer wants this library's admin hierarchy around a bespoke\n * chart. Data, axes, series, and Recharts children stay caller-owned; the\n * component provides ChartContainer config, slots, and BEM hooks. It remains\n * card-free until the call site opts into `surface` and `padding`.\n */\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport {\n\tChartContainer,\n\ttype ChartConfig,\n\ttype ChartInitialDimension,\n} from '../../../base/chart';\nimport { ContentBlock } from '../../../base/display';\nimport type { CardSurface, ComponentScale } from '../../../../lib/component-vocabulary';\nimport { cn } from '../../../../lib/utils';\n\nexport type ChartCardPadding = ComponentScale;\nexport type ChartCardSurface = CardSurface;\n\nexport interface ChartCardProps {\n\t/** Surface title. */\n\ttitle?: ReactNode;\n\t/** Supporting copy shown under the label. */\n\tdescription?: ReactNode;\n\t/** Content at the end of the header, before the overflow menu. */\n\theaderEnd?: ReactNode;\n\t/** Status or count shown immediately after the title. */\n\ttitleSuffix?: ReactNode;\n\t/** Content below the body. */\n\tfooter?: ReactNode;\n\tconfig: ChartConfig;\n\tchildren: ComponentProps<typeof ChartContainer>['children'];\n\tinitialDimension?: ChartInitialDimension;\n\t/** Outer chrome. */\n\tsurface?: ChartCardSurface;\n\t/** Surface inset. */\n\tpadding?: ChartCardPadding;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Merged onto the content. */\n\tcontentClassName?: string;\n\t/** Merged onto the chart. */\n\tchartClassName?: string;\n}\n\nexport function ChartCard({\n\ttitle,\n\tdescription,\n\theaderEnd,\n\ttitleSuffix,\n\tfooter,\n\tconfig,\n\tchildren,\n\tinitialDimension,\n\tsurface,\n\tpadding,\n\tclassName,\n\tcontentClassName,\n\tchartClassName,\n}: ChartCardProps) {\n\treturn (\n\t\t<ContentBlock\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\theaderEnd={headerEnd}\n\t\t\ttitleSuffix={titleSuffix}\n\t\t\tfooterSlot={footer}\n\t\t\tsurface={surface}\n\t\t\tpadding={padding}\n\t\t\tclassName={cn('chart-card--component', className)}\n\t\t\tcontentClassName={cn('chart-card--content', contentClassName)}\n\t\t>\n\t\t\t<ChartContainer\n\t\t\t\tconfig={config}\n\t\t\t\tinitialDimension={initialDimension}\n\t\t\t\tclassName={cn('chart-card--chart min-h-[var(--chart-min-height)]', chartClassName)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</ChartContainer>\n\t\t</ContentBlock>\n\t);\n}\n\nChartCard.displayName = 'ChartCard';\n","import type { StringsProp } from '../../../../lib/strings';\n\nexport interface TimeDistributionRulerStrings {\n\t/** Density-band legend labels. */\n\tlegendNone: string;\n\tlegendLow: string;\n\tlegendMedium: string;\n\tlegendHigh: string;\n\t/** \"Now\" marker label. */\n\tlegendNow: string;\n\t/**\n\t * Renders an hour of the day (0–23) as the axis tick and as the leading\n\t * part of the per-hour tooltip. Zero-padded two-digit numerals are only\n\t * the English/Latin default — override this to reach any other numbering\n\t * system or clock convention.\n\t */\n\tformatHourLabel: (hour: number) => string;\n\t/**\n\t * Format function for the per-hour `title` tooltip. Receives the already\n\t * formatted `hourLabel` and the bucket's count. The default names no\n\t * domain; add the noun your data actually counts.\n\t */\n\tformatHourTitle: (hourLabel: string, count: number) => string;\n}\n\nexport const defaultTimeDistributionRulerStrings: TimeDistributionRulerStrings = {\n\tlegendNone: 'None',\n\tlegendLow: 'Low',\n\tlegendMedium: 'Medium',\n\tlegendHigh: 'High',\n\tlegendNow: 'Now',\n\tformatHourLabel: (hour) => String(hour).padStart(2, '0'),\n\tformatHourTitle: (hourLabel, count) => `${hourLabel}:00 - ${count}`,\n};\n\nexport interface TimeDistributionRulerProps {\n\thours: number[];\n\tcurrentHour?: number;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<TimeDistributionRulerStrings>;\n}\n","import { SecondaryValue } from '../../../primitives';\nimport { Stack } from '../../../base/structure';\nimport { Text } from '../../../typography/text';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultTimeDistributionRulerStrings, type TimeDistributionRulerProps } from './types';\nimport { rampRecipes } from '../../../../lib/tone-recipes';\n\nexport function TimeDistributionRuler({ hours, currentHour, className, strings: stringsProp }: TimeDistributionRulerProps) {\n\tconst strings = useStrings(defaultTimeDistributionRulerStrings, stringsProp);\n\tconst maxVal = Math.max(...hours, 1);\n\tconst peakHour = hours.indexOf(Math.max(...hours));\n\n\tfunction getDensityClass(count: number): string {\n\t\tif (count === 0) return rampRecipes.density[0];\n\t\tconst ratio = count / maxVal;\n\t\tif (ratio < 0.33) return rampRecipes.density[1];\n\t\tif (ratio < 0.66) return rampRecipes.density[2];\n\t\treturn rampRecipes.density[3];\n\t}\n\n\treturn (\n\t\t<Stack gap=\"sm\" className={cn('time-ruler--component', className)}>\n\t\t\t{/* Ruler bar */}\n\t\t\t<div className=\"relative flex h-8 gap-px overflow-hidden rounded-radius-md\">\n\t\t\t\t{hours.map((count, hour) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={hour}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'relative flex-1 transition-colors',\n\t\t\t\t\t\t\tgetDensityClass(count),\n\t\t\t\t\t\t\thour === peakHour && 'ring-1 ring-primary ring-inset',\n\t\t\t\t\t\t)}\n\t\t\t\t\t\ttitle={strings.formatHourTitle(strings.formatHourLabel(hour), count)}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t{/* Hour labels + now marker */}\n\t\t\t<div className=\"relative flex\">\n\t\t\t\t{hours.map((_, hour) => (\n\t\t\t\t\t<div key={hour} className=\"flex-1 text-center\">\n\t\t\t\t\t\t{hour % 4 === 0 && (\n\t\t\t\t\t\t\t<SecondaryValue size=\"xs\" className=\"tabular-nums\">\n\t\t\t\t\t\t\t\t{strings.formatHourLabel(hour)}\n\t\t\t\t\t\t\t</SecondaryValue>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t{/* Now marker */}\n\t\t\t{currentHour !== undefined && currentHour >= 0 && currentHour < 24 && (\n\t\t\t\t<div className=\"relative h-0\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute -top-[42px] flex flex-col items-center\"\n\t\t\t\t\t\tstyle={{ left: `${(currentHour / 24) * 100}%`, transform: 'translateX(-50%)' }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"h-0 w-0 border-x-[4px] border-b-[5px] border-x-transparent border-b-destructive\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{/* Legend */}\n\t\t\t<div className=\"flex items-center gap-space-lg\">\n\t\t\t\t<div className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t<div className={cn('h-2 w-3 rounded-radius-sm', rampRecipes.density[0])} />\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.legendNone}</Text>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t<div className={cn('h-2 w-3 rounded-radius-sm', rampRecipes.density[1])} />\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.legendLow}</Text>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t<div className={cn('h-2 w-3 rounded-radius-sm', rampRecipes.density[2])} />\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.legendMedium}</Text>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t<div className={cn('h-2 w-3 rounded-radius-sm', rampRecipes.density[3])} />\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.legendHigh}</Text>\n\t\t\t\t</div>\n\t\t\t\t{currentHour !== undefined && (\n\t\t\t\t\t<div className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t\t<div className=\"h-0 w-0 border-x-[3px] border-b-[4px] border-x-transparent border-b-destructive\" />\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{strings.legendNow}</Text>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</Stack>\n\t);\n}\n\nTimeDistributionRuler.displayName = 'TimeDistributionRuler';\n"],"mappings":"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"}