themelia-react-ui 2.0.0 → 2.0.1

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 (625) hide show
  1. package/CHANGELOG.md +351 -0
  2. package/README.md +26 -13
  3. package/dist/{accordion-CQXVcd7Q.js → accordion-B6a3vVgA.js} +84 -82
  4. package/dist/accordion-B6a3vVgA.js.map +1 -0
  5. package/dist/action-menu-TzCoSlwL.js +280 -0
  6. package/dist/action-menu-TzCoSlwL.js.map +1 -0
  7. package/dist/{affordance-geometry.generated-CCIXb2A1.js → affordance-geometry.generated-B5iu-Mkr.js} +3 -2
  8. package/dist/affordance-geometry.generated-B5iu-Mkr.js.map +1 -0
  9. package/dist/{ai-artifact-2PQ2fItc.js → ai-artifact-BMJdv-6q.js} +379 -376
  10. package/dist/ai-artifact-BMJdv-6q.js.map +1 -0
  11. package/dist/{app-shell-BE_j8-AT.js → app-shell-ZK5RWdo6.js} +4 -4
  12. package/dist/{app-shell-BE_j8-AT.js.map → app-shell-ZK5RWdo6.js.map} +1 -1
  13. package/dist/attachment-BtfhGm8i.js +245 -0
  14. package/dist/attachment-BtfhGm8i.js.map +1 -0
  15. package/dist/{auth-M3vGMgDR.js → auth-CYxKfo69.js} +237 -235
  16. package/dist/auth-CYxKfo69.js.map +1 -0
  17. package/dist/{avatar-djdaaQ_s.js → avatar-BBnEJIx8.js} +66 -65
  18. package/dist/avatar-BBnEJIx8.js.map +1 -0
  19. package/dist/badge-MrKVNzW9.js +93 -0
  20. package/dist/badge-MrKVNzW9.js.map +1 -0
  21. package/dist/base/accordion.js +1 -1
  22. package/dist/base/action-menu.js +1 -1
  23. package/dist/base/attachment.js +1 -1
  24. package/dist/base/avatar.js +1 -1
  25. package/dist/base/badge.js +1 -1
  26. package/dist/base/batch-action-bar.js +3 -0
  27. package/dist/base/buttons.js +2 -3
  28. package/dist/base/cards.js +2 -2
  29. package/dist/base/carousel.js +13 -13
  30. package/dist/base/carousel.js.map +1 -1
  31. package/dist/base/cascader.js +103 -115
  32. package/dist/base/cascader.js.map +1 -1
  33. package/dist/base/chart.js +1 -1
  34. package/dist/base/choice-inputs.js +3 -3
  35. package/dist/base/code-block.js +1 -1
  36. package/dist/base/combobox.js +1 -1
  37. package/dist/base/command.js +1 -1
  38. package/dist/base/copyable.js +1 -1
  39. package/dist/base/date-pickers.js +2 -2
  40. package/dist/base/display.js +7 -7
  41. package/dist/base/feedback.js +3 -3
  42. package/dist/base/forms-numeric.js +1 -1
  43. package/dist/base/forms.js +2 -2
  44. package/dist/base/inline-edit.js +17 -17
  45. package/dist/base/inline-edit.js.map +1 -1
  46. package/dist/base/item.js +1 -1
  47. package/dist/base/media-gallery.js +1 -1
  48. package/dist/base/metadata-list.js +3 -0
  49. package/dist/base/navigation.js +7 -7
  50. package/dist/base/popover-menu.js +1 -1
  51. package/dist/base/popover.js +1 -1
  52. package/dist/base/qr-code.js +1 -1
  53. package/dist/base/repeaters.js +171 -170
  54. package/dist/base/repeaters.js.map +1 -1
  55. package/dist/base/sheet.js +1 -1
  56. package/dist/base/sidebar.js +1 -1
  57. package/dist/base/signature-pad.js +147 -137
  58. package/dist/base/signature-pad.js.map +1 -1
  59. package/dist/base/skeleton.js +1 -1
  60. package/dist/base/spinner.js +1 -1
  61. package/dist/base/structure.js +1 -1
  62. package/dist/base/table.js +1 -1
  63. package/dist/base/text-inputs.js +2 -2
  64. package/dist/base/toaster.js +2 -2
  65. package/dist/base/tree.js +1 -1
  66. package/dist/base/upload-queue.js +1 -1
  67. package/dist/base/upload.js +3 -3
  68. package/dist/base/value-inputs.js +2 -2
  69. package/dist/batch-action-bar-BZGDG-Si.js +104 -0
  70. package/dist/batch-action-bar-BZGDG-Si.js.map +1 -0
  71. package/dist/blocks/admin.js +173 -171
  72. package/dist/blocks/admin.js.map +1 -1
  73. package/dist/blocks/ai.js +266 -263
  74. package/dist/blocks/ai.js.map +1 -1
  75. package/dist/blocks/analytics/usage-card.js +1 -1
  76. package/dist/blocks/analytics.js +440 -438
  77. package/dist/blocks/analytics.js.map +1 -1
  78. package/dist/blocks/collaboration.js +1 -1
  79. package/dist/blocks/commerce/receipt.js +1 -1
  80. package/dist/blocks/commerce.js +1945 -1266
  81. package/dist/blocks/commerce.js.map +1 -1
  82. package/dist/blocks/data-display.js +3 -2
  83. package/dist/blocks/onboarding.js +50 -49
  84. package/dist/blocks/onboarding.js.map +1 -1
  85. package/dist/blocks/planning.js +25 -25
  86. package/dist/blocks/planning.js.map +1 -1
  87. package/dist/blocks/timelines.js +1 -1
  88. package/dist/breadcrumbs-D5t7I023.js +129 -0
  89. package/dist/breadcrumbs-D5t7I023.js.map +1 -0
  90. package/dist/{button-R9CCoH7A.js → button-QYwiyhD2.js} +15 -14
  91. package/dist/button-QYwiyhD2.js.map +1 -0
  92. package/dist/{button-BS3KDg00.js → buttons-SbIcm1HJ.js} +200 -213
  93. package/dist/buttons-SbIcm1HJ.js.map +1 -0
  94. package/dist/{cards-QoJ4syG9.js → cards-CiiHpKYd.js} +8 -8
  95. package/dist/cards-CiiHpKYd.js.map +1 -0
  96. package/dist/{chart-DwYRKKc-.js → chart-QfrARkXl.js} +5 -5
  97. package/dist/{chart-DwYRKKc-.js.map → chart-QfrARkXl.js.map} +1 -1
  98. package/dist/checkbox-DhB6K0bK.js +36 -0
  99. package/dist/checkbox-DhB6K0bK.js.map +1 -0
  100. package/dist/choice-inputs-t6w3ATNz.js +766 -0
  101. package/dist/choice-inputs-t6w3ATNz.js.map +1 -0
  102. package/dist/code-block-Dgbu-CU3.js +185 -0
  103. package/dist/code-block-Dgbu-CU3.js.map +1 -0
  104. package/dist/{collapsible-oMUGM4tr.js → collapsible-D8AEGU1-.js} +4 -4
  105. package/dist/{collapsible-oMUGM4tr.js.map → collapsible-D8AEGU1-.js.map} +1 -1
  106. package/dist/{collection-content-Ys-OZOkY.js → collection-content-uK16Grv0.js} +3 -3
  107. package/dist/{collection-content-Ys-OZOkY.js.map → collection-content-uK16Grv0.js.map} +1 -1
  108. package/dist/{combobox-6dvVny2q.js → combobox-2Ic8N9bL.js} +74 -68
  109. package/dist/combobox-2Ic8N9bL.js.map +1 -0
  110. package/dist/{combobox-CB7039j7.js → combobox-DLl0bfiq.js} +307 -305
  111. package/dist/combobox-DLl0bfiq.js.map +1 -0
  112. package/dist/{command-kPMPjIxJ.js → command-kNR20o7x.js} +7 -7
  113. package/dist/{command-kPMPjIxJ.js.map → command-kNR20o7x.js.map} +1 -1
  114. package/dist/{comments-You0Bzbr.js → comments-BpDuCUUu.js} +341 -339
  115. package/dist/comments-BpDuCUUu.js.map +1 -0
  116. package/dist/components/base/action-menu/action-menu.d.ts +21 -4
  117. package/dist/components/base/action-menu/action-menu.recipes.d.ts +21 -0
  118. package/dist/components/base/action-menu/index.d.ts +1 -0
  119. package/dist/components/base/badge/badge.recipes.d.ts +4 -4
  120. package/dist/components/base/batch-action-bar/batch-action-bar.d.ts +50 -0
  121. package/dist/components/base/batch-action-bar/batch-action-bar.strings.d.ts +20 -0
  122. package/dist/components/base/batch-action-bar/index.d.ts +8 -0
  123. package/dist/components/base/buttons/button-group.recipes.d.ts +1 -1
  124. package/dist/components/base/buttons/button.recipes.d.ts +2 -2
  125. package/dist/components/base/choice-inputs/checkbox.d.ts +2 -2
  126. package/dist/components/base/choice-inputs/choice-types.d.ts +18 -6
  127. package/dist/components/base/display/alert-dialog.d.ts +6 -5
  128. package/dist/components/base/display/dialog.d.ts +4 -8
  129. package/dist/components/base/display/icon-badge/icon-badge.d.ts +1 -1
  130. package/dist/components/base/forms/form-sizing.d.ts +15 -12
  131. package/dist/components/base/metadata-list/index.d.ts +12 -0
  132. package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.d.ts +28 -25
  133. package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-value.d.ts +2 -2
  134. package/dist/components/base/navigation/index.d.ts +1 -1
  135. package/dist/components/base/navigation/page-header/index.d.ts +1 -0
  136. package/dist/components/base/navigation/page-header/page-header-commands.d.ts +73 -0
  137. package/dist/components/base/navigation/page-header/page-header.d.ts +26 -3
  138. package/dist/components/base/sheet/sheet.d.ts +4 -8
  139. package/dist/components/base/signature-pad/signature-pad.types.d.ts +5 -1
  140. package/dist/components/base/signature-pad/signature-pad.utils.d.ts +11 -3
  141. package/dist/components/base/text-inputs/field-clear-button.d.ts +6 -0
  142. package/dist/components/base/upload/upload.recipes.d.ts +25 -3
  143. package/dist/components/base/value-inputs/index.d.ts +5 -5
  144. package/dist/components/base/value-inputs/tags-input.d.ts +36 -12
  145. package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
  146. package/dist/components/blocks/commerce/address-card/types.d.ts +2 -1
  147. package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +3 -1
  148. package/dist/components/blocks/commerce/cart-summary/index.d.ts +2 -2
  149. package/dist/components/blocks/commerce/cart-summary/types.d.ts +6 -1
  150. package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +3 -1
  151. package/dist/components/blocks/commerce/discount-stack/index.d.ts +2 -2
  152. package/dist/components/blocks/commerce/discount-stack/types.d.ts +16 -4
  153. package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +5 -0
  154. package/dist/components/blocks/commerce/fulfillment-group/index.d.ts +2 -0
  155. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +43 -0
  156. package/dist/components/blocks/commerce/index.d.ts +13 -5
  157. package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
  158. package/dist/components/blocks/commerce/invoice-header/types.d.ts +4 -2
  159. package/dist/components/blocks/commerce/invoice-mini/invoice-mini.d.ts +1 -1
  160. package/dist/components/blocks/commerce/invoice-mini/types.d.ts +2 -1
  161. package/dist/components/blocks/commerce/order-customer/index.d.ts +2 -0
  162. package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +5 -0
  163. package/dist/components/blocks/commerce/order-customer/types.d.ts +48 -0
  164. package/dist/components/blocks/commerce/order-header/index.d.ts +2 -0
  165. package/dist/components/blocks/commerce/order-header/order-header.d.ts +5 -0
  166. package/dist/components/blocks/commerce/order-header/types.d.ts +37 -0
  167. package/dist/components/blocks/commerce/order-line-item/index.d.ts +2 -0
  168. package/dist/components/blocks/commerce/order-line-item/order-line-item.d.ts +5 -0
  169. package/dist/components/blocks/commerce/order-line-item/types.d.ts +46 -0
  170. package/dist/components/blocks/commerce/order-summary/index.d.ts +2 -0
  171. package/dist/components/blocks/commerce/order-summary/order-summary.d.ts +5 -0
  172. package/dist/components/blocks/commerce/order-summary/types.d.ts +42 -0
  173. package/dist/components/blocks/commerce/order-transactions/index.d.ts +2 -0
  174. package/dist/components/blocks/commerce/order-transactions/order-transactions.d.ts +5 -0
  175. package/dist/components/blocks/commerce/order-transactions/types.d.ts +46 -0
  176. package/dist/components/blocks/commerce/payment-method/index.d.ts +2 -2
  177. package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +9 -1
  178. package/dist/components/blocks/commerce/payment-method/types.d.ts +12 -1
  179. package/dist/components/blocks/commerce/refund-status/index.d.ts +2 -2
  180. package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +3 -1
  181. package/dist/components/blocks/commerce/refund-status/types.d.ts +6 -3
  182. package/dist/components/blocks/commerce/shared/address-lines.d.ts +21 -0
  183. package/dist/components/blocks/commerce/shared/line-thumbnail.d.ts +9 -0
  184. package/dist/components/blocks/commerce/shared/order-status.d.ts +51 -0
  185. package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
  186. package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +27 -6
  187. package/dist/components/blocks/commerce/summary-panel/amount-row.d.ts +2 -0
  188. package/dist/components/blocks/commerce/summary-panel/index.d.ts +3 -0
  189. package/dist/components/blocks/commerce/summary-panel/summary-panel.d.ts +2 -0
  190. package/dist/components/blocks/commerce/summary-panel/types.d.ts +26 -0
  191. package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
  192. package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +2 -1
  193. package/dist/components/blocks/data-display/metadata/index.d.ts +30 -4
  194. package/dist/components/features/activities/partials/activity-row.d.ts +6 -2
  195. package/dist/components/features/activities/partials/tone-tokens.d.ts +0 -6
  196. package/dist/components/features/global-search/partials/global-search-group-heading.d.ts +15 -0
  197. package/dist/components/features/global-search/partials/tone-palettes.d.ts +0 -5
  198. package/dist/components/features/kanban/kanban.d.ts +1 -1
  199. package/dist/components/features/kanban/kanban.strings.d.ts +1 -1
  200. package/dist/components/features/kanban/kanban.types.d.ts +2 -2
  201. package/dist/components/features/media-library/hooks/use-media-library.d.ts +1 -1
  202. package/dist/components/features/media-library/index.d.ts +1 -1
  203. package/dist/components/features/media-library/media-library.d.ts +1 -1
  204. package/dist/components/features/media-library/media-library.strings.d.ts +4 -0
  205. package/dist/components/features/media-library/media-library.types.d.ts +74 -1
  206. package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
  207. package/dist/components/features/mentions/partials/mention-kind-toggles.d.ts +16 -0
  208. package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
  209. package/dist/components/features/overlays/dialog.d.ts +1 -1
  210. package/dist/components/features/overlays/index.d.ts +1 -1
  211. package/dist/components/features/overlays/overlay-tone-icon.d.ts +3 -3
  212. package/dist/components/features/overlays/overlays.types.d.ts +20 -0
  213. package/dist/components/features/products/components/product-contract-overview.d.ts +5 -0
  214. package/dist/components/features/products/components/product-details-card.d.ts +5 -0
  215. package/dist/components/features/products/components/product-operations-card.d.ts +5 -0
  216. package/dist/components/features/products/components/product-option-action-menu.d.ts +5 -0
  217. package/dist/components/features/products/components/product-options-summary.d.ts +5 -0
  218. package/dist/components/features/products/components/product-policies-card.d.ts +5 -0
  219. package/dist/components/features/products/components/product-quote-preview-card.d.ts +5 -0
  220. package/dist/components/features/products/components/product-readiness-card.d.ts +5 -0
  221. package/dist/components/features/products/components/product-structure-card.d.ts +5 -0
  222. package/dist/components/features/products/components/product-variant-action-menu.d.ts +23 -1
  223. package/dist/components/features/products/products.types.d.ts +9 -2
  224. package/dist/components/features/resource/index.d.ts +1 -1
  225. package/dist/components/features/resource/resource.d.ts +1 -1
  226. package/dist/components/features/resource/resource.types.d.ts +34 -6
  227. package/dist/components/features/rich-text-editor/index.d.ts +2 -1
  228. package/dist/components/features/rich-text-editor/partials/image-nodes.d.ts +13 -0
  229. package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +66 -0
  230. package/dist/components/features/rich-text-editor/partials/inline-reference-node.d.ts +19 -0
  231. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
  232. package/dist/components/features/rich-text-editor/rich-text-editor.strings.d.ts +14 -0
  233. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +45 -0
  234. package/dist/components/features/rich-text-editor/use-rich-text-images.d.ts +18 -0
  235. package/dist/components/features/sync/index.d.ts +26 -3
  236. package/dist/components/features/table/data-table.d.ts +1 -1
  237. package/dist/components/features/table/table.types.d.ts +32 -7
  238. package/dist/components/layout/page/index.d.ts +1 -1
  239. package/dist/components/layout/page/page.types.d.ts +33 -36
  240. package/dist/components/layout/page/partials/page-actions.d.ts +1 -0
  241. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  242. package/dist/components/layout/settings/settings.d.ts +16 -2
  243. package/dist/components/layout/workspace/workspace.types.d.ts +21 -4
  244. package/dist/components/typography/rich-text/index.d.ts +1 -1
  245. package/dist/components/typography/rich-text/rich-text-tree.d.ts +19 -0
  246. package/dist/components/typography/rich-text/rich-text.d.ts +16 -0
  247. package/dist/components/typography/text-link.d.ts +4 -3
  248. package/dist/components/ui/checkbox.d.ts +4 -3
  249. package/dist/components/ui/overlay.recipes.d.ts +0 -9
  250. package/dist/components/ui/switch.d.ts +2 -2
  251. package/dist/{containers-D_L4mTVb.js → containers-DmWiJa2I.js} +36 -35
  252. package/dist/containers-DmWiJa2I.js.map +1 -0
  253. package/dist/{copyable-DDjTeW_j.js → copyable-B3Gwgdqc.js} +6 -6
  254. package/dist/{copyable-DDjTeW_j.js.map → copyable-B3Gwgdqc.js.map} +1 -1
  255. package/dist/data-display-DafIvCl5.js +960 -0
  256. package/dist/data-display-DafIvCl5.js.map +1 -0
  257. package/dist/{date-uf3z37Nm.js → date-BgK3bTdo.js} +5 -5
  258. package/dist/{date-uf3z37Nm.js.map → date-BgK3bTdo.js.map} +1 -1
  259. package/dist/date-picker-CF-DtUpF.js +1529 -0
  260. package/dist/date-picker-CF-DtUpF.js.map +1 -0
  261. package/dist/{date-pickers-CnFCb0n2.js → date-pickers-BmzxJl5l.js} +19 -19
  262. package/dist/{date-pickers-CnFCb0n2.js.map → date-pickers-BmzxJl5l.js.map} +1 -1
  263. package/dist/{display-DrdvPwF0.js → display-DsQTVzMz.js} +88 -87
  264. package/dist/display-DsQTVzMz.js.map +1 -0
  265. package/dist/{dropdown-menu-CURh59jb.js → dropdown-menu-E2qmdC7o.js} +7 -7
  266. package/dist/{dropdown-menu-CURh59jb.js.map → dropdown-menu-E2qmdC7o.js.map} +1 -1
  267. package/dist/features/activities.js +414 -501
  268. package/dist/features/activities.js.map +1 -1
  269. package/dist/features/ai-chat.js +170 -169
  270. package/dist/features/ai-chat.js.map +1 -1
  271. package/dist/features/async-preview.js +8 -8
  272. package/dist/features/async-preview.js.map +1 -1
  273. package/dist/features/combobox.js +1 -1
  274. package/dist/features/comments.js +1 -1
  275. package/dist/features/data-view.js +139 -138
  276. package/dist/features/data-view.js.map +1 -1
  277. package/dist/features/email-composer/engine.js +1 -1
  278. package/dist/features/email-composer.js +73 -71
  279. package/dist/features/email-composer.js.map +1 -1
  280. package/dist/features/event-calendar.js +278 -275
  281. package/dist/features/event-calendar.js.map +1 -1
  282. package/dist/features/filters.js +1 -1
  283. package/dist/features/global-search.js +307 -310
  284. package/dist/features/global-search.js.map +1 -1
  285. package/dist/features/kanban.js +95 -97
  286. package/dist/features/kanban.js.map +1 -1
  287. package/dist/features/map.js +56 -57
  288. package/dist/features/map.js.map +1 -1
  289. package/dist/features/media-library.js +918 -825
  290. package/dist/features/media-library.js.map +1 -1
  291. package/dist/features/mentions.js +1 -1
  292. package/dist/features/overlays.js +1 -1
  293. package/dist/features/products.js +1115 -1122
  294. package/dist/features/products.js.map +1 -1
  295. package/dist/features/questionnaire.js +202 -194
  296. package/dist/features/questionnaire.js.map +1 -1
  297. package/dist/features/resource-assignment.js +25 -25
  298. package/dist/features/resource-assignment.js.map +1 -1
  299. package/dist/features/resource.js +77 -69
  300. package/dist/features/resource.js.map +1 -1
  301. package/dist/features/rich-text-editor.js +30 -11
  302. package/dist/features/rich-text-editor.js.map +1 -1
  303. package/dist/features/schema-form.js +33 -33
  304. package/dist/features/schema-form.js.map +1 -1
  305. package/dist/features/suggestions.js +3 -3
  306. package/dist/features/sync.js +3 -3
  307. package/dist/features/table.js +1 -1
  308. package/dist/features/theme-tweaker.js +397 -396
  309. package/dist/features/theme-tweaker.js.map +1 -1
  310. package/dist/{feedback-C7nR0UtT.js → feedback-qNuMBtRH.js} +84 -83
  311. package/dist/feedback-qNuMBtRH.js.map +1 -0
  312. package/dist/{field-affordance-recipes-CkOCdE2y.js → field-affordance-recipes-qQeIf4lG.js} +8 -6
  313. package/dist/field-affordance-recipes-qQeIf4lG.js.map +1 -0
  314. package/dist/field-state-recipes-BVA2CWHo.js +12 -0
  315. package/dist/field-state-recipes-BVA2CWHo.js.map +1 -0
  316. package/dist/{filters-Da-gNPsE.js → filters-BkHH53uv.js} +565 -563
  317. package/dist/filters-BkHH53uv.js.map +1 -0
  318. package/dist/focus-recipes-B653VaLq.js +12 -0
  319. package/dist/focus-recipes-B653VaLq.js.map +1 -0
  320. package/dist/{form-field-VZRULhUK.js → form-field-DUt4UxSV.js} +4 -4
  321. package/dist/{form-field-VZRULhUK.js.map → form-field-DUt4UxSV.js.map} +1 -1
  322. package/dist/{form-sizing-uWP4lzVh.js → form-sizing-By94KzXE.js} +19 -15
  323. package/dist/form-sizing-By94KzXE.js.map +1 -0
  324. package/dist/{forms-DDeEnXSY.js → forms-Bzha-Y3B.js} +22 -22
  325. package/dist/{forms-DDeEnXSY.js.map → forms-Bzha-Y3B.js.map} +1 -1
  326. package/dist/{forms-numeric-D3CO60IF.js → forms-numeric-C0bvjRPZ.js} +265 -264
  327. package/dist/forms-numeric-C0bvjRPZ.js.map +1 -0
  328. package/dist/{header-2ycNqGOR.js → header-BOefOKd1.js} +47 -51
  329. package/dist/header-BOefOKd1.js.map +1 -0
  330. package/dist/{hooks-DQ5SPwZw.js → hooks-9k_TtmKh.js} +2 -2
  331. package/dist/{hooks-DQ5SPwZw.js.map → hooks-9k_TtmKh.js.map} +1 -1
  332. package/dist/{http-CdEIHyQf.js → http-D_6rOnzU.js} +2 -2
  333. package/dist/{http-CdEIHyQf.js.map → http-D_6rOnzU.js.map} +1 -1
  334. package/dist/icon-badge-CAuKupo9.js +55 -0
  335. package/dist/icon-badge-CAuKupo9.js.map +1 -0
  336. package/dist/index.js +7 -7
  337. package/dist/input-DWhBBBww.js +262 -0
  338. package/dist/input-DWhBBBww.js.map +1 -0
  339. package/dist/{input-BoLm9Hks.js → input-Ddi_LSYv.js} +3 -3
  340. package/dist/{input-BoLm9Hks.js.map → input-Ddi_LSYv.js.map} +1 -1
  341. package/dist/interaction-recipes-CHr0dJUs.js +24 -0
  342. package/dist/interaction-recipes-CHr0dJUs.js.map +1 -0
  343. package/dist/{item-xzh8Df65.js → item-DEmDiTlD.js} +98 -97
  344. package/dist/item-DEmDiTlD.js.map +1 -0
  345. package/dist/layer-recipes-CCpklYME.js +13 -0
  346. package/dist/layer-recipes-CCpklYME.js.map +1 -0
  347. package/dist/layout/app-shell.js +1 -1
  348. package/dist/layout/auth.js +1 -1
  349. package/dist/layout/containers.js +1 -1
  350. package/dist/layout/header.js +1 -1
  351. package/dist/layout/hooks.js +1 -1
  352. package/dist/layout/navigation.js +1 -1
  353. package/dist/layout/page.js +1 -1
  354. package/dist/layout/settings.js +1 -1
  355. package/dist/layout/sidebar.js +2 -2
  356. package/dist/layout/workspace.js +1 -1
  357. package/dist/layout.js +10 -10
  358. package/dist/lib/affordance-geometry.generated.d.ts +1 -0
  359. package/dist/lib/field-affordance-recipes.d.ts +6 -1
  360. package/dist/lib/field-state-recipes.d.ts +9 -8
  361. package/dist/lib/focus-recipes.d.ts +24 -0
  362. package/dist/lib/interaction-recipes.d.ts +35 -0
  363. package/dist/lib/layer-recipes.d.ts +19 -0
  364. package/dist/lib/motion-recipes.d.ts +1 -0
  365. package/dist/lib/overlay-anatomy-recipes.d.ts +1 -0
  366. package/dist/lib/safe-image-src.d.ts +10 -0
  367. package/dist/lib/sanitize-html.d.ts +15 -3
  368. package/dist/lib/surface-recipes.d.ts +47 -7
  369. package/dist/lib/token-merge.generated.d.ts +9 -6
  370. package/dist/lib/tone-recipes.d.ts +79 -0
  371. package/dist/lib/ui-provider/hooks.d.ts +2 -1
  372. package/dist/lib/ui-provider/index.d.ts +2 -2
  373. package/dist/lib/ui-provider/types.d.ts +9 -0
  374. package/dist/lib/utils.js +1 -1
  375. package/dist/media-gallery-DcTtAaeC.js +203 -0
  376. package/dist/media-gallery-DcTtAaeC.js.map +1 -0
  377. package/dist/mentions-D-uyCh01.js +568 -0
  378. package/dist/mentions-D-uyCh01.js.map +1 -0
  379. package/dist/{message-YfFmbXNP.js → message-CdHgIWKf.js} +5 -5
  380. package/dist/{message-YfFmbXNP.js.map → message-CdHgIWKf.js.map} +1 -1
  381. package/dist/metadata-list-X5rYAKSB.js +394 -0
  382. package/dist/metadata-list-X5rYAKSB.js.map +1 -0
  383. package/dist/{motion-recipes-B6jKXEcN.js → motion-recipes-ChBg4HBq.js} +3 -2
  384. package/dist/{motion-recipes-B6jKXEcN.js.map → motion-recipes-ChBg4HBq.js.map} +1 -1
  385. package/dist/navigation-D3KwXmaq.js +145 -0
  386. package/dist/navigation-D3KwXmaq.js.map +1 -0
  387. package/dist/navigation-HJf5zxlH.js +268 -0
  388. package/dist/navigation-HJf5zxlH.js.map +1 -0
  389. package/dist/{navigation-row-recipes-DlU-4QYO.js → navigation-row-recipes-BVowojQw.js} +2 -2
  390. package/dist/{navigation-row-recipes-DlU-4QYO.js.map → navigation-row-recipes-BVowojQw.js.map} +1 -1
  391. package/dist/{number-CKRBYmZK.js → number-DMhe-Vsk.js} +5 -5
  392. package/dist/{number-CKRBYmZK.js.map → number-DMhe-Vsk.js.map} +1 -1
  393. package/dist/overflow-tab-bar-sQHXLlwQ.js +280 -0
  394. package/dist/overflow-tab-bar-sQHXLlwQ.js.map +1 -0
  395. package/dist/overlay.recipes-8GHqmlb4.js +6 -0
  396. package/dist/overlay.recipes-8GHqmlb4.js.map +1 -0
  397. package/dist/overlays-I0axtYA6.js +999 -0
  398. package/dist/overlays-I0axtYA6.js.map +1 -0
  399. package/dist/page-B5dTH9gE.js +224 -0
  400. package/dist/page-B5dTH9gE.js.map +1 -0
  401. package/dist/page-header-commands-DjzFEq3E.js +126 -0
  402. package/dist/page-header-commands-DjzFEq3E.js.map +1 -0
  403. package/dist/{pagination-Cm0jqa3I.js → pagination-3bPA_a6K.js} +15 -15
  404. package/dist/{pagination-Cm0jqa3I.js.map → pagination-3bPA_a6K.js.map} +1 -1
  405. package/dist/{popover-Dcv_9jxr.js → popover-Di55PyAI.js} +8 -8
  406. package/dist/popover-Di55PyAI.js.map +1 -0
  407. package/dist/{popover-menu-DnRFKnHP.js → popover-menu-B71Tn2Qz.js} +6 -6
  408. package/dist/{popover-menu-DnRFKnHP.js.map → popover-menu-B71Tn2Qz.js.map} +1 -1
  409. package/dist/{popover.recipes-wmbvL8Ah.js → popover.recipes-Bdyhj2db.js} +2 -2
  410. package/dist/{popover.recipes-wmbvL8Ah.js.map → popover.recipes-Bdyhj2db.js.map} +1 -1
  411. package/dist/{primitives-BHrwQXFC.js → primitives-B-CkiEMU.js} +5 -5
  412. package/dist/{primitives-BHrwQXFC.js.map → primitives-B-CkiEMU.js.map} +1 -1
  413. package/dist/primitives.js +4 -4
  414. package/dist/{progress-Br9WTFya.js → progress-rnS8-uAW.js} +9 -9
  415. package/dist/{progress-Br9WTFya.js.map → progress-rnS8-uAW.js.map} +1 -1
  416. package/dist/{receipt-CV89q1fs.js → receipt-D0oswZ0p.js} +6 -6
  417. package/dist/{receipt-CV89q1fs.js.map → receipt-D0oswZ0p.js.map} +1 -1
  418. package/dist/rich-text-DvGulsNJ.js +78 -0
  419. package/dist/rich-text-DvGulsNJ.js.map +1 -0
  420. package/dist/rich-text-editor-sMU_Scqm.js +1204 -0
  421. package/dist/rich-text-editor-sMU_Scqm.js.map +1 -0
  422. package/dist/rich-text-editor.recipes-CadiF_Uu.js +88 -0
  423. package/dist/rich-text-editor.recipes-CadiF_Uu.js.map +1 -0
  424. package/dist/rich-text-editor.strings-CB59ekH2.js +38 -0
  425. package/dist/rich-text-editor.strings-CB59ekH2.js.map +1 -0
  426. package/dist/safe-image-src-C6kQSMBZ.js +17 -0
  427. package/dist/safe-image-src-C6kQSMBZ.js.map +1 -0
  428. package/dist/sanitize-html-DsQmI48u.js +92 -0
  429. package/dist/sanitize-html-DsQmI48u.js.map +1 -0
  430. package/dist/scroll-area-Bt_vXY2b.js +48 -0
  431. package/dist/scroll-area-Bt_vXY2b.js.map +1 -0
  432. package/dist/{separator-Do5GWDYi.js → separator-C8DlRGwF.js} +3 -3
  433. package/dist/{separator-Do5GWDYi.js.map → separator-C8DlRGwF.js.map} +1 -1
  434. package/dist/{separator-BMEvwnSX.js → separator-CYHnjsAb.js} +2 -2
  435. package/dist/{separator-BMEvwnSX.js.map → separator-CYHnjsAb.js.map} +1 -1
  436. package/dist/services/actions/action-adapters.d.ts +18 -0
  437. package/dist/services/actions/index.d.ts +1 -1
  438. package/dist/services/actions.js +16 -4
  439. package/dist/services/actions.js.map +1 -1
  440. package/dist/settings-CQW3b-Cu.js +170 -0
  441. package/dist/settings-CQW3b-Cu.js.map +1 -0
  442. package/dist/sheet-4SEvVYzA.js +210 -0
  443. package/dist/sheet-4SEvVYzA.js.map +1 -0
  444. package/dist/{sidebar-Crc9M9JV.js → sidebar-C7WWR29L.js} +180 -179
  445. package/dist/sidebar-C7WWR29L.js.map +1 -0
  446. package/dist/{sidebar-Cb8WzOvE.js → sidebar-d7Dg80ln.js} +16 -16
  447. package/dist/sidebar-d7Dg80ln.js.map +1 -0
  448. package/dist/{skeleton-DVMXr15h.js → skeleton-Cz890JZF.js} +9 -9
  449. package/dist/{skeleton-DVMXr15h.js.map → skeleton-Cz890JZF.js.map} +1 -1
  450. package/dist/smart-card-lFKxn5Hu.js +595 -0
  451. package/dist/smart-card-lFKxn5Hu.js.map +1 -0
  452. package/dist/{spinner-CmTAbEp0.js → spinner-fa3h1Aif.js} +7 -7
  453. package/dist/{spinner-CmTAbEp0.js.map → spinner-fa3h1Aif.js.map} +1 -1
  454. package/dist/{structure-hzCW-XsV.js → structure-DC2dygdA.js} +2 -2
  455. package/dist/{structure-hzCW-XsV.js.map → structure-DC2dygdA.js.map} +1 -1
  456. package/dist/style.css +1 -1
  457. package/dist/surface-recipes-BKRVW8Os.js +43 -0
  458. package/dist/surface-recipes-BKRVW8Os.js.map +1 -0
  459. package/dist/{table-D6zKeYQX.js → table-CIKyLUsy.js} +59 -58
  460. package/dist/table-CIKyLUsy.js.map +1 -0
  461. package/dist/table-CrcLN9Io.js +1458 -0
  462. package/dist/table-CrcLN9Io.js.map +1 -0
  463. package/dist/{tabs-Dk8E_knt.js → tabs-DwBJfjxX.js} +58 -57
  464. package/dist/tabs-DwBJfjxX.js.map +1 -0
  465. package/dist/{text-inputs-BFpku0Qd.js → text-inputs-aaK9wcDT.js} +74 -79
  466. package/dist/text-inputs-aaK9wcDT.js.map +1 -0
  467. package/dist/theme.css +3 -3
  468. package/dist/{timelines-CxuAFIc2.js → timelines-C_SBwHNP.js} +153 -150
  469. package/dist/timelines-C_SBwHNP.js.map +1 -0
  470. package/dist/tone-recipes-CPoExcTE.js +70 -0
  471. package/dist/tone-recipes-CPoExcTE.js.map +1 -0
  472. package/dist/tooltip-CsfgrfS7.js +111 -0
  473. package/dist/tooltip-CsfgrfS7.js.map +1 -0
  474. package/dist/{tree-BotPlyiD.js → tree-BiKhg8AY.js} +68 -66
  475. package/dist/tree-BiKhg8AY.js.map +1 -0
  476. package/dist/typography/rich-text.js +1 -1
  477. package/dist/typography-DTRkE9zL.js +117 -0
  478. package/dist/typography-DTRkE9zL.js.map +1 -0
  479. package/dist/typography.js +1 -1
  480. package/dist/{ui-provider-D2_TeLqw.js → ui-provider-1D_NSYzO.js} +11 -3
  481. package/dist/ui-provider-1D_NSYzO.js.map +1 -0
  482. package/dist/ui-provider.js +3 -3
  483. package/dist/{upload-B0WHW7ak.js → upload-BO8-CLN6.js} +209 -209
  484. package/dist/upload-BO8-CLN6.js.map +1 -0
  485. package/dist/{upload-queue-BHZ_wBfd.js → upload-queue-EOC8g1gf.js} +109 -111
  486. package/dist/upload-queue-EOC8g1gf.js.map +1 -0
  487. package/dist/upload.recipes-BbxTqrCT.js +61 -0
  488. package/dist/upload.recipes-BbxTqrCT.js.map +1 -0
  489. package/dist/{usage-card-U0YBLTNT.js → usage-card-obRaBskq.js} +46 -46
  490. package/dist/{usage-card-U0YBLTNT.js.map → usage-card-obRaBskq.js.map} +1 -1
  491. package/dist/{utils-Cospvlj1.js → utils-l5LpDw2z.js} +56 -24
  492. package/dist/utils-l5LpDw2z.js.map +1 -0
  493. package/dist/value-inputs-TAYMX111.js +947 -0
  494. package/dist/value-inputs-TAYMX111.js.map +1 -0
  495. package/dist/{value-typography-Deb3yQZg.js → value-typography-b8wpz1eX.js} +2 -2
  496. package/dist/{value-typography-Deb3yQZg.js.map → value-typography-b8wpz1eX.js.map} +1 -1
  497. package/dist/workspace-DH0v0KcB.js +407 -0
  498. package/dist/workspace-DH0v0KcB.js.map +1 -0
  499. package/docs/consumer-skill/SKILL.md +19 -20
  500. package/docs/consumer-skill/examples/app-layout.tsx +1 -1
  501. package/docs/consumer-skill/examples/composition.tsx +3 -3
  502. package/docs/consumer-skill/examples/detail.tsx +59 -12
  503. package/docs/consumer-skill/examples/edit.tsx +1 -1
  504. package/docs/consumer-skill/examples/receipt.tsx +2 -2
  505. package/docs/consumer-skill/examples/scoped-directory.tsx +1 -1
  506. package/docs/consumer-skill/examples/website.tsx +1 -1
  507. package/docs/consumer-skill/references/agents-md.md +33 -0
  508. package/docs/consumer-skill/references/analytics.md +1 -1
  509. package/docs/consumer-skill/references/composition.md +51 -8
  510. package/docs/consumer-skill/references/design-contract.md +12 -3
  511. package/docs/consumer-skill/references/installation.md +11 -1
  512. package/docs/consumer-skill/references/public-api.json +847 -447
  513. package/docs/consumer-skill/references/review.md +25 -5
  514. package/docs/consumer-skill/references/theming.md +8 -4
  515. package/docs/consumer-skill/references/tokens.json +1 -1
  516. package/docs/consumer-skill/references/workflows.md +29 -10
  517. package/docs/consumer-skill/scripts/composition-policy.mjs +41 -11
  518. package/docs/consumer-skill/scripts/surface-policy.mjs +139 -5
  519. package/package.json +10 -2
  520. package/dist/accordion-CQXVcd7Q.js.map +0 -1
  521. package/dist/action-menu-BTpyPWJ2.js +0 -264
  522. package/dist/action-menu-BTpyPWJ2.js.map +0 -1
  523. package/dist/affordance-geometry.generated-CCIXb2A1.js.map +0 -1
  524. package/dist/ai-artifact-2PQ2fItc.js.map +0 -1
  525. package/dist/attachment-q69dlt5Y.js +0 -244
  526. package/dist/attachment-q69dlt5Y.js.map +0 -1
  527. package/dist/auth-M3vGMgDR.js.map +0 -1
  528. package/dist/avatar-djdaaQ_s.js.map +0 -1
  529. package/dist/badge-0tATj-tW.js +0 -92
  530. package/dist/badge-0tATj-tW.js.map +0 -1
  531. package/dist/breadcrumbs-BG_FfMK4.js +0 -128
  532. package/dist/breadcrumbs-BG_FfMK4.js.map +0 -1
  533. package/dist/button-BS3KDg00.js.map +0 -1
  534. package/dist/button-R9CCoH7A.js.map +0 -1
  535. package/dist/buttons-DS0ZIwJ_.js +0 -99
  536. package/dist/buttons-DS0ZIwJ_.js.map +0 -1
  537. package/dist/cards-QoJ4syG9.js.map +0 -1
  538. package/dist/checkbox-B7ygNTYp.js +0 -35
  539. package/dist/checkbox-B7ygNTYp.js.map +0 -1
  540. package/dist/choice-inputs-DrJ17tpL.js +0 -752
  541. package/dist/choice-inputs-DrJ17tpL.js.map +0 -1
  542. package/dist/code-block-CD0B7M93.js +0 -183
  543. package/dist/code-block-CD0B7M93.js.map +0 -1
  544. package/dist/combobox-6dvVny2q.js.map +0 -1
  545. package/dist/combobox-CB7039j7.js.map +0 -1
  546. package/dist/comments-You0Bzbr.js.map +0 -1
  547. package/dist/components/layout/page/partials/page-header-commands.d.ts +0 -13
  548. package/dist/containers-D_L4mTVb.js.map +0 -1
  549. package/dist/data-display-3xWQUnMA.js +0 -1335
  550. package/dist/data-display-3xWQUnMA.js.map +0 -1
  551. package/dist/date-picker-DrDFj8Lo.js +0 -1527
  552. package/dist/date-picker-DrDFj8Lo.js.map +0 -1
  553. package/dist/display-DrdvPwF0.js.map +0 -1
  554. package/dist/feedback-C7nR0UtT.js.map +0 -1
  555. package/dist/field-affordance-recipes-CkOCdE2y.js.map +0 -1
  556. package/dist/field-state-recipes-C-MFBX_8.js +0 -11
  557. package/dist/field-state-recipes-C-MFBX_8.js.map +0 -1
  558. package/dist/filters-Da-gNPsE.js.map +0 -1
  559. package/dist/form-sizing-uWP4lzVh.js.map +0 -1
  560. package/dist/forms-numeric-D3CO60IF.js.map +0 -1
  561. package/dist/header-2ycNqGOR.js.map +0 -1
  562. package/dist/icon-badge-DKlaKXoo.js +0 -53
  563. package/dist/icon-badge-DKlaKXoo.js.map +0 -1
  564. package/dist/input-DhQdBnV3.js +0 -255
  565. package/dist/input-DhQdBnV3.js.map +0 -1
  566. package/dist/item-xzh8Df65.js.map +0 -1
  567. package/dist/media-gallery-DQUQ0m3O.js +0 -201
  568. package/dist/media-gallery-DQUQ0m3O.js.map +0 -1
  569. package/dist/mentions-DwnO1hh4.js +0 -564
  570. package/dist/mentions-DwnO1hh4.js.map +0 -1
  571. package/dist/navigation-Cbp5V8gG.js +0 -264
  572. package/dist/navigation-Cbp5V8gG.js.map +0 -1
  573. package/dist/navigation-Cs1npsPm.js +0 -300
  574. package/dist/navigation-Cs1npsPm.js.map +0 -1
  575. package/dist/overlay.recipes-CNO2S9V6.js +0 -34
  576. package/dist/overlay.recipes-CNO2S9V6.js.map +0 -1
  577. package/dist/overlays-DhZO7N-I.js +0 -994
  578. package/dist/overlays-DhZO7N-I.js.map +0 -1
  579. package/dist/page-C6R_8jFt.js +0 -325
  580. package/dist/page-C6R_8jFt.js.map +0 -1
  581. package/dist/page-header-hUTzcRZX.js +0 -112
  582. package/dist/page-header-hUTzcRZX.js.map +0 -1
  583. package/dist/popover-Dcv_9jxr.js.map +0 -1
  584. package/dist/rich-text-editor-CF8QYt5p.js +0 -574
  585. package/dist/rich-text-editor-CF8QYt5p.js.map +0 -1
  586. package/dist/rich-text-editor.recipes-CnrbmTS1.js +0 -81
  587. package/dist/rich-text-editor.recipes-CnrbmTS1.js.map +0 -1
  588. package/dist/rich-text-editor.strings-BpnIQgMl.js +0 -25
  589. package/dist/rich-text-editor.strings-BpnIQgMl.js.map +0 -1
  590. package/dist/rich-text-j-FGAeZW.js +0 -32
  591. package/dist/rich-text-j-FGAeZW.js.map +0 -1
  592. package/dist/sanitize-html-BG9FGe-j.js +0 -64
  593. package/dist/sanitize-html-BG9FGe-j.js.map +0 -1
  594. package/dist/scroll-area-DRdr16Pt.js +0 -47
  595. package/dist/scroll-area-DRdr16Pt.js.map +0 -1
  596. package/dist/settings-DHk0L2MF.js +0 -161
  597. package/dist/settings-DHk0L2MF.js.map +0 -1
  598. package/dist/sheet-DRFNY1_D.js +0 -207
  599. package/dist/sheet-DRFNY1_D.js.map +0 -1
  600. package/dist/sidebar-Cb8WzOvE.js.map +0 -1
  601. package/dist/sidebar-Crc9M9JV.js.map +0 -1
  602. package/dist/smart-card-Bek-TwUp.js +0 -599
  603. package/dist/smart-card-Bek-TwUp.js.map +0 -1
  604. package/dist/surface-recipes-DOdoBXGm.js +0 -28
  605. package/dist/surface-recipes-DOdoBXGm.js.map +0 -1
  606. package/dist/table-D6zKeYQX.js.map +0 -1
  607. package/dist/table-Dn4XSrSB.js +0 -1444
  608. package/dist/table-Dn4XSrSB.js.map +0 -1
  609. package/dist/tabs-Dk8E_knt.js.map +0 -1
  610. package/dist/text-inputs-BFpku0Qd.js.map +0 -1
  611. package/dist/timelines-CxuAFIc2.js.map +0 -1
  612. package/dist/tree-BotPlyiD.js.map +0 -1
  613. package/dist/typography-CAr3dQhX.js +0 -116
  614. package/dist/typography-CAr3dQhX.js.map +0 -1
  615. package/dist/ui-provider-D2_TeLqw.js.map +0 -1
  616. package/dist/upload-B0WHW7ak.js.map +0 -1
  617. package/dist/upload-queue-BHZ_wBfd.js.map +0 -1
  618. package/dist/use-file-drop-target-BX7GnhoQ.js +0 -39
  619. package/dist/use-file-drop-target-BX7GnhoQ.js.map +0 -1
  620. package/dist/utils-Cospvlj1.js.map +0 -1
  621. package/dist/value-inputs-CjfzGMsN.js +0 -854
  622. package/dist/value-inputs-CjfzGMsN.js.map +0 -1
  623. package/dist/workspace-YoFjXi6i.js +0 -394
  624. package/dist/workspace-YoFjXi6i.js.map +0 -1
  625. /package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.strings.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.js","names":["_jsxs","_Fragment","useFormattingConfig","useMoneyConfig","cn","DisplayLabel","Heading","Text","textVariants","Button","Grid","Stack","Card","Skeleton","formatPercentage","formatNumber","formatDuration","Value","SecondaryValue","formatMoneyAmount","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","padding","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","showChange","showSparkline","isInteractive","tint","colorScheme","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","deltaTone","title","currentPeriod","previousPeriod","ArrowRight","abs","DEFAULT_ORDER","CHART_COLORS","PIE_PALETTE","MicroBars","max","v","MicroLine","min","range","points","MicroDots","MicroProgress","pct","MicroAreaChart","gradId","MicroPie","total","a","b","cumAngle","angle","startAngle","startRad","endRad","largeArc","x1","y1","x2","y2","ChartFor","kind","MetricMicroGrid","cell","THEME_BG","CHART_INVERSE","CHART_INVERSE_SOFT","MetricGradient","theme","subtitle","LEVEL_COLOR","AXIS_LABEL_CLASS","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","label","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';\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: 'bg-success/10 text-success', arrow: 'text-success' },\n\tnegative: { text: 'text-destructive', badge: 'bg-destructive/10 text-destructive', 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 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 size={TEXT_SIZE[size]} weight=\"semibold\" className=\"text-current 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 size={TEXT_SIZE[size]} weight=\"semibold\" className=\"text-current 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 tag=\"span\" size={TEXT_SIZE[size]} className=\"text-current opacity-70\">{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 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 { 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\tconst padding = 'p-surface';\n\n\tif (variant === 'card') {\n\t\treturn (\n\t\t\t<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<Bar className=\"h-3 w-24\" />\n\t\t\t\t<Bar className={cn('mt-space-lg', size === 'lg' ? 'h-9 w-40' : 'h-7 w-32')} />\n\t\t\t\t<Bar className=\"mt-space-md h-3 w-20\" />\n\t\t\t\t<Bar className=\"mt-space-lg h-8 w-full\" />\n\t\t\t</Card>\n\t\t);\n\t}\n\n\tif (variant === 'bordered' || variant === 'accent' || variant === 'colored') {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn('metric-skeleton--component', \n\t\t\t\t\t'rounded-radius border border-border bg-card shadow-sm',\n\t\t\t\t\tpadding,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\taria-busy=\"true\"\n\t\t\t\taria-live=\"polite\"\n\t\t\t>\n\t\t\t\t<Bar className=\"h-3 w-24\" />\n\t\t\t\t<Bar className={cn('mt-space-lg', size === 'lg' ? 'h-9 w-40' : 'h-7 w-32')} />\n\t\t\t\t<Bar className=\"mt-space-md h-3 w-20\" />\n\t\t\t\t<Bar className=\"mt-space-lg h-8 w-full\" />\n\t\t\t</div>\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-9 rounded-radius\" />\n\t\t\t\t<div className=\"flex-1 space-y-space-sm\">\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</div>\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', padding, 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 { 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';\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: 'border-primary/25', bg: 'bg-primary/5', bar: 'bg-primary', dot: 'bg-primary', ring: 'ring-primary/20' },\n\tsuccess: { border: 'border-success/30', bg: 'bg-success/5', bar: 'bg-success', dot: 'bg-success', ring: 'ring-success/20' },\n\twarning: { border: 'border-warning/40', bg: 'bg-warning/10', bar: 'bg-warning', dot: 'bg-warning', ring: 'ring-warning/30' },\n\tdanger: { border: 'border-destructive/30', bg: 'bg-destructive/5', bar: 'bg-destructive', dot: 'bg-destructive', ring: 'ring-destructive/20' },\n\tinfo: { border: 'border-info/30', bg: 'bg-info/5', bar: 'bg-info', dot: 'bg-info', ring: 'ring-info/20' },\n};\n\n/** Compact value sizes for in-grid / in-bar usage where horizontal space is tight. */\nconst VALUE_FONT_SIZE: Record<MetricSize, string> = {\n\tsm: 'text-sm',\n\tmd: 'text-base',\n\tlg: 'text-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<div className={cn('flex items-center justify-center rounded-radius border border-border bg-card text-card-foreground', 'p-surface', rootClassName)}>\n\t\t\t\t<Text>{errorLabel ?? defaultAnalyticsStrings.metricErrorLabel}</Text>\n\t\t\t</div>\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\n\t\t\t\ttag=\"h5\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'font-bold tabular-nums tracking-tight border-none pb-0 leading-tight truncate',\n\t\t\t\t\tVALUE_FONT_SIZE[size],\n\t\t\t\t)}\n\t\t\t\ttitle={formattedValue}\n\t\t\t>\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-radius focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\" /> : <button type=\"button\" onClick={data.onClick} aria-label={ariaLabel} className=\"metric--action absolute inset-0 z-0 m-0 cursor-pointer rounded-radius border-0 bg-transparent p-0 font-sans focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-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', 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 && (\n\t\t\t\t<span className=\"inline-flex size-avatar shrink-0 items-center justify-center rounded-radius bg-muted/60 text-muted-foreground\">\n\t\t\t\t\t<Icon className=\"size-icon\" aria-hidden=\"true\" />\n\t\t\t\t</span>\n\t\t\t)}\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 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 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\treturn (\n\t\t<Stack\n\t\t\tgap=\"lg\"\n\t\t\tclassName={cn('rounded-radius border shadow-sm', 'p-surface', tint.border, tint.bg, className)}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"between\" gap=\"md\">\n\t\t\t\t<div className=\"flex items-center gap-space-md text-muted-foreground\">\n\t\t\t\t\t{!!showIcon && !!Icon && <Icon className=\"size-icon shrink-0\" aria-hidden=\"true\" />}\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" weight=\"medium\">{data.label}</Text>\n\t\t\t\t</div>\n\t\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"badge\" />\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t\t<Heading\n\t\t\t\ttag={size === 'lg' ? 'h3' : 'h4'}\n\t\t\t\tsize={VALUE_FONT_SIZE_HERO[size]}\n\t\t\t\tclassName=\"tabular-nums\"\n\t\t\t>\n\t\t\t\t{formattedValue}\n\t\t\t</Heading>\n\t\t\t{!!data.subtitle && <Text size=\"xs\" type=\"secondary\">{data.subtitle}</Text>}\n\t\t\t{!!showSparkline && !!data.sparkline?.length && (\n\t\t\t\t<MetricSparkline data={data.sparkline} trend={trend} className={SPARKLINE_HEIGHT[size]} />\n\t\t\t)}\n\t\t\t{!!data.footer && <Text size=\"xs\" type=\"discrete\">{data.footer}</Text>}\n\t\t</Stack>\n\t);\n}\n\nfunction MetricAccent({ data, formattedValue, trend, size, showSparkline, showChange, showIcon, ariaLabel, className }: SubProps) {\n\tconst Icon = data.icon;\n\treturn (\n\t\t<Stack\n\t\t\tgap=\"none\"\n\t\t\tclassName={cn(\n\t\t\t\t'dark relative overflow-hidden rounded-radius bg-card text-card-foreground shadow-sm ring-1 ring-border',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\taria-label={ariaLabel}\n\t\t>\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>\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<span className=\"inline-flex size-avatar-sm items-center justify-center rounded-radius bg-foreground/[0.08]\">\n\t\t\t\t\t\t\t<Icon className=\"size-icon-md text-muted-foreground\" aria-hidden=\"true\" />\n\t\t\t\t\t\t</span>\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\"\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</Stack>\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<div\n\t\t\tclassName={cn('rounded-radius bg-card shadow-sm border border-border/50', 'p-surface', className)}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t<div className=\"flex items-center gap-space-md\">\n\t\t\t\t<Text size=\"xs\" type=\"secondary\" weight=\"medium\" className=\"truncate\">{data.label}</Text>\n\t\t\t\t<span className={cn('size-1.5 rounded-full shrink-0', tint.dot)} aria-hidden=\"true\" />\n\t\t\t</div>\n\t\t\t<div className=\"mt-space-md flex items-baseline gap-space-md\">\n\t\t\t\t<Heading\n\t\t\t\t\ttag=\"h3\"\n\t\t\t\t\tsize={VALUE_FONT_SIZE_HERO[size]}\n\t\t\t\tclassName=\"tabular-nums\"\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</div>\n\t\t\t<div\n\t\t\t\tclassName=\"mt-space-xl flex items-center gap-space-2xs\"\n\t\t\t\trole=\"progressbar\"\n\t\t\t\taria-label={`${data.label} progress`}\n\t\t\t\taria-valuenow={progress}\n\t\t\t\taria-valuemin={0}\n\t\t\t\taria-valuemax={100}\n\t\t\t\taria-valuetext={`${progress}%`}\n\t\t\t>\n\t\t\t\t{Array.from({ length: SEGMENT_COUNT }, (_, i) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={`seg-${i}`}\n\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/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t<div className=\"mt-space-lg\">\n\t\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"default\" />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!!data.footer && (\n\t\t\t\t<div className=\"mt-space-md inline-flex items-center gap-space-xs text-muted-foreground\">\n\t\t\t\t\t<ArrowUpRight className=\"size-icon-sm\" aria-hidden=\"true\" />\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{data.footer}</Text>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\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 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 @container/metric-bar',\n\t\t\t\t\t'w-full',\n\t\t\t\t\t'rounded-radius bg-gradient-to-r from-primary/8 via-info/5 to-success/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-radius bg-card @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-radius border-t border-border/50 bg-card 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 @container/metric-bar flex w-full flex-col overflow-hidden rounded-radius border border-border bg-card 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/50 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 @md/metric-grid:grid-cols-2 @3xl/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 two side-by-side `Metric.bordered`-style boxes for current vs\n * previous, 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, Heading, Text } from '../../../typography';\nimport { type StringsProp, useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\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}\n\nexport const defaultMetricComparisonStrings: MetricComparisonStrings = {\n\ttitle: 'Comparison',\n\tcurrentLabel: 'This period',\n\tpreviousLabel: 'Previous period',\n\tsuffix: 'vs previous',\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 direction; the row\n\t// around it is plain, so the comparison does not sit in a tinted panel.\n\tconst deltaTone = isFlat ? 'secondary' as const : isUp ? 'success' as const : 'destructive' as const;\n\n\tconst formatDelta = (value: number) => {\n\t\tconst abs = Math.abs(value);\n\t\t// reuse the formatter so currency/percent 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{!!(currentPeriod || previousPeriod) && (\n\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\">\n\t\t\t\t\t{!!currentPeriod && (\n\t\t\t\t\t\t<Badge tone=\"secondary\" inline>\n\t\t\t\t\t\t\t{currentPeriod}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!previousPeriod && (\n\t\t\t\t\t\t<Badge tone=\"secondary\" inline>\n\t\t\t\t\t\t\t{previousPeriod}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t)}\n\n\t\t\t<div className=\"grid items-stretch gap-space-md grid-cols-1 @md/metric-comparison:grid-cols-[1fr_auto_1fr]\">\n\t\t\t\t<div className=\"rounded-radius border border-border/60 bg-card p-surface\">\n\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t{strings.currentLabel}\n\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t<Heading tag=\"h5\" className=\"text-base tabular-nums tracking-tight border-none pb-0\">\n\t\t\t\t\t\t{formatMetricValue(current, formatOptions)}\n\t\t\t\t\t</Heading>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center justify-center text-muted-foreground/60\">\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<div className=\"rounded-radius border border-border/60 bg-muted/30 p-surface\">\n\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t{strings.previousLabel}\n\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t<Heading tag=\"h5\" className=\"text-base tabular-nums tracking-tight border-none pb-0 text-muted-foreground\">\n\t\t\t\t\t\t{formatMetricValue(previous, formatOptions)}\n\t\t\t\t\t</Heading>\n\t\t\t\t</div>\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 { 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\nfunction MicroBars({ data, color }: { data: readonly number[]; color: string }) {\n\tconst max = Math.max(...data, 1);\n\treturn (\n\t\t<div className={cn('metric-micro-grid--component', 'flex h-5 items-end gap-space-2xs')}>\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, opacity: 0.8 }}\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=\"h-5 w-full\" 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\nfunction MicroDots({ data, color }: { data: readonly number[]; color: string }) {\n\tconst max = Math.max(...data, 1);\n\treturn (\n\t\t<div className=\"flex h-5 items-end justify-around\" data-intrinsic-geometry>\n\t\t\t{data.slice(0, 5).map((v, i) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={`dot-${i}`}\n\t\t\t\t\tclassName=\"h-1.5 w-1.5 rounded-full\"\n\t\t\t\t\tstyle={{ marginBottom: `${(v / max) * 12}px`, backgroundColor: color }}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\nfunction MicroProgress({ data, color }: { data: readonly number[]; color: string }) {\n\tconst value = data[0] ?? 0;\n\tconst max = data[1] ?? 100;\n\tconst pct = Math.min((value / max) * 100, 100);\n\treturn (\n\t\t<div className=\"h-1.5 w-full overflow-hidden rounded-full bg-muted\">\n\t\t\t<div className=\"h-full rounded-full transition-[width,background-color] motion-reduce:transition-none\" style={{ width: `${pct}%`, backgroundColor: color }} />\n\t\t</div>\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\tconst chartData = data.map((v, i) => ({ i, v }));\n\treturn (\n\t\t<div className=\"h-5 w-full\">\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=\"h-6 w-6\">\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 }: { kind: MicroChartKind; data: readonly number[] }) {\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} color={color} />;\n\tif (kind === 'area') return <MicroAreaChart data={data} color={color} />;\n\treturn <MicroPie data={data} />;\n}\n\nexport function MetricMicroGrid({ title = 'Overview', cells, className }: MetricMicroGridProps) {\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 min-w-0', className)}\n\t\t\taria-label={title}\n\t\t>\n\t\t\t<div className=\"grid grid-cols-3 grid-rows-2\">\n\t\t\t\t{cells.slice(0, 6).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={cn(\n\t\t\t\t\t\t\t'p-surface-xs',\n\t\t\t\t\t\t\ti % 3 !== 2 && 'border-r border-border/50',\n\t\t\t\t\t\t\ti < 3 && 'border-b border-border/50',\n\t\t\t\t\t\t)}\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\">\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 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} />\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. `purple` and `ocean` were the same string, so a\n * \"four themes\" row rendered three. Each ramp still resolves to semantic\n * state tokens only, so a consumer retheming the palette moves all four\n * together: `purple` is brand-led, `ocean` runs blue into teal.\n */\nconst THEME_BG: Record<MetricGradientTheme, string> = {\n\tgreen: 'bg-gradient-to-br from-success via-primary to-success',\n\tpurple: 'bg-gradient-to-br from-primary via-info to-primary',\n\twarm: 'bg-gradient-to-br from-warning via-destructive to-warning',\n\tocean: 'bg-gradient-to-br from-info via-success to-info',\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-radius 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-radius 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\n\t\t\t\t\t\t\ttag=\"h3\"\n\t\t\t\t\t\t\tclassName=\"text-base font-bold tabular-nums tracking-tight border-none pb-0 leading-none text-inverse-foreground\"\n\t\t\t\t\t\t>\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';\n\nconst LEVEL_COLOR: Record<ActivityLevel, string> = {\n\t0: 'fill-muted',\n\t1: 'fill-success/20',\n\t2: 'fill-success/40',\n\t3: 'fill-success/65',\n\t4: 'fill-success',\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';\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 'bg-muted';\n\t\tconst ratio = count / maxVal;\n\t\tif (ratio < 0.33) return 'bg-primary/25';\n\t\tif (ratio < 0.66) return 'bg-primary/55';\n\t\treturn 'bg-primary';\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 duration-200',\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=\"h-2 w-3 rounded-radius-sm bg-muted\" />\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=\"h-2 w-3 rounded-radius-sm bg-primary/25\" />\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=\"h-2 w-3 rounded-radius-sm bg-primary/55\" />\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=\"h-2 w-3 rounded-radius-sm bg-primary\" />\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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"}
1
+ {"version":3,"file":"analytics.js","names":["_jsxs","_Fragment","useFormattingConfig","useMoneyConfig","cn","Button","textVariants","focusRecipes","Grid","Stack","rampRecipes","toneRecipes","Card","Skeleton","formatPercentage","formatNumber","formatDuration","Value","SecondaryValue","formatMoneyAmount","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","Text","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","padding","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","deltaTone","title","currentPeriod","previousPeriod","ArrowRight","abs","DEFAULT_ORDER","CHART_COLORS","PIE_PALETTE","MicroBars","max","v","MicroLine","min","range","points","MicroDots","MicroProgress","pct","MicroAreaChart","gradId","MicroPie","total","a","b","cumAngle","angle","startAngle","startRad","endRad","largeArc","x1","y1","x2","y2","ChartFor","kind","MetricMicroGrid","cell","THEME_BG","CHART_INVERSE","CHART_INVERSE_SOFT","MetricGradient","theme","subtitle","LEVEL_COLOR","AXIS_LABEL_CLASS","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","label","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 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 size={TEXT_SIZE[size]} weight=\"semibold\" className=\"text-current 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 size={TEXT_SIZE[size]} weight=\"semibold\" className=\"text-current 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 tag=\"span\" size={TEXT_SIZE[size]} className=\"text-current opacity-70\">{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 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 { 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\tconst padding = 'p-surface';\n\n\tif (variant === 'card') {\n\t\treturn (\n\t\t\t<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<Bar className=\"h-3 w-24\" />\n\t\t\t\t<Bar className={cn('mt-space-lg', size === 'lg' ? 'h-9 w-40' : 'h-7 w-32')} />\n\t\t\t\t<Bar className=\"mt-space-md h-3 w-20\" />\n\t\t\t\t<Bar className=\"mt-space-lg h-8 w-full\" />\n\t\t\t</Card>\n\t\t);\n\t}\n\n\tif (variant === 'bordered' || variant === 'accent' || variant === 'colored') {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn('metric-skeleton--component', \n\t\t\t\t\t'rounded-radius border border-border bg-card shadow-sm',\n\t\t\t\t\tpadding,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\taria-busy=\"true\"\n\t\t\t\taria-live=\"polite\"\n\t\t\t>\n\t\t\t\t<Bar className=\"h-3 w-24\" />\n\t\t\t\t<Bar className={cn('mt-space-lg', size === 'lg' ? 'h-9 w-40' : 'h-7 w-32')} />\n\t\t\t\t<Bar className=\"mt-space-md h-3 w-20\" />\n\t\t\t\t<Bar className=\"mt-space-lg h-8 w-full\" />\n\t\t\t</div>\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-9 rounded-radius\" />\n\t\t\t\t<div className=\"flex-1 space-y-space-sm\">\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</div>\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', padding, 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 { 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 { toneRecipes } from '../../../../lib/tone-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, string> = {\n\tsm: 'text-sm',\n\tmd: 'text-base',\n\tlg: 'text-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<div className={cn('flex items-center justify-center rounded-radius border border-border bg-card text-card-foreground', 'p-surface', rootClassName)}>\n\t\t\t\t<Text>{errorLabel ?? defaultAnalyticsStrings.metricErrorLabel}</Text>\n\t\t\t</div>\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\n\t\t\t\ttag=\"h5\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'font-bold tabular-nums tracking-tight border-none pb-0 leading-tight truncate',\n\t\t\t\t\tVALUE_FONT_SIZE[size],\n\t\t\t\t)}\n\t\t\t\ttitle={formattedValue}\n\t\t\t>\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-radius focus-visible:outline-none ${focusRecipes.inset}`} /> : <button type=\"button\" onClick={data.onClick} aria-label={ariaLabel} className={`metric--action absolute inset-0 z-0 m-0 cursor-pointer rounded-radius border-0 bg-transparent p-0 font-sans 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', 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 && (\n\t\t\t\t<span className=\"inline-flex size-avatar shrink-0 items-center justify-center rounded-radius bg-foreground/8 text-muted-foreground\">\n\t\t\t\t\t<Icon className=\"size-icon\" aria-hidden=\"true\" />\n\t\t\t\t</span>\n\t\t\t)}\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 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 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\treturn (\n\t\t<Stack\n\t\t\tgap=\"lg\"\n\t\t\tclassName={cn('rounded-radius border shadow-sm', 'p-surface', tint.border, tint.bg, className)}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"between\" gap=\"md\">\n\t\t\t\t<div className=\"flex items-center gap-space-md text-muted-foreground\">\n\t\t\t\t\t{!!showIcon && !!Icon && <Icon className=\"size-icon shrink-0\" aria-hidden=\"true\" />}\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" weight=\"medium\">{data.label}</Text>\n\t\t\t\t</div>\n\t\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"badge\" />\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t\t<Heading\n\t\t\t\ttag={size === 'lg' ? 'h3' : 'h4'}\n\t\t\t\tsize={VALUE_FONT_SIZE_HERO[size]}\n\t\t\t\tclassName=\"tabular-nums\"\n\t\t\t>\n\t\t\t\t{formattedValue}\n\t\t\t</Heading>\n\t\t\t{!!data.subtitle && <Text size=\"xs\" type=\"secondary\">{data.subtitle}</Text>}\n\t\t\t{!!showSparkline && !!data.sparkline?.length && (\n\t\t\t\t<MetricSparkline data={data.sparkline} trend={trend} className={SPARKLINE_HEIGHT[size]} />\n\t\t\t)}\n\t\t\t{!!data.footer && <Text size=\"xs\" type=\"discrete\">{data.footer}</Text>}\n\t\t</Stack>\n\t);\n}\n\nfunction MetricAccent({ data, formattedValue, trend, size, showSparkline, showChange, showIcon, ariaLabel, className }: SubProps) {\n\tconst Icon = data.icon;\n\treturn (\n\t\t<Stack\n\t\t\tgap=\"none\"\n\t\t\tclassName={cn(\n\t\t\t\t'dark relative overflow-hidden rounded-radius bg-card text-card-foreground shadow-sm ring-1 ring-border',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\taria-label={ariaLabel}\n\t\t>\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>\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<span className=\"inline-flex size-avatar-sm items-center justify-center rounded-radius bg-foreground/8\">\n\t\t\t\t\t\t\t<Icon className=\"size-icon-md text-muted-foreground\" aria-hidden=\"true\" />\n\t\t\t\t\t\t</span>\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\"\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</Stack>\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<div\n\t\t\tclassName={cn('rounded-radius bg-card shadow-sm border border-border', 'p-surface', className)}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t<div className=\"flex items-center gap-space-md\">\n\t\t\t\t<Text size=\"xs\" type=\"secondary\" weight=\"medium\" className=\"truncate\">{data.label}</Text>\n\t\t\t\t<span className={cn('size-1.5 rounded-full shrink-0', tint.dot)} aria-hidden=\"true\" />\n\t\t\t</div>\n\t\t\t<div className=\"mt-space-md flex items-baseline gap-space-md\">\n\t\t\t\t<Heading\n\t\t\t\t\ttag=\"h3\"\n\t\t\t\t\tsize={VALUE_FONT_SIZE_HERO[size]}\n\t\t\t\tclassName=\"tabular-nums\"\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</div>\n\t\t\t<div\n\t\t\t\tclassName=\"mt-space-xl flex items-center gap-space-2xs\"\n\t\t\t\trole=\"progressbar\"\n\t\t\t\taria-label={`${data.label} progress`}\n\t\t\t\taria-valuenow={progress}\n\t\t\t\taria-valuemin={0}\n\t\t\t\taria-valuemax={100}\n\t\t\t\taria-valuetext={`${progress}%`}\n\t\t\t>\n\t\t\t\t{Array.from({ length: SEGMENT_COUNT }, (_, i) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={`seg-${i}`}\n\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/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t{!!showChange && !!data.change && (\n\t\t\t\t<div className=\"mt-space-lg\">\n\t\t\t\t\t<MetricTrendChip change={data.change} trend={data.trend} size={size} variant=\"default\" />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!!data.footer && (\n\t\t\t\t<div className=\"mt-space-md inline-flex items-center gap-space-xs text-muted-foreground\">\n\t\t\t\t\t<ArrowUpRight className=\"size-icon-sm\" aria-hidden=\"true\" />\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{data.footer}</Text>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\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 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 @container/metric-bar',\n\t\t\t\t\t'w-full',\n\t\t\t\t\t'rounded-radius bg-gradient-to-r from-primary/8 via-info/5 to-success/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-radius bg-card @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-radius border-t border-border/60 bg-card 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 @container/metric-bar flex w-full flex-col overflow-hidden rounded-radius border border-border bg-card 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 @md/metric-grid:grid-cols-2 @3xl/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 two side-by-side `Metric.bordered`-style boxes for current vs\n * previous, 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, Heading, Text } from '../../../typography';\nimport { type StringsProp, useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\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}\n\nexport const defaultMetricComparisonStrings: MetricComparisonStrings = {\n\ttitle: 'Comparison',\n\tcurrentLabel: 'This period',\n\tpreviousLabel: 'Previous period',\n\tsuffix: 'vs previous',\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 direction; the row\n\t// around it is plain, so the comparison does not sit in a tinted panel.\n\tconst deltaTone = isFlat ? 'secondary' as const : isUp ? 'success' as const : 'destructive' as const;\n\n\tconst formatDelta = (value: number) => {\n\t\tconst abs = Math.abs(value);\n\t\t// reuse the formatter so currency/percent 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{!!(currentPeriod || previousPeriod) && (\n\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\">\n\t\t\t\t\t{!!currentPeriod && (\n\t\t\t\t\t\t<Badge tone=\"secondary\" inline>\n\t\t\t\t\t\t\t{currentPeriod}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!previousPeriod && (\n\t\t\t\t\t\t<Badge tone=\"secondary\" inline>\n\t\t\t\t\t\t\t{previousPeriod}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t)}\n\n\t\t\t<div className=\"grid items-stretch gap-space-md grid-cols-1 @md/metric-comparison:grid-cols-[1fr_auto_1fr]\">\n\t\t\t\t<div className=\"rounded-radius border border-border/60 bg-card p-surface\">\n\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t{strings.currentLabel}\n\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t<Heading tag=\"h5\" className=\"text-base tabular-nums tracking-tight border-none pb-0\">\n\t\t\t\t\t\t{formatMetricValue(current, formatOptions)}\n\t\t\t\t\t</Heading>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center justify-center text-muted-foreground\">\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<div className=\"rounded-radius border border-border/60 bg-muted/30 p-surface\">\n\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t{strings.previousLabel}\n\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t<Heading tag=\"h5\" className=\"text-base tabular-nums tracking-tight border-none pb-0 text-muted-foreground\">\n\t\t\t\t\t\t{formatMetricValue(previous, formatOptions)}\n\t\t\t\t\t</Heading>\n\t\t\t\t</div>\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 { 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\nfunction MicroBars({ data, color }: { data: readonly number[]; color: string }) {\n\tconst max = Math.max(...data, 1);\n\treturn (\n\t\t<div className={cn('metric-micro-grid--component', 'flex h-5 items-end gap-space-2xs')}>\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, opacity: 0.8 }}\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=\"h-5 w-full\" 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\nfunction MicroDots({ data, color }: { data: readonly number[]; color: string }) {\n\tconst max = Math.max(...data, 1);\n\treturn (\n\t\t<div className=\"flex h-5 items-end justify-around\" data-intrinsic-geometry>\n\t\t\t{data.slice(0, 5).map((v, i) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={`dot-${i}`}\n\t\t\t\t\tclassName=\"h-1.5 w-1.5 rounded-full\"\n\t\t\t\t\tstyle={{ marginBottom: `${(v / max) * 12}px`, backgroundColor: color }}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\nfunction MicroProgress({ data, color }: { data: readonly number[]; color: string }) {\n\tconst value = data[0] ?? 0;\n\tconst max = data[1] ?? 100;\n\tconst pct = Math.min((value / max) * 100, 100);\n\treturn (\n\t\t<div className=\"h-1.5 w-full overflow-hidden rounded-full bg-muted\">\n\t\t\t<div className=\"h-full rounded-full transition-[width,background-color] motion-reduce:transition-none\" style={{ width: `${pct}%`, backgroundColor: color }} />\n\t\t</div>\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\tconst chartData = data.map((v, i) => ({ i, v }));\n\treturn (\n\t\t<div className=\"h-5 w-full\">\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=\"h-6 w-6\">\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 }: { kind: MicroChartKind; data: readonly number[] }) {\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} color={color} />;\n\tif (kind === 'area') return <MicroAreaChart data={data} color={color} />;\n\treturn <MicroPie data={data} />;\n}\n\nexport function MetricMicroGrid({ title = 'Overview', cells, className }: MetricMicroGridProps) {\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 min-w-0', className)}\n\t\t\taria-label={title}\n\t\t>\n\t\t\t<div className=\"grid grid-cols-3 grid-rows-2\">\n\t\t\t\t{cells.slice(0, 6).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={cn(\n\t\t\t\t\t\t\t'p-surface-xs',\n\t\t\t\t\t\t\ti % 3 !== 2 && 'border-r border-border/60',\n\t\t\t\t\t\t\ti < 3 && 'border-b border-border/60',\n\t\t\t\t\t\t)}\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\">\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 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} />\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. `purple` and `ocean` were the same string, so a\n * \"four themes\" row rendered three. Each ramp still resolves to semantic\n * state tokens only, so a consumer retheming the palette moves all four\n * together: `purple` is brand-led, `ocean` runs blue into teal.\n */\nconst THEME_BG: Record<MetricGradientTheme, string> = {\n\tgreen: 'bg-gradient-to-br from-success via-primary to-success',\n\tpurple: 'bg-gradient-to-br from-primary via-info to-primary',\n\twarm: 'bg-gradient-to-br from-warning via-destructive to-warning',\n\tocean: 'bg-gradient-to-br from-info via-success to-info',\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-radius 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-radius 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\n\t\t\t\t\t\t\ttag=\"h3\"\n\t\t\t\t\t\t\tclassName=\"text-base font-bold tabular-nums tracking-tight border-none pb-0 leading-none text-inverse-foreground\"\n\t\t\t\t\t\t>\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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"}