@alfadocs/ui-kit-debug 0.72.2 → 0.75.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 (687) hide show
  1. package/dist/_chunks/actions-cell-renderer-DLrcSTK_.js +1546 -0
  2. package/dist/_chunks/actions-cell-renderer-DLrcSTK_.js.map +1 -0
  3. package/dist/_chunks/{agenda-tray-loL2A3Cx.js → agenda-tray-CVf-jfWU.js} +3 -3
  4. package/dist/_chunks/{agenda-tray-loL2A3Cx.js.map → agenda-tray-CVf-jfWU.js.map} +1 -1
  5. package/dist/_chunks/{ai-consent-banner-Bke9m8VS.js → ai-consent-banner-DUhr1yNj.js} +2 -2
  6. package/dist/_chunks/{ai-consent-banner-Bke9m8VS.js.map → ai-consent-banner-DUhr1yNj.js.map} +1 -1
  7. package/dist/_chunks/{ai-prompt-input-TVI95hJD.js → ai-prompt-input-DziJCGLe.js} +3 -3
  8. package/dist/_chunks/{ai-prompt-input-TVI95hJD.js.map → ai-prompt-input-DziJCGLe.js.map} +1 -1
  9. package/dist/_chunks/{alia-sidebar-BV5lBSFR.js → alia-sidebar-w6B0TEx7.js} +8 -8
  10. package/dist/_chunks/{alia-sidebar-BV5lBSFR.js.map → alia-sidebar-w6B0TEx7.js.map} +1 -1
  11. package/dist/_chunks/{anamnesis-card-CWO4Ui9c.js → anamnesis-card-CJ5MNbkc.js} +2 -2
  12. package/dist/_chunks/{anamnesis-card-CWO4Ui9c.js.map → anamnesis-card-CJ5MNbkc.js.map} +1 -1
  13. package/dist/_chunks/{antenatal-schedule-timeline-CY-VsLok.js → antenatal-schedule-timeline-BzJZqS-8.js} +3 -3
  14. package/dist/_chunks/{antenatal-schedule-timeline-CY-VsLok.js.map → antenatal-schedule-timeline-BzJZqS-8.js.map} +1 -1
  15. package/dist/_chunks/{appointment-card-Cy4FOkGP.js → appointment-card-DgKI5QKD.js} +2 -2
  16. package/dist/_chunks/{appointment-card-Cy4FOkGP.js.map → appointment-card-DgKI5QKD.js.map} +1 -1
  17. package/dist/_chunks/{appointment-timeline-BWAPPk8F.js → appointment-timeline-DQTG0btW.js} +6 -6
  18. package/dist/_chunks/{appointment-timeline-BWAPPk8F.js.map → appointment-timeline-DQTG0btW.js.map} +1 -1
  19. package/dist/_chunks/{appointment-tray-D3mk04TT.js → appointment-tray-ezyCZN8v.js} +4 -4
  20. package/dist/_chunks/{appointment-tray-D3mk04TT.js.map → appointment-tray-ezyCZN8v.js.map} +1 -1
  21. package/dist/_chunks/{ar-BOqyIfoY.js → ar-B1GhtlBP.js} +2 -2
  22. package/dist/_chunks/{ar-BOqyIfoY.js.map → ar-B1GhtlBP.js.map} +1 -1
  23. package/dist/_chunks/{columns-2-8lq4-b8e.js → arrow-up-right-C2v_MKsK.js} +5 -5
  24. package/dist/_chunks/arrow-up-right-C2v_MKsK.js.map +1 -0
  25. package/dist/_chunks/{audio-recorder-BbjG55dP.js → audio-recorder-Cc3KuL9y.js} +4 -4
  26. package/dist/_chunks/{audio-recorder-BbjG55dP.js.map → audio-recorder-Cc3KuL9y.js.map} +1 -1
  27. package/dist/_chunks/{benefit-card-Xnxj4Gmo.js → benefit-card-DB1Kdrmc.js} +4 -2
  28. package/dist/_chunks/benefit-card-DB1Kdrmc.js.map +1 -0
  29. package/dist/_chunks/{bishop-score-C6eoak_j.js → bishop-score-DDW5-gb9.js} +3 -3
  30. package/dist/_chunks/{bishop-score-C6eoak_j.js.map → bishop-score-DDW5-gb9.js.map} +1 -1
  31. package/dist/_chunks/{bmi-calculator-BmQfoEGP.js → bmi-calculator-Bk2GAju7.js} +2 -2
  32. package/dist/_chunks/{bmi-calculator-BmQfoEGP.js.map → bmi-calculator-Bk2GAju7.js.map} +1 -1
  33. package/dist/_chunks/{booking-B62CMY5k.js → booking-B1Qkcl3c.js} +9 -9
  34. package/dist/_chunks/{booking-B62CMY5k.js.map → booking-B1Qkcl3c.js.map} +1 -1
  35. package/dist/_chunks/{button-DD_0Xdmr.js → button-CPGiR_bH.js} +56 -35
  36. package/dist/_chunks/button-CPGiR_bH.js.map +1 -0
  37. package/dist/_chunks/button-group-DzV5wgnx.js +289 -0
  38. package/dist/_chunks/button-group-DzV5wgnx.js.map +1 -0
  39. package/dist/_chunks/camera-VSklPDCv.js +21 -0
  40. package/dist/_chunks/camera-VSklPDCv.js.map +1 -0
  41. package/dist/_chunks/{care-plan-card-DhXbfGzE.js → care-plan-card-BrwhyIJI.js} +3 -3
  42. package/dist/_chunks/{care-plan-card-DhXbfGzE.js.map → care-plan-card-BrwhyIJI.js.map} +1 -1
  43. package/dist/_chunks/{care-plan-entry-card-D3YGD6rj.js → care-plan-entry-card-DWEdCQM3.js} +3 -3
  44. package/dist/_chunks/{care-plan-entry-card-D3YGD6rj.js.map → care-plan-entry-card-DWEdCQM3.js.map} +1 -1
  45. package/dist/_chunks/{care-plan-header-DtQxyfOb.js → care-plan-header-BXvRpGG8.js} +2 -2
  46. package/dist/_chunks/{care-plan-header-DtQxyfOb.js.map → care-plan-header-BXvRpGG8.js.map} +1 -1
  47. package/dist/_chunks/{carousel.agent-j7hWxJWr.js → carousel.agent-CtAAdsAd.js} +2 -2
  48. package/dist/_chunks/{carousel.agent-j7hWxJWr.js.map → carousel.agent-CtAAdsAd.js.map} +1 -1
  49. package/dist/_chunks/{chat-container-BVCoN06N.js → chat-container-HlFnoEIl.js} +4 -2
  50. package/dist/_chunks/{chat-container-BVCoN06N.js.map → chat-container-HlFnoEIl.js.map} +1 -1
  51. package/dist/_chunks/{chat-input-Btq_uuMZ.js → chat-input-BTCDqUDX.js} +2 -2
  52. package/dist/_chunks/{chat-input-Btq_uuMZ.js.map → chat-input-BTCDqUDX.js.map} +1 -1
  53. package/dist/_chunks/{chat-message-DXjjM8z9.js → chat-message-CdjWqZjo.js} +3 -3
  54. package/dist/_chunks/{chat-message-DXjjM8z9.js.map → chat-message-CdjWqZjo.js.map} +1 -1
  55. package/dist/_chunks/{code-block-Cwi7e3HM.js → code-block-BwanBjRh.js} +2 -2
  56. package/dist/_chunks/{code-block-Cwi7e3HM.js.map → code-block-BwanBjRh.js.map} +1 -1
  57. package/dist/_chunks/{connection-status-0HajXMXM.js → connection-status-oEUyrvev.js} +3 -3
  58. package/dist/_chunks/{connection-status-0HajXMXM.js.map → connection-status-oEUyrvev.js.map} +1 -1
  59. package/dist/_chunks/{contact-profile-card-IggiUVpN.js → contact-profile-card-veMV3W4J.js} +2 -2
  60. package/dist/_chunks/{contact-profile-card-IggiUVpN.js.map → contact-profile-card-veMV3W4J.js.map} +1 -1
  61. package/dist/_chunks/{control-room-rail-DaGcsdZ6.js → control-room-rail-CdfrZ6Vr.js} +3 -3
  62. package/dist/_chunks/{control-room-rail-DaGcsdZ6.js.map → control-room-rail-CdfrZ6Vr.js.map} +1 -1
  63. package/dist/_chunks/{copy-field-PAp0-Wr5.js → copy-field-DBc9QquW.js} +2 -2
  64. package/dist/_chunks/{copy-field-PAp0-Wr5.js.map → copy-field-DBc9QquW.js.map} +1 -1
  65. package/dist/_chunks/{cycle-calculator-BNILyVas.js → cycle-calculator-OQp8Ik5U.js} +4 -4
  66. package/dist/_chunks/{cycle-calculator-BNILyVas.js.map → cycle-calculator-OQp8Ik5U.js.map} +1 -1
  67. package/dist/_chunks/data-table-tabs-BEUXiRlu.js +710 -0
  68. package/dist/_chunks/data-table-tabs-BEUXiRlu.js.map +1 -0
  69. package/dist/_chunks/{date-picker-CVkD_lOi.js → date-picker-DzQS8mvt.js} +2 -2
  70. package/dist/_chunks/{date-picker-CVkD_lOi.js.map → date-picker-DzQS8mvt.js.map} +1 -1
  71. package/dist/_chunks/{date-picker-variants-DLg-ZrIo.js → date-picker-variants-CYQAm1Gk.js} +116 -115
  72. package/dist/_chunks/{date-picker-variants-DLg-ZrIo.js.map → date-picker-variants-CYQAm1Gk.js.map} +1 -1
  73. package/dist/_chunks/{date-range-picker-Dw12DgV8.js → date-range-picker-Cbz1SKhm.js} +3 -3
  74. package/dist/_chunks/{date-range-picker-Dw12DgV8.js.map → date-range-picker-Cbz1SKhm.js.map} +1 -1
  75. package/dist/_chunks/{date-time-picker-Cd_OJtOy.js → date-time-picker-B5IpU-nd.js} +2 -2
  76. package/dist/_chunks/{date-time-picker-Cd_OJtOy.js.map → date-time-picker-B5IpU-nd.js.map} +1 -1
  77. package/dist/_chunks/{de-DFLsUxeV.js → de-DETDHQ0o.js} +2 -2
  78. package/dist/_chunks/{de-DFLsUxeV.js.map → de-DETDHQ0o.js.map} +1 -1
  79. package/dist/_chunks/{description-list-CmBVxIF5.js → description-list-ClNLdRMy.js} +2 -2
  80. package/dist/_chunks/{description-list-CmBVxIF5.js.map → description-list-ClNLdRMy.js.map} +1 -1
  81. package/dist/_chunks/document-preview-CGSM_au9.js +181 -0
  82. package/dist/_chunks/document-preview-CGSM_au9.js.map +1 -0
  83. package/dist/_chunks/{document-scanner-B23j4w7X.js → document-scanner-B6h1Ir56.js} +198 -230
  84. package/dist/_chunks/document-scanner-B6h1Ir56.js.map +1 -0
  85. package/dist/_chunks/{due-date-calculator-CmdAl_JO.js → due-date-calculator-DASNRgnH.js} +4 -4
  86. package/dist/_chunks/{due-date-calculator-CmdAl_JO.js.map → due-date-calculator-DASNRgnH.js.map} +1 -1
  87. package/dist/_chunks/{editable-currency-cell-renderer-z9fJFw6Z.js → editable-currency-cell-renderer-GwfA9tTR.js} +3 -3
  88. package/dist/_chunks/{editable-currency-cell-renderer-z9fJFw6Z.js.map → editable-currency-cell-renderer-GwfA9tTR.js.map} +1 -1
  89. package/dist/_chunks/{editor-overlay-BIOzr8v7.js → editor-overlay-DE3esyio.js} +2 -2
  90. package/dist/_chunks/{editor-overlay-BIOzr8v7.js.map → editor-overlay-DE3esyio.js.map} +1 -1
  91. package/dist/_chunks/{el-OVjBKytp.js → el-HV3jOI0z.js} +2 -2
  92. package/dist/_chunks/{el-OVjBKytp.js.map → el-HV3jOI0z.js.map} +1 -1
  93. package/dist/_chunks/{empty-state-BLy7tigq.js → empty-state-CrLsi0XI.js} +2 -2
  94. package/dist/_chunks/{empty-state-BLy7tigq.js.map → empty-state-CrLsi0XI.js.map} +1 -1
  95. package/dist/_chunks/{entity-summary-DpGziDv5.js → entity-summary--vP698Jn.js} +3 -3
  96. package/dist/_chunks/{entity-summary-DpGziDv5.js.map → entity-summary--vP698Jn.js.map} +1 -1
  97. package/dist/_chunks/eraser-CHOGQfVv.js +21 -0
  98. package/dist/_chunks/eraser-CHOGQfVv.js.map +1 -0
  99. package/dist/_chunks/{es-DKDNrHXG.js → es-Dpo7Olwo.js} +2 -2
  100. package/dist/_chunks/{es-DKDNrHXG.js.map → es-Dpo7Olwo.js.map} +1 -1
  101. package/dist/_chunks/face-scheme-C0rk21gg.js +3146 -0
  102. package/dist/_chunks/face-scheme-C0rk21gg.js.map +1 -0
  103. package/dist/_chunks/{fetal-weight-CVAH8sJ3.js → fetal-weight-1F9N4IMx.js} +2 -2
  104. package/dist/_chunks/{fetal-weight-CVAH8sJ3.js.map → fetal-weight-1F9N4IMx.js.map} +1 -1
  105. package/dist/_chunks/{field-array-CDzc3hTM.js → field-array-DH3Mb1i8.js} +3 -3
  106. package/dist/_chunks/{field-array-CDzc3hTM.js.map → field-array-DH3Mb1i8.js.map} +1 -1
  107. package/dist/_chunks/{field-value-Dj3i52H2.js → field-value-DHG6gEKS.js} +5 -5
  108. package/dist/_chunks/{field-value-Dj3i52H2.js.map → field-value-DHG6gEKS.js.map} +1 -1
  109. package/dist/_chunks/file-Cwe9VC1A.js +40 -0
  110. package/dist/_chunks/file-Cwe9VC1A.js.map +1 -0
  111. package/dist/_chunks/file-manager-UF8dkQF1.js +1776 -0
  112. package/dist/_chunks/file-manager-UF8dkQF1.js.map +1 -0
  113. package/dist/_chunks/{file-upload-Kw1rdvFw.js → file-upload-DENvuhfs.js} +101 -139
  114. package/dist/_chunks/file-upload-DENvuhfs.js.map +1 -0
  115. package/dist/_chunks/{finished-terminal-Di4gtZ50.js → finished-terminal-C0_mefrf.js} +11 -11
  116. package/dist/_chunks/finished-terminal-C0_mefrf.js.map +1 -0
  117. package/dist/_chunks/{fiscal-code-input-DKNXFXs3.js → fiscal-code-input-DWA6C8x8.js} +2 -2
  118. package/dist/_chunks/{fiscal-code-input-DKNXFXs3.js.map → fiscal-code-input-DWA6C8x8.js.map} +1 -1
  119. package/dist/_chunks/{fr-BfMvQh-v.js → fr-CgD4Jvtq.js} +2 -2
  120. package/dist/_chunks/{fr-BfMvQh-v.js.map → fr-CgD4Jvtq.js.map} +1 -1
  121. package/dist/_chunks/{freemium-paywall-DFoeedwh.js → freemium-paywall-CmV642PA.js} +7 -3
  122. package/dist/_chunks/freemium-paywall-CmV642PA.js.map +1 -0
  123. package/dist/_chunks/{gestational-age-calculator-BwCBPAGX.js → gestational-age-calculator-BpYw-WF-.js} +7 -7
  124. package/dist/_chunks/{gestational-age-calculator-BwCBPAGX.js.map → gestational-age-calculator-BpYw-WF-.js.map} +1 -1
  125. package/dist/_chunks/{hcg-doubling-CSsWxEJc.js → hcg-doubling-Dqj-EqMT.js} +3 -3
  126. package/dist/_chunks/{hcg-doubling-CSsWxEJc.js.map → hcg-doubling-Dqj-EqMT.js.map} +1 -1
  127. package/dist/_chunks/{header-DaXWDw0M.js → header-CjwasYnn.js} +88 -79
  128. package/dist/_chunks/header-CjwasYnn.js.map +1 -0
  129. package/dist/_chunks/{header-settings-B0G_u-wV.js → header-settings-4cwQzeFc.js} +4 -4
  130. package/dist/_chunks/{header-settings-B0G_u-wV.js.map → header-settings-4cwQzeFc.js.map} +1 -1
  131. package/dist/_chunks/{hi-C0GEMwlD.js → hi-Bf8CAP6b.js} +2 -2
  132. package/dist/_chunks/{hi-C0GEMwlD.js.map → hi-Bf8CAP6b.js.map} +1 -1
  133. package/dist/_chunks/highlighter-DSkckT2Q.js +15 -0
  134. package/dist/_chunks/highlighter-DSkckT2Q.js.map +1 -0
  135. package/dist/_chunks/{icon-button-LqoiKcUN.js → icon-button-C_kbcd7I.js} +2 -2
  136. package/dist/_chunks/{icon-button-LqoiKcUN.js.map → icon-button-C_kbcd7I.js.map} +1 -1
  137. package/dist/_chunks/icon-button-group-C_lqXTAj.js +391 -0
  138. package/dist/_chunks/icon-button-group-C_lqXTAj.js.map +1 -0
  139. package/dist/_chunks/{icon-picker-Di6uYDG-.js → icon-picker-CM9ubkew.js} +3 -3
  140. package/dist/_chunks/{icon-picker-Di6uYDG-.js.map → icon-picker-CM9ubkew.js.map} +1 -1
  141. package/dist/_chunks/{image-cropper-CdmWFrMC.js → image-cropper-DKe4AORY.js} +2 -2
  142. package/dist/_chunks/{image-cropper-CdmWFrMC.js.map → image-cropper-DKe4AORY.js.map} +1 -1
  143. package/dist/_chunks/{insert-result-C7xSDb8q.js → insert-result-D074GtHX.js} +58 -68
  144. package/dist/_chunks/insert-result-D074GtHX.js.map +1 -0
  145. package/dist/_chunks/{isSameWeek-HddDAyJG.js → isSameWeek-BYl5poz_.js} +2 -2
  146. package/dist/_chunks/{isSameWeek-HddDAyJG.js.map → isSameWeek-BYl5poz_.js.map} +1 -1
  147. package/dist/_chunks/{it-5f4hiT2e.js → it-mt1V2DFS.js} +3 -3
  148. package/dist/_chunks/{it-5f4hiT2e.js.map → it-mt1V2DFS.js.map} +1 -1
  149. package/dist/_chunks/{ja-U0_2inl_.js → ja-CbOHn2TO.js} +2 -2
  150. package/dist/_chunks/{ja-U0_2inl_.js.map → ja-CbOHn2TO.js.map} +1 -1
  151. package/dist/_chunks/{key-value-pair-Byyyc_9J.js → key-value-pair-LHKfDT_9.js} +2 -2
  152. package/dist/_chunks/{key-value-pair-Byyyc_9J.js.map → key-value-pair-LHKfDT_9.js.map} +1 -1
  153. package/dist/_chunks/link-cell-renderer-BQGUs45d.js +711 -0
  154. package/dist/_chunks/link-cell-renderer-BQGUs45d.js.map +1 -0
  155. package/dist/_chunks/{locale-picker-DzF7Q5Y8.js → locale-picker-GNF3lo8K.js} +3 -3
  156. package/dist/_chunks/{locale-picker-DzF7Q5Y8.js.map → locale-picker-GNF3lo8K.js.map} +1 -1
  157. package/dist/_chunks/{map-view-ByPvWG_9.js → map-view-CsaHfoo6.js} +2 -2
  158. package/dist/_chunks/{map-view-ByPvWG_9.js.map → map-view-CsaHfoo6.js.map} +1 -1
  159. package/dist/_chunks/{marketplace-app-shell-BCYiOvKZ.js → marketplace-app-shell-D_1tF4La.js} +6 -6
  160. package/dist/_chunks/marketplace-app-shell-D_1tF4La.js.map +1 -0
  161. package/dist/_chunks/{message-card-BZnnffyB.js → message-card-ievotOFa.js} +3 -3
  162. package/dist/_chunks/{message-card-BZnnffyB.js.map → message-card-ievotOFa.js.map} +1 -1
  163. package/dist/_chunks/{message-tray-cUHOCdU0.js → message-tray-BFlu8clI.js} +4 -4
  164. package/dist/_chunks/{message-tray-cUHOCdU0.js.map → message-tray-BFlu8clI.js.map} +1 -1
  165. package/dist/_chunks/{muscle-scheme-B9MIkuj0.js → muscle-scheme-CFBE2dme.js} +6 -14
  166. package/dist/_chunks/{muscle-scheme-B9MIkuj0.js.map → muscle-scheme-CFBE2dme.js.map} +1 -1
  167. package/dist/_chunks/{nl-CDVnnx1U.js → nl-C6Y0QXnm.js} +2 -2
  168. package/dist/_chunks/{nl-CDVnnx1U.js.map → nl-C6Y0QXnm.js.map} +1 -1
  169. package/dist/_chunks/{notes-panel-CMyjUXD4.js → notes-panel-Cvdp818a.js} +3 -3
  170. package/dist/_chunks/{notes-panel-CMyjUXD4.js.map → notes-panel-Cvdp818a.js.map} +1 -1
  171. package/dist/_chunks/{notification-card-BHJ07FkH.js → notification-card-D29_sVA1.js} +3 -3
  172. package/dist/_chunks/{notification-card-BHJ07FkH.js.map → notification-card-D29_sVA1.js.map} +1 -1
  173. package/dist/_chunks/{notification-tray-Dzm1c3Wy.js → notification-tray-CzIzz3bX.js} +4 -4
  174. package/dist/_chunks/{notification-tray-Dzm1c3Wy.js.map → notification-tray-CzIzz3bX.js.map} +1 -1
  175. package/dist/_chunks/optical-prescription-BEjYQjiO.js +1260 -0
  176. package/dist/_chunks/optical-prescription-BEjYQjiO.js.map +1 -0
  177. package/dist/_chunks/{patient-details-pU_E5xM2.js → patient-details-DP4wKyq4.js} +7 -7
  178. package/dist/_chunks/{patient-details-pU_E5xM2.js.map → patient-details-DP4wKyq4.js.map} +1 -1
  179. package/dist/_chunks/{patient-search-X9SUZGpy.js → patient-search-BaUJ_Y-N.js} +47 -45
  180. package/dist/_chunks/patient-search-BaUJ_Y-N.js.map +1 -0
  181. package/dist/_chunks/{patient-summary-card--t3BjTdU.js → patient-summary-card-D6kgdTNn.js} +4 -4
  182. package/dist/_chunks/{patient-summary-card--t3BjTdU.js.map → patient-summary-card-D6kgdTNn.js.map} +1 -1
  183. package/dist/_chunks/{patient-table-BgWgNIMf.js → patient-table-DweKjiXg.js} +122 -118
  184. package/dist/_chunks/patient-table-DweKjiXg.js.map +1 -0
  185. package/dist/_chunks/{payment-request-card-2ts7ITxd.js → payment-request-card-C0fqlKqO.js} +25 -24
  186. package/dist/_chunks/{payment-request-card-2ts7ITxd.js.map → payment-request-card-C0fqlKqO.js.map} +1 -1
  187. package/dist/_chunks/pen-line-D0De5zdl.js +21 -0
  188. package/dist/_chunks/pen-line-D0De5zdl.js.map +1 -0
  189. package/dist/_chunks/periodontal-chart-D8hOFmde.js +1173 -0
  190. package/dist/_chunks/periodontal-chart-D8hOFmde.js.map +1 -0
  191. package/dist/_chunks/{periodontal-chart-card-6c6Lt4ws.js → periodontal-chart-card-WVjJAheq.js} +2 -2
  192. package/dist/_chunks/{periodontal-chart-card-6c6Lt4ws.js.map → periodontal-chart-card-WVjJAheq.js.map} +1 -1
  193. package/dist/_chunks/periodontal-diagnosis-cco40xTa.js +345 -0
  194. package/dist/_chunks/periodontal-diagnosis-cco40xTa.js.map +1 -0
  195. package/dist/_chunks/periodontal-risk-chart-bUGkMwDg.js +334 -0
  196. package/dist/_chunks/periodontal-risk-chart-bUGkMwDg.js.map +1 -0
  197. package/dist/_chunks/{pl-BWNumNrg.js → pl-BdazJAOp.js} +3 -3
  198. package/dist/_chunks/{pl-BWNumNrg.js.map → pl-BdazJAOp.js.map} +1 -1
  199. package/dist/_chunks/{popover-uJ6BvEU3.js → popover-Cc0a69sw.js} +32 -29
  200. package/dist/_chunks/{popover-uJ6BvEU3.js.map → popover-Cc0a69sw.js.map} +1 -1
  201. package/dist/_chunks/{practice-results-CSEHTH2V.js → practice-results-BCr7jMt1.js} +5 -5
  202. package/dist/_chunks/{practice-results-CSEHTH2V.js.map → practice-results-BCr7jMt1.js.map} +1 -1
  203. package/dist/_chunks/{pregnancy-dating-CxVAA6_4.js → pregnancy-dating-msMl_6wz.js} +7 -7
  204. package/dist/_chunks/{pregnancy-dating-CxVAA6_4.js.map → pregnancy-dating-msMl_6wz.js.map} +1 -1
  205. package/dist/_chunks/{pregnancy-weight-gain-C7zyrwow.js → pregnancy-weight-gain-B-CkVYnU.js} +2 -2
  206. package/dist/_chunks/{pregnancy-weight-gain-C7zyrwow.js.map → pregnancy-weight-gain-B-CkVYnU.js.map} +1 -1
  207. package/dist/_chunks/{privacy-lock-DrRmK8C7.js → privacy-lock-YYBiI_bY.js} +3 -3
  208. package/dist/_chunks/{privacy-lock-DrRmK8C7.js.map → privacy-lock-YYBiI_bY.js.map} +1 -1
  209. package/dist/_chunks/{product-hub-panel-CaZqttvm.js → product-hub-panel-CTld1r5V.js} +3 -3
  210. package/dist/_chunks/{product-hub-panel-CaZqttvm.js.map → product-hub-panel-CTld1r5V.js.map} +1 -1
  211. package/dist/_chunks/{pt-zqdQuryr.js → pt-B3UKvhHp.js} +2 -2
  212. package/dist/_chunks/{pt-zqdQuryr.js.map → pt-B3UKvhHp.js.map} +1 -1
  213. package/dist/_chunks/{public-header.agent-C-opZaOw.js → public-header.agent-rX_VA6hd.js} +107 -103
  214. package/dist/_chunks/public-header.agent-rX_VA6hd.js.map +1 -0
  215. package/dist/_chunks/{radiograph-panel.agent-D1x33moc.js → radiograph-panel.agent-CxF9pVxd.js} +40 -57
  216. package/dist/_chunks/radiograph-panel.agent-CxF9pVxd.js.map +1 -0
  217. package/dist/_chunks/{reviews-panel-liUj6OPX.js → reviews-panel-DmOjvmyH.js} +4 -4
  218. package/dist/_chunks/{reviews-panel-liUj6OPX.js.map → reviews-panel-DmOjvmyH.js.map} +1 -1
  219. package/dist/_chunks/{rich-text-editor-DUgznqOf.js → rich-text-editor-CCWjNkbx.js} +26 -26
  220. package/dist/_chunks/rich-text-editor-CCWjNkbx.js.map +1 -0
  221. package/dist/_chunks/{ro-CornQr64.js → ro-DVTEQpPK.js} +2 -2
  222. package/dist/_chunks/{ro-CornQr64.js.map → ro-DVTEQpPK.js.map} +1 -1
  223. package/dist/_chunks/{ru-CKAXNYVD.js → ru-C-Mp40SC.js} +3 -3
  224. package/dist/_chunks/{ru-CKAXNYVD.js.map → ru-C-Mp40SC.js.map} +1 -1
  225. package/dist/_chunks/{select-BmCbJMJS.js → select-BW5ecXlX.js} +13 -13
  226. package/dist/_chunks/{select-BmCbJMJS.js.map → select-BW5ecXlX.js.map} +1 -1
  227. package/dist/_chunks/{session-countdown-qr8EO5QY.js → session-countdown-C8AsE072.js} +2 -2
  228. package/dist/_chunks/{session-countdown-qr8EO5QY.js.map → session-countdown-C8AsE072.js.map} +1 -1
  229. package/dist/_chunks/{sheet-B_X54aZo.js → sheet-D5K0LB3q.js} +2 -2
  230. package/dist/_chunks/{sheet-B_X54aZo.js.map → sheet-D5K0LB3q.js.map} +1 -1
  231. package/dist/_chunks/{sidebar-B0OBmJrC.js → sidebar-C0PbwJBc.js} +375 -335
  232. package/dist/_chunks/sidebar-C0PbwJBc.js.map +1 -0
  233. package/dist/_chunks/{sign-document-nK03S73h.js → sign-document-Bfk0WpWV.js} +2 -2
  234. package/dist/_chunks/{sign-document-nK03S73h.js.map → sign-document-Bfk0WpWV.js.map} +1 -1
  235. package/dist/_chunks/{sign-in-with-alfadocs-button-LppxjlFt.js → sign-in-with-alfadocs-button-UlYefZpI.js} +2 -2
  236. package/dist/_chunks/{sign-in-with-alfadocs-button-LppxjlFt.js.map → sign-in-with-alfadocs-button-UlYefZpI.js.map} +1 -1
  237. package/dist/_chunks/{signature-capture-Ct_4Md4e.js → signature-capture-DN52VNKL.js} +206 -189
  238. package/dist/_chunks/signature-capture-DN52VNKL.js.map +1 -0
  239. package/dist/_chunks/{signature-field-jgwYgUhO.js → signature-field-0rFODJlW.js} +47 -41
  240. package/dist/_chunks/signature-field-0rFODJlW.js.map +1 -0
  241. package/dist/_chunks/signature-request-C-mskXwi.js +318 -0
  242. package/dist/_chunks/signature-request-C-mskXwi.js.map +1 -0
  243. package/dist/_chunks/{slot-grid-FsqumOaS.js → slot-grid-CQSULZjd.js} +4 -4
  244. package/dist/_chunks/{slot-grid-FsqumOaS.js.map → slot-grid-CQSULZjd.js.map} +1 -1
  245. package/dist/_chunks/{sq-CIIvqXZv.js → sq-DierVlw-.js} +2 -2
  246. package/dist/_chunks/{sq-CIIvqXZv.js.map → sq-DierVlw-.js.map} +1 -1
  247. package/dist/_chunks/{streaming-text-Cedc05ya.js → streaming-text-C5bYz7LL.js} +2 -2
  248. package/dist/_chunks/{streaming-text-Cedc05ya.js.map → streaming-text-C5bYz7LL.js.map} +1 -1
  249. package/dist/_chunks/subDays-DIKRViZm.js +8 -0
  250. package/dist/_chunks/{subDays-DGSOp9d9.js.map → subDays-DIKRViZm.js.map} +1 -1
  251. package/dist/_chunks/{sv-Kpk1pzjz.js → sv-gQWo_19z.js} +2 -2
  252. package/dist/_chunks/{sv-Kpk1pzjz.js.map → sv-gQWo_19z.js.map} +1 -1
  253. package/dist/_chunks/{tabs-DVQ941Sj.js → tabs-CVTukWRD.js} +2 -2
  254. package/dist/_chunks/{tabs-DVQ941Sj.js.map → tabs-CVTukWRD.js.map} +1 -1
  255. package/dist/_chunks/{task-tray-DP5A3Qnc.js → task-tray-Br3vc0O1.js} +3 -3
  256. package/dist/_chunks/{task-tray-DP5A3Qnc.js.map → task-tray-Br3vc0O1.js.map} +1 -1
  257. package/dist/_chunks/{tasks-panel-BuxaYtEF.js → tasks-panel-CjGAhIN8.js} +6 -6
  258. package/dist/_chunks/{tasks-panel-BuxaYtEF.js.map → tasks-panel-CjGAhIN8.js.map} +1 -1
  259. package/dist/_chunks/{theme-toggle-dtdy5EaL.js → theme-toggle-BJCz_UOi.js} +3 -3
  260. package/dist/_chunks/{theme-toggle-dtdy5EaL.js.map → theme-toggle-BJCz_UOi.js.map} +1 -1
  261. package/dist/_chunks/{toast.agent-BSxl057x.js → toast.agent-uV8CeAy6.js} +2 -2
  262. package/dist/_chunks/{toast.agent-BSxl057x.js.map → toast.agent-uV8CeAy6.js.map} +1 -1
  263. package/dist/_chunks/{token-insert-menu-Pok4nExI.js → token-insert-menu-BYv6yoZI.js} +2 -2
  264. package/dist/_chunks/{token-insert-menu-Pok4nExI.js.map → token-insert-menu-BYv6yoZI.js.map} +1 -1
  265. package/dist/_chunks/{tool-rail-BZx0-yIr.js → tool-rail-AaTqxkIM.js} +2 -2
  266. package/dist/_chunks/{tool-rail-BZx0-yIr.js.map → tool-rail-AaTqxkIM.js.map} +1 -1
  267. package/dist/_chunks/tooth-data-BwuoKFf4.js +660 -0
  268. package/dist/_chunks/tooth-data-BwuoKFf4.js.map +1 -0
  269. package/dist/_chunks/tooth-scheme-BzJ6rcte.js +1483 -0
  270. package/dist/_chunks/tooth-scheme-BzJ6rcte.js.map +1 -0
  271. package/dist/_chunks/{tr-DHaeLFxG.js → tr-Btm6M3Km.js} +2 -2
  272. package/dist/_chunks/{tr-DHaeLFxG.js.map → tr-Btm6M3Km.js.map} +1 -1
  273. package/dist/_chunks/{transaction-chip-B6iWoVmU.js → transaction-chip-DJCstquX.js} +41 -51
  274. package/dist/_chunks/transaction-chip-DJCstquX.js.map +1 -0
  275. package/dist/_chunks/type-ggmfVs23.js +16 -0
  276. package/dist/_chunks/type-ggmfVs23.js.map +1 -0
  277. package/dist/_chunks/{unit-converter-fEqluT8b.js → unit-converter-CSLWFDQh.js} +3 -3
  278. package/dist/_chunks/{unit-converter-fEqluT8b.js.map → unit-converter-CSLWFDQh.js.map} +1 -1
  279. package/dist/_chunks/upload-BfT2hzMg.js +16 -0
  280. package/dist/_chunks/upload-BfT2hzMg.js.map +1 -0
  281. package/dist/_chunks/use-priority-overflow-c9SjxZkZ.js +101 -0
  282. package/dist/_chunks/use-priority-overflow-c9SjxZkZ.js.map +1 -0
  283. package/dist/_chunks/use-visual-viewport-pin-ChurOsHM.js +31 -0
  284. package/dist/_chunks/use-visual-viewport-pin-ChurOsHM.js.map +1 -0
  285. package/dist/_chunks/{warning-stack-BaMI7-n7.js → warning-stack-BlG_Ujy3.js} +3 -3
  286. package/dist/_chunks/{warning-stack-BaMI7-n7.js.map → warning-stack-BlG_Ujy3.js.map} +1 -1
  287. package/dist/_chunks/{workflow-map-qWsgCldq.js → workflow-map-C643Q43h.js} +5 -5
  288. package/dist/_chunks/{workflow-map-qWsgCldq.js.map → workflow-map-C643Q43h.js.map} +1 -1
  289. package/dist/_chunks/{zh-CN-BncsTBwM.js → zh-CN-DkVN4vsB.js} +3 -3
  290. package/dist/_chunks/{zh-CN-BncsTBwM.js.map → zh-CN-DkVN4vsB.js.map} +1 -1
  291. package/dist/agent-catalog.json +4081 -3201
  292. package/dist/agent-i18n/en.json +121 -69
  293. package/dist/brand/product-lockup/product-lockup.d.ts +1 -1
  294. package/dist/components/_shared/calendar-class-names.d.ts.map +1 -1
  295. package/dist/components/_shared/entity-card/entity-card.d.ts +1 -1
  296. package/dist/components/agenda-tray/index.js +1 -1
  297. package/dist/components/ai-consent-banner/index.js +1 -1
  298. package/dist/components/ai-prompt-input/index.js +1 -1
  299. package/dist/components/anamnesis-card/anamnesis-card.d.ts +1 -1
  300. package/dist/components/anamnesis-card/index.js +1 -1
  301. package/dist/components/appointment-card/appointment-card.d.ts +1 -1
  302. package/dist/components/appointment-card/index.js +2 -2
  303. package/dist/components/appointment-timeline/index.js +1 -1
  304. package/dist/components/audio-recorder/index.js +1 -1
  305. package/dist/components/benefit-card/benefit-card.d.ts.map +1 -1
  306. package/dist/components/benefit-card/index.js +1 -1
  307. package/dist/components/bishop-score/index.js +1 -1
  308. package/dist/components/bmi-calculator/index.js +1 -1
  309. package/dist/components/booking/index.js +1 -1
  310. package/dist/components/button/button.d.ts +8 -1
  311. package/dist/components/button/button.d.ts.map +1 -1
  312. package/dist/components/button/index.js +2 -2
  313. package/dist/components/button-group/button-group.d.ts +16 -0
  314. package/dist/components/button-group/button-group.d.ts.map +1 -1
  315. package/dist/components/button-group/index.js +1 -1
  316. package/dist/components/card/card.d.ts +1 -1
  317. package/dist/components/care-plan-card/index.js +1 -1
  318. package/dist/components/care-plan-entry-card/index.js +1 -1
  319. package/dist/components/care-plan-header/index.js +1 -1
  320. package/dist/components/carousel/index.js +1 -1
  321. package/dist/components/chat-container/chat-container.d.ts.map +1 -1
  322. package/dist/components/chat-container/index.js +1 -1
  323. package/dist/components/chat-input/index.js +1 -1
  324. package/dist/components/chat-message/index.js +1 -1
  325. package/dist/components/clinical-note-card/clinical-note-card.d.ts +1 -1
  326. package/dist/components/connection-status/index.js +1 -1
  327. package/dist/components/contact-profile-card/contact-profile-card.d.ts +1 -1
  328. package/dist/components/contact-profile-card/index.js +1 -1
  329. package/dist/components/control-room-rail/index.js +1 -1
  330. package/dist/components/copy-field/index.js +1 -1
  331. package/dist/components/counter/counter.d.ts +1 -1
  332. package/dist/components/cycle-calculator/index.js +1 -1
  333. package/dist/components/data-table/data-table.d.ts +2 -8
  334. package/dist/components/data-table/data-table.d.ts.map +1 -1
  335. package/dist/components/data-table/filters/number-filter.d.ts.map +1 -1
  336. package/dist/components/data-table/index.js +35 -34
  337. package/dist/components/data-table/index.js.map +1 -1
  338. package/dist/components/data-table/toolbar.d.ts +5 -11
  339. package/dist/components/data-table/toolbar.d.ts.map +1 -1
  340. package/dist/components/data-table-tabs/data-table-tabs.agent.d.ts +4 -0
  341. package/dist/components/data-table-tabs/data-table-tabs.agent.d.ts.map +1 -0
  342. package/dist/components/data-table-tabs/data-table-tabs.d.ts +93 -0
  343. package/dist/components/data-table-tabs/data-table-tabs.d.ts.map +1 -0
  344. package/dist/components/data-table-tabs/index.d.ts +5 -0
  345. package/dist/components/data-table-tabs/index.d.ts.map +1 -0
  346. package/dist/components/data-table-tabs/index.js +8 -0
  347. package/dist/components/data-table-tabs/use-data-table-filter-tabs.d.ts +63 -0
  348. package/dist/components/data-table-tabs/use-data-table-filter-tabs.d.ts.map +1 -0
  349. package/dist/components/date-picker/index.js +1 -1
  350. package/dist/components/date-range-picker/index.js +1 -1
  351. package/dist/components/date-time-picker/index.js +1 -1
  352. package/dist/components/description-list/index.js +1 -1
  353. package/dist/components/document-preview/document-preview.agent.d.ts +4 -0
  354. package/dist/components/document-preview/document-preview.agent.d.ts.map +1 -0
  355. package/dist/components/document-preview/document-preview.d.ts +41 -0
  356. package/dist/components/document-preview/document-preview.d.ts.map +1 -0
  357. package/dist/components/document-preview/index.d.ts +4 -0
  358. package/dist/components/document-preview/index.d.ts.map +1 -0
  359. package/dist/components/document-preview/index.js +6 -0
  360. package/dist/components/document-preview/index.js.map +1 -0
  361. package/dist/components/document-scanner/document-scanner.d.ts.map +1 -1
  362. package/dist/components/document-scanner/index.js +1 -1
  363. package/dist/components/due-date-calculator/index.js +2 -2
  364. package/dist/components/editor-overlay/index.js +1 -1
  365. package/dist/components/empty-state/index.js +1 -1
  366. package/dist/components/entity-summary/index.js +1 -1
  367. package/dist/components/face-scheme/face-scheme-data.d.ts +167 -0
  368. package/dist/components/face-scheme/face-scheme-data.d.ts.map +1 -1
  369. package/dist/components/face-scheme/face-scheme.agent.d.ts.map +1 -1
  370. package/dist/components/face-scheme/face-scheme.d.ts +112 -2
  371. package/dist/components/face-scheme/face-scheme.d.ts.map +1 -1
  372. package/dist/components/face-scheme/index.d.ts +2 -2
  373. package/dist/components/face-scheme/index.d.ts.map +1 -1
  374. package/dist/components/face-scheme/index.js +25 -14
  375. package/dist/components/fetal-weight/index.js +1 -1
  376. package/dist/components/field-array/index.js +1 -1
  377. package/dist/components/file-manager/dialogs.d.ts +48 -0
  378. package/dist/components/file-manager/dialogs.d.ts.map +1 -0
  379. package/dist/components/file-manager/file-manager.agent.d.ts +4 -0
  380. package/dist/components/file-manager/file-manager.agent.d.ts.map +1 -0
  381. package/dist/components/file-manager/file-manager.d.ts +82 -0
  382. package/dist/components/file-manager/file-manager.d.ts.map +1 -0
  383. package/dist/components/file-manager/folder-tree.d.ts +12 -0
  384. package/dist/components/file-manager/folder-tree.d.ts.map +1 -0
  385. package/dist/components/file-manager/index.d.ts +5 -0
  386. package/dist/components/file-manager/index.d.ts.map +1 -0
  387. package/dist/components/file-manager/index.js +6 -0
  388. package/dist/components/file-manager/index.js.map +1 -0
  389. package/dist/components/file-manager/list-view.d.ts +49 -0
  390. package/dist/components/file-manager/list-view.d.ts.map +1 -0
  391. package/dist/components/file-manager/toolbar.d.ts +15 -0
  392. package/dist/components/file-manager/toolbar.d.ts.map +1 -0
  393. package/dist/components/file-manager/types.d.ts +167 -0
  394. package/dist/components/file-manager/types.d.ts.map +1 -0
  395. package/dist/components/file-manager/utils.d.ts +34 -0
  396. package/dist/components/file-manager/utils.d.ts.map +1 -0
  397. package/dist/components/file-upload/file-upload.d.ts +1 -0
  398. package/dist/components/file-upload/file-upload.d.ts.map +1 -1
  399. package/dist/components/file-upload/index.d.ts +1 -1
  400. package/dist/components/file-upload/index.d.ts.map +1 -1
  401. package/dist/components/file-upload/index.js +4 -3
  402. package/dist/components/finished-terminal/finished-terminal.d.ts.map +1 -1
  403. package/dist/components/finished-terminal/index.js +1 -1
  404. package/dist/components/fiscal-code-input/index.js +1 -1
  405. package/dist/components/flag/flag.d.ts +1 -1
  406. package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
  407. package/dist/components/freemium-paywall/index.js +1 -1
  408. package/dist/components/gestational-age-calculator/index.js +1 -1
  409. package/dist/components/hcg-doubling/index.js +1 -1
  410. package/dist/components/header/header.d.ts.map +1 -1
  411. package/dist/components/header/index.js +1 -1
  412. package/dist/components/header-settings/index.js +1 -1
  413. package/dist/components/icon-button/index.js +1 -1
  414. package/dist/components/icon-button-group/icon-button-group.d.ts +6 -0
  415. package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
  416. package/dist/components/icon-button-group/index.js +1 -1
  417. package/dist/components/icon-picker/index.js +1 -1
  418. package/dist/components/image-cropper/index.js +1 -1
  419. package/dist/components/index.d.ts +7 -1
  420. package/dist/components/index.d.ts.map +1 -1
  421. package/dist/components/key-value-pair/index.js +1 -1
  422. package/dist/components/link/link.d.ts +1 -1
  423. package/dist/components/locale-picker/index.js +1 -1
  424. package/dist/components/map-view/index.js +1 -1
  425. package/dist/components/matrix-rain/matrix-rain.d.ts +1 -1
  426. package/dist/components/message-card/index.js +1 -1
  427. package/dist/components/message-card/message-card.d.ts +1 -1
  428. package/dist/components/message-tray/index.js +1 -1
  429. package/dist/components/muscle-scheme/index.js +1 -1
  430. package/dist/components/muscle-scheme/muscle-scheme.d.ts.map +1 -1
  431. package/dist/components/notes-panel/index.js +1 -1
  432. package/dist/components/notification-card/index.js +1 -1
  433. package/dist/components/notification-card/notification-card.d.ts +1 -1
  434. package/dist/components/notification-tray/index.js +1 -1
  435. package/dist/components/operator-hero/operator-hero.d.ts +1 -1
  436. package/dist/components/optical-prescription/index.d.ts +4 -2
  437. package/dist/components/optical-prescription/index.d.ts.map +1 -1
  438. package/dist/components/optical-prescription/index.js +29 -26
  439. package/dist/components/optical-prescription/optical-prescription-charts.d.ts +78 -0
  440. package/dist/components/optical-prescription/optical-prescription-charts.d.ts.map +1 -0
  441. package/dist/components/optical-prescription/optical-prescription-data.d.ts +29 -0
  442. package/dist/components/optical-prescription/optical-prescription-data.d.ts.map +1 -1
  443. package/dist/components/optical-prescription/optical-prescription.agent.d.ts.map +1 -1
  444. package/dist/components/optical-prescription/optical-prescription.d.ts +9 -0
  445. package/dist/components/optical-prescription/optical-prescription.d.ts.map +1 -1
  446. package/dist/components/patient-details/index.js +1 -1
  447. package/dist/components/patient-search/index.js +1 -1
  448. package/dist/components/patient-search/patient-search.d.ts.map +1 -1
  449. package/dist/components/patient-summary-card/index.js +1 -1
  450. package/dist/components/patient-summary-card/patient-summary-card.d.ts +1 -1
  451. package/dist/components/patient-table/columns.d.ts.map +1 -1
  452. package/dist/components/patient-table/index.js +1 -1
  453. package/dist/components/payment-card/index.js +1 -1
  454. package/dist/components/payment-card/payment-card.d.ts +1 -1
  455. package/dist/components/payment-card/payment-request-card.d.ts +1 -1
  456. package/dist/components/periodontal-chart/index.d.ts +6 -0
  457. package/dist/components/periodontal-chart/index.d.ts.map +1 -0
  458. package/dist/components/periodontal-chart/index.js +22 -0
  459. package/dist/components/periodontal-chart/index.js.map +1 -0
  460. package/dist/components/periodontal-chart/periodontal-chart-data.d.ts +119 -0
  461. package/dist/components/periodontal-chart/periodontal-chart-data.d.ts.map +1 -0
  462. package/dist/components/periodontal-chart/periodontal-chart.agent.d.ts +4 -0
  463. package/dist/components/periodontal-chart/periodontal-chart.agent.d.ts.map +1 -0
  464. package/dist/components/periodontal-chart/periodontal-chart.d.ts +69 -0
  465. package/dist/components/periodontal-chart/periodontal-chart.d.ts.map +1 -0
  466. package/dist/components/periodontal-chart-card/index.js +1 -1
  467. package/dist/components/periodontal-chart-card/periodontal-chart-card.d.ts +1 -1
  468. package/dist/components/periodontal-diagnosis/index.d.ts +6 -0
  469. package/dist/components/periodontal-diagnosis/index.d.ts.map +1 -0
  470. package/dist/components/periodontal-diagnosis/index.js +13 -0
  471. package/dist/components/periodontal-diagnosis/index.js.map +1 -0
  472. package/dist/components/periodontal-diagnosis/periodontal-diagnosis-data.d.ts +30 -0
  473. package/dist/components/periodontal-diagnosis/periodontal-diagnosis-data.d.ts.map +1 -0
  474. package/dist/components/periodontal-diagnosis/periodontal-diagnosis.agent.d.ts +4 -0
  475. package/dist/components/periodontal-diagnosis/periodontal-diagnosis.agent.d.ts.map +1 -0
  476. package/dist/components/periodontal-diagnosis/periodontal-diagnosis.d.ts +44 -0
  477. package/dist/components/periodontal-diagnosis/periodontal-diagnosis.d.ts.map +1 -0
  478. package/dist/components/periodontal-risk-chart/index.d.ts +6 -0
  479. package/dist/components/periodontal-risk-chart/index.d.ts.map +1 -0
  480. package/dist/components/periodontal-risk-chart/index.js +9 -0
  481. package/dist/components/periodontal-risk-chart/index.js.map +1 -0
  482. package/dist/components/periodontal-risk-chart/periodontal-risk-chart.agent.d.ts +4 -0
  483. package/dist/components/periodontal-risk-chart/periodontal-risk-chart.agent.d.ts.map +1 -0
  484. package/dist/components/periodontal-risk-chart/periodontal-risk-chart.d.ts +28 -0
  485. package/dist/components/periodontal-risk-chart/periodontal-risk-chart.d.ts.map +1 -0
  486. package/dist/components/periodontal-risk-chart/periodontal-risk-data.d.ts +47 -0
  487. package/dist/components/periodontal-risk-chart/periodontal-risk-data.d.ts.map +1 -0
  488. package/dist/components/popover/index.js +1 -1
  489. package/dist/components/popover/popover.d.ts +1 -0
  490. package/dist/components/popover/popover.d.ts.map +1 -1
  491. package/dist/components/practice-results/index.js +1 -1
  492. package/dist/components/pregnancy-dating/index.js +1 -1
  493. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  494. package/dist/components/privacy-lock/index.js +1 -1
  495. package/dist/components/product-hub-tray/index.js +1 -1
  496. package/dist/components/product-hub-tray/product-hub-panel.d.ts +1 -1
  497. package/dist/components/public-header/index.js +1 -1
  498. package/dist/components/public-header/public-header.d.ts +1 -1
  499. package/dist/components/public-header/public-header.d.ts.map +1 -1
  500. package/dist/components/radiograph-panel/index.js +1 -1
  501. package/dist/components/radiograph-panel/radiograph-panel.d.ts +2 -2
  502. package/dist/components/radiograph-panel/radiograph-panel.d.ts.map +1 -1
  503. package/dist/components/reviews-panel/index.js +1 -1
  504. package/dist/components/rich-text-editor/index.js +1 -1
  505. package/dist/components/select/index.js +1 -1
  506. package/dist/components/select/select.d.ts.map +1 -1
  507. package/dist/components/session-countdown/index.js +1 -1
  508. package/dist/components/sheet/index.js +1 -1
  509. package/dist/components/sidebar/index.js +1 -1
  510. package/dist/components/sidebar/sidebar.d.ts +9 -0
  511. package/dist/components/sidebar/sidebar.d.ts.map +1 -1
  512. package/dist/components/sign-document/index.js +1 -1
  513. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  514. package/dist/components/signature-capture/index.js +1 -1
  515. package/dist/components/signature-capture/signature-capture.d.ts.map +1 -1
  516. package/dist/components/signature-field/index.js +1 -1
  517. package/dist/components/signature-field/signature-field.d.ts +7 -0
  518. package/dist/components/signature-field/signature-field.d.ts.map +1 -1
  519. package/dist/components/skeleton-scheme/index.js +1186 -0
  520. package/dist/components/skeleton-scheme/index.js.map +1 -0
  521. package/dist/components/slot-grid/index.js +1 -1
  522. package/dist/components/stat/stat.d.ts +1 -1
  523. package/dist/components/streaming-text/index.js +1 -1
  524. package/dist/components/tabs/index.js +1 -1
  525. package/dist/components/task-tray/index.js +1 -1
  526. package/dist/components/tasks-panel/index.js +1 -1
  527. package/dist/components/theme-toggle/index.js +1 -1
  528. package/dist/components/toast/index.js +1 -1
  529. package/dist/components/token-insert-menu/index.js +1 -1
  530. package/dist/components/tool-rail/index.js +1 -1
  531. package/dist/components/tooth-scheme/index.js +29 -28
  532. package/dist/components/tooth-scheme/index.js.map +1 -1
  533. package/dist/components/transaction-chip/index.js +1 -1
  534. package/dist/components/unit-converter/index.js +1 -1
  535. package/dist/components/warning-stack/index.js +1 -1
  536. package/dist/components/workflow/index.js +1 -1
  537. package/dist/hooks/index.d.ts +2 -0
  538. package/dist/hooks/index.d.ts.map +1 -1
  539. package/dist/hooks/index.js +40 -35
  540. package/dist/hooks/index.js.map +1 -1
  541. package/dist/hooks/use-priority-overflow.d.ts +63 -0
  542. package/dist/hooks/use-priority-overflow.d.ts.map +1 -0
  543. package/dist/hooks/use-visual-viewport-pin.d.ts +32 -0
  544. package/dist/hooks/use-visual-viewport-pin.d.ts.map +1 -0
  545. package/dist/i18n/locales/ar.d.ts +490 -9
  546. package/dist/i18n/locales/ar.d.ts.map +1 -1
  547. package/dist/i18n/locales/ar.js +493 -12
  548. package/dist/i18n/locales/ar.js.map +1 -1
  549. package/dist/i18n/locales/de.d.ts +490 -9
  550. package/dist/i18n/locales/de.d.ts.map +1 -1
  551. package/dist/i18n/locales/de.js +493 -12
  552. package/dist/i18n/locales/de.js.map +1 -1
  553. package/dist/i18n/locales/el.d.ts +490 -9
  554. package/dist/i18n/locales/el.d.ts.map +1 -1
  555. package/dist/i18n/locales/el.js +493 -12
  556. package/dist/i18n/locales/el.js.map +1 -1
  557. package/dist/i18n/locales/en.d.ts +490 -9
  558. package/dist/i18n/locales/en.d.ts.map +1 -1
  559. package/dist/i18n/locales/en.js +493 -12
  560. package/dist/i18n/locales/en.js.map +1 -1
  561. package/dist/i18n/locales/es.d.ts +490 -9
  562. package/dist/i18n/locales/es.d.ts.map +1 -1
  563. package/dist/i18n/locales/es.js +493 -12
  564. package/dist/i18n/locales/es.js.map +1 -1
  565. package/dist/i18n/locales/fr.d.ts +490 -9
  566. package/dist/i18n/locales/fr.d.ts.map +1 -1
  567. package/dist/i18n/locales/fr.js +493 -12
  568. package/dist/i18n/locales/fr.js.map +1 -1
  569. package/dist/i18n/locales/hi.d.ts +490 -9
  570. package/dist/i18n/locales/hi.d.ts.map +1 -1
  571. package/dist/i18n/locales/hi.js +493 -12
  572. package/dist/i18n/locales/hi.js.map +1 -1
  573. package/dist/i18n/locales/it.d.ts +490 -9
  574. package/dist/i18n/locales/it.d.ts.map +1 -1
  575. package/dist/i18n/locales/it.js +493 -12
  576. package/dist/i18n/locales/it.js.map +1 -1
  577. package/dist/i18n/locales/ja.d.ts +490 -9
  578. package/dist/i18n/locales/ja.d.ts.map +1 -1
  579. package/dist/i18n/locales/ja.js +493 -12
  580. package/dist/i18n/locales/ja.js.map +1 -1
  581. package/dist/i18n/locales/nl.d.ts +490 -9
  582. package/dist/i18n/locales/nl.d.ts.map +1 -1
  583. package/dist/i18n/locales/nl.js +493 -12
  584. package/dist/i18n/locales/nl.js.map +1 -1
  585. package/dist/i18n/locales/pl.d.ts +490 -9
  586. package/dist/i18n/locales/pl.d.ts.map +1 -1
  587. package/dist/i18n/locales/pl.js +493 -12
  588. package/dist/i18n/locales/pl.js.map +1 -1
  589. package/dist/i18n/locales/pt.d.ts +490 -9
  590. package/dist/i18n/locales/pt.d.ts.map +1 -1
  591. package/dist/i18n/locales/pt.js +493 -12
  592. package/dist/i18n/locales/pt.js.map +1 -1
  593. package/dist/i18n/locales/ro.d.ts +490 -9
  594. package/dist/i18n/locales/ro.d.ts.map +1 -1
  595. package/dist/i18n/locales/ro.js +493 -12
  596. package/dist/i18n/locales/ro.js.map +1 -1
  597. package/dist/i18n/locales/ru.d.ts +490 -9
  598. package/dist/i18n/locales/ru.d.ts.map +1 -1
  599. package/dist/i18n/locales/ru.js +493 -12
  600. package/dist/i18n/locales/ru.js.map +1 -1
  601. package/dist/i18n/locales/sq.d.ts +490 -9
  602. package/dist/i18n/locales/sq.d.ts.map +1 -1
  603. package/dist/i18n/locales/sq.js +493 -12
  604. package/dist/i18n/locales/sq.js.map +1 -1
  605. package/dist/i18n/locales/sv.d.ts +490 -9
  606. package/dist/i18n/locales/sv.d.ts.map +1 -1
  607. package/dist/i18n/locales/sv.js +493 -12
  608. package/dist/i18n/locales/sv.js.map +1 -1
  609. package/dist/i18n/locales/tr.d.ts +490 -9
  610. package/dist/i18n/locales/tr.d.ts.map +1 -1
  611. package/dist/i18n/locales/tr.js +493 -12
  612. package/dist/i18n/locales/tr.js.map +1 -1
  613. package/dist/i18n/locales/zh.d.ts +490 -9
  614. package/dist/i18n/locales/zh.d.ts.map +1 -1
  615. package/dist/i18n/locales/zh.js +493 -12
  616. package/dist/i18n/locales/zh.js.map +1 -1
  617. package/dist/index.js +872 -809
  618. package/dist/index.js.map +1 -1
  619. package/dist/locales/ar.json +493 -12
  620. package/dist/locales/de.json +493 -12
  621. package/dist/locales/el.json +493 -12
  622. package/dist/locales/en.json +493 -12
  623. package/dist/locales/es.json +493 -12
  624. package/dist/locales/fr.json +493 -12
  625. package/dist/locales/hi.json +493 -12
  626. package/dist/locales/it.json +493 -12
  627. package/dist/locales/ja.json +493 -12
  628. package/dist/locales/nl.json +493 -12
  629. package/dist/locales/pl.json +493 -12
  630. package/dist/locales/pt.json +493 -12
  631. package/dist/locales/ro.json +493 -12
  632. package/dist/locales/ru.json +493 -12
  633. package/dist/locales/sq.json +493 -12
  634. package/dist/locales/sv.json +493 -12
  635. package/dist/locales/tr.json +493 -12
  636. package/dist/locales/zh.json +493 -12
  637. package/dist/patterns/alia-assistant/index.js +1 -1
  638. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  639. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts +1 -1
  640. package/dist/patterns/signature-request/index.d.ts +3 -0
  641. package/dist/patterns/signature-request/index.d.ts.map +1 -0
  642. package/dist/patterns/signature-request/index.js +5 -0
  643. package/dist/patterns/signature-request/index.js.map +1 -0
  644. package/dist/patterns/signature-request/signature-request.d.ts +81 -0
  645. package/dist/patterns/signature-request/signature-request.d.ts.map +1 -0
  646. package/dist/tokens.css +2 -2
  647. package/package.json +32 -4
  648. package/dist/_chunks/benefit-card-Xnxj4Gmo.js.map +0 -1
  649. package/dist/_chunks/button-DD_0Xdmr.js.map +0 -1
  650. package/dist/_chunks/button-group-CvEnVzY7.js +0 -119
  651. package/dist/_chunks/button-group-CvEnVzY7.js.map +0 -1
  652. package/dist/_chunks/columns-2-8lq4-b8e.js.map +0 -1
  653. package/dist/_chunks/document-scanner-B23j4w7X.js.map +0 -1
  654. package/dist/_chunks/face-scheme-BT9_KdL0.js +0 -1450
  655. package/dist/_chunks/face-scheme-BT9_KdL0.js.map +0 -1
  656. package/dist/_chunks/file-upload-Kw1rdvFw.js.map +0 -1
  657. package/dist/_chunks/finished-terminal-Di4gtZ50.js.map +0 -1
  658. package/dist/_chunks/freemium-paywall-DFoeedwh.js.map +0 -1
  659. package/dist/_chunks/header-DaXWDw0M.js.map +0 -1
  660. package/dist/_chunks/icon-button-group-C48khLE0.js +0 -206
  661. package/dist/_chunks/icon-button-group-C48khLE0.js.map +0 -1
  662. package/dist/_chunks/insert-result-C7xSDb8q.js.map +0 -1
  663. package/dist/_chunks/link-cell-renderer-BCppbMec.js +0 -2185
  664. package/dist/_chunks/link-cell-renderer-BCppbMec.js.map +0 -1
  665. package/dist/_chunks/marketplace-app-shell-BCYiOvKZ.js.map +0 -1
  666. package/dist/_chunks/optical-prescription-Bmlbuopi.js +0 -653
  667. package/dist/_chunks/optical-prescription-Bmlbuopi.js.map +0 -1
  668. package/dist/_chunks/patient-search-X9SUZGpy.js.map +0 -1
  669. package/dist/_chunks/patient-shell-oiIRqEAl.js +0 -162
  670. package/dist/_chunks/patient-shell-oiIRqEAl.js.map +0 -1
  671. package/dist/_chunks/patient-table-BgWgNIMf.js.map +0 -1
  672. package/dist/_chunks/public-header.agent-C-opZaOw.js.map +0 -1
  673. package/dist/_chunks/radiograph-panel.agent-D1x33moc.js.map +0 -1
  674. package/dist/_chunks/rich-text-editor-DUgznqOf.js.map +0 -1
  675. package/dist/_chunks/sidebar-B0OBmJrC.js.map +0 -1
  676. package/dist/_chunks/signature-capture-Ct_4Md4e.js.map +0 -1
  677. package/dist/_chunks/signature-field-jgwYgUhO.js.map +0 -1
  678. package/dist/_chunks/subDays-DGSOp9d9.js +0 -8
  679. package/dist/_chunks/tooth-scheme-D_rso4uu.js +0 -2133
  680. package/dist/_chunks/tooth-scheme-D_rso4uu.js.map +0 -1
  681. package/dist/_chunks/transaction-chip-B6iWoVmU.js.map +0 -1
  682. package/dist/patterns/patient-shell/index.d.ts +0 -12
  683. package/dist/patterns/patient-shell/index.d.ts.map +0 -1
  684. package/dist/patterns/patient-shell/index.js +0 -5
  685. package/dist/patterns/patient-shell/patient-shell.d.ts +0 -62
  686. package/dist/patterns/patient-shell/patient-shell.d.ts.map +0 -1
  687. /package/dist/{patterns/patient-shell → components/data-table-tabs}/index.js.map +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"antenatal-schedule-timeline-CY-VsLok.js","sources":["../../src/components/_shared/obstetrics.ts","../../src/components/_shared/antenatal-schedule.ts","../../src/components/_shared/antenatal-schedule-timeline.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* Obstetric maths — pure, framework-free, unit-testable. */\n/* */\n/* Estimated-due-date dating, gestational age, trimester classification */\n/* and milestone projection, plus the trimester→presentation maps the */\n/* obstetric calculators share. All three dating methods are normalised */\n/* onto a single \"gestational start\" (the notional first day of the last */\n/* menstrual period, GA day 0) so gestational age and trimester are */\n/* computed identically regardless of how the pregnancy was dated. */\n/* */\n/* Home for cross-component obstetric logic: the due-date and */\n/* gestational-age calculators both consume this module, so it lives in */\n/* `_shared/` rather than inside a single component directory. */\n/* `due-date-calculator/gestation.ts` re-exports this file for */\n/* back-compatibility with the public package barrel. */\n/* ------------------------------------------------------------------ */\n\nimport { addDays, subDays, differenceInCalendarDays } from 'date-fns';\n\nexport type DueDateMethod = 'lmp' | 'conception' | 'ivf';\n\n/** Embryo age at transfer, in days (cleavage vs blastocyst). */\nexport type EmbryoAge = 3 | 5;\n\nexport type Trimester =\n | 'preconception'\n | 'first'\n | 'second'\n | 'third'\n | 'postterm';\n\n/** Number of fetuses. Drives surveillance schedule and planned-birth timing. */\nexport type Plurality = 'singleton' | 'twin' | 'triplet';\n\n/**\n * Placentation of a multiple pregnancy. `unknown` is the safe default — managed\n * as monochorionic (the higher-risk assumption) until proven otherwise, per\n * NICE QS46. Only meaningful when `plurality !== 'singleton'`.\n */\nexport type Chorionicity =\n | 'dichorionic-diamniotic'\n | 'monochorionic-diamniotic'\n | 'monochorionic-monoamniotic'\n | 'unknown';\n\n/** Naegele's rule: a term pregnancy is 280 days from the LMP. */\nexport const GESTATION_DAYS = 280;\n/** Ovulation/conception sits ~14 days after the LMP in a 28-day cycle. */\nexport const CONCEPTION_OFFSET_DAYS = 14;\n/** A term pregnancy is 266 days from conception. */\nexport const TERM_FROM_CONCEPTION_DAYS = 266;\n/** Standard menstrual-cycle length Naegele assumes. */\nexport const DEFAULT_CYCLE_LENGTH = 28;\n\nexport interface DueDateInput {\n method: DueDateMethod;\n /** The reference date for the chosen method (LMP / conception / transfer). */\n date: Date;\n /** LMP only — average cycle length in days. Defaults to 28. */\n cycleLength?: number;\n /** IVF only — embryo age at transfer in days. Defaults to 5 (blastocyst). */\n embryoAge?: EmbryoAge;\n}\n\nexport interface GestationalAge {\n weeks: number;\n days: number;\n totalDays: number;\n}\n\nexport interface DueDateResult {\n /** Estimated date of delivery. */\n dueDate: Date;\n /** GA day-0 anchor (notional LMP) the trimester maths counts from. */\n gestationalStart: Date;\n /** Gestational age as of `today`; `null` before conception. */\n gestationalAge: GestationalAge | null;\n trimester: Trimester;\n}\n\n/** Classify gestational age (in completed weeks) into a trimester. */\nexport function trimesterForWeeks(totalDays: number): Trimester {\n if (totalDays < 0) return 'preconception';\n const weeks = Math.floor(totalDays / 7);\n if (weeks < 14) return 'first';\n if (weeks < 28) return 'second';\n if (weeks < 42) return 'third';\n return 'postterm';\n}\n\n/**\n * Resolve the gestational start (notional LMP) and due date for a method.\n * `cycleLength` shifts a longer/shorter cycle's ovulation, moving the due\n * date while GA stays counted from the LMP — the standard convention.\n */\nexport function computeDueDate(\n input: DueDateInput,\n today: Date,\n): DueDateResult {\n const { method, date } = input;\n\n let gestationalStart: Date;\n let dueDate: Date;\n\n if (method === 'lmp') {\n const cycle = input.cycleLength ?? DEFAULT_CYCLE_LENGTH;\n gestationalStart = date;\n dueDate = addDays(date, GESTATION_DAYS + (cycle - DEFAULT_CYCLE_LENGTH));\n } else if (method === 'conception') {\n gestationalStart = subDays(date, CONCEPTION_OFFSET_DAYS);\n dueDate = addDays(date, TERM_FROM_CONCEPTION_DAYS);\n } else {\n // IVF: back out the conception (egg-retrieval) date from the transfer.\n const embryo = input.embryoAge ?? 5;\n const conceptionDate = subDays(date, embryo);\n gestationalStart = subDays(conceptionDate, CONCEPTION_OFFSET_DAYS);\n dueDate = addDays(conceptionDate, TERM_FROM_CONCEPTION_DAYS);\n }\n\n const totalDays = differenceInCalendarDays(today, gestationalStart);\n const gestationalAge: GestationalAge | null =\n totalDays < 0\n ? null\n : {\n weeks: Math.floor(totalDays / 7),\n days: totalDays % 7,\n totalDays,\n };\n\n return {\n dueDate,\n gestationalStart,\n gestationalAge,\n trimester: trimesterForWeeks(totalDays),\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Milestones */\n/* ------------------------------------------------------------------ */\n\n/** Gestational weeks at which clinically notable milestones fall. */\nexport const MILESTONE_WEEKS = [12, 24, 28, 37, 40] as const;\n\nexport interface GestationalMilestone {\n /** Stable key (`w12`, `w24`, …) for i18n lookup. */\n key: string;\n /** Completed gestational weeks. */\n week: number;\n /** Calendar date the milestone is reached. */\n date: Date;\n}\n\n/**\n * Project the standard milestone dates from a gestational start (notional\n * LMP / GA day 0): end of first trimester (12w), viability (24w), third\n * trimester (28w), term (37w) and the 40-week due date.\n */\nexport function gestationalMilestones(\n gestationalStart: Date,\n): GestationalMilestone[] {\n return MILESTONE_WEEKS.map((week) => ({\n key: `w${week}`,\n week,\n date: addDays(gestationalStart, week * 7),\n }));\n}\n\n/* ------------------------------------------------------------------ */\n/* Trimester presentation */\n/* */\n/* Shared by DueDateCalculator and GestationalAgeCalculator so the */\n/* on-screen badge and the inserted result-card chip stay in lockstep. */\n/* These are plain string maps (no React/Badge import) — the same */\n/* pattern as `_shared/entity-card`'s state→badge maps. */\n/* ------------------------------------------------------------------ */\n\n/** Badge `variant` names used for trimesters (the Badge component's union). */\nexport type TrimesterBadgeVariant =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'error';\n\n/** Trimester → on-screen Badge variant. */\nexport const TRIMESTER_BADGE_VARIANT: Record<Trimester, TrimesterBadgeVariant> =\n {\n preconception: 'neutral',\n first: 'info',\n second: 'success',\n third: 'warning',\n postterm: 'error',\n };\n\n/**\n * DS token NAME backing each trimester's result-card chip — the solid-fill\n * companion of `TRIMESTER_BADGE_VARIANT` (Badge `error` fills `--destructive`;\n * `neutral` fills `--muted`). Passed as the card's `highlightToken` so the\n * inserted PNG chip matches the on-screen trimester badge; `InsertButton`\n * resolves the name to a concrete colour at raster time.\n *\n * `third` resolves to `--warning-readable`, which the result card's colour\n * probe resolves in the live themed DOM: orange-600 in light, non-accessible\n * mode (where bare `--warning` yellow only reaches ~3.2:1 on the white card)\n * and `--warning` elsewhere, whose deepened ramp already clears contrast.\n * Resolving the token NAME at the card means the choice tracks the live theme\n * regardless of where the theme class lives.\n */\nexport const TRIMESTER_HIGHLIGHT_TOKEN: Record<Trimester, string> = {\n preconception: '--muted',\n first: '--info',\n second: '--success',\n third: '--warning-readable',\n postterm: '--destructive',\n};\n\n/** The DS token name for a trimester's result-card chip. */\nexport function trimesterHighlightToken(trimester: Trimester): string {\n return TRIMESTER_HIGHLIGHT_TOKEN[trimester];\n}\n\n/* ------------------------------------------------------------------ */\n/* Multiple pregnancy — planned-birth timing */\n/* */\n/* For multiples the \"due date\" is not a single 40-week point but a */\n/* recommended planned-birth window that depends on chorionicity. The */\n/* UK (NICE NG137) and US (ACOG PB231) bodies diverge by ~1 week for */\n/* diamniotic twins, so the guideline is selectable; Italian practice */\n/* aligns closer to the earlier NICE stance, so `nice` is the default. */\n/* ------------------------------------------------------------------ */\n\n/** Which body's planned-birth timing to use for multiples. */\nexport type BirthGuideline = 'nice' | 'acog';\n\n/** Planned-birth window as GA days (week*7 + day), inclusive, with source. */\nexport interface BirthWindow {\n startDay: number;\n endDay: number;\n source: string;\n}\n\nconst day = (week: number, d = 0): number => week * 7 + d;\n\n/**\n * Recommended planned-birth window for a multiple pregnancy, by chorionicity.\n * Singletons return `null` (use the 40-week EDD instead). `unknown`\n * chorionicity is managed as monochorionic-diamniotic — the higher-risk\n * default (NICE QS46).\n */\nexport function plannedBirthWindow(\n plurality: Plurality,\n chorionicity: Chorionicity = 'unknown',\n guideline: BirthGuideline = 'nice',\n): BirthWindow | null {\n if (plurality === 'singleton') return null;\n\n if (plurality === 'triplet') {\n // NICE/ACOG: offer planned birth for uncomplicated triplets at ~35 weeks.\n return { startDay: day(35, 0), endDay: day(35, 6), source: 'NICE-NG137' };\n }\n\n // Twins. `unknown` is managed as monochorionic-diamniotic.\n const effective: Chorionicity =\n chorionicity === 'unknown' ? 'monochorionic-diamniotic' : chorionicity;\n\n if (guideline === 'acog') {\n switch (effective) {\n case 'dichorionic-diamniotic':\n return {\n startDay: day(38, 0),\n endDay: day(38, 6),\n source: 'ACOG-PB231',\n };\n case 'monochorionic-diamniotic':\n return {\n startDay: day(36, 0),\n endDay: day(37, 6),\n source: 'ACOG-PB231',\n };\n case 'monochorionic-monoamniotic':\n return {\n startDay: day(32, 0),\n endDay: day(34, 0),\n source: 'ACOG-PB231',\n };\n }\n }\n\n // NICE NG137 (default).\n switch (effective) {\n case 'dichorionic-diamniotic':\n return { startDay: day(37, 0), endDay: day(37, 6), source: 'NICE-NG137' };\n case 'monochorionic-diamniotic':\n return { startDay: day(36, 0), endDay: day(36, 6), source: 'NICE-NG137' };\n case 'monochorionic-monoamniotic':\n return { startDay: day(32, 0), endDay: day(33, 6), source: 'NICE-NG137' };\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Ultrasound (CRL) redating — ACOG Committee Opinion 700 */\n/* */\n/* A first-trimester crown-rump length gives a gestational age via */\n/* Robinson–Fleming. When it disagrees with the LMP by more than the */\n/* ACOG CO 700 threshold (which widens with gestation), the ultrasound */\n/* estimate replaces the LMP dating. Below threshold, the LMP stands. */\n/* The returned `ecoDiffDays` mirrors the server-side `eco_diff_days` */\n/* offset so the kit and the editor-actions backend can be reconciled. */\n/* ------------------------------------------------------------------ */\n\n/** Robinson–Fleming dating is validated for CRL 45–84 mm. */\nexport const CRL_DATING_MIN_MM = 45;\nexport const CRL_DATING_MAX_MM = 84;\n\n/** Gestational age in days from a crown-rump length (mm), Robinson–Fleming. */\nexport function crlToGestationalAgeDays(crlMm: number): number {\n // GA(days) = 8.052·√(CRL·1.037) + 23.73\n return 8.052 * Math.sqrt(crlMm * 1.037) + 23.73;\n}\n\n/**\n * ACOG CO 700 redating threshold (in days) for a given GA-by-LMP: re-date the\n * EDD to the ultrasound estimate only when the discrepancy EXCEEDS this.\n */\nexport function redatingThresholdDays(gaByLmpDays: number): number {\n if (gaByLmpDays <= day(8, 6)) return 5; // ≤ 8+6\n if (gaByLmpDays <= day(15, 6)) return 7; // 9+0 – 15+6\n if (gaByLmpDays <= day(21, 6)) return 10; // 16+0 – 21+6\n if (gaByLmpDays <= day(27, 6)) return 14; // 22+0 – 27+6\n return 21; // ≥ 28+0 (with a growth-restriction caveat the UI should note)\n}\n\nexport interface CrlRedatingInput {\n /** Reported first day of the last menstrual period. */\n lmp: Date;\n /** Date the ultrasound CRL was measured. */\n scanDate: Date;\n /** Crown-rump length, mm. */\n crlMm: number;\n}\n\nexport interface CrlRedatingResult {\n /** Notional LMP (GA day 0) after the rule — the ultrasound's or the original. */\n gestationalStart: Date;\n /** Whether the ultrasound estimate replaced the LMP dating. */\n redated: boolean;\n /** |GA-by-LMP − GA-by-CRL| at the scan, in days. */\n discrepancyDays: number;\n /** The ACOG CO 700 threshold (days) that applied. */\n thresholdDays: number;\n /** CRL − LMP dating, in days (+ = fetus ahead of dates). Server `eco_diff_days`. */\n ecoDiffDays: number;\n /** Whether the CRL is within the 45–84 mm dating-validity window. */\n crlInRange: boolean;\n}\n\n/** Apply the ACOG CO 700 CRL-redating rule to an LMP. */\nexport function redateByCrl(input: CrlRedatingInput): CrlRedatingResult {\n const gaByLmpDays = differenceInCalendarDays(input.scanDate, input.lmp);\n const gaByCrlDays = Math.round(crlToGestationalAgeDays(input.crlMm));\n const discrepancyDays = Math.abs(gaByLmpDays - gaByCrlDays);\n const thresholdDays = redatingThresholdDays(gaByLmpDays);\n const redated = discrepancyDays > thresholdDays;\n return {\n gestationalStart: redated\n ? subDays(input.scanDate, gaByCrlDays)\n : input.lmp,\n redated,\n discrepancyDays,\n thresholdDays,\n ecoDiffDays: gaByCrlDays - gaByLmpDays,\n crlInRange:\n input.crlMm >= CRL_DATING_MIN_MM && input.crlMm <= CRL_DATING_MAX_MM,\n };\n}\n","/* ------------------------------------------------------------------ */\n/* Antenatal schedule — pure, framework-free, clinically cited. */\n/* */\n/* Given a gestational start (GA day 0 = notional LMP, from */\n/* `obstetrics.ts`), resolves the time-sensitive antenatal exams and */\n/* screenings to absolute date windows with a past / current / upcoming */\n/* status. The schedule is locale-configurable because guidelines */\n/* genuinely diverge (e.g. the anomaly scan is 19+0–21+6 in Italy but */\n/* 18+0–20+6 in the UK), and conditional items (anti-D, OGTT tier, */\n/* CVS/amnio) are opt-in so a patient is never shown every test. */\n/* */\n/* Every window carries a `source` citation key so the UI can show */\n/* provenance and a clinician can audit the data. Windows are NOT */\n/* ported from the original Metricare app — its constants carry a */\n/* documented 2-week-late dating shift (the first-trimester screening */\n/* rendered after its window had closed). These are the guideline */\n/* windows, anchored to the kit's correct `computeDueDate` maths. */\n/* */\n/* Sources (citation keys): */\n/* SIEOG-2021 — SIEOG ministerial ultrasound guidelines 2021 (IT) */\n/* ISS — ISS 'Gravidanza fisiologica' / LEA (IT) */\n/* SID-AMD — SID-AMD/ISS gestational-diabetes screening (IT) */\n/* ACOG-CO700 — ACOG Committee Opinion 700 (EDD methods) */\n/* NICE-NG201 — NICE NG201 routine antenatal care (UK) */\n/* NICE-NG137 — NICE NG137 twin & triplet pregnancy (UK) */\n/* ISUOG-2025 — ISUOG twin-pregnancy ultrasound guidelines 2025 */\n/* ------------------------------------------------------------------ */\n\nimport { addDays, differenceInCalendarDays } from 'date-fns';\nimport {\n plannedBirthWindow,\n type Plurality,\n type Chorionicity,\n type BirthGuideline,\n} from './obstetrics';\n\nexport type AntenatalCategory =\n | 'scan'\n | 'screening'\n | 'diagnostic'\n | 'lab'\n | 'prophylaxis'\n | 'milestone';\n\n/** Which national schedule to resolve. Italy is the default market. */\nexport type ScheduleLocale = 'it' | 'uk' | 'international';\n\n/** Status of a window relative to the reference date (keyed off its end). */\nexport type AntenatalStatus = 'past' | 'current' | 'upcoming';\n\n/** Gestational-diabetes risk tier (drives which OGTT window applies). */\nexport type GdmRisk = 'high' | 'medium';\n\n/** A clinical condition gating whether an event applies to a pregnancy. */\nexport type AntenatalCondition =\n | 'rh-negative'\n | 'gdm-high'\n | 'gdm-medium'\n | 'on-indication';\n\nexport interface AntenatalEvent {\n /** Stable key → i18n lookup `antenatalSchedule.event.<key>`. */\n key: string;\n category: AntenatalCategory;\n /** Window start as GA days from gestationalStart (week*7 + day). Inclusive. */\n startDay: number;\n /** Window end as GA days. Inclusive. Equals `startDay` for single dates. */\n endDay: number;\n /** Restrict to these pluralities (omit ⇒ applies to all). */\n plurality?: Plurality[];\n /** Restrict to these chorionicities (omit ⇒ any). */\n chorionicity?: Chorionicity[];\n /** Gate behind a clinical condition (omit ⇒ always applies). */\n condition?: AntenatalCondition;\n /** Citation key for provenance display. */\n source: string;\n /** Interpolation values for the event's i18n string (e.g. surveillance cadence). */\n meta?: Record<string, string | number>;\n}\n\nexport interface ResolvedAntenatalEvent extends AntenatalEvent {\n /** Absolute window start date. */\n start: Date;\n /** Absolute window end date (=== `start` for a single-date event). */\n end: Date;\n /** True when the event is a single calendar date, not a range. */\n single: boolean;\n /** Status relative to the reference date, keyed off the window end. */\n status: AntenatalStatus;\n /** Reference date is within `nearDays` before the window end. */\n near: boolean;\n}\n\nexport interface AntenatalScheduleOptions {\n /** Reference date for status. Defaults to the host's current date. */\n today?: Date;\n /** National schedule. Defaults to `'it'`. */\n schedule?: ScheduleLocale;\n /** Number of fetuses. Defaults to `'singleton'`. */\n plurality?: Plurality;\n /** Placentation, for multiples. Defaults to `'unknown'`. */\n chorionicity?: Chorionicity;\n /** Surface the anti-D prophylaxis event (Rh-negative, non-sensitised). */\n rhNegative?: boolean;\n /** Surface the matching OGTT window for the patient's GDM risk tier. */\n gdmRisk?: GdmRisk;\n /** Include `on-indication` diagnostics (CVS, amnio, NIPT). Default false. */\n includeOnIndication?: boolean;\n /** Planned-birth guideline for multiples. Defaults to `'nice'`. */\n birthGuideline?: BirthGuideline;\n /** Days before a window's end still counted as `current`. Default 14. */\n nearDays?: number;\n}\n\n/** Gestational-age days from a week + day pair (e.g. `ga(13, 6)` → 97). */\nconst ga = (week: number, day = 0): number => week * 7 + day;\n\n/* ------------------------------------------------------------------ */\n/* Schedule data — one table per locale. */\n/* Common events are defined once and reused; only the windows that */\n/* genuinely diverge between locales are overridden. */\n/* ------------------------------------------------------------------ */\n\n/**\n * First-trimester dating scan + nuchal translucency + combined/bi-test.\n * NT is only measurable at CRL 45–84 mm, which is the 11+0–13+6 window;\n * the combined-test bloods (PAPP-A, free β-hCG) share it. (UK opens it a\n * touch later, 11+2–14+1, anchored to NICE's CRL band.)\n */\nconst datingNt = (locale: ScheduleLocale): AntenatalEvent =>\n locale === 'uk'\n ? {\n key: 'dating-nt',\n category: 'screening',\n startDay: ga(11, 2),\n endDay: ga(14, 1),\n source: 'NICE-NG201',\n }\n : {\n key: 'dating-nt',\n category: 'screening',\n startDay: ga(11, 0),\n endDay: ga(13, 6),\n source: 'SIEOG-2021',\n };\n\n/** NIPT / cell-free DNA — earliest 10+0; co-timed with the combined test. */\nconst nipt: AntenatalEvent = {\n key: 'nipt',\n category: 'screening',\n startDay: ga(10, 0),\n endDay: ga(13, 6),\n condition: 'on-indication',\n source: 'ACOG-CO700',\n};\n\n/** Chorionic villus sampling — never before 10–11w (limb-reduction risk). */\nconst cvs: AntenatalEvent = {\n key: 'cvs',\n category: 'diagnostic',\n startDay: ga(11, 0),\n endDay: ga(13, 6),\n condition: 'on-indication',\n source: 'ISS',\n};\n\n/** Amniocentesis — from 15+0 (typically 15–18w). */\nconst amnio: AntenatalEvent = {\n key: 'amnio',\n category: 'diagnostic',\n startDay: ga(15, 0),\n endDay: ga(18, 0),\n condition: 'on-indication',\n source: 'ISS',\n};\n\n/** Second-trimester anomaly / morphology scan — the key locale divergence. */\nconst morphology = (locale: ScheduleLocale): AntenatalEvent => {\n if (locale === 'uk') {\n return {\n key: 'morphology',\n category: 'scan',\n startDay: ga(18, 0),\n endDay: ga(20, 6),\n source: 'NICE-NG201',\n };\n }\n if (locale === 'international') {\n return {\n key: 'morphology',\n category: 'scan',\n startDay: ga(18, 0),\n endDay: ga(22, 0),\n source: 'ACOG-CO700',\n };\n }\n return {\n key: 'morphology',\n category: 'scan',\n startDay: ga(19, 0),\n endDay: ga(21, 6),\n source: 'SIEOG-2021',\n };\n};\n\n/**\n * Third-trimester growth scan — `on-indication` everywhere: not routine in\n * the Italian low-risk pathway (ISS uses symphysis-fundal height from 24w);\n * NICE/ACOG also reserve late scans for indications in low-risk pregnancies.\n */\nconst growth: AntenatalEvent = {\n key: 'growth',\n category: 'scan',\n startDay: ga(30, 0),\n endDay: ga(33, 6),\n condition: 'on-indication',\n source: 'SIEOG-2021',\n};\n\n/** OGTT 75 g, high-risk tier (BMI ≥ 30 / prior GDM / fasting 100–125). */\nconst ogttHigh: AntenatalEvent = {\n key: 'ogtt-high',\n category: 'lab',\n startDay: ga(16, 0),\n endDay: ga(18, 6),\n condition: 'gdm-high',\n source: 'SID-AMD',\n};\n\n/** OGTT 75 g, medium-risk tier (≥ 1 of: family hx, BMI ≥ 25, age ≥ 35 …). */\nconst ogttMedium: AntenatalEvent = {\n key: 'ogtt-medium',\n category: 'lab',\n startDay: ga(24, 0),\n endDay: ga(28, 6),\n condition: 'gdm-medium',\n source: 'SID-AMD',\n};\n\n/** Group-B streptococcus vagino-rectal swab. */\nconst gbs = (locale: ScheduleLocale): AntenatalEvent =>\n locale === 'it'\n ? {\n key: 'gbs',\n category: 'lab',\n startDay: ga(36, 0),\n endDay: ga(37, 6),\n source: 'ISS',\n }\n : {\n // CDC / legacy international protocols open a week earlier.\n key: 'gbs',\n category: 'lab',\n startDay: ga(35, 0),\n endDay: ga(37, 6),\n source: 'NICE-NG201',\n };\n\n/** Routine antenatal anti-D prophylaxis for non-sensitised Rh(D)-neg women. */\nconst antiD: AntenatalEvent = {\n key: 'anti-d',\n category: 'prophylaxis',\n startDay: ga(28, 0),\n endDay: ga(28, 0),\n condition: 'rh-negative',\n source: 'ISS',\n};\n\n/**\n * Term threshold (37+0) — singletons only. Multiples are delivered earlier\n * (see `plannedBirthWindow`), so a 37-week \"term\" milestone would fall after\n * their recommended birth window and read as clinically contradictory.\n */\nconst term: AntenatalEvent = {\n key: 'term',\n category: 'milestone',\n startDay: ga(37, 0),\n endDay: ga(37, 0),\n plurality: ['singleton'],\n source: 'ACOG-CO700',\n};\n\n/** Estimated due date (40+0) — singleton only; twins use a birth window. */\nconst edd: AntenatalEvent = {\n key: 'edd',\n category: 'milestone',\n startDay: ga(40, 0),\n endDay: ga(40, 0),\n plurality: ['singleton'],\n source: 'ACOG-CO700',\n};\n\n/**\n * Chorionicity + amnionicity determination — twins/triplets only, at the\n * first-trimester scan (before 13+6 / CRL 45–84 mm). If presentation is\n * later, determine at the earliest opportunity.\n */\nconst chorionicityDetermination: AntenatalEvent = {\n key: 'chorionicity',\n category: 'scan',\n startDay: ga(11, 2),\n endDay: ga(14, 1),\n plurality: ['twin', 'triplet'],\n source: 'ISUOG-2025',\n};\n\n/** Build the ordered base event list for a locale (pre-filtering). */\nfunction baseEvents(locale: ScheduleLocale): AntenatalEvent[] {\n return [\n datingNt(locale),\n nipt,\n cvs,\n chorionicityDetermination,\n amnio,\n morphology(locale),\n ogttHigh,\n growth,\n ogttMedium,\n term,\n gbs(locale),\n antiD,\n edd,\n ];\n}\n\n/**\n * Extra events for a multiple pregnancy: increased ultrasound surveillance\n * (cadence by chorionicity) and the planned-birth window (which replaces the\n * singleton EDD). Monochorionic twins are scanned every 2 weeks from 16w to\n * catch TTTS; dichorionic every 4 weeks from 20w. `unknown` chorionicity is\n * managed as monochorionic (the higher-risk default).\n */\nfunction multipleEvents(\n plurality: Plurality,\n chorionicity: Chorionicity,\n guideline: BirthGuideline,\n): AntenatalEvent[] {\n if (plurality === 'singleton') return [];\n\n const isDichorionic = chorionicity === 'dichorionic-diamniotic';\n const everyWeeks = isDichorionic ? 4 : 2;\n const fromWeek = isDichorionic ? 20 : 16;\n const birth = plannedBirthWindow(plurality, chorionicity, guideline);\n\n const events: AntenatalEvent[] = [\n {\n key: 'surveillance',\n category: 'scan',\n startDay: ga(fromWeek, 0),\n // Runs until the planned-birth window opens (fallback 36w if none).\n endDay: birth ? birth.startDay : ga(36, 0),\n source: isDichorionic ? 'NICE-NG137' : 'ISUOG-2025',\n meta: { everyWeeks, fromWeek },\n },\n ];\n\n if (birth) {\n events.push({\n key: 'birth',\n category: 'milestone',\n startDay: birth.startDay,\n endDay: birth.endDay,\n source: birth.source,\n });\n }\n\n return events;\n}\n\n/* ------------------------------------------------------------------ */\n/* Resolution */\n/* ------------------------------------------------------------------ */\n\n/** Does an event apply, given the pregnancy's plurality/chorionicity/conds? */\nfunction eventApplies(\n event: AntenatalEvent,\n opts: Required<\n Pick<AntenatalScheduleOptions, 'plurality' | 'chorionicity'>\n > & {\n rhNegative: boolean;\n gdmRisk?: GdmRisk;\n includeOnIndication: boolean;\n },\n): boolean {\n if (event.plurality && !event.plurality.includes(opts.plurality)) {\n return false;\n }\n if (event.chorionicity && !event.chorionicity.includes(opts.chorionicity)) {\n return false;\n }\n switch (event.condition) {\n case 'rh-negative':\n return opts.rhNegative;\n case 'gdm-high':\n return opts.gdmRisk === 'high';\n case 'gdm-medium':\n return opts.gdmRisk === 'medium';\n case 'on-indication':\n return opts.includeOnIndication;\n default:\n return true;\n }\n}\n\nfunction statusFor(\n start: Date,\n end: Date,\n today: Date,\n nearDays: number,\n): { status: AntenatalStatus; near: boolean } {\n const daysUntilStart = differenceInCalendarDays(start, today);\n const daysUntilEnd = differenceInCalendarDays(end, today);\n // Window already closed.\n if (daysUntilEnd < 0) return { status: 'past', near: false };\n // Open now (start ≤ today ≤ end) → current, and always worth flagging.\n if (daysUntilStart <= 0) return { status: 'current', near: true };\n // Not yet open → upcoming; \"near\" if it opens within nearDays.\n return { status: 'upcoming', near: daysUntilStart <= nearDays };\n}\n\n/**\n * Resolve the antenatal schedule for a pregnancy to dated, status-tagged\n * windows, ordered by start date (then end date). Pure: the only clock is\n * `opts.today` (defaults to a fresh `Date`).\n */\nexport function computeAntenatalSchedule(\n gestationalStart: Date,\n opts: AntenatalScheduleOptions = {},\n): ResolvedAntenatalEvent[] {\n const {\n today = new Date(),\n schedule = 'it',\n plurality = 'singleton',\n chorionicity = 'unknown',\n rhNegative = false,\n gdmRisk,\n includeOnIndication = false,\n birthGuideline = 'nice',\n nearDays = 14,\n } = opts;\n\n return [\n ...baseEvents(schedule),\n ...multipleEvents(plurality, chorionicity, birthGuideline),\n ]\n .filter((event) =>\n eventApplies(event, {\n plurality,\n chorionicity,\n rhNegative,\n gdmRisk,\n includeOnIndication,\n }),\n )\n .map((event): ResolvedAntenatalEvent => {\n const start = addDays(gestationalStart, event.startDay);\n const end = addDays(gestationalStart, event.endDay);\n const { status, near } = statusFor(start, end, today, nearDays);\n return {\n ...event,\n start,\n end,\n single: event.startDay === event.endDay,\n status,\n near,\n };\n })\n .sort((a, b) => {\n const byStart = a.startDay - b.startDay;\n return byStart !== 0 ? byStart : a.endDay - b.endDay;\n });\n}\n","/* ------------------------------------------------------------------ */\n/* AntenatalScheduleTimeline — the presentational list of resolved */\n/* antenatal windows, shared by the `showSchedule` appendix on */\n/* GestationalAgeCalculator and DueDateCalculator. Pure display: it takes */\n/* already-resolved events and renders the Card + the sr-only now-due */\n/* summary. No inputs, no state, no maths. */\n/* ------------------------------------------------------------------ */\n\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Card } from '../card';\nimport { Badge } from '../badge';\nimport type { IconKey, InsertCardField } from './insert-result';\nimport type {\n ResolvedAntenatalEvent,\n AntenatalStatus,\n AntenatalCategory,\n} from './antenatal-schedule';\n\n/** Status → on-screen Badge variant. `near` upcoming items borrow `warning`. */\nfunction statusBadgeVariant(\n status: AntenatalStatus,\n near: boolean,\n): 'neutral' | 'info' | 'warning' {\n if (status === 'past') return 'neutral';\n if (status === 'current') return 'warning';\n return near ? 'warning' : 'info';\n}\n\n/** Compact gestational-age label for a day offset, e.g. 97 → \"13+6\". */\nfunction gaLabel(days: number): string {\n return `${Math.floor(days / 7)}+${days % 7}`;\n}\n\n/** Each schedule category maps to one of the inserted-card glyph keys. */\nconst CATEGORY_ICON: Record<AntenatalCategory, IconKey> = {\n scan: 'activity',\n screening: 'activity',\n diagnostic: 'activity',\n lab: 'droplets',\n prophylaxis: 'heart',\n milestone: 'calendar',\n};\n\n/** Minimal translator shape this module needs (matches react-i18next's `t`). */\ntype Translate = (key: string, opts?: Record<string, unknown>) => string;\n\n/** Localised \"label · range\" for one event (e.g. for the sr-only summary). */\nfunction eventLabelFor(event: ResolvedAntenatalEvent, t: Translate): string {\n return t(`antenatalSchedule.event.${event.key}`, event.meta ?? {});\n}\n\n/**\n * Build the inserted-card rows for a resolved schedule, so a host calculator's\n * single Insert button can carry the schedule in its payload (rather than a\n * second Insert button on the schedule card). One row per event: a\n * category-tinted glyph, the localised label, and the date range.\n */\nexport function buildScheduleInsertFields(\n events: ResolvedAntenatalEvent[],\n t: Translate,\n formatDate: (date: Date) => string,\n): InsertCardField[] {\n return events.map((event) => ({\n icon: CATEGORY_ICON[event.category],\n label: eventLabelFor(event, t),\n value: event.single\n ? formatDate(event.start)\n : `${formatDate(event.start)} – ${formatDate(event.end)}`,\n }));\n}\n\nexport interface AntenatalScheduleTimelineProps {\n /** Resolved schedule events (from `computeAntenatalSchedule`). */\n events: ResolvedAntenatalEvent[];\n}\n\nexport function AntenatalScheduleTimeline({\n events,\n}: AntenatalScheduleTimelineProps) {\n const { t, i18n } = useTranslation();\n\n const dateFormatter = useMemo(\n () => new Intl.DateTimeFormat(i18n.language, { dateStyle: 'medium' }),\n [i18n.language],\n );\n\n const eventLabel = (event: ResolvedAntenatalEvent): string =>\n eventLabelFor(event, t);\n\n const formatRange = (event: ResolvedAntenatalEvent): string =>\n event.single\n ? dateFormatter.format(event.start)\n : `${dateFormatter.format(event.start)} – ${dateFormatter.format(\n event.end,\n )}`;\n\n // No own live region: this timeline is always embedded in a host calculator\n // that already owns a `role=\"status\"` result announcement, so a second one\n // here would double-announce. The schedule is fully present in the DOM\n // (labelled list + per-row status Badge) for assistive tech to browse.\n return (\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('antenatalSchedule.scheduleLabel')}\n </span>\n <ul className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {events.map((event) => (\n <li\n key={event.key}\n data-status={event.status}\n className=\"ds:flex ds:flex-wrap ds:items-start ds:justify-between ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-xs)] ds:border-b ds:border-border ds:pb-[var(--spacing-sm)] ds:last:border-b-0 ds:last:pb-0\"\n >\n <span className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-body ds:text-foreground\">\n {eventLabel(event)}\n </span>\n <span className=\"type-meta ds:text-muted-foreground\">\n {t(`antenatalSchedule.category.${event.category}`)} ·{' '}\n {gaLabel(event.startDay)}\n {event.single ? '' : ` – ${gaLabel(event.endDay)}`} ·{' '}\n {t(`antenatalSchedule.source.${event.source}`)}\n {event.condition === 'on-indication'\n ? ` · ${t('antenatalSchedule.onIndication')}`\n : ''}\n </span>\n </span>\n <span className=\"ds:flex ds:flex-col ds:items-end ds:gap-[var(--spacing-2xs)] ds:text-end\">\n <span className=\"type-body ds:text-foreground\">\n {formatRange(event)}\n </span>\n <Badge variant={statusBadgeVariant(event.status, event.near)}>\n {event.status === 'upcoming' && event.near\n ? t('antenatalSchedule.near')\n : t(`antenatalSchedule.status.${event.status}`)}\n </Badge>\n </span>\n </li>\n ))}\n </ul>\n <p className=\"type-meta ds:text-muted-foreground\">\n {t('antenatalSchedule.disclaimer')}\n </p>\n </Card.Body>\n </Card>\n );\n}\n"],"names":["GESTATION_DAYS","CONCEPTION_OFFSET_DAYS","TERM_FROM_CONCEPTION_DAYS","DEFAULT_CYCLE_LENGTH","trimesterForWeeks","totalDays","weeks","computeDueDate","input","today","method","date","gestationalStart","dueDate","cycle","addDays","subDays","embryo","conceptionDate","differenceInCalendarDays","gestationalAge","MILESTONE_WEEKS","gestationalMilestones","week","TRIMESTER_BADGE_VARIANT","TRIMESTER_HIGHLIGHT_TOKEN","trimesterHighlightToken","trimester","day","d","plannedBirthWindow","plurality","chorionicity","guideline","effective","CRL_DATING_MIN_MM","CRL_DATING_MAX_MM","crlToGestationalAgeDays","crlMm","redatingThresholdDays","gaByLmpDays","redateByCrl","gaByCrlDays","discrepancyDays","thresholdDays","redated","ga","datingNt","locale","nipt","cvs","amnio","morphology","growth","ogttHigh","ogttMedium","gbs","antiD","term","edd","chorionicityDetermination","baseEvents","multipleEvents","isDichorionic","everyWeeks","fromWeek","birth","events","eventApplies","event","opts","statusFor","start","end","nearDays","daysUntilStart","computeAntenatalSchedule","schedule","rhNegative","gdmRisk","includeOnIndication","birthGuideline","status","near","a","b","byStart","statusBadgeVariant","gaLabel","days","CATEGORY_ICON","eventLabelFor","t","buildScheduleInsertFields","formatDate","AntenatalScheduleTimeline","i18n","useTranslation","dateFormatter","useMemo","eventLabel","formatRange","jsx","Card","jsxs","Badge"],"mappings":"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"}
1
+ {"version":3,"file":"antenatal-schedule-timeline-BzJZqS-8.js","sources":["../../src/components/_shared/obstetrics.ts","../../src/components/_shared/antenatal-schedule.ts","../../src/components/_shared/antenatal-schedule-timeline.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* Obstetric maths — pure, framework-free, unit-testable. */\n/* */\n/* Estimated-due-date dating, gestational age, trimester classification */\n/* and milestone projection, plus the trimester→presentation maps the */\n/* obstetric calculators share. All three dating methods are normalised */\n/* onto a single \"gestational start\" (the notional first day of the last */\n/* menstrual period, GA day 0) so gestational age and trimester are */\n/* computed identically regardless of how the pregnancy was dated. */\n/* */\n/* Home for cross-component obstetric logic: the due-date and */\n/* gestational-age calculators both consume this module, so it lives in */\n/* `_shared/` rather than inside a single component directory. */\n/* `due-date-calculator/gestation.ts` re-exports this file for */\n/* back-compatibility with the public package barrel. */\n/* ------------------------------------------------------------------ */\n\nimport { addDays, subDays, differenceInCalendarDays } from 'date-fns';\n\nexport type DueDateMethod = 'lmp' | 'conception' | 'ivf';\n\n/** Embryo age at transfer, in days (cleavage vs blastocyst). */\nexport type EmbryoAge = 3 | 5;\n\nexport type Trimester =\n | 'preconception'\n | 'first'\n | 'second'\n | 'third'\n | 'postterm';\n\n/** Number of fetuses. Drives surveillance schedule and planned-birth timing. */\nexport type Plurality = 'singleton' | 'twin' | 'triplet';\n\n/**\n * Placentation of a multiple pregnancy. `unknown` is the safe default — managed\n * as monochorionic (the higher-risk assumption) until proven otherwise, per\n * NICE QS46. Only meaningful when `plurality !== 'singleton'`.\n */\nexport type Chorionicity =\n | 'dichorionic-diamniotic'\n | 'monochorionic-diamniotic'\n | 'monochorionic-monoamniotic'\n | 'unknown';\n\n/** Naegele's rule: a term pregnancy is 280 days from the LMP. */\nexport const GESTATION_DAYS = 280;\n/** Ovulation/conception sits ~14 days after the LMP in a 28-day cycle. */\nexport const CONCEPTION_OFFSET_DAYS = 14;\n/** A term pregnancy is 266 days from conception. */\nexport const TERM_FROM_CONCEPTION_DAYS = 266;\n/** Standard menstrual-cycle length Naegele assumes. */\nexport const DEFAULT_CYCLE_LENGTH = 28;\n\nexport interface DueDateInput {\n method: DueDateMethod;\n /** The reference date for the chosen method (LMP / conception / transfer). */\n date: Date;\n /** LMP only — average cycle length in days. Defaults to 28. */\n cycleLength?: number;\n /** IVF only — embryo age at transfer in days. Defaults to 5 (blastocyst). */\n embryoAge?: EmbryoAge;\n}\n\nexport interface GestationalAge {\n weeks: number;\n days: number;\n totalDays: number;\n}\n\nexport interface DueDateResult {\n /** Estimated date of delivery. */\n dueDate: Date;\n /** GA day-0 anchor (notional LMP) the trimester maths counts from. */\n gestationalStart: Date;\n /** Gestational age as of `today`; `null` before conception. */\n gestationalAge: GestationalAge | null;\n trimester: Trimester;\n}\n\n/** Classify gestational age (in completed weeks) into a trimester. */\nexport function trimesterForWeeks(totalDays: number): Trimester {\n if (totalDays < 0) return 'preconception';\n const weeks = Math.floor(totalDays / 7);\n if (weeks < 14) return 'first';\n if (weeks < 28) return 'second';\n if (weeks < 42) return 'third';\n return 'postterm';\n}\n\n/**\n * Resolve the gestational start (notional LMP) and due date for a method.\n * `cycleLength` shifts a longer/shorter cycle's ovulation, moving the due\n * date while GA stays counted from the LMP — the standard convention.\n */\nexport function computeDueDate(\n input: DueDateInput,\n today: Date,\n): DueDateResult {\n const { method, date } = input;\n\n let gestationalStart: Date;\n let dueDate: Date;\n\n if (method === 'lmp') {\n const cycle = input.cycleLength ?? DEFAULT_CYCLE_LENGTH;\n gestationalStart = date;\n dueDate = addDays(date, GESTATION_DAYS + (cycle - DEFAULT_CYCLE_LENGTH));\n } else if (method === 'conception') {\n gestationalStart = subDays(date, CONCEPTION_OFFSET_DAYS);\n dueDate = addDays(date, TERM_FROM_CONCEPTION_DAYS);\n } else {\n // IVF: back out the conception (egg-retrieval) date from the transfer.\n const embryo = input.embryoAge ?? 5;\n const conceptionDate = subDays(date, embryo);\n gestationalStart = subDays(conceptionDate, CONCEPTION_OFFSET_DAYS);\n dueDate = addDays(conceptionDate, TERM_FROM_CONCEPTION_DAYS);\n }\n\n const totalDays = differenceInCalendarDays(today, gestationalStart);\n const gestationalAge: GestationalAge | null =\n totalDays < 0\n ? null\n : {\n weeks: Math.floor(totalDays / 7),\n days: totalDays % 7,\n totalDays,\n };\n\n return {\n dueDate,\n gestationalStart,\n gestationalAge,\n trimester: trimesterForWeeks(totalDays),\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Milestones */\n/* ------------------------------------------------------------------ */\n\n/** Gestational weeks at which clinically notable milestones fall. */\nexport const MILESTONE_WEEKS = [12, 24, 28, 37, 40] as const;\n\nexport interface GestationalMilestone {\n /** Stable key (`w12`, `w24`, …) for i18n lookup. */\n key: string;\n /** Completed gestational weeks. */\n week: number;\n /** Calendar date the milestone is reached. */\n date: Date;\n}\n\n/**\n * Project the standard milestone dates from a gestational start (notional\n * LMP / GA day 0): end of first trimester (12w), viability (24w), third\n * trimester (28w), term (37w) and the 40-week due date.\n */\nexport function gestationalMilestones(\n gestationalStart: Date,\n): GestationalMilestone[] {\n return MILESTONE_WEEKS.map((week) => ({\n key: `w${week}`,\n week,\n date: addDays(gestationalStart, week * 7),\n }));\n}\n\n/* ------------------------------------------------------------------ */\n/* Trimester presentation */\n/* */\n/* Shared by DueDateCalculator and GestationalAgeCalculator so the */\n/* on-screen badge and the inserted result-card chip stay in lockstep. */\n/* These are plain string maps (no React/Badge import) — the same */\n/* pattern as `_shared/entity-card`'s state→badge maps. */\n/* ------------------------------------------------------------------ */\n\n/** Badge `variant` names used for trimesters (the Badge component's union). */\nexport type TrimesterBadgeVariant =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'error';\n\n/** Trimester → on-screen Badge variant. */\nexport const TRIMESTER_BADGE_VARIANT: Record<Trimester, TrimesterBadgeVariant> =\n {\n preconception: 'neutral',\n first: 'info',\n second: 'success',\n third: 'warning',\n postterm: 'error',\n };\n\n/**\n * DS token NAME backing each trimester's result-card chip — the solid-fill\n * companion of `TRIMESTER_BADGE_VARIANT` (Badge `error` fills `--destructive`;\n * `neutral` fills `--muted`). Passed as the card's `highlightToken` so the\n * inserted PNG chip matches the on-screen trimester badge; `InsertButton`\n * resolves the name to a concrete colour at raster time.\n *\n * `third` resolves to `--warning-readable`, which the result card's colour\n * probe resolves in the live themed DOM: orange-600 in light, non-accessible\n * mode (where bare `--warning` yellow only reaches ~3.2:1 on the white card)\n * and `--warning` elsewhere, whose deepened ramp already clears contrast.\n * Resolving the token NAME at the card means the choice tracks the live theme\n * regardless of where the theme class lives.\n */\nexport const TRIMESTER_HIGHLIGHT_TOKEN: Record<Trimester, string> = {\n preconception: '--muted',\n first: '--info',\n second: '--success',\n third: '--warning-readable',\n postterm: '--destructive',\n};\n\n/** The DS token name for a trimester's result-card chip. */\nexport function trimesterHighlightToken(trimester: Trimester): string {\n return TRIMESTER_HIGHLIGHT_TOKEN[trimester];\n}\n\n/* ------------------------------------------------------------------ */\n/* Multiple pregnancy — planned-birth timing */\n/* */\n/* For multiples the \"due date\" is not a single 40-week point but a */\n/* recommended planned-birth window that depends on chorionicity. The */\n/* UK (NICE NG137) and US (ACOG PB231) bodies diverge by ~1 week for */\n/* diamniotic twins, so the guideline is selectable; Italian practice */\n/* aligns closer to the earlier NICE stance, so `nice` is the default. */\n/* ------------------------------------------------------------------ */\n\n/** Which body's planned-birth timing to use for multiples. */\nexport type BirthGuideline = 'nice' | 'acog';\n\n/** Planned-birth window as GA days (week*7 + day), inclusive, with source. */\nexport interface BirthWindow {\n startDay: number;\n endDay: number;\n source: string;\n}\n\nconst day = (week: number, d = 0): number => week * 7 + d;\n\n/**\n * Recommended planned-birth window for a multiple pregnancy, by chorionicity.\n * Singletons return `null` (use the 40-week EDD instead). `unknown`\n * chorionicity is managed as monochorionic-diamniotic — the higher-risk\n * default (NICE QS46).\n */\nexport function plannedBirthWindow(\n plurality: Plurality,\n chorionicity: Chorionicity = 'unknown',\n guideline: BirthGuideline = 'nice',\n): BirthWindow | null {\n if (plurality === 'singleton') return null;\n\n if (plurality === 'triplet') {\n // NICE/ACOG: offer planned birth for uncomplicated triplets at ~35 weeks.\n return { startDay: day(35, 0), endDay: day(35, 6), source: 'NICE-NG137' };\n }\n\n // Twins. `unknown` is managed as monochorionic-diamniotic.\n const effective: Chorionicity =\n chorionicity === 'unknown' ? 'monochorionic-diamniotic' : chorionicity;\n\n if (guideline === 'acog') {\n switch (effective) {\n case 'dichorionic-diamniotic':\n return {\n startDay: day(38, 0),\n endDay: day(38, 6),\n source: 'ACOG-PB231',\n };\n case 'monochorionic-diamniotic':\n return {\n startDay: day(36, 0),\n endDay: day(37, 6),\n source: 'ACOG-PB231',\n };\n case 'monochorionic-monoamniotic':\n return {\n startDay: day(32, 0),\n endDay: day(34, 0),\n source: 'ACOG-PB231',\n };\n }\n }\n\n // NICE NG137 (default).\n switch (effective) {\n case 'dichorionic-diamniotic':\n return { startDay: day(37, 0), endDay: day(37, 6), source: 'NICE-NG137' };\n case 'monochorionic-diamniotic':\n return { startDay: day(36, 0), endDay: day(36, 6), source: 'NICE-NG137' };\n case 'monochorionic-monoamniotic':\n return { startDay: day(32, 0), endDay: day(33, 6), source: 'NICE-NG137' };\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Ultrasound (CRL) redating — ACOG Committee Opinion 700 */\n/* */\n/* A first-trimester crown-rump length gives a gestational age via */\n/* Robinson–Fleming. When it disagrees with the LMP by more than the */\n/* ACOG CO 700 threshold (which widens with gestation), the ultrasound */\n/* estimate replaces the LMP dating. Below threshold, the LMP stands. */\n/* The returned `ecoDiffDays` mirrors the server-side `eco_diff_days` */\n/* offset so the kit and the editor-actions backend can be reconciled. */\n/* ------------------------------------------------------------------ */\n\n/** Robinson–Fleming dating is validated for CRL 45–84 mm. */\nexport const CRL_DATING_MIN_MM = 45;\nexport const CRL_DATING_MAX_MM = 84;\n\n/** Gestational age in days from a crown-rump length (mm), Robinson–Fleming. */\nexport function crlToGestationalAgeDays(crlMm: number): number {\n // GA(days) = 8.052·√(CRL·1.037) + 23.73\n return 8.052 * Math.sqrt(crlMm * 1.037) + 23.73;\n}\n\n/**\n * ACOG CO 700 redating threshold (in days) for a given GA-by-LMP: re-date the\n * EDD to the ultrasound estimate only when the discrepancy EXCEEDS this.\n */\nexport function redatingThresholdDays(gaByLmpDays: number): number {\n if (gaByLmpDays <= day(8, 6)) return 5; // ≤ 8+6\n if (gaByLmpDays <= day(15, 6)) return 7; // 9+0 – 15+6\n if (gaByLmpDays <= day(21, 6)) return 10; // 16+0 – 21+6\n if (gaByLmpDays <= day(27, 6)) return 14; // 22+0 – 27+6\n return 21; // ≥ 28+0 (with a growth-restriction caveat the UI should note)\n}\n\nexport interface CrlRedatingInput {\n /** Reported first day of the last menstrual period. */\n lmp: Date;\n /** Date the ultrasound CRL was measured. */\n scanDate: Date;\n /** Crown-rump length, mm. */\n crlMm: number;\n}\n\nexport interface CrlRedatingResult {\n /** Notional LMP (GA day 0) after the rule — the ultrasound's or the original. */\n gestationalStart: Date;\n /** Whether the ultrasound estimate replaced the LMP dating. */\n redated: boolean;\n /** |GA-by-LMP − GA-by-CRL| at the scan, in days. */\n discrepancyDays: number;\n /** The ACOG CO 700 threshold (days) that applied. */\n thresholdDays: number;\n /** CRL − LMP dating, in days (+ = fetus ahead of dates). Server `eco_diff_days`. */\n ecoDiffDays: number;\n /** Whether the CRL is within the 45–84 mm dating-validity window. */\n crlInRange: boolean;\n}\n\n/** Apply the ACOG CO 700 CRL-redating rule to an LMP. */\nexport function redateByCrl(input: CrlRedatingInput): CrlRedatingResult {\n const gaByLmpDays = differenceInCalendarDays(input.scanDate, input.lmp);\n const gaByCrlDays = Math.round(crlToGestationalAgeDays(input.crlMm));\n const discrepancyDays = Math.abs(gaByLmpDays - gaByCrlDays);\n const thresholdDays = redatingThresholdDays(gaByLmpDays);\n const redated = discrepancyDays > thresholdDays;\n return {\n gestationalStart: redated\n ? subDays(input.scanDate, gaByCrlDays)\n : input.lmp,\n redated,\n discrepancyDays,\n thresholdDays,\n ecoDiffDays: gaByCrlDays - gaByLmpDays,\n crlInRange:\n input.crlMm >= CRL_DATING_MIN_MM && input.crlMm <= CRL_DATING_MAX_MM,\n };\n}\n","/* ------------------------------------------------------------------ */\n/* Antenatal schedule — pure, framework-free, clinically cited. */\n/* */\n/* Given a gestational start (GA day 0 = notional LMP, from */\n/* `obstetrics.ts`), resolves the time-sensitive antenatal exams and */\n/* screenings to absolute date windows with a past / current / upcoming */\n/* status. The schedule is locale-configurable because guidelines */\n/* genuinely diverge (e.g. the anomaly scan is 19+0–21+6 in Italy but */\n/* 18+0–20+6 in the UK), and conditional items (anti-D, OGTT tier, */\n/* CVS/amnio) are opt-in so a patient is never shown every test. */\n/* */\n/* Every window carries a `source` citation key so the UI can show */\n/* provenance and a clinician can audit the data. Windows are NOT */\n/* ported from the original Metricare app — its constants carry a */\n/* documented 2-week-late dating shift (the first-trimester screening */\n/* rendered after its window had closed). These are the guideline */\n/* windows, anchored to the kit's correct `computeDueDate` maths. */\n/* */\n/* Sources (citation keys): */\n/* SIEOG-2021 — SIEOG ministerial ultrasound guidelines 2021 (IT) */\n/* ISS — ISS 'Gravidanza fisiologica' / LEA (IT) */\n/* SID-AMD — SID-AMD/ISS gestational-diabetes screening (IT) */\n/* ACOG-CO700 — ACOG Committee Opinion 700 (EDD methods) */\n/* NICE-NG201 — NICE NG201 routine antenatal care (UK) */\n/* NICE-NG137 — NICE NG137 twin & triplet pregnancy (UK) */\n/* ISUOG-2025 — ISUOG twin-pregnancy ultrasound guidelines 2025 */\n/* ------------------------------------------------------------------ */\n\nimport { addDays, differenceInCalendarDays } from 'date-fns';\nimport {\n plannedBirthWindow,\n type Plurality,\n type Chorionicity,\n type BirthGuideline,\n} from './obstetrics';\n\nexport type AntenatalCategory =\n | 'scan'\n | 'screening'\n | 'diagnostic'\n | 'lab'\n | 'prophylaxis'\n | 'milestone';\n\n/** Which national schedule to resolve. Italy is the default market. */\nexport type ScheduleLocale = 'it' | 'uk' | 'international';\n\n/** Status of a window relative to the reference date (keyed off its end). */\nexport type AntenatalStatus = 'past' | 'current' | 'upcoming';\n\n/** Gestational-diabetes risk tier (drives which OGTT window applies). */\nexport type GdmRisk = 'high' | 'medium';\n\n/** A clinical condition gating whether an event applies to a pregnancy. */\nexport type AntenatalCondition =\n | 'rh-negative'\n | 'gdm-high'\n | 'gdm-medium'\n | 'on-indication';\n\nexport interface AntenatalEvent {\n /** Stable key → i18n lookup `antenatalSchedule.event.<key>`. */\n key: string;\n category: AntenatalCategory;\n /** Window start as GA days from gestationalStart (week*7 + day). Inclusive. */\n startDay: number;\n /** Window end as GA days. Inclusive. Equals `startDay` for single dates. */\n endDay: number;\n /** Restrict to these pluralities (omit ⇒ applies to all). */\n plurality?: Plurality[];\n /** Restrict to these chorionicities (omit ⇒ any). */\n chorionicity?: Chorionicity[];\n /** Gate behind a clinical condition (omit ⇒ always applies). */\n condition?: AntenatalCondition;\n /** Citation key for provenance display. */\n source: string;\n /** Interpolation values for the event's i18n string (e.g. surveillance cadence). */\n meta?: Record<string, string | number>;\n}\n\nexport interface ResolvedAntenatalEvent extends AntenatalEvent {\n /** Absolute window start date. */\n start: Date;\n /** Absolute window end date (=== `start` for a single-date event). */\n end: Date;\n /** True when the event is a single calendar date, not a range. */\n single: boolean;\n /** Status relative to the reference date, keyed off the window end. */\n status: AntenatalStatus;\n /** Reference date is within `nearDays` before the window end. */\n near: boolean;\n}\n\nexport interface AntenatalScheduleOptions {\n /** Reference date for status. Defaults to the host's current date. */\n today?: Date;\n /** National schedule. Defaults to `'it'`. */\n schedule?: ScheduleLocale;\n /** Number of fetuses. Defaults to `'singleton'`. */\n plurality?: Plurality;\n /** Placentation, for multiples. Defaults to `'unknown'`. */\n chorionicity?: Chorionicity;\n /** Surface the anti-D prophylaxis event (Rh-negative, non-sensitised). */\n rhNegative?: boolean;\n /** Surface the matching OGTT window for the patient's GDM risk tier. */\n gdmRisk?: GdmRisk;\n /** Include `on-indication` diagnostics (CVS, amnio, NIPT). Default false. */\n includeOnIndication?: boolean;\n /** Planned-birth guideline for multiples. Defaults to `'nice'`. */\n birthGuideline?: BirthGuideline;\n /** Days before a window's end still counted as `current`. Default 14. */\n nearDays?: number;\n}\n\n/** Gestational-age days from a week + day pair (e.g. `ga(13, 6)` → 97). */\nconst ga = (week: number, day = 0): number => week * 7 + day;\n\n/* ------------------------------------------------------------------ */\n/* Schedule data — one table per locale. */\n/* Common events are defined once and reused; only the windows that */\n/* genuinely diverge between locales are overridden. */\n/* ------------------------------------------------------------------ */\n\n/**\n * First-trimester dating scan + nuchal translucency + combined/bi-test.\n * NT is only measurable at CRL 45–84 mm, which is the 11+0–13+6 window;\n * the combined-test bloods (PAPP-A, free β-hCG) share it. (UK opens it a\n * touch later, 11+2–14+1, anchored to NICE's CRL band.)\n */\nconst datingNt = (locale: ScheduleLocale): AntenatalEvent =>\n locale === 'uk'\n ? {\n key: 'dating-nt',\n category: 'screening',\n startDay: ga(11, 2),\n endDay: ga(14, 1),\n source: 'NICE-NG201',\n }\n : {\n key: 'dating-nt',\n category: 'screening',\n startDay: ga(11, 0),\n endDay: ga(13, 6),\n source: 'SIEOG-2021',\n };\n\n/** NIPT / cell-free DNA — earliest 10+0; co-timed with the combined test. */\nconst nipt: AntenatalEvent = {\n key: 'nipt',\n category: 'screening',\n startDay: ga(10, 0),\n endDay: ga(13, 6),\n condition: 'on-indication',\n source: 'ACOG-CO700',\n};\n\n/** Chorionic villus sampling — never before 10–11w (limb-reduction risk). */\nconst cvs: AntenatalEvent = {\n key: 'cvs',\n category: 'diagnostic',\n startDay: ga(11, 0),\n endDay: ga(13, 6),\n condition: 'on-indication',\n source: 'ISS',\n};\n\n/** Amniocentesis — from 15+0 (typically 15–18w). */\nconst amnio: AntenatalEvent = {\n key: 'amnio',\n category: 'diagnostic',\n startDay: ga(15, 0),\n endDay: ga(18, 0),\n condition: 'on-indication',\n source: 'ISS',\n};\n\n/** Second-trimester anomaly / morphology scan — the key locale divergence. */\nconst morphology = (locale: ScheduleLocale): AntenatalEvent => {\n if (locale === 'uk') {\n return {\n key: 'morphology',\n category: 'scan',\n startDay: ga(18, 0),\n endDay: ga(20, 6),\n source: 'NICE-NG201',\n };\n }\n if (locale === 'international') {\n return {\n key: 'morphology',\n category: 'scan',\n startDay: ga(18, 0),\n endDay: ga(22, 0),\n source: 'ACOG-CO700',\n };\n }\n return {\n key: 'morphology',\n category: 'scan',\n startDay: ga(19, 0),\n endDay: ga(21, 6),\n source: 'SIEOG-2021',\n };\n};\n\n/**\n * Third-trimester growth scan — `on-indication` everywhere: not routine in\n * the Italian low-risk pathway (ISS uses symphysis-fundal height from 24w);\n * NICE/ACOG also reserve late scans for indications in low-risk pregnancies.\n */\nconst growth: AntenatalEvent = {\n key: 'growth',\n category: 'scan',\n startDay: ga(30, 0),\n endDay: ga(33, 6),\n condition: 'on-indication',\n source: 'SIEOG-2021',\n};\n\n/** OGTT 75 g, high-risk tier (BMI ≥ 30 / prior GDM / fasting 100–125). */\nconst ogttHigh: AntenatalEvent = {\n key: 'ogtt-high',\n category: 'lab',\n startDay: ga(16, 0),\n endDay: ga(18, 6),\n condition: 'gdm-high',\n source: 'SID-AMD',\n};\n\n/** OGTT 75 g, medium-risk tier (≥ 1 of: family hx, BMI ≥ 25, age ≥ 35 …). */\nconst ogttMedium: AntenatalEvent = {\n key: 'ogtt-medium',\n category: 'lab',\n startDay: ga(24, 0),\n endDay: ga(28, 6),\n condition: 'gdm-medium',\n source: 'SID-AMD',\n};\n\n/** Group-B streptococcus vagino-rectal swab. */\nconst gbs = (locale: ScheduleLocale): AntenatalEvent =>\n locale === 'it'\n ? {\n key: 'gbs',\n category: 'lab',\n startDay: ga(36, 0),\n endDay: ga(37, 6),\n source: 'ISS',\n }\n : {\n // CDC / legacy international protocols open a week earlier.\n key: 'gbs',\n category: 'lab',\n startDay: ga(35, 0),\n endDay: ga(37, 6),\n source: 'NICE-NG201',\n };\n\n/** Routine antenatal anti-D prophylaxis for non-sensitised Rh(D)-neg women. */\nconst antiD: AntenatalEvent = {\n key: 'anti-d',\n category: 'prophylaxis',\n startDay: ga(28, 0),\n endDay: ga(28, 0),\n condition: 'rh-negative',\n source: 'ISS',\n};\n\n/**\n * Term threshold (37+0) — singletons only. Multiples are delivered earlier\n * (see `plannedBirthWindow`), so a 37-week \"term\" milestone would fall after\n * their recommended birth window and read as clinically contradictory.\n */\nconst term: AntenatalEvent = {\n key: 'term',\n category: 'milestone',\n startDay: ga(37, 0),\n endDay: ga(37, 0),\n plurality: ['singleton'],\n source: 'ACOG-CO700',\n};\n\n/** Estimated due date (40+0) — singleton only; twins use a birth window. */\nconst edd: AntenatalEvent = {\n key: 'edd',\n category: 'milestone',\n startDay: ga(40, 0),\n endDay: ga(40, 0),\n plurality: ['singleton'],\n source: 'ACOG-CO700',\n};\n\n/**\n * Chorionicity + amnionicity determination — twins/triplets only, at the\n * first-trimester scan (before 13+6 / CRL 45–84 mm). If presentation is\n * later, determine at the earliest opportunity.\n */\nconst chorionicityDetermination: AntenatalEvent = {\n key: 'chorionicity',\n category: 'scan',\n startDay: ga(11, 2),\n endDay: ga(14, 1),\n plurality: ['twin', 'triplet'],\n source: 'ISUOG-2025',\n};\n\n/** Build the ordered base event list for a locale (pre-filtering). */\nfunction baseEvents(locale: ScheduleLocale): AntenatalEvent[] {\n return [\n datingNt(locale),\n nipt,\n cvs,\n chorionicityDetermination,\n amnio,\n morphology(locale),\n ogttHigh,\n growth,\n ogttMedium,\n term,\n gbs(locale),\n antiD,\n edd,\n ];\n}\n\n/**\n * Extra events for a multiple pregnancy: increased ultrasound surveillance\n * (cadence by chorionicity) and the planned-birth window (which replaces the\n * singleton EDD). Monochorionic twins are scanned every 2 weeks from 16w to\n * catch TTTS; dichorionic every 4 weeks from 20w. `unknown` chorionicity is\n * managed as monochorionic (the higher-risk default).\n */\nfunction multipleEvents(\n plurality: Plurality,\n chorionicity: Chorionicity,\n guideline: BirthGuideline,\n): AntenatalEvent[] {\n if (plurality === 'singleton') return [];\n\n const isDichorionic = chorionicity === 'dichorionic-diamniotic';\n const everyWeeks = isDichorionic ? 4 : 2;\n const fromWeek = isDichorionic ? 20 : 16;\n const birth = plannedBirthWindow(plurality, chorionicity, guideline);\n\n const events: AntenatalEvent[] = [\n {\n key: 'surveillance',\n category: 'scan',\n startDay: ga(fromWeek, 0),\n // Runs until the planned-birth window opens (fallback 36w if none).\n endDay: birth ? birth.startDay : ga(36, 0),\n source: isDichorionic ? 'NICE-NG137' : 'ISUOG-2025',\n meta: { everyWeeks, fromWeek },\n },\n ];\n\n if (birth) {\n events.push({\n key: 'birth',\n category: 'milestone',\n startDay: birth.startDay,\n endDay: birth.endDay,\n source: birth.source,\n });\n }\n\n return events;\n}\n\n/* ------------------------------------------------------------------ */\n/* Resolution */\n/* ------------------------------------------------------------------ */\n\n/** Does an event apply, given the pregnancy's plurality/chorionicity/conds? */\nfunction eventApplies(\n event: AntenatalEvent,\n opts: Required<\n Pick<AntenatalScheduleOptions, 'plurality' | 'chorionicity'>\n > & {\n rhNegative: boolean;\n gdmRisk?: GdmRisk;\n includeOnIndication: boolean;\n },\n): boolean {\n if (event.plurality && !event.plurality.includes(opts.plurality)) {\n return false;\n }\n if (event.chorionicity && !event.chorionicity.includes(opts.chorionicity)) {\n return false;\n }\n switch (event.condition) {\n case 'rh-negative':\n return opts.rhNegative;\n case 'gdm-high':\n return opts.gdmRisk === 'high';\n case 'gdm-medium':\n return opts.gdmRisk === 'medium';\n case 'on-indication':\n return opts.includeOnIndication;\n default:\n return true;\n }\n}\n\nfunction statusFor(\n start: Date,\n end: Date,\n today: Date,\n nearDays: number,\n): { status: AntenatalStatus; near: boolean } {\n const daysUntilStart = differenceInCalendarDays(start, today);\n const daysUntilEnd = differenceInCalendarDays(end, today);\n // Window already closed.\n if (daysUntilEnd < 0) return { status: 'past', near: false };\n // Open now (start ≤ today ≤ end) → current, and always worth flagging.\n if (daysUntilStart <= 0) return { status: 'current', near: true };\n // Not yet open → upcoming; \"near\" if it opens within nearDays.\n return { status: 'upcoming', near: daysUntilStart <= nearDays };\n}\n\n/**\n * Resolve the antenatal schedule for a pregnancy to dated, status-tagged\n * windows, ordered by start date (then end date). Pure: the only clock is\n * `opts.today` (defaults to a fresh `Date`).\n */\nexport function computeAntenatalSchedule(\n gestationalStart: Date,\n opts: AntenatalScheduleOptions = {},\n): ResolvedAntenatalEvent[] {\n const {\n today = new Date(),\n schedule = 'it',\n plurality = 'singleton',\n chorionicity = 'unknown',\n rhNegative = false,\n gdmRisk,\n includeOnIndication = false,\n birthGuideline = 'nice',\n nearDays = 14,\n } = opts;\n\n return [\n ...baseEvents(schedule),\n ...multipleEvents(plurality, chorionicity, birthGuideline),\n ]\n .filter((event) =>\n eventApplies(event, {\n plurality,\n chorionicity,\n rhNegative,\n gdmRisk,\n includeOnIndication,\n }),\n )\n .map((event): ResolvedAntenatalEvent => {\n const start = addDays(gestationalStart, event.startDay);\n const end = addDays(gestationalStart, event.endDay);\n const { status, near } = statusFor(start, end, today, nearDays);\n return {\n ...event,\n start,\n end,\n single: event.startDay === event.endDay,\n status,\n near,\n };\n })\n .sort((a, b) => {\n const byStart = a.startDay - b.startDay;\n return byStart !== 0 ? byStart : a.endDay - b.endDay;\n });\n}\n","/* ------------------------------------------------------------------ */\n/* AntenatalScheduleTimeline — the presentational list of resolved */\n/* antenatal windows, shared by the `showSchedule` appendix on */\n/* GestationalAgeCalculator and DueDateCalculator. Pure display: it takes */\n/* already-resolved events and renders the Card + the sr-only now-due */\n/* summary. No inputs, no state, no maths. */\n/* ------------------------------------------------------------------ */\n\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Card } from '../card';\nimport { Badge } from '../badge';\nimport type { IconKey, InsertCardField } from './insert-result';\nimport type {\n ResolvedAntenatalEvent,\n AntenatalStatus,\n AntenatalCategory,\n} from './antenatal-schedule';\n\n/** Status → on-screen Badge variant. `near` upcoming items borrow `warning`. */\nfunction statusBadgeVariant(\n status: AntenatalStatus,\n near: boolean,\n): 'neutral' | 'info' | 'warning' {\n if (status === 'past') return 'neutral';\n if (status === 'current') return 'warning';\n return near ? 'warning' : 'info';\n}\n\n/** Compact gestational-age label for a day offset, e.g. 97 → \"13+6\". */\nfunction gaLabel(days: number): string {\n return `${Math.floor(days / 7)}+${days % 7}`;\n}\n\n/** Each schedule category maps to one of the inserted-card glyph keys. */\nconst CATEGORY_ICON: Record<AntenatalCategory, IconKey> = {\n scan: 'activity',\n screening: 'activity',\n diagnostic: 'activity',\n lab: 'droplets',\n prophylaxis: 'heart',\n milestone: 'calendar',\n};\n\n/** Minimal translator shape this module needs (matches react-i18next's `t`). */\ntype Translate = (key: string, opts?: Record<string, unknown>) => string;\n\n/** Localised \"label · range\" for one event (e.g. for the sr-only summary). */\nfunction eventLabelFor(event: ResolvedAntenatalEvent, t: Translate): string {\n return t(`antenatalSchedule.event.${event.key}`, event.meta ?? {});\n}\n\n/**\n * Build the inserted-card rows for a resolved schedule, so a host calculator's\n * single Insert button can carry the schedule in its payload (rather than a\n * second Insert button on the schedule card). One row per event: a\n * category-tinted glyph, the localised label, and the date range.\n */\nexport function buildScheduleInsertFields(\n events: ResolvedAntenatalEvent[],\n t: Translate,\n formatDate: (date: Date) => string,\n): InsertCardField[] {\n return events.map((event) => ({\n icon: CATEGORY_ICON[event.category],\n label: eventLabelFor(event, t),\n value: event.single\n ? formatDate(event.start)\n : `${formatDate(event.start)} – ${formatDate(event.end)}`,\n }));\n}\n\nexport interface AntenatalScheduleTimelineProps {\n /** Resolved schedule events (from `computeAntenatalSchedule`). */\n events: ResolvedAntenatalEvent[];\n}\n\nexport function AntenatalScheduleTimeline({\n events,\n}: AntenatalScheduleTimelineProps) {\n const { t, i18n } = useTranslation();\n\n const dateFormatter = useMemo(\n () => new Intl.DateTimeFormat(i18n.language, { dateStyle: 'medium' }),\n [i18n.language],\n );\n\n const eventLabel = (event: ResolvedAntenatalEvent): string =>\n eventLabelFor(event, t);\n\n const formatRange = (event: ResolvedAntenatalEvent): string =>\n event.single\n ? dateFormatter.format(event.start)\n : `${dateFormatter.format(event.start)} – ${dateFormatter.format(\n event.end,\n )}`;\n\n // No own live region: this timeline is always embedded in a host calculator\n // that already owns a `role=\"status\"` result announcement, so a second one\n // here would double-announce. The schedule is fully present in the DOM\n // (labelled list + per-row status Badge) for assistive tech to browse.\n return (\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('antenatalSchedule.scheduleLabel')}\n </span>\n <ul className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {events.map((event) => (\n <li\n key={event.key}\n data-status={event.status}\n className=\"ds:flex ds:flex-wrap ds:items-start ds:justify-between ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-xs)] ds:border-b ds:border-border ds:pb-[var(--spacing-sm)] ds:last:border-b-0 ds:last:pb-0\"\n >\n <span className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-body ds:text-foreground\">\n {eventLabel(event)}\n </span>\n <span className=\"type-meta ds:text-muted-foreground\">\n {t(`antenatalSchedule.category.${event.category}`)} ·{' '}\n {gaLabel(event.startDay)}\n {event.single ? '' : ` – ${gaLabel(event.endDay)}`} ·{' '}\n {t(`antenatalSchedule.source.${event.source}`)}\n {event.condition === 'on-indication'\n ? ` · ${t('antenatalSchedule.onIndication')}`\n : ''}\n </span>\n </span>\n <span className=\"ds:flex ds:flex-col ds:items-end ds:gap-[var(--spacing-2xs)] ds:text-end\">\n <span className=\"type-body ds:text-foreground\">\n {formatRange(event)}\n </span>\n <Badge variant={statusBadgeVariant(event.status, event.near)}>\n {event.status === 'upcoming' && event.near\n ? t('antenatalSchedule.near')\n : t(`antenatalSchedule.status.${event.status}`)}\n </Badge>\n </span>\n </li>\n ))}\n </ul>\n <p className=\"type-meta ds:text-muted-foreground\">\n {t('antenatalSchedule.disclaimer')}\n </p>\n </Card.Body>\n </Card>\n );\n}\n"],"names":["GESTATION_DAYS","CONCEPTION_OFFSET_DAYS","TERM_FROM_CONCEPTION_DAYS","DEFAULT_CYCLE_LENGTH","trimesterForWeeks","totalDays","weeks","computeDueDate","input","today","method","date","gestationalStart","dueDate","cycle","addDays","subDays","embryo","conceptionDate","differenceInCalendarDays","gestationalAge","MILESTONE_WEEKS","gestationalMilestones","week","TRIMESTER_BADGE_VARIANT","TRIMESTER_HIGHLIGHT_TOKEN","trimesterHighlightToken","trimester","day","d","plannedBirthWindow","plurality","chorionicity","guideline","effective","CRL_DATING_MIN_MM","CRL_DATING_MAX_MM","crlToGestationalAgeDays","crlMm","redatingThresholdDays","gaByLmpDays","redateByCrl","gaByCrlDays","discrepancyDays","thresholdDays","redated","ga","datingNt","locale","nipt","cvs","amnio","morphology","growth","ogttHigh","ogttMedium","gbs","antiD","term","edd","chorionicityDetermination","baseEvents","multipleEvents","isDichorionic","everyWeeks","fromWeek","birth","events","eventApplies","event","opts","statusFor","start","end","nearDays","daysUntilStart","computeAntenatalSchedule","schedule","rhNegative","gdmRisk","includeOnIndication","birthGuideline","status","near","a","b","byStart","statusBadgeVariant","gaLabel","days","CATEGORY_ICON","eventLabelFor","t","buildScheduleInsertFields","formatDate","AntenatalScheduleTimeline","i18n","useTranslation","dateFormatter","useMemo","eventLabel","formatRange","jsx","Card","jsxs","Badge"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { A as P } from "./avatar-BNQNhoyL.js";
6
6
  import { B as i } from "./badge-DCOqV9mI.js";
7
7
  import { T as J } from "./tag-3wgkwwDB.js";
8
8
  import { T as Q } from "./timestamp-BV2lC-wV.js";
9
- import { T as X } from "./transaction-chip-B6iWoVmU.js";
9
+ import { T as X } from "./transaction-chip-DJCstquX.js";
10
10
  import { i as Z } from "./is-safe-url-DkETxeHz.js";
11
11
  import { V as aa } from "./video-BheNGvsu.js";
12
12
  import { M as ra } from "./map-pin-BaY37-Km.js";
@@ -308,4 +308,4 @@ ga.displayName = "AppointmentCard";
308
308
  export {
309
309
  ga as A
310
310
  };
311
- //# sourceMappingURL=appointment-card-Cy4FOkGP.js.map
311
+ //# sourceMappingURL=appointment-card-DgKI5QKD.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"appointment-card-Cy4FOkGP.js","sources":["../../node_modules/lucide-react/dist/esm/icons/armchair.mjs","../../node_modules/lucide-react/dist/esm/icons/clipboard-plus.mjs","../../src/components/appointment-card/appointment-card.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.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.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M19 9V6a2 2 0 0 0-2-2H7a2 2 0 0 0-2 2v3\", key: \"irtipd\" }],\n [\n \"path\",\n {\n d: \"M3 16a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5a2 2 0 0 0-4 0v1.5a.5.5 0 0 1-.5.5h-9a.5.5 0 0 1-.5-.5V11a2 2 0 0 0-4 0z\",\n key: \"1qyhux\"\n }\n ],\n [\"path\", { d: \"M5 18v2\", key: \"ppbyun\" }],\n [\"path\", { d: \"M19 18v2\", key: \"gy7782\" }]\n];\nconst Armchair = createLucideIcon(\"armchair\", __iconNode);\n\nexport { __iconNode, Armchair as default };\n//# sourceMappingURL=armchair.mjs.map\n","/**\n * @license lucide-react v1.22.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.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"8\", height: \"4\", x: \"8\", y: \"2\", rx: \"1\", ry: \"1\", key: \"tgr4d6\" }],\n [\n \"path\",\n {\n d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\",\n key: \"116196\"\n }\n ],\n [\"path\", { d: \"M9 14h6\", key: \"159ibu\" }],\n [\"path\", { d: \"M12 17v-6\", key: \"1y8rbf\" }]\n];\nconst ClipboardPlus = createLucideIcon(\"clipboard-plus\", __iconNode);\n\nexport { __iconNode, ClipboardPlus as default };\n//# sourceMappingURL=clipboard-plus.mjs.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n Armchair,\n ChevronRight,\n ClipboardPlus,\n Globe,\n MapPin,\n Star,\n Video,\n} from 'lucide-react';\nimport { Avatar } from '../avatar/avatar';\nimport { Badge } from '../badge/badge';\nimport { Tag } from '../tag/tag';\nimport { Timestamp } from '../timestamp/timestamp';\nimport { TransactionChip } from '../transaction-chip/transaction-chip';\nimport {\n appointmentStateBadge,\n colorIdToToken,\n colorIdToAvatarToken,\n isSafeEntityUrl,\n} from '../_shared/entity-card';\nimport type { AppointmentState } from '../_shared/entity-card';\n\n/*\n * Closed colour-dot class map. `colorIdToToken` resolves the operator's\n * numeric colour id to one of a fixed set of palette tokens; the operator\n * dot needs a *static* Tailwind class for each so the compiler can emit it\n * (dynamic `ds:bg-[…]` strings are not seen by the JIT). The keys mirror the\n * exact token strings the shared helper returns.\n */\nconst OPERATOR_DOT_CLASS: Record<string, string> = {\n 'var(--color-violet-500)': 'ds:bg-[var(--color-violet-500)]',\n 'var(--color-purple-500)': 'ds:bg-[var(--color-purple-500)]',\n 'var(--color-magenta-500)': 'ds:bg-[var(--color-magenta-500)]',\n 'var(--color-blue-500)': 'ds:bg-[var(--color-blue-500)]',\n 'var(--color-green-500)': 'ds:bg-[var(--color-green-500)]',\n 'var(--color-red-500)': 'ds:bg-[var(--color-red-500)]',\n 'var(--color-yellow-500)': 'ds:bg-[var(--color-yellow-500)]',\n 'var(--color-indigo-500)': 'ds:bg-[var(--color-indigo-500)]',\n 'var(--color-orange-500)': 'ds:bg-[var(--color-orange-500)]',\n 'var(--color-fuchsia-500)': 'ds:bg-[var(--color-fuchsia-500)]',\n 'var(--color-grey-700)': 'ds:bg-[var(--color-grey-700)]',\n};\n\nfunction operatorDotClass(colorId: number | string | undefined): string {\n return (\n OPERATOR_DOT_CLASS[colorIdToToken(colorId)] ??\n 'ds:bg-[var(--color-grey-700)]'\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* AppointmentCard */\n/* */\n/* Single-row appointment surface — sibling of AgendaCard, but richer: */\n/* leading timestamp, operator + patient avatars with the operator */\n/* colour dot, a lifecycle-state Badge (announced by label, never colour */\n/* alone), treatment / tooth Tags, and an optional advance-deposit */\n/* TransactionChip. State→Badge-variant + colour-id→token + URL-safety */\n/* come from the shared `_shared/entity-card` helpers. */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `appointmentCard.*` namespace (plus shared `financial.*` for money). */\n/* -------------------------------------------------------------------- */\n\n// Back-compat / one-stop import — the URL guard lives in the shared helper.\nexport { isSafeEntityUrl as isSafeAppointmentUrl } from '../_shared/is-safe-url';\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\n/** Appointment delivery channel. */\nexport type AppointmentType = 'inPractice' | 'telehealth';\n\n/** First-visit tri-state flag. */\nexport type AppointmentFirstVisit = 'yes' | 'no' | 'unknown';\n\n/** Operator (clinician) summary — name + optional palette colour id. */\nexport interface AppointmentOperator {\n /** Operator display name — drives the avatar initials + accessible name. */\n name: string;\n /** Numeric palette colour id, resolved to a kit token for the colour dot. */\n colorId?: number | string;\n}\n\n/** Patient summary — identity only, drives the avatar. */\nexport interface AppointmentPatient {\n /** Patient display name. */\n name: string;\n /** Optional avatar image URL. */\n avatarUrl?: string;\n}\n\n/** One treatment line within the appointment. */\nexport interface AppointmentTreatment {\n /** Localised care / treatment name. */\n careName: string;\n /** Optional tooth elements (e.g. FDI ids) the treatment targets. */\n elements?: string[];\n}\n\n/** Booking-reason metadata captured at online-booking time. */\nexport interface AppointmentBookingReason {\n /** Localised booking-reason description. */\n description: string;\n /** Expected duration in minutes. */\n durationMin?: number;\n /** Advance / deposit amount in cents (non-negative). */\n advanceAmountCents?: number;\n /** Localised specialty label. */\n specialty?: string;\n}\n\n/** Boolean appointment flags surfaced as chips / indicators. */\nexport interface AppointmentFlags {\n bookedOnline?: boolean;\n noPatientAssigned?: boolean;\n highlightedAnamnesis?: boolean;\n billable?: boolean;\n}\n\nexport interface AppointmentItem {\n /** Stable appointment identifier. */\n id: string;\n /** ISO-8601 start instant. */\n startIso: string;\n /** Duration in minutes. */\n durationMin: number;\n /** Lifecycle state — drives the Badge variant + label. */\n state: AppointmentState;\n /** Delivery channel — drives the leading type glyph. */\n type: AppointmentType;\n /** First-visit flag. */\n firstVisit?: AppointmentFirstVisit;\n /** Assigned operator. */\n operator?: AppointmentOperator;\n /** Chair / room label — surfaced as a chip. */\n chair?: string;\n /**\n * The care plan this appointment belongs to, when any — surfaced as a chip\n * (`Care plan {number}`). `url` is the deep link the consumer may use for\n * navigation; the chip itself is non-interactive so it never nests an anchor\n * inside the row's own stretched link.\n */\n carePlan?: { number: string; url?: string };\n /** Patient identity. */\n patient?: AppointmentPatient;\n /** Treatment lines. */\n treatments?: AppointmentTreatment[];\n /** Online booking-reason metadata. */\n bookingReason?: AppointmentBookingReason;\n /** Boolean flags. */\n flags?: AppointmentFlags;\n /** Optional deep link — when present (and safe) the row renders as an anchor. */\n url?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* CVA — row */\n/* -------------------------------------------------------------------- */\n\nconst appointmentCardVariants = cva(\n [\n 'ds:relative ds:flex ds:items-start ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:text-start ds:group',\n 'ds:bg-[var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n 'ds:forced-colors:border ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-sm)]',\n md: 'ds:p-[var(--spacing-md)]',\n },\n interactive: {\n true: 'ds:hover:bg-[color:var(--muted)]/40 ds:cursor-pointer',\n false: '',\n },\n surface: {\n // `flat` (default) is the chrome-less row used inside a bordered\n // AppointmentTray. `elevated` gives each row its own card chrome\n // (border + shadow) for use directly on a rail, e.g. AppointmentTimeline.\n // Uses `--shadow-sm` (a row lift), not `--shadow-card`/`--shadow-lg`:\n // the rail's `overflow-y:auto` scroll region clips `overflow-x` at a\n // narrow gutter, so a wide 30px-blur shadow gets a hard-edged clip.\n flat: '',\n elevated:\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2 ds:shadow-[var(--shadow-sm)]',\n },\n },\n defaultVariants: {\n size: 'sm',\n interactive: false,\n surface: 'flat',\n },\n },\n);\n\nconst stretchedLinkClass = [\n 'ds:focus-visible:outline-none',\n \"ds:after:content-[''] ds:after:absolute ds:after:inset-0 ds:after:rounded-[var(--radius-md)]\",\n 'ds:after:pointer-events-auto',\n 'ds:focus-visible:after:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:after:outline-solid',\n 'ds:focus-visible:after:outline-[color:var(--ring)]',\n 'ds:focus-visible:after:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:after:outline-[CanvasText]',\n].join(' ');\n\nconst TYPE_ICON: Record<AppointmentType, typeof MapPin> = {\n inPractice: MapPin,\n telehealth: Video,\n};\n\n/* -------------------------------------------------------------------- */\n/* Props */\n/* -------------------------------------------------------------------- */\n\nexport interface AppointmentCardProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'onClick' | 'role' | 'title'>,\n VariantProps<typeof appointmentCardVariants> {\n /** The appointment to render. */\n item: AppointmentItem;\n /** Visual density. */\n size?: 'sm' | 'md';\n /**\n * `'flat'` (default) — chrome-less row for use inside a bordered\n * `AppointmentTray`. `'elevated'` — each row carries its own card chrome\n * (border + shadow), for placing rows directly on a rail (AppointmentTimeline).\n */\n surface?: 'flat' | 'elevated';\n /** BCP-47 locale override for the timestamp + currency. */\n locale?: string;\n /** ISO-4217 currency code for the advance-deposit chip. Defaults to `EUR`. */\n currency?: string;\n /**\n * Show the patient identity (avatar + name as the row title). Default `true`.\n * Set `false` in single-patient surfaces (e.g. a patient's own\n * `AppointmentTimeline`) where repeating the name is redundant — the row then\n * leads with the operator as its title, falling back to a generic label.\n */\n showPatient?: boolean;\n /** Fires when the row is activated. */\n onActivate?: (item: AppointmentItem) => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const AppointmentCard = forwardRef<HTMLDivElement, AppointmentCardProps>(\n (\n {\n item,\n size = 'sm',\n surface = 'flat',\n locale,\n currency = 'EUR',\n showPatient = true,\n onActivate,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const interactive = !!onActivate;\n const hasSafeUrl = !!item.url && isSafeEntityUrl(item.url);\n\n const patientName = item.patient?.name ?? t('appointmentCard.noPatient');\n const operatorName = item.operator?.name;\n const stateLabel = t(`appointmentCard.state.${item.state}`);\n\n const avatarSize = size === 'md' ? 'md' : 'sm';\n const TypeIcon = TYPE_ICON[item.type];\n\n // In single-patient context the patient name is redundant, so the row leads\n // with the operator (the \"who am I seeing\") and falls back to a generic\n // label when no operator is set.\n const title = showPatient\n ? patientName\n : (operatorName ?? t('appointmentCard.appointment'));\n\n const ariaLabel = showPatient\n ? t('appointmentCard.itemLabel', {\n patient: patientName,\n state: stateLabel,\n })\n : t('appointmentCard.itemLabelGeneric', { title, state: stateLabel });\n\n const titleNode = (\n <span className=\"ds:min-w-0 ds:truncate type-title-item ds:text-[color:var(--foreground)]\">\n {title}\n </span>\n );\n\n let activator: ReactNode;\n if (interactive && hasSafeUrl) {\n activator = (\n <a\n href={item.url}\n aria-label={ariaLabel}\n className={stretchedLinkClass + ' ds:contents'}\n onClick={(e) => {\n if (e.defaultPrevented || e.metaKey || e.ctrlKey || e.shiftKey)\n return;\n onActivate?.(item);\n }}\n >\n {titleNode}\n </a>\n );\n } else if (interactive) {\n activator = (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n className={\n stretchedLinkClass +\n ' ds:contents ds:bg-transparent ds:border-0 ds:p-0 ds:text-start'\n }\n onClick={() => onActivate?.(item)}\n >\n {titleNode}\n </button>\n );\n } else {\n activator = titleNode;\n }\n\n // Treatment / tooth-element Tags. Each treatment becomes one Tag; the\n // tooth elements (when present) are appended to the visible label.\n const treatmentTags = (item.treatments ?? []).map((tx, index) => {\n const label =\n tx.elements && tx.elements.length > 0\n ? t('appointmentCard.treatmentWithElements', {\n care: tx.careName,\n elements: tx.elements.join(', '),\n })\n : tx.careName;\n return (\n <Tag\n key={`${tx.careName}-${index}`}\n label={label}\n variant=\"neutral\"\n fill=\"outline\"\n size=\"sm\"\n maxInlineSize=\"12rem\"\n />\n );\n });\n\n const advanceCents = item.bookingReason?.advanceAmountCents;\n const hasAdvance = typeof advanceCents === 'number' && advanceCents > 0;\n\n return (\n <div\n ref={ref}\n role=\"listitem\"\n data-component=\"appointment-card\"\n data-component-id={item.id}\n data-state={item.state}\n data-type={item.type}\n className={appointmentCardVariants({\n size,\n interactive,\n surface,\n className,\n })}\n {...rest}\n >\n {/* Leading rail: type glyph + start time + duration */}\n <span className=\"ds:flex ds:w-16 ds:shrink-0 ds:flex-col ds:items-start ds:gap-[var(--spacing-2xs)]\">\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n <TypeIcon aria-hidden=\"true\" className=\"ds:size-3.5 ds:shrink-0\" />\n <span className=\"ds:sr-only\">\n {t(`appointmentCard.type.${item.type}`)}\n </span>\n <Timestamp\n value={item.startIso}\n format=\"absolute\"\n shape=\"bare\"\n locale={locale}\n absoluteFormat={{ hour: 'numeric', minute: '2-digit' }}\n className=\"type-body-sm ds:font-medium ds:text-[color:var(--foreground)] ds:tabular-nums\"\n />\n </span>\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {t('appointmentCard.duration', { count: item.durationMin })}\n </span>\n </span>\n\n {/* Operator avatar with colour dot */}\n {operatorName ? (\n <span className=\"ds:relative ds:shrink-0\">\n <Avatar\n name={operatorName}\n color={colorIdToAvatarToken(item.operator?.colorId)}\n size={avatarSize}\n aria-hidden=\"true\"\n role=\"presentation\"\n aria-label={undefined}\n />\n <span\n aria-hidden=\"true\"\n className={\n 'ds:absolute ds:bottom-0 ds:end-0 ds:size-2.5 ds:rounded-[var(--radius-full)] ds:border ds:border-[color:var(--card)] ' +\n operatorDotClass(item.operator?.colorId)\n }\n />\n </span>\n ) : null}\n\n {/* Main content column */}\n <div className=\"ds:flex-1 ds:min-w-0 ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:items-start ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex-1 ds:min-w-0 ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {showPatient && item.patient?.avatarUrl ? (\n <Avatar\n name={patientName}\n src={item.patient.avatarUrl}\n size={avatarSize}\n className=\"ds:shrink-0\"\n aria-hidden=\"true\"\n role=\"presentation\"\n aria-label={undefined}\n />\n ) : null}\n {activator}\n </div>\n <Badge\n variant={appointmentStateBadge(item.state)}\n size=\"sm\"\n withDot\n className=\"ds:shrink-0\"\n >\n {stateLabel}\n </Badge>\n </div>\n\n {/* Meta line: operator name · specialty · first visit\n (chair moved to a chip below). When the patient is hidden the\n operator is promoted to the title, so it drops out of the meta. */}\n {(showPatient && operatorName) ||\n item.bookingReason?.specialty ||\n item.firstVisit === 'yes' ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-sm)] ds:gap-y-[var(--spacing-2xs)] type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {showPatient && operatorName ? <span>{operatorName}</span> : null}\n {item.bookingReason?.specialty ? (\n <span>{item.bookingReason.specialty}</span>\n ) : null}\n {item.firstVisit === 'yes' ? (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <Star aria-hidden=\"true\" className=\"ds:size-3 ds:shrink-0\" />\n {t('appointmentCard.firstVisit')}\n </span>\n ) : null}\n </div>\n ) : null}\n\n {/* Booking reason */}\n {item.bookingReason?.description ? (\n <span className=\"type-body-sm ds:text-[color:var(--foreground)] ds:truncate\">\n {item.bookingReason.description}\n </span>\n ) : null}\n\n {/* Treatment / tooth Tags */}\n {treatmentTags.length > 0 ? (\n <div className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-2xs)]\">\n {treatmentTags}\n </div>\n ) : null}\n\n {/* Chips: care plan · chair · flags · advance-deposit */}\n {item.carePlan ||\n item.chair ||\n item.flags?.bookedOnline ||\n item.flags?.highlightedAnamnesis ||\n hasAdvance ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {item.carePlan ? (\n <Badge\n variant=\"accentSoft\"\n size=\"sm\"\n leading={<ClipboardPlus />}\n >\n {t('appointmentCard.carePlan', {\n number: item.carePlan.number,\n })}\n </Badge>\n ) : null}\n {item.chair ? (\n <Badge variant=\"neutral\" size=\"sm\" leading={<Armchair />}>\n {t('appointmentCard.chair', { chair: item.chair })}\n </Badge>\n ) : null}\n {item.flags?.bookedOnline ? (\n <Badge variant=\"info\" size=\"sm\" leading={<Globe />}>\n {t('appointmentCard.flag.bookedOnline')}\n </Badge>\n ) : null}\n {item.flags?.highlightedAnamnesis ? (\n <Badge variant=\"warning\" size=\"sm\" withDot>\n {t('appointmentCard.flag.highlightedAnamnesis')}\n </Badge>\n ) : null}\n {hasAdvance ? (\n <TransactionChip\n state=\"to-invoice\"\n amount={(advanceCents as number) / 100}\n currency={currency}\n locale={locale}\n size=\"sm\"\n showLabel\n />\n ) : null}\n </div>\n ) : null}\n </div>\n\n {interactive ? (\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:self-center ds:text-[color:var(--muted-foreground)] ds:opacity-0 ds:transition-opacity ds:motion-reduce:transition-none ds:group-hover:opacity-100 ds:group-focus-within:opacity-100 ds:rtl:rotate-180\"\n />\n ) : null}\n </div>\n );\n },\n);\n\nAppointmentCard.displayName = 'AppointmentCard';\n"],"names":["__iconNode","Armchair","createLucideIcon","ClipboardPlus","OPERATOR_DOT_CLASS","operatorDotClass","colorId","colorIdToToken","appointmentCardVariants","cva","stretchedLinkClass","TYPE_ICON","MapPin","Video","AppointmentCard","forwardRef","item","size","surface","locale","currency","showPatient","onActivate","className","rest","ref","t","useTranslation","interactive","hasSafeUrl","isSafeEntityUrl","patientName","_a","operatorName","_b","stateLabel","avatarSize","TypeIcon","title","ariaLabel","titleNode","jsx","activator","e","treatmentTags","tx","index","label","Tag","advanceCents","_c","hasAdvance","jsxs","Timestamp","Avatar","colorIdToAvatarToken","_d","_e","_f","Badge","appointmentStateBadge","_g","_h","Star","_i","_j","_k","_l","Globe","_m","TransactionChip","ChevronRight"],"mappings":"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","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"appointment-card-DgKI5QKD.js","sources":["../../node_modules/lucide-react/dist/esm/icons/armchair.mjs","../../node_modules/lucide-react/dist/esm/icons/clipboard-plus.mjs","../../src/components/appointment-card/appointment-card.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.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.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M19 9V6a2 2 0 0 0-2-2H7a2 2 0 0 0-2 2v3\", key: \"irtipd\" }],\n [\n \"path\",\n {\n d: \"M3 16a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5a2 2 0 0 0-4 0v1.5a.5.5 0 0 1-.5.5h-9a.5.5 0 0 1-.5-.5V11a2 2 0 0 0-4 0z\",\n key: \"1qyhux\"\n }\n ],\n [\"path\", { d: \"M5 18v2\", key: \"ppbyun\" }],\n [\"path\", { d: \"M19 18v2\", key: \"gy7782\" }]\n];\nconst Armchair = createLucideIcon(\"armchair\", __iconNode);\n\nexport { __iconNode, Armchair as default };\n//# sourceMappingURL=armchair.mjs.map\n","/**\n * @license lucide-react v1.22.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.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"8\", height: \"4\", x: \"8\", y: \"2\", rx: \"1\", ry: \"1\", key: \"tgr4d6\" }],\n [\n \"path\",\n {\n d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\",\n key: \"116196\"\n }\n ],\n [\"path\", { d: \"M9 14h6\", key: \"159ibu\" }],\n [\"path\", { d: \"M12 17v-6\", key: \"1y8rbf\" }]\n];\nconst ClipboardPlus = createLucideIcon(\"clipboard-plus\", __iconNode);\n\nexport { __iconNode, ClipboardPlus as default };\n//# sourceMappingURL=clipboard-plus.mjs.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n Armchair,\n ChevronRight,\n ClipboardPlus,\n Globe,\n MapPin,\n Star,\n Video,\n} from 'lucide-react';\nimport { Avatar } from '../avatar/avatar';\nimport { Badge } from '../badge/badge';\nimport { Tag } from '../tag/tag';\nimport { Timestamp } from '../timestamp/timestamp';\nimport { TransactionChip } from '../transaction-chip/transaction-chip';\nimport {\n appointmentStateBadge,\n colorIdToToken,\n colorIdToAvatarToken,\n isSafeEntityUrl,\n} from '../_shared/entity-card';\nimport type { AppointmentState } from '../_shared/entity-card';\n\n/*\n * Closed colour-dot class map. `colorIdToToken` resolves the operator's\n * numeric colour id to one of a fixed set of palette tokens; the operator\n * dot needs a *static* Tailwind class for each so the compiler can emit it\n * (dynamic `ds:bg-[…]` strings are not seen by the JIT). The keys mirror the\n * exact token strings the shared helper returns.\n */\nconst OPERATOR_DOT_CLASS: Record<string, string> = {\n 'var(--color-violet-500)': 'ds:bg-[var(--color-violet-500)]',\n 'var(--color-purple-500)': 'ds:bg-[var(--color-purple-500)]',\n 'var(--color-magenta-500)': 'ds:bg-[var(--color-magenta-500)]',\n 'var(--color-blue-500)': 'ds:bg-[var(--color-blue-500)]',\n 'var(--color-green-500)': 'ds:bg-[var(--color-green-500)]',\n 'var(--color-red-500)': 'ds:bg-[var(--color-red-500)]',\n 'var(--color-yellow-500)': 'ds:bg-[var(--color-yellow-500)]',\n 'var(--color-indigo-500)': 'ds:bg-[var(--color-indigo-500)]',\n 'var(--color-orange-500)': 'ds:bg-[var(--color-orange-500)]',\n 'var(--color-fuchsia-500)': 'ds:bg-[var(--color-fuchsia-500)]',\n 'var(--color-grey-700)': 'ds:bg-[var(--color-grey-700)]',\n};\n\nfunction operatorDotClass(colorId: number | string | undefined): string {\n return (\n OPERATOR_DOT_CLASS[colorIdToToken(colorId)] ??\n 'ds:bg-[var(--color-grey-700)]'\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* AppointmentCard */\n/* */\n/* Single-row appointment surface — sibling of AgendaCard, but richer: */\n/* leading timestamp, operator + patient avatars with the operator */\n/* colour dot, a lifecycle-state Badge (announced by label, never colour */\n/* alone), treatment / tooth Tags, and an optional advance-deposit */\n/* TransactionChip. State→Badge-variant + colour-id→token + URL-safety */\n/* come from the shared `_shared/entity-card` helpers. */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `appointmentCard.*` namespace (plus shared `financial.*` for money). */\n/* -------------------------------------------------------------------- */\n\n// Back-compat / one-stop import — the URL guard lives in the shared helper.\nexport { isSafeEntityUrl as isSafeAppointmentUrl } from '../_shared/is-safe-url';\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\n/** Appointment delivery channel. */\nexport type AppointmentType = 'inPractice' | 'telehealth';\n\n/** First-visit tri-state flag. */\nexport type AppointmentFirstVisit = 'yes' | 'no' | 'unknown';\n\n/** Operator (clinician) summary — name + optional palette colour id. */\nexport interface AppointmentOperator {\n /** Operator display name — drives the avatar initials + accessible name. */\n name: string;\n /** Numeric palette colour id, resolved to a kit token for the colour dot. */\n colorId?: number | string;\n}\n\n/** Patient summary — identity only, drives the avatar. */\nexport interface AppointmentPatient {\n /** Patient display name. */\n name: string;\n /** Optional avatar image URL. */\n avatarUrl?: string;\n}\n\n/** One treatment line within the appointment. */\nexport interface AppointmentTreatment {\n /** Localised care / treatment name. */\n careName: string;\n /** Optional tooth elements (e.g. FDI ids) the treatment targets. */\n elements?: string[];\n}\n\n/** Booking-reason metadata captured at online-booking time. */\nexport interface AppointmentBookingReason {\n /** Localised booking-reason description. */\n description: string;\n /** Expected duration in minutes. */\n durationMin?: number;\n /** Advance / deposit amount in cents (non-negative). */\n advanceAmountCents?: number;\n /** Localised specialty label. */\n specialty?: string;\n}\n\n/** Boolean appointment flags surfaced as chips / indicators. */\nexport interface AppointmentFlags {\n bookedOnline?: boolean;\n noPatientAssigned?: boolean;\n highlightedAnamnesis?: boolean;\n billable?: boolean;\n}\n\nexport interface AppointmentItem {\n /** Stable appointment identifier. */\n id: string;\n /** ISO-8601 start instant. */\n startIso: string;\n /** Duration in minutes. */\n durationMin: number;\n /** Lifecycle state — drives the Badge variant + label. */\n state: AppointmentState;\n /** Delivery channel — drives the leading type glyph. */\n type: AppointmentType;\n /** First-visit flag. */\n firstVisit?: AppointmentFirstVisit;\n /** Assigned operator. */\n operator?: AppointmentOperator;\n /** Chair / room label — surfaced as a chip. */\n chair?: string;\n /**\n * The care plan this appointment belongs to, when any — surfaced as a chip\n * (`Care plan {number}`). `url` is the deep link the consumer may use for\n * navigation; the chip itself is non-interactive so it never nests an anchor\n * inside the row's own stretched link.\n */\n carePlan?: { number: string; url?: string };\n /** Patient identity. */\n patient?: AppointmentPatient;\n /** Treatment lines. */\n treatments?: AppointmentTreatment[];\n /** Online booking-reason metadata. */\n bookingReason?: AppointmentBookingReason;\n /** Boolean flags. */\n flags?: AppointmentFlags;\n /** Optional deep link — when present (and safe) the row renders as an anchor. */\n url?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* CVA — row */\n/* -------------------------------------------------------------------- */\n\nconst appointmentCardVariants = cva(\n [\n 'ds:relative ds:flex ds:items-start ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:text-start ds:group',\n 'ds:bg-[var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n 'ds:forced-colors:border ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-sm)]',\n md: 'ds:p-[var(--spacing-md)]',\n },\n interactive: {\n true: 'ds:hover:bg-[color:var(--muted)]/40 ds:cursor-pointer',\n false: '',\n },\n surface: {\n // `flat` (default) is the chrome-less row used inside a bordered\n // AppointmentTray. `elevated` gives each row its own card chrome\n // (border + shadow) for use directly on a rail, e.g. AppointmentTimeline.\n // Uses `--shadow-sm` (a row lift), not `--shadow-card`/`--shadow-lg`:\n // the rail's `overflow-y:auto` scroll region clips `overflow-x` at a\n // narrow gutter, so a wide 30px-blur shadow gets a hard-edged clip.\n flat: '',\n elevated:\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2 ds:shadow-[var(--shadow-sm)]',\n },\n },\n defaultVariants: {\n size: 'sm',\n interactive: false,\n surface: 'flat',\n },\n },\n);\n\nconst stretchedLinkClass = [\n 'ds:focus-visible:outline-none',\n \"ds:after:content-[''] ds:after:absolute ds:after:inset-0 ds:after:rounded-[var(--radius-md)]\",\n 'ds:after:pointer-events-auto',\n 'ds:focus-visible:after:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:after:outline-solid',\n 'ds:focus-visible:after:outline-[color:var(--ring)]',\n 'ds:focus-visible:after:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:after:outline-[CanvasText]',\n].join(' ');\n\nconst TYPE_ICON: Record<AppointmentType, typeof MapPin> = {\n inPractice: MapPin,\n telehealth: Video,\n};\n\n/* -------------------------------------------------------------------- */\n/* Props */\n/* -------------------------------------------------------------------- */\n\nexport interface AppointmentCardProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'onClick' | 'role' | 'title'>,\n VariantProps<typeof appointmentCardVariants> {\n /** The appointment to render. */\n item: AppointmentItem;\n /** Visual density. */\n size?: 'sm' | 'md';\n /**\n * `'flat'` (default) — chrome-less row for use inside a bordered\n * `AppointmentTray`. `'elevated'` — each row carries its own card chrome\n * (border + shadow), for placing rows directly on a rail (AppointmentTimeline).\n */\n surface?: 'flat' | 'elevated';\n /** BCP-47 locale override for the timestamp + currency. */\n locale?: string;\n /** ISO-4217 currency code for the advance-deposit chip. Defaults to `EUR`. */\n currency?: string;\n /**\n * Show the patient identity (avatar + name as the row title). Default `true`.\n * Set `false` in single-patient surfaces (e.g. a patient's own\n * `AppointmentTimeline`) where repeating the name is redundant — the row then\n * leads with the operator as its title, falling back to a generic label.\n */\n showPatient?: boolean;\n /** Fires when the row is activated. */\n onActivate?: (item: AppointmentItem) => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const AppointmentCard = forwardRef<HTMLDivElement, AppointmentCardProps>(\n (\n {\n item,\n size = 'sm',\n surface = 'flat',\n locale,\n currency = 'EUR',\n showPatient = true,\n onActivate,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const interactive = !!onActivate;\n const hasSafeUrl = !!item.url && isSafeEntityUrl(item.url);\n\n const patientName = item.patient?.name ?? t('appointmentCard.noPatient');\n const operatorName = item.operator?.name;\n const stateLabel = t(`appointmentCard.state.${item.state}`);\n\n const avatarSize = size === 'md' ? 'md' : 'sm';\n const TypeIcon = TYPE_ICON[item.type];\n\n // In single-patient context the patient name is redundant, so the row leads\n // with the operator (the \"who am I seeing\") and falls back to a generic\n // label when no operator is set.\n const title = showPatient\n ? patientName\n : (operatorName ?? t('appointmentCard.appointment'));\n\n const ariaLabel = showPatient\n ? t('appointmentCard.itemLabel', {\n patient: patientName,\n state: stateLabel,\n })\n : t('appointmentCard.itemLabelGeneric', { title, state: stateLabel });\n\n const titleNode = (\n <span className=\"ds:min-w-0 ds:truncate type-title-item ds:text-[color:var(--foreground)]\">\n {title}\n </span>\n );\n\n let activator: ReactNode;\n if (interactive && hasSafeUrl) {\n activator = (\n <a\n href={item.url}\n aria-label={ariaLabel}\n className={stretchedLinkClass + ' ds:contents'}\n onClick={(e) => {\n if (e.defaultPrevented || e.metaKey || e.ctrlKey || e.shiftKey)\n return;\n onActivate?.(item);\n }}\n >\n {titleNode}\n </a>\n );\n } else if (interactive) {\n activator = (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n className={\n stretchedLinkClass +\n ' ds:contents ds:bg-transparent ds:border-0 ds:p-0 ds:text-start'\n }\n onClick={() => onActivate?.(item)}\n >\n {titleNode}\n </button>\n );\n } else {\n activator = titleNode;\n }\n\n // Treatment / tooth-element Tags. Each treatment becomes one Tag; the\n // tooth elements (when present) are appended to the visible label.\n const treatmentTags = (item.treatments ?? []).map((tx, index) => {\n const label =\n tx.elements && tx.elements.length > 0\n ? t('appointmentCard.treatmentWithElements', {\n care: tx.careName,\n elements: tx.elements.join(', '),\n })\n : tx.careName;\n return (\n <Tag\n key={`${tx.careName}-${index}`}\n label={label}\n variant=\"neutral\"\n fill=\"outline\"\n size=\"sm\"\n maxInlineSize=\"12rem\"\n />\n );\n });\n\n const advanceCents = item.bookingReason?.advanceAmountCents;\n const hasAdvance = typeof advanceCents === 'number' && advanceCents > 0;\n\n return (\n <div\n ref={ref}\n role=\"listitem\"\n data-component=\"appointment-card\"\n data-component-id={item.id}\n data-state={item.state}\n data-type={item.type}\n className={appointmentCardVariants({\n size,\n interactive,\n surface,\n className,\n })}\n {...rest}\n >\n {/* Leading rail: type glyph + start time + duration */}\n <span className=\"ds:flex ds:w-16 ds:shrink-0 ds:flex-col ds:items-start ds:gap-[var(--spacing-2xs)]\">\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n <TypeIcon aria-hidden=\"true\" className=\"ds:size-3.5 ds:shrink-0\" />\n <span className=\"ds:sr-only\">\n {t(`appointmentCard.type.${item.type}`)}\n </span>\n <Timestamp\n value={item.startIso}\n format=\"absolute\"\n shape=\"bare\"\n locale={locale}\n absoluteFormat={{ hour: 'numeric', minute: '2-digit' }}\n className=\"type-body-sm ds:font-medium ds:text-[color:var(--foreground)] ds:tabular-nums\"\n />\n </span>\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {t('appointmentCard.duration', { count: item.durationMin })}\n </span>\n </span>\n\n {/* Operator avatar with colour dot */}\n {operatorName ? (\n <span className=\"ds:relative ds:shrink-0\">\n <Avatar\n name={operatorName}\n color={colorIdToAvatarToken(item.operator?.colorId)}\n size={avatarSize}\n aria-hidden=\"true\"\n role=\"presentation\"\n aria-label={undefined}\n />\n <span\n aria-hidden=\"true\"\n className={\n 'ds:absolute ds:bottom-0 ds:end-0 ds:size-2.5 ds:rounded-[var(--radius-full)] ds:border ds:border-[color:var(--card)] ' +\n operatorDotClass(item.operator?.colorId)\n }\n />\n </span>\n ) : null}\n\n {/* Main content column */}\n <div className=\"ds:flex-1 ds:min-w-0 ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:items-start ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex-1 ds:min-w-0 ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {showPatient && item.patient?.avatarUrl ? (\n <Avatar\n name={patientName}\n src={item.patient.avatarUrl}\n size={avatarSize}\n className=\"ds:shrink-0\"\n aria-hidden=\"true\"\n role=\"presentation\"\n aria-label={undefined}\n />\n ) : null}\n {activator}\n </div>\n <Badge\n variant={appointmentStateBadge(item.state)}\n size=\"sm\"\n withDot\n className=\"ds:shrink-0\"\n >\n {stateLabel}\n </Badge>\n </div>\n\n {/* Meta line: operator name · specialty · first visit\n (chair moved to a chip below). When the patient is hidden the\n operator is promoted to the title, so it drops out of the meta. */}\n {(showPatient && operatorName) ||\n item.bookingReason?.specialty ||\n item.firstVisit === 'yes' ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-sm)] ds:gap-y-[var(--spacing-2xs)] type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {showPatient && operatorName ? <span>{operatorName}</span> : null}\n {item.bookingReason?.specialty ? (\n <span>{item.bookingReason.specialty}</span>\n ) : null}\n {item.firstVisit === 'yes' ? (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <Star aria-hidden=\"true\" className=\"ds:size-3 ds:shrink-0\" />\n {t('appointmentCard.firstVisit')}\n </span>\n ) : null}\n </div>\n ) : null}\n\n {/* Booking reason */}\n {item.bookingReason?.description ? (\n <span className=\"type-body-sm ds:text-[color:var(--foreground)] ds:truncate\">\n {item.bookingReason.description}\n </span>\n ) : null}\n\n {/* Treatment / tooth Tags */}\n {treatmentTags.length > 0 ? (\n <div className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-2xs)]\">\n {treatmentTags}\n </div>\n ) : null}\n\n {/* Chips: care plan · chair · flags · advance-deposit */}\n {item.carePlan ||\n item.chair ||\n item.flags?.bookedOnline ||\n item.flags?.highlightedAnamnesis ||\n hasAdvance ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {item.carePlan ? (\n <Badge\n variant=\"accentSoft\"\n size=\"sm\"\n leading={<ClipboardPlus />}\n >\n {t('appointmentCard.carePlan', {\n number: item.carePlan.number,\n })}\n </Badge>\n ) : null}\n {item.chair ? (\n <Badge variant=\"neutral\" size=\"sm\" leading={<Armchair />}>\n {t('appointmentCard.chair', { chair: item.chair })}\n </Badge>\n ) : null}\n {item.flags?.bookedOnline ? (\n <Badge variant=\"info\" size=\"sm\" leading={<Globe />}>\n {t('appointmentCard.flag.bookedOnline')}\n </Badge>\n ) : null}\n {item.flags?.highlightedAnamnesis ? (\n <Badge variant=\"warning\" size=\"sm\" withDot>\n {t('appointmentCard.flag.highlightedAnamnesis')}\n </Badge>\n ) : null}\n {hasAdvance ? (\n <TransactionChip\n state=\"to-invoice\"\n amount={(advanceCents as number) / 100}\n currency={currency}\n locale={locale}\n size=\"sm\"\n showLabel\n />\n ) : null}\n </div>\n ) : null}\n </div>\n\n {interactive ? (\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:self-center ds:text-[color:var(--muted-foreground)] ds:opacity-0 ds:transition-opacity ds:motion-reduce:transition-none ds:group-hover:opacity-100 ds:group-focus-within:opacity-100 ds:rtl:rotate-180\"\n />\n ) : null}\n </div>\n );\n },\n);\n\nAppointmentCard.displayName = 'AppointmentCard';\n"],"names":["__iconNode","Armchair","createLucideIcon","ClipboardPlus","OPERATOR_DOT_CLASS","operatorDotClass","colorId","colorIdToToken","appointmentCardVariants","cva","stretchedLinkClass","TYPE_ICON","MapPin","Video","AppointmentCard","forwardRef","item","size","surface","locale","currency","showPatient","onActivate","className","rest","ref","t","useTranslation","interactive","hasSafeUrl","isSafeEntityUrl","patientName","_a","operatorName","_b","stateLabel","avatarSize","TypeIcon","title","ariaLabel","titleNode","jsx","activator","e","treatmentTags","tx","index","label","Tag","advanceCents","_c","hasAdvance","jsxs","Timestamp","Avatar","colorIdToAvatarToken","_d","_e","_f","Badge","appointmentStateBadge","_g","_h","Star","_i","_j","_k","_l","Globe","_m","TransactionChip","ChevronRight"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -2,13 +2,13 @@ import { jsxs as C, jsx as o, Fragment as ve } from "react/jsx-runtime";
2
2
  import { forwardRef as ke, useId as be, useMemo as M, useRef as T, useState as X, useCallback as x, useImperativeHandle as Te } from "react";
3
3
  import { c as xe } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as De } from "react-i18next";
5
- import { A as we } from "./appointment-card-Cy4FOkGP.js";
6
- import { B as K } from "./button-DD_0Xdmr.js";
7
- import { B as Re } from "./button-group-CvEnVzY7.js";
8
- import { D as Ie } from "./date-picker-CVkD_lOi.js";
5
+ import { A as we } from "./appointment-card-DgKI5QKD.js";
6
+ import { B as K } from "./button-CPGiR_bH.js";
7
+ import { B as Re } from "./button-group-DzV5wgnx.js";
8
+ import { D as Ie } from "./date-picker-DzQS8mvt.js";
9
9
  import { P as Se } from "./panel-header-D313n_9-.js";
10
10
  import { S as je } from "./skeleton-CZbwyJAA.js";
11
- import { E as Ce } from "./empty-state-BLy7tigq.js";
11
+ import { E as Ce } from "./empty-state-CrLsi0XI.js";
12
12
  import { u as Z } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
13
13
  import { u as He } from "./use-prefers-reduced-motion-BMwIQRjB.js";
14
14
  import { u as Fe } from "./registry-DvAUVLHh.js";
@@ -385,4 +385,4 @@ export {
385
385
  Ke as A,
386
386
  Ne as a
387
387
  };
388
- //# sourceMappingURL=appointment-timeline-BWAPPk8F.js.map
388
+ //# sourceMappingURL=appointment-timeline-DQTG0btW.js.map