@alfadocs/ui-kit-debug 1.55.0 → 1.56.0

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 (290) hide show
  1. package/dist/_chunks/{alia-sidebar-DS0b54Mv.js → alia-sidebar-DOei4Iyu.js} +2 -2
  2. package/dist/_chunks/{alia-sidebar-DS0b54Mv.js.map → alia-sidebar-DOei4Iyu.js.map} +1 -1
  3. package/dist/_chunks/{anamnesis-summary-rows-Dtw5Hpg4.js → anamnesis-summary-rows-CQ-XGr0T.js} +3 -3
  4. package/dist/_chunks/{anamnesis-summary-rows-Dtw5Hpg4.js.map → anamnesis-summary-rows-CQ-XGr0T.js.map} +1 -1
  5. package/dist/_chunks/{balance-badge-cell-zP-iN-Pd.js → balance-badge-cell-DmDcXw0c.js} +3 -3
  6. package/dist/_chunks/{balance-badge-cell-zP-iN-Pd.js.map → balance-badge-cell-DmDcXw0c.js.map} +1 -1
  7. package/dist/_chunks/{bmi-calculator-DTZhRhXe.js → bmi-calculator-C0UTxB7R.js} +2 -2
  8. package/dist/_chunks/{bmi-calculator-DTZhRhXe.js.map → bmi-calculator-C0UTxB7R.js.map} +1 -1
  9. package/dist/_chunks/{booking-uZO10TLK.js → booking-WyNGKPE2.js} +2 -2
  10. package/dist/_chunks/{booking-uZO10TLK.js.map → booking-WyNGKPE2.js.map} +1 -1
  11. package/dist/_chunks/{breadcrumb-xgVpPH2H.js → breadcrumb-Boan-5n8.js} +39 -39
  12. package/dist/_chunks/breadcrumb-Boan-5n8.js.map +1 -0
  13. package/dist/_chunks/{calculator-dialog-BRjZMWuE.js → calculator-dialog-pCPWta7h.js} +2 -2
  14. package/dist/_chunks/{calculator-dialog-BRjZMWuE.js.map → calculator-dialog-pCPWta7h.js.map} +1 -1
  15. package/dist/_chunks/{calendar-workspace-DVajSkKA.js → calendar-workspace-Du2ryaI-.js} +8 -8
  16. package/dist/_chunks/{calendar-workspace-DVajSkKA.js.map → calendar-workspace-Du2ryaI-.js.map} +1 -1
  17. package/dist/_chunks/{care-plan-header-BeMYMiI7.js → care-plan-header-DUX_SVvF.js} +2 -2
  18. package/dist/_chunks/{care-plan-header-BeMYMiI7.js.map → care-plan-header-DUX_SVvF.js.map} +1 -1
  19. package/dist/_chunks/chart-HsF1KHbx.js +909 -0
  20. package/dist/_chunks/chart-HsF1KHbx.js.map +1 -0
  21. package/dist/_chunks/{contact-profile-card-C5DbP_X3.js → contact-profile-card-Ci8lBQ6a.js} +2 -2
  22. package/dist/_chunks/{contact-profile-card-C5DbP_X3.js.map → contact-profile-card-Ci8lBQ6a.js.map} +1 -1
  23. package/dist/_chunks/dashboard-grid-DfEY2qci.js +844 -0
  24. package/dist/_chunks/dashboard-grid-DfEY2qci.js.map +1 -0
  25. package/dist/_chunks/{data-table-C6T31E33.js → data-table-D8fuhqO1.js} +1 -1
  26. package/dist/_chunks/{data-table-C6T31E33.js.map → data-table-D8fuhqO1.js.map} +1 -1
  27. package/dist/_chunks/{date-range-picker-BOvHwWO5.js → date-range-picker-CtUOI38x.js} +188 -182
  28. package/dist/_chunks/date-range-picker-CtUOI38x.js.map +1 -0
  29. package/dist/_chunks/{dependent-selector-Bet3XAFj.js → dependent-selector-DgaAQc-c.js} +91 -86
  30. package/dist/_chunks/dependent-selector-DgaAQc-c.js.map +1 -0
  31. package/dist/_chunks/{dialog-D52AI4nF.js → dialog-CUzbnKLw.js} +86 -69
  32. package/dist/_chunks/dialog-CUzbnKLw.js.map +1 -0
  33. package/dist/_chunks/{due-date-calculator-DXDJbUzo.js → due-date-calculator-CSjklbyw.js} +2 -2
  34. package/dist/_chunks/{due-date-calculator-DXDJbUzo.js.map → due-date-calculator-CSjklbyw.js.map} +1 -1
  35. package/dist/_chunks/{file-manager-dIJQUZvq.js → file-manager-Cc_uO8r2.js} +4 -4
  36. package/dist/_chunks/{file-manager-dIJQUZvq.js.map → file-manager-Cc_uO8r2.js.map} +1 -1
  37. package/dist/_chunks/{freemium-paywall-B6ojVXq7.js → freemium-paywall-DIKuhX8b.js} +90 -86
  38. package/dist/_chunks/freemium-paywall-DIKuhX8b.js.map +1 -0
  39. package/dist/_chunks/{gestational-age-calculator-BfGpt3du.js → gestational-age-calculator-DqVeJke2.js} +2 -2
  40. package/dist/_chunks/{gestational-age-calculator-BfGpt3du.js.map → gestational-age-calculator-DqVeJke2.js.map} +1 -1
  41. package/dist/_chunks/{heatmap-BARGZZt2.js → heatmap-Gf9r7Tn1.js} +2 -2
  42. package/dist/_chunks/{heatmap-BARGZZt2.js.map → heatmap-Gf9r7Tn1.js.map} +1 -1
  43. package/dist/_chunks/{help-me-write-templates-B7L3zGsE.js → help-me-write-templates-fV-Apf72.js} +2 -2
  44. package/dist/_chunks/help-me-write-templates-fV-Apf72.js.map +1 -0
  45. package/dist/_chunks/{key-value-pair-Ax8IJr1M.js → key-value-pair-BNNITp6S.js} +25 -19
  46. package/dist/_chunks/key-value-pair-BNNITp6S.js.map +1 -0
  47. package/dist/_chunks/{kit-extensions-C9-v8Dih.js → kit-extensions-Byfxy6sy.js} +4 -4
  48. package/dist/_chunks/{kit-extensions-C9-v8Dih.js.map → kit-extensions-Byfxy6sy.js.map} +1 -1
  49. package/dist/_chunks/{link-cell-renderer-DlBVPMTi.js → link-cell-renderer-TeJNvymP.js} +2 -2
  50. package/dist/_chunks/{link-cell-renderer-DlBVPMTi.js.map → link-cell-renderer-TeJNvymP.js.map} +1 -1
  51. package/dist/_chunks/non-modal-tab-exit-D2Bd93Bq.js +65 -0
  52. package/dist/_chunks/non-modal-tab-exit-D2Bd93Bq.js.map +1 -0
  53. package/dist/_chunks/{notes-panel-I8ntrrUW.js → notes-panel-DceRhthG.js} +3 -3
  54. package/dist/_chunks/{notes-panel-I8ntrrUW.js.map → notes-panel-DceRhthG.js.map} +1 -1
  55. package/dist/_chunks/{patient-summary-card-3dspc2tR.js → patient-summary-card-9nQWTQf6.js} +7 -3
  56. package/dist/_chunks/{patient-summary-card-3dspc2tR.js.map → patient-summary-card-9nQWTQf6.js.map} +1 -1
  57. package/dist/_chunks/{payment-automation-upsell-DEUfM7EU.js → payment-automation-upsell-DiHovmUL.js} +2 -2
  58. package/dist/_chunks/{payment-automation-upsell-DEUfM7EU.js.map → payment-automation-upsell-DiHovmUL.js.map} +1 -1
  59. package/dist/_chunks/{payment-request-card-DAGqh9Yx.js → payment-request-card-CwDpwXUC.js} +2 -2
  60. package/dist/_chunks/{payment-request-card-DAGqh9Yx.js.map → payment-request-card-CwDpwXUC.js.map} +1 -1
  61. package/dist/_chunks/{periodontal-chart-BqwLxy2m.js → periodontal-chart-DD5C0M3l.js} +2 -2
  62. package/dist/_chunks/{periodontal-chart-BqwLxy2m.js.map → periodontal-chart-DD5C0M3l.js.map} +1 -1
  63. package/dist/_chunks/{periodontal-chart-card-CWZ1YM1h.js → periodontal-chart-card-CxdXvsPU.js} +2 -2
  64. package/dist/_chunks/{periodontal-chart-card-CWZ1YM1h.js.map → periodontal-chart-card-CxdXvsPU.js.map} +1 -1
  65. package/dist/_chunks/{periodontal-diagnosis-C9IuvLId.js → periodontal-diagnosis-D-PJv7KS.js} +2 -2
  66. package/dist/_chunks/{periodontal-diagnosis-C9IuvLId.js.map → periodontal-diagnosis-D-PJv7KS.js.map} +1 -1
  67. package/dist/_chunks/{position-grid-D2D5_Tze.js → position-grid-CBB88EaH.js} +38 -36
  68. package/dist/_chunks/position-grid-CBB88EaH.js.map +1 -0
  69. package/dist/_chunks/{practice-results-DxOgbPDy.js → practice-results-Dhbo-fc_.js} +2 -2
  70. package/dist/_chunks/{practice-results-DxOgbPDy.js.map → practice-results-Dhbo-fc_.js.map} +1 -1
  71. package/dist/_chunks/{pregnancy-dating-R3q5n1Wh.js → pregnancy-dating-Bfu0Cq4H.js} +2 -2
  72. package/dist/_chunks/{pregnancy-dating-R3q5n1Wh.js.map → pregnancy-dating-Bfu0Cq4H.js.map} +1 -1
  73. package/dist/_chunks/{pregnancy-weight-gain-DwmNklDU.js → pregnancy-weight-gain-CUUrBTBo.js} +2 -2
  74. package/dist/_chunks/{pregnancy-weight-gain-DwmNklDU.js.map → pregnancy-weight-gain-CUUrBTBo.js.map} +1 -1
  75. package/dist/_chunks/{public-header.agent-BWusjxY8.js → public-header.agent-pr2hyiND.js} +2 -2
  76. package/dist/_chunks/{public-header.agent-BWusjxY8.js.map → public-header.agent-pr2hyiND.js.map} +1 -1
  77. package/dist/_chunks/{radio-group-BT97ty7o.js → radio-group-DicxWJXP.js} +111 -106
  78. package/dist/_chunks/radio-group-DicxWJXP.js.map +1 -0
  79. package/dist/_chunks/{radiograph-panel.agent-BA90I3Mu.js → radiograph-panel.agent-DkUokbEa.js} +3 -3
  80. package/dist/_chunks/{radiograph-panel.agent-BA90I3Mu.js.map → radiograph-panel.agent-DkUokbEa.js.map} +1 -1
  81. package/dist/_chunks/{rich-text-editor-Blp4smUr.js → rich-text-editor-CkFfmA3v.js} +2 -2
  82. package/dist/_chunks/{rich-text-editor-Blp4smUr.js.map → rich-text-editor-CkFfmA3v.js.map} +1 -1
  83. package/dist/_chunks/{sheet-CNFW8mYZ.js → sheet-C7SwIxwB.js} +95 -79
  84. package/dist/_chunks/sheet-C7SwIxwB.js.map +1 -0
  85. package/dist/_chunks/{signature-request-rgMsgo-C.js → signature-request-DhbpB9N9.js} +2 -2
  86. package/dist/_chunks/{signature-request-rgMsgo-C.js.map → signature-request-DhbpB9N9.js.map} +1 -1
  87. package/dist/_chunks/{stat-51CDL4au.js → stat-DmjGfXND.js} +117 -108
  88. package/dist/_chunks/stat-DmjGfXND.js.map +1 -0
  89. package/dist/_chunks/{stepper-accordion-D7lnBGh2.js → stepper-accordion-DDTSOUHc.js} +17 -6
  90. package/dist/_chunks/stepper-accordion-DDTSOUHc.js.map +1 -0
  91. package/dist/_chunks/{task-editor-Ctxsa1BY.js → task-editor-ByyRu29Y.js} +3 -3
  92. package/dist/_chunks/{task-editor-Ctxsa1BY.js.map → task-editor-ByyRu29Y.js.map} +1 -1
  93. package/dist/_chunks/{use-appointment-details-read-DinTrRIW.js → use-appointment-details-read-JsDM48tf.js} +2 -2
  94. package/dist/_chunks/{use-appointment-details-read-DinTrRIW.js.map → use-appointment-details-read-JsDM48tf.js.map} +1 -1
  95. package/dist/_chunks/use-select-on-arrow-Cr4iBuW5.js +26 -0
  96. package/dist/_chunks/use-select-on-arrow-Cr4iBuW5.js.map +1 -0
  97. package/dist/_chunks/{widget-picker-D8RiWrJd.js → widget-picker-DXYBMTfe.js} +2 -2
  98. package/dist/_chunks/{widget-picker-D8RiWrJd.js.map → widget-picker-DXYBMTfe.js.map} +1 -1
  99. package/dist/_chunks/{workflow-map-D3mezmGB.js → workflow-map-Demlpy39.js} +2 -2
  100. package/dist/_chunks/{workflow-map-D3mezmGB.js.map → workflow-map-Demlpy39.js.map} +1 -1
  101. package/dist/agent-catalog.json +27 -10
  102. package/dist/agent-i18n/en.json +8 -7
  103. package/dist/components/_shared/non-modal-tab-exit.d.ts +8 -0
  104. package/dist/components/_shared/non-modal-tab-exit.d.ts.map +1 -0
  105. package/dist/components/_shared/use-apex-chart-semantics.d.ts +6 -0
  106. package/dist/components/_shared/use-apex-chart-semantics.d.ts.map +1 -0
  107. package/dist/components/_shared/use-select-on-arrow.d.ts +20 -0
  108. package/dist/components/_shared/use-select-on-arrow.d.ts.map +1 -0
  109. package/dist/components/appointment-details-panel/index.js +1 -1
  110. package/dist/components/bmi-calculator/index.js +1 -1
  111. package/dist/components/booking/index.js +1 -1
  112. package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -1
  113. package/dist/components/breadcrumb/index.js +1 -1
  114. package/dist/components/calculator-dialog/index.js +1 -1
  115. package/dist/components/care-plan-header/index.js +1 -1
  116. package/dist/components/chart/chart.d.ts +10 -5
  117. package/dist/components/chart/chart.d.ts.map +1 -1
  118. package/dist/components/chart/index.js +1 -1
  119. package/dist/components/contact-profile-card/index.js +1 -1
  120. package/dist/components/dashboard-grid/dashboard-grid-engine.d.ts +22 -0
  121. package/dist/components/dashboard-grid/dashboard-grid-engine.d.ts.map +1 -1
  122. package/dist/components/dashboard-grid/dashboard-grid.agent.d.ts.map +1 -1
  123. package/dist/components/dashboard-grid/dashboard-grid.d.ts +48 -4
  124. package/dist/components/dashboard-grid/dashboard-grid.d.ts.map +1 -1
  125. package/dist/components/dashboard-grid/index.js +1 -1
  126. package/dist/components/data-table/index.js +2 -2
  127. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  128. package/dist/components/date-range-picker/index.js +1 -1
  129. package/dist/components/dependent-selector/dependent-selector.d.ts.map +1 -1
  130. package/dist/components/dependent-selector/index.js +1 -1
  131. package/dist/components/dialog/dialog.d.ts +2 -2
  132. package/dist/components/dialog/dialog.d.ts.map +1 -1
  133. package/dist/components/dialog/index.js +1 -1
  134. package/dist/components/due-date-calculator/index.js +1 -1
  135. package/dist/components/file-manager/index.js +1 -1
  136. package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
  137. package/dist/components/freemium-paywall/index.js +1 -1
  138. package/dist/components/gestational-age-calculator/index.js +1 -1
  139. package/dist/components/heatmap/index.js +1 -1
  140. package/dist/components/key-value-pair/index.js +1 -1
  141. package/dist/components/key-value-pair/key-value-pair.d.ts.map +1 -1
  142. package/dist/components/notes-panel/index.js +1 -1
  143. package/dist/components/patient-summary-card/index.js +1 -1
  144. package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -1
  145. package/dist/components/patient-table/index.js +1 -1
  146. package/dist/components/payment-card/index.js +1 -1
  147. package/dist/components/periodontal-chart/index.js +1 -1
  148. package/dist/components/periodontal-chart-card/index.js +1 -1
  149. package/dist/components/periodontal-diagnosis/index.js +1 -1
  150. package/dist/components/position-grid/index.js +1 -1
  151. package/dist/components/position-grid/position-grid.d.ts.map +1 -1
  152. package/dist/components/practice-results/index.js +1 -1
  153. package/dist/components/pregnancy-dating/index.js +1 -1
  154. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  155. package/dist/components/public-header/index.js +1 -1
  156. package/dist/components/radio-group/index.js +1 -1
  157. package/dist/components/radio-group/radio-group.d.ts.map +1 -1
  158. package/dist/components/radiograph-panel/index.js +1 -1
  159. package/dist/components/rich-text-editor/index.js +2 -2
  160. package/dist/components/sheet/index.js +1 -1
  161. package/dist/components/sheet/sheet.d.ts +2 -2
  162. package/dist/components/sheet/sheet.d.ts.map +1 -1
  163. package/dist/components/stat/index.d.ts +1 -1
  164. package/dist/components/stat/index.d.ts.map +1 -1
  165. package/dist/components/stat/index.js +1 -1
  166. package/dist/components/stat/stat.d.ts +9 -0
  167. package/dist/components/stat/stat.d.ts.map +1 -1
  168. package/dist/components/stepper-accordion/index.js +1 -1
  169. package/dist/components/stepper-accordion/stepper-accordion.d.ts.map +1 -1
  170. package/dist/components/task-editor/index.js +1 -1
  171. package/dist/components/widget-picker/index.js +1 -1
  172. package/dist/components/workflow/index.js +1 -1
  173. package/dist/host-legacy.css +13 -2
  174. package/dist/i18n/locales/ar.d.ts +3 -2
  175. package/dist/i18n/locales/ar.d.ts.map +1 -1
  176. package/dist/i18n/locales/ar.js +5 -4
  177. package/dist/i18n/locales/ar.js.map +1 -1
  178. package/dist/i18n/locales/de.d.ts +3 -2
  179. package/dist/i18n/locales/de.d.ts.map +1 -1
  180. package/dist/i18n/locales/de.js +5 -4
  181. package/dist/i18n/locales/de.js.map +1 -1
  182. package/dist/i18n/locales/el.d.ts +3 -2
  183. package/dist/i18n/locales/el.d.ts.map +1 -1
  184. package/dist/i18n/locales/el.js +5 -4
  185. package/dist/i18n/locales/el.js.map +1 -1
  186. package/dist/i18n/locales/en.d.ts +3 -2
  187. package/dist/i18n/locales/en.d.ts.map +1 -1
  188. package/dist/i18n/locales/en.js +5 -4
  189. package/dist/i18n/locales/en.js.map +1 -1
  190. package/dist/i18n/locales/es.d.ts +3 -2
  191. package/dist/i18n/locales/es.d.ts.map +1 -1
  192. package/dist/i18n/locales/es.js +5 -4
  193. package/dist/i18n/locales/es.js.map +1 -1
  194. package/dist/i18n/locales/fr.d.ts +3 -2
  195. package/dist/i18n/locales/fr.d.ts.map +1 -1
  196. package/dist/i18n/locales/fr.js +5 -4
  197. package/dist/i18n/locales/fr.js.map +1 -1
  198. package/dist/i18n/locales/hi.d.ts +3 -2
  199. package/dist/i18n/locales/hi.d.ts.map +1 -1
  200. package/dist/i18n/locales/hi.js +5 -4
  201. package/dist/i18n/locales/hi.js.map +1 -1
  202. package/dist/i18n/locales/it.d.ts +3 -2
  203. package/dist/i18n/locales/it.d.ts.map +1 -1
  204. package/dist/i18n/locales/it.js +5 -4
  205. package/dist/i18n/locales/it.js.map +1 -1
  206. package/dist/i18n/locales/ja.d.ts +3 -2
  207. package/dist/i18n/locales/ja.d.ts.map +1 -1
  208. package/dist/i18n/locales/ja.js +5 -4
  209. package/dist/i18n/locales/ja.js.map +1 -1
  210. package/dist/i18n/locales/nl.d.ts +3 -2
  211. package/dist/i18n/locales/nl.d.ts.map +1 -1
  212. package/dist/i18n/locales/nl.js +5 -4
  213. package/dist/i18n/locales/nl.js.map +1 -1
  214. package/dist/i18n/locales/pl.d.ts +3 -2
  215. package/dist/i18n/locales/pl.d.ts.map +1 -1
  216. package/dist/i18n/locales/pl.js +5 -4
  217. package/dist/i18n/locales/pl.js.map +1 -1
  218. package/dist/i18n/locales/pt.d.ts +3 -2
  219. package/dist/i18n/locales/pt.d.ts.map +1 -1
  220. package/dist/i18n/locales/pt.js +5 -4
  221. package/dist/i18n/locales/pt.js.map +1 -1
  222. package/dist/i18n/locales/ro.d.ts +3 -2
  223. package/dist/i18n/locales/ro.d.ts.map +1 -1
  224. package/dist/i18n/locales/ro.js +5 -4
  225. package/dist/i18n/locales/ro.js.map +1 -1
  226. package/dist/i18n/locales/ru.d.ts +3 -2
  227. package/dist/i18n/locales/ru.d.ts.map +1 -1
  228. package/dist/i18n/locales/ru.js +5 -4
  229. package/dist/i18n/locales/ru.js.map +1 -1
  230. package/dist/i18n/locales/sq.d.ts +3 -2
  231. package/dist/i18n/locales/sq.d.ts.map +1 -1
  232. package/dist/i18n/locales/sq.js +5 -4
  233. package/dist/i18n/locales/sq.js.map +1 -1
  234. package/dist/i18n/locales/sv.d.ts +3 -2
  235. package/dist/i18n/locales/sv.d.ts.map +1 -1
  236. package/dist/i18n/locales/sv.js +5 -4
  237. package/dist/i18n/locales/sv.js.map +1 -1
  238. package/dist/i18n/locales/tr.d.ts +3 -2
  239. package/dist/i18n/locales/tr.d.ts.map +1 -1
  240. package/dist/i18n/locales/tr.js +5 -4
  241. package/dist/i18n/locales/tr.js.map +1 -1
  242. package/dist/i18n/locales/zh.d.ts +3 -2
  243. package/dist/i18n/locales/zh.d.ts.map +1 -1
  244. package/dist/i18n/locales/zh.js +5 -4
  245. package/dist/i18n/locales/zh.js.map +1 -1
  246. package/dist/index.js +48 -48
  247. package/dist/locales/ar.json +5 -4
  248. package/dist/locales/de.json +5 -4
  249. package/dist/locales/el.json +5 -4
  250. package/dist/locales/en.json +5 -4
  251. package/dist/locales/es.json +5 -4
  252. package/dist/locales/fr.json +5 -4
  253. package/dist/locales/hi.json +5 -4
  254. package/dist/locales/it.json +5 -4
  255. package/dist/locales/ja.json +5 -4
  256. package/dist/locales/nl.json +5 -4
  257. package/dist/locales/pl.json +5 -4
  258. package/dist/locales/pt.json +5 -4
  259. package/dist/locales/ro.json +5 -4
  260. package/dist/locales/ru.json +5 -4
  261. package/dist/locales/sq.json +5 -4
  262. package/dist/locales/sv.json +5 -4
  263. package/dist/locales/tr.json +5 -4
  264. package/dist/locales/zh.json +5 -4
  265. package/dist/patterns/alia-assistant/index.js +1 -1
  266. package/dist/patterns/anamnesis/index.js +1 -1
  267. package/dist/patterns/calendar/index.js +1 -1
  268. package/dist/patterns/help-me-write-templates/help-me-write-templates.d.ts +2 -2
  269. package/dist/patterns/help-me-write-templates/help-me-write-templates.d.ts.map +1 -1
  270. package/dist/patterns/help-me-write-templates/index.js +1 -1
  271. package/dist/patterns/payment-automation-upsell/index.js +1 -1
  272. package/dist/patterns/signature-request/index.js +1 -1
  273. package/dist/tokens.css +13 -2
  274. package/package.json +1 -1
  275. package/dist/_chunks/breadcrumb-xgVpPH2H.js.map +0 -1
  276. package/dist/_chunks/chart-C2RBJERE.js +0 -705
  277. package/dist/_chunks/chart-C2RBJERE.js.map +0 -1
  278. package/dist/_chunks/dashboard-grid-SAGoyCtL.js +0 -691
  279. package/dist/_chunks/dashboard-grid-SAGoyCtL.js.map +0 -1
  280. package/dist/_chunks/date-range-picker-BOvHwWO5.js.map +0 -1
  281. package/dist/_chunks/dependent-selector-Bet3XAFj.js.map +0 -1
  282. package/dist/_chunks/dialog-D52AI4nF.js.map +0 -1
  283. package/dist/_chunks/freemium-paywall-B6ojVXq7.js.map +0 -1
  284. package/dist/_chunks/help-me-write-templates-B7L3zGsE.js.map +0 -1
  285. package/dist/_chunks/key-value-pair-Ax8IJr1M.js.map +0 -1
  286. package/dist/_chunks/position-grid-D2D5_Tze.js.map +0 -1
  287. package/dist/_chunks/radio-group-BT97ty7o.js.map +0 -1
  288. package/dist/_chunks/sheet-CNFW8mYZ.js.map +0 -1
  289. package/dist/_chunks/stat-51CDL4au.js.map +0 -1
  290. package/dist/_chunks/stepper-accordion-D7lnBGh2.js.map +0 -1
@@ -1,8 +1,8 @@
1
- import { jsxs as z, jsx as i } from "react/jsx-runtime";
2
- import { forwardRef as X, useId as Z, useCallback as O, useRef as tt, useMemo as et } from "react";
1
+ import { jsxs as b, jsx as l } from "react/jsx-runtime";
2
+ import { forwardRef as Z, useId as tt, useCallback as O, useRef as et, useMemo as rt } from "react";
3
3
  import { c as V } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as B } from "react-i18next";
5
- import { u as rt } from "./use-count-up-BLLetaZ8.js";
5
+ import { u as st } from "./use-count-up-BLLetaZ8.js";
6
6
  const P = V("ds:flex ds:flex-col ds:h-full", {
7
7
  variants: {
8
8
  variant: {
@@ -106,180 +106,188 @@ const P = V("ds:flex ds:flex-col ds:h-full", {
106
106
  variant: "default",
107
107
  intent: "foreground"
108
108
  }
109
- }), st = V(
109
+ }), at = V(
110
110
  "ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-label",
111
111
  {
112
112
  variants: {
113
- trend: {
114
- up: "ds:text-[var(--success)]",
115
- down: "ds:text-[var(--destructive)]",
116
- flat: "ds:text-[var(--muted-foreground)]"
113
+ // Whether the change is good news, not which way it went: with
114
+ // `trendPolarity="lower-is-better"` a fall is `better`.
115
+ tone: {
116
+ better: "ds:text-[var(--success)]",
117
+ worse: "ds:text-[var(--destructive)]",
118
+ neutral: "ds:text-[var(--muted-foreground)]"
117
119
  }
118
120
  },
119
121
  defaultVariants: {
120
- trend: "flat"
122
+ tone: "neutral"
121
123
  }
122
124
  }
123
- ), at = { up: "↑", down: "↓", flat: "→" }, nt = {
125
+ ), nt = { up: "↑", down: "↓", flat: "→" }, it = {
124
126
  up: "stat.trend.up",
125
127
  down: "stat.trend.down",
126
128
  flat: "stat.trend.flat"
127
129
  };
128
- function it({
129
- trend: d,
130
+ function dt({
131
+ trend: a,
130
132
  delta: t,
131
- deltaFormat: c = "decimal",
132
- locale: a
133
+ deltaFormat: u = "decimal",
134
+ locale: n,
135
+ polarity: e = "higher-is-better"
133
136
  }) {
134
- const { t: e, i18n: o } = B("ui"), l = typeof t == "string" ? t : new Intl.NumberFormat(a ?? o.language, {
135
- style: c === "percent" ? "percent" : "decimal"
136
- }).format(c === "percent" ? t / 100 : t);
137
- return /* @__PURE__ */ z("span", { className: st({ trend: d }), children: [
138
- /* @__PURE__ */ i("span", { "aria-hidden": "true", children: at[d] }),
139
- /* @__PURE__ */ i("span", { className: "ds:sr-only", children: e(nt[d]) }),
140
- l
137
+ const { t: i, i18n: m } = B("ui"), d = typeof t == "string" ? t : new Intl.NumberFormat(n ?? m.language, {
138
+ style: u === "percent" ? "percent" : "decimal"
139
+ }).format(u === "percent" ? t / 100 : t), r = a === "flat" ? "neutral" : a === "up" == (e === "higher-is-better") ? "better" : "worse";
140
+ return /* @__PURE__ */ b("span", { className: at({ tone: r }), "data-trend-tone": r, children: [
141
+ /* @__PURE__ */ l("span", { "aria-hidden": "true", children: nt[a] }),
142
+ /* @__PURE__ */ l("span", { className: "ds:sr-only", children: i(it[a]) }),
143
+ d,
144
+ r === "neutral" ? null : /* @__PURE__ */ b("span", { className: "ds:sr-only", children: [
145
+ " ",
146
+ i(r === "better" ? "stat.trend.better" : "stat.trend.worse")
147
+ ] })
141
148
  ] });
142
149
  }
143
- function dt(d, t) {
144
- const c = d.trim();
145
- if (c === "") return null;
146
- let a = "", e = c;
147
- e.startsWith("+") ? (a = "+", e = e.slice(1).trimStart()) : (e.startsWith("-") || e.startsWith("−")) && (a = "-", e = e.slice(1).trimStart());
148
- let o = "";
149
- const l = e.match(/[KMB]$/i);
150
- l && (o = l[0], e = e.slice(0, -1).trimEnd());
151
- let u = "", m = ".";
150
+ function ot(a, t) {
151
+ const u = a.trim();
152
+ if (u === "") return null;
153
+ let n = "", e = u;
154
+ e.startsWith("+") ? (n = "+", e = e.slice(1).trimStart()) : (e.startsWith("-") || e.startsWith("−")) && (n = "-", e = e.slice(1).trimStart());
155
+ let i = "";
156
+ const m = e.match(/[KMB]$/i);
157
+ m && (i = m[0], e = e.slice(0, -1).trimEnd());
158
+ let d = "", r = ".";
152
159
  try {
153
- const b = new Intl.NumberFormat(t).formatToParts(12345.6);
154
- for (const n of b)
155
- n.type === "group" ? u = n.value : n.type === "decimal" && (m = n.value);
160
+ const h = new Intl.NumberFormat(t).formatToParts(12345.6);
161
+ for (const c of h)
162
+ c.type === "group" ? d = c.value : c.type === "decimal" && (r = c.value);
156
163
  } catch {
157
164
  }
158
165
  const g = e.match(/^(\d+)\.(\d+)$/);
159
- if (g && !(g[2].length === 3 && u === ".")) {
160
- const n = Number.parseFloat(e);
161
- if (Number.isFinite(n))
162
- return { target: n, sign: a, suffix: o };
166
+ if (g && !(g[2].length === 3 && d === ".")) {
167
+ const c = Number.parseFloat(e);
168
+ if (Number.isFinite(c))
169
+ return { target: c, sign: n, suffix: i };
163
170
  }
164
- let r = e;
165
- u !== "" && (r = r.split(u).join("")), m !== "." && (r = r.split(m).join(".")), r = r.replace(/[\s\u00A0\u202F]/g, "");
166
- const v = Number.parseFloat(r);
167
- return Number.isFinite(v) ? { target: v, sign: a, suffix: o } : null;
171
+ let o = e;
172
+ d !== "" && (o = o.split(d).join("")), r !== "." && (o = o.split(r).join(".")), o = o.replace(/[\s\u00A0\u202F]/g, "");
173
+ const f = Number.parseFloat(o);
174
+ return Number.isFinite(f) ? { target: f, sign: n, suffix: i } : null;
168
175
  }
169
- const ct = X(
176
+ const ct = Z(
170
177
  ({
171
- label: d,
178
+ label: a,
172
179
  value: t,
173
- format: c,
174
- currency: a,
180
+ format: u,
181
+ currency: n,
175
182
  locale: e,
176
- trend: o,
177
- delta: l,
178
- deltaFormat: u = "decimal",
179
- icon: m,
180
- loading: g = !1,
181
- animate: r = !1,
182
- animateOnEveryView: v = !1,
183
- animateDurationMs: b = 1600,
184
- animateLocale: n,
185
- animateSeparators: h,
186
- variant: x = "default",
187
- size: y = "md",
183
+ trend: i,
184
+ trendPolarity: m,
185
+ delta: d,
186
+ deltaFormat: r = "decimal",
187
+ icon: g,
188
+ loading: o = !1,
189
+ animate: f = !1,
190
+ animateOnEveryView: h = !1,
191
+ animateDurationMs: c = 1600,
192
+ animateLocale: K,
193
+ animateSeparators: x,
194
+ variant: y = "default",
195
+ size: N = "md",
188
196
  align: I = "start",
189
197
  intent: M = "foreground",
190
198
  className: j,
191
199
  ...k
192
200
  }, R) => {
193
- const { i18n: K } = B("ui"), T = Z(), f = e ?? K.language, Y = O(() => {
201
+ const { i18n: Y } = B("ui"), T = tt(), p = e ?? Y.language, _ = O(() => {
194
202
  if (typeof t == "string") return t;
195
- switch (c) {
203
+ switch (u) {
196
204
  case "currency":
197
- return new Intl.NumberFormat(f, {
205
+ return new Intl.NumberFormat(p, {
198
206
  style: "currency",
199
- currency: a ?? "USD"
207
+ currency: n ?? "USD"
200
208
  }).format(t);
201
209
  case "percent":
202
- return new Intl.NumberFormat(f, { style: "percent" }).format(
210
+ return new Intl.NumberFormat(p, { style: "percent" }).format(
203
211
  t
204
212
  );
205
213
  case "decimal":
206
- return new Intl.NumberFormat(f, { style: "decimal" }).format(
214
+ return new Intl.NumberFormat(p, { style: "decimal" }).format(
207
215
  t
208
216
  );
209
217
  default:
210
- return new Intl.NumberFormat(f).format(t);
218
+ return new Intl.NumberFormat(p).format(t);
211
219
  }
212
- }, [t, c, f, a])(), N = n ?? f;
213
- tt(!1);
214
- const s = et(() => r ? typeof t == "number" ? Number.isFinite(t) ? { target: t, sign: "", suffix: "" } : null : dt(t, N) : null, [r, t, N]), _ = r && s !== null, q = (s == null ? void 0 : s.target) ?? 0, F = (s == null ? void 0 : s.sign) ?? "", $ = (s == null ? void 0 : s.suffix) ?? "", H = O(
215
- (w) => {
220
+ }, [t, u, p, n])(), w = K ?? p;
221
+ et(!1);
222
+ const s = rt(() => f ? typeof t == "number" ? Number.isFinite(t) ? { target: t, sign: "", suffix: "" } : null : ot(t, w) : null, [f, t, w]), q = f && s !== null, H = (s == null ? void 0 : s.target) ?? 0, F = (s == null ? void 0 : s.sign) ?? "", $ = (s == null ? void 0 : s.suffix) ?? "", J = O(
223
+ (z) => {
216
224
  const E = (() => {
217
225
  try {
218
- return new Intl.NumberFormat(N, {
226
+ return new Intl.NumberFormat(w, {
219
227
  useGrouping: !0
220
228
  });
221
229
  } catch {
222
230
  return null;
223
231
  }
224
232
  })();
225
- let p;
233
+ let v;
226
234
  if (E)
227
- if (h) {
228
- const A = Math.abs(w), D = Math.trunc(A), G = A - D, J = h.thousand ?? "", S = String(D).replace(
235
+ if (x) {
236
+ const A = Math.abs(z), D = Math.trunc(A), G = A - D, Q = x.thousand ?? "", S = String(D).replace(
229
237
  /\B(?=(\d{3})+(?!\d))/g,
230
- J
238
+ Q
231
239
  );
232
240
  if (G === 0)
233
- p = S;
241
+ v = S;
234
242
  else {
235
- const L = G.toFixed(6).replace(/0+$/, "").slice(2), Q = h.decimal ?? ".";
236
- p = L ? S + Q + L : S;
243
+ const L = G.toFixed(6).replace(/0+$/, "").slice(2), X = x.decimal ?? ".";
244
+ v = L ? S + X + L : S;
237
245
  }
238
246
  } else
239
- p = E.format(Math.abs(w));
247
+ v = E.format(Math.abs(z));
240
248
  else
241
- p = String(Math.abs(w));
249
+ v = String(Math.abs(z));
242
250
  let W = F;
243
- return F === "" && w < 0 && (W = "-"), `${W}${p}${$}`;
251
+ return F === "" && z < 0 && (W = "-"), `${W}${v}${$}`;
244
252
  },
245
- [N, h, F, $]
246
- ), C = rt({
247
- to: q,
253
+ [w, x, F, $]
254
+ ), C = st({
255
+ to: H,
248
256
  from: 0,
249
- durationMs: b,
257
+ durationMs: c,
250
258
  startOnVisible: !0,
251
- retriggerOnReEntry: v,
259
+ retriggerOnReEntry: h,
252
260
  // `formatter` is the only path we use — it owns both the locale
253
261
  // formatting and the sign/suffix re-application.
254
- formatter: H
262
+ formatter: J
255
263
  });
256
- return g ? /* @__PURE__ */ z(
264
+ return o ? /* @__PURE__ */ b(
257
265
  "div",
258
266
  {
259
267
  ref: R,
260
268
  role: "group",
261
269
  "aria-busy": "true",
262
- "aria-label": d,
270
+ "aria-label": a,
263
271
  "data-component": "stat",
264
- className: P({ variant: x, size: y, align: I, className: j }),
272
+ className: P({ variant: y, size: N, align: I, className: j }),
265
273
  ...k,
266
274
  children: [
267
- /* @__PURE__ */ i("div", { className: "ds:h-[var(--skeleton-label-h)] ds:w-[var(--skeleton-label-w)] ds:animate-pulse ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]" }),
268
- /* @__PURE__ */ i("div", { className: "ds:h-[var(--skeleton-value-h)] ds:w-[var(--skeleton-value-w)] ds:animate-pulse ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]" })
275
+ /* @__PURE__ */ l("div", { className: "ds:h-[var(--skeleton-label-h)] ds:w-[var(--skeleton-label-w)] ds:animate-pulse ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]" }),
276
+ /* @__PURE__ */ l("div", { className: "ds:h-[var(--skeleton-value-h)] ds:w-[var(--skeleton-value-w)] ds:animate-pulse ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]" })
269
277
  ]
270
278
  }
271
- ) : /* @__PURE__ */ z(
279
+ ) : /* @__PURE__ */ b(
272
280
  "div",
273
281
  {
274
282
  ref: R,
275
283
  role: "group",
276
284
  "aria-labelledby": T,
277
285
  "data-component": "stat",
278
- className: P({ variant: x, size: y, align: I, className: j }),
286
+ className: P({ variant: y, size: N, align: I, className: j }),
279
287
  ...k,
280
288
  children: [
281
- /* @__PURE__ */ z("span", { className: "ds:inline-flex ds:items-center", children: [
282
- m && /* @__PURE__ */ i(
289
+ /* @__PURE__ */ b("span", { className: "ds:inline-flex ds:items-center", children: [
290
+ g && /* @__PURE__ */ l(
283
291
  "span",
284
292
  {
285
293
  "aria-hidden": "true",
@@ -292,41 +300,42 @@ const ct = X(
292
300
  "ds:text-[color:var(--accent)]",
293
301
  "ds:forced-colors:text-[CanvasText]"
294
302
  ].join(" "),
295
- children: m
303
+ children: g
296
304
  }
297
305
  ),
298
- /* @__PURE__ */ i(
306
+ /* @__PURE__ */ l(
299
307
  "span",
300
308
  {
301
309
  id: T,
302
310
  className: "type-label ds:text-[var(--muted-foreground)]",
303
- children: d
311
+ children: a
304
312
  }
305
313
  )
306
314
  ] }),
307
- _ ? (
315
+ q ? (
308
316
  // The animated number is wrapped in an `aria-live="off"` span
309
317
  // so screen readers don't announce every interpolated frame.
310
318
  // The `role="group"` ancestor (with `aria-labelledby` pointing
311
319
  // at the label) carries the final accessible reading — the
312
320
  // animated frames are decorative only.
313
- /* @__PURE__ */ i(
321
+ /* @__PURE__ */ l(
314
322
  "span",
315
323
  {
316
324
  ref: C.ref,
317
325
  "aria-live": "off",
318
- className: U({ size: y, variant: x, intent: M }),
326
+ className: U({ size: N, variant: y, intent: M }),
319
327
  children: C.value
320
328
  }
321
329
  )
322
- ) : /* @__PURE__ */ i("span", { className: U({ size: y, variant: x, intent: M }), children: Y }),
323
- o != null && l != null && /* @__PURE__ */ i(
324
- it,
330
+ ) : /* @__PURE__ */ l("span", { className: U({ size: N, variant: y, intent: M }), children: _ }),
331
+ i != null && d != null && /* @__PURE__ */ l(
332
+ dt,
325
333
  {
326
- trend: o,
327
- delta: l,
328
- deltaFormat: u,
329
- locale: e
334
+ trend: i,
335
+ delta: d,
336
+ deltaFormat: r,
337
+ locale: e,
338
+ polarity: m
330
339
  }
331
340
  )
332
341
  ]
@@ -338,4 +347,4 @@ ct.displayName = "Stat";
338
347
  export {
339
348
  ct as S
340
349
  };
341
- //# sourceMappingURL=stat-51CDL4au.js.map
350
+ //# sourceMappingURL=stat-DmjGfXND.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-DmjGfXND.js","sources":["../../src/components/stat/stat.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useId,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useCountUp } from '../../hooks/use-count-up';\n\n/* ------------------------------------------------------------------ */\n/* CVA — stat root */\n/* ------------------------------------------------------------------ */\n\n// `h-full` lets Stats grow to fill a flex / grid parent's cell, so a\n// row paired with taller cards (BenefitCard, Card, etc.) reads as a\n// matching set instead of mismatched heights. In a non-stretching\n// parent (block flow, inline) it's a no-op — block-size defers to\n// content as before. The flex-col inside still pins label/icon row\n// at the top and the number below, so growing the card adds the\n// extra space below the number instead of inserting it between\n// label and value.\nconst statVariants = cva('ds:flex ds:flex-col ds:h-full', {\n variants: {\n variant: {\n default: 'ds:gap-[var(--spacing-xs)]',\n outlined: [\n 'ds:gap-[var(--spacing-xs)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' '),\n // White card surface with the shared card shadow + border —\n // matches `Card variant=\"elevated\"` and `BenefitCard.elevated`\n // tokens (`--card`, `--card-border`, `--shadow-card`,\n // `--radius-lg`) so a grid of elevated Stats reads as a set of\n // shaded panels without nesting a Card around each one. The\n // border is essential in dark mode: shadow alone on a dark\n // surface loses contrast and the card boundary disappears.\n // `--surface-border-width` bumps it to 2px in the accessible themes,\n // matching Card / BenefitCard's 0.31.5 accessibility uplift.\n elevated: [\n 'ds:gap-[var(--spacing-xs)]',\n 'ds:bg-[var(--card)]',\n 'ds:text-[var(--card-foreground)]',\n 'ds:[:where(&)]:border-[length:var(--surface-border-width,var(--border-width-sm))] ds:border-[color:var(--card-border)]',\n 'ds:shadow-[var(--shadow-card)]',\n 'ds:rounded-[var(--radius-lg)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n // Forced-colors: UA strips shadow, so render a border as the\n // separation cue — mirrors Card's forced-colors behaviour.\n 'ds:forced-colors:border ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n compact: 'ds:gap-[var(--spacing-none)]',\n },\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n align: {\n start: 'ds:items-start ds:text-start',\n center: 'ds:items-center ds:text-center',\n end: 'ds:items-end ds:text-end',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n align: 'start',\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — value element */\n/* ------------------------------------------------------------------ */\n\nconst valueVariants = cva('type-metric', {\n variants: {\n size: {\n sm: 'ds:[--type-metric-size:var(--font-size-xl)]',\n md: 'ds:[--type-metric-size:var(--font-size-3xl)]',\n lg: 'ds:[--type-metric-size:var(--font-size-5xl)]',\n },\n variant: {\n default: '',\n outlined: '',\n elevated: '',\n compact: '',\n },\n // Colour of the headline metric value. Defaults to `--foreground`\n // (the existing render). `primary` / `accent` are the brand intents\n // — use for hero / marketing stats where the number IS the visual\n // marker. `success` / `destructive` / `info` / `warning` map to the\n // semantic tokens for KPI tiles that want to signal status via the\n // value colour itself (e.g. revenue green, debt red). The trend\n // chevron and the label colour are independent of this prop.\n intent: {\n foreground: 'ds:text-[var(--foreground)]',\n primary: 'ds:text-[var(--primary)]',\n accent: 'ds:text-[var(--accent)]',\n success: 'ds:text-[var(--success)]',\n destructive: 'ds:text-[var(--destructive)]',\n info: 'ds:text-[var(--info)]',\n warning: 'ds:text-[var(--warning)]',\n },\n },\n compoundVariants: [\n {\n variant: 'compact',\n size: 'sm',\n className: 'ds:[--type-metric-size:var(--font-size-lg)]',\n },\n {\n variant: 'compact',\n size: 'md',\n className: 'ds:[--type-metric-size:var(--font-size-xl)]',\n },\n {\n variant: 'compact',\n size: 'lg',\n className: 'ds:[--type-metric-size:var(--font-size-2xl)]',\n },\n ],\n defaultVariants: {\n size: 'md',\n variant: 'default',\n intent: 'foreground',\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — trend element */\n/* ------------------------------------------------------------------ */\n\nconst trendVariants = cva(\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-label',\n {\n variants: {\n // Whether the change is good news, not which way it went: with\n // `trendPolarity=\"lower-is-better\"` a fall is `better`.\n tone: {\n better: 'ds:text-[var(--success)]',\n worse: 'ds:text-[var(--destructive)]',\n neutral: 'ds:text-[var(--muted-foreground)]',\n },\n },\n defaultVariants: {\n tone: 'neutral',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* StatTrend (internal — not exported) */\n/* ------------------------------------------------------------------ */\n\n/** Which way is good news for a metric's trend. */\nexport type StatTrendPolarity = 'higher-is-better' | 'lower-is-better';\n\ninterface StatTrendProps {\n trend: 'up' | 'down' | 'flat';\n delta: number | string;\n deltaFormat?: 'decimal' | 'percent';\n locale?: string;\n polarity?: StatTrendPolarity;\n}\n\nconst ARROW = { up: '↑', down: '↓', flat: '→' } as const;\nconst TREND_KEY = {\n up: 'stat.trend.up',\n down: 'stat.trend.down',\n flat: 'stat.trend.flat',\n} as const;\n\nfunction StatTrend({\n trend,\n delta,\n deltaFormat = 'decimal',\n locale,\n polarity = 'higher-is-better',\n}: StatTrendProps) {\n const { t, i18n } = useTranslation('ui');\n\n const formattedDelta =\n typeof delta === 'string'\n ? delta\n : new Intl.NumberFormat(locale ?? i18n.language, {\n style: deltaFormat === 'percent' ? 'percent' : 'decimal',\n }).format(deltaFormat === 'percent' ? delta / 100 : delta);\n\n // The arrow follows the number; the colour and the spoken \"better\" or\n // \"worse\" follow the polarity, so the meaning never rests on colour.\n const tone =\n trend === 'flat'\n ? 'neutral'\n : (trend === 'up') === (polarity === 'higher-is-better')\n ? 'better'\n : 'worse';\n\n return (\n <span className={trendVariants({ tone })} data-trend-tone={tone}>\n <span aria-hidden=\"true\">{ARROW[trend]}</span>\n <span className=\"ds:sr-only\">{t(TREND_KEY[trend])}</span>\n {formattedDelta}\n {tone === 'neutral' ? null : (\n <span className=\"ds:sr-only\">\n {' '}\n {t(tone === 'better' ? 'stat.trend.better' : 'stat.trend.worse')}\n </span>\n )}\n </span>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Parse a string value into a numeric target for the count-up */\n/* ------------------------------------------------------------------ */\n\ntype ParsedValue = {\n /** Numeric target for the count-up. */\n target: number;\n /** Leading sign captured from the input string (e.g. \"+\" / \"-\"). */\n sign: '' | '+' | '-';\n /** Trailing shorthand suffix (e.g. \"K\" / \"M\" / \"B\") to re-append. */\n suffix: string;\n};\n\n/**\n * Strip locale-aware separators, a leading sign, and the K/M/B\n * shorthand suffix from a pre-formatted string so the count-up has a\n * pure numeric target to animate towards. Returns `null` for any input\n * that can't be parsed — the caller short-circuits to static rendering\n * in that case.\n */\nfunction parseStatValue(raw: string, locale: string): ParsedValue | null {\n const trimmed = raw.trim();\n if (trimmed === '') return null;\n\n // Capture leading sign so we can re-attach it every frame. Stat's\n // marketing usage (\"+500.000\", \"-12\") often relies on it.\n let sign: '' | '+' | '-' = '';\n let body = trimmed;\n if (body.startsWith('+')) {\n sign = '+';\n body = body.slice(1).trimStart();\n } else if (body.startsWith('-') || body.startsWith('−')) {\n // Hyphen-minus or the typographic minus sign — both treated as -.\n sign = '-';\n body = body.slice(1).trimStart();\n }\n\n // Trailing K / M / B shorthand (case-insensitive). Re-append verbatim\n // so \"+1.5K\" renders as \"+1.5K\" at every frame.\n let suffix = '';\n const suffixMatch = body.match(/[KMB]$/i);\n if (suffixMatch) {\n suffix = suffixMatch[0];\n body = body.slice(0, -1).trimEnd();\n }\n\n // Discover the locale's group + decimal glyphs from a probe value.\n // formatToParts is the canonical way; we fall back to `.` decimal /\n // `,` group if Intl can't tell us (no-locale envs).\n let group = '';\n let decimal = '.';\n try {\n const probe = new Intl.NumberFormat(locale).formatToParts(12345.6);\n for (const part of probe) {\n if (part.type === 'group') group = part.value;\n else if (part.type === 'decimal') decimal = part.value;\n }\n } catch {\n /* swallow — defaults already set */\n }\n\n // Heuristic for input strings that look like JS-native decimals\n // (e.g. `\"1500.25\"`) regardless of the requested locale: if the body\n // is a clean US-style decimal AND the fraction after the `.` is NOT\n // a three-digit thousands group in a locale that uses `.` as the\n // group separator, treat it as a direct numeric literal. This covers\n // the common case where a caller types `value=\"1500.25\"` and expects\n // the count-up to land on 1500.25 even though the output locale is\n // it-IT (which uses `.` for thousands).\n const usStyleMatch = body.match(/^(\\d+)\\.(\\d+)$/);\n if (usStyleMatch) {\n const fractionLen = usStyleMatch[2].length;\n if (!(fractionLen === 3 && group === '.')) {\n const direct = Number.parseFloat(body);\n if (Number.isFinite(direct)) {\n return { target: direct, sign, suffix };\n }\n }\n }\n\n // Strip every group separator we discovered, then normalise the\n // decimal separator to `.` so JS can parseFloat the result.\n // Note: when the locale's group separator is empty (e.g. some\n // numbering systems) the replace is a no-op.\n let normalised = body;\n if (group !== '') {\n normalised = normalised.split(group).join('');\n }\n if (decimal !== '.') {\n normalised = normalised.split(decimal).join('.');\n }\n\n // Defence-in-depth: strip whitespace plus NBSP (U+00A0) and NARROW\n // NO-BREAK SPACE (U+202F) that some locales (fr-FR, it-IT) use as\n // thousand separators. Hex escapes keep this source ASCII-clean.\n normalised = normalised.replace(/[\\s\\u00A0\\u202F]/g, '');\n\n const numeric = Number.parseFloat(normalised);\n if (!Number.isFinite(numeric)) return null;\n\n return { target: numeric, sign, suffix };\n}\n\n/* ------------------------------------------------------------------ */\n/* StatProps */\n/* ------------------------------------------------------------------ */\n\nexport interface StatProps\n extends HTMLAttributes<HTMLDivElement>, VariantProps<typeof statVariants> {\n /** Metric label rendered above the value. */\n label: string;\n /** Numeric or pre-formatted string value. */\n value: number | string;\n /** Number formatting style. Omit to use default decimal formatting. */\n format?: 'decimal' | 'currency' | 'percent';\n /** ISO 4217 currency code — required when format=\"currency\". */\n currency?: string;\n /** BCP 47 locale override. Defaults to the active i18n language. */\n locale?: string;\n /** Trend direction. Requires `delta` to render the trend row. */\n trend?: 'up' | 'down' | 'flat';\n /** Trend delta magnitude, e.g. 12 for \"↑ 12%\". */\n delta?: number | string;\n /**\n * Which way is good news. `higher-is-better` (default) shows a rise in\n * the success colour; `lower-is-better` (a no-show or cancellation rate,\n * a waiting time) shows a fall in it instead. The arrow always points the\n * way the number moved, and screen readers hear \"better\" or \"worse\".\n */\n trendPolarity?: StatTrendPolarity;\n /** Number formatting style for the delta. Default \"decimal\". */\n deltaFormat?: 'decimal' | 'percent';\n /** Optional leading icon rendered at the start of the label row. */\n icon?: ReactNode;\n /**\n * Colour of the headline value. Defaults to `foreground`. Brand\n * intents (`primary`, `accent`) are for hero / marketing stats where\n * the number is the visual marker. Semantic intents\n * (`success`, `destructive`, `info`, `warning`) signal status via\n * the value colour itself — e.g. revenue green, debt red on KPI\n * tiles. Trend chevron and label colour are independent.\n */\n intent?:\n | 'foreground'\n | 'primary'\n | 'accent'\n | 'success'\n | 'destructive'\n | 'info'\n | 'warning';\n /** Renders animated skeleton placeholders instead of content. */\n loading?: boolean;\n /**\n * Animate the numeric value from 0 (or from the captured leading\n * sign) to the final value when the Stat first scrolls into view.\n * Default `false`. Marketing surfaces opt in; dashboards leave it\n * off so live metrics render immediately.\n */\n animate?: boolean;\n /**\n * When `true`, the count-up re-plays every time the Stat scrolls\n * out of view and back in. Default `false` — animate once per\n * element per session, matching the booking-website hero pattern.\n * Ignored under `prefers-reduced-motion: reduce`.\n */\n animateOnEveryView?: boolean;\n /** Animation duration in milliseconds. Default 1600. */\n animateDurationMs?: number;\n /**\n * BCP 47 locale used for the per-frame count-up formatting. Falls\n * back to `locale`, then to the active i18n language.\n */\n animateLocale?: string;\n /**\n * Override the locale's thousand / decimal glyphs for the count-up.\n * Wins over locale defaults. Pass partial overrides — `decimal`\n * alone is valid; the unspecified separator stays at the locale\n * default.\n */\n animateSeparators?: {\n thousand?: string;\n decimal?: string;\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Stat */\n/* ------------------------------------------------------------------ */\n\nexport const Stat = forwardRef<HTMLDivElement, StatProps>(\n (\n {\n label,\n value,\n format,\n currency,\n locale,\n trend,\n trendPolarity,\n delta,\n deltaFormat = 'decimal',\n icon,\n loading = false,\n animate = false,\n animateOnEveryView = false,\n animateDurationMs = 1600,\n animateLocale,\n animateSeparators,\n variant = 'default',\n size = 'md',\n align = 'start',\n intent = 'foreground',\n className,\n ...props\n },\n ref,\n ) => {\n const { i18n } = useTranslation('ui');\n const labelId = useId();\n const lang = locale ?? i18n.language;\n\n /* -------------------------------------------------- */\n /* Static formatting — the value as it would appear */\n /* in the non-animated (or post-animation) state. */\n /* -------------------------------------------------- */\n\n const formatValue = useCallback((): string => {\n if (typeof value === 'string') return value;\n\n switch (format) {\n case 'currency':\n return new Intl.NumberFormat(lang, {\n style: 'currency',\n currency: currency ?? 'USD',\n }).format(value);\n case 'percent':\n return new Intl.NumberFormat(lang, { style: 'percent' }).format(\n value,\n );\n case 'decimal':\n return new Intl.NumberFormat(lang, { style: 'decimal' }).format(\n value,\n );\n default:\n return new Intl.NumberFormat(lang).format(value);\n }\n }, [value, format, lang, currency]);\n\n const staticValue = formatValue();\n\n /* -------------------------------------------------- */\n /* Parse the value into a numeric target for the */\n /* count-up. Numeric values use `value` directly; */\n /* string values are stripped of sign / shorthand / */\n /* locale separators and re-decorated each frame. */\n /* -------------------------------------------------- */\n\n const animationLocale = animateLocale ?? lang;\n const hasWarnedRef = useRef<boolean>(false);\n\n const parsed = useMemo<ParsedValue | null>(() => {\n if (!animate) return null;\n if (typeof value === 'number') {\n // Numeric: target is the number itself; no sign / suffix to\n // re-attach.\n return Number.isFinite(value)\n ? { target: value, sign: '', suffix: '' }\n : null;\n }\n return parseStatValue(value, animationLocale);\n }, [animate, value, animationLocale]);\n\n // Dev-mode warning when an animate-flagged Stat has an unparseable\n // string value. Render static, no throw — one warn per component.\n if (\n animate &&\n typeof value === 'string' &&\n parsed === null &&\n import.meta.env.DEV &&\n !hasWarnedRef.current\n ) {\n hasWarnedRef.current = true;\n console.warn(\n `Stat: value=\"${value}\" couldn't be parsed for the count-up animation. Rendering static.`,\n );\n }\n\n const shouldAnimate = animate && parsed !== null;\n\n /* -------------------------------------------------- */\n /* Wire the hook unconditionally — rules-of-hooks. */\n /* When `shouldAnimate` is false the hook still runs */\n /* but `to === from` so it's a no-op visually. */\n /* -------------------------------------------------- */\n\n const target = parsed?.target ?? 0;\n const sign = parsed?.sign ?? '';\n const suffix = parsed?.suffix ?? '';\n\n // Wrap the count-up formatter so the captured sign + suffix are\n // re-applied every frame. The hook hands us the locale-formatted\n // magnitude; we own the decoration around it.\n const formatter = useCallback(\n (n: number) => {\n // Use the absolute value for the magnitude so the captured\n // sign is the sole source of the rendered sign. Negative\n // numbers passed in (e.g. `to: -12`) come through unsigned;\n // we re-apply via `sign`. Always force `useGrouping: true` so\n // ICU's locale-default `min2` doesn't suppress the thousand\n // glyph on 4-digit values like 1.000 (it-IT). The user wrote\n // a stat value — they want it grouped.\n const magnitudeNF = (() => {\n try {\n return new Intl.NumberFormat(animationLocale, {\n useGrouping: true,\n });\n } catch {\n return null;\n }\n })();\n\n let magnitudeStr: string;\n if (magnitudeNF) {\n if (animateSeparators) {\n // Hand-build the grouped magnitude so we don't depend on\n // ICU's locale-by-locale grouping defaults (which differ\n // between engines and can drop the group at 4-digit\n // thresholds even with `useGrouping: true`). Locale only\n // influences sign handling, which we apply separately.\n const abs = Math.abs(n);\n const intPart = Math.trunc(abs);\n const fracPart = abs - intPart;\n const groupGlyph = animateSeparators.thousand ?? '';\n const intStr = String(intPart).replace(\n /\\B(?=(\\d{3})+(?!\\d))/g,\n groupGlyph,\n );\n if (fracPart === 0) {\n magnitudeStr = intStr;\n } else {\n const fracStr = fracPart.toFixed(6).replace(/0+$/, '').slice(2);\n const decimalGlyph = animateSeparators.decimal ?? '.';\n magnitudeStr = fracStr ? intStr + decimalGlyph + fracStr : intStr;\n }\n } else {\n magnitudeStr = magnitudeNF.format(Math.abs(n));\n }\n } else {\n magnitudeStr = String(Math.abs(n));\n }\n\n // Re-derive the sign every frame: the captured sign wins, but\n // a negative `to` with no leading sign in the source still\n // renders with a leading \"-\" so the final formatted output\n // matches locale conventions.\n let resolvedSign: string = sign;\n if (sign === '' && n < 0) resolvedSign = '-';\n\n return `${resolvedSign}${magnitudeStr}${suffix}`;\n },\n [animationLocale, animateSeparators, sign, suffix],\n );\n\n const countUp = useCountUp({\n to: target,\n from: 0,\n durationMs: animateDurationMs,\n startOnVisible: true,\n retriggerOnReEntry: animateOnEveryView,\n // `formatter` is the only path we use — it owns both the locale\n // formatting and the sign/suffix re-application.\n formatter,\n });\n\n /* -------------------------------------------------- */\n /* Loading state */\n /* -------------------------------------------------- */\n\n if (loading) {\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-busy=\"true\"\n aria-label={label}\n data-component=\"stat\"\n className={statVariants({ variant, size, align, className })}\n {...props}\n >\n <div className=\"ds:h-[var(--skeleton-label-h)] ds:w-[var(--skeleton-label-w)] ds:animate-pulse ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]\" />\n <div className=\"ds:h-[var(--skeleton-value-h)] ds:w-[var(--skeleton-value-w)] ds:animate-pulse ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]\" />\n </div>\n );\n }\n\n /* -------------------------------------------------- */\n /* Render */\n /* -------------------------------------------------- */\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-labelledby={labelId}\n data-component=\"stat\"\n className={statVariants({ variant, size, align, className })}\n {...props}\n >\n <span className=\"ds:inline-flex ds:items-center\">\n {icon && (\n <span\n aria-hidden=\"true\"\n className={[\n 'ds:me-[var(--spacing-xs)] ds:inline-flex ds:shrink-0',\n // Accent tint on the leading icon. The icon is decorative\n // (aria-hidden), so magenta-500's 3.2:1 contrast on white\n // is acceptable here — the Stat label + value still\n // carry the accessible name at `--foreground`.\n 'ds:text-[color:var(--accent)]',\n 'ds:forced-colors:text-[CanvasText]',\n ].join(' ')}\n >\n {icon}\n </span>\n )}\n <span\n id={labelId}\n className=\"type-label ds:text-[var(--muted-foreground)]\"\n >\n {label}\n </span>\n </span>\n {shouldAnimate ? (\n // The animated number is wrapped in an `aria-live=\"off\"` span\n // so screen readers don't announce every interpolated frame.\n // The `role=\"group\"` ancestor (with `aria-labelledby` pointing\n // at the label) carries the final accessible reading — the\n // animated frames are decorative only.\n <span\n ref={countUp.ref}\n aria-live=\"off\"\n className={valueVariants({ size, variant, intent })}\n >\n {countUp.value}\n </span>\n ) : (\n <span className={valueVariants({ size, variant, intent })}>\n {staticValue}\n </span>\n )}\n {trend != null && delta != null && (\n <StatTrend\n trend={trend}\n delta={delta}\n deltaFormat={deltaFormat}\n locale={locale}\n polarity={trendPolarity}\n />\n )}\n </div>\n );\n },\n);\n\nStat.displayName = 'Stat';\n"],"names":["statVariants","cva","valueVariants","trendVariants","ARROW","TREND_KEY","StatTrend","trend","delta","deltaFormat","locale","polarity","t","i18n","useTranslation","formattedDelta","tone","jsxs","jsx","parseStatValue","raw","trimmed","sign","body","suffix","suffixMatch","group","decimal","probe","part","usStyleMatch","direct","normalised","numeric","Stat","forwardRef","label","value","format","currency","trendPolarity","icon","loading","animate","animateOnEveryView","animateDurationMs","animateLocale","animateSeparators","variant","size","align","intent","className","props","ref","labelId","useId","lang","staticValue","useCallback","animationLocale","useRef","parsed","useMemo","shouldAnimate","target","formatter","n","magnitudeNF","magnitudeStr","abs","intPart","fracPart","groupGlyph","intStr","fracStr","decimalGlyph","resolvedSign","countUp","useCountUp"],"mappings":";;;;;AAyBA,MAAMA,IAAeC,EAAI,iCAAiC;AAAA,EACxD,UAAU;AAAA,IACR,SAAS;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,EACA,KAAK,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUV,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA;AAAA,QAGA;AAAA,MAAA,EACA,KAAK,GAAG;AAAA,MACV,SAAS;AAAA,IAAA;AAAA,IAEX,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,OAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,KAAK;AAAA,IAAA;AAAA,EACP;AAAA,EAEF,iBAAiB;AAAA,IACf,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAEX,CAAC,GAMKC,IAAgBD,EAAI,eAAe;AAAA,EACvC,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAAS;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,SAAS;AAAA,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASX,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,aAAa;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,IAAA;AAAA,EACX;AAAA,EAEF,kBAAkB;AAAA,IAChB;AAAA,MACE,SAAS;AAAA,MACT,MAAM;AAAA,MACN,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,SAAS;AAAA,MACT,MAAM;AAAA,MACN,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,SAAS;AAAA,MACT,MAAM;AAAA,MACN,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,EAAA;AAEZ,CAAC,GAMKE,KAAgBF;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA;AAAA;AAAA,MAGR,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,IAEF,iBAAiB;AAAA,MACf,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ,GAiBMG,KAAQ,EAAE,IAAI,KAAK,MAAM,KAAK,MAAM,IAAA,GACpCC,KAAY;AAAA,EAChB,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AACR;AAEA,SAASC,GAAU;AAAA,EACjB,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,QAAAC;AAAA,EACA,UAAAC,IAAW;AACb,GAAmB;AACjB,QAAM,EAAE,GAAAC,GAAG,MAAAC,MAASC,EAAe,IAAI,GAEjCC,IACJ,OAAOP,KAAU,WACbA,IACA,IAAI,KAAK,aAAaE,KAAUG,EAAK,UAAU;AAAA,IAC7C,OAAOJ,MAAgB,YAAY,YAAY;AAAA,EAAA,CAChD,EAAE,OAAOA,MAAgB,YAAYD,IAAQ,MAAMA,CAAK,GAIzDQ,IACJT,MAAU,SACN,YACCA,MAAU,SAAWI,MAAa,sBACjC,WACA;AAER,SACE,gBAAAM,EAAC,UAAK,WAAWd,GAAc,EAAE,MAAAa,EAAA,CAAM,GAAG,mBAAiBA,GACzD,UAAA;AAAA,IAAA,gBAAAE,EAAC,QAAA,EAAK,eAAY,QAAQ,UAAAd,GAAMG,CAAK,GAAE;AAAA,IACvC,gBAAAW,EAAC,UAAK,WAAU,cAAc,YAAEb,GAAUE,CAAK,CAAC,GAAE;AAAA,IACjDQ;AAAA,IACAC,MAAS,YAAY,OACpB,gBAAAC,EAAC,QAAA,EAAK,WAAU,cACb,UAAA;AAAA,MAAA;AAAA,MACAL,EAAEI,MAAS,WAAW,sBAAsB,kBAAkB;AAAA,IAAA,GACjE;AAAA,EAAA,GAEJ;AAEJ;AAsBA,SAASG,GAAeC,GAAaV,GAAoC;AACvE,QAAMW,IAAUD,EAAI,KAAA;AACpB,MAAIC,MAAY,GAAI,QAAO;AAI3B,MAAIC,IAAuB,IACvBC,IAAOF;AACX,EAAIE,EAAK,WAAW,GAAG,KACrBD,IAAO,KACPC,IAAOA,EAAK,MAAM,CAAC,EAAE,UAAA,MACZA,EAAK,WAAW,GAAG,KAAKA,EAAK,WAAW,GAAG,OAEpDD,IAAO,KACPC,IAAOA,EAAK,MAAM,CAAC,EAAE,UAAA;AAKvB,MAAIC,IAAS;AACb,QAAMC,IAAcF,EAAK,MAAM,SAAS;AACxC,EAAIE,MACFD,IAASC,EAAY,CAAC,GACtBF,IAAOA,EAAK,MAAM,GAAG,EAAE,EAAE,QAAA;AAM3B,MAAIG,IAAQ,IACRC,IAAU;AACd,MAAI;AACF,UAAMC,IAAQ,IAAI,KAAK,aAAalB,CAAM,EAAE,cAAc,OAAO;AACjE,eAAWmB,KAAQD;AACjB,MAAIC,EAAK,SAAS,UAASH,IAAQG,EAAK,QAC/BA,EAAK,SAAS,cAAWF,IAAUE,EAAK;AAAA,EAErD,QAAQ;AAAA,EAER;AAUA,QAAMC,IAAeP,EAAK,MAAM,gBAAgB;AAChD,MAAIO,KAEE,EADgBA,EAAa,CAAC,EAAE,WACd,KAAKJ,MAAU,MAAM;AACzC,UAAMK,IAAS,OAAO,WAAWR,CAAI;AACrC,QAAI,OAAO,SAASQ,CAAM;AACxB,aAAO,EAAE,QAAQA,GAAQ,MAAAT,GAAM,QAAAE,EAAA;AAAA,EAEnC;AAOF,MAAIQ,IAAaT;AACjB,EAAIG,MAAU,OACZM,IAAaA,EAAW,MAAMN,CAAK,EAAE,KAAK,EAAE,IAE1CC,MAAY,QACdK,IAAaA,EAAW,MAAML,CAAO,EAAE,KAAK,GAAG,IAMjDK,IAAaA,EAAW,QAAQ,qBAAqB,EAAE;AAEvD,QAAMC,IAAU,OAAO,WAAWD,CAAU;AAC5C,SAAK,OAAO,SAASC,CAAO,IAErB,EAAE,QAAQA,GAAS,MAAAX,GAAM,QAAAE,EAAA,IAFM;AAGxC;AAwFO,MAAMU,KAAOC;AAAA,EAClB,CACE;AAAA,IACE,OAAAC;AAAA,IACA,OAAAC;AAAA,IACA,QAAAC;AAAA,IACA,UAAAC;AAAA,IACA,QAAA7B;AAAA,IACA,OAAAH;AAAA,IACA,eAAAiC;AAAA,IACA,OAAAhC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,MAAAgC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,SAAAC,IAAU;AAAA,IACV,oBAAAC,IAAqB;AAAA,IACrB,mBAAAC,IAAoB;AAAA,IACpB,eAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,MAAAC,IAAO;AAAA,IACP,OAAAC,IAAQ;AAAA,IACR,QAAAC,IAAS;AAAA,IACT,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,MAAAzC,EAAA,IAASC,EAAe,IAAI,GAC9ByC,IAAUC,GAAA,GACVC,IAAO/C,KAAUG,EAAK,UA6BtB6C,IAtBcC,EAAY,MAAc;AAC5C,UAAI,OAAOtB,KAAU,SAAU,QAAOA;AAEtC,cAAQC,GAAA;AAAA,QACN,KAAK;AACH,iBAAO,IAAI,KAAK,aAAamB,GAAM;AAAA,YACjC,OAAO;AAAA,YACP,UAAUlB,KAAY;AAAA,UAAA,CACvB,EAAE,OAAOF,CAAK;AAAA,QACjB,KAAK;AACH,iBAAO,IAAI,KAAK,aAAaoB,GAAM,EAAE,OAAO,UAAA,CAAW,EAAE;AAAA,YACvDpB;AAAA,UAAA;AAAA,QAEJ,KAAK;AACH,iBAAO,IAAI,KAAK,aAAaoB,GAAM,EAAE,OAAO,UAAA,CAAW,EAAE;AAAA,YACvDpB;AAAA,UAAA;AAAA,QAEJ;AACE,iBAAO,IAAI,KAAK,aAAaoB,CAAI,EAAE,OAAOpB,CAAK;AAAA,MAAA;AAAA,IAErD,GAAG,CAACA,GAAOC,GAAQmB,GAAMlB,CAAQ,CAAC,EAEd,GASdqB,IAAkBd,KAAiBW;AACpB,IAAAI,GAAgB,EAAK;AAE1C,UAAMC,IAASC,GAA4B,MACpCpB,IACD,OAAON,KAAU,WAGZ,OAAO,SAASA,CAAK,IACxB,EAAE,QAAQA,GAAO,MAAM,IAAI,QAAQ,GAAA,IACnC,OAEClB,GAAekB,GAAOuB,CAAe,IARvB,MASpB,CAACjB,GAASN,GAAOuB,CAAe,CAAC,GAiB9BI,IAAgBrB,KAAWmB,MAAW,MAQtCG,KAASH,KAAA,gBAAAA,EAAQ,WAAU,GAC3BxC,KAAOwC,KAAA,gBAAAA,EAAQ,SAAQ,IACvBtC,KAASsC,KAAA,gBAAAA,EAAQ,WAAU,IAK3BI,IAAYP;AAAA,MAChB,CAACQ,MAAc;AAQb,cAAMC,KAAe,MAAM;AACzB,cAAI;AACF,mBAAO,IAAI,KAAK,aAAaR,GAAiB;AAAA,cAC5C,aAAa;AAAA,YAAA,CACd;AAAA,UACH,QAAQ;AACN,mBAAO;AAAA,UACT;AAAA,QACF,GAAA;AAEA,YAAIS;AACJ,YAAID;AACF,cAAIrB,GAAmB;AAMrB,kBAAMuB,IAAM,KAAK,IAAIH,CAAC,GAChBI,IAAU,KAAK,MAAMD,CAAG,GACxBE,IAAWF,IAAMC,GACjBE,IAAa1B,EAAkB,YAAY,IAC3C2B,IAAS,OAAOH,CAAO,EAAE;AAAA,cAC7B;AAAA,cACAE;AAAA,YAAA;AAEF,gBAAID,MAAa;AACf,cAAAH,IAAeK;AAAA,iBACV;AACL,oBAAMC,IAAUH,EAAS,QAAQ,CAAC,EAAE,QAAQ,OAAO,EAAE,EAAE,MAAM,CAAC,GACxDI,IAAe7B,EAAkB,WAAW;AAClD,cAAAsB,IAAeM,IAAUD,IAASE,IAAeD,IAAUD;AAAA,YAC7D;AAAA,UACF;AACE,YAAAL,IAAeD,EAAY,OAAO,KAAK,IAAID,CAAC,CAAC;AAAA;AAG/C,UAAAE,IAAe,OAAO,KAAK,IAAIF,CAAC,CAAC;AAOnC,YAAIU,IAAuBvD;AAC3B,eAAIA,MAAS,MAAM6C,IAAI,MAAGU,IAAe,MAElC,GAAGA,CAAY,GAAGR,CAAY,GAAG7C,CAAM;AAAA,MAChD;AAAA,MACA,CAACoC,GAAiBb,GAAmBzB,GAAME,CAAM;AAAA,IAAA,GAG7CsD,IAAUC,GAAW;AAAA,MACzB,IAAId;AAAA,MACJ,MAAM;AAAA,MACN,YAAYpB;AAAA,MACZ,gBAAgB;AAAA,MAChB,oBAAoBD;AAAA;AAAA;AAAA,MAGpB,WAAAsB;AAAA,IAAA,CACD;AAMD,WAAIxB,IAEA,gBAAAzB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAqC;AAAA,QACA,MAAK;AAAA,QACL,aAAU;AAAA,QACV,cAAYlB;AAAA,QACZ,kBAAe;AAAA,QACf,WAAWpC,EAAa,EAAE,SAAAgD,GAAS,MAAAC,GAAM,OAAAC,GAAO,WAAAE,GAAW;AAAA,QAC1D,GAAGC;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAAnC,EAAC,OAAA,EAAI,WAAU,qIAAoI;AAAA,UACnJ,gBAAAA,EAAC,OAAA,EAAI,WAAU,qIAAoI;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,IAUvJ,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAqC;AAAA,QACA,MAAK;AAAA,QACL,mBAAiBC;AAAA,QACjB,kBAAe;AAAA,QACf,WAAWvD,EAAa,EAAE,SAAAgD,GAAS,MAAAC,GAAM,OAAAC,GAAO,WAAAE,GAAW;AAAA,QAC1D,GAAGC;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAApC,EAAC,QAAA,EAAK,WAAU,kCACb,UAAA;AAAA,YAAAwB,KACC,gBAAAvB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,WAAW;AAAA,kBACT;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKA;AAAA,kBACA;AAAA,gBAAA,EACA,KAAK,GAAG;AAAA,gBAET,UAAAuB;AAAA,cAAA;AAAA,YAAA;AAAA,YAGL,gBAAAvB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAIqC;AAAA,gBACJ,WAAU;AAAA,gBAET,UAAAnB;AAAA,cAAA;AAAA,YAAA;AAAA,UACH,GACF;AAAA,UACC4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAMC,gBAAA9C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,KAAK4D,EAAQ;AAAA,gBACb,aAAU;AAAA,gBACV,WAAW5E,EAAc,EAAE,MAAA+C,GAAM,SAAAD,GAAS,QAAAG,GAAQ;AAAA,gBAEjD,UAAA2B,EAAQ;AAAA,cAAA;AAAA,YAAA;AAAA,cAGX,gBAAA5D,EAAC,QAAA,EAAK,WAAWhB,EAAc,EAAE,MAAA+C,GAAM,SAAAD,GAAS,QAAAG,EAAA,CAAQ,GACrD,UAAAO,GACH;AAAA,UAEDnD,KAAS,QAAQC,KAAS,QACzB,gBAAAU;AAAA,YAACZ;AAAA,YAAA;AAAA,cACC,OAAAC;AAAA,cACA,OAAAC;AAAA,cACA,aAAAC;AAAA,cACA,QAAAC;AAAA,cACA,UAAU8B;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEAN,GAAK,cAAc;"}
@@ -124,7 +124,11 @@ const K = [
124
124
  "ds:group-data-[state=open]/item:rotate-180"
125
125
  ].join(" "), sr = [
126
126
  "type-meta ds:text-[var(--muted-foreground)]",
127
- "ds:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]",
127
+ // Indented under the step title from 448px of accordion width (px, not
128
+ // rem: a container query in rem follows the host's root font size); narrower
129
+ // (a phone) the content takes the full width so a form or a list in it
130
+ // is not squeezed beside the step number.
131
+ "ds:ps-[var(--spacing-md)] ds:@[448px]/stepper:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]",
128
132
  "ds:pe-[var(--spacing-md)] ds:pb-[var(--spacing-sm)]",
129
133
  "ds:group-data-[state=open]/item:hidden"
130
134
  ].join(" "), ar = [
@@ -132,11 +136,18 @@ const K = [
132
136
  "ds:data-[state=open]:animate-[accordion-down_var(--animation-duration)_var(--ease-out)]",
133
137
  "ds:data-[state=closed]:animate-[accordion-up_var(--animation-duration)_var(--ease-in)]"
134
138
  ].join(" "), tr = [
135
- "ds:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]",
139
+ // Indented under the step title from 448px of accordion width (px, not
140
+ // rem: a container query in rem follows the host's root font size); narrower
141
+ // (a phone) the content takes the full width so a form or a list in it
142
+ // is not squeezed beside the step number.
143
+ "ds:ps-[var(--spacing-md)] ds:@[448px]/stepper:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]",
136
144
  "ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-md)]"
137
- ].join(" "), nr = b("ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]", {
138
- variants: {}
139
- }), or = P(
145
+ ].join(" "), nr = b(
146
+ "ds:@container/stepper ds:flex ds:w-full ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-sm)]",
147
+ {
148
+ variants: {}
149
+ }
150
+ ), or = P(
140
151
  ({
141
152
  activeStep: s,
142
153
  steps: i,
@@ -248,4 +259,4 @@ or.displayName = "StepperAccordion";
248
259
  export {
249
260
  or as S
250
261
  };
251
- //# sourceMappingURL=stepper-accordion-D7lnBGh2.js.map
262
+ //# sourceMappingURL=stepper-accordion-DDTSOUHc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepper-accordion-DDTSOUHc.js","sources":["../../src/components/_shared/stepper.ts","../../src/components/stepper-accordion/stepper-accordion.tsx"],"sourcesContent":["// Shared types + state machine for the two stepper variants:\n// - src/components/stepper-progress (lightweight progress bar + caption)\n// - src/components/stepper-accordion (vertical disclosure wizard)\n//\n// Both components consume `StepSpec` and the `stateForStep` helper so the\n// four-state machine (upcoming | current | completed | error) stays in one\n// place. Rename or removal is a MAJOR per src/docs/13-maintainability.mdx.\n\n/**\n * Consumer-supplied override for a step.\n *\n * - `completed` — the step holds a value; render the tick and let the user\n * back in to change it.\n * - `error` — the step's own validation failed; always wins.\n * - `unlocked` (1.11.0) — the step has been *reached* but holds no value of\n * its own. It renders exactly like an upcoming step, but the user may open\n * it. Added for flows whose final step can never report itself \"completed\"\n * because its validity belongs to a form inside it: without this, moving\n * the cursor backwards left that step HTML-`disabled` and unreachable.\n *\n * `'completed'` and `'error'` behave exactly as before, so consumers passing\n * either (or nothing) are unaffected. A consumer that reads this union back\n * in an exhaustive `switch` needs a case for `'unlocked'`; `StepState` — the\n * union such a switch usually runs on — is deliberately untouched.\n */\nexport type StepStatus = 'completed' | 'error' | 'unlocked';\n\nexport type StepState = 'upcoming' | 'current' | 'completed' | 'error';\n\nexport interface StepSpec {\n /** Visible step label — comes from the consumer, already translated. */\n label: string;\n /** Optional secondary line (kept short; shown in accordion + progress captions). */\n description?: string;\n /**\n * Consumer-explicit status override. `error` always wins; `completed` is\n * honoured only for steps at or beyond the active index so the active step\n * always keeps `current` (otherwise a consumer pre-setting `completed` on\n * every step would silently mask the current position). `unlocked` changes\n * reachability only — see `stepIsReachable` — and never the rendered state.\n */\n status?: StepStatus;\n}\n\nexport function stateForStep(\n index: number,\n activeStep: number,\n status?: StepStatus,\n): StepState {\n if (status === 'error') return 'error';\n if (index === activeStep) return 'current';\n if (status === 'completed') return 'completed';\n if (index < activeStep) return 'completed';\n // `unlocked` deliberately falls through: it is a reachability hint, not a\n // visual state, so the returned `StepState` union is unchanged and any\n // exhaustive switch a consumer already wrote keeps compiling.\n return 'upcoming';\n}\n\n/**\n * May the user open this step?\n *\n * Everything at or before the cursor is reachable, as is any step the\n * consumer has explicitly marked `completed`, `error` or `unlocked`.\n * Steps ahead of the cursor with no status stay locked, exactly as before.\n */\nexport function stepIsReachable(\n index: number,\n activeStep: number,\n status?: StepStatus,\n): boolean {\n if (status !== undefined) return true;\n return index <= activeStep;\n}\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { ChevronDown, Lock } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport {\n stateForStep,\n stepIsReachable,\n type StepSpec,\n type StepState,\n} from '../_shared/stepper';\n\n/* -------------------------------------------------------------------- */\n/* StepperAccordion */\n/* */\n/* Vertical disclosure wizard. The current step is expanded inline; */\n/* completed steps collapse to a one-line summary with an \"Edit\" hint */\n/* that re-opens them; upcoming steps are locked. Built on Radix */\n/* Accordion in controlled-single mode with collapsible=false so the */\n/* current panel always stays open. */\n/* -------------------------------------------------------------------- */\n\nconst STEP_VALUE_PREFIX = 'step-';\nconst makeValue = (index: number) => `${STEP_VALUE_PREFIX}${index}`;\nconst indexFromValue = (value: string): number =>\n Number(value.slice(STEP_VALUE_PREFIX.length));\n\n/* -------------------------------------------------------------------- */\n/* Indicator — shared with progress bar visual tone but sized for the */\n/* vertical wizard's dense header row. */\n/* -------------------------------------------------------------------- */\n\nconst iconDrawClasses = [\n 'ds:[stroke-dasharray:1] ds:[stroke-dashoffset:1]',\n 'ds:animate-[stepper-icon-draw_var(--animation-duration)_var(--ease-out)_forwards]',\n 'ds:motion-reduce:animate-none ds:motion-reduce:[stroke-dashoffset:0]',\n].join(' ');\n\nfunction CheckGlyph() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"ds:size-4\"\n >\n <path pathLength=\"1\" d=\"M5 12l5 5L20 7\" className={iconDrawClasses} />\n </svg>\n );\n}\n\nfunction CrossGlyph() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"ds:size-4\"\n >\n <path pathLength=\"1\" d=\"M6 6l12 12\" className={iconDrawClasses} />\n <path pathLength=\"1\" d=\"M18 6l-12 12\" className={iconDrawClasses} />\n </svg>\n );\n}\n\nconst indicatorClasses = [\n 'ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center',\n 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)]',\n 'ds:size-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:text-[var(--font-size-sm)] ds:font-[var(--font-weight-semibold)]',\n 'ds:border ds:border-[var(--border)]',\n 'ds:transition-[background-color,border-color,color]',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n].join(' ');\n\nconst indicatorVariants = cva(indicatorClasses, {\n variants: {\n state: {\n upcoming: 'ds:bg-[var(--background)] ds:text-[var(--muted-foreground)]',\n current: [\n 'ds:border-[var(--primary)] ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n 'ds:animate-[stepper-indicator-pop_var(--animation-duration)_var(--ease-out)_both]',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n completed:\n 'ds:border-[var(--primary)] ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n error: [\n 'ds:border-[var(--destructive)] ds:bg-[var(--destructive)] ds:text-[var(--destructive-foreground)]',\n 'ds:animate-[stepper-indicator-pop_var(--animation-duration)_var(--ease-out)_both]',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n },\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* Item / trigger / content variants */\n/* -------------------------------------------------------------------- */\n\nconst itemVariants = cva(\n [\n 'ds:group/item ds:overflow-hidden ds:rounded-[var(--radius-md)]',\n 'ds:[:where(&)]:border-[length:var(--surface-border-width,var(--border-width-sm))] ds:border-[color:var(--card-border)] ds:bg-[var(--card)]',\n 'ds:data-[state=open]:border-[var(--primary)]',\n 'ds:transition-[border-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n tone: {\n neutral: '',\n error: 'ds:data-[state=open]:border-[var(--destructive)]',\n },\n },\n defaultVariants: { tone: 'neutral' },\n },\n);\n\nconst triggerClasses = [\n 'ds:flex ds:w-full ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:text-start',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed',\n 'ds:transition-[background-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:hover:enabled:bg-[var(--muted)]/40',\n].join(' ');\n\nconst labelClasses = (state: StepState) =>\n [\n 'type-body-sm',\n state === 'current' || state === 'error'\n ? 'ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]'\n : state === 'completed'\n ? 'ds:text-[var(--foreground)]'\n : 'ds:text-[var(--muted-foreground)]',\n ].join(' ');\n\nconst descriptionClasses = [\n 'type-meta ds:text-[var(--muted-foreground)]',\n 'ds:mt-[var(--spacing-xs)]',\n].join(' ');\n\nconst hintClasses = [\n 'type-meta',\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:text-[var(--muted-foreground)]',\n].join(' ');\n\nconst chevronClasses = [\n 'ds:size-4 ds:shrink-0 ds:text-[var(--muted-foreground)]',\n 'ds:transition-transform ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:group-data-[state=open]/item:rotate-180',\n].join(' ');\n\nconst summaryClasses = [\n 'type-meta ds:text-[var(--muted-foreground)]',\n // Indented under the step title from 448px of accordion width (px, not\n // rem: a container query in rem follows the host's root font size); narrower\n // (a phone) the content takes the full width so a form or a list in it\n // is not squeezed beside the step number.\n 'ds:ps-[var(--spacing-md)] ds:@[448px]/stepper:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]',\n 'ds:pe-[var(--spacing-md)] ds:pb-[var(--spacing-sm)]',\n 'ds:group-data-[state=open]/item:hidden',\n].join(' ');\n\nconst contentClasses = [\n 'ds:overflow-hidden',\n 'ds:data-[state=open]:animate-[accordion-down_var(--animation-duration)_var(--ease-out)]',\n 'ds:data-[state=closed]:animate-[accordion-up_var(--animation-duration)_var(--ease-in)]',\n].join(' ');\n\nconst contentInnerClasses = [\n // Indented under the step title from 448px of accordion width (px, not\n // rem: a container query in rem follows the host's root font size); narrower\n // (a phone) the content takes the full width so a form or a list in it\n // is not squeezed beside the step number.\n 'ds:ps-[var(--spacing-md)] ds:@[448px]/stepper:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]',\n 'ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-md)]',\n].join(' ');\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\nexport interface AccordionStepSpec extends StepSpec {\n /** Form content rendered inside the expanded panel. */\n content: ReactNode;\n /**\n * One-line summary shown under the header when the step is completed\n * and its panel is collapsed. Typically a preview of the captured\n * data — \"Mario Rossi · 12/03/1985\".\n */\n summary?: ReactNode;\n}\n\n// A size container, so the step content can drop its indent when the\n// accordion itself is narrow (whatever the viewport).\nconst rootVariants = cva(\n 'ds:@container/stepper ds:flex ds:w-full ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-sm)]',\n {\n variants: {},\n },\n);\n\nexport interface StepperAccordionProps\n extends\n Omit<\n ComponentPropsWithoutRef<typeof AccordionPrimitive.Root>,\n 'type' | 'value' | 'defaultValue' | 'onValueChange' | 'collapsible'\n >,\n VariantProps<typeof rootVariants> {\n /** Active step (0-indexed). The matching panel is the one that is open. */\n activeStep: number;\n /** Step specs — each one provides its own content + optional summary. */\n steps: AccordionStepSpec[];\n /**\n * Fires when the user re-opens a completed step. Upcoming steps cannot\n * be activated — their triggers are disabled. The current step cannot\n * be collapsed (Radix `collapsible=false`).\n */\n onStepChange?: (index: number) => void;\n /** Override the default `aria-label` on the list wrapper. */\n 'aria-label'?: string;\n /**\n * Consumer-supplied instance id, surfaced as `data-component-id` so an\n * agent / UI bridge can address this instance.\n */\n id?: string;\n}\n\n/**\n * Imperative handle for agent-readiness. Routes state mutations through\n * the consumer's `onStepChange`, never mutating directly.\n */\nexport interface StepperAccordionHandle {\n getCurrentStep: () => number;\n getTotalSteps: () => number;\n /** Indices of currently-open panels — singleton under Radix `type=\"single\"`. */\n getOpenSteps: () => number[];\n gotoStep: (step: number) => void;\n next: () => void;\n previous: () => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nconst StepperAccordion = forwardRef<\n StepperAccordionHandle,\n StepperAccordionProps\n>(\n (\n {\n activeStep,\n steps,\n onStepChange,\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const total = steps.length;\n const clampedActive = Math.max(0, Math.min(activeStep, total - 1));\n const label = ariaLabel ?? t('navigation.stepper.label');\n const editCopy = t('navigation.stepper.edit');\n const openCopy = t('navigation.stepper.open');\n const lockedCopy = t('navigation.stepper.locked');\n const completedCopy = t('navigation.stepper.completed');\n const errorCopy = t('navigation.stepper.error');\n\n const handleValueChange = (value: string) => {\n // `collapsible=false` prevents empty-string values in practice, but the\n // primitive's type still allows one — guard anyway.\n if (!value) return;\n const index = indexFromValue(value);\n if (Number.isFinite(index) && index !== clampedActive) {\n onStepChange?.(index);\n }\n };\n\n const handle = useMemo<StepperAccordionHandle>(\n () => ({\n getCurrentStep: () => clampedActive,\n getTotalSteps: () => total,\n getOpenSteps: () => [clampedActive],\n gotoStep: (step: number) => {\n if (!onStepChange) return;\n const clamped = Math.max(0, Math.min(step, Math.max(total - 1, 0)));\n if (clamped !== clampedActive) onStepChange(clamped);\n },\n next: () => {\n if (!onStepChange) return;\n if (clampedActive < total - 1) onStepChange(clampedActive + 1);\n },\n previous: () => {\n if (!onStepChange) return;\n if (clampedActive > 0) onStepChange(clampedActive - 1);\n },\n }),\n [clampedActive, total, onStepChange],\n );\n useImperativeHandle(ref, () => handle, [handle]);\n\n return (\n <AccordionPrimitive.Root\n type=\"single\"\n value={makeValue(clampedActive)}\n onValueChange={handleValueChange}\n collapsible={false}\n // Radix renders a plain div, and aria-label is prohibited on the\n // generic role. `group` lets the label name the set of steps.\n role=\"group\"\n aria-label={label}\n id={id}\n data-component=\"stepper-accordion\"\n data-component-id={id}\n className={rootVariants({ className })}\n {...rest}\n >\n {steps.map((spec, index) => {\n const state = stateForStep(index, clampedActive, spec.status);\n const isCurrent = state === 'current' || state === 'error';\n const isUpcoming = state === 'upcoming';\n // An `unlocked` step renders as `upcoming` but stays reachable —\n // only a step that is BOTH upcoming and unreachable is locked.\n const isLocked =\n isUpcoming && !stepIsReachable(index, clampedActive, spec.status);\n const itemTone = state === 'error' ? 'error' : 'neutral';\n const stepN = t('navigation.stepper.stepN', { n: index + 1 });\n\n const indicatorContent = (() => {\n if (state === 'completed') {\n return (\n <>\n <CheckGlyph />\n <span className=\"ds:sr-only\">{completedCopy}</span>\n </>\n );\n }\n if (state === 'error') {\n return (\n <>\n <CrossGlyph />\n <span className=\"ds:sr-only\">{errorCopy}</span>\n </>\n );\n }\n return <span>{index + 1}</span>;\n })();\n\n const hint = (() => {\n if (state === 'completed') {\n return <span className={hintClasses}>{editCopy}</span>;\n }\n if (isLocked) {\n return (\n <span className={hintClasses}>\n <Lock aria-hidden=\"true\" className=\"ds:size-3\" />\n {lockedCopy}\n </span>\n );\n }\n if (isUpcoming) {\n // Reachable but empty — say so, otherwise the row reads\n // identically to a locked one and nothing signals it opens.\n return <span className={hintClasses}>{openCopy}</span>;\n }\n return null;\n })();\n\n return (\n <AccordionPrimitive.Item\n key={index}\n value={makeValue(index)}\n data-step-id={String(index)}\n className={itemVariants({ tone: itemTone })}\n >\n <AccordionPrimitive.Header className=\"ds:flex\">\n <AccordionPrimitive.Trigger\n // Locked steps (upcoming, and not marked reachable by a\n // `completed` / `error` / `unlocked` status) are *HTML*-\n // disabled — they must not be\n // reachable by Tab or by Radix's arrow-key navigation ring\n // (Radix filters `item.ref.current?.disabled`, which is\n // the HTML attribute). Current is only *ARIA*-disabled so\n // keyboard users can Tab to it as a heading anchor and\n // hear \"current step\"; Radix's `collapsible=false` makes\n // the click a no-op regardless. Setting `disabled` at the\n // Trigger rather than the Item because `...triggerProps`\n // spreads after Collapsible writes its own `disabled`\n // from context, so the Item-level disabled gets overridden.\n disabled={isLocked}\n aria-disabled={isCurrent || undefined}\n // The hint is rendered text, but `aria-label` overrides\n // element content wholesale — so the affordance has to be\n // appended here too or AT hears none of it.\n aria-label={\n state === 'completed'\n ? `${stepN}, ${editCopy}`\n : isUpcoming && !isLocked\n ? `${stepN}, ${openCopy}`\n : stepN\n }\n aria-current={isCurrent ? 'step' : undefined}\n className={triggerClasses}\n >\n <span\n aria-hidden=\"true\"\n className={indicatorVariants({ state })}\n >\n {indicatorContent}\n </span>\n <span className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col\">\n <span className={labelClasses(state)}>{spec.label}</span>\n {spec.description ? (\n <span className={descriptionClasses}>\n {spec.description}\n </span>\n ) : null}\n </span>\n {hint}\n {isCurrent ? null : (\n <ChevronDown\n aria-hidden=\"true\"\n className={chevronClasses}\n />\n )}\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n {spec.summary && state === 'completed' ? (\n <div className={summaryClasses}>{spec.summary}</div>\n ) : null}\n <AccordionPrimitive.Content className={contentClasses}>\n <div className={contentInnerClasses}>{spec.content}</div>\n </AccordionPrimitive.Content>\n </AccordionPrimitive.Item>\n );\n })}\n </AccordionPrimitive.Root>\n );\n },\n);\nStepperAccordion.displayName = 'StepperAccordion';\n\nexport { StepperAccordion };\n"],"names":["stateForStep","index","activeStep","status","stepIsReachable","STEP_VALUE_PREFIX","makeValue","indexFromValue","value","iconDrawClasses","CheckGlyph","jsx","CrossGlyph","jsxs","indicatorClasses","indicatorVariants","cva","itemVariants","triggerClasses","labelClasses","state","descriptionClasses","hintClasses","chevronClasses","summaryClasses","contentClasses","contentInnerClasses","rootVariants","StepperAccordion","forwardRef","steps","onStepChange","ariaLabel","id","className","rest","ref","t","useTranslation","total","clampedActive","label","editCopy","openCopy","lockedCopy","completedCopy","errorCopy","handleValueChange","handle","useMemo","step","clamped","useImperativeHandle","AccordionPrimitive","spec","isCurrent","isUpcoming","isLocked","itemTone","stepN","indicatorContent","Fragment","hint","Lock","ChevronDown"],"mappings":"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"}
@@ -6,14 +6,14 @@ import { A as M } from "./alert-BhCstf2h.js";
6
6
  import { B as Me } from "./button-Bn16lcFM.js";
7
7
  import { I as We } from "./icon-button-COX76Jdj.js";
8
8
  import { C as Qe } from "./combobox-U5yfO6o0.js";
9
- import { D as ce } from "./dialog-D52AI4nF.js";
9
+ import { D as ce } from "./dialog-CUzbnKLw.js";
10
10
  import { D as Bt } from "./date-picker-wRAcq2lt.js";
11
11
  import { F as H } from "./form-field-Ani72sVY.js";
12
12
  import { I as Ft } from "./icon-button-group-C5hhI-R5.js";
13
13
  import { P as Pt } from "./panel-header-D_mTdhUp.js";
14
14
  import { P as Ot } from "./panel-subview-BT-Apwgb.js";
15
15
  import { R as Pe } from "./radio-BBbMdbE_.js";
16
- import { R as jt } from "./radio-group-BT97ty7o.js";
16
+ import { R as jt } from "./radio-group-DicxWJXP.js";
17
17
  import { S as Mt } from "./scroll-area-ZtFCv9K7.js";
18
18
  import { S as Ke } from "./select-Ce5RMk93.js";
19
19
  import { S as He } from "./skeleton-B1KTdJ4N.js";
@@ -1238,4 +1238,4 @@ export {
1238
1238
  vo as T,
1239
1239
  lo as t
1240
1240
  };
1241
- //# sourceMappingURL=task-editor-Ctxsa1BY.js.map
1241
+ //# sourceMappingURL=task-editor-ByyRu29Y.js.map