@alfadocs/ui-kit-debug 0.67.1 → 0.69.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 (745) hide show
  1. package/dist/_chunks/{accordion-9lJSMMsZ.js → accordion-DnIa7OHX.js} +69 -47
  2. package/dist/_chunks/accordion-DnIa7OHX.js.map +1 -0
  3. package/dist/_chunks/actions-cell-renderer-DrcaxB0w.js +2061 -0
  4. package/dist/_chunks/actions-cell-renderer-DrcaxB0w.js.map +1 -0
  5. package/dist/_chunks/address-autocomplete-BEX9PXty.js +496 -0
  6. package/dist/_chunks/address-autocomplete-BEX9PXty.js.map +1 -0
  7. package/dist/_chunks/{agenda-card.agent-B_R47-c9.js → agenda-card.agent-mTCrkKSZ.js} +6 -1
  8. package/dist/_chunks/{agenda-card.agent-B_R47-c9.js.map → agenda-card.agent-mTCrkKSZ.js.map} +1 -1
  9. package/dist/_chunks/{agenda-tray-T-BumlGZ.js → agenda-tray-g0kg7HwB.js} +36 -24
  10. package/dist/_chunks/agenda-tray-g0kg7HwB.js.map +1 -0
  11. package/dist/_chunks/{ai-consent-banner-Dxtx_WAh.js → ai-consent-banner-CXlsNX1c.js} +3 -3
  12. package/dist/_chunks/{ai-consent-banner-Dxtx_WAh.js.map → ai-consent-banner-CXlsNX1c.js.map} +1 -1
  13. package/dist/_chunks/{ai-prompt-input-BwEACCPm.js → ai-prompt-input-CuhTo9mh.js} +80 -61
  14. package/dist/_chunks/ai-prompt-input-CuhTo9mh.js.map +1 -0
  15. package/dist/_chunks/{ai-tools-rail-CInA_1-E.js → ai-tools-rail-BA_sqy1A.js} +87 -70
  16. package/dist/_chunks/ai-tools-rail-BA_sqy1A.js.map +1 -0
  17. package/dist/_chunks/{alia-sidebar-Ckv0yCKi.js → alia-sidebar-B47qRQb5.js} +5 -5
  18. package/dist/_chunks/{alia-sidebar-Ckv0yCKi.js.map → alia-sidebar-B47qRQb5.js.map} +1 -1
  19. package/dist/_chunks/{anamnesis-card-N8pIKWuS.js → anamnesis-card-DRmE24OQ.js} +2 -2
  20. package/dist/_chunks/{anamnesis-card-N8pIKWuS.js.map → anamnesis-card-DRmE24OQ.js.map} +1 -1
  21. package/dist/_chunks/{appointment-tray-BMl89NPW.js → appointment-tray-CZtvtaH-.js} +32 -20
  22. package/dist/_chunks/appointment-tray-CZtvtaH-.js.map +1 -0
  23. package/dist/_chunks/{audio-recorder-DjXLP4aF.js → audio-recorder-DYXXnGug.js} +59 -56
  24. package/dist/_chunks/audio-recorder-DYXXnGug.js.map +1 -0
  25. package/dist/_chunks/{autocomplete-CcCFlVf-.js → autocomplete-DOeGouCL.js} +157 -132
  26. package/dist/_chunks/autocomplete-DOeGouCL.js.map +1 -0
  27. package/dist/_chunks/bishop-score-PJI3AXzA.js +304 -0
  28. package/dist/_chunks/bishop-score-PJI3AXzA.js.map +1 -0
  29. package/dist/_chunks/bmi-calculator-BZtIJ53x.js +434 -0
  30. package/dist/_chunks/bmi-calculator-BZtIJ53x.js.map +1 -0
  31. package/dist/_chunks/{booking-L8-YP8BJ.js → booking-C3VqFReX.js} +420 -397
  32. package/dist/_chunks/booking-C3VqFReX.js.map +1 -0
  33. package/dist/_chunks/{breadcrumb-OTbaY70e.js → breadcrumb-CchdeG7d.js} +42 -28
  34. package/dist/_chunks/breadcrumb-CchdeG7d.js.map +1 -0
  35. package/dist/_chunks/{calculator-dialog-CFk4I91b.js → calculator-dialog-BR5iU0kf.js} +2 -2
  36. package/dist/_chunks/{calculator-dialog-CFk4I91b.js.map → calculator-dialog-BR5iU0kf.js.map} +1 -1
  37. package/dist/_chunks/{calendar-oYWOCrnf.js → calendar-CZUjL8SZ.js} +258 -201
  38. package/dist/_chunks/calendar-CZUjL8SZ.js.map +1 -0
  39. package/dist/_chunks/{care-plan-card-BwVUyUBb.js → care-plan-card-CvFGXa2z.js} +10 -6
  40. package/dist/_chunks/care-plan-card-CvFGXa2z.js.map +1 -0
  41. package/dist/_chunks/{care-plan-entry-card-VzdQHcOL.js → care-plan-entry-card-C3E_gClk.js} +17 -13
  42. package/dist/_chunks/care-plan-entry-card-C3E_gClk.js.map +1 -0
  43. package/dist/_chunks/{carousel.agent-vt21A_el.js → carousel.agent-4v8Emr9E.js} +219 -198
  44. package/dist/_chunks/{carousel.agent-vt21A_el.js.map → carousel.agent-4v8Emr9E.js.map} +1 -1
  45. package/dist/_chunks/{chart-Cg3e9EH9.js → chart-CMr3eW62.js} +150 -109
  46. package/dist/_chunks/chart-CMr3eW62.js.map +1 -0
  47. package/dist/_chunks/{chat-container-ogB4OskO.js → chat-container-DWho5hPR.js} +47 -34
  48. package/dist/_chunks/chat-container-DWho5hPR.js.map +1 -0
  49. package/dist/_chunks/{chat-input-B5zjNEUN.js → chat-input-BcXTetgM.js} +57 -41
  50. package/dist/_chunks/chat-input-BcXTetgM.js.map +1 -0
  51. package/dist/_chunks/{checkbox-DRcOdmXv.js → checkbox-BuZ1u__2.js} +41 -27
  52. package/dist/_chunks/checkbox-BuZ1u__2.js.map +1 -0
  53. package/dist/_chunks/{checkbox-group-CpUwlHug.js → checkbox-group-PqNmQ-cE.js} +3 -3
  54. package/dist/_chunks/{checkbox-group-CpUwlHug.js.map → checkbox-group-PqNmQ-cE.js.map} +1 -1
  55. package/dist/_chunks/{clinical-note-card-gtrxv6zn.js → clinical-note-card-DqQYf_D4.js} +2 -2
  56. package/dist/_chunks/{clinical-note-card-gtrxv6zn.js.map → clinical-note-card-DqQYf_D4.js.map} +1 -1
  57. package/dist/_chunks/{collapsible-X3oaLPU3.js → collapsible-BrnRiCC6.js} +26 -23
  58. package/dist/_chunks/collapsible-BrnRiCC6.js.map +1 -0
  59. package/dist/_chunks/{color-picker-FXpItIaF.js → color-picker-C_fZl6sA.js} +124 -112
  60. package/dist/_chunks/color-picker-C_fZl6sA.js.map +1 -0
  61. package/dist/_chunks/{combobox-BC-DFx8G.js → combobox-Clum7gJ1.js} +165 -128
  62. package/dist/_chunks/combobox-Clum7gJ1.js.map +1 -0
  63. package/dist/_chunks/{command-palette-BiPAAno-.js → command-palette-CJzmc5pC.js} +87 -64
  64. package/dist/_chunks/command-palette-CJzmc5pC.js.map +1 -0
  65. package/dist/_chunks/{contact-profile-card-7BMB85T6.js → contact-profile-card-Dramqa9C.js} +13 -11
  66. package/dist/_chunks/contact-profile-card-Dramqa9C.js.map +1 -0
  67. package/dist/_chunks/{copy-field-CCq7j6Zc.js → copy-field-Bjw9u2cV.js} +42 -35
  68. package/dist/_chunks/copy-field-Bjw9u2cV.js.map +1 -0
  69. package/dist/_chunks/counter-dRlTNC_y.js +55 -0
  70. package/dist/_chunks/counter-dRlTNC_y.js.map +1 -0
  71. package/dist/_chunks/{cycle-calculator-BF0ointe.js → cycle-calculator-DmRGJNaT.js} +3 -3
  72. package/dist/_chunks/{cycle-calculator-BF0ointe.js.map → cycle-calculator-DmRGJNaT.js.map} +1 -1
  73. package/dist/_chunks/{date-picker-oGg5BnXL.js → date-picker-Dl9RKxaV.js} +76 -57
  74. package/dist/_chunks/{date-picker-oGg5BnXL.js.map → date-picker-Dl9RKxaV.js.map} +1 -1
  75. package/dist/_chunks/{date-range-picker-C5BWfH_T.js → date-range-picker-CTUeR6Bj.js} +73 -46
  76. package/dist/_chunks/date-range-picker-CTUeR6Bj.js.map +1 -0
  77. package/dist/_chunks/{date-time-picker-Ze1My59T.js → date-time-picker-BhoogS5Q.js} +64 -40
  78. package/dist/_chunks/date-time-picker-BhoogS5Q.js.map +1 -0
  79. package/dist/_chunks/{dependent-selector-DpzGtr_J.js → dependent-selector-CG_FOHya.js} +44 -30
  80. package/dist/_chunks/dependent-selector-CG_FOHya.js.map +1 -0
  81. package/dist/_chunks/{dialog-DMGnSelc.js → dialog-ZNuboNmy.js} +35 -28
  82. package/dist/_chunks/dialog-ZNuboNmy.js.map +1 -0
  83. package/dist/_chunks/{document-scanner-D2qehl3-.js → document-scanner-CTubA0-N.js} +12 -4
  84. package/dist/_chunks/document-scanner-CTubA0-N.js.map +1 -0
  85. package/dist/_chunks/{dropdown-menu-DwwPovMZ.js → dropdown-menu-qrxjymfw.js} +94 -93
  86. package/dist/_chunks/dropdown-menu-qrxjymfw.js.map +1 -0
  87. package/dist/_chunks/{due-date-calculator-DU9AEWNy.js → due-date-calculator-BTmsIQqD.js} +4 -4
  88. package/dist/_chunks/{due-date-calculator-DU9AEWNy.js.map → due-date-calculator-BTmsIQqD.js.map} +1 -1
  89. package/dist/_chunks/editable-currency-cell-renderer-kgqp_mIw.js +448 -0
  90. package/dist/_chunks/editable-currency-cell-renderer-kgqp_mIw.js.map +1 -0
  91. package/dist/_chunks/editor-overlay-wYm22wZK.js.map +1 -1
  92. package/dist/_chunks/{email-input-lQivsFrw.js → email-input-B_Y55f5G.js} +3 -3
  93. package/dist/_chunks/{email-input-lQivsFrw.js.map → email-input-B_Y55f5G.js.map} +1 -1
  94. package/dist/_chunks/{fetal-weight-BVSzOhuR.js → fetal-weight-CRz7KE2D.js} +2 -2
  95. package/dist/_chunks/{fetal-weight-BVSzOhuR.js.map → fetal-weight-CRz7KE2D.js.map} +1 -1
  96. package/dist/_chunks/{file-upload-BosbPDb1.js → file-upload-5ScQd4fE.js} +118 -100
  97. package/dist/_chunks/file-upload-5ScQd4fE.js.map +1 -0
  98. package/dist/_chunks/{fiscal-code-input-DPtqluVb.js → fiscal-code-input-Cf-8O4Fj.js} +76 -63
  99. package/dist/_chunks/fiscal-code-input-Cf-8O4Fj.js.map +1 -0
  100. package/dist/_chunks/{freemium-paywall-CkWjv3o6.js → freemium-paywall-DZ2mBS3w.js} +78 -71
  101. package/dist/_chunks/freemium-paywall-DZ2mBS3w.js.map +1 -0
  102. package/dist/_chunks/{gestational-age-calculator-DBlFdoiP.js → gestational-age-calculator-BleUdhbI.js} +5 -5
  103. package/dist/_chunks/{gestational-age-calculator-DBlFdoiP.js.map → gestational-age-calculator-BleUdhbI.js.map} +1 -1
  104. package/dist/_chunks/{hcg-doubling-if4Q8aSX.js → hcg-doubling-CnjDXX6U.js} +3 -3
  105. package/dist/_chunks/{hcg-doubling-if4Q8aSX.js.map → hcg-doubling-CnjDXX6U.js.map} +1 -1
  106. package/dist/_chunks/{header-settings-CNOqIhoW.js → header-settings-DJqoAl5m.js} +86 -46
  107. package/dist/_chunks/header-settings-DJqoAl5m.js.map +1 -0
  108. package/dist/_chunks/{index.modern-D2LGACWg.js → index.modern-Zta-A4Jm.js} +3 -3
  109. package/dist/_chunks/{index.modern-D2LGACWg.js.map → index.modern-Zta-A4Jm.js.map} +1 -1
  110. package/dist/_chunks/{list-BOwqwy03.js → list-DgE1xWBM.js} +99 -84
  111. package/dist/_chunks/list-DgE1xWBM.js.map +1 -0
  112. package/dist/_chunks/{locale-picker-C9JmBht3.js → locale-picker-ChYYSX2N.js} +47 -35
  113. package/dist/_chunks/locale-picker-ChYYSX2N.js.map +1 -0
  114. package/dist/_chunks/{map-view-Tb5VfK9Y.js → map-view-BkOoGoX2.js} +160 -115
  115. package/dist/_chunks/map-view-BkOoGoX2.js.map +1 -0
  116. package/dist/_chunks/{marketplace-app-shell-D4-T9Qzz.js → marketplace-app-shell-6T9W4Knl.js} +4 -4
  117. package/dist/_chunks/{marketplace-app-shell-D4-T9Qzz.js.map → marketplace-app-shell-6T9W4Knl.js.map} +1 -1
  118. package/dist/_chunks/{message-card.agent-4IeIgrnJ.js → message-card.agent-ZLhx3Bs5.js} +6 -1
  119. package/dist/_chunks/message-card.agent-ZLhx3Bs5.js.map +1 -0
  120. package/dist/_chunks/{message-tray-CVyJajVJ.js → message-tray-DwrBLJlf.js} +90 -48
  121. package/dist/_chunks/message-tray-DwrBLJlf.js.map +1 -0
  122. package/dist/_chunks/{multi-select-BcPylvHR.js → multi-select-BdHHDrRN.js} +196 -153
  123. package/dist/_chunks/multi-select-BdHHDrRN.js.map +1 -0
  124. package/dist/_chunks/{navigation-menu-C6lBYVv9.js → navigation-menu-DRUi6sSj.js} +75 -42
  125. package/dist/_chunks/navigation-menu-DRUi6sSj.js.map +1 -0
  126. package/dist/_chunks/{notification-card.agent-Rqt3ofk9.js → notification-card.agent-DxGBZb8T.js} +5 -1
  127. package/dist/_chunks/notification-card.agent-DxGBZb8T.js.map +1 -0
  128. package/dist/_chunks/{notification-tray-DlgenTEe.js → notification-tray-Btb9oQeZ.js} +112 -97
  129. package/dist/_chunks/notification-tray-Btb9oQeZ.js.map +1 -0
  130. package/dist/_chunks/{number-input-Dj5L3pXK.js → number-input-DxphVG_A.js} +36 -27
  131. package/dist/_chunks/number-input-DxphVG_A.js.map +1 -0
  132. package/dist/_chunks/{operator-hero-f_KaRhw5.js → operator-hero-CP2Nhupm.js} +12 -8
  133. package/dist/_chunks/operator-hero-CP2Nhupm.js.map +1 -0
  134. package/dist/_chunks/{otp-input-xQ4Ps5VY.js → otp-input-DzBQ-CpE.js} +52 -33
  135. package/dist/_chunks/otp-input-DzBQ-CpE.js.map +1 -0
  136. package/dist/_chunks/{pagination-DQOgnxxw.js → pagination-D58kglCr.js} +181 -162
  137. package/dist/_chunks/pagination-D58kglCr.js.map +1 -0
  138. package/dist/_chunks/{patient-search-DR9XUYRQ.js → patient-search-CBC_ySF6.js} +69 -60
  139. package/dist/_chunks/patient-search-CBC_ySF6.js.map +1 -0
  140. package/dist/_chunks/{patient-shell-BfgufL_q.js → patient-shell-DV3XEtIB.js} +3 -3
  141. package/dist/_chunks/{patient-shell-BfgufL_q.js.map → patient-shell-DV3XEtIB.js.map} +1 -1
  142. package/dist/_chunks/{patient-summary-card-hEmr4eTW.js → patient-summary-card-B836_fDB.js} +95 -103
  143. package/dist/_chunks/patient-summary-card-B836_fDB.js.map +1 -0
  144. package/dist/_chunks/patient-table-CDuosVru.js +889 -0
  145. package/dist/_chunks/patient-table-CDuosVru.js.map +1 -0
  146. package/dist/_chunks/{payment-form-nXocS_MX.js → payment-form-DvjwYVIT.js} +56 -44
  147. package/dist/_chunks/payment-form-DvjwYVIT.js.map +1 -0
  148. package/dist/_chunks/{payment-request-card-CYE5vhZ0.js → payment-request-card-DioWKBUq.js} +2 -2
  149. package/dist/_chunks/{payment-request-card-CYE5vhZ0.js.map → payment-request-card-DioWKBUq.js.map} +1 -1
  150. package/dist/_chunks/{pdf-viewer-GsfNqeeT.js → pdf-viewer-D6BPfW2D.js} +205 -157
  151. package/dist/_chunks/pdf-viewer-D6BPfW2D.js.map +1 -0
  152. package/dist/_chunks/{periodontal-chart-card-Dh3KgvYG.js → periodontal-chart-card-BuDEMbHE.js} +2 -2
  153. package/dist/_chunks/{periodontal-chart-card-Dh3KgvYG.js.map → periodontal-chart-card-BuDEMbHE.js.map} +1 -1
  154. package/dist/_chunks/{phone-input-DVXhNlIl.js → phone-input-DjU-XmO_.js} +64 -47
  155. package/dist/_chunks/phone-input-DjU-XmO_.js.map +1 -0
  156. package/dist/_chunks/{popover-DTbfAuR0.js → popover-B2qCDhJC.js} +37 -32
  157. package/dist/_chunks/popover-B2qCDhJC.js.map +1 -0
  158. package/dist/_chunks/{practice-results-DND2SAt7.js → practice-results-KrTHqZua.js} +278 -242
  159. package/dist/_chunks/practice-results-KrTHqZua.js.map +1 -0
  160. package/dist/_chunks/{pregnancy-dating-QY-sqpvj.js → pregnancy-dating-DORUAOHB.js} +6 -6
  161. package/dist/_chunks/{pregnancy-dating-QY-sqpvj.js.map → pregnancy-dating-DORUAOHB.js.map} +1 -1
  162. package/dist/_chunks/{pregnancy-weight-gain-DOJXXNYP.js → pregnancy-weight-gain-DVz4rr7-.js} +3 -3
  163. package/dist/_chunks/{pregnancy-weight-gain-DOJXXNYP.js.map → pregnancy-weight-gain-DVz4rr7-.js.map} +1 -1
  164. package/dist/_chunks/{privacy-lock-C7JyMf0y.js → privacy-lock-BzMLQu-j.js} +32 -28
  165. package/dist/_chunks/privacy-lock-BzMLQu-j.js.map +1 -0
  166. package/dist/_chunks/{product-hub-panel-CAXDFeGP.js → product-hub-panel-e6pW220e.js} +45 -27
  167. package/dist/_chunks/product-hub-panel-e6pW220e.js.map +1 -0
  168. package/dist/_chunks/{progress-kzIRcdaq.js → progress-DA413-zn.js} +2 -2
  169. package/dist/_chunks/{progress-kzIRcdaq.js.map → progress-DA413-zn.js.map} +1 -1
  170. package/dist/_chunks/{public-footer.agent-CfXuW1x6.js → public-footer.agent-D0cFbjWl.js} +151 -146
  171. package/dist/_chunks/public-footer.agent-D0cFbjWl.js.map +1 -0
  172. package/dist/_chunks/{public-header.agent-BOhJgZEU.js → public-header.agent-DqkqA-ca.js} +107 -102
  173. package/dist/_chunks/{public-header.agent-BOhJgZEU.js.map → public-header.agent-DqkqA-ca.js.map} +1 -1
  174. package/dist/_chunks/{qr-code-DNXhi6se.js → qr-code-CPkEs5mG.js} +52 -46
  175. package/dist/_chunks/qr-code-CPkEs5mG.js.map +1 -0
  176. package/dist/_chunks/{radio-group-CLjK-SlK.js → radio-group-BPt7pKZW.js} +5 -5
  177. package/dist/_chunks/{radio-group-CLjK-SlK.js.map → radio-group-BPt7pKZW.js.map} +1 -1
  178. package/dist/_chunks/{recaptcha-widget-BCNHsgqt.js → recaptcha-widget-BC-4To9b.js} +9 -2
  179. package/dist/_chunks/recaptcha-widget-BC-4To9b.js.map +1 -0
  180. package/dist/_chunks/registry-DvAUVLHh.js +51 -0
  181. package/dist/_chunks/registry-DvAUVLHh.js.map +1 -0
  182. package/dist/_chunks/{resizable-3vzqDlg6.js → resizable-DVGcfOrk.js} +193 -173
  183. package/dist/_chunks/resizable-DVGcfOrk.js.map +1 -0
  184. package/dist/_chunks/{reviews-panel-DBktKm7i.js → reviews-panel-Dq7LMDcH.js} +87 -68
  185. package/dist/_chunks/reviews-panel-Dq7LMDcH.js.map +1 -0
  186. package/dist/_chunks/rich-text-editor-BsV7zUdg.js +2142 -0
  187. package/dist/_chunks/rich-text-editor-BsV7zUdg.js.map +1 -0
  188. package/dist/_chunks/{search-bar-SY2BcV2N.js → search-bar-C_T3pBJn.js} +105 -78
  189. package/dist/_chunks/search-bar-C_T3pBJn.js.map +1 -0
  190. package/dist/_chunks/{search-input-DbxrnHkW.js → search-input-DQvGxR74.js} +2 -2
  191. package/dist/_chunks/{search-input-DbxrnHkW.js.map → search-input-DQvGxR74.js.map} +1 -1
  192. package/dist/_chunks/{search-input.agent-CfZvViOd.js → search-input.agent-DRH54coT.js} +19 -4
  193. package/dist/_chunks/search-input.agent-DRH54coT.js.map +1 -0
  194. package/dist/_chunks/{select-CEtRcon5.js → select-DMLG44F5.js} +72 -56
  195. package/dist/_chunks/select-DMLG44F5.js.map +1 -0
  196. package/dist/_chunks/{session-countdown-LPnhTHjn.js → session-countdown-X1Ki6i0M.js} +3 -3
  197. package/dist/_chunks/{session-countdown-LPnhTHjn.js.map → session-countdown-X1Ki6i0M.js.map} +1 -1
  198. package/dist/_chunks/{sheet-taJer-Ha.js → sheet-BxsE7eQm.js} +59 -45
  199. package/dist/_chunks/sheet-BxsE7eQm.js.map +1 -0
  200. package/dist/_chunks/{sidebar-DaB4ulxH.js → sidebar-DY9jGjgt.js} +254 -248
  201. package/dist/_chunks/sidebar-DY9jGjgt.js.map +1 -0
  202. package/dist/_chunks/{sign-document-CdAiHiCh.js → sign-document-B4DeRhTe.js} +75 -49
  203. package/dist/_chunks/sign-document-B4DeRhTe.js.map +1 -0
  204. package/dist/_chunks/{signature-capture-COi0Uiqu.js → signature-capture-Ct_4Md4e.js} +138 -104
  205. package/dist/_chunks/signature-capture-Ct_4Md4e.js.map +1 -0
  206. package/dist/_chunks/{slider-BHWzXdjt.js → slider-DN1CWkKB.js} +85 -65
  207. package/dist/_chunks/slider-DN1CWkKB.js.map +1 -0
  208. package/dist/_chunks/{sparkline-DGhCSw8M.js → sparkline-iOXYgvJe.js} +75 -53
  209. package/dist/_chunks/sparkline-iOXYgvJe.js.map +1 -0
  210. package/dist/_chunks/{stepper-accordion.agent-C4quJ-MD.js → stepper-accordion.agent-cmEguIdx.js} +7 -1
  211. package/dist/_chunks/stepper-accordion.agent-cmEguIdx.js.map +1 -0
  212. package/dist/_chunks/{stepper-progress-DDjq5nei.js → stepper-progress-Bv0njx4g.js} +30 -24
  213. package/dist/_chunks/stepper-progress-Bv0njx4g.js.map +1 -0
  214. package/dist/_chunks/{suggestion-chip.agent-6sNWFj7m.js → suggestion-chip.agent-Brn3CiFE.js} +9 -8
  215. package/dist/_chunks/{suggestion-chip.agent-6sNWFj7m.js.map → suggestion-chip.agent-Brn3CiFE.js.map} +1 -1
  216. package/dist/_chunks/{switch-BJ6HD3Mn.js → switch-OILsBLWo.js} +25 -19
  217. package/dist/_chunks/switch-OILsBLWo.js.map +1 -0
  218. package/dist/_chunks/{tabs-BIQ0ew1T.js → tabs-BxcOziCo.js} +67 -58
  219. package/dist/_chunks/tabs-BxcOziCo.js.map +1 -0
  220. package/dist/_chunks/{task-card.agent-CUPKYd7w.js → task-card.agent-Bt14CzUd.js} +4 -1
  221. package/dist/_chunks/task-card.agent-Bt14CzUd.js.map +1 -0
  222. package/dist/_chunks/{task-tray-CAncV-QQ.js → task-tray-qOEQflu4.js} +74 -57
  223. package/dist/_chunks/task-tray-qOEQflu4.js.map +1 -0
  224. package/dist/_chunks/{text-area-BIx0tZ05.js → text-area-Bt3p7Pt0.js} +41 -34
  225. package/dist/_chunks/text-area-Bt3p7Pt0.js.map +1 -0
  226. package/dist/_chunks/{text-input-BaClJL8Y.js → text-input-B-OWQ1Je.js} +15 -8
  227. package/dist/_chunks/text-input-B-OWQ1Je.js.map +1 -0
  228. package/dist/_chunks/{theme-toggle-DETmSu_h.js → theme-toggle-XB6o_lgs.js} +38 -26
  229. package/dist/_chunks/theme-toggle-XB6o_lgs.js.map +1 -0
  230. package/dist/_chunks/{time-picker-B5umYwfv.js → time-picker-BPlJWm8w.js} +41 -31
  231. package/dist/_chunks/time-picker-BPlJWm8w.js.map +1 -0
  232. package/dist/_chunks/{timeline-DQa5Tyz4.js → timeline-CqA4nKTI.js} +33 -25
  233. package/dist/_chunks/timeline-CqA4nKTI.js.map +1 -0
  234. package/dist/_chunks/{toast.agent-vuLRRn2a.js → toast.agent-57UzyR9U.js} +62 -45
  235. package/dist/_chunks/{toast.agent-vuLRRn2a.js.map → toast.agent-57UzyR9U.js.map} +1 -1
  236. package/dist/_chunks/{tooth-scheme-BIx1O2aJ.js → tooth-scheme-yBr53cvv.js} +421 -348
  237. package/dist/_chunks/tooth-scheme-yBr53cvv.js.map +1 -0
  238. package/dist/_chunks/{transcript-panel-CLHmv83g.js → transcript-panel-3THQX6nJ.js} +47 -33
  239. package/dist/_chunks/transcript-panel-3THQX6nJ.js.map +1 -0
  240. package/dist/_chunks/unit-converter-YEpD9evj.js +337 -0
  241. package/dist/_chunks/unit-converter-YEpD9evj.js.map +1 -0
  242. package/dist/_chunks/{use-password-requirements-DsgduV1x.js → use-password-requirements-BXvS2MBS.js} +131 -117
  243. package/dist/_chunks/use-password-requirements-BXvS2MBS.js.map +1 -0
  244. package/dist/_chunks/users-MBVtUzwd.js +17 -0
  245. package/dist/_chunks/users-MBVtUzwd.js.map +1 -0
  246. package/dist/_chunks/warning-stack-BsgaEbL8.js +283 -0
  247. package/dist/_chunks/warning-stack-BsgaEbL8.js.map +1 -0
  248. package/dist/_chunks/{whatsapp-button-DUjlWGKf.js → whatsapp-button-BIy6NaJK.js} +6 -3
  249. package/dist/_chunks/whatsapp-button-BIy6NaJK.js.map +1 -0
  250. package/dist/_chunks/{workflow-map-JAZryZJr.js → workflow-map-Bdam9pGp.js} +99 -88
  251. package/dist/_chunks/workflow-map-Bdam9pGp.js.map +1 -0
  252. package/dist/agent/index.d.ts +4 -4
  253. package/dist/agent/index.d.ts.map +1 -1
  254. package/dist/agent/index.js +36 -0
  255. package/dist/agent/index.js.map +1 -0
  256. package/dist/agent/registry.d.ts +33 -0
  257. package/dist/agent/registry.d.ts.map +1 -1
  258. package/dist/agent/types.d.ts +78 -2
  259. package/dist/agent/types.d.ts.map +1 -1
  260. package/dist/agent-catalog.json +6905 -509
  261. package/dist/agent-i18n/en.json +1175 -0
  262. package/dist/components/accordion/accordion.agent.d.ts.map +1 -1
  263. package/dist/components/accordion/accordion.d.ts.map +1 -1
  264. package/dist/components/accordion/index.js +1 -1
  265. package/dist/components/address-autocomplete/address-autocomplete.agent.d.ts +4 -0
  266. package/dist/components/address-autocomplete/address-autocomplete.agent.d.ts.map +1 -0
  267. package/dist/components/address-autocomplete/address-autocomplete.d.ts +18 -0
  268. package/dist/components/address-autocomplete/address-autocomplete.d.ts.map +1 -1
  269. package/dist/components/address-autocomplete/index.d.ts +2 -1
  270. package/dist/components/address-autocomplete/index.d.ts.map +1 -1
  271. package/dist/components/address-autocomplete/index.js +3 -2
  272. package/dist/components/agenda-card/agenda-card.agent.d.ts.map +1 -1
  273. package/dist/components/agenda-card/index.js +1 -1
  274. package/dist/components/agenda-tray/agenda-tray.agent.d.ts.map +1 -1
  275. package/dist/components/agenda-tray/index.js +1 -1
  276. package/dist/components/ai-consent-banner/index.js +1 -1
  277. package/dist/components/ai-prompt-input/ai-prompt-input.agent.d.ts.map +1 -1
  278. package/dist/components/ai-prompt-input/index.js +1 -1
  279. package/dist/components/ai-tools-rail/ai-tools-rail.agent.d.ts.map +1 -1
  280. package/dist/components/ai-tools-rail/index.js +1 -1
  281. package/dist/components/anamnesis-card/index.js +1 -1
  282. package/dist/components/appointment-card/appointment-card.agent.d.ts.map +1 -1
  283. package/dist/components/appointment-card/appointment-tray.agent.d.ts.map +1 -1
  284. package/dist/components/appointment-card/index.js +1 -1
  285. package/dist/components/audio-recorder/audio-recorder.agent.d.ts.map +1 -1
  286. package/dist/components/audio-recorder/index.js +1 -1
  287. package/dist/components/autocomplete/autocomplete.agent.d.ts.map +1 -1
  288. package/dist/components/autocomplete/autocomplete.d.ts.map +1 -1
  289. package/dist/components/autocomplete/index.js +1 -1
  290. package/dist/components/bishop-score/bishop-score.agent.d.ts +4 -0
  291. package/dist/components/bishop-score/bishop-score.agent.d.ts.map +1 -0
  292. package/dist/components/bishop-score/bishop-score.d.ts +17 -1
  293. package/dist/components/bishop-score/bishop-score.d.ts.map +1 -1
  294. package/dist/components/bishop-score/index.js +1 -1
  295. package/dist/components/bmi-calculator/bmi-calculator.agent.d.ts +4 -0
  296. package/dist/components/bmi-calculator/bmi-calculator.agent.d.ts.map +1 -0
  297. package/dist/components/bmi-calculator/bmi-calculator.d.ts +26 -0
  298. package/dist/components/bmi-calculator/bmi-calculator.d.ts.map +1 -1
  299. package/dist/components/bmi-calculator/index.js +1 -1
  300. package/dist/components/booking/booking.agent.d.ts.map +1 -1
  301. package/dist/components/booking/index.js +1 -1
  302. package/dist/components/breadcrumb/breadcrumb.agent.d.ts.map +1 -1
  303. package/dist/components/breadcrumb/index.js +1 -1
  304. package/dist/components/calculator-dialog/index.js +1 -1
  305. package/dist/components/calendar/calendar.agent.d.ts.map +1 -1
  306. package/dist/components/calendar/index.js +1 -1
  307. package/dist/components/care-plan-card/care-plan-card.agent.d.ts.map +1 -1
  308. package/dist/components/care-plan-card/index.js +1 -1
  309. package/dist/components/care-plan-entry-card/care-plan-entry-card.agent.d.ts.map +1 -1
  310. package/dist/components/care-plan-entry-card/index.js +1 -1
  311. package/dist/components/carousel/carousel.agent.d.ts.map +1 -1
  312. package/dist/components/carousel/index.js +1 -1
  313. package/dist/components/chart/chart.agent.d.ts.map +1 -1
  314. package/dist/components/chart/index.js +1 -1
  315. package/dist/components/chat-container/chat-container.agent.d.ts.map +1 -1
  316. package/dist/components/chat-container/index.js +1 -1
  317. package/dist/components/chat-input/chat-input.agent.d.ts.map +1 -1
  318. package/dist/components/chat-input/index.js +1 -1
  319. package/dist/components/checkbox/checkbox.agent.d.ts.map +1 -1
  320. package/dist/components/checkbox/index.js +1 -1
  321. package/dist/components/checkbox-group/index.js +1 -1
  322. package/dist/components/clinical-note-card/index.js +1 -1
  323. package/dist/components/collapsible/collapsible.agent.d.ts.map +1 -1
  324. package/dist/components/collapsible/index.js +1 -1
  325. package/dist/components/color-picker/color-picker.agent.d.ts.map +1 -1
  326. package/dist/components/color-picker/index.js +1 -1
  327. package/dist/components/combobox/combobox.agent.d.ts.map +1 -1
  328. package/dist/components/combobox/combobox.d.ts.map +1 -1
  329. package/dist/components/combobox/index.js +1 -1
  330. package/dist/components/command-palette/command-palette.agent.d.ts.map +1 -1
  331. package/dist/components/command-palette/command-palette.d.ts.map +1 -1
  332. package/dist/components/command-palette/index.js +1 -1
  333. package/dist/components/contact-profile-card/contact-profile-card.agent.d.ts.map +1 -1
  334. package/dist/components/contact-profile-card/index.js +1 -1
  335. package/dist/components/copy-field/copy-field.agent.d.ts.map +1 -1
  336. package/dist/components/copy-field/index.js +1 -1
  337. package/dist/components/counter/counter.d.ts +22 -0
  338. package/dist/components/counter/counter.d.ts.map +1 -0
  339. package/dist/components/counter/index.d.ts +3 -0
  340. package/dist/components/counter/index.d.ts.map +1 -0
  341. package/dist/components/counter/index.js +5 -0
  342. package/dist/components/counter/index.js.map +1 -0
  343. package/dist/components/cycle-calculator/index.js +1 -1
  344. package/dist/components/data-table/data-table.agent.d.ts.map +1 -1
  345. package/dist/components/data-table/data-table.d.ts +1 -1
  346. package/dist/components/data-table/data-table.d.ts.map +1 -1
  347. package/dist/components/data-table/filters/date-range-filter.d.ts +1 -1
  348. package/dist/components/data-table/filters/date-range-filter.d.ts.map +1 -1
  349. package/dist/components/data-table/index.js +31 -30
  350. package/dist/components/data-table/index.js.map +1 -1
  351. package/dist/components/data-table/toolbar.d.ts +4 -1
  352. package/dist/components/data-table/toolbar.d.ts.map +1 -1
  353. package/dist/components/date-picker/date-picker.agent.d.ts.map +1 -1
  354. package/dist/components/date-picker/index.js +1 -1
  355. package/dist/components/date-range-picker/date-range-picker.agent.d.ts.map +1 -1
  356. package/dist/components/date-range-picker/index.js +1 -1
  357. package/dist/components/date-time-picker/date-time-picker.agent.d.ts.map +1 -1
  358. package/dist/components/date-time-picker/index.js +1 -1
  359. package/dist/components/dependent-selector/dependent-selector.agent.d.ts.map +1 -1
  360. package/dist/components/dependent-selector/index.js +1 -1
  361. package/dist/components/dialog/dialog.agent.d.ts.map +1 -1
  362. package/dist/components/dialog/index.js +1 -1
  363. package/dist/components/document-scanner/document-scanner.agent.d.ts.map +1 -1
  364. package/dist/components/document-scanner/index.js +1 -1
  365. package/dist/components/dropdown-menu/dropdown-menu.agent.d.ts.map +1 -1
  366. package/dist/components/dropdown-menu/index.js +1 -1
  367. package/dist/components/due-date-calculator/index.js +1 -1
  368. package/dist/components/editor-overlay/editor-overlay.d.ts.map +1 -1
  369. package/dist/components/email-input/index.js +1 -1
  370. package/dist/components/fetal-weight/index.js +1 -1
  371. package/dist/components/file-upload/file-upload.agent.d.ts.map +1 -1
  372. package/dist/components/file-upload/index.js +1 -1
  373. package/dist/components/fiscal-code-input/fiscal-code-input.agent.d.ts.map +1 -1
  374. package/dist/components/fiscal-code-input/index.js +1 -1
  375. package/dist/components/freemium-paywall/freemium-paywall.agent.d.ts.map +1 -1
  376. package/dist/components/freemium-paywall/freemium-paywall.d.ts +6 -0
  377. package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
  378. package/dist/components/freemium-paywall/index.js +1 -1
  379. package/dist/components/gestational-age-calculator/index.js +1 -1
  380. package/dist/components/hcg-doubling/index.js +1 -1
  381. package/dist/components/header-settings/header-settings.agent.d.ts.map +1 -1
  382. package/dist/components/header-settings/index.js +1 -1
  383. package/dist/components/index.d.ts +2 -0
  384. package/dist/components/index.d.ts.map +1 -1
  385. package/dist/components/list/index.js +1 -1
  386. package/dist/components/list/list.agent.d.ts.map +1 -1
  387. package/dist/components/locale-picker/index.js +1 -1
  388. package/dist/components/locale-picker/locale-picker.agent.d.ts.map +1 -1
  389. package/dist/components/map-view/index.js +1 -1
  390. package/dist/components/map-view/map-view.agent.d.ts.map +1 -1
  391. package/dist/components/message-card/index.js +1 -1
  392. package/dist/components/message-card/message-card.agent.d.ts.map +1 -1
  393. package/dist/components/message-tray/index.js +1 -1
  394. package/dist/components/message-tray/message-tray.agent.d.ts.map +1 -1
  395. package/dist/components/multi-select/index.js +1 -1
  396. package/dist/components/multi-select/multi-select.agent.d.ts.map +1 -1
  397. package/dist/components/multi-select/multi-select.d.ts.map +1 -1
  398. package/dist/components/navigation-menu/index.js +1 -1
  399. package/dist/components/navigation-menu/navigation-menu.agent.d.ts.map +1 -1
  400. package/dist/components/notification-card/index.js +1 -1
  401. package/dist/components/notification-card/notification-card.agent.d.ts.map +1 -1
  402. package/dist/components/notification-tray/index.js +1 -1
  403. package/dist/components/notification-tray/notification-tray.agent.d.ts.map +1 -1
  404. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  405. package/dist/components/number-input/index.js +1 -1
  406. package/dist/components/number-input/number-input.agent.d.ts.map +1 -1
  407. package/dist/components/operator-hero/index.js +1 -1
  408. package/dist/components/operator-hero/operator-hero.agent.d.ts.map +1 -1
  409. package/dist/components/otp-input/index.js +1 -1
  410. package/dist/components/otp-input/otp-input.agent.d.ts.map +1 -1
  411. package/dist/components/pagination/index.js +1 -1
  412. package/dist/components/pagination/pagination.agent.d.ts.map +1 -1
  413. package/dist/components/password-input/index.js +1 -1
  414. package/dist/components/password-input/password-input.agent.d.ts.map +1 -1
  415. package/dist/components/patient-search/index.js +1 -1
  416. package/dist/components/patient-search/patient-search.agent.d.ts.map +1 -1
  417. package/dist/components/patient-summary-card/index.js +1 -1
  418. package/dist/components/patient-summary-card/patient-summary-card.agent.d.ts.map +1 -1
  419. package/dist/components/patient-table/cell-renderers/balance-badge-cell.d.ts +13 -0
  420. package/dist/components/patient-table/cell-renderers/balance-badge-cell.d.ts.map +1 -0
  421. package/dist/components/patient-table/cell-renderers/care-plan-status-cell.d.ts +43 -0
  422. package/dist/components/patient-table/cell-renderers/care-plan-status-cell.d.ts.map +1 -0
  423. package/dist/components/patient-table/cell-renderers/contact-cell.d.ts +45 -0
  424. package/dist/components/patient-table/cell-renderers/contact-cell.d.ts.map +1 -0
  425. package/dist/components/patient-table/cell-renderers/next-appointment-cell.d.ts +24 -0
  426. package/dist/components/patient-table/cell-renderers/next-appointment-cell.d.ts.map +1 -0
  427. package/dist/components/patient-table/cell-renderers/patient-identity-cell.d.ts +26 -0
  428. package/dist/components/patient-table/cell-renderers/patient-identity-cell.d.ts.map +1 -0
  429. package/dist/components/patient-table/columns.d.ts +102 -0
  430. package/dist/components/patient-table/columns.d.ts.map +1 -0
  431. package/dist/components/patient-table/index.d.ts +24 -0
  432. package/dist/components/patient-table/index.d.ts.map +1 -0
  433. package/dist/components/patient-table/index.js +13 -0
  434. package/dist/components/patient-table/index.js.map +1 -0
  435. package/dist/components/patient-table/patient-table.d.ts +138 -0
  436. package/dist/components/patient-table/patient-table.d.ts.map +1 -0
  437. package/dist/components/patient-table/types.d.ts +172 -0
  438. package/dist/components/patient-table/types.d.ts.map +1 -0
  439. package/dist/components/patient-table/use-responsive-columns.d.ts +109 -0
  440. package/dist/components/patient-table/use-responsive-columns.d.ts.map +1 -0
  441. package/dist/components/payment-card/index.js +1 -1
  442. package/dist/components/payment-form/index.js +1 -1
  443. package/dist/components/payment-form/payment-form.agent.d.ts.map +1 -1
  444. package/dist/components/pdf-viewer/index.js +1 -1
  445. package/dist/components/pdf-viewer/pdf-viewer.agent.d.ts.map +1 -1
  446. package/dist/components/periodontal-chart-card/index.js +1 -1
  447. package/dist/components/phone-input/index.js +1 -1
  448. package/dist/components/phone-input/phone-input.agent.d.ts.map +1 -1
  449. package/dist/components/popover/index.js +1 -1
  450. package/dist/components/popover/popover.agent.d.ts.map +1 -1
  451. package/dist/components/practice-results/index.js +1 -1
  452. package/dist/components/practice-results/practice-results.agent.d.ts.map +1 -1
  453. package/dist/components/pregnancy-dating/index.js +1 -1
  454. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  455. package/dist/components/privacy-lock/index.js +1 -1
  456. package/dist/components/privacy-lock/privacy-lock.agent.d.ts.map +1 -1
  457. package/dist/components/product-hub-tray/index.js +1 -1
  458. package/dist/components/product-hub-tray/product-hub-panel.agent.d.ts.map +1 -1
  459. package/dist/components/product-hub-tray/product-hub-tray.agent.d.ts.map +1 -1
  460. package/dist/components/progress/index.js +1 -1
  461. package/dist/components/public-footer/index.js +1 -1
  462. package/dist/components/public-footer/public-footer.agent.d.ts.map +1 -1
  463. package/dist/components/public-footer/public-footer.d.ts.map +1 -1
  464. package/dist/components/public-header/index.js +1 -1
  465. package/dist/components/public-header/public-header.agent.d.ts.map +1 -1
  466. package/dist/components/qr-code/index.js +1 -1
  467. package/dist/components/qr-code/qr-code.agent.d.ts.map +1 -1
  468. package/dist/components/radio-group/index.js +1 -1
  469. package/dist/components/recaptcha-widget/index.js +1 -1
  470. package/dist/components/recaptcha-widget/recaptcha-widget.agent.d.ts.map +1 -1
  471. package/dist/components/resizable/index.js +1 -1
  472. package/dist/components/resizable/resizable.agent.d.ts.map +1 -1
  473. package/dist/components/resizable/resizable.d.ts.map +1 -1
  474. package/dist/components/reviews-panel/index.js +1 -1
  475. package/dist/components/reviews-panel/reviews-panel.agent.d.ts.map +1 -1
  476. package/dist/components/rich-text-editor/help-me-write-overlay.d.ts.map +1 -1
  477. package/dist/components/rich-text-editor/index.js +1 -1
  478. package/dist/components/rich-text-editor/rich-text-editor.agent.d.ts.map +1 -1
  479. package/dist/components/rich-text-editor/rich-text-editor.d.ts +15 -0
  480. package/dist/components/rich-text-editor/rich-text-editor.d.ts.map +1 -1
  481. package/dist/components/search-bar/index.js +1 -1
  482. package/dist/components/search-bar/search-bar.agent.d.ts.map +1 -1
  483. package/dist/components/search-input/index.js +2 -2
  484. package/dist/components/search-input/search-input.agent.d.ts.map +1 -1
  485. package/dist/components/select/index.js +1 -1
  486. package/dist/components/select/select.agent.d.ts.map +1 -1
  487. package/dist/components/session-countdown/index.js +1 -1
  488. package/dist/components/sheet/index.js +1 -1
  489. package/dist/components/sheet/sheet.agent.d.ts.map +1 -1
  490. package/dist/components/sidebar/index.js +1 -1
  491. package/dist/components/sidebar/sidebar.agent.d.ts.map +1 -1
  492. package/dist/components/sidebar/sidebar.d.ts +7 -0
  493. package/dist/components/sidebar/sidebar.d.ts.map +1 -1
  494. package/dist/components/sign-document/index.js +1 -1
  495. package/dist/components/sign-document/sign-document.agent.d.ts.map +1 -1
  496. package/dist/components/signature-capture/index.js +1 -1
  497. package/dist/components/signature-capture/signature-capture.agent.d.ts.map +1 -1
  498. package/dist/components/slider/index.js +1 -1
  499. package/dist/components/slider/slider.agent.d.ts.map +1 -1
  500. package/dist/components/sparkline/index.js +1 -1
  501. package/dist/components/sparkline/sparkline.agent.d.ts.map +1 -1
  502. package/dist/components/stepper-accordion/index.js +1 -1
  503. package/dist/components/stepper-accordion/stepper-accordion.agent.d.ts.map +1 -1
  504. package/dist/components/stepper-progress/index.js +1 -1
  505. package/dist/components/stepper-progress/stepper-progress.agent.d.ts.map +1 -1
  506. package/dist/components/suggestion-chip/index.js +1 -1
  507. package/dist/components/suggestion-chip/suggestion-chip.agent.d.ts.map +1 -1
  508. package/dist/components/switch/index.js +1 -1
  509. package/dist/components/switch/switch.agent.d.ts.map +1 -1
  510. package/dist/components/tabs/index.js +1 -1
  511. package/dist/components/tabs/tabs.agent.d.ts.map +1 -1
  512. package/dist/components/tabs/tabs.d.ts.map +1 -1
  513. package/dist/components/task-card/index.js +1 -1
  514. package/dist/components/task-card/task-card.agent.d.ts.map +1 -1
  515. package/dist/components/task-tray/index.js +1 -1
  516. package/dist/components/task-tray/task-tray.agent.d.ts.map +1 -1
  517. package/dist/components/text-area/index.js +1 -1
  518. package/dist/components/text-area/text-area.agent.d.ts.map +1 -1
  519. package/dist/components/text-input/index.js +1 -1
  520. package/dist/components/text-input/text-input.agent.d.ts.map +1 -1
  521. package/dist/components/theme-toggle/index.js +1 -1
  522. package/dist/components/theme-toggle/theme-toggle.agent.d.ts.map +1 -1
  523. package/dist/components/time-picker/index.js +1 -1
  524. package/dist/components/time-picker/time-picker.agent.d.ts.map +1 -1
  525. package/dist/components/timeline/index.js +1 -1
  526. package/dist/components/timeline/timeline.agent.d.ts.map +1 -1
  527. package/dist/components/toast/index.js +1 -1
  528. package/dist/components/toast/toast.agent.d.ts.map +1 -1
  529. package/dist/components/toast/toast.d.ts.map +1 -1
  530. package/dist/components/tooth-scheme/index.js +1 -1
  531. package/dist/components/tooth-scheme/tooth-scheme.agent.d.ts.map +1 -1
  532. package/dist/components/transcript-panel/index.js +1 -1
  533. package/dist/components/transcript-panel/transcript-panel.agent.d.ts.map +1 -1
  534. package/dist/components/unit-converter/index.js +1 -1
  535. package/dist/components/unit-converter/unit-converter.agent.d.ts +4 -0
  536. package/dist/components/unit-converter/unit-converter.agent.d.ts.map +1 -0
  537. package/dist/components/unit-converter/unit-converter.d.ts +27 -0
  538. package/dist/components/unit-converter/unit-converter.d.ts.map +1 -1
  539. package/dist/components/warning-stack/index.js +1 -1
  540. package/dist/components/warning-stack/warning-stack.d.ts +9 -0
  541. package/dist/components/warning-stack/warning-stack.d.ts.map +1 -1
  542. package/dist/components/whatsapp-button/index.d.ts +1 -1
  543. package/dist/components/whatsapp-button/index.d.ts.map +1 -1
  544. package/dist/components/whatsapp-button/index.js +3 -2
  545. package/dist/components/whatsapp-button/whatsapp-button.d.ts +3 -0
  546. package/dist/components/whatsapp-button/whatsapp-button.d.ts.map +1 -1
  547. package/dist/components/workflow/index.js +1 -1
  548. package/dist/components/workflow/workflow.agent.d.ts.map +1 -1
  549. package/dist/i18n/locales/ar.d.ts +74 -0
  550. package/dist/i18n/locales/ar.d.ts.map +1 -1
  551. package/dist/i18n/locales/ar.js +76 -2
  552. package/dist/i18n/locales/ar.js.map +1 -1
  553. package/dist/i18n/locales/de.d.ts +74 -0
  554. package/dist/i18n/locales/de.d.ts.map +1 -1
  555. package/dist/i18n/locales/de.js +76 -2
  556. package/dist/i18n/locales/de.js.map +1 -1
  557. package/dist/i18n/locales/el.d.ts +74 -0
  558. package/dist/i18n/locales/el.d.ts.map +1 -1
  559. package/dist/i18n/locales/el.js +76 -2
  560. package/dist/i18n/locales/el.js.map +1 -1
  561. package/dist/i18n/locales/en.d.ts +92 -0
  562. package/dist/i18n/locales/en.d.ts.map +1 -1
  563. package/dist/i18n/locales/en.js +94 -2
  564. package/dist/i18n/locales/en.js.map +1 -1
  565. package/dist/i18n/locales/es.d.ts +74 -0
  566. package/dist/i18n/locales/es.d.ts.map +1 -1
  567. package/dist/i18n/locales/es.js +76 -2
  568. package/dist/i18n/locales/es.js.map +1 -1
  569. package/dist/i18n/locales/fr.d.ts +74 -0
  570. package/dist/i18n/locales/fr.d.ts.map +1 -1
  571. package/dist/i18n/locales/fr.js +76 -2
  572. package/dist/i18n/locales/fr.js.map +1 -1
  573. package/dist/i18n/locales/hi.d.ts +74 -0
  574. package/dist/i18n/locales/hi.d.ts.map +1 -1
  575. package/dist/i18n/locales/hi.js +76 -2
  576. package/dist/i18n/locales/hi.js.map +1 -1
  577. package/dist/i18n/locales/it.d.ts +74 -0
  578. package/dist/i18n/locales/it.d.ts.map +1 -1
  579. package/dist/i18n/locales/it.js +76 -2
  580. package/dist/i18n/locales/it.js.map +1 -1
  581. package/dist/i18n/locales/ja.d.ts +74 -0
  582. package/dist/i18n/locales/ja.d.ts.map +1 -1
  583. package/dist/i18n/locales/ja.js +76 -2
  584. package/dist/i18n/locales/ja.js.map +1 -1
  585. package/dist/i18n/locales/nl.d.ts +74 -0
  586. package/dist/i18n/locales/nl.d.ts.map +1 -1
  587. package/dist/i18n/locales/nl.js +76 -2
  588. package/dist/i18n/locales/nl.js.map +1 -1
  589. package/dist/i18n/locales/pl.d.ts +74 -0
  590. package/dist/i18n/locales/pl.d.ts.map +1 -1
  591. package/dist/i18n/locales/pl.js +76 -2
  592. package/dist/i18n/locales/pl.js.map +1 -1
  593. package/dist/i18n/locales/pt.d.ts +74 -0
  594. package/dist/i18n/locales/pt.d.ts.map +1 -1
  595. package/dist/i18n/locales/pt.js +76 -2
  596. package/dist/i18n/locales/pt.js.map +1 -1
  597. package/dist/i18n/locales/ro.d.ts +74 -0
  598. package/dist/i18n/locales/ro.d.ts.map +1 -1
  599. package/dist/i18n/locales/ro.js +76 -2
  600. package/dist/i18n/locales/ro.js.map +1 -1
  601. package/dist/i18n/locales/ru.d.ts +74 -0
  602. package/dist/i18n/locales/ru.d.ts.map +1 -1
  603. package/dist/i18n/locales/ru.js +76 -2
  604. package/dist/i18n/locales/ru.js.map +1 -1
  605. package/dist/i18n/locales/sq.d.ts +74 -0
  606. package/dist/i18n/locales/sq.d.ts.map +1 -1
  607. package/dist/i18n/locales/sq.js +76 -2
  608. package/dist/i18n/locales/sq.js.map +1 -1
  609. package/dist/i18n/locales/sv.d.ts +74 -0
  610. package/dist/i18n/locales/sv.d.ts.map +1 -1
  611. package/dist/i18n/locales/sv.js +76 -2
  612. package/dist/i18n/locales/sv.js.map +1 -1
  613. package/dist/i18n/locales/tr.d.ts +74 -0
  614. package/dist/i18n/locales/tr.d.ts.map +1 -1
  615. package/dist/i18n/locales/tr.js +76 -2
  616. package/dist/i18n/locales/tr.js.map +1 -1
  617. package/dist/i18n/locales/zh.d.ts +74 -0
  618. package/dist/i18n/locales/zh.d.ts.map +1 -1
  619. package/dist/i18n/locales/zh.js +76 -2
  620. package/dist/i18n/locales/zh.js.map +1 -1
  621. package/dist/index.js +688 -673
  622. package/dist/index.js.map +1 -1
  623. package/dist/locales/ar.json +76 -2
  624. package/dist/locales/de.json +76 -2
  625. package/dist/locales/el.json +76 -2
  626. package/dist/locales/en.json +76 -2
  627. package/dist/locales/es.json +76 -2
  628. package/dist/locales/fr.json +76 -2
  629. package/dist/locales/hi.json +76 -2
  630. package/dist/locales/it.json +76 -2
  631. package/dist/locales/ja.json +76 -2
  632. package/dist/locales/nl.json +76 -2
  633. package/dist/locales/pl.json +76 -2
  634. package/dist/locales/pt.json +76 -2
  635. package/dist/locales/ro.json +76 -2
  636. package/dist/locales/ru.json +76 -2
  637. package/dist/locales/sq.json +76 -2
  638. package/dist/locales/sv.json +76 -2
  639. package/dist/locales/tr.json +76 -2
  640. package/dist/locales/zh.json +76 -2
  641. package/dist/patterns/alia-assistant/index.js +1 -1
  642. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  643. package/dist/patterns/patient-shell/index.js +1 -1
  644. package/dist/tokens.css +3 -2
  645. package/package.json +14 -1
  646. package/dist/_chunks/accordion-9lJSMMsZ.js.map +0 -1
  647. package/dist/_chunks/address-autocomplete-CT-9AOli.js +0 -358
  648. package/dist/_chunks/address-autocomplete-CT-9AOli.js.map +0 -1
  649. package/dist/_chunks/agenda-tray-T-BumlGZ.js.map +0 -1
  650. package/dist/_chunks/ai-prompt-input-BwEACCPm.js.map +0 -1
  651. package/dist/_chunks/ai-tools-rail-CInA_1-E.js.map +0 -1
  652. package/dist/_chunks/appointment-tray-BMl89NPW.js.map +0 -1
  653. package/dist/_chunks/audio-recorder-DjXLP4aF.js.map +0 -1
  654. package/dist/_chunks/autocomplete-CcCFlVf-.js.map +0 -1
  655. package/dist/_chunks/bishop-score-CjsB9bM-.js +0 -185
  656. package/dist/_chunks/bishop-score-CjsB9bM-.js.map +0 -1
  657. package/dist/_chunks/bmi-calculator-n-823_1V.js +0 -258
  658. package/dist/_chunks/bmi-calculator-n-823_1V.js.map +0 -1
  659. package/dist/_chunks/booking-L8-YP8BJ.js.map +0 -1
  660. package/dist/_chunks/breadcrumb-OTbaY70e.js.map +0 -1
  661. package/dist/_chunks/calendar-oYWOCrnf.js.map +0 -1
  662. package/dist/_chunks/care-plan-card-BwVUyUBb.js.map +0 -1
  663. package/dist/_chunks/care-plan-entry-card-VzdQHcOL.js.map +0 -1
  664. package/dist/_chunks/chart-Cg3e9EH9.js.map +0 -1
  665. package/dist/_chunks/chat-container-ogB4OskO.js.map +0 -1
  666. package/dist/_chunks/chat-input-B5zjNEUN.js.map +0 -1
  667. package/dist/_chunks/checkbox-DRcOdmXv.js.map +0 -1
  668. package/dist/_chunks/collapsible-X3oaLPU3.js.map +0 -1
  669. package/dist/_chunks/color-picker-FXpItIaF.js.map +0 -1
  670. package/dist/_chunks/combobox-BC-DFx8G.js.map +0 -1
  671. package/dist/_chunks/command-palette-BiPAAno-.js.map +0 -1
  672. package/dist/_chunks/contact-profile-card-7BMB85T6.js.map +0 -1
  673. package/dist/_chunks/copy-field-CCq7j6Zc.js.map +0 -1
  674. package/dist/_chunks/date-range-picker-C5BWfH_T.js.map +0 -1
  675. package/dist/_chunks/date-time-picker-Ze1My59T.js.map +0 -1
  676. package/dist/_chunks/dependent-selector-DpzGtr_J.js.map +0 -1
  677. package/dist/_chunks/dialog-DMGnSelc.js.map +0 -1
  678. package/dist/_chunks/document-scanner-D2qehl3-.js.map +0 -1
  679. package/dist/_chunks/dropdown-menu-DwwPovMZ.js.map +0 -1
  680. package/dist/_chunks/editable-currency-cell-renderer-D1ewvJKO.js +0 -2391
  681. package/dist/_chunks/editable-currency-cell-renderer-D1ewvJKO.js.map +0 -1
  682. package/dist/_chunks/file-upload-BosbPDb1.js.map +0 -1
  683. package/dist/_chunks/fiscal-code-input-DPtqluVb.js.map +0 -1
  684. package/dist/_chunks/freemium-paywall-CkWjv3o6.js.map +0 -1
  685. package/dist/_chunks/header-settings-CNOqIhoW.js.map +0 -1
  686. package/dist/_chunks/list-BOwqwy03.js.map +0 -1
  687. package/dist/_chunks/locale-picker-C9JmBht3.js.map +0 -1
  688. package/dist/_chunks/map-view-Tb5VfK9Y.js.map +0 -1
  689. package/dist/_chunks/message-card.agent-4IeIgrnJ.js.map +0 -1
  690. package/dist/_chunks/message-tray-CVyJajVJ.js.map +0 -1
  691. package/dist/_chunks/multi-select-BcPylvHR.js.map +0 -1
  692. package/dist/_chunks/navigation-menu-C6lBYVv9.js.map +0 -1
  693. package/dist/_chunks/notification-card.agent-Rqt3ofk9.js.map +0 -1
  694. package/dist/_chunks/notification-tray-DlgenTEe.js.map +0 -1
  695. package/dist/_chunks/number-input-Dj5L3pXK.js.map +0 -1
  696. package/dist/_chunks/operator-hero-f_KaRhw5.js.map +0 -1
  697. package/dist/_chunks/otp-input-xQ4Ps5VY.js.map +0 -1
  698. package/dist/_chunks/pagination-DQOgnxxw.js.map +0 -1
  699. package/dist/_chunks/patient-search-DR9XUYRQ.js.map +0 -1
  700. package/dist/_chunks/patient-summary-card-hEmr4eTW.js.map +0 -1
  701. package/dist/_chunks/payment-form-nXocS_MX.js.map +0 -1
  702. package/dist/_chunks/pdf-viewer-GsfNqeeT.js.map +0 -1
  703. package/dist/_chunks/phone-input-DVXhNlIl.js.map +0 -1
  704. package/dist/_chunks/popover-DTbfAuR0.js.map +0 -1
  705. package/dist/_chunks/practice-results-DND2SAt7.js.map +0 -1
  706. package/dist/_chunks/privacy-lock-C7JyMf0y.js.map +0 -1
  707. package/dist/_chunks/product-hub-panel-CAXDFeGP.js.map +0 -1
  708. package/dist/_chunks/public-footer.agent-CfXuW1x6.js.map +0 -1
  709. package/dist/_chunks/qr-code-DNXhi6se.js.map +0 -1
  710. package/dist/_chunks/recaptcha-widget-BCNHsgqt.js.map +0 -1
  711. package/dist/_chunks/registry-nPAVE19X.js +0 -21
  712. package/dist/_chunks/registry-nPAVE19X.js.map +0 -1
  713. package/dist/_chunks/resizable-3vzqDlg6.js.map +0 -1
  714. package/dist/_chunks/reviews-panel-DBktKm7i.js.map +0 -1
  715. package/dist/_chunks/rich-text-editor-DAeCXiQG.js +0 -1973
  716. package/dist/_chunks/rich-text-editor-DAeCXiQG.js.map +0 -1
  717. package/dist/_chunks/search-bar-SY2BcV2N.js.map +0 -1
  718. package/dist/_chunks/search-input.agent-CfZvViOd.js.map +0 -1
  719. package/dist/_chunks/select-CEtRcon5.js.map +0 -1
  720. package/dist/_chunks/sheet-taJer-Ha.js.map +0 -1
  721. package/dist/_chunks/sidebar-DaB4ulxH.js.map +0 -1
  722. package/dist/_chunks/sign-document-CdAiHiCh.js.map +0 -1
  723. package/dist/_chunks/signature-capture-COi0Uiqu.js.map +0 -1
  724. package/dist/_chunks/slider-BHWzXdjt.js.map +0 -1
  725. package/dist/_chunks/sparkline-DGhCSw8M.js.map +0 -1
  726. package/dist/_chunks/stepper-accordion.agent-C4quJ-MD.js.map +0 -1
  727. package/dist/_chunks/stepper-progress-DDjq5nei.js.map +0 -1
  728. package/dist/_chunks/switch-BJ6HD3Mn.js.map +0 -1
  729. package/dist/_chunks/tabs-BIQ0ew1T.js.map +0 -1
  730. package/dist/_chunks/task-card.agent-CUPKYd7w.js.map +0 -1
  731. package/dist/_chunks/task-tray-CAncV-QQ.js.map +0 -1
  732. package/dist/_chunks/text-area-BIx0tZ05.js.map +0 -1
  733. package/dist/_chunks/text-input-BaClJL8Y.js.map +0 -1
  734. package/dist/_chunks/theme-toggle-DETmSu_h.js.map +0 -1
  735. package/dist/_chunks/time-picker-B5umYwfv.js.map +0 -1
  736. package/dist/_chunks/timeline-DQa5Tyz4.js.map +0 -1
  737. package/dist/_chunks/tooth-scheme-BIx1O2aJ.js.map +0 -1
  738. package/dist/_chunks/transcript-panel-CLHmv83g.js.map +0 -1
  739. package/dist/_chunks/unit-converter-C1V3ACM9.js +0 -196
  740. package/dist/_chunks/unit-converter-C1V3ACM9.js.map +0 -1
  741. package/dist/_chunks/use-password-requirements-DsgduV1x.js.map +0 -1
  742. package/dist/_chunks/warning-stack-Cv4fr5zo.js +0 -220
  743. package/dist/_chunks/warning-stack-Cv4fr5zo.js.map +0 -1
  744. package/dist/_chunks/whatsapp-button-DUjlWGKf.js.map +0 -1
  745. package/dist/_chunks/workflow-map-JAZryZJr.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"breadcrumb-OTbaY70e.js","sources":["../../src/components/breadcrumb/breadcrumb.agent.ts","../../src/components/breadcrumb/breadcrumb.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — Breadcrumb. */\n/* */\n/* Breadcrumb is a navigation trail. Items expose their stable route id */\n/* + href ONLY — labels can contain patient names or other PHI and MUST */\n/* NOT be exposed on `data-*` or in adapter state (see PRS §26 §6.1). */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the full contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { BreadcrumbHandle } from './breadcrumb';\n\nexport interface BreadcrumbAgentItem {\n id: string;\n href?: string;\n}\n\nexport const breadcrumbAgent: AgentAdapter<BreadcrumbHandle> = {\n id: 'breadcrumb',\n capabilities: ['navigate'],\n state: {\n items: {\n type: 'Array<{ id: string, href?: string }>',\n descriptionKey: 'ui.agent.breadcrumb.state.items',\n description:\n 'Ordered list of crumb ids + hrefs in display order. Labels are intentionally excluded — they may contain PHI.',\n read: (handle) => handle.getItems(),\n },\n },\n actions: {\n navigate_to: {\n safety: 'read',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.breadcrumb.actions.navigateTo',\n description:\n 'Activate the crumb with the given id — equivalent to clicking the link.',\n invoke: (handle, args: { id: string }) => {\n handle.navigateTo(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'breadcrumb',\n description: 'Marks the Breadcrumb root `<nav>`.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-crumb-id',\n description:\n 'Stable opaque id of a crumb. Labels are NEVER carried in data-* — they may contain PHI.',\n },\n },\n};\n","import {\n Children,\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useImperativeHandle,\n useMemo,\n useRef,\n type AnchorHTMLAttributes,\n type ComponentPropsWithoutRef,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ChevronRight, MoreHorizontal } from 'lucide-react';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { breadcrumbAgent } from './breadcrumb.agent';\n\n/* -------------------------------------------------------------------- */\n/* Context — shares separator variant between siblings */\n/* -------------------------------------------------------------------- */\n\ntype SeparatorVariant = 'chevron' | 'slash';\n\ninterface BreadcrumbContextValue {\n separator: SeparatorVariant;\n}\n\nconst BreadcrumbContext = createContext<BreadcrumbContextValue>({\n separator: 'chevron',\n});\n\n/* -------------------------------------------------------------------- */\n/* Root — <nav aria-label> wrapper + truncation engine */\n/* -------------------------------------------------------------------- */\n\nexport interface BreadcrumbProps extends Omit<\n ComponentPropsWithoutRef<'nav'>,\n 'id'\n> {\n /** Override the default `aria-label` (falls back to translated `ui.navigation.breadcrumb.label`). */\n 'aria-label'?: string;\n /** Separator glyph between items. @default 'chevron' */\n separator?: SeparatorVariant;\n /** Maximum number of visible crumbs before collapsing. @default 4 */\n maxItems?: number;\n /** Items kept visible at the start. @default 1 */\n itemsBeforeCollapse?: number;\n /** Items kept visible at the end. @default 1 */\n itemsAfterCollapse?: number;\n /** If true, disables collapse behaviour. */\n disableCollapse?: boolean;\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.\n *\n * Items expose their stable id (`BreadcrumbItem` `id` prop, falling back\n * to the `BreadcrumbLink` href) and href — never their visible label,\n * which may contain PHI (see PRS §26 §6.1).\n */\nexport interface BreadcrumbHandle {\n getItems: () => Array<{ id: string; href?: string }>;\n navigateTo: (id: string) => void;\n}\n\nconst Breadcrumb = forwardRef<HTMLElement, BreadcrumbProps>(\n (\n {\n children,\n className,\n 'aria-label': ariaLabel,\n separator = 'chevron',\n maxItems = 4,\n itemsBeforeCollapse = 1,\n itemsAfterCollapse = 1,\n disableCollapse = false,\n id,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n const items = useMemo(() => extractAgentItems(children), [children]);\n\n const handle = useMemo<BreadcrumbHandle>(\n () => ({\n getItems: () => items,\n navigateTo: (targetId: string) => {\n const hit = items.find((i) => i.id === targetId);\n if (!hit?.href) return;\n if (typeof window === 'undefined') return;\n // Same allow-list as the BreadcrumbLink renderer — never honour\n // `javascript:` / `data:` URLs.\n const trimmed = hit.href.trim();\n if (/^\\s*javascript:/i.test(trimmed)) return;\n window.location.assign(trimmed);\n },\n }),\n [items],\n );\n const innerRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => innerRef.current as HTMLElement, []);\n useAgentRegistration(breadcrumbAgent, handle, id);\n\n return (\n <BreadcrumbContext.Provider value={{ separator }}>\n <nav\n ref={innerRef}\n id={id}\n aria-label={ariaLabel ?? t('navigation.breadcrumb.label')}\n data-component=\"breadcrumb\"\n data-component-id={id}\n className={className}\n {...rest}\n >\n <BreadcrumbList\n maxItems={maxItems}\n itemsBeforeCollapse={itemsBeforeCollapse}\n itemsAfterCollapse={itemsAfterCollapse}\n disableCollapse={disableCollapse}\n >\n {children}\n </BreadcrumbList>\n </nav>\n </BreadcrumbContext.Provider>\n );\n },\n);\nBreadcrumb.displayName = 'Breadcrumb';\n\n/**\n * Walks the Breadcrumb children to collect `{ id, href }` for the agent\n * handle. The id is taken from the BreadcrumbItem's `id` prop, falling\n * back to the inner BreadcrumbLink's href (or an index string as a last\n * resort). Labels are never read — they may contain PHI.\n */\nfunction extractAgentItems(\n children: ReactNode,\n): Array<{ id: string; href?: string }> {\n const out: Array<{ id: string; href?: string }> = [];\n let index = 0;\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return;\n // Only collect Items. Anything else (separators, custom wrappers) is\n // skipped — the agent contract addresses crumbs, not chrome.\n if (child.type !== BreadcrumbItem) return;\n const itemProps = child.props as BreadcrumbItemProps & {\n id?: string;\n children?: ReactNode;\n };\n let href: string | undefined;\n Children.forEach(itemProps.children, (grandchild) => {\n if (href) return;\n if (!isValidElement(grandchild)) return;\n if (grandchild.type !== BreadcrumbLink) return;\n const linkProps = grandchild.props as BreadcrumbLinkProps;\n if (typeof linkProps.href === 'string') href = linkProps.href;\n });\n const id = itemProps.id ?? href ?? String(index);\n out.push({ id, href });\n index += 1;\n });\n return out;\n}\n\n/* -------------------------------------------------------------------- */\n/* List — walks its children, injects separators & ellipsis */\n/* -------------------------------------------------------------------- */\n\nconst listClasses = [\n 'ds:flex ds:flex-wrap ds:items-center',\n 'ds:gap-[var(--spacing-xs)]',\n 'ds:text-[var(--font-size-sm)] ds:text-[var(--muted-foreground)]',\n 'ds:ps-0 ds:m-0',\n 'ds:list-none',\n].join(' ');\n\nexport interface BreadcrumbListProps extends ComponentPropsWithoutRef<'ol'> {\n maxItems?: number;\n itemsBeforeCollapse?: number;\n itemsAfterCollapse?: number;\n disableCollapse?: boolean;\n}\n\nconst BreadcrumbList = forwardRef<HTMLOListElement, BreadcrumbListProps>(\n (\n {\n children,\n className,\n maxItems = 4,\n itemsBeforeCollapse = 1,\n itemsAfterCollapse = 1,\n disableCollapse = false,\n ...rest\n },\n ref,\n ) => {\n const arr = Children.toArray(children).filter((c) =>\n isValidElement(c),\n ) as ReactElement[];\n const total = arr.length;\n\n const shouldCollapse =\n !disableCollapse &&\n total > maxItems &&\n itemsBeforeCollapse + itemsAfterCollapse < total;\n\n const renderItem = (child: ReactElement, isLast: boolean, key: string) =>\n cloneElement(child, {\n isCurrent: (child.props as BreadcrumbItemProps).isCurrent ?? isLast,\n key,\n } as Partial<BreadcrumbItemProps>);\n\n const renderSeparatorIf = (condition: boolean, key: string) =>\n condition ? <BreadcrumbSeparator key={key} /> : null;\n\n const nodes: ReactNode[] = [];\n if (!shouldCollapse) {\n arr.forEach((child, i) => {\n const isLast = i === total - 1;\n nodes.push(renderItem(child, isLast, `item-${i}`));\n nodes.push(renderSeparatorIf(!isLast, `sep-${i}`));\n });\n } else {\n const before = arr.slice(0, itemsBeforeCollapse);\n const after = arr.slice(total - itemsAfterCollapse);\n const hidden = arr.slice(itemsBeforeCollapse, total - itemsAfterCollapse);\n\n before.forEach((child, i) => {\n nodes.push(renderItem(child, false, `b-${i}`));\n nodes.push(renderSeparatorIf(true, `b-sep-${i}`));\n });\n\n nodes.push(\n <BreadcrumbItem key=\"ellipsis\">\n <BreadcrumbEllipsis hiddenItems={hidden} />\n </BreadcrumbItem>,\n );\n nodes.push(renderSeparatorIf(true, 'ellipsis-sep'));\n\n after.forEach((child, i) => {\n const isLast = i === after.length - 1;\n nodes.push(renderItem(child, isLast, `a-${i}`));\n nodes.push(renderSeparatorIf(!isLast, `a-sep-${i}`));\n });\n }\n\n return (\n <ol\n ref={ref}\n className={[listClasses, className].filter(Boolean).join(' ')}\n {...rest}\n >\n {nodes}\n </ol>\n );\n },\n);\nBreadcrumbList.displayName = 'BreadcrumbList';\n\n/* -------------------------------------------------------------------- */\n/* Item — <li> marks current when `isCurrent` */\n/* -------------------------------------------------------------------- */\n\nconst itemClasses = [\n 'ds:inline-flex ds:items-center',\n 'ds:[max-inline-size:16rem]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:py-[var(--spacing-xs)]',\n].join(' ');\n\nexport interface BreadcrumbItemProps extends ComponentPropsWithoutRef<'li'> {\n /** Set automatically by `BreadcrumbList` on the final item. */\n isCurrent?: boolean;\n}\n\nconst BreadcrumbItem = forwardRef<HTMLLIElement, BreadcrumbItemProps>(\n ({ children, className, isCurrent = false, id, ...rest }, ref) => {\n // Derive an agent crumb id: explicit `id` prop, else the inner link's\n // href. Labels are never used — they may contain PHI (PRS §26 §6.1).\n let derived: string | undefined = id;\n if (!derived) {\n Children.forEach(children, (child) => {\n if (derived) return;\n if (!isValidElement(child)) return;\n if (child.type !== BreadcrumbLink) return;\n const linkProps = child.props as BreadcrumbLinkProps;\n if (typeof linkProps.href === 'string') derived = linkProps.href;\n });\n }\n return (\n <li\n ref={ref}\n id={id}\n data-crumb-id={derived}\n className={[itemClasses, className].filter(Boolean).join(' ')}\n {...rest}\n >\n {Children.map(children, (child) =>\n isValidElement(child) &&\n (child.type === BreadcrumbLink ||\n (child.props as { _link?: boolean })?._link)\n ? cloneElement(child as ReactElement<BreadcrumbLinkProps>, {\n isCurrent,\n })\n : child,\n )}\n </li>\n );\n },\n);\nBreadcrumbItem.displayName = 'BreadcrumbItem';\n\n/* -------------------------------------------------------------------- */\n/* Link — renders <a>, or plain text when current */\n/* -------------------------------------------------------------------- */\n\nconst linkClasses = [\n 'ds:inline-flex ds:items-center',\n 'ds:[max-inline-size:16rem]',\n 'ds:overflow-hidden ds:text-ellipsis ds:whitespace-nowrap',\n 'ds:break-normal',\n 'ds:text-[var(--muted-foreground)] ds:no-underline',\n 'ds:hover:text-[var(--foreground)] ds:hover:underline',\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:rounded-[var(--radius-sm)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:min-h-[var(--min-target-size)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n].join(' ');\n\nconst currentClasses = [\n 'ds:inline-flex ds:items-center',\n 'ds:[max-inline-size:16rem]',\n 'ds:overflow-hidden ds:text-ellipsis ds:whitespace-nowrap',\n 'ds:break-normal',\n 'ds:text-[var(--foreground)] ds:font-[var(--font-weight-semibold)]',\n 'ds:min-h-[var(--min-target-size)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n].join(' ');\n\nexport interface BreadcrumbLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n /** Use Radix `Slot` so consumers can pass a router link. */\n asChild?: boolean;\n /** Set by the parent Item when this is the current page. */\n isCurrent?: boolean;\n}\n\nconst BreadcrumbLink = forwardRef<HTMLAnchorElement, BreadcrumbLinkProps>(\n (\n { asChild = false, isCurrent = false, className, children, ...rest },\n ref,\n ) => {\n const { t } = useTranslation();\n\n if (isCurrent) {\n return (\n <span\n aria-current=\"page\"\n aria-label={\n (rest['aria-label'] as string | undefined) ??\n t('navigation.breadcrumb.current')\n }\n className={[currentClasses, className].filter(Boolean).join(' ')}\n >\n {children}\n </span>\n );\n }\n\n if (asChild) {\n return (\n <Slot\n ref={ref}\n className={[linkClasses, className].filter(Boolean).join(' ')}\n {...rest}\n >\n {children}\n </Slot>\n );\n }\n\n return (\n <a\n ref={ref}\n className={[linkClasses, className].filter(Boolean).join(' ')}\n {...rest}\n >\n {children}\n </a>\n );\n },\n);\nBreadcrumbLink.displayName = 'BreadcrumbLink';\n\n/* -------------------------------------------------------------------- */\n/* Separator */\n/* -------------------------------------------------------------------- */\n\nconst separatorVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:text-[var(--muted-foreground)]',\n 'ds:ms-[var(--spacing-xs)] ds:me-[var(--spacing-xs)]',\n 'ds:select-none',\n ].join(' '),\n {\n variants: {\n variant: {\n chevron: '',\n slash: '',\n },\n },\n defaultVariants: { variant: 'chevron' },\n },\n);\n\nexport interface BreadcrumbSeparatorProps\n extends\n Omit<ComponentPropsWithoutRef<'li'>, 'children'>,\n VariantProps<typeof separatorVariants> {\n children?: ReactNode;\n}\n\nconst BreadcrumbSeparator = forwardRef<HTMLLIElement, BreadcrumbSeparatorProps>(\n ({ className, variant, children, ...rest }, ref) => {\n const ctx = useContext(BreadcrumbContext);\n const resolved = variant ?? ctx.separator;\n const defaultGlyph =\n resolved === 'slash' ? (\n <span aria-hidden=\"true\">/</span>\n ) : (\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:rtl:-scale-x-100\"\n />\n );\n return (\n <li\n ref={ref}\n aria-hidden=\"true\"\n role=\"presentation\"\n className={separatorVariants({ variant: resolved, className })}\n {...rest}\n >\n {children ?? defaultGlyph}\n </li>\n );\n },\n);\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator';\n\n/* -------------------------------------------------------------------- */\n/* Ellipsis — opens a Radix DropdownMenu with hidden crumbs */\n/* -------------------------------------------------------------------- */\n\nconst ellipsisTriggerClasses = [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-[var(--muted-foreground)]',\n 'ds:hover:text-[var(--foreground)]',\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:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n].join(' ');\n\nconst ellipsisContentClasses = [\n 'ds:z-[var(--z-dropdown)] ds:min-w-[12rem] ds:overflow-hidden',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[var(--border)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:p-[var(--spacing-xs)]',\n 'ds:animate-in ds:fade-in ds:zoom-in-95 ds:motion-reduce:animate-none',\n].join(' ');\n\nconst ellipsisItemClasses = [\n 'ds:flex ds:items-center',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-[var(--foreground)] ds:cursor-pointer ds:select-none',\n 'ds:data-[highlighted]:bg-[var(--muted)] ds:data-[highlighted]:text-[var(--foreground)]',\n 'ds:outline-none',\n].join(' ');\n\nexport interface BreadcrumbEllipsisProps extends ComponentPropsWithoutRef<'button'> {\n /** Hidden crumb elements rendered inside the dropdown menu. */\n hiddenItems?: ReactElement[];\n}\n\nconst BreadcrumbEllipsis = forwardRef<\n HTMLButtonElement,\n BreadcrumbEllipsisProps\n>(({ className, hiddenItems = [], ...rest }, ref) => {\n const { t } = useTranslation();\n const showPath = t('navigation.breadcrumb.showPath');\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n ref={ref}\n type=\"button\"\n aria-label={showPath}\n className={[ellipsisTriggerClasses, className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <MoreHorizontal aria-hidden=\"true\" className=\"ds:size-4\" />\n <span className=\"ds:sr-only\">{showPath}</span>\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className={ellipsisContentClasses}\n align=\"start\"\n sideOffset={6}\n >\n {hiddenItems.map((item, i) => {\n // Extract the anchor inside the hidden BreadcrumbItem (if any)\n const linkChild = extractLink(item);\n return (\n <DropdownMenu.Item\n key={`hidden-${i}`}\n asChild\n className={ellipsisItemClasses}\n >\n {linkChild ?? <span>{item}</span>}\n </DropdownMenu.Item>\n );\n })}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n});\nBreadcrumbEllipsis.displayName = 'BreadcrumbEllipsis';\n\n/**\n * Walks a `BreadcrumbItem` to find the first child whose type is\n * `BreadcrumbLink` and returns the link rendered as a plain `<a>` so the\n * dropdown item can adopt its navigational behaviour.\n */\nfunction extractLink(item: ReactElement): ReactElement | null {\n let found: ReactElement | null = null;\n const itemChildren = (item.props as { children?: ReactNode }).children;\n Children.forEach(itemChildren, (child) => {\n if (found) return;\n if (!isValidElement(child)) return;\n if (child.type === BreadcrumbLink) {\n const linkProps = child.props as BreadcrumbLinkProps & {\n children?: ReactNode;\n };\n const href =\n typeof linkProps.href === 'string' ? linkProps.href : undefined;\n const safeHref = href && /^\\s*javascript:/i.test(href) ? undefined : href;\n found = (\n <a\n href={safeHref}\n onClick={\n linkProps.onClick as AnchorHTMLAttributes<HTMLAnchorElement>['onClick']\n }\n >\n {linkProps.children}\n </a>\n );\n }\n });\n return found;\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n};\n"],"names":["breadcrumbAgent","handle","args","BreadcrumbContext","createContext","Breadcrumb","forwardRef","children","className","ariaLabel","separator","maxItems","itemsBeforeCollapse","itemsAfterCollapse","disableCollapse","id","rest","ref","t","useTranslation","items","useMemo","extractAgentItems","targetId","hit","i","trimmed","innerRef","useRef","useImperativeHandle","useAgentRegistration","jsx","BreadcrumbList","out","index","Children","child","isValidElement","BreadcrumbItem","itemProps","href","grandchild","BreadcrumbLink","linkProps","listClasses","arr","total","shouldCollapse","renderItem","isLast","key","cloneElement","renderSeparatorIf","condition","BreadcrumbSeparator","nodes","before","after","hidden","BreadcrumbEllipsis","itemClasses","isCurrent","derived","_a","linkClasses","currentClasses","asChild","Slot","separatorVariants","cva","variant","ctx","useContext","resolved","defaultGlyph","ChevronRight","ellipsisTriggerClasses","ellipsisContentClasses","ellipsisItemClasses","hiddenItems","showPath","jsxs","DropdownMenu","MoreHorizontal","item","linkChild","extractLink","found","itemChildren","safeHref"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"calendar-oYWOCrnf.js","sources":["../../node_modules/lucide-react/dist/esm/icons/ban.js","../../node_modules/lucide-react/dist/esm/icons/euro.js","../../node_modules/lucide-react/dist/esm/icons/thumbs-up.js","../../node_modules/lucide-react/dist/esm/icons/zap.js","../../src/components/calendar/calendar.agent.ts","../../src/components/calendar/calendar.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M4.929 4.929 19.07 19.071\", key: \"196cmz\" }]\n];\nconst Ban = createLucideIcon(\"ban\", __iconNode);\n\nexport { __iconNode, Ban as default };\n//# sourceMappingURL=ban.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M4 10h12\", key: \"1y6xl8\" }],\n [\"path\", { d: \"M4 14h9\", key: \"1loblj\" }],\n [\n \"path\",\n {\n d: \"M19 6a7.7 7.7 0 0 0-5.2-2A7.9 7.9 0 0 0 6 12c0 4.4 3.5 8 7.8 8 2 0 3.8-.8 5.2-2\",\n key: \"1j6lzo\"\n }\n ]\n];\nconst Euro = createLucideIcon(\"euro\", __iconNode);\n\nexport { __iconNode, Euro as default };\n//# sourceMappingURL=euro.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z\",\n key: \"emmmcr\"\n }\n ],\n [\"path\", { d: \"M7 10v12\", key: \"1qc93n\" }]\n];\nconst ThumbsUp = createLucideIcon(\"thumbs-up\", __iconNode);\n\nexport { __iconNode, ThumbsUp as default };\n//# sourceMappingURL=thumbs-up.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n];\nconst Zap = createLucideIcon(\"zap\", __iconNode);\n\nexport { __iconNode, Zap as default };\n//# sourceMappingURL=zap.js.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — Calendar. */\n/* */\n/* Calendar's existing `CalendarHandle` is the canonical shape for an */\n/* agent-friendly third-party wrapper — see `26-agent-readiness.mdx` */\n/* §15. The handle methods translate directly into adapter actions. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { CalendarHandle, CalendarView } from './calendar';\n\nexport const calendarAgent: AgentAdapter<CalendarHandle> = {\n id: 'calendar',\n capabilities: ['view_change', 'range_navigate', 'pick'],\n state: {\n currentView: {\n type: 'CalendarView',\n descriptionKey: 'ui.agent.calendar.state.currentView',\n description: 'Active view name (e.g. dayGridMonth, timeGridWeek).',\n read: (handle) => handle.getCurrentView() ?? null,\n },\n currentDate: {\n type: 'iso-date',\n descriptionKey: 'ui.agent.calendar.state.currentDate',\n description: 'ISO date anchor of the visible range.',\n read: (handle) => handle.getCurrentDate()?.toISOString() ?? null,\n },\n currentTitle: {\n type: 'string',\n descriptionKey: 'ui.agent.calendar.state.currentTitle',\n description: 'Human title of the current range (e.g. \"April 2026\").',\n read: (handle) => handle.getTitle(),\n },\n },\n actions: {\n today: {\n safety: 'read',\n descriptionKey: 'ui.agent.calendar.actions.today',\n description: 'Jump to the current day.',\n invoke: (handle) => {\n handle.today();\n },\n },\n prev: {\n safety: 'read',\n descriptionKey: 'ui.agent.calendar.actions.prev',\n description: 'Move to the previous range.',\n invoke: (handle) => {\n handle.prev();\n },\n },\n next: {\n safety: 'read',\n descriptionKey: 'ui.agent.calendar.actions.next',\n description: 'Move to the next range.',\n invoke: (handle) => {\n handle.next();\n },\n },\n goto_date: {\n safety: 'read',\n argsType: '{ date: string | Date }',\n descriptionKey: 'ui.agent.calendar.actions.gotoDate',\n description: 'Navigate to a specific date.',\n invoke: (handle, args: { date: string | Date }) => {\n handle.gotoDate(args.date);\n },\n },\n change_view: {\n safety: 'read',\n argsType: '{ view: CalendarView }',\n descriptionKey: 'ui.agent.calendar.actions.changeView',\n description: 'Switch the calendar to the given view.',\n invoke: (handle, args: { view: CalendarView }) => {\n handle.changeView(args.view);\n },\n },\n focus_event: {\n safety: 'read',\n argsType: '{ eventId: string }',\n descriptionKey: 'ui.agent.calendar.actions.focusEvent',\n description: 'Scroll an event into view and briefly highlight it.',\n invoke: (handle, args: { eventId: string }) => {\n handle.focusEvent(args.eventId);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'calendar',\n description: 'Marks the Calendar wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-event-id',\n description:\n 'Emitted on every rendered FullCalendar event by the kit event renderer. Used by focusEvent.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* Calendar — a thin, typed wrapper over FullCalendar. */\n/* */\n/* - Plugins are registered once internally so consumers never import */\n/* `@fullcalendar/core` / plugins directly (08-third-party §Calendar).*/\n/* - Chrome is styled entirely from `fullcalendar-theme.css` via the */\n/* `.fc-theme-alfadocs` root class — no inline styles anywhere. */\n/* - Locale, week-start, date formats, and direction all flow from the */\n/* active i18next language (06-i18n.mdx). */\n/* */\n/* TODO (deferred, per implementation plan): */\n/* - Virtualised resource timeline with @tanstack/react-virtual for */\n/* > 50 resources (performance user story). */\n/* - Protanopia screenshot stories (colour-blind story acceptance). */\n/* - Playwright performance trace for 1000 events / 50 resources. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport FullCalendar from '@fullcalendar/react';\nimport dayGridPlugin from '@fullcalendar/daygrid';\nimport timeGridPlugin from '@fullcalendar/timegrid';\nimport listPlugin from '@fullcalendar/list';\nimport resourcePlugin from '@fullcalendar/resource';\nimport type { ResourceLabelContentArg } from '@fullcalendar/resource';\nimport resourceTimeGridPlugin from '@fullcalendar/resource-timegrid';\nimport resourceTimelinePlugin from '@fullcalendar/resource-timeline';\nimport timelinePlugin from '@fullcalendar/timeline';\nimport interactionPlugin from '@fullcalendar/interaction';\nimport type { EventResizeDoneArg } from '@fullcalendar/interaction';\nimport type {\n DatesSetArg,\n EventClickArg,\n EventContentArg,\n EventDropArg,\n DateSelectArg,\n EventInput,\n} from '@fullcalendar/core';\nimport {\n ThumbsUp,\n Clock,\n Stethoscope,\n Check,\n Ban,\n Zap,\n Globe,\n AlertTriangle,\n HeartPulse,\n Euro,\n Video,\n ChevronLeft,\n ChevronRight,\n type LucideIcon,\n} from 'lucide-react';\nimport '../../tokens/themes/bridges/fullcalendar-theme.css';\n\nimport { usePrefersReducedMotion } from '../../hooks';\nimport { useAgentRegistration } from '../../agent';\nimport { warnLowContrast } from './contrast-warning';\nimport { calendarAgent } from './calendar.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type CalendarView =\n // Standard views\n | 'dayGridMonth'\n | 'timeGridWeek'\n | 'timeGridDay'\n | 'listWeek'\n // Chair resource views\n | 'resourceTimeGridDayChair'\n | 'resourceTimeGridThreeDaysChair'\n | 'resourceTimeGridWeekChair'\n // Operator resource views\n | 'resourceTimeGridDayOperator'\n | 'resourceTimeGridThreeDaysOperator'\n | 'resourceTimeGridWeekOperator';\n\n/**\n * View-name mapping table — maps the DS public view name (with the\n * Chair/Operator semantic suffix stripped) onto the internal FullCalendar\n * view name for each `resourceLayout` orientation. The table is exported\n * via `resolveFullCalendarView`; invalid combinations are caught at\n * compile time because the `CalendarView` union is exhaustive.\n */\nconst RESOURCE_VIEW_MAP = {\n vertical: {\n Day: 'resourceTimeGridDay',\n ThreeDays: 'resourceTimeGridThreeDays',\n Week: 'resourceTimeGridWeek',\n },\n horizontal: {\n Day: 'resourceTimelineDay',\n ThreeDays: 'resourceTimelineThreeDays',\n Week: 'resourceTimelineWeek',\n },\n} as const satisfies Record<\n 'vertical' | 'horizontal',\n Record<'Day' | 'ThreeDays' | 'Week', string>\n>;\n\ntype ResourceViewStem = keyof (typeof RESOURCE_VIEW_MAP)['vertical'];\n\nconst STANDARD_VIEWS = new Set<CalendarView>([\n 'dayGridMonth',\n 'timeGridWeek',\n 'timeGridDay',\n 'listWeek',\n]);\n\n/**\n * Maps a public `CalendarView` name to the internal FullCalendar view\n * name. `resourceLayout` selects between `resourceTimeGrid*` (vertical)\n * and `resourceTimeline*` (horizontal) for the 6 resource views; the\n * 4 standard views are returned as-is.\n */\nexport function resolveFullCalendarView(\n view: CalendarView,\n resourceLayout: 'vertical' | 'horizontal' = 'vertical',\n): string {\n if (STANDARD_VIEWS.has(view)) {\n return view;\n }\n // Strip the trailing Chair / Operator suffix — the DS maps both to the\n // same internal FC view name. The suffix is semantic only.\n const withoutPrefix = view.replace(/^resourceTimeGrid/, '');\n const stem = withoutPrefix.replace(\n /(Chair|Operator)$/,\n '',\n ) as ResourceViewStem;\n return RESOURCE_VIEW_MAP[resourceLayout][stem];\n}\n\n/**\n * Registered custom FC view shapes — the two 3-day views are defined as\n * durations over the base `resourceTimeGrid` / `resourceTimeline` types.\n * Kept at module scope because the object is a compile-time constant.\n * Typed loosely to match FC's `ViewConfigInputHash` ( `[viewType: string]:\n * ViewConfigInput` ).\n */\nconst CALENDAR_CUSTOM_VIEWS: Record<\n string,\n { type: string; duration: { days: number } }\n> = {\n resourceTimeGridThreeDays: {\n type: 'resourceTimeGrid',\n duration: { days: 3 },\n },\n resourceTimelineThreeDays: {\n type: 'resourceTimeline',\n duration: { days: 3 },\n },\n};\n\nexport type CalendarEventStatus =\n | 'confirmed'\n | 'waiting'\n | 'in_care'\n | 'done'\n | 'cancelled'\n | 'absent';\n\nexport type CalendarMode = 'default' | 'create' | 'move' | 'copy';\n\nexport interface CalendarEvent {\n id: string;\n title: string;\n start: string | Date;\n end?: string | Date;\n resourceId?: string;\n allDay?: boolean;\n\n /* Appointment-specific (all optional) */\n status?: CalendarEventStatus;\n /** Hex colour from a DoctorColor palette — overrides CVA bg. */\n backgroundColor?: string;\n /** Hex colour from a DoctorColor palette — overrides CVA text. */\n textColor?: string;\n /** Extra description rendered after the title in normal weight. */\n suffix?: string;\n /** Masked title shown when `privacyMode` is true. */\n privacyModeTitle?: string;\n /** Shows a Globe icon + zebra overlay. */\n isBookedOnline?: boolean;\n /** Shows an AlertTriangle icon. */\n hasUnassignedPatient?: boolean;\n /** Shows a HeartPulse icon. */\n hasHighlightedAnamnesis?: boolean;\n /** Shows a Euro icon. */\n hasBillableAmount?: boolean;\n /** Shows a Video icon. */\n isTelehealth?: boolean;\n isRecurrenceParent?: boolean;\n /** Rendered as a background event; not clickable. */\n isInternal?: boolean;\n patientId?: string | number;\n operatorId?: string | number;\n}\n\nexport interface CalendarResource {\n id: string;\n title: string;\n /** Initials for the compact \"avatar\" label (e.g. \"MR\"). */\n shortTitle?: string;\n /** Hex background colour for the dot or initials circle. */\n color?: string;\n /** Hex text colour for the initials circle. */\n shortTitleTextColor?: string;\n /** Numeric ordering — passed to FullCalendar's `resourceOrder`. */\n sequenceNumber?: number;\n}\n\nexport interface CalendarEventDropInfo {\n event: CalendarEvent;\n oldStart: Date;\n newStart: Date;\n}\n\nexport interface CalendarEventResizeInfo {\n event: CalendarEvent;\n oldEnd: Date;\n newEnd: Date;\n}\n\nexport interface CalendarDateSelectInfo {\n start: Date;\n end: Date;\n allDay: boolean;\n resourceId?: string;\n}\n\nexport interface CalendarProps {\n /**\n * Stable identifier for this calendar instance. Used for the agent-readiness\n * `data-component-id` attribute and the agent registry. Required only when\n * the consuming app expects an MCP / agent integration to address this\n * specific calendar.\n */\n id?: string;\n /** Events to render on the calendar. */\n events: CalendarEvent[];\n /** Resources for `resourceTimeline` view. */\n resources?: CalendarResource[];\n /** Active view. */\n view?: CalendarView;\n /** Initial date (string or Date). */\n initialDate?: string | Date;\n /** Locale override — defaults to the active i18next language. */\n locale?: string;\n /** Fires when an event is dragged to a new slot. */\n onEventDrop?: (info: CalendarEventDropInfo) => void;\n /** Fires when an event is resized. */\n onEventResize?: (info: CalendarEventResizeInfo) => void;\n /** Fires when an event resize gesture begins. */\n onEventResizeStart?: () => void;\n /** Fires when an event is clicked. */\n onEventClick?: (event: CalendarEvent) => void;\n /** Fires when the user click-drags a range to create a new event. */\n onDateSelect?: (range: CalendarDateSelectInfo) => void;\n /** Allow drag-drop rescheduling. */\n editable?: boolean;\n /** Allow resize gestures on events. Defaults to `editable`. */\n eventDurationEditable?: boolean;\n /** Allow click-drag to create. */\n selectable?: boolean;\n /** Height of the calendar. */\n height?: number | string;\n /** Extra class names on the wrapper. */\n className?: string;\n /** Mask patient titles — announces state changes via aria-live. */\n privacyMode?: boolean;\n /** Interaction mode — renders a sticky banner when not `'default'`. */\n mode?: CalendarMode;\n /** Override text for the mode banner. */\n modeLabel?: string;\n /** Hex background colour for the mode banner (consuming-app supplied). */\n modeBannerColor?: string;\n /** Hex text colour for the mode banner. */\n modeBannerTextColor?: string;\n /** Cancel handler wired to the mode banner button. */\n onModeCancel?: () => void;\n /** Optional alert banner rendered above the mode banner. */\n alertBanner?: ReactNode;\n /** Lower bound of the time axis (e.g. '07:00'). */\n slotMinTime?: string;\n /** Upper bound of the time axis (e.g. '23:00'). */\n slotMaxTime?: string;\n /** Slot duration (e.g. '00:15'). */\n slotDuration?: string;\n /** When false, hides the inline time pill on events. */\n showTime?: boolean;\n /** Place date headers above the resource axis. */\n datesAboveResources?: boolean;\n /** Allow overlapping events in the same slot. */\n slotEventOverlap?: boolean;\n /** Keep date headers pinned during scroll. */\n stickyHeaderDates?: boolean;\n /** Show a now-indicator line on time-grid views. */\n nowIndicator?: boolean;\n /** Collapse overflow events into \"+N more\" links. */\n dayMaxEvents?: boolean | number;\n /**\n * FullCalendar Scheduler premium license key. Required for the\n * `resourceTimeline` view. Defaults to `VITE_FULLCALENDAR_LICENSE_KEY`\n * from the environment; consumers can override per-instance.\n */\n schedulerLicenseKey?: string;\n /**\n * Show the built-in toolbar. Default true. Pass false to hide it\n * entirely (e.g. when the consuming app renders its own\n * `<Calendar.Toolbar ... />` elsewhere on the page).\n */\n toolbar?: boolean;\n /**\n * Extra controls rendered at the inline-end of the default toolbar —\n * commonly a view switcher, a privacy toggle, or an \"add appointment\"\n * button. Ignored when `toolbar` is false.\n */\n toolbarEnd?: ReactNode;\n /**\n * Orientation for resource views. `vertical` (default) uses\n * `resourceTimeGrid` — resources as columns, time as rows.\n * `horizontal` uses `resourceTimeline` — resources as rows, time as columns.\n * Ignored for non-resource views.\n */\n resourceLayout?: 'vertical' | 'horizontal';\n /**\n * When true, render a round initials avatar (using\n * `resource.shortTitle` + `resource.color` + `resource.shortTitleTextColor`)\n * in the resource label. When false (default), a small coloured dot\n * prefixes the title when `resource.color` is set.\n */\n showResourceInitials?: boolean;\n}\n\nexport interface CalendarHandle {\n /** Returns the internal FullCalendar instance for advanced use. */\n getApi: () => unknown;\n /** Jump to today. */\n today: () => void;\n /** Navigate to the previous period. */\n prev: () => void;\n /** Navigate to the next period. */\n next: () => void;\n /** Navigate to an arbitrary date. */\n gotoDate: (date: Date | string) => void;\n /** Switch the active view. */\n changeView: (view: CalendarView) => void;\n /** Current view title (e.g. \"April 2026\") — reflects the FC API getter. */\n getTitle: () => string;\n /** Currently active view name. */\n getCurrentView: () => CalendarView | undefined;\n /** Currently focused date — the anchor of the visible range. */\n getCurrentDate: () => Date | undefined;\n /** Scroll to an event by id and briefly highlight it. */\n focusEvent: (eventId: string) => void;\n}\n\n/* Narrow structural interface for the subset of the FullCalendar API\n we actually invoke. Keeps the handle methods typed without pulling\n `@fullcalendar/core` types across the public boundary. */\ninterface FcApi {\n today: () => void;\n prev: () => void;\n next: () => void;\n gotoDate: (date: Date | string) => void;\n changeView: (view: string) => void;\n render: () => void;\n getDate: () => Date;\n view: { title: string; type: string };\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA — status → event card classes */\n/* ------------------------------------------------------------------ */\n\nconst eventCardVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]',\n 'ds:w-full ds:h-full',\n 'ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-[length:var(--font-size-sm)]',\n 'ds:font-[var(--font-weight-medium)]',\n 'ds:overflow-hidden',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' '),\n {\n variants: {\n status: {\n // Note: every text-[…] uses the explicit `color:` prefix so\n // Tailwind interprets it as a colour, not a length. Without the\n // prefix, `text-[var(--X)]` resolves to font-size and the text\n // colour falls through to the inherited `--foreground` — which\n // produced 2.07:1 axe failures on saturated backgrounds.\n confirmed:\n 'ds:bg-[color:var(--success)] ds:text-[color:var(--success-solid-foreground)] ds:border ds:border-[color:var(--success)]',\n waiting:\n 'ds:bg-[color:var(--info)] ds:text-[color:var(--info-solid-foreground)] ds:border ds:border-[color:var(--info)]',\n in_care:\n 'ds:bg-[color:var(--primary)] ds:text-[color:var(--primary-foreground)] ds:border ds:border-[color:var(--primary)]',\n // `done` reads as \"completed, fading out\". Previously\n // `bg-color-mix(--success 70%, transparent) text-success-solid-foreground`,\n // composited to ~#65a586 with white text → 2.88:1 fail.\n // Now uses a low-saturation tint background with dark\n // `--foreground` text + a left accent bar carrying the status\n // hue.\n done: 'ds:bg-[color:color-mix(in_srgb,var(--success)_18%,var(--background))] ds:text-[color:var(--foreground)] ds:border-s-[3px] ds:border-s-[color:var(--success)] ds:border-y ds:border-e ds:border-y-[color:color-mix(in_srgb,var(--success)_25%,var(--border))] ds:border-e-[color:color-mix(in_srgb,var(--success)_25%,var(--border))]',\n cancelled:\n 'ds:bg-[color:var(--destructive)] ds:text-[color:var(--destructive-foreground)] ds:border ds:border-[color:var(--destructive)] ds:line-through',\n absent:\n 'ds:bg-[color:var(--warning)] ds:text-[color:var(--warning-solid-foreground)] ds:border ds:border-[color:var(--warning)]',\n default:\n 'ds:bg-[color:var(--primary)] ds:text-[color:var(--primary-foreground)] ds:border ds:border-[color:var(--primary)]',\n },\n },\n defaultVariants: { status: 'default' },\n },\n);\n\nconst STATUS_ICON: Record<CalendarEventStatus, LucideIcon> = {\n confirmed: ThumbsUp,\n waiting: Clock,\n in_care: Stethoscope,\n done: Check,\n cancelled: Ban,\n absent: Zap,\n};\n\n/* Mode banner → i18n key lookup. Kept as a literal object (not a\n template) so static-analysis extractors can find every key. */\nconst MODE_BANNER_KEYS: Record<Exclude<CalendarMode, 'default'>, string> = {\n create: 'calendar.modeBanner.create',\n move: 'calendar.modeBanner.move',\n copy: 'calendar.modeBanner.copy',\n};\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\ninterface LocaleWeekInfo {\n firstDay?: number;\n}\n\ninterface LocaleWithWeekInfo {\n getWeekInfo?: () => LocaleWeekInfo;\n weekInfo?: LocaleWeekInfo;\n}\n\n/**\n * Resolve the first day of the week for a locale using the modern\n * `Intl.Locale.getWeekInfo()` API when available, falling back to Monday\n * for EU-leaning locales and Sunday for en-US / he-IL / ar-SA.\n */\nexport function resolveFirstDay(locale: string): number {\n try {\n const intlLocale = new Intl.Locale(locale) as unknown as LocaleWithWeekInfo;\n const info =\n typeof intlLocale.getWeekInfo === 'function'\n ? intlLocale.getWeekInfo()\n : intlLocale.weekInfo;\n if (info && typeof info.firstDay === 'number') {\n return info.firstDay % 7;\n }\n } catch {\n /* no-op — fall through to heuristic */\n }\n if (\n locale.startsWith('en-US') ||\n locale.startsWith('he') ||\n locale.startsWith('ar-SA')\n ) {\n return 0;\n }\n return 1;\n}\n\n/**\n * Small hook that mirrors the parent Calendar's document-dir observer\n * so sub-components can swap physical icons for logical direction\n * without threading a prop through. Returns true when the effective\n * document direction is RTL.\n */\nfunction useIsRtl(): boolean {\n const { i18n } = useTranslation();\n const [isRtl, setIsRtl] = useState<boolean>(() => {\n if (typeof document === 'undefined') return false;\n const docDir = document.documentElement.getAttribute('dir');\n const i18nDir = typeof i18n.dir === 'function' ? i18n.dir() : 'ltr';\n return docDir === 'rtl' || i18nDir === 'rtl';\n });\n\n useEffect(() => {\n if (typeof document === 'undefined') return undefined;\n const observer = new MutationObserver(() => {\n const docDir = document.documentElement.getAttribute('dir');\n const i18nDir = typeof i18n.dir === 'function' ? i18n.dir() : 'ltr';\n setIsRtl(docDir === 'rtl' || i18nDir === 'rtl');\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir', 'lang'],\n });\n return () => observer.disconnect();\n }, [i18n]);\n\n return isRtl;\n}\n\n/* ------------------------------------------------------------------ */\n/* Event content render-prop */\n/* */\n/* Renders the event card with: */\n/* - a status icon (aria-hidden) coloured by status token */\n/* - indicator icons (online, unassigned, anamnesis, billable, tele) */\n/* - a time range pill (when !allDay && showTime) */\n/* - the event title (bold, masked in privacy mode) */\n/* - an optional suffix (regular weight) */\n/* - an aria-label built from title + range + resource + status */\n/* ------------------------------------------------------------------ */\n\ninterface RenderEventContentParams {\n arg: EventContentArg;\n locale: string;\n resources: CalendarResource[];\n statusLabels: Record<CalendarEventStatus, string>;\n privacyMode: boolean;\n showTime: boolean;\n}\n\ntype EventExtendedProps = Omit<\n CalendarEvent,\n 'id' | 'title' | 'start' | 'end' | 'allDay'\n>;\n\nfunction renderEventContent({\n arg,\n locale,\n resources,\n statusLabels,\n privacyMode,\n showTime,\n}: RenderEventContentParams): ReactElement {\n const extended = (arg.event.extendedProps ?? {}) as EventExtendedProps;\n const {\n status,\n backgroundColor,\n textColor,\n suffix,\n privacyModeTitle,\n isBookedOnline,\n hasUnassignedPatient,\n hasHighlightedAnamnesis,\n hasBillableAmount,\n isTelehealth,\n resourceId,\n } = extended;\n\n const StatusIcon = status ? STATUS_ICON[status] : null;\n\n const start = arg.event.start;\n const end = arg.event.end ?? arg.event.start;\n const allDay = arg.event.allDay;\n\n let rangeText = '';\n if (start && end) {\n try {\n const fmt = new Intl.DateTimeFormat(locale, {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n });\n rangeText =\n typeof fmt.formatRange === 'function'\n ? fmt.formatRange(start, end)\n : `${fmt.format(start)} – ${fmt.format(end)}`;\n } catch {\n rangeText = '';\n }\n }\n\n const resourceTitle = resourceId\n ? resources.find((r) => r.id === resourceId)?.title\n : undefined;\n const statusLabel = status ? statusLabels[status] : undefined;\n\n const displayTitle = privacyMode\n ? (privacyModeTitle ?? '•••')\n : arg.event.title;\n\n const ariaLabel = [displayTitle, rangeText, resourceTitle, statusLabel]\n .filter(Boolean)\n .join(', ');\n\n /* Per-event colour override: the consuming app passes a runtime hex\n from a DoctorColor (Material-Design style) palette. 23-constraints\n permits inline `style` only as a CSS custom property setter for\n runtime values that can't be enumerated at build time — the\n consuming `background-color` / `color` references live in the\n className as Tailwind arbitrary values. */\n const colourOverrides: CSSProperties | undefined =\n backgroundColor || textColor\n ? {\n ...(backgroundColor\n ? ({ '--calendar-event-bg': backgroundColor } as CSSProperties)\n : {}),\n ...(textColor\n ? ({ '--calendar-event-text': textColor } as CSSProperties)\n : {}),\n }\n : undefined;\n\n /* DEV-only guardrail: warn when caller-supplied bg/fg hex pair falls\n below WCAG AA. No-op when either half is missing (fg missing falls\n back to the DS foreground token, which isn't a hex we can check). */\n if (backgroundColor || textColor) {\n warnLowContrast(backgroundColor, textColor, `event ${arg.event.id}`);\n }\n\n const className = [\n eventCardVariants({ status: status ?? 'default' }),\n isBookedOnline ? 'event-booked-online' : null,\n backgroundColor ? 'ds:[background-color:var(--calendar-event-bg)]' : null,\n textColor ? 'ds:[color:var(--calendar-event-text)]' : null,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n className={className}\n // eslint-disable-next-line react/forbid-dom-props -- caller-supplied event bg/text hex injected via CSS variables\n style={colourOverrides}\n aria-label={ariaLabel}\n data-event-id={arg.event.id}\n >\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:self-end\">\n {StatusIcon ? <StatusIcon size={14} aria-hidden=\"true\" /> : null}\n {isBookedOnline ? <Globe size={12} aria-hidden=\"true\" /> : null}\n {hasUnassignedPatient ? (\n <AlertTriangle size={12} aria-hidden=\"true\" />\n ) : null}\n {hasHighlightedAnamnesis ? (\n <HeartPulse size={12} aria-hidden=\"true\" />\n ) : null}\n {hasBillableAmount ? <Euro size={12} aria-hidden=\"true\" /> : null}\n {isTelehealth ? <Video size={12} aria-hidden=\"true\" /> : null}\n </div>\n {showTime && !allDay && rangeText ? (\n // No opacity here — composing 70% over saturated bgs (success /\n // destructive / primary) drops effective contrast below WCAG AA\n // (≤ 3.82:1 measured). The smaller font-size-xs vs the title's\n // font-weight-semibold provides sufficient visual hierarchy.\n <span className=\"ds:text-[length:var(--font-size-xs)]\">\n {rangeText}\n </span>\n ) : null}\n <span className=\"ds:font-[var(--font-weight-semibold)] ds:truncate ds:text-start\">\n {displayTitle}\n </span>\n {suffix ? (\n <span className=\"ds:truncate ds:text-start ds:text-[length:var(--font-size-xs)]\">\n {suffix}\n </span>\n ) : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* CalendarToolbar — compound sub-component */\n/* */\n/* Renders the DS-styled prev/today/next controls + a centered <h2> */\n/* title (aria-live so navigation updates announce politely) plus an */\n/* optional inline-end slot. Logical properties only; physical icons */\n/* (ChevronLeft / ChevronRight) are swapped in RTL so the pair always */\n/* points in the expected reading direction. */\n/* ------------------------------------------------------------------ */\n\nexport interface CalendarToolbarProps {\n /** Title shown in the toolbar (e.g. \"April 2026\"). Typically\n * produced by `calendarHandle.getTitle()`. */\n title?: string;\n /** Jump to today. */\n onToday: () => void;\n /** Navigate to the previous period. */\n onPrev: () => void;\n /** Navigate to the next period. */\n onNext: () => void;\n /** Extra controls rendered at the inline-end. */\n end?: ReactNode;\n /** Additional className. */\n className?: string;\n}\n\nconst toolbarButtonBaseClass = [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:border ds:border-[var(--border)]',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:font-[var(--font-weight-medium)] ds:text-[length:var(--font-size-sm)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:hover:bg-[var(--muted)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:motion-reduce:transition-none',\n].join(' ');\n\nconst toolbarTextButtonClass = [\n toolbarButtonBaseClass,\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n].join(' ');\n\nconst toolbarIconButtonClass = [\n toolbarButtonBaseClass,\n 'ds:min-w-[var(--min-target-size)]',\n].join(' ');\n\nexport const CalendarToolbar = forwardRef<HTMLDivElement, CalendarToolbarProps>(\n ({ title, onToday, onPrev, onNext, end, className }, ref) => {\n const { t } = useTranslation();\n const isRtl = useIsRtl();\n const PrevIcon = isRtl ? ChevronRight : ChevronLeft;\n const NextIcon = isRtl ? ChevronLeft : ChevronRight;\n\n const rootClassName = [\n 'ds:calendar-toolbar',\n 'ds:sticky ds:top-0 ds:z-20',\n 'ds:flex ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:py-[var(--spacing-sm)]',\n 'ds:bg-[var(--background)]',\n 'ds:border-b ds:border-[var(--border)]',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div ref={ref} className={rootClassName}>\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <button\n type=\"button\"\n onClick={onToday}\n className={toolbarTextButtonClass}\n >\n {t('calendar.today')}\n </button>\n <button\n type=\"button\"\n onClick={onPrev}\n aria-label={t('calendar.previousPeriod')}\n className={toolbarIconButtonClass}\n >\n <PrevIcon size={16} aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n onClick={onNext}\n aria-label={t('calendar.nextPeriod')}\n className={toolbarIconButtonClass}\n >\n <NextIcon size={16} aria-hidden=\"true\" />\n </button>\n </div>\n {title ? (\n <h2\n aria-live=\"polite\"\n className=\"ds:flex-1 ds:text-center ds:truncate type-title-card\"\n >\n {title}\n </h2>\n ) : (\n /* Keep the centering slot stable even before the first\n `datesSet` populates the title — an empty <h2> would trip\n axe's `empty-heading` rule, so we substitute a decorative\n spacer that matches the h2's flex sizing. Once `title` is\n non-empty the h2 renders in the same slot. */\n <div aria-hidden=\"true\" className=\"ds:flex-1 ds:text-center\" />\n )}\n {end ? (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {end}\n </div>\n ) : null}\n </div>\n );\n },\n);\nCalendarToolbar.displayName = 'Calendar.Toolbar';\n\n/* ------------------------------------------------------------------ */\n/* Calendar component */\n/* ------------------------------------------------------------------ */\n\nconst CalendarInner = forwardRef<CalendarHandle, CalendarProps>(\n (\n {\n id,\n events,\n resources,\n view = 'dayGridMonth',\n initialDate,\n locale: localeProp,\n onEventDrop,\n onEventResize,\n onEventResizeStart,\n onEventClick,\n onDateSelect,\n editable = false,\n eventDurationEditable,\n selectable = false,\n height,\n className,\n privacyMode = false,\n mode = 'default',\n modeLabel,\n modeBannerColor,\n modeBannerTextColor,\n onModeCancel,\n alertBanner,\n slotMinTime,\n slotMaxTime,\n slotDuration,\n showTime = true,\n datesAboveResources = true,\n slotEventOverlap = false,\n stickyHeaderDates = true,\n nowIndicator = true,\n dayMaxEvents = true,\n schedulerLicenseKey = import.meta.env.VITE_FULLCALENDAR_LICENSE_KEY,\n toolbar = true,\n toolbarEnd,\n resourceLayout = 'vertical',\n showResourceInitials = false,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const fcRef = useRef<FullCalendar | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const liveRegionRef = useRef<HTMLDivElement>(null);\n const focusTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const focusedElRef = useRef<HTMLElement | null>(null);\n\n const locale = localeProp ?? i18n.language ?? 'en';\n\n /* ---- direction reacts to dir attribute changes ----------------- */\n const [direction, setDirection] = useState<'ltr' | 'rtl'>(() => {\n if (typeof document === 'undefined') return 'ltr';\n const docDir = document.documentElement.getAttribute('dir');\n const i18nDir = typeof i18n.dir === 'function' ? i18n.dir() : 'ltr';\n return docDir === 'rtl' || i18nDir === 'rtl' ? 'rtl' : 'ltr';\n });\n\n useEffect(() => {\n if (typeof document === 'undefined') return undefined;\n const observer = new MutationObserver(() => {\n const docDir = document.documentElement.getAttribute('dir');\n const i18nDir = typeof i18n.dir === 'function' ? i18n.dir() : 'ltr';\n setDirection(docDir === 'rtl' || i18nDir === 'rtl' ? 'rtl' : 'ltr');\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir', 'lang'],\n });\n return () => observer.disconnect();\n }, [i18n]);\n\n /* ---- theme class-change observer → forces FullCalendar repaint - */\n useEffect(() => {\n if (typeof document === 'undefined') return undefined;\n let timer: ReturnType<typeof setTimeout>;\n const observer = new MutationObserver(() => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n const api = fcRef.current?.getApi() as unknown;\n if (\n api &&\n typeof (api as { render?: () => void }).render === 'function'\n ) {\n (api as { render: () => void }).render();\n }\n }, 50);\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n return () => {\n clearTimeout(timer);\n observer.disconnect();\n };\n }, []);\n\n /* ---- FullCalendar markup a11y patches --------------------------- */\n /* */\n /* FullCalendar emits a few markup patterns that axe (correctly) */\n /* flags but we cannot fix without forking FC. Patching at */\n /* render-time via MutationObserver keeps the fix scoped: */\n /* */\n /* 1. `<a aria-expanded aria-controls>` for the daygrid \"+N more\" */\n /* trigger has no `role` — `aria-expanded` is not allowed on a */\n /* bare anchor. Add `role=\"button\"`. */\n /* 2. `.fc-scroller` is a scrollable region with no keyboard */\n /* access — give it `tabindex=\"0\"` and `role=\"region\"` so */\n /* keyboard users can scroll it. */\n /* 3. `.fc-bg-event` (background events used for highlight ranges) */\n /* is rendered with `aria-hidden=\"true\"` ancestor + an inner */\n /* `<a tabindex=\"0\">` — strip the focusability when */\n /* `aria-hidden` is in effect. */\n useEffect(() => {\n if (typeof document === 'undefined') return undefined;\n const root = rootRef.current;\n if (!root) return undefined;\n\n const patchMarkup = () => {\n root\n .querySelectorAll<HTMLAnchorElement>('.fc-daygrid-more-link')\n .forEach((link) => {\n if (!link.getAttribute('role')) {\n link.setAttribute('role', 'button');\n }\n });\n // `.fc-scroller` cannot be patched — adding `tabindex=\"0\"`\n // makes it a focusable direct child of FC's `<table\n // role=\"grid\">`, which axe (correctly) flags as a violation of\n // `aria-required-children` (a grid expects only `role=\"row\"`\n // children). The `scrollable-region-focusable` rule will need\n // an upstream FC fix or per-story override; for now we accept\n // it. (Tracked: deferred.)\n // Inside any aria-hidden subtree, force focusable descendants to\n // tabindex=\"-1\" so they leave the tab sequence (axe\n // aria-hidden-focus). FC marks decorative rows / mirror events\n // aria-hidden but leaves the inner anchors focusable.\n root\n .querySelectorAll<HTMLElement>('[aria-hidden=\"true\"]')\n .forEach((hidden) => {\n hidden\n .querySelectorAll<HTMLElement>(\n 'a[href], button, [tabindex]:not([tabindex=\"-1\"])',\n )\n .forEach((el) => {\n el.setAttribute('tabindex', '-1');\n });\n });\n };\n\n patchMarkup();\n const observer = new MutationObserver(patchMarkup);\n observer.observe(root, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['aria-hidden'],\n });\n return () => observer.disconnect();\n }, [t]);\n\n /* ---- reduced-motion gate --------------------------------------- */\n const reducedMotion = usePrefersReducedMotion();\n\n /* ---- current title (synced from FC via datesSet) --------------- */\n const [currentTitle, setCurrentTitle] = useState('');\n\n /* ---- imperative handle ----------------------------------------- */\n const handle = useMemo<CalendarHandle>(() => {\n const getRawApi = (): FcApi | undefined =>\n fcRef.current?.getApi() as FcApi | undefined;\n\n return {\n getApi: () => fcRef.current?.getApi(),\n today: () => {\n getRawApi()?.today();\n },\n prev: () => {\n getRawApi()?.prev();\n },\n next: () => {\n getRawApi()?.next();\n },\n gotoDate: (date: Date | string) => {\n getRawApi()?.gotoDate(date);\n },\n changeView: (nextView: CalendarView) => {\n getRawApi()?.changeView(\n resolveFullCalendarView(nextView, resourceLayout),\n );\n },\n getTitle: () => getRawApi()?.view.title ?? '',\n getCurrentView: () => {\n const type = getRawApi()?.view.type;\n return type as CalendarView | undefined;\n },\n getCurrentDate: () => getRawApi()?.getDate(),\n focusEvent: (eventId: string) => {\n const root = rootRef.current;\n if (!root) return;\n const selector = `[data-event-id=\"${CSS.escape(eventId)}\"]`;\n const element = root.querySelector<HTMLElement>(selector);\n if (!element) {\n if (import.meta.env.DEV) {\n console.warn(\n `[Calendar] focusEvent: no DOM node matches event id \"${eventId}\".`,\n );\n }\n return;\n }\n /* Clear any previous highlight still in-flight before\n starting a new one — prevents overlapping timers from\n removing the className mid-animation. */\n if (focusTimerRef.current) {\n clearTimeout(focusTimerRef.current);\n focusTimerRef.current = null;\n }\n if (focusedElRef.current && focusedElRef.current !== element) {\n focusedElRef.current.classList.remove('calendar-event-focused');\n }\n\n element.scrollIntoView({\n behavior: reducedMotion ? 'auto' : 'smooth',\n block: 'center',\n });\n element.classList.add('calendar-event-focused');\n focusedElRef.current = element;\n\n /* Announce via aria-live, masking the title under privacy\n mode the same way drop/resize do. */\n if (liveRegionRef.current) {\n const titleAttr = element.getAttribute('aria-label') ?? eventId;\n const announcedTitle = privacyMode ? '•••' : titleAttr;\n liveRegionRef.current.textContent = t('calendar.focusedEvent', {\n title: announcedTitle,\n });\n }\n\n focusTimerRef.current = setTimeout(() => {\n element.classList.remove('calendar-event-focused');\n if (focusedElRef.current === element) {\n focusedElRef.current = null;\n }\n focusTimerRef.current = null;\n }, 3000);\n },\n };\n }, [reducedMotion, privacyMode, t, resourceLayout]);\n\n useImperativeHandle(ref, () => handle, [handle]);\n useAgentRegistration(calendarAgent, handle, id);\n\n /* Clean up any pending focus timer on unmount. */\n useEffect(\n () => () => {\n if (focusTimerRef.current) {\n clearTimeout(focusTimerRef.current);\n focusTimerRef.current = null;\n }\n },\n [],\n );\n\n /* ---- translated toolbar button labels (used by FC internal when\n we opt in to its toolbar — currently always off in the default\n path; retained for noEventsText / allDayText completeness) ---- */\n const statusLabels = useMemo<Record<CalendarEventStatus, string>>(\n () => ({\n confirmed: t('calendar.status.confirmed'),\n waiting: t('calendar.status.waiting'),\n in_care: t('calendar.status.inCare'),\n done: t('calendar.status.done'),\n cancelled: t('calendar.status.cancelled'),\n absent: t('calendar.status.absent'),\n }),\n [t],\n );\n\n /* ---- privacy-mode announcer (skip initial render) --------------- */\n const privacyFirstRun = useRef(true);\n useEffect(() => {\n if (privacyFirstRun.current) {\n privacyFirstRun.current = false;\n return;\n }\n if (liveRegionRef.current) {\n liveRegionRef.current.textContent = privacyMode\n ? t('calendar.privacyModeOn')\n : t('calendar.privacyModeOff');\n }\n }, [privacyMode, t]);\n\n /* ---- adapt events for FullCalendar ----------------------------- */\n const fcEvents = useMemo<EventInput[]>(\n () =>\n events.map((event) => ({\n id: event.id,\n title: event.title,\n start: event.start,\n end: event.end,\n allDay: event.allDay,\n resourceId: event.resourceId,\n display: event.isInternal ? 'background' : undefined,\n extendedProps: {\n status: event.status,\n resourceId: event.resourceId,\n backgroundColor: event.backgroundColor,\n textColor: event.textColor,\n suffix: event.suffix,\n privacyModeTitle: event.privacyModeTitle,\n isBookedOnline: event.isBookedOnline ?? false,\n hasUnassignedPatient: event.hasUnassignedPatient ?? false,\n hasHighlightedAnamnesis: event.hasHighlightedAnamnesis ?? false,\n hasBillableAmount: event.hasBillableAmount ?? false,\n isTelehealth: event.isTelehealth ?? false,\n isRecurrenceParent: event.isRecurrenceParent ?? false,\n isInternal: event.isInternal ?? false,\n patientId: event.patientId,\n operatorId: event.operatorId,\n },\n })),\n [events],\n );\n\n /* ---- formatters (Intl, never literal format strings) ----------- */\n const titleFormat = useMemo(\n () => ({\n year: 'numeric' as const,\n month: 'long' as const,\n }),\n [],\n );\n const dayHeaderFormat = useMemo(\n () => ({\n weekday: 'short' as const,\n }),\n [],\n );\n const eventTimeFormat = useMemo(\n () => ({\n hour: 'numeric' as const,\n minute: '2-digit' as const,\n }),\n [],\n );\n const slotLabelFormat = useMemo(\n () => ({\n hour: 'numeric' as const,\n minute: '2-digit' as const,\n }),\n [],\n );\n\n /* ---- helper: adapt FC event to CalendarEvent -------------------- */\n const adaptEvent = (\n fcEvent: EventDropArg['event'] | EventClickArg['event'],\n ): CalendarEvent => {\n const ext = (fcEvent.extendedProps ?? {}) as EventExtendedProps;\n return {\n id: fcEvent.id,\n title: fcEvent.title,\n start: fcEvent.start ?? new Date(),\n end: fcEvent.end ?? undefined,\n resourceId: ext.resourceId,\n status: ext.status,\n allDay: fcEvent.allDay,\n backgroundColor: ext.backgroundColor,\n textColor: ext.textColor,\n suffix: ext.suffix,\n privacyModeTitle: ext.privacyModeTitle,\n isBookedOnline: ext.isBookedOnline,\n hasUnassignedPatient: ext.hasUnassignedPatient,\n hasHighlightedAnamnesis: ext.hasHighlightedAnamnesis,\n hasBillableAmount: ext.hasBillableAmount,\n isTelehealth: ext.isTelehealth,\n isRecurrenceParent: ext.isRecurrenceParent,\n isInternal: ext.isInternal,\n patientId: ext.patientId,\n operatorId: ext.operatorId,\n };\n };\n\n /* ---- callbacks ------------------------------------------------- */\n const handleEventDrop = useMemo(() => {\n if (!onEventDrop) return undefined;\n return (info: EventDropArg) => {\n if (!info.event.start) return;\n // `info.oldEvent.start` is the only reliable source for the pre-drag\n // time — FullCalendar guarantees it is non-null for a drop on an\n // event that had a start. The `delta` field is unsafe to subtract\n // because it reports calendrical components (years/months/days +\n // sub-day ms), not a single ms offset, and month/year reconstruction\n // is ambiguous across boundaries. If oldStart is somehow missing we\n // bail rather than produce a silently-wrong value.\n const oldStart = info.oldEvent.start;\n if (!oldStart) {\n if (import.meta.env.DEV) {\n console.warn(\n '[Calendar] handleEventDrop: oldEvent.start was null — dropping the event-drop callback rather than emitting wrong oldStart data.',\n );\n }\n return;\n }\n onEventDrop({\n event: adaptEvent(info.event),\n oldStart,\n newStart: info.event.start,\n });\n /* Announce via aria-live. The announced title must honour\n privacyMode — the event card's aria-label already masks, but\n the live-region text is a separate codepath that would leak\n the raw name on drop if not masked here too. */\n if (liveRegionRef.current) {\n const ext = (info.event.extendedProps ?? {}) as EventExtendedProps;\n const announcedTitle = privacyMode\n ? (ext.privacyModeTitle ?? '•••')\n : info.event.title;\n liveRegionRef.current.textContent = t('calendar.eventMoved', {\n title: announcedTitle,\n });\n }\n };\n }, [onEventDrop, privacyMode, t]);\n\n const handleEventResize = useMemo(() => {\n if (!onEventResize) return undefined;\n return (info: EventResizeDoneArg) => {\n if (!info.event.end) return;\n // Mirror the drop path: rely on `info.oldEvent.end` for the pre-resize\n // boundary. Bail on null rather than fabricating a value from deltas.\n const oldEnd = info.oldEvent.end;\n if (!oldEnd) {\n if (import.meta.env.DEV) {\n console.warn(\n '[Calendar] handleEventResize: oldEvent.end was null — dropping the resize callback rather than emitting wrong oldEnd data.',\n );\n }\n return;\n }\n const newEnd = info.event.end;\n // Fall back to the pre-resize start (info.oldEvent.start), not\n // oldEnd — using oldEnd collapses cancelled drags to a zero-minute\n // duration in the live-region announcement.\n const newStart = info.event.start ?? info.oldEvent.start ?? oldEnd;\n onEventResize({\n event: adaptEvent(info.event),\n oldEnd,\n newEnd,\n });\n if (liveRegionRef.current) {\n const duration = Math.round(\n (newEnd.getTime() - newStart.getTime()) / 60000,\n );\n /* Mirror the drop path: mask the title when privacyMode is on. */\n const ext = (info.event.extendedProps ?? {}) as EventExtendedProps;\n const announcedTitle = privacyMode\n ? (ext.privacyModeTitle ?? '•••')\n : info.event.title;\n liveRegionRef.current.textContent = t('calendar.eventResized', {\n title: announcedTitle,\n duration,\n });\n }\n };\n }, [onEventResize, privacyMode, t]);\n\n const handleEventClick = useMemo(() => {\n if (!onEventClick) return undefined;\n return (info: EventClickArg) => {\n if (!info.event.start) return;\n onEventClick(adaptEvent(info.event));\n };\n }, [onEventClick]);\n\n const handleDateSelect = useMemo(() => {\n if (!onDateSelect) return undefined;\n return (info: DateSelectArg) => {\n onDateSelect({\n start: info.start,\n end: info.end,\n allDay: info.allDay,\n resourceId: info.resource?.id,\n });\n };\n }, [onDateSelect]);\n\n const handleDatesSet = useCallback((info: DatesSetArg) => {\n setCurrentTitle(info.view.title);\n }, []);\n\n /* ---- firstDay from locale -------------------------------------- */\n const firstDay = useMemo(() => resolveFirstDay(locale), [locale]);\n\n /* ---- plugins --------------------------------------------------- */\n const plugins = useMemo(\n () => [\n dayGridPlugin,\n timeGridPlugin,\n listPlugin,\n interactionPlugin,\n resourcePlugin,\n resourceTimeGridPlugin,\n resourceTimelinePlugin,\n timelinePlugin,\n ],\n [],\n );\n\n /* ---- resolved internal FC view name ---------------------------- */\n const resolvedView = useMemo(\n () => resolveFullCalendarView(view, resourceLayout),\n [view, resourceLayout],\n );\n\n /* ---- resource label render prop -------------------------------- */\n /* FC's `resourceLabelContent` supplies a `ResourceApi` whose\n `extendedProps` is typed as `{ [k: string]: any }`. We narrow to\n just the fields we pushed through `fcResources` via a local\n interface reached by an `unknown` pivot — keeps the DS body free\n of `any` while accepting FC's runtime shape. */\n interface ResourceExtendedProps {\n shortTitle?: string;\n color?: string;\n shortTitleTextColor?: string;\n }\n\n const renderResourceLabel = useCallback(\n (arg: ResourceLabelContentArg): ReactElement => {\n const ext = arg.resource\n .extendedProps as unknown as ResourceExtendedProps;\n const title = arg.resource.title;\n const shortTitle = ext.shortTitle;\n const color = ext.color;\n const textColor = ext.shortTitleTextColor;\n\n /* Runtime caller-supplied hex values flow through inline CSS\n custom properties only; the consuming `background-color` /\n `color` references live in the className as Tailwind arbitrary\n values, matching the event/mode-banner pattern (see\n 23-constraints §Runtime-computed dimensions).\n\n Inline style — permitted per 23-constraints §Runtime-computed\n dimensions (CSS custom property setters for --resource-color /\n --resource-initials-text-color). */\n const swatchStyle: CSSProperties | undefined =\n color || textColor\n ? {\n ...(color\n ? ({ '--resource-color': color } as CSSProperties)\n : {}),\n ...(textColor\n ? ({\n '--resource-initials-text-color': textColor,\n } as CSSProperties)\n : {}),\n }\n : undefined;\n\n if (showResourceInitials && shortTitle && color) {\n /* DEV-only guardrail: the initials circle is the one resource\n branch that actually paints text over the caller-supplied\n colour. Warn when the pair falls below WCAG AA. */\n warnLowContrast(color, textColor, `resource ${arg.resource.id}`);\n const initialsClass = [\n 'resource-initials',\n 'ds:[background-color:var(--resource-color)]',\n textColor ? 'ds:[color:var(--resource-initials-text-color)]' : null,\n ]\n .filter(Boolean)\n .join(' ');\n return (\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span\n className={initialsClass}\n // eslint-disable-next-line react/forbid-dom-props -- caller-supplied resource colours injected via CSS variables\n style={swatchStyle}\n aria-hidden=\"true\"\n >\n {shortTitle}\n </span>\n <span className=\"ds:truncate ds:text-start\">{title}</span>\n </span>\n );\n }\n\n if (color) {\n /* Dot branch has no text, but callers may still pass both halves\n of the pair in anticipation of flipping `showResourceInitials`.\n Only warn when both are defined — otherwise we'd noisily\n suggest a textColor that the dot renderer ignores. */\n if (color && textColor) {\n warnLowContrast(color, textColor, `resource ${arg.resource.id}`);\n }\n return (\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span\n className=\"resource-dot ds:[background-color:var(--resource-color)]\"\n // eslint-disable-next-line react/forbid-dom-props -- caller-supplied resource colour injected via CSS variable\n style={swatchStyle}\n aria-hidden=\"true\"\n />\n <span className=\"ds:truncate ds:text-start\">{title}</span>\n </span>\n );\n }\n\n return (\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span className=\"ds:truncate ds:text-start\">{title}</span>\n </span>\n );\n },\n [showResourceInitials],\n );\n\n /* ---- resources adapted for FC with extendedProps --------------- */\n const fcResources = useMemo(\n () =>\n resources?.map((resource) => ({\n id: resource.id,\n title: resource.title,\n sequenceNumber: resource.sequenceNumber,\n extendedProps: {\n shortTitle: resource.shortTitle,\n color: resource.color,\n shortTitleTextColor: resource.shortTitleTextColor,\n sequenceNumber: resource.sequenceNumber,\n },\n })),\n [resources],\n );\n\n /* ---- default-toolbar button handlers --------------------------- */\n const handleToolbarToday = useCallback(() => {\n (fcRef.current?.getApi() as FcApi | undefined)?.today();\n }, []);\n const handleToolbarPrev = useCallback(() => {\n (fcRef.current?.getApi() as FcApi | undefined)?.prev();\n }, []);\n const handleToolbarNext = useCallback(() => {\n (fcRef.current?.getApi() as FcApi | undefined)?.next();\n }, []);\n\n const wrapperClassName = [\n 'fc-theme-alfadocs',\n 'ds:bg-background ds:text-foreground',\n 'ds:rounded-[var(--radius-md)]',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n /* Mode banner style — runtime caller-supplied hex values flow through\n inline CSS-variable assignments only. The consuming\n `background-color` / `color` references live in the className as\n Tailwind arbitrary values, same justification as the event\n colour overrides above. */\n const modeBannerStyle: CSSProperties | undefined =\n modeBannerColor || modeBannerTextColor\n ? {\n ...(modeBannerColor\n ? ({ '--calendar-mode-bg': modeBannerColor } as CSSProperties)\n : {}),\n ...(modeBannerTextColor\n ? ({ '--calendar-mode-fg': modeBannerTextColor } as CSSProperties)\n : {}),\n }\n : undefined;\n\n /* DEV-only guardrail: warn when the caller-supplied mode-banner\n bg/fg hex pair falls below WCAG AA. No-op when either half is\n missing — the component falls back to --muted / --muted-foreground\n which are already calibrated to AA. */\n if (mode !== 'default' && (modeBannerColor || modeBannerTextColor)) {\n warnLowContrast(modeBannerColor, modeBannerTextColor, 'mode banner');\n }\n\n /* Static key map — keeps i18n-extraction tools (i18next-parser, etc.)\n happy, since they can't resolve template-literal keys. */\n const resolvedModeLabel =\n mode !== 'default' ? (modeLabel ?? t(MODE_BANNER_KEYS[mode])) : '';\n\n const modeBannerClassName = [\n 'ds:sticky ds:top-0 ds:z-10',\n 'ds:flex ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:py-[var(--spacing-sm)]',\n /* Caller-supplied colours flow through CSS custom properties set\n in `modeBannerStyle`; fallback tokens apply when the caller\n doesn't supply a hex. */\n modeBannerColor\n ? 'ds:[background-color:var(--calendar-mode-bg)]'\n : 'ds:bg-[var(--muted)]',\n modeBannerTextColor\n ? 'ds:[color:var(--calendar-mode-fg)]'\n : 'ds:text-[var(--muted-foreground)]',\n ]\n .filter(Boolean)\n .join(' ');\n\n const modeCancelClassName = [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:border ds:border-[var(--border)]',\n 'ds:font-[var(--font-weight-medium)] ds:text-[length:var(--font-size-sm)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:hover:bg-[var(--muted)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:motion-reduce:transition-none',\n ].join(' ');\n\n return (\n <div\n ref={rootRef}\n className={wrapperClassName}\n role=\"region\"\n aria-label={t('calendar.ariaLabel')}\n data-component=\"calendar\"\n data-component-id={id}\n data-mode={mode}\n >\n <div\n ref={liveRegionRef}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n />\n {alertBanner}\n {/* role=\"status\" already implies aria-live=\"polite\" +\n aria-atomic=\"true\"; setting the live attributes explicitly\n causes double announcements in some AT combinations. */}\n {mode !== 'default' ? (\n <div\n className={modeBannerClassName}\n // eslint-disable-next-line react/forbid-dom-props -- caller-supplied mode banner colours injected via CSS variables\n style={modeBannerStyle}\n role=\"status\"\n >\n <span className=\"ds:flex-1 ds:text-start\">{resolvedModeLabel}</span>\n {onModeCancel ? (\n <button\n type=\"button\"\n onClick={onModeCancel}\n className={modeCancelClassName}\n >\n {t('calendar.modeBanner.cancel')}\n </button>\n ) : null}\n </div>\n ) : null}\n {toolbar !== false ? (\n <CalendarToolbar\n title={currentTitle}\n onToday={handleToolbarToday}\n onPrev={handleToolbarPrev}\n onNext={handleToolbarNext}\n end={toolbarEnd}\n />\n ) : null}\n <FullCalendar\n ref={fcRef}\n plugins={plugins}\n schedulerLicenseKey={schedulerLicenseKey}\n initialView={resolvedView}\n views={CALENDAR_CUSTOM_VIEWS}\n initialDate={initialDate}\n locale={locale}\n direction={direction}\n firstDay={firstDay}\n editable={editable}\n eventDurationEditable={eventDurationEditable ?? editable}\n selectable={selectable}\n droppable={editable}\n dayMaxEvents={dayMaxEvents}\n height={height}\n events={fcEvents}\n resources={fcResources}\n resourceOrder=\"sequenceNumber\"\n resourceLabelContent={renderResourceLabel}\n headerToolbar={false}\n allDayText={t('calendar.allDay')}\n noEventsText={t('calendar.noEvents')}\n titleFormat={titleFormat}\n dayHeaderFormat={dayHeaderFormat}\n eventTimeFormat={eventTimeFormat}\n slotLabelFormat={slotLabelFormat}\n slotMinTime={slotMinTime ?? '00:00:00'}\n slotMaxTime={slotMaxTime ?? '24:00:00'}\n slotDuration={slotDuration ?? '00:30:00'}\n // Explicit `slotLabelInterval` — FullCalendar 6.1.x crashes\n // inside `wholeDivideDurations` / `addDurations` when its\n // internal default computation produces an undefined Duration\n // (`Cannot read properties of undefined (reading 'years')`).\n // Passing all three slot props as explicit strings bypasses\n // the fragile default-resolution path. 1h matches FC's\n // documented default for day/week views.\n slotLabelInterval=\"01:00:00\"\n datesAboveResources={datesAboveResources}\n slotEventOverlap={slotEventOverlap}\n stickyHeaderDates={stickyHeaderDates}\n nowIndicator={nowIndicator}\n eventLongPressDelay={reducedMotion ? 0 : 1000}\n eventDragMinDistance={reducedMotion ? 0 : 5}\n eventContent={(arg) =>\n renderEventContent({\n arg,\n locale,\n resources: resources ?? [],\n statusLabels,\n privacyMode,\n showTime,\n })\n }\n eventClick={handleEventClick}\n eventDrop={handleEventDrop}\n eventResize={handleEventResize}\n eventResizeStart={onEventResizeStart}\n select={handleDateSelect}\n datesSet={handleDatesSet}\n />\n </div>\n );\n },\n);\nCalendarInner.displayName = 'Calendar';\n\n/* Compound attachment — exposes `<Calendar.Toolbar />` so consumers can\n render a standalone toolbar bound to their own handle-driven handlers\n when they hide the built-in toolbar via `toolbar={false}`. The\n `typeof CalendarInner & { Toolbar }` widening is the single acceptable\n cast called out in the implementation plan. */\ntype CalendarComponent = typeof CalendarInner & {\n Toolbar: typeof CalendarToolbar;\n};\nexport const Calendar = CalendarInner as CalendarComponent;\nCalendar.Toolbar = CalendarToolbar;\n"],"names":["__iconNode","Ban","createLucideIcon","Euro","ThumbsUp","Zap","calendarAgent","handle","_a","args","RESOURCE_VIEW_MAP","STANDARD_VIEWS","resolveFullCalendarView","view","resourceLayout","stem","CALENDAR_CUSTOM_VIEWS","eventCardVariants","cva","STATUS_ICON","Clock","Stethoscope","Check","MODE_BANNER_KEYS","resolveFirstDay","locale","intlLocale","info","useIsRtl","i18n","useTranslation","isRtl","setIsRtl","useState","docDir","i18nDir","useEffect","observer","renderEventContent","arg","resources","statusLabels","privacyMode","showTime","extended","status","backgroundColor","textColor","suffix","privacyModeTitle","isBookedOnline","hasUnassignedPatient","hasHighlightedAnamnesis","hasBillableAmount","isTelehealth","resourceId","StatusIcon","start","end","allDay","rangeText","fmt","resourceTitle","r","statusLabel","displayTitle","ariaLabel","colourOverrides","className","jsxs","Globe","AlertTriangle","HeartPulse","Video","toolbarButtonBaseClass","toolbarTextButtonClass","toolbarIconButtonClass","CalendarToolbar","forwardRef","title","onToday","onPrev","onNext","ref","t","PrevIcon","ChevronRight","ChevronLeft","NextIcon","rootClassName","jsx","CalendarInner","id","events","initialDate","localeProp","onEventDrop","onEventResize","onEventResizeStart","onEventClick","onDateSelect","editable","eventDurationEditable","selectable","height","mode","modeLabel","modeBannerColor","modeBannerTextColor","onModeCancel","alertBanner","slotMinTime","slotMaxTime","slotDuration","datesAboveResources","slotEventOverlap","stickyHeaderDates","nowIndicator","dayMaxEvents","schedulerLicenseKey","toolbar","toolbarEnd","showResourceInitials","fcRef","useRef","rootRef","liveRegionRef","focusTimerRef","focusedElRef","direction","setDirection","timer","api","root","patchMarkup","link","hidden","el","reducedMotion","usePrefersReducedMotion","currentTitle","setCurrentTitle","useMemo","getRawApi","date","nextView","eventId","selector","element","titleAttr","announcedTitle","useImperativeHandle","useAgentRegistration","privacyFirstRun","fcEvents","event","titleFormat","dayHeaderFormat","eventTimeFormat","slotLabelFormat","adaptEvent","fcEvent","ext","handleEventDrop","oldStart","handleEventResize","oldEnd","newEnd","newStart","duration","handleEventClick","handleDateSelect","handleDatesSet","useCallback","firstDay","plugins","dayGridPlugin","timeGridPlugin","listPlugin","interactionPlugin","resourcePlugin","resourceTimeGridPlugin","resourceTimelinePlugin","timelinePlugin","resolvedView","renderResourceLabel","shortTitle","color","swatchStyle","initialsClass","fcResources","resource","handleToolbarToday","_b","handleToolbarPrev","handleToolbarNext","wrapperClassName","modeBannerStyle","resolvedModeLabel","modeBannerClassName","modeCancelClassName","FullCalendar","Calendar"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"care-plan-card-BwVUyUBb.js","sources":["../../src/components/care-plan-card/care-plan-card.agent.ts","../../src/components/care-plan-card/care-plan-card.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — CarePlanCard. */\n/* */\n/* Read-only surface: expose the plan's lifecycle state and line-progress */\n/* counts so an agent can introspect a care plan's status. State enum + */\n/* counts only — never the plan name, operator, treatment names, or any */\n/* patient identity. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { CarePlanCardHandle } from './care-plan-card';\n\nexport const carePlanCardAgent: AgentAdapter<CarePlanCardHandle> = {\n id: 'care-plan-card',\n capabilities: ['view_change', 'expand'],\n state: {\n state: {\n type: \"'estimate' | 'accepted' | 'discarded' | 'closed'\",\n descriptionKey: 'ui.agent.carePlanCard.state.state',\n description:\n 'The plan lifecycle state. Enum value only — never the localised label or any PHI.',\n read: (handle) => handle.getState(),\n },\n progress: {\n type: '{ done: number; total: number }',\n descriptionKey: 'ui.agent.carePlanCard.state.progress',\n description:\n 'Line progress as done / total counts. Counts only — never treatment names or operator identity.',\n read: (handle) => handle.getProgress(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'care-plan-card',\n description: 'Marks the CarePlanCard root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop. Addresses a specific plan.',\n },\n },\n};\n","import { forwardRef, useId, type HTMLAttributes } from 'react';\nimport { type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Badge } from '../badge/badge';\nimport { Link } from '../link/link';\nimport { Progress } from '../progress/progress';\nimport { Timestamp } from '../timestamp/timestamp';\nimport { TransactionChip } from '../transaction-chip/transaction-chip';\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from '../accordion/accordion';\nimport {\n CarePlanEntryCard,\n type CarePlanEntryCardProps,\n} from '../care-plan-entry-card';\nimport {\n entitySurfaceVariants,\n CARE_PLAN_STATE_BADGE,\n isSafeEntityUrl,\n type CarePlanState,\n} from '../_shared/entity-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { carePlanCardAgent } from './care-plan-card.agent';\n\n/* -------------------------------------------------------------------- */\n/* CarePlanCard */\n/* */\n/* The summary card for a whole care plan / estimate (\"preventivo\"). */\n/* Replaces the hand-rolled platform care-plan header that interleaves */\n/* the plan number + name, a lifecycle badge, the financial figures */\n/* (billed / due / overdue), an acceptance/closure date, a phase- */\n/* progress bar, an optional deep link, and an expandable list of the */\n/* plan's treatment lines. */\n/* */\n/* Composes: entitySurfaceVariants (shared card surface) + Badge */\n/* (lifecycle state) + TransactionChip (money) + Progress (done/total) */\n/* + Timestamp (dates) + Link (deep link) + Accordion (entries rendered */\n/* as <CarePlanEntryCard> rows). */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `carePlanCard.*` namespace — the lifecycle state is ALWAYS shown as a */\n/* localised label, never the raw server string. Identifiers + structural */\n/* state only reach the agent layer — never patient identity. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\n/**\n * A single treatment line within the plan. Each ref is forwarded straight\n * to a `<CarePlanEntryCard>` rendered inside the Accordion. `entryId` keys\n * the row and surfaces as the line's `data-component-id`.\n */\nexport interface CarePlanEntryRef extends Omit<\n CarePlanEntryCardProps,\n 'id' | 'surface'\n> {\n /** Stable line id — identifier only, never PHI. */\n entryId: string;\n}\n\n/** Financial figures for the plan, all amounts in integer cents. */\nexport interface CarePlanAmounts {\n /** Full list price in cents (non-negative). */\n priceCents?: number;\n /** Discounted / agreed price in cents (non-negative). */\n discountedPriceCents?: number;\n /** Amount already invoiced in cents (non-negative). */\n billedAmountCents?: number;\n /** Outstanding amount still due in cents (non-negative). */\n dueCents?: number;\n /** How many days the due amount is overdue (non-negative). */\n overdueDays?: number;\n}\n\n/** Phase / line progress for the plan. */\nexport interface CarePlanProgress {\n /** Number of executed / completed lines. */\n done: number;\n /** Total number of lines. */\n total: number;\n}\n\n/** Lifecycle dates for the plan, all ISO-8601 strings. */\nexport interface CarePlanDates {\n /** When the plan was accepted. */\n acceptedIso?: string;\n /** When the plan was closed. */\n closedIso?: string;\n /** When the plan was discarded / rejected. */\n discardedIso?: string;\n}\n\n/** Curated read-only handle exposed to the agent registry. */\nexport interface CarePlanCardHandle {\n /** The plan's lifecycle state. */\n getState: () => CarePlanState;\n /** Line progress as `{ done, total }` — counts only, no PHI. */\n getProgress: () => { done: number; total: number };\n}\n\nexport interface CarePlanCardProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'aria-label' | 'title' | 'children'\n> {\n /**\n * Stable instance id — surfaced as `data-component-id` for the agent\n * registry and mirrored to the DOM `id`; also wires the heading ↔ region\n * relationship.\n */\n id?: string;\n /** Plan number (e.g. estimate number). Rendered beside the name. */\n number: string | number;\n /** Plan name / title. Rendered as the card heading. */\n name?: string;\n /** Lifecycle state — drives a localised Badge label. */\n state: CarePlanState;\n /** Optional deep link to the full plan. Guarded by `isSafeEntityUrl`. */\n url?: string;\n /** Financial figures (billed / due / overdue …). */\n amounts?: CarePlanAmounts;\n /** Line progress (done / total). */\n progress?: CarePlanProgress;\n /** Lifecycle dates (accepted / closed / discarded). */\n dates?: CarePlanDates;\n /** Reason the plan was discarded — shown only when `state === 'discarded'`. */\n discardReason?: string;\n /**\n * Dentition the plan applies to — forwarded to each entry card's tooth\n * display where relevant. Structural only.\n */\n dentitionMode?: 'permanent' | 'deciduous';\n /** Treatment lines — rendered as `<CarePlanEntryCard>` rows in an Accordion. */\n entries?: CarePlanEntryRef[];\n /** BCP 47 locale override for dates / currency. Defaults to i18n.language. */\n locale?: string;\n /** ISO 4217 currency code for the money chips. Defaults to `EUR`. */\n currency?: string;\n /**\n * `elevated` (default) paints the kit card chrome; `flat` drops it for use\n * inside an existing Card / Sheet.\n */\n surface?: 'flat' | 'elevated';\n /** Fires when the plan deep link / heading is activated. */\n onActivate?: () => void;\n /** Accessible label override for the plan region. */\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------- */\n\nconst DEFAULT_CURRENCY = 'EUR';\n\n/**\n * English fallbacks for the lifecycle-state labels. The canonical strings\n * live in the `ui.carePlanCard.state.*` bundle; these inline defaults guard\n * against a stale / not-yet-wired bundle so a raw key never reaches the UI.\n */\nconst STATE_LABEL_FALLBACK: Record<CarePlanState, string> = {\n estimate: 'Estimate',\n accepted: 'Accepted',\n discarded: 'Discarded',\n closed: 'Closed',\n};\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const CarePlanCard = forwardRef<HTMLDivElement, CarePlanCardProps>(\n (\n {\n id,\n number,\n name,\n state,\n url,\n amounts,\n progress,\n dates,\n discardReason,\n dentitionMode: _dentitionMode,\n entries,\n locale,\n currency = DEFAULT_CURRENCY,\n surface = 'elevated',\n onActivate,\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const headingId = useId();\n const progressLabelId = useId();\n const activeLocale = locale ?? i18n.language ?? 'en';\n\n useAgentRegistration(\n carePlanCardAgent,\n {\n getState: () => state,\n getProgress: () => ({\n done: progress?.done ?? 0,\n total: progress?.total ?? 0,\n }),\n },\n id,\n );\n\n const stateLabel = t(`carePlanCard.state.${state}`, {\n defaultValue: STATE_LABEL_FALLBACK[state],\n });\n const stateBadgeVariant = CARE_PLAN_STATE_BADGE[state];\n const hasSafeUrl = !!url && isSafeEntityUrl(url);\n const hasEntries = !!entries && entries.length > 0;\n\n // Money: prefer the outstanding \"due\" chip; mark it overdue when it has\n // run past its term. Anything billed shows a settled chip alongside.\n const dueCents = amounts?.dueCents;\n const billedCents = amounts?.billedAmountCents;\n const overdueDays = amounts?.overdueDays;\n const isOverdue =\n typeof overdueDays === 'number' &&\n overdueDays > 0 &&\n typeof dueCents === 'number' &&\n dueCents > 0;\n\n const headingNode = (\n <h3\n id={headingId}\n className=\"type-title-card ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {name ?? t('carePlanCard.untitled', 'Untitled plan')}\n </h3>\n );\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabel ? undefined : headingId}\n data-component=\"care-plan-card\"\n data-component-id={id}\n data-state={state}\n id={id}\n className={entitySurfaceVariants({ surface, className })}\n {...rest}\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {/* Heading row: number + name + lifecycle badge */}\n <div className=\"ds:flex ds:items-start ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)] ds:tabular-nums\">\n {t('carePlanCard.number', {\n number,\n defaultValue: 'Plan #{{number}}',\n })}\n </span>\n {hasSafeUrl ? (\n <Link\n href={url as string}\n weight=\"strong\"\n onClick={(event) => {\n if (\n event.defaultPrevented ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n onActivate?.();\n }}\n >\n {headingNode}\n </Link>\n ) : (\n headingNode\n )}\n </div>\n\n <Badge\n variant={stateBadgeVariant}\n size=\"sm\"\n withDot\n className=\"ds:shrink-0\"\n >\n {stateLabel}\n </Badge>\n </div>\n\n {/* Discard reason — only when discarded */}\n {state === 'discarded' && discardReason ? (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n <span className=\"ds:font-medium ds:text-[color:var(--foreground)]\">\n {t('carePlanCard.discardReasonLabel', 'Discard reason:')}\n </span>{' '}\n {discardReason}\n </p>\n ) : null}\n\n {/* Lifecycle date line */}\n {dates ? (\n <div className=\"type-body-sm ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-md)] ds:text-[color:var(--muted-foreground)]\">\n {dates.acceptedIso ? (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span>{t('carePlanCard.date.accepted', 'Accepted')}</span>\n <Timestamp\n value={dates.acceptedIso}\n format=\"absolute\"\n locale={activeLocale}\n />\n </span>\n ) : null}\n {dates.closedIso ? (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span>{t('carePlanCard.date.closed', 'Closed')}</span>\n <Timestamp\n value={dates.closedIso}\n format=\"absolute\"\n locale={activeLocale}\n />\n </span>\n ) : null}\n {dates.discardedIso ? (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span>{t('carePlanCard.date.discarded', 'Discarded')}</span>\n <Timestamp\n value={dates.discardedIso}\n format=\"absolute\"\n locale={activeLocale}\n />\n </span>\n ) : null}\n </div>\n ) : null}\n\n {/* Money: due / overdue / billed chips */}\n {typeof dueCents === 'number' || typeof billedCents === 'number' ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n {typeof dueCents === 'number' && dueCents > 0 ? (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <TransactionChip\n state=\"debt\"\n amount={dueCents / 100}\n currency={currency}\n locale={activeLocale}\n showLabel\n size=\"md\"\n />\n {isOverdue ? (\n <Badge variant=\"error\" size=\"sm\" withDot>\n {t('carePlanCard.overdue', {\n count: overdueDays,\n defaultValue: 'Overdue {{count}}d',\n })}\n </Badge>\n ) : null}\n </div>\n ) : null}\n {typeof billedCents === 'number' && billedCents > 0 ? (\n <TransactionChip\n state=\"settled\"\n amount={billedCents / 100}\n currency={currency}\n locale={activeLocale}\n showLabel\n size=\"md\"\n />\n ) : null}\n </div>\n ) : null}\n\n {/* Line / phase progress */}\n {progress && progress.total > 0 ? (\n <Progress\n value={progress.done}\n max={progress.total}\n size=\"sm\"\n aria-label={t('carePlanCard.progressLabel', {\n done: progress.done,\n total: progress.total,\n defaultValue: 'Progress: {{done}} of {{total}} completed',\n })}\n >\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <Progress.Label id={progressLabelId}>\n {t('carePlanCard.progressHeading', 'Progress')}\n </Progress.Label>\n <span className=\"type-body-sm ds:tabular-nums ds:text-[color:var(--muted-foreground)]\">\n {t('carePlanCard.progressCount', {\n done: progress.done,\n total: progress.total,\n defaultValue: '{{done}} / {{total}}',\n })}\n </span>\n </div>\n </Progress>\n ) : null}\n\n {/* Entries — expandable list of treatment lines */}\n {hasEntries ? (\n <Accordion type=\"single\" collapsible variant=\"separated\">\n <AccordionItem value=\"entries\">\n <AccordionTrigger>\n {t('carePlanCard.entries.toggle', {\n count: entries.length,\n defaultValue: 'Treatment lines ({{count}})',\n })}\n </AccordionTrigger>\n <AccordionContent>\n <ul className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-0\">\n {entries.map(({ entryId, ...entry }) => (\n <li key={entryId}>\n <CarePlanEntryCard\n id={entryId}\n surface=\"flat\"\n locale={activeLocale}\n currency={currency}\n {...entry}\n />\n </li>\n ))}\n </ul>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n ) : null}\n </div>\n </div>\n );\n },\n);\n\nCarePlanCard.displayName = 'CarePlanCard';\n\nexport type CarePlanCardSurface = NonNullable<\n VariantProps<typeof entitySurfaceVariants>['surface']\n>;\n\n/** The dentition the plan applies to. */\nexport type CarePlanCardDentition = NonNullable<\n CarePlanCardProps['dentitionMode']\n>;\n\n/* Re-export the shared lifecycle-state type for downstream typing. */\nexport type { CarePlanState } from '../_shared/entity-card';\n"],"names":["carePlanCardAgent","handle","DEFAULT_CURRENCY","STATE_LABEL_FALLBACK","CarePlanCard","forwardRef","id","number","name","state","url","amounts","progress","dates","discardReason","_dentitionMode","entries","locale","currency","surface","onActivate","ariaLabel","className","rest","ref","t","i18n","useTranslation","headingId","useId","progressLabelId","activeLocale","useAgentRegistration","stateLabel","stateBadgeVariant","CARE_PLAN_STATE_BADGE","hasSafeUrl","isSafeEntityUrl","hasEntries","dueCents","billedCents","overdueDays","isOverdue","headingNode","jsx","entitySurfaceVariants","jsxs","Link","event","Badge","Timestamp","TransactionChip","Progress","Accordion","AccordionItem","AccordionTrigger","AccordionContent","entryId","entry","CarePlanEntryCard"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"care-plan-entry-card-VzdQHcOL.js","sources":["../../src/components/care-plan-entry-card/care-plan-entry-card.agent.ts","../../src/components/care-plan-entry-card/care-plan-entry-card.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — CarePlanEntryCard. */\n/* */\n/* Read-only surface: expose the execution flag and phase-progress */\n/* counts so an agent can introspect a treatment line's status. Counts + */\n/* booleans only — never the treatment name, operator, or any patient */\n/* identity. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { CarePlanEntryCardHandle } from './care-plan-entry-card';\n\nexport const carePlanEntryCardAgent: AgentAdapter<CarePlanEntryCardHandle> = {\n id: 'care-plan-entry-card',\n capabilities: ['view_change'],\n state: {\n done: {\n type: 'boolean',\n descriptionKey: 'ui.agent.carePlanEntryCard.state.done',\n description: 'Whether the treatment line is marked executed.',\n read: (handle) => handle.isDone(),\n },\n phaseProgress: {\n type: '{ executed: number; total: number }',\n descriptionKey: 'ui.agent.carePlanEntryCard.state.phaseProgress',\n description:\n 'Phase progress as executed / total counts. Counts only — never phase labels or operator identity.',\n read: (handle) => handle.getPhaseProgress(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'care-plan-entry-card',\n description: 'Marks the CarePlanEntryCard root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop. Addresses a specific line.',\n },\n },\n};\n","import { forwardRef, useId, type HTMLAttributes, type ReactNode } from 'react';\nimport { type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ChevronDown } from 'lucide-react';\nimport { Badge } from '../badge/badge';\nimport { Progress } from '../progress/progress';\nimport { Tag } from '../tag/tag';\nimport { Timestamp } from '../timestamp/timestamp';\nimport { TransactionChip } from '../transaction-chip/transaction-chip';\nimport { ToothScheme } from '../tooth-scheme/tooth-scheme';\nimport type { FdiId, ToothCondition } from '../tooth-scheme/tooth-data';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '../collapsible/collapsible';\nimport { entitySurfaceVariants } from '../_shared/entity-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { carePlanEntryCardAgent } from './care-plan-entry-card.agent';\n\n/* -------------------------------------------------------------------- */\n/* CarePlanEntryCard */\n/* */\n/* A single granular treatment line within a care plan / estimate */\n/* (\"voce di preventivo\"). Replaces the hand-rolled platform treatment */\n/* row that interleaves the treatment label, FDI tooth codes, an */\n/* execution badge, a phase-progress bar, a price chip, and an */\n/* expandable per-phase breakdown. */\n/* */\n/* Composes: entitySurfaceVariants (shared card surface) + Tag / ToothScheme*/\n/* (elements) + Badge (lifecycle flags) + Timestamp (execution / planned) */\n/* + Progress (phases) + TransactionChip (price) + Collapsible (per-phase */\n/* detail). */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `carePlanEntryCard.*` namespace. Identifiers + structural state only */\n/* reach the agent layer — never patient identity. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\n/** A planned (not-yet-executed) appointment the line is scheduled into. */\nexport interface CarePlanEntryPlannedAppointment {\n /** ISO-8601 date / datetime string. */\n dateIso: string;\n /** Stable appointment id (identifier only — never PHI). */\n appointmentId: string;\n /** Optional deep link to the appointment. */\n url?: string;\n}\n\n/** Price breakdown for the line, all amounts in integer cents. */\nexport interface CarePlanEntryPrice {\n /** List price in cents (non-negative). */\n priceCents?: number;\n /** Discounted price in cents (non-negative), when a discount applies. */\n discountedPriceCents?: number;\n /** Discount percentage (0–100), for the discount label. */\n discountPercentage?: number;\n}\n\n/** One row of the per-phase execution breakdown. */\nexport interface CarePlanEntryPhaseDetail {\n /** Short localised phase label (consumer-localised). */\n label: string;\n /** Whether this phase has been executed. */\n executed: boolean;\n /** ISO-8601 execution date, when executed. */\n executionDateIso?: string;\n /** Operator display name for the phase. */\n operator?: string;\n /** Unique Device Identifier / lot string for traceable materials. */\n udi?: string;\n}\n\n/** Phase progress summary + optional drill-down detail. */\nexport interface CarePlanEntryPhases {\n /** Number of executed phases. */\n executed: number;\n /** Total number of phases. */\n total: number;\n /** Optional per-phase breakdown rendered inside the Collapsible. */\n detail?: CarePlanEntryPhaseDetail[];\n}\n\n/** Operator the line is assigned to. */\nexport interface CarePlanEntryOperator {\n /** Operator display name (consumer-localised). */\n name: string;\n}\n\n/** Curated read-only handle exposed to the agent registry. */\nexport interface CarePlanEntryCardHandle {\n /** Whether the line is marked executed. */\n isDone: () => boolean;\n /** Phase progress as `{ executed, total }` — counts only, no PHI. */\n getPhaseProgress: () => { executed: number; total: number };\n}\n\nexport interface CarePlanEntryCardProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'aria-label' | 'title' | 'children'\n> {\n /**\n * Stable instance id — surfaced as `data-component-id` for the agent\n * registry and used to wire up the heading ↔ region relationship.\n */\n id?: string;\n /** Treatment / service name. Rendered as the line heading. */\n careName: string;\n /** Optional treatment code (e.g. tariff code) shown beside the name. */\n code?: string;\n /** Optional secondary label (e.g. category) under the name. */\n label?: string;\n /** FDI tooth codes the line applies to (e.g. `['16', '36']`). */\n elements?: string[];\n /** Whether the line has been executed / completed. */\n done?: boolean;\n /** ISO-8601 execution date — rendered next to the \"done\" badge. */\n executionDateIso?: string;\n /** A planned appointment the line is scheduled into, when not yet done. */\n plannedAppointment?: CarePlanEntryPlannedAppointment;\n /** Operator the line is assigned to. */\n operator?: CarePlanEntryOperator;\n /** Price breakdown (list / discounted). */\n price?: CarePlanEntryPrice;\n /** Phase progress + optional drill-down detail. */\n phases?: CarePlanEntryPhases;\n /** Whether the line has been billed / invoiced. */\n billed?: boolean;\n /** Whether the line falls outside the accepted estimate. */\n outsideOfEstimate?: boolean;\n /** Count of attached notes — rendered as a neutral count badge when > 0. */\n notesCount?: number;\n /**\n * How to render `elements`: `'chips'` (default) lists each FDI code as a\n * Tag; `'scheme'` renders a read-only `ToothScheme` highlighting them.\n */\n toothDisplay?: 'scheme' | 'chips';\n /** BCP 47 locale override for dates / currency. Defaults to i18n.language. */\n locale?: string;\n /** ISO 4217 currency code for the price chip. Defaults to `EUR`. */\n currency?: string;\n /**\n * `elevated` (default) paints the kit card chrome; `flat` drops it for use\n * inside an existing Card / Sheet.\n */\n surface?: 'flat' | 'elevated';\n /** Accessible label override for the line region. */\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------- */\n\nconst DEFAULT_CURRENCY = 'EUR';\n\n/**\n * Map the FDI element codes to a `ToothScheme` conditions shortcut. Codes\n * outside the FDI vocabulary are dropped (the scheme ignores unknown ids).\n * Every applied tooth is flagged `filled` so the display-mode chart marks\n * them with both colour and pattern — colour-not-alone.\n */\nfunction elementsToConditions(\n elements: string[],\n): Partial<Record<FdiId, ToothCondition[]>> {\n const conditions: Partial<Record<FdiId, ToothCondition[]>> = {};\n for (const code of elements) {\n conditions[code as FdiId] = ['filled'];\n }\n return conditions;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const CarePlanEntryCard = forwardRef<\n HTMLDivElement,\n CarePlanEntryCardProps\n>(\n (\n {\n id,\n careName,\n code,\n label,\n elements,\n done = false,\n executionDateIso,\n plannedAppointment,\n operator,\n price,\n phases,\n billed = false,\n outsideOfEstimate = false,\n notesCount,\n toothDisplay = 'chips',\n locale,\n currency = DEFAULT_CURRENCY,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const headingId = useId();\n const phasesLabelId = useId();\n const detailTriggerId = useId();\n const detailContentId = useId();\n const activeLocale = locale ?? i18n.language ?? 'en';\n\n useAgentRegistration(\n carePlanEntryCardAgent,\n {\n isDone: () => done,\n getPhaseProgress: () => ({\n executed: phases?.executed ?? 0,\n total: phases?.total ?? 0,\n }),\n },\n id,\n );\n\n const hasElements = !!elements && elements.length > 0;\n const hasPhaseDetail = !!phases?.detail && phases.detail.length > 0;\n\n // Price: prefer the discounted amount when present; show the list price\n // struck through beside it. Both are \"to-invoice\" until billed, then\n // settled.\n const priceState = billed ? 'settled' : 'to-invoice';\n const listCents = price?.priceCents;\n const discountedCents = price?.discountedPriceCents;\n const hasDiscount =\n discountedCents !== undefined &&\n listCents !== undefined &&\n discountedCents < listCents;\n const payableCents = discountedCents ?? listCents;\n\n const formatMoney = (cents: number): string =>\n new Intl.NumberFormat(activeLocale, {\n style: 'currency',\n currency,\n }).format(cents / 100);\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabel ? undefined : headingId}\n data-component=\"care-plan-entry-card\"\n data-component-id={id}\n data-done={done ? 'true' : 'false'}\n id={id}\n className={entitySurfaceVariants({ surface, className })}\n {...rest}\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {/* Heading row: name + code + trailing status flags */}\n <div className=\"ds:flex ds:items-start ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-baseline ds:gap-[var(--spacing-xs)]\">\n <h3\n id={headingId}\n className=\"type-title-item ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {careName}\n </h3>\n {code ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)] ds:tabular-nums\">\n {code}\n </span>\n ) : null}\n </div>\n {label ? (\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {label}\n </span>\n ) : null}\n </div>\n\n <div className=\"ds:flex ds:shrink-0 ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-2xs)]\">\n {done ? (\n <Badge variant=\"success\" size=\"sm\" withDot>\n {t('carePlanEntryCard.flag.done', 'Done')}\n </Badge>\n ) : null}\n {outsideOfEstimate ? (\n <Badge variant=\"warning\" size=\"sm\" withDot>\n {t(\n 'carePlanEntryCard.flag.outsideOfEstimate',\n 'Outside estimate',\n )}\n </Badge>\n ) : null}\n {billed ? (\n <Badge variant=\"neutral\" size=\"sm\">\n {t('carePlanEntryCard.flag.billed', 'Billed')}\n </Badge>\n ) : null}\n {typeof notesCount === 'number' && notesCount > 0 ? (\n <Badge\n variant=\"neutral\"\n size=\"sm\"\n aria-label={t('carePlanEntryCard.notesLabel', {\n count: notesCount,\n defaultValue: '{{count}} notes',\n })}\n >\n {notesCount}\n </Badge>\n ) : null}\n </div>\n </div>\n\n {/* Elements: tooth scheme (display mode) or FDI tag chips */}\n {hasElements ? (\n toothDisplay === 'scheme' ? (\n <ToothScheme\n mode=\"display\"\n conditions={elementsToConditions(elements)}\n ariaLabel={t('carePlanEntryCard.toothSchemeLabel', {\n count: elements.length,\n defaultValue: 'Teeth involved: {{count}}',\n })}\n />\n ) : (\n <div\n role=\"list\"\n aria-label={t(\n 'carePlanEntryCard.elementsLabel',\n 'Teeth involved',\n )}\n className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-2xs)]\"\n >\n {elements.map((element) => (\n <div role=\"listitem\" key={element}>\n <Tag label={element} variant=\"info\" size=\"sm\" />\n </div>\n ))}\n </div>\n )\n ) : null}\n\n {/* Schedule / execution line */}\n {done && executionDateIso ? (\n <p className=\"type-body-sm ds:m-0 ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n <span>{t('carePlanEntryCard.executedOn', 'Executed on')}</span>\n <Timestamp\n value={executionDateIso}\n format=\"absolute\"\n locale={activeLocale}\n />\n {operator ? (\n <span>\n {t('carePlanEntryCard.byOperator', {\n operator: operator.name,\n defaultValue: 'by {{operator}}',\n })}\n </span>\n ) : null}\n </p>\n ) : plannedAppointment ? (\n <p className=\"type-body-sm ds:m-0 ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n <span>{t('carePlanEntryCard.plannedFor', 'Planned for')}</span>\n <Timestamp\n value={plannedAppointment.dateIso}\n format=\"absolute\"\n locale={activeLocale}\n />\n {operator ? (\n <span>\n {t('carePlanEntryCard.byOperator', {\n operator: operator.name,\n defaultValue: 'by {{operator}}',\n })}\n </span>\n ) : null}\n </p>\n ) : operator ? (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('carePlanEntryCard.assignedTo', {\n operator: operator.name,\n defaultValue: 'Assigned to {{operator}}',\n })}\n </p>\n ) : null}\n\n {/* Phase progress */}\n {phases && phases.total > 0 ? (\n <Progress\n value={phases.executed}\n max={phases.total}\n size=\"sm\"\n aria-label={t('carePlanEntryCard.phasesLabel', {\n executed: phases.executed,\n total: phases.total,\n defaultValue: 'Phases: {{executed}} of {{total}} executed',\n })}\n >\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <Progress.Label id={phasesLabelId}>\n {t('carePlanEntryCard.phasesHeading', 'Phases')}\n </Progress.Label>\n <span className=\"type-body-sm ds:tabular-nums ds:text-[color:var(--muted-foreground)]\">\n {t('carePlanEntryCard.phasesCount', {\n executed: phases.executed,\n total: phases.total,\n defaultValue: '{{executed}} / {{total}}',\n })}\n </span>\n </div>\n </Progress>\n ) : null}\n\n {/* Footer: price + (optional) phase-detail disclosure */}\n {payableCents !== undefined || hasPhaseDetail ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n {payableCents !== undefined ? (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <TransactionChip\n state={priceState}\n amount={payableCents / 100}\n currency={currency}\n locale={activeLocale}\n size=\"md\"\n />\n {hasDiscount && listCents !== undefined ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)] ds:line-through ds:tabular-nums\">\n {formatMoney(listCents)}\n </span>\n ) : null}\n {hasDiscount && price?.discountPercentage !== undefined ? (\n <Badge variant=\"success\" size=\"sm\">\n {t('carePlanEntryCard.discountLabel', {\n percentage: price.discountPercentage,\n defaultValue: '-{{percentage}}%',\n })}\n </Badge>\n ) : null}\n </div>\n ) : null}\n\n {hasPhaseDetail ? (\n <Collapsible\n variant=\"default\"\n className=\"ds:ms-auto ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <CollapsibleTrigger asChild>\n <button\n type=\"button\"\n id={detailTriggerId}\n aria-controls={detailContentId}\n className=\"ds:group ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)] ds:rounded-[var(--radius-sm)] ds:border-0 ds:bg-transparent type-body-sm ds:text-[color:var(--foreground)] ds:cursor-pointer ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]\"\n >\n <span>\n {t(\n 'carePlanEntryCard.phaseDetail.toggle',\n 'Phase detail',\n )}\n </span>\n <ChevronDown\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:text-[color:var(--muted-foreground)] ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none ds:group-data-[state=open]:rotate-180\"\n />\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent\n id={detailContentId}\n aria-labelledby={detailTriggerId}\n >\n <ul className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-xs)] ds:p-0\">\n {phases?.detail?.map((phase, index) => (\n <PhaseDetailRow\n key={`${phase.label}-${index}`}\n phase={phase}\n locale={activeLocale}\n />\n ))}\n </ul>\n </CollapsibleContent>\n </Collapsible>\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n );\n },\n);\n\nCarePlanEntryCard.displayName = 'CarePlanEntryCard';\n\n/* -------------------------------------------------------------------- */\n/* PhaseDetailRow — one row inside the per-phase Collapsible */\n/* -------------------------------------------------------------------- */\n\nfunction PhaseDetailRow({\n phase,\n locale,\n}: {\n phase: CarePlanEntryPhaseDetail;\n locale: string;\n}): ReactNode {\n const { t } = useTranslation();\n return (\n <li className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n <Badge variant={phase.executed ? 'success' : 'neutral'} size=\"sm\" withDot>\n {phase.executed\n ? t('carePlanEntryCard.phaseDetail.executed', 'Executed')\n : t('carePlanEntryCard.phaseDetail.pending', 'Pending')}\n </Badge>\n <span className=\"type-body-sm ds:text-[color:var(--foreground)]\">\n {phase.label}\n </span>\n {phase.executed && phase.executionDateIso ? (\n <Timestamp\n value={phase.executionDateIso}\n format=\"absolute\"\n locale={locale}\n />\n ) : null}\n {phase.operator ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t('carePlanEntryCard.byOperator', {\n operator: phase.operator,\n defaultValue: 'by {{operator}}',\n })}\n </span>\n ) : null}\n {phase.udi ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)] ds:tabular-nums\">\n {t('carePlanEntryCard.phaseDetail.udi', {\n udi: phase.udi,\n defaultValue: 'UDI {{udi}}',\n })}\n </span>\n ) : null}\n </li>\n );\n}\n\nexport type CarePlanEntryCardSurface = NonNullable<\n VariantProps<typeof entitySurfaceVariants>['surface']\n>;\n"],"names":["carePlanEntryCardAgent","handle","DEFAULT_CURRENCY","elementsToConditions","elements","conditions","code","CarePlanEntryCard","forwardRef","id","careName","label","done","executionDateIso","plannedAppointment","operator","price","phases","billed","outsideOfEstimate","notesCount","toothDisplay","locale","currency","surface","ariaLabel","className","rest","ref","t","i18n","useTranslation","headingId","useId","phasesLabelId","detailTriggerId","detailContentId","activeLocale","useAgentRegistration","hasElements","hasPhaseDetail","priceState","listCents","discountedCents","hasDiscount","payableCents","formatMoney","cents","jsx","entitySurfaceVariants","jsxs","Badge","ToothScheme","element","Tag","Timestamp","Progress","TransactionChip","Collapsible","CollapsibleTrigger","ChevronDown","CollapsibleContent","phase","index","PhaseDetailRow"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"chart-Cg3e9EH9.js","sources":["../../src/components/chart/chart.agent.ts","../../src/components/chart/chart.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { ChartHandle } from './chart';\n\nexport const chartAgent: AgentAdapter<ChartHandle> = {\n id: 'chart',\n capabilities: [],\n state: {},\n actions: {\n update_series: {\n safety: 'read',\n argsType: 'series',\n description: 'Replace the chart series without remounting.',\n invoke: (\n handle,\n args: { series: Parameters<ChartHandle['updateSeries']>[0] },\n ) => {\n handle.updateSeries(args.series);\n },\n },\n export_png: {\n safety: 'read',\n description:\n 'Return a PNG data URI of the chart for export or screenshotting.',\n invoke: (handle) => handle.dataURI(),\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'chart' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* Chart — thin, typed wrapper over ApexCharts (react-apexcharts). */\n/* */\n/* - All chrome, colours, and fonts flow from */\n/* `src/tokens/apexcharts-theme.ts` — never hex literals in user */\n/* code. A MutationObserver on `<html class>` re-reads the bridge so */\n/* theme changes repaint without remount. */\n/* - A ResizeObserver on the wrapper keeps the chart responsive */\n/* without listening on `window.resize`. */\n/* - Accessibility: the wrapper carries `role=\"img\"` + `aria-label` */\n/* (required `title` prop) + `aria-describedby` pointing at a */\n/* visually-hidden `<table>` that mirrors series × categories. */\n/* - Colour-blind users: `patterns` prop flips `fill.type` to pattern */\n/* using ApexCharts' built-in pattern presets. */\n/* - Numbers format via `Intl.NumberFormat(locale)` — no hand-rolled */\n/* `toFixed()`. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport ReactApexChart from 'react-apexcharts';\nimport ApexCharts from 'apexcharts';\nimport { getApexChartsTheme } from '../../tokens/apexcharts-theme';\nimport { usePrefersReducedMotion } from '../../hooks';\nimport { useNeutraliseHiddenFocus } from '../_shared/use-neutralize-hidden-focus';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { chartAgent } from './chart.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst chartVariants = cva('ds:relative ds:block ds:w-full', {\n variants: {\n density: {\n compact: 'ds:min-h-[var(--chart-min-height-compact)]',\n comfortable: 'ds:min-h-[var(--chart-min-height-comfortable)]',\n // Applied when an explicit `height` prop is given and no density was\n // requested: the wrapper must not exceed the caller's height (a 96px\n // KPI chart inside a card must not reserve 320px).\n none: '',\n },\n },\n defaultVariants: { density: 'comfortable' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type ChartType = 'line' | 'bar' | 'pie' | 'donut' | 'area' | 'radialBar';\n\nexport interface ChartSeries {\n name: string;\n data: number[];\n}\n\nexport interface ChartProps extends VariantProps<typeof chartVariants> {\n /** Required — drives aria-label and sr-only table caption. */\n title: string;\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** Chart visual type. */\n type: ChartType;\n /**\n * For `line` / `bar` / `area`: an array of `ChartSeries`.\n * For `pie` / `donut` / `radialBar`: an array of numbers matched to `labels`.\n */\n series: ChartSeries[] | number[];\n /** Category axis labels (line / bar / area). */\n categories?: string[];\n /** Slice labels (pie / donut / radialBar). */\n labels?: string[];\n /** Height override. Defaults to 320px. */\n height?: number | string;\n /** Width override. Defaults to 100% of container. */\n width?: number | string;\n /** Opt-in pattern fills for colour-blind users. */\n patterns?: boolean;\n /**\n * Override the series colour ramp. Pass **already-resolved** colour strings\n * (e.g. the live value of `var(--success)` sampled by the consumer) — these\n * are handed straight to ApexCharts, which can't read CSS custom properties.\n * When omitted, the theme bridge's `colors` ramp from `apexcharts-theme.ts`\n * is used, so existing consumers are unaffected. Typical use: a single-arc\n * `radialBar` gauge (e.g. BMI) that must change hue with the value —\n * green in the healthy band, amber/red outside it.\n */\n colors?: string[];\n /** Show the ApexCharts toolbar. Defaults to false. */\n toolbar?: boolean;\n /** Locale override — defaults to the active i18next language. */\n locale?: string;\n /**\n * radialBar only. Formats the value printed in the ring centre. Use when the\n * gauge represents a non-percentage figure: pass the arc fill (0–100) as the\n * single `series` value and return the real figure here (e.g. `(_, ) => '22.4'`).\n * Ignored for every other chart type. Defaults to ApexCharts' `${value}%`.\n */\n radialValueFormatter?: (value: number) => string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\nexport interface ChartHandle {\n /** Returns a PNG data URI for the chart. */\n dataURI: () => Promise<string>;\n /** Updates series without remounting. */\n updateSeries: (next: ChartProps['series']) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Constants */\n/* ------------------------------------------------------------------ */\n\nconst PATTERN_STYLES = [\n 'verticalLines',\n 'horizontalLines',\n 'slantedLines',\n 'squares',\n 'circles',\n] as const;\n\n/** Types where `categories` belong on an x-axis. */\nconst CATEGORICAL_TYPES: ReadonlyArray<ChartType> = ['line', 'bar', 'area'];\n\n/** Types where `series` is a flat `number[]` paired with `labels`. */\nconst SLICE_TYPES: ReadonlyArray<ChartType> = ['pie', 'donut', 'radialBar'];\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction isSliceType(type: ChartType): boolean {\n return SLICE_TYPES.includes(type);\n}\n\nfunction isCategoricalType(type: ChartType): boolean {\n return CATEGORICAL_TYPES.includes(type);\n}\n\n/** Coerce `series` into `ChartSeries[]` for shared logic (table, aria). */\nfunction normaliseSeries(\n series: ChartSeries[] | number[],\n type: ChartType,\n): ChartSeries[] {\n if (isSliceType(type)) {\n const nums = series as number[];\n return [\n {\n name: '',\n data: nums,\n },\n ];\n }\n return series as ChartSeries[];\n}\n\n/* ------------------------------------------------------------------ */\n/* Chart component */\n/* ------------------------------------------------------------------ */\n\nexport const Chart = forwardRef<ChartHandle, ChartProps>(\n (\n {\n title,\n id,\n type,\n series,\n categories,\n labels,\n height,\n width,\n patterns = false,\n colors,\n toolbar = false,\n locale: localeProp,\n radialValueFormatter,\n density,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const rawId = useId();\n const chartId = useMemo(\n () => `chart-${rawId.replace(/[^a-zA-Z0-9-_]/g, '')}`,\n [rawId],\n );\n const summaryId = `${chartId}-summary`;\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState(0);\n\n /* ApexCharts injects focusable canvases inside the `aria-hidden` */\n /* chart wrapper. Neutralise their tabindex so axe's */\n /* `aria-hidden-focus` rule passes. Same hook used in Sparkline. */\n useNeutraliseHiddenFocus(wrapperRef);\n\n const locale = localeProp ?? i18n.language ?? 'en';\n\n /* ---- dev warning if title missing ------------------------------ */\n if (import.meta.env.DEV && !title) {\n console.warn(\n 'Chart: `title` prop is required. It drives aria-label and the screen-reader summary table.',\n );\n }\n\n /* ---- theme-reactive state -------------------------------------- */\n const [themeOptions, setThemeOptions] = useState<ApexCharts.ApexOptions>(\n () => {\n try {\n return getApexChartsTheme();\n } catch {\n return {};\n }\n },\n );\n\n /* ---- MutationObserver: re-read theme on class change ------------ */\n useEffect(() => {\n if (typeof document === 'undefined') return undefined;\n let timer: ReturnType<typeof setTimeout>;\n const observer = new MutationObserver(() => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n try {\n setThemeOptions(getApexChartsTheme());\n } catch {\n /* no-op in non-browser environments */\n }\n }, 50);\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n return () => {\n clearTimeout(timer);\n observer.disconnect();\n };\n }, []);\n\n /* ---- ResizeObserver: track container width --------------------- */\n useEffect(() => {\n const el = wrapperRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return undefined;\n const ro = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) setContainerWidth(Math.floor(entry.contentRect.width));\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n /* ---- imperative handle ----------------------------------------- */\n const agentHandle = useMemo<ChartHandle>(\n () => ({\n async dataURI(): Promise<string> {\n const instance = ApexCharts.getChartByID(chartId);\n if (!instance) return '';\n const result = await instance.dataURI();\n return (result as { imgURI: string }).imgURI;\n },\n updateSeries(next) {\n const instance = ApexCharts.getChartByID(chartId);\n if (!instance) return;\n if (isSliceType(type)) {\n instance.updateSeries(next as number[]);\n } else {\n instance.updateSeries(next as ChartSeries[]);\n }\n },\n }),\n [chartId, type],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(chartAgent, agentHandle, id);\n\n /* ---- RTL detection --------------------------------------------- */\n const isRtl =\n typeof document !== 'undefined' && document.documentElement.dir === 'rtl';\n\n /* ---- normalised series for sr-only table ----------------------- */\n const tableSeries = useMemo(\n () => normaliseSeries(series, type),\n [series, type],\n );\n\n /* ---- Intl formatter -------------------------------------------- */\n const numberFormatter = useMemo(\n () => new Intl.NumberFormat(locale),\n [locale],\n );\n\n /* ---- toolbar localisation -------------------------------------- */\n const toolbarLocale = useMemo(\n () => ({\n name: locale,\n options: {\n toolbar: {\n download: t('chart.toolbar.download'),\n selection: t('chart.toolbar.selection'),\n selectionZoom: t('chart.toolbar.selectionZoom'),\n zoomIn: t('chart.toolbar.zoomIn'),\n zoomOut: t('chart.toolbar.zoomOut'),\n pan: t('chart.toolbar.pan'),\n reset: t('chart.toolbar.reset'),\n exportToSVG: t('chart.toolbar.exportToSVG'),\n exportToPNG: t('chart.toolbar.exportToPNG'),\n exportToCSV: t('chart.toolbar.exportToCSV'),\n },\n },\n }),\n [locale, t],\n );\n\n /* ---- build ApexOptions ----------------------------------------- */\n const reducedMotion = usePrefersReducedMotion();\n\n const chartOptions: ApexCharts.ApexOptions = useMemo(() => {\n const base = themeOptions;\n\n const options: ApexCharts.ApexOptions = {\n ...base,\n chart: {\n ...base.chart,\n id: chartId,\n toolbar: { show: toolbar },\n zoom: { enabled: toolbar },\n animations: {\n enabled: !reducedMotion,\n dynamicAnimation: { enabled: !reducedMotion },\n },\n locales: [toolbarLocale],\n defaultLocale: locale,\n parentHeightOffset: 0,\n },\n labels: labels,\n legend: {\n ...base.legend,\n position: 'bottom',\n // ApexCharts legend.horizontalAlign is a physical prop mapped internally\n // to the chart's own text flow. For RTL we flip via `yaxis.opposite`\n // and ApexCharts' own `direction: 'rtl'` handling; legend stays anchored\n // to the inline-start by asking for 'left' on LTR and 'right' on RTL.\n horizontalAlign: isRtl ? 'right' : 'left',\n fontFamily: 'inherit',\n },\n tooltip: {\n ...base.tooltip,\n y: {\n formatter: (value: number) => numberFormatter.format(value),\n },\n },\n noData: {\n text: t('chart.noData'),\n },\n };\n\n // Consumer-supplied, already-resolved colour ramp wins over the theme\n // bridge's `colors`. Ignored when absent so existing charts keep the\n // tokenised ramp. ApexCharts can't read `var(--…)`, so the consumer is\n // responsible for sampling the live token value before passing it in.\n if (colors && colors.length > 0) {\n options.colors = colors;\n }\n\n if (isCategoricalType(type)) {\n options.xaxis = {\n ...base.xaxis,\n categories: categories ?? [],\n };\n options.yaxis = {\n ...base.yaxis,\n opposite: isRtl,\n labels: {\n formatter: (value: number) => numberFormatter.format(value),\n },\n };\n options.stroke = {\n curve: 'smooth',\n width: type === 'bar' ? 0 : 2,\n };\n options.dataLabels = { enabled: false };\n }\n\n if (type === 'radialBar' && radialValueFormatter) {\n // ApexCharts treats a radialBar series value as a 0–100 percent and\n // renders it verbatim in the ring centre. When the displayed value is\n // NOT a percentage (e.g. a BMI), the consumer scales the series to a\n // percent for the arc and supplies `radialValueFormatter` to print the\n // real value in the centre. Without this, the gauge would read \"56%\"\n // for a BMI of 22.4 — misleading. Default behaviour is untouched.\n const basePlot = (base.plotOptions ?? {}) as NonNullable<\n ApexCharts.ApexOptions['plotOptions']\n >;\n options.plotOptions = {\n ...basePlot,\n radialBar: {\n ...(basePlot.radialBar ?? {}),\n dataLabels: {\n ...(basePlot.radialBar?.dataLabels ?? {}),\n value: {\n ...(basePlot.radialBar?.dataLabels?.value ?? {}),\n formatter: (val: number) => radialValueFormatter(Number(val)),\n },\n },\n },\n };\n }\n\n if (patterns) {\n options.fill = {\n type: 'pattern',\n opacity: type === 'area' ? 0.3 : 1,\n pattern: {\n style: [...PATTERN_STYLES],\n strokeWidth: 2,\n },\n };\n } else if (type === 'area') {\n options.fill = {\n type: 'gradient',\n opacity: 0.3,\n };\n }\n\n return options;\n }, [\n themeOptions,\n chartId,\n toolbar,\n reducedMotion,\n toolbarLocale,\n locale,\n labels,\n numberFormatter,\n t,\n type,\n categories,\n isRtl,\n patterns,\n colors,\n radialValueFormatter,\n ]);\n\n /* ---- resolved dimensions --------------------------------------- */\n const resolvedWidth =\n width ?? (containerWidth > 0 ? containerWidth : '100%');\n const resolvedHeight = height ?? 320;\n\n /* ---- sr-only data table --------------------------------------- */\n const srTable = useMemo(() => {\n const columnLabels = isSliceType(type)\n ? (labels ?? [])\n : (categories ?? []);\n const rows = tableSeries;\n return (\n <table id={summaryId} className=\"ds:sr-only\">\n <caption>{title}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{t('chart.table.series')}</th>\n {columnLabels.map((col, i) => (\n <th key={`${col}-${i}`} scope=\"col\">\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => (\n <tr key={`${row.name}-${rowIndex}`}>\n <th scope=\"row\">{row.name || t('chart.table.value')}</th>\n {row.data.map((value, colIndex) => (\n <td key={`${rowIndex}-${colIndex}`}>\n {/* For a radialBar gauge the series is a synthetic arc\n percent — announce the consumer's display value (e.g.\n the real BMI) instead of the raw fill so AT users get\n the same figure sighted users see in the ring. */}\n {type === 'radialBar' && radialValueFormatter\n ? radialValueFormatter(value)\n : numberFormatter.format(value)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }, [\n type,\n tableSeries,\n labels,\n categories,\n summaryId,\n title,\n t,\n numberFormatter,\n radialValueFormatter,\n ]);\n\n /* ---- ApexCharts `series` prop shape ----------------------------- */\n const apexSeries = useMemo(() => {\n if (isSliceType(type)) {\n return series as number[];\n }\n return series as ChartSeries[];\n }, [series, type]);\n\n return (\n <div\n ref={wrapperRef}\n role=\"img\"\n aria-label={title}\n aria-describedby={summaryId}\n className={chartVariants({\n // Explicit height wins over the density min-height unless the\n // caller also asked for a density explicitly.\n density: density ?? (height !== undefined ? 'none' : undefined),\n className,\n })}\n data-component=\"chart\"\n data-component-id={id}\n >\n {srTable}\n <ReactApexChart\n type={type}\n series={apexSeries as ApexCharts.ApexOptions['series']}\n options={chartOptions}\n width={resolvedWidth}\n height={resolvedHeight}\n aria-hidden=\"true\"\n />\n </div>\n );\n },\n);\n\nChart.displayName = 'Chart';\n\n/* ------------------------------------------------------------------ */\n/* Re-export internal helper for downstream theming (kept narrow). */\n/* ------------------------------------------------------------------ */\n\nexport { chartVariants };\n"],"names":["chartAgent","handle","args","chartVariants","cva","PATTERN_STYLES","CATEGORICAL_TYPES","SLICE_TYPES","isSliceType","type","isCategoricalType","normaliseSeries","series","Chart","forwardRef","title","id","categories","labels","height","width","patterns","colors","toolbar","localeProp","radialValueFormatter","density","className","ref","t","i18n","useTranslation","rawId","useId","chartId","useMemo","summaryId","wrapperRef","useRef","containerWidth","setContainerWidth","useState","useNeutraliseHiddenFocus","locale","themeOptions","setThemeOptions","getApexChartsTheme","useEffect","timer","observer","el","ro","entries","entry","agentHandle","instance","ApexCharts","next","useImperativeHandle","useAgentRegistration","isRtl","tableSeries","numberFormatter","toolbarLocale","reducedMotion","usePrefersReducedMotion","chartOptions","base","options","value","basePlot","_a","_c","_b","val","resolvedWidth","resolvedHeight","srTable","columnLabels","rows","jsx","jsxs","col","i","row","rowIndex","colIndex","apexSeries","ReactApexChart"],"mappings":"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"}