@alfadocs/ui-kit-debug 1.55.0 → 1.57.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 (448) hide show
  1. package/dist/_chunks/{ai-credits-notice-BoNJtOuE.js → ai-credits-notice-ktklr8fy.js} +2 -2
  2. package/dist/_chunks/{ai-credits-notice-BoNJtOuE.js.map → ai-credits-notice-ktklr8fy.js.map} +1 -1
  3. package/dist/_chunks/ai-permission-notice-DyuEGwAt.js +206 -0
  4. package/dist/_chunks/ai-permission-notice-DyuEGwAt.js.map +1 -0
  5. package/dist/_chunks/alia-sidebar-BBKBJCv6.js +1284 -0
  6. package/dist/_chunks/alia-sidebar-BBKBJCv6.js.map +1 -0
  7. package/dist/_chunks/{anamnesis-summary-rows-Dtw5Hpg4.js → anamnesis-summary-rows-CCQ62mMN.js} +5 -5
  8. package/dist/_chunks/{anamnesis-summary-rows-Dtw5Hpg4.js.map → anamnesis-summary-rows-CCQ62mMN.js.map} +1 -1
  9. package/dist/_chunks/{appointment-peek-BIZaDeCi.js → appointment-peek-WvNbE4JG.js} +2 -2
  10. package/dist/_chunks/{appointment-peek-BIZaDeCi.js.map → appointment-peek-WvNbE4JG.js.map} +1 -1
  11. package/dist/_chunks/{appointment-timeline-DmqYEIT9.js → appointment-timeline-Z0494xO-.js} +2 -2
  12. package/dist/_chunks/{appointment-timeline-DmqYEIT9.js.map → appointment-timeline-Z0494xO-.js.map} +1 -1
  13. package/dist/_chunks/{balance-badge-cell-zP-iN-Pd.js → balance-badge-cell-CII3SDmR.js} +3 -3
  14. package/dist/_chunks/{balance-badge-cell-zP-iN-Pd.js.map → balance-badge-cell-CII3SDmR.js.map} +1 -1
  15. package/dist/_chunks/{bmi-calculator-DTZhRhXe.js → bmi-calculator-C0UTxB7R.js} +2 -2
  16. package/dist/_chunks/{bmi-calculator-DTZhRhXe.js.map → bmi-calculator-C0UTxB7R.js.map} +1 -1
  17. package/dist/_chunks/{booking-uZO10TLK.js → booking-81WnKDsH.js} +4 -4
  18. package/dist/_chunks/{booking-uZO10TLK.js.map → booking-81WnKDsH.js.map} +1 -1
  19. package/dist/_chunks/{breadcrumb-xgVpPH2H.js → breadcrumb-Boan-5n8.js} +39 -39
  20. package/dist/_chunks/breadcrumb-Boan-5n8.js.map +1 -0
  21. package/dist/_chunks/{calculator-dialog-BRjZMWuE.js → calculator-dialog-CzQv03p0.js} +2 -2
  22. package/dist/_chunks/{calculator-dialog-BRjZMWuE.js.map → calculator-dialog-CzQv03p0.js.map} +1 -1
  23. package/dist/_chunks/{calendar-workspace-DVajSkKA.js → calendar-workspace-D5-k_9zE.js} +15 -15
  24. package/dist/_chunks/{calendar-workspace-DVajSkKA.js.map → calendar-workspace-D5-k_9zE.js.map} +1 -1
  25. package/dist/_chunks/{care-plan-card-Ddjh5Doc.js → care-plan-card-DxrRLRdW.js} +2 -2
  26. package/dist/_chunks/{care-plan-card-Ddjh5Doc.js.map → care-plan-card-DxrRLRdW.js.map} +1 -1
  27. package/dist/_chunks/{care-plan-header-BeMYMiI7.js → care-plan-header-BMwZIgHJ.js} +3 -3
  28. package/dist/_chunks/{care-plan-header-BeMYMiI7.js.map → care-plan-header-BMwZIgHJ.js.map} +1 -1
  29. package/dist/_chunks/chart-DQ5GxqgT.js +906 -0
  30. package/dist/_chunks/chart-DQ5GxqgT.js.map +1 -0
  31. package/dist/_chunks/{clinical-note-card-14JIoUR0.js → clinical-note-card-hx939bvw.js} +2 -2
  32. package/dist/_chunks/{clinical-note-card-14JIoUR0.js.map → clinical-note-card-hx939bvw.js.map} +1 -1
  33. package/dist/_chunks/{color-picker-BRQ4Y9SO.js → color-picker-BsggJovx.js} +128 -123
  34. package/dist/_chunks/color-picker-BsggJovx.js.map +1 -0
  35. package/dist/_chunks/{contact-card-CmK05vNb.js → contact-card-fHBMwEsx.js} +2 -2
  36. package/dist/_chunks/{contact-card-CmK05vNb.js.map → contact-card-fHBMwEsx.js.map} +1 -1
  37. package/dist/_chunks/{contact-profile-card-C5DbP_X3.js → contact-profile-card-CMyBYgRR.js} +3 -3
  38. package/dist/_chunks/{contact-profile-card-C5DbP_X3.js.map → contact-profile-card-CMyBYgRR.js.map} +1 -1
  39. package/dist/_chunks/{cycle-calculator-Dgfqr4Q4.js → cycle-calculator-Cww9DzIa.js} +2 -2
  40. package/dist/_chunks/{cycle-calculator-Dgfqr4Q4.js.map → cycle-calculator-Cww9DzIa.js.map} +1 -1
  41. package/dist/_chunks/dashboard-grid-DfEY2qci.js +844 -0
  42. package/dist/_chunks/dashboard-grid-DfEY2qci.js.map +1 -0
  43. package/dist/_chunks/{data-table-C6T31E33.js → data-table-fAMTeAjM.js} +2 -2
  44. package/dist/_chunks/{data-table-C6T31E33.js.map → data-table-fAMTeAjM.js.map} +1 -1
  45. package/dist/_chunks/{data-table-tabs-Xhg5G0gU.js → data-table-tabs-CHYAAeHy.js} +2 -2
  46. package/dist/_chunks/{data-table-tabs-Xhg5G0gU.js.map → data-table-tabs-CHYAAeHy.js.map} +1 -1
  47. package/dist/_chunks/{date-picker-wRAcq2lt.js → date-picker-BSZuKo13.js} +69 -62
  48. package/dist/_chunks/date-picker-BSZuKo13.js.map +1 -0
  49. package/dist/_chunks/{date-range-picker-BOvHwWO5.js → date-range-picker-CFk-5O3R.js} +188 -177
  50. package/dist/_chunks/date-range-picker-CFk-5O3R.js.map +1 -0
  51. package/dist/_chunks/{date-time-picker-CLeLKuv9.js → date-time-picker-CjxTkblD.js} +92 -85
  52. package/dist/_chunks/date-time-picker-CjxTkblD.js.map +1 -0
  53. package/dist/_chunks/{dependent-selector-Bet3XAFj.js → dependent-selector-DgaAQc-c.js} +91 -86
  54. package/dist/_chunks/dependent-selector-DgaAQc-c.js.map +1 -0
  55. package/dist/_chunks/{dialog-D52AI4nF.js → dialog-Dn-iQ0Jp.js} +86 -69
  56. package/dist/_chunks/dialog-Dn-iQ0Jp.js.map +1 -0
  57. package/dist/_chunks/{document-preview-uoTekVR7.js → document-preview-CHGGG0l_.js} +2 -2
  58. package/dist/_chunks/{document-preview-uoTekVR7.js.map → document-preview-CHGGG0l_.js.map} +1 -1
  59. package/dist/_chunks/{due-date-calculator-DXDJbUzo.js → due-date-calculator-D_qFUiHp.js} +3 -3
  60. package/dist/_chunks/{due-date-calculator-DXDJbUzo.js.map → due-date-calculator-D_qFUiHp.js.map} +1 -1
  61. package/dist/_chunks/{entity-summary-DcB0fIiv.js → entity-summary-CWcCSThK.js} +2 -2
  62. package/dist/_chunks/{entity-summary-DcB0fIiv.js.map → entity-summary-CWcCSThK.js.map} +1 -1
  63. package/dist/_chunks/{file-manager-dIJQUZvq.js → file-manager-CFsL1KVt.js} +4 -4
  64. package/dist/_chunks/{file-manager-dIJQUZvq.js.map → file-manager-CFsL1KVt.js.map} +1 -1
  65. package/dist/_chunks/{freemium-paywall-B6ojVXq7.js → freemium-paywall-DIKuhX8b.js} +90 -86
  66. package/dist/_chunks/freemium-paywall-DIKuhX8b.js.map +1 -0
  67. package/dist/_chunks/{gestational-age-calculator-BfGpt3du.js → gestational-age-calculator-CZi43xKG.js} +3 -3
  68. package/dist/_chunks/{gestational-age-calculator-BfGpt3du.js.map → gestational-age-calculator-CZi43xKG.js.map} +1 -1
  69. package/dist/_chunks/{hcg-doubling-BIYyI2Yo.js → hcg-doubling-Ccvh7OaU.js} +2 -2
  70. package/dist/_chunks/{hcg-doubling-BIYyI2Yo.js.map → hcg-doubling-Ccvh7OaU.js.map} +1 -1
  71. package/dist/_chunks/{header-settings-ge_3gYEq.js → header-settings-BMcCx2LC.js} +2 -2
  72. package/dist/_chunks/{header-settings-ge_3gYEq.js.map → header-settings-BMcCx2LC.js.map} +1 -1
  73. package/dist/_chunks/{heatmap-BARGZZt2.js → heatmap-BEeOThkW.js} +2 -2
  74. package/dist/_chunks/{heatmap-BARGZZt2.js.map → heatmap-BEeOThkW.js.map} +1 -1
  75. package/dist/_chunks/{help-me-write-templates-B7L3zGsE.js → help-me-write-templates-BUoYGo6f.js} +2 -2
  76. package/dist/_chunks/help-me-write-templates-BUoYGo6f.js.map +1 -0
  77. package/dist/_chunks/{hover-card-BnTueNS2.js → hover-card-U_ZYoh1n.js} +201 -187
  78. package/dist/_chunks/hover-card-U_ZYoh1n.js.map +1 -0
  79. package/dist/_chunks/{icon-picker-DWrqmI1c.js → icon-picker-C86lQTIA.js} +2 -2
  80. package/dist/_chunks/{icon-picker-DWrqmI1c.js.map → icon-picker-C86lQTIA.js.map} +1 -1
  81. package/dist/_chunks/{info-tip-B0jmIt6M.js → info-tip-CJpNpzZe.js} +2 -2
  82. package/dist/_chunks/{info-tip-B0jmIt6M.js.map → info-tip-CJpNpzZe.js.map} +1 -1
  83. package/dist/_chunks/{key-value-pair-Ax8IJr1M.js → key-value-pair-BNNITp6S.js} +25 -19
  84. package/dist/_chunks/key-value-pair-BNNITp6S.js.map +1 -0
  85. package/dist/_chunks/{kit-extensions-C9-v8Dih.js → kit-extensions-DYVxWcqv.js} +5 -5
  86. package/dist/_chunks/{kit-extensions-C9-v8Dih.js.map → kit-extensions-DYVxWcqv.js.map} +1 -1
  87. package/dist/_chunks/{link-cell-renderer-DlBVPMTi.js → link-cell-renderer-CxW_oLa5.js} +2 -2
  88. package/dist/_chunks/{link-cell-renderer-DlBVPMTi.js.map → link-cell-renderer-CxW_oLa5.js.map} +1 -1
  89. package/dist/_chunks/link-gRw3NtOt.js +137 -0
  90. package/dist/_chunks/link-gRw3NtOt.js.map +1 -0
  91. package/dist/_chunks/{locale-picker-DfNSdOpy.js → locale-picker-BGfrZyTw.js} +2 -2
  92. package/dist/_chunks/{locale-picker-DfNSdOpy.js.map → locale-picker-BGfrZyTw.js.map} +1 -1
  93. package/dist/_chunks/{marketplace-app-shell-Dcx-JEjg.js → marketplace-app-shell-BZcA9Z06.js} +143 -129
  94. package/dist/_chunks/marketplace-app-shell-BZcA9Z06.js.map +1 -0
  95. package/dist/_chunks/{message-tray-BB95DA82.js → message-tray-QKQutwxj.js} +76 -69
  96. package/dist/_chunks/message-tray-QKQutwxj.js.map +1 -0
  97. package/dist/_chunks/{nav-grid-BqCPH8sm.js → nav-grid-Byx8PxuB.js} +2 -2
  98. package/dist/_chunks/{nav-grid-BqCPH8sm.js.map → nav-grid-Byx8PxuB.js.map} +1 -1
  99. package/dist/_chunks/non-modal-tab-exit-j3CPOuE3.js +89 -0
  100. package/dist/_chunks/non-modal-tab-exit-j3CPOuE3.js.map +1 -0
  101. package/dist/_chunks/{note-attachment-I1NLoeRZ.js → note-attachment-Bt2cddsZ.js} +2 -2
  102. package/dist/_chunks/{note-attachment-I1NLoeRZ.js.map → note-attachment-Bt2cddsZ.js.map} +1 -1
  103. package/dist/_chunks/{note-timeline-CsY8YOE7.js → note-timeline-CX9nAgAR.js} +2 -2
  104. package/dist/_chunks/{note-timeline-CsY8YOE7.js.map → note-timeline-CX9nAgAR.js.map} +1 -1
  105. package/dist/_chunks/{notes-panel-I8ntrrUW.js → notes-panel-Cm4pttpl.js} +4 -4
  106. package/dist/_chunks/{notes-panel-I8ntrrUW.js.map → notes-panel-Cm4pttpl.js.map} +1 -1
  107. package/dist/_chunks/{notification-tray-__sJXnsz.js → notification-tray-C5VtbGjd.js} +83 -76
  108. package/dist/_chunks/notification-tray-C5VtbGjd.js.map +1 -0
  109. package/dist/_chunks/{patient-details-DsTtjpuX.js → patient-details-99kEdtc5.js} +2 -2
  110. package/dist/_chunks/{patient-details-DsTtjpuX.js.map → patient-details-99kEdtc5.js.map} +1 -1
  111. package/dist/_chunks/{patient-field-row-BvZ9luz-.js → patient-field-row-DkxY13T6.js} +5 -5
  112. package/dist/_chunks/{patient-field-row-BvZ9luz-.js.map → patient-field-row-DkxY13T6.js.map} +1 -1
  113. package/dist/_chunks/{patient-summary-card-3dspc2tR.js → patient-summary-card-opdyfeW2.js} +10 -6
  114. package/dist/_chunks/{patient-summary-card-3dspc2tR.js.map → patient-summary-card-opdyfeW2.js.map} +1 -1
  115. package/dist/_chunks/{payment-automation-upsell-DEUfM7EU.js → payment-automation-upsell-DiHovmUL.js} +2 -2
  116. package/dist/_chunks/{payment-automation-upsell-DEUfM7EU.js.map → payment-automation-upsell-DiHovmUL.js.map} +1 -1
  117. package/dist/_chunks/{payment-request-card-DAGqh9Yx.js → payment-request-card-DAniJNLX.js} +3 -3
  118. package/dist/_chunks/{payment-request-card-DAGqh9Yx.js.map → payment-request-card-DAniJNLX.js.map} +1 -1
  119. package/dist/_chunks/{pdf-viewer-C3minW5b.js → pdf-viewer-CNQxa4tv.js} +396 -391
  120. package/dist/_chunks/pdf-viewer-CNQxa4tv.js.map +1 -0
  121. package/dist/_chunks/{periodontal-chart-BqwLxy2m.js → periodontal-chart-DD5C0M3l.js} +2 -2
  122. package/dist/_chunks/{periodontal-chart-BqwLxy2m.js.map → periodontal-chart-DD5C0M3l.js.map} +1 -1
  123. package/dist/_chunks/{periodontal-chart-card-CWZ1YM1h.js → periodontal-chart-card-CxdXvsPU.js} +2 -2
  124. package/dist/_chunks/{periodontal-chart-card-CWZ1YM1h.js.map → periodontal-chart-card-CxdXvsPU.js.map} +1 -1
  125. package/dist/_chunks/{periodontal-diagnosis-C9IuvLId.js → periodontal-diagnosis-D-PJv7KS.js} +2 -2
  126. package/dist/_chunks/{periodontal-diagnosis-C9IuvLId.js.map → periodontal-diagnosis-D-PJv7KS.js.map} +1 -1
  127. package/dist/_chunks/{phone-input-DxkHMYmu.js → phone-input-O9camxkq.js} +156 -151
  128. package/dist/_chunks/phone-input-O9camxkq.js.map +1 -0
  129. package/dist/_chunks/popover-BG75rYjN.js +367 -0
  130. package/dist/_chunks/popover-BG75rYjN.js.map +1 -0
  131. package/dist/_chunks/{position-grid-D2D5_Tze.js → position-grid-CBB88EaH.js} +38 -36
  132. package/dist/_chunks/position-grid-CBB88EaH.js.map +1 -0
  133. package/dist/_chunks/{practice-results-DxOgbPDy.js → practice-results-CfRkjzsI.js} +2 -2
  134. package/dist/_chunks/{practice-results-DxOgbPDy.js.map → practice-results-CfRkjzsI.js.map} +1 -1
  135. package/dist/_chunks/{pregnancy-dating-R3q5n1Wh.js → pregnancy-dating-BFzv9g1N.js} +3 -3
  136. package/dist/_chunks/{pregnancy-dating-R3q5n1Wh.js.map → pregnancy-dating-BFzv9g1N.js.map} +1 -1
  137. package/dist/_chunks/{pregnancy-weight-gain-DwmNklDU.js → pregnancy-weight-gain-CUUrBTBo.js} +2 -2
  138. package/dist/_chunks/{pregnancy-weight-gain-DwmNklDU.js.map → pregnancy-weight-gain-CUUrBTBo.js.map} +1 -1
  139. package/dist/_chunks/{product-hub-panel-BSSiGGG4.js → product-hub-panel-DlVRK7Ue.js} +103 -96
  140. package/dist/_chunks/product-hub-panel-DlVRK7Ue.js.map +1 -0
  141. package/dist/_chunks/{public-footer-CxpG6J1M.js → public-footer-ZWTEG1Rq.js} +2 -2
  142. package/dist/_chunks/{public-footer-CxpG6J1M.js.map → public-footer-ZWTEG1Rq.js.map} +1 -1
  143. package/dist/_chunks/{public-header.agent-BWusjxY8.js → public-header.agent-BctevbuY.js} +2 -2
  144. package/dist/_chunks/{public-header.agent-BWusjxY8.js.map → public-header.agent-BctevbuY.js.map} +1 -1
  145. package/dist/_chunks/{radio-group-BT97ty7o.js → radio-group-DicxWJXP.js} +111 -106
  146. package/dist/_chunks/radio-group-DicxWJXP.js.map +1 -0
  147. package/dist/_chunks/{radiograph-panel.agent-BA90I3Mu.js → radiograph-panel.agent-DyqbTECc.js} +4 -4
  148. package/dist/_chunks/{radiograph-panel.agent-BA90I3Mu.js.map → radiograph-panel.agent-DyqbTECc.js.map} +1 -1
  149. package/dist/_chunks/{registration-form-D7iNqMBF.js → registration-form-BlTzYywa.js} +2 -2
  150. package/dist/_chunks/{registration-form-D7iNqMBF.js.map → registration-form-BlTzYywa.js.map} +1 -1
  151. package/dist/_chunks/{rich-text-editor-Blp4smUr.js → rich-text-editor-DTnNZ4Ff.js} +489 -484
  152. package/dist/_chunks/rich-text-editor-DTnNZ4Ff.js.map +1 -0
  153. package/dist/_chunks/{sheet-CNFW8mYZ.js → sheet-8qsiMoUI.js} +95 -79
  154. package/dist/_chunks/sheet-8qsiMoUI.js.map +1 -0
  155. package/dist/_chunks/{sign-document-B6HlyCGV.js → sign-document-D4iHS_Ug.js} +2 -2
  156. package/dist/_chunks/{sign-document-B6HlyCGV.js.map → sign-document-D4iHS_Ug.js.map} +1 -1
  157. package/dist/_chunks/{signature-request-rgMsgo-C.js → signature-request-DRuYAG5I.js} +2 -2
  158. package/dist/_chunks/{signature-request-rgMsgo-C.js.map → signature-request-DRuYAG5I.js.map} +1 -1
  159. package/dist/_chunks/{signed-out-frame-B2GTIeqA.js → signed-out-frame-AhMsNW1r.js} +2 -2
  160. package/dist/_chunks/{signed-out-frame-B2GTIeqA.js.map → signed-out-frame-AhMsNW1r.js.map} +1 -1
  161. package/dist/_chunks/{stat-51CDL4au.js → stat-DmjGfXND.js} +117 -108
  162. package/dist/_chunks/stat-DmjGfXND.js.map +1 -0
  163. package/dist/_chunks/{stepper-accordion-D7lnBGh2.js → stepper-accordion-DDTSOUHc.js} +17 -6
  164. package/dist/_chunks/stepper-accordion-DDTSOUHc.js.map +1 -0
  165. package/dist/_chunks/{task-editor-Ctxsa1BY.js → task-editor-NkcopDna.js} +4 -4
  166. package/dist/_chunks/{task-editor-Ctxsa1BY.js.map → task-editor-NkcopDna.js.map} +1 -1
  167. package/dist/_chunks/{use-appointment-details-read-DinTrRIW.js → use-appointment-details-read-CfFQNOF_.js} +5 -5
  168. package/dist/_chunks/{use-appointment-details-read-DinTrRIW.js.map → use-appointment-details-read-CfFQNOF_.js.map} +1 -1
  169. package/dist/_chunks/use-select-on-arrow-Cr4iBuW5.js +26 -0
  170. package/dist/_chunks/use-select-on-arrow-Cr4iBuW5.js.map +1 -0
  171. package/dist/_chunks/{voice-control-panel-Bg1eklL0.js → voice-control-panel-BKbgb7FM.js} +2 -2
  172. package/dist/_chunks/{voice-control-panel-Bg1eklL0.js.map → voice-control-panel-BKbgb7FM.js.map} +1 -1
  173. package/dist/_chunks/{widget-picker-D8RiWrJd.js → widget-picker-rBA7MR5P.js} +2 -2
  174. package/dist/_chunks/{widget-picker-D8RiWrJd.js.map → widget-picker-rBA7MR5P.js.map} +1 -1
  175. package/dist/_chunks/{workflow-map-D3mezmGB.js → workflow-map-Demlpy39.js} +2 -2
  176. package/dist/_chunks/{workflow-map-D3mezmGB.js.map → workflow-map-Demlpy39.js.map} +1 -1
  177. package/dist/agent-catalog.json +28 -11
  178. package/dist/agent-i18n/en.json +8 -7
  179. package/dist/components/_shared/non-modal-tab-exit.d.ts +19 -0
  180. package/dist/components/_shared/non-modal-tab-exit.d.ts.map +1 -0
  181. package/dist/components/_shared/use-apex-chart-semantics.d.ts +6 -0
  182. package/dist/components/_shared/use-apex-chart-semantics.d.ts.map +1 -0
  183. package/dist/components/_shared/use-select-on-arrow.d.ts +20 -0
  184. package/dist/components/_shared/use-select-on-arrow.d.ts.map +1 -0
  185. package/dist/components/ai-credits-notice/index.js +1 -1
  186. package/dist/components/ai-permission-notice/ai-permission-notice.d.ts +32 -0
  187. package/dist/components/ai-permission-notice/ai-permission-notice.d.ts.map +1 -1
  188. package/dist/components/ai-permission-notice/index.d.ts +1 -1
  189. package/dist/components/ai-permission-notice/index.d.ts.map +1 -1
  190. package/dist/components/ai-permission-notice/index.js +1 -1
  191. package/dist/components/appointment-details-panel/index.js +1 -1
  192. package/dist/components/appointment-peek/index.js +1 -1
  193. package/dist/components/appointment-timeline/index.js +1 -1
  194. package/dist/components/bmi-calculator/index.js +1 -1
  195. package/dist/components/booking/index.js +1 -1
  196. package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -1
  197. package/dist/components/breadcrumb/index.js +1 -1
  198. package/dist/components/calculator-dialog/index.js +1 -1
  199. package/dist/components/care-plan-card/index.js +1 -1
  200. package/dist/components/care-plan-header/index.js +1 -1
  201. package/dist/components/chart/chart.d.ts +15 -10
  202. package/dist/components/chart/chart.d.ts.map +1 -1
  203. package/dist/components/chart/index.js +1 -1
  204. package/dist/components/clinical-note-card/index.js +1 -1
  205. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  206. package/dist/components/color-picker/index.js +1 -1
  207. package/dist/components/contact-card/index.js +1 -1
  208. package/dist/components/contact-profile-card/index.js +1 -1
  209. package/dist/components/cycle-calculator/index.js +1 -1
  210. package/dist/components/dashboard-grid/dashboard-grid-engine.d.ts +22 -0
  211. package/dist/components/dashboard-grid/dashboard-grid-engine.d.ts.map +1 -1
  212. package/dist/components/dashboard-grid/dashboard-grid.agent.d.ts.map +1 -1
  213. package/dist/components/dashboard-grid/dashboard-grid.d.ts +48 -4
  214. package/dist/components/dashboard-grid/dashboard-grid.d.ts.map +1 -1
  215. package/dist/components/dashboard-grid/index.js +1 -1
  216. package/dist/components/data-table/index.js +2 -2
  217. package/dist/components/data-table-tabs/index.js +1 -1
  218. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  219. package/dist/components/date-picker/index.js +1 -1
  220. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  221. package/dist/components/date-range-picker/index.js +1 -1
  222. package/dist/components/date-time-picker/date-time-picker.d.ts.map +1 -1
  223. package/dist/components/date-time-picker/index.js +1 -1
  224. package/dist/components/dependent-selector/dependent-selector.d.ts.map +1 -1
  225. package/dist/components/dependent-selector/index.js +1 -1
  226. package/dist/components/dialog/dialog.d.ts +2 -2
  227. package/dist/components/dialog/dialog.d.ts.map +1 -1
  228. package/dist/components/dialog/index.js +1 -1
  229. package/dist/components/document-preview/index.js +1 -1
  230. package/dist/components/due-date-calculator/index.js +1 -1
  231. package/dist/components/entity-summary/index.js +1 -1
  232. package/dist/components/file-manager/index.js +1 -1
  233. package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
  234. package/dist/components/freemium-paywall/index.js +1 -1
  235. package/dist/components/gestational-age-calculator/index.js +1 -1
  236. package/dist/components/hcg-doubling/index.js +1 -1
  237. package/dist/components/header-settings/index.js +1 -1
  238. package/dist/components/heatmap/index.js +1 -1
  239. package/dist/components/hover-card/hover-card.d.ts.map +1 -1
  240. package/dist/components/hover-card/index.js +1 -1
  241. package/dist/components/icon-picker/index.js +1 -1
  242. package/dist/components/info-tip/index.js +1 -1
  243. package/dist/components/key-value-pair/index.js +1 -1
  244. package/dist/components/key-value-pair/key-value-pair.d.ts.map +1 -1
  245. package/dist/components/link/index.js +1 -1
  246. package/dist/components/link/link.d.ts +5 -3
  247. package/dist/components/link/link.d.ts.map +1 -1
  248. package/dist/components/locale-picker/index.js +1 -1
  249. package/dist/components/message-tray/index.js +1 -1
  250. package/dist/components/message-tray/message-tray.d.ts.map +1 -1
  251. package/dist/components/nav-grid/index.js +1 -1
  252. package/dist/components/note-timeline/index.js +1 -1
  253. package/dist/components/notes-panel/index.js +1 -1
  254. package/dist/components/notification-tray/index.js +1 -1
  255. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  256. package/dist/components/patient-details/index.js +1 -1
  257. package/dist/components/patient-summary-card/index.js +1 -1
  258. package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -1
  259. package/dist/components/patient-table/index.js +1 -1
  260. package/dist/components/payment-card/index.js +1 -1
  261. package/dist/components/pdf-viewer/index.js +1 -1
  262. package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
  263. package/dist/components/periodontal-chart/index.js +1 -1
  264. package/dist/components/periodontal-chart-card/index.js +1 -1
  265. package/dist/components/periodontal-diagnosis/index.js +1 -1
  266. package/dist/components/phone-input/index.js +1 -1
  267. package/dist/components/phone-input/phone-input.d.ts.map +1 -1
  268. package/dist/components/popover/index.js +1 -1
  269. package/dist/components/popover/popover.d.ts +1 -1
  270. package/dist/components/popover/popover.d.ts.map +1 -1
  271. package/dist/components/position-grid/index.js +1 -1
  272. package/dist/components/position-grid/position-grid.d.ts.map +1 -1
  273. package/dist/components/practice-results/index.js +1 -1
  274. package/dist/components/pregnancy-dating/index.js +1 -1
  275. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  276. package/dist/components/product-hub-tray/index.js +1 -1
  277. package/dist/components/product-hub-tray/product-hub-tray.d.ts.map +1 -1
  278. package/dist/components/public-footer/index.js +1 -1
  279. package/dist/components/public-header/index.js +1 -1
  280. package/dist/components/radio-group/index.js +1 -1
  281. package/dist/components/radio-group/radio-group.d.ts.map +1 -1
  282. package/dist/components/radiograph-panel/index.js +1 -1
  283. package/dist/components/rich-text-editor/editor-toolbar.d.ts.map +1 -1
  284. package/dist/components/rich-text-editor/index.js +2 -2
  285. package/dist/components/sheet/index.js +1 -1
  286. package/dist/components/sheet/sheet.d.ts +2 -2
  287. package/dist/components/sheet/sheet.d.ts.map +1 -1
  288. package/dist/components/sign-document/index.js +1 -1
  289. package/dist/components/stat/index.d.ts +1 -1
  290. package/dist/components/stat/index.d.ts.map +1 -1
  291. package/dist/components/stat/index.js +1 -1
  292. package/dist/components/stat/stat.d.ts +9 -0
  293. package/dist/components/stat/stat.d.ts.map +1 -1
  294. package/dist/components/stepper-accordion/index.js +1 -1
  295. package/dist/components/stepper-accordion/stepper-accordion.d.ts.map +1 -1
  296. package/dist/components/task-editor/index.js +1 -1
  297. package/dist/components/voice-control-panel/index.js +1 -1
  298. package/dist/components/widget-picker/index.js +1 -1
  299. package/dist/components/workflow/index.js +1 -1
  300. package/dist/host-legacy.css +13 -2
  301. package/dist/i18n/locales/ar.d.ts +17 -2
  302. package/dist/i18n/locales/ar.d.ts.map +1 -1
  303. package/dist/i18n/locales/ar.js +20 -5
  304. package/dist/i18n/locales/ar.js.map +1 -1
  305. package/dist/i18n/locales/de.d.ts +17 -2
  306. package/dist/i18n/locales/de.d.ts.map +1 -1
  307. package/dist/i18n/locales/de.js +20 -5
  308. package/dist/i18n/locales/de.js.map +1 -1
  309. package/dist/i18n/locales/el.d.ts +17 -2
  310. package/dist/i18n/locales/el.d.ts.map +1 -1
  311. package/dist/i18n/locales/el.js +20 -5
  312. package/dist/i18n/locales/el.js.map +1 -1
  313. package/dist/i18n/locales/en.d.ts +17 -2
  314. package/dist/i18n/locales/en.d.ts.map +1 -1
  315. package/dist/i18n/locales/en.js +20 -5
  316. package/dist/i18n/locales/en.js.map +1 -1
  317. package/dist/i18n/locales/es.d.ts +17 -2
  318. package/dist/i18n/locales/es.d.ts.map +1 -1
  319. package/dist/i18n/locales/es.js +20 -5
  320. package/dist/i18n/locales/es.js.map +1 -1
  321. package/dist/i18n/locales/fr.d.ts +17 -2
  322. package/dist/i18n/locales/fr.d.ts.map +1 -1
  323. package/dist/i18n/locales/fr.js +20 -5
  324. package/dist/i18n/locales/fr.js.map +1 -1
  325. package/dist/i18n/locales/hi.d.ts +17 -2
  326. package/dist/i18n/locales/hi.d.ts.map +1 -1
  327. package/dist/i18n/locales/hi.js +20 -5
  328. package/dist/i18n/locales/hi.js.map +1 -1
  329. package/dist/i18n/locales/it.d.ts +17 -2
  330. package/dist/i18n/locales/it.d.ts.map +1 -1
  331. package/dist/i18n/locales/it.js +20 -5
  332. package/dist/i18n/locales/it.js.map +1 -1
  333. package/dist/i18n/locales/ja.d.ts +17 -2
  334. package/dist/i18n/locales/ja.d.ts.map +1 -1
  335. package/dist/i18n/locales/ja.js +20 -5
  336. package/dist/i18n/locales/ja.js.map +1 -1
  337. package/dist/i18n/locales/nl.d.ts +17 -2
  338. package/dist/i18n/locales/nl.d.ts.map +1 -1
  339. package/dist/i18n/locales/nl.js +20 -5
  340. package/dist/i18n/locales/nl.js.map +1 -1
  341. package/dist/i18n/locales/pl.d.ts +17 -2
  342. package/dist/i18n/locales/pl.d.ts.map +1 -1
  343. package/dist/i18n/locales/pl.js +20 -5
  344. package/dist/i18n/locales/pl.js.map +1 -1
  345. package/dist/i18n/locales/pt.d.ts +17 -2
  346. package/dist/i18n/locales/pt.d.ts.map +1 -1
  347. package/dist/i18n/locales/pt.js +20 -5
  348. package/dist/i18n/locales/pt.js.map +1 -1
  349. package/dist/i18n/locales/ro.d.ts +17 -2
  350. package/dist/i18n/locales/ro.d.ts.map +1 -1
  351. package/dist/i18n/locales/ro.js +20 -5
  352. package/dist/i18n/locales/ro.js.map +1 -1
  353. package/dist/i18n/locales/ru.d.ts +17 -2
  354. package/dist/i18n/locales/ru.d.ts.map +1 -1
  355. package/dist/i18n/locales/ru.js +20 -5
  356. package/dist/i18n/locales/ru.js.map +1 -1
  357. package/dist/i18n/locales/sq.d.ts +17 -2
  358. package/dist/i18n/locales/sq.d.ts.map +1 -1
  359. package/dist/i18n/locales/sq.js +20 -5
  360. package/dist/i18n/locales/sq.js.map +1 -1
  361. package/dist/i18n/locales/sv.d.ts +17 -2
  362. package/dist/i18n/locales/sv.d.ts.map +1 -1
  363. package/dist/i18n/locales/sv.js +20 -5
  364. package/dist/i18n/locales/sv.js.map +1 -1
  365. package/dist/i18n/locales/tr.d.ts +17 -2
  366. package/dist/i18n/locales/tr.d.ts.map +1 -1
  367. package/dist/i18n/locales/tr.js +20 -5
  368. package/dist/i18n/locales/tr.js.map +1 -1
  369. package/dist/i18n/locales/zh.d.ts +17 -2
  370. package/dist/i18n/locales/zh.d.ts.map +1 -1
  371. package/dist/i18n/locales/zh.js +20 -5
  372. package/dist/i18n/locales/zh.js.map +1 -1
  373. package/dist/index.js +207 -206
  374. package/dist/locales/ar.json +20 -5
  375. package/dist/locales/de.json +20 -5
  376. package/dist/locales/el.json +20 -5
  377. package/dist/locales/en.json +20 -5
  378. package/dist/locales/es.json +20 -5
  379. package/dist/locales/fr.json +20 -5
  380. package/dist/locales/hi.json +20 -5
  381. package/dist/locales/it.json +20 -5
  382. package/dist/locales/ja.json +20 -5
  383. package/dist/locales/nl.json +20 -5
  384. package/dist/locales/pl.json +20 -5
  385. package/dist/locales/pt.json +20 -5
  386. package/dist/locales/ro.json +20 -5
  387. package/dist/locales/ru.json +20 -5
  388. package/dist/locales/sq.json +20 -5
  389. package/dist/locales/sv.json +20 -5
  390. package/dist/locales/tr.json +20 -5
  391. package/dist/locales/zh.json +20 -5
  392. package/dist/patterns/alia-assistant/alia-asteroid-icon.d.ts +10 -13
  393. package/dist/patterns/alia-assistant/alia-asteroid-icon.d.ts.map +1 -1
  394. package/dist/patterns/alia-assistant/alia-chat-surface.d.ts.map +1 -1
  395. package/dist/patterns/alia-assistant/alia-popout.d.ts +5 -3
  396. package/dist/patterns/alia-assistant/alia-popout.d.ts.map +1 -1
  397. package/dist/patterns/alia-assistant/index.d.ts +2 -0
  398. package/dist/patterns/alia-assistant/index.d.ts.map +1 -1
  399. package/dist/patterns/alia-assistant/index.js +6 -5
  400. package/dist/patterns/anamnesis/index.js +1 -1
  401. package/dist/patterns/calendar/index.js +1 -1
  402. package/dist/patterns/help-me-write-templates/help-me-write-templates.d.ts +2 -2
  403. package/dist/patterns/help-me-write-templates/help-me-write-templates.d.ts.map +1 -1
  404. package/dist/patterns/help-me-write-templates/index.js +1 -1
  405. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  406. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts +7 -2
  407. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts.map +1 -1
  408. package/dist/patterns/payment-automation-upsell/index.js +1 -1
  409. package/dist/patterns/registration-form/index.js +1 -1
  410. package/dist/patterns/signature-request/index.js +1 -1
  411. package/dist/patterns/signed-out-frame/index.js +1 -1
  412. package/dist/tokens.css +13 -2
  413. package/package.json +1 -1
  414. package/dist/_chunks/ai-permission-notice-5vpblPCx.js +0 -171
  415. package/dist/_chunks/ai-permission-notice-5vpblPCx.js.map +0 -1
  416. package/dist/_chunks/alia-sidebar-DS0b54Mv.js +0 -1183
  417. package/dist/_chunks/alia-sidebar-DS0b54Mv.js.map +0 -1
  418. package/dist/_chunks/breadcrumb-xgVpPH2H.js.map +0 -1
  419. package/dist/_chunks/chart-C2RBJERE.js +0 -705
  420. package/dist/_chunks/chart-C2RBJERE.js.map +0 -1
  421. package/dist/_chunks/color-picker-BRQ4Y9SO.js.map +0 -1
  422. package/dist/_chunks/dashboard-grid-SAGoyCtL.js +0 -691
  423. package/dist/_chunks/dashboard-grid-SAGoyCtL.js.map +0 -1
  424. package/dist/_chunks/date-picker-wRAcq2lt.js.map +0 -1
  425. package/dist/_chunks/date-range-picker-BOvHwWO5.js.map +0 -1
  426. package/dist/_chunks/date-time-picker-CLeLKuv9.js.map +0 -1
  427. package/dist/_chunks/dependent-selector-Bet3XAFj.js.map +0 -1
  428. package/dist/_chunks/dialog-D52AI4nF.js.map +0 -1
  429. package/dist/_chunks/freemium-paywall-B6ojVXq7.js.map +0 -1
  430. package/dist/_chunks/help-me-write-templates-B7L3zGsE.js.map +0 -1
  431. package/dist/_chunks/hover-card-BnTueNS2.js.map +0 -1
  432. package/dist/_chunks/key-value-pair-Ax8IJr1M.js.map +0 -1
  433. package/dist/_chunks/link-2HokYuIi.js +0 -130
  434. package/dist/_chunks/link-2HokYuIi.js.map +0 -1
  435. package/dist/_chunks/marketplace-app-shell-Dcx-JEjg.js.map +0 -1
  436. package/dist/_chunks/message-tray-BB95DA82.js.map +0 -1
  437. package/dist/_chunks/notification-tray-__sJXnsz.js.map +0 -1
  438. package/dist/_chunks/pdf-viewer-C3minW5b.js.map +0 -1
  439. package/dist/_chunks/phone-input-DxkHMYmu.js.map +0 -1
  440. package/dist/_chunks/popover-BI3oV3eY.js +0 -305
  441. package/dist/_chunks/popover-BI3oV3eY.js.map +0 -1
  442. package/dist/_chunks/position-grid-D2D5_Tze.js.map +0 -1
  443. package/dist/_chunks/product-hub-panel-BSSiGGG4.js.map +0 -1
  444. package/dist/_chunks/radio-group-BT97ty7o.js.map +0 -1
  445. package/dist/_chunks/rich-text-editor-Blp4smUr.js.map +0 -1
  446. package/dist/_chunks/sheet-CNFW8mYZ.js.map +0 -1
  447. package/dist/_chunks/stat-51CDL4au.js.map +0 -1
  448. package/dist/_chunks/stepper-accordion-D7lnBGh2.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"sheet-CNFW8mYZ.js","sources":["../../src/components/sheet/sheet.agent.ts","../../src/components/sheet/sheet.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { SheetHandle } from './sheet';\n\nexport const sheetAgent: AgentAdapter<SheetHandle> = {\n id: 'sheet',\n // `dismiss` shares the handle's close() — it is the same imperative close\n // path with destructive intent (loses uncommitted input). Backed.\n capabilities: ['open', 'close', 'dismiss'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.sheet.state.isOpen',\n description: 'True when the sheet is currently open.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n open: {\n // Pure ephemeral UI state — opening loses no data.\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.sheet.actions.open',\n description: 'Open the sheet.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n // Pure ephemeral UI state — closing is reversible by reopening and\n // loses no committed data.\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.sheet.actions.close',\n description: 'Close the sheet. Reversible by reopening.',\n invoke: (handle) => {\n handle.close();\n },\n },\n dismiss: {\n // Same close() path, but flagged destructive because dismissing a sheet\n // mid-edit discards any in-progress input that was not committed.\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.sheet.actions.dismiss',\n description:\n 'Dismiss the sheet. Loses any in-progress input that has not been committed.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'sheet' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on Sheet.Root.',\n },\n },\n};\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { ScrollArea } from '../scroll-area/scroll-area';\nimport { useAgentRegistration } from '../../agent';\nimport { sheetAgent } from './sheet.agent';\n\nconst OVERLAY_CLASSES = [\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal-backdrop)]',\n 'ds:bg-[var(--background)]/[var(--opacity-70)]',\n 'ds:backdrop-blur-sm',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out-0',\n 'ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n].join(' ');\n\nconst contentVariants = cva(\n [\n 'ds:fixed ds:z-[var(--z-modal)] ds:flex ds:flex-col',\n 'ds:bg-[var(--popover)] ds:text-[var(--popover-foreground)]',\n 'ds:shadow-[var(--shadow-xl)]',\n 'ds:focus-visible:outline-none',\n 'ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n side: {\n start: [\n 'ds:start-0 ds:inset-y-0',\n 'ds:border-e ds:border-[color:var(--border)]',\n 'ds:data-[state=open]:animate-in ds:ltr:data-[state=open]:slide-in-from-left-full ds:rtl:data-[state=open]:slide-in-from-right-full',\n 'ds:data-[state=closed]:animate-out ds:ltr:data-[state=closed]:slide-out-to-left-full ds:rtl:data-[state=closed]:slide-out-to-right-full',\n 'ds:max-sm:[inline-size:100dvw] ds:max-sm:[block-size:100dvh]',\n ].join(' '),\n end: [\n 'ds:end-0 ds:inset-y-0',\n 'ds:border-s ds:border-[color:var(--border)]',\n 'ds:data-[state=open]:animate-in ds:ltr:data-[state=open]:slide-in-from-right-full ds:rtl:data-[state=open]:slide-in-from-left-full',\n 'ds:data-[state=closed]:animate-out ds:ltr:data-[state=closed]:slide-out-to-right-full ds:rtl:data-[state=closed]:slide-out-to-left-full',\n 'ds:max-sm:[inline-size:100dvw] ds:max-sm:[block-size:100dvh]',\n ].join(' '),\n top: [\n 'ds:top-0 ds:inset-x-0',\n 'ds:border-b ds:border-[color:var(--border)]',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:slide-in-from-top-full',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:slide-out-to-top-full',\n ].join(' '),\n bottom: [\n 'ds:bottom-0 ds:inset-x-0',\n 'ds:border-t ds:border-[color:var(--border)]',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:slide-in-from-bottom-full',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:slide-out-to-bottom-full',\n ].join(' '),\n },\n },\n defaultVariants: { side: 'end' },\n },\n);\n\nfunction getSizeClass(\n side: 'start' | 'end' | 'top' | 'bottom',\n size: 'sm' | 'md' | 'lg',\n): string {\n if (side === 'start' || side === 'end') {\n // These MUST carry the `ds:` prefix — a bare `[inline-size:…]` is not a\n // recognised utility under `prefix: 'ds'`, so Tailwind emits no rule and the\n // sheet renders full-bleed (the mobile `ds:max-sm:[inline-size:100dvw]`\n // classes work precisely because they are prefixed).\n const map = {\n sm: 'ds:[inline-size:360px]',\n md: 'ds:[inline-size:480px]',\n lg: 'ds:[inline-size:640px]',\n } as const;\n return map[size];\n }\n\n const map = {\n sm: 'ds:[block-size:40dvh]',\n md: 'ds:[block-size:60dvh]',\n lg: 'ds:[block-size:80dvh]',\n } as const;\n return map[size];\n}\n\n// Curated agent-readiness handle — see sheet.agent.ts.\nexport interface SheetHandle {\n getIsOpen: () => boolean;\n open: () => void;\n close: () => void;\n}\n\nexport interface SheetRootProps extends ComponentPropsWithoutRef<\n typeof RadixDialog.Root\n> {\n /** Opaque instance id — forwarded to Sheet.Content as `data-component-id`. */\n id?: string;\n}\n\nconst SheetIdContext = createContext<string | undefined>(undefined);\n\nconst SheetRoot = ({\n children,\n id,\n open: openProp,\n defaultOpen,\n onOpenChange,\n ...props\n}: SheetRootProps) => {\n const isControlled = openProp !== undefined;\n const [internalOpen, setInternalOpen] = useState<boolean>(\n defaultOpen ?? false,\n );\n const open = isControlled ? Boolean(openProp) : internalOpen;\n\n const openRef = useRef(open);\n useEffect(() => {\n openRef.current = open;\n }, [open]);\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const handle = useMemo<SheetHandle>(\n () => ({\n getIsOpen: () => openRef.current,\n open: () => setOpen(true),\n close: () => setOpen(false),\n }),\n [setOpen],\n );\n useAgentRegistration(sheetAgent, handle, id);\n\n return (\n <SheetIdContext.Provider value={id}>\n <RadixDialog.Root open={open} onOpenChange={setOpen} {...props}>\n {children}\n </RadixDialog.Root>\n </SheetIdContext.Provider>\n );\n};\nSheetRoot.displayName = 'Sheet.Root';\n\nconst SheetTrigger = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Trigger>\n>(({ children, ...props }, ref) => (\n <RadixDialog.Trigger ref={ref} {...props}>\n {children}\n </RadixDialog.Trigger>\n));\nSheetTrigger.displayName = 'Sheet.Trigger';\n\nconst SheetClose = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Close>\n>(({ children, ...props }, ref) => (\n <RadixDialog.Close ref={ref} {...props}>\n {children}\n </RadixDialog.Close>\n));\nSheetClose.displayName = 'Sheet.Close';\n\nexport interface SheetContentProps\n extends\n Omit<ComponentPropsWithoutRef<typeof RadixDialog.Content>, 'className'>,\n VariantProps<typeof contentVariants> {\n side?: 'start' | 'end' | 'top' | 'bottom';\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n children: ReactNode;\n}\n\nconst SheetContent = forwardRef<HTMLDivElement, SheetContentProps>(\n ({ side = 'end', size = 'md', className, children, ...props }, ref) => {\n const instanceId = useContext(SheetIdContext);\n return (\n <RadixDialog.Portal>\n <RadixDialog.Overlay\n data-component=\"sheet-overlay\"\n className={OVERLAY_CLASSES}\n />\n <RadixDialog.Content\n ref={ref}\n className={[\n contentVariants({ side }),\n getSizeClass(side, size),\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n data-component=\"sheet\"\n data-component-id={instanceId}\n {...props}\n >\n {children}\n </RadixDialog.Content>\n </RadixDialog.Portal>\n );\n },\n);\nSheetContent.displayName = 'Sheet.Content';\n\nconst SheetHeader = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => {\n const { t } = useTranslation('ui');\n\n return (\n <div\n ref={ref}\n className={[\n 'ds:sticky ds:top-0 ds:z-10 ds:flex ds:items-center ds:justify-between',\n 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:py-[var(--spacing-md)]',\n 'ds:border-b ds:border-[color:var(--border)] ds:bg-[var(--popover)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n {children}\n <SheetClose asChild>\n <IconButton\n icon={<X />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('common.close', 'Close')}\n />\n </SheetClose>\n </div>\n );\n },\n);\nSheetHeader.displayName = 'Sheet.Header';\n\nconst SheetBody = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n // ScrollArea forwards its ref to the scroll container (Radix viewport), so\n // SheetBody's ref still points at the scroller — preserving scrollTop access.\n <ScrollArea\n ref={ref}\n orientation=\"vertical\"\n className=\"ds:flex-1 ds:min-h-0\"\n >\n <div\n className={[\n 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:py-[var(--spacing-lg)]',\n 'ds:break-words',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n </ScrollArea>\n ),\n);\nSheetBody.displayName = 'Sheet.Body';\n\nconst SheetFooter = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:sticky ds:bottom-0 ds:z-10 ds:flex ds:items-center ds:justify-end ds:gap-[var(--spacing-sm)]',\n 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:py-[var(--spacing-md)]',\n 'ds:border-t ds:border-[color:var(--border)] ds:bg-[var(--popover)]',\n 'ds:max-sm:flex-col ds:max-sm:[&>*]:w-full',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nSheetFooter.displayName = 'Sheet.Footer';\n\nconst SheetTitle = forwardRef<\n HTMLHeadingElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Title>\n>(({ className, ...props }, ref) => (\n <RadixDialog.Title\n ref={ref}\n className={['type-title-card ds:break-words', className]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nSheetTitle.displayName = 'Sheet.Title';\n\nconst SheetDescription = forwardRef<\n HTMLParagraphElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Description>\n>(({ className, ...props }, ref) => (\n <RadixDialog.Description\n ref={ref}\n className={['type-body-sm ds:text-[var(--muted-foreground)]', className]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nSheetDescription.displayName = 'Sheet.Description';\n\nexport const Sheet = Object.assign(SheetRoot, {\n Root: SheetRoot,\n Trigger: SheetTrigger,\n Content: SheetContent,\n Header: SheetHeader,\n Body: SheetBody,\n Footer: SheetFooter,\n Title: SheetTitle,\n Description: SheetDescription,\n Close: SheetClose,\n});\n\nexport type SheetHeaderProps = HTMLAttributes<HTMLDivElement>;\nexport type SheetBodyProps = HTMLAttributes<HTMLDivElement>;\nexport type SheetFooterProps = HTMLAttributes<HTMLDivElement>;\n"],"names":["sheetAgent","handle","OVERLAY_CLASSES","contentVariants","cva","getSizeClass","side","size","SheetIdContext","createContext","SheetRoot","children","id","openProp","defaultOpen","onOpenChange","props","isControlled","internalOpen","setInternalOpen","useState","open","openRef","useRef","useEffect","setOpen","useCallback","next","useMemo","useAgentRegistration","jsx","RadixDialog","SheetTrigger","forwardRef","ref","SheetClose","SheetContent","className","instanceId","useContext","jsxs","SheetHeader","t","useTranslation","IconButton","X","SheetBody","ScrollArea","SheetFooter","SheetTitle","SheetDescription","Sheet"],"mappings":";;;;;;;;;AAGO,MAAMA,IAAwC;AAAA,EACnD,IAAI;AAAA;AAAA;AAAA,EAGJ,cAAc,CAAC,QAAQ,SAAS,SAAS;AAAA,EACzC,OAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,MAAM,CAACC,MAAWA,EAAO,UAAA;AAAA,IAAU;AAAA,EACrC;AAAA,EAEF,SAAS;AAAA,IACP,MAAM;AAAA;AAAA,MAEJ,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACA,MAAW;AAClB,QAAAA,EAAO,KAAA;AAAA,MACT;AAAA,IAAA;AAAA,IAEF,OAAO;AAAA;AAAA;AAAA,MAGL,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACA,MAAW;AAClB,QAAAA,EAAO,MAAA;AAAA,MACT;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA;AAAA;AAAA,MAGP,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aACE;AAAA,MACF,QAAQ,CAACA,MAAW;AAClB,QAAAA,EAAO,MAAA;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,UAAU;AAAA,IACR,MAAM,EAAE,MAAM,kBAAkB,OAAO,QAAA;AAAA,IACvC,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GCrCMC,IAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAEJC,IAAkBC;AAAA,EACtB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACV,KAAK;AAAA,UACH;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACV,KAAK;AAAA,UACH;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACV,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,MAAA;AAAA,IACZ;AAAA,IAEF,iBAAiB,EAAE,MAAM,MAAA;AAAA,EAAM;AAEnC;AAEA,SAASC,EACPC,GACAC,GACQ;AACR,SAAID,MAAS,WAAWA,MAAS,QAKnB;AAAA,IACV,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,EAEKC,CAAI,IAGL;AAAA,IACV,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,EAEKA,CAAI;AACjB;AAgBA,MAAMC,IAAiBC,EAAkC,MAAS,GAE5DC,IAAY,CAAC;AAAA,EACjB,UAAAC;AAAA,EACA,IAAAC;AAAA,EACA,MAAMC;AAAA,EACN,aAAAC;AAAA,EACA,cAAAC;AAAA,EACA,GAAGC;AACL,MAAsB;AACpB,QAAMC,IAAeJ,MAAa,QAC5B,CAACK,GAAcC,CAAe,IAAIC;AAAA,IACtCN,KAAe;AAAA,EAAA,GAEXO,IAAOJ,IAAe,EAAQJ,IAAYK,GAE1CI,IAAUC,EAAOF,CAAI;AAC3B,EAAAG,EAAU,MAAM;AACd,IAAAF,EAAQ,UAAUD;AAAA,EACpB,GAAG,CAACA,CAAI,CAAC;AAET,QAAMI,IAAUC;AAAA,IACd,CAACC,MAAkB;AACjB,MAAKV,KAAcE,EAAgBQ,CAAI,GACvCZ,KAAA,QAAAA,EAAeY;AAAA,IACjB;AAAA,IACA,CAACV,GAAcF,CAAY;AAAA,EAAA,GAGvBd,IAAS2B;AAAA,IACb,OAAO;AAAA,MACL,WAAW,MAAMN,EAAQ;AAAA,MACzB,MAAM,MAAMG,EAAQ,EAAI;AAAA,MACxB,OAAO,MAAMA,EAAQ,EAAK;AAAA,IAAA;AAAA,IAE5B,CAACA,CAAO;AAAA,EAAA;AAEV,SAAAI,EAAqB7B,GAAYC,GAAQW,CAAE,qBAGxCJ,EAAe,UAAf,EAAwB,OAAOI,GAC9B,UAAA,gBAAAkB,EAACC,EAAY,MAAZ,EAAiB,MAAAV,GAAY,cAAcI,GAAU,GAAGT,GACtD,UAAAL,GACH,GACF;AAEJ;AACAD,EAAU,cAAc;AAExB,MAAMsB,IAAeC,EAGnB,CAAC,EAAE,UAAAtB,GAAU,GAAGK,EAAA,GAASkB,MACzB,gBAAAJ,EAACC,EAAY,SAAZ,EAAoB,KAAAG,GAAW,GAAGlB,GAChC,UAAAL,GACH,CACD;AACDqB,EAAa,cAAc;AAE3B,MAAMG,IAAaF,EAGjB,CAAC,EAAE,UAAAtB,GAAU,GAAGK,EAAA,GAASkB,MACzB,gBAAAJ,EAACC,EAAY,OAAZ,EAAkB,KAAAG,GAAW,GAAGlB,GAC9B,UAAAL,GACH,CACD;AACDwB,EAAW,cAAc;AAYzB,MAAMC,IAAeH;AAAA,EACnB,CAAC,EAAE,MAAA3B,IAAO,OAAO,MAAAC,IAAO,MAAM,WAAA8B,GAAW,UAAA1B,GAAU,GAAGK,EAAA,GAASkB,MAAQ;AACrE,UAAMI,IAAaC,EAAW/B,CAAc;AAC5C,WACE,gBAAAgC,EAACT,EAAY,QAAZ,EACC,UAAA;AAAA,MAAA,gBAAAD;AAAA,QAACC,EAAY;AAAA,QAAZ;AAAA,UACC,kBAAe;AAAA,UACf,WAAW7B;AAAA,QAAA;AAAA,MAAA;AAAA,MAEb,gBAAA4B;AAAA,QAACC,EAAY;AAAA,QAAZ;AAAA,UACC,KAAAG;AAAA,UACA,WAAW;AAAA,YACT/B,EAAgB,EAAE,MAAAG,GAAM;AAAA,YACxBD,EAAaC,GAAMC,CAAI;AAAA,YACvB8B;AAAA,UAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UACX,kBAAe;AAAA,UACf,qBAAmBC;AAAA,UAClB,GAAGtB;AAAA,UAEH,UAAAL;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,GACF;AAAA,EAEJ;AACF;AACAyB,EAAa,cAAc;AAE3B,MAAMK,IAAcR;AAAA,EAClB,CAAC,EAAE,WAAAI,GAAW,UAAA1B,GAAU,GAAGK,EAAA,GAASkB,MAAQ;AAC1C,UAAM,EAAE,GAAAQ,EAAA,IAAMC,EAAe,IAAI;AAEjC,WACE,gBAAAH;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAN;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACAG;AAAA,QAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACV,GAAGrB;AAAA,QAEH,UAAA;AAAA,UAAAL;AAAA,UACD,gBAAAmB,EAACK,GAAA,EAAW,SAAO,IACjB,UAAA,gBAAAL;AAAA,YAACc;AAAA,YAAA;AAAA,cACC,wBAAOC,GAAA,EAAE;AAAA,cACT,QAAO;AAAA,cACP,MAAK;AAAA,cACL,cAAYH,EAAE,gBAAgB,OAAO;AAAA,YAAA;AAAA,UAAA,EACvC,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AACAD,EAAY,cAAc;AAE1B,MAAMK,IAAYb;AAAA,EAChB,CAAC,EAAE,WAAAI,GAAW,GAAGrB,KAASkB;AAAA;AAAA;AAAA,IAGxB,gBAAAJ;AAAA,MAACiB;AAAA,MAAA;AAAA,QACC,KAAAb;AAAA,QACA,aAAY;AAAA,QACZ,WAAU;AAAA,QAEV,UAAA,gBAAAJ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACAO;AAAA,YAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,YACV,GAAGrB;AAAA,UAAA;AAAA,QAAA;AAAA,MACN;AAAA,IAAA;AAAA;AAGN;AACA8B,EAAU,cAAc;AAExB,MAAME,IAAcf;AAAA,EAClB,CAAC,EAAE,WAAAI,GAAW,GAAGrB,EAAA,GAASkB,MACxB,gBAAAJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAI;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAG;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACV,GAAGrB;AAAA,IAAA;AAAA,EAAA;AAGV;AACAgC,EAAY,cAAc;AAE1B,MAAMC,IAAahB,EAGjB,CAAC,EAAE,WAAAI,GAAW,GAAGrB,EAAA,GAASkB,MAC1B,gBAAAJ;AAAA,EAACC,EAAY;AAAA,EAAZ;AAAA,IACC,KAAAG;AAAA,IACA,WAAW,CAAC,kCAAkCG,CAAS,EACpD,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,IACV,GAAGrB;AAAA,EAAA;AACN,CACD;AACDiC,EAAW,cAAc;AAEzB,MAAMC,IAAmBjB,EAGvB,CAAC,EAAE,WAAAI,GAAW,GAAGrB,EAAA,GAASkB,MAC1B,gBAAAJ;AAAA,EAACC,EAAY;AAAA,EAAZ;AAAA,IACC,KAAAG;AAAA,IACA,WAAW,CAAC,kDAAkDG,CAAS,EACpE,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,IACV,GAAGrB;AAAA,EAAA;AACN,CACD;AACDkC,EAAiB,cAAc;AAExB,MAAMC,IAAQ,OAAO,OAAOzC,GAAW;AAAA,EAC5C,MAAMA;AAAA,EACN,SAASsB;AAAA,EACT,SAASI;AAAA,EACT,QAAQK;AAAA,EACR,MAAMK;AAAA,EACN,QAAQE;AAAA,EACR,OAAOC;AAAA,EACP,aAAaC;AAAA,EACb,OAAOf;AACT,CAAC;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"stat-51CDL4au.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 trend: {\n up: 'ds:text-[var(--success)]',\n down: 'ds:text-[var(--destructive)]',\n flat: 'ds:text-[var(--muted-foreground)]',\n },\n },\n defaultVariants: {\n trend: 'flat',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* StatTrend (internal — not exported) */\n/* ------------------------------------------------------------------ */\n\ninterface StatTrendProps {\n trend: 'up' | 'down' | 'flat';\n delta: number | string;\n deltaFormat?: 'decimal' | 'percent';\n locale?: string;\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}: 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 return (\n <span className={trendVariants({ trend })}>\n <span aria-hidden=\"true\">{ARROW[trend]}</span>\n <span className=\"ds:sr-only\">{t(TREND_KEY[trend])}</span>\n {formattedDelta}\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 /** 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 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 />\n )}\n </div>\n );\n },\n);\n\nStat.displayName = 'Stat';\n"],"names":["statVariants","cva","valueVariants","trendVariants","ARROW","TREND_KEY","StatTrend","trend","delta","deltaFormat","locale","t","i18n","useTranslation","formattedDelta","jsx","parseStatValue","raw","trimmed","sign","body","suffix","suffixMatch","group","decimal","probe","part","usStyleMatch","direct","normalised","numeric","Stat","forwardRef","label","value","format","currency","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","jsxs"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"stepper-accordion-D7lnBGh2.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 'ds: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 'ds: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\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]', {\n variants: {},\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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"}