@alfadocs/ui-kit-debug 0.69.0 → 0.71.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 (788) hide show
  1. package/dist/_chunks/address-fields-CPbFJ8e8.js +246 -0
  2. package/dist/_chunks/address-fields-CPbFJ8e8.js.map +1 -0
  3. package/dist/_chunks/{agenda-card-BxSFkqgY.js → agenda-card-BQ-IKAru.js} +2 -2
  4. package/dist/_chunks/{agenda-card-BxSFkqgY.js.map → agenda-card-BQ-IKAru.js.map} +1 -1
  5. package/dist/_chunks/{agenda-tray-g0kg7HwB.js → agenda-tray-CGXRk58j.js} +2 -2
  6. package/dist/_chunks/{agenda-tray-g0kg7HwB.js.map → agenda-tray-CGXRk58j.js.map} +1 -1
  7. package/dist/_chunks/{ai-consent-banner-CXlsNX1c.js → ai-consent-banner-Be-h9mRI.js} +3 -3
  8. package/dist/_chunks/{ai-consent-banner-CXlsNX1c.js.map → ai-consent-banner-Be-h9mRI.js.map} +1 -1
  9. package/dist/_chunks/{ai-prompt-input-CuhTo9mh.js → ai-prompt-input-V4DdOeqv.js} +2 -2
  10. package/dist/_chunks/{ai-prompt-input-CuhTo9mh.js.map → ai-prompt-input-V4DdOeqv.js.map} +1 -1
  11. package/dist/_chunks/{alert-_mUKLmwA.js → alert-CHYZ96tR.js} +150 -96
  12. package/dist/_chunks/alert-CHYZ96tR.js.map +1 -0
  13. package/dist/_chunks/{alia-sidebar-B47qRQb5.js → alia-sidebar-DvIUzIX9.js} +107 -106
  14. package/dist/_chunks/alia-sidebar-DvIUzIX9.js.map +1 -0
  15. package/dist/_chunks/{anamnesis-card-DRmE24OQ.js → anamnesis-card-DvYCa16e.js} +2 -2
  16. package/dist/_chunks/{anamnesis-card-DRmE24OQ.js.map → anamnesis-card-DvYCa16e.js.map} +1 -1
  17. package/dist/_chunks/anatomy-scheme-CXSk11UJ.js +2445 -0
  18. package/dist/_chunks/anatomy-scheme-CXSk11UJ.js.map +1 -0
  19. package/dist/_chunks/annotation-marker-qt5R9WZX.js +120 -0
  20. package/dist/_chunks/annotation-marker-qt5R9WZX.js.map +1 -0
  21. package/dist/_chunks/{antenatal-schedule-timeline-35ebkcZT.js → antenatal-schedule-timeline-CwXrQRm1.js} +2 -2
  22. package/dist/_chunks/{antenatal-schedule-timeline-35ebkcZT.js.map → antenatal-schedule-timeline-CwXrQRm1.js.map} +1 -1
  23. package/dist/_chunks/{app-frame-BYx1gcV7.js → app-frame-DIEMIC5V.js} +67 -56
  24. package/dist/_chunks/app-frame-DIEMIC5V.js.map +1 -0
  25. package/dist/_chunks/appointment-card-DVaeJNVB.js +294 -0
  26. package/dist/_chunks/appointment-card-DVaeJNVB.js.map +1 -0
  27. package/dist/_chunks/appointment-timeline-PJgnrjFb.js +388 -0
  28. package/dist/_chunks/appointment-timeline-PJgnrjFb.js.map +1 -0
  29. package/dist/_chunks/appointment-tray-B16QPGbm.js +193 -0
  30. package/dist/_chunks/appointment-tray-B16QPGbm.js.map +1 -0
  31. package/dist/_chunks/{audio-recorder-DYXXnGug.js → audio-recorder-DNDsOLqO.js} +3 -3
  32. package/dist/_chunks/{audio-recorder-DYXXnGug.js.map → audio-recorder-DNDsOLqO.js.map} +1 -1
  33. package/dist/_chunks/{autocomplete-DOeGouCL.js → autocomplete-BrONKN8l.js} +168 -146
  34. package/dist/_chunks/autocomplete-BrONKN8l.js.map +1 -0
  35. package/dist/_chunks/{badge-CqGsX32l.js → badge-DCOqV9mI.js} +32 -27
  36. package/dist/_chunks/badge-DCOqV9mI.js.map +1 -0
  37. package/dist/_chunks/{bishop-score-PJI3AXzA.js → bishop-score-Cym_TeQY.js} +3 -3
  38. package/dist/_chunks/{bishop-score-PJI3AXzA.js.map → bishop-score-Cym_TeQY.js.map} +1 -1
  39. package/dist/_chunks/{bmi-calculator-BZtIJ53x.js → bmi-calculator-zjeY4E7J.js} +2 -2
  40. package/dist/_chunks/{bmi-calculator-BZtIJ53x.js.map → bmi-calculator-zjeY4E7J.js.map} +1 -1
  41. package/dist/_chunks/{booking-C3VqFReX.js → booking-C7do4vaR.js} +7 -7
  42. package/dist/_chunks/{booking-C3VqFReX.js.map → booking-C7do4vaR.js.map} +1 -1
  43. package/dist/_chunks/{button-group-Ciq6J4IW.js → button-group-CvEnVzY7.js} +32 -35
  44. package/dist/_chunks/{button-group-Ciq6J4IW.js.map → button-group-CvEnVzY7.js.map} +1 -1
  45. package/dist/_chunks/{care-plan-card-CvFGXa2z.js → care-plan-card-DzPDYgtK.js} +5 -5
  46. package/dist/_chunks/{care-plan-card-CvFGXa2z.js.map → care-plan-card-DzPDYgtK.js.map} +1 -1
  47. package/dist/_chunks/{care-plan-entry-card-C3E_gClk.js → care-plan-entry-card-CEnQy7YP.js} +5 -5
  48. package/dist/_chunks/{care-plan-entry-card-C3E_gClk.js.map → care-plan-entry-card-CEnQy7YP.js.map} +1 -1
  49. package/dist/_chunks/care-plan-header-DcXFXWit.js +198 -0
  50. package/dist/_chunks/care-plan-header-DcXFXWit.js.map +1 -0
  51. package/dist/_chunks/{chat-message-3V54YipB.js → chat-message-DzpcJR-q.js} +25 -23
  52. package/dist/_chunks/chat-message-DzpcJR-q.js.map +1 -0
  53. package/dist/_chunks/city-input-Dkgaak7I.js +169 -0
  54. package/dist/_chunks/city-input-Dkgaak7I.js.map +1 -0
  55. package/dist/_chunks/clinical-note-card-BUvNMNGL.js +436 -0
  56. package/dist/_chunks/clinical-note-card-BUvNMNGL.js.map +1 -0
  57. package/dist/_chunks/clipboard-list-S7s-MXQq.js +25 -0
  58. package/dist/_chunks/clipboard-list-S7s-MXQq.js.map +1 -0
  59. package/dist/_chunks/{combobox-Clum7gJ1.js → combobox-DnqSF0IH.js} +131 -114
  60. package/dist/_chunks/combobox-DnqSF0IH.js.map +1 -0
  61. package/dist/_chunks/connection-status-CY1HV8Wg.js +108 -0
  62. package/dist/_chunks/connection-status-CY1HV8Wg.js.map +1 -0
  63. package/dist/_chunks/{contact-profile-card-Dramqa9C.js → contact-profile-card-DDPwRFiP.js} +2 -2
  64. package/dist/_chunks/{contact-profile-card-Dramqa9C.js.map → contact-profile-card-DDPwRFiP.js.map} +1 -1
  65. package/dist/_chunks/control-room-rail-FAQZrGVL.js +333 -0
  66. package/dist/_chunks/control-room-rail-FAQZrGVL.js.map +1 -0
  67. package/dist/_chunks/country-select-BwUZQvTa.js +709 -0
  68. package/dist/_chunks/country-select-BwUZQvTa.js.map +1 -0
  69. package/dist/_chunks/{cycle-calculator-DmRGJNaT.js → cycle-calculator-CCmPwcBl.js} +2 -2
  70. package/dist/_chunks/{cycle-calculator-DmRGJNaT.js.map → cycle-calculator-CCmPwcBl.js.map} +1 -1
  71. package/dist/_chunks/{dependent-selector-CG_FOHya.js → dependent-selector-DUV4thxX.js} +2 -2
  72. package/dist/_chunks/{dependent-selector-CG_FOHya.js.map → dependent-selector-DUV4thxX.js.map} +1 -1
  73. package/dist/_chunks/{document-scanner-CTubA0-N.js → document-scanner-C_AxLooF.js} +3 -3
  74. package/dist/_chunks/{document-scanner-CTubA0-N.js.map → document-scanner-C_AxLooF.js.map} +1 -1
  75. package/dist/_chunks/{due-date-calculator-BTmsIQqD.js → due-date-calculator-Brdj-euS.js} +3 -3
  76. package/dist/_chunks/{due-date-calculator-BTmsIQqD.js.map → due-date-calculator-Brdj-euS.js.map} +1 -1
  77. package/dist/_chunks/editable-currency-cell-renderer-CGELrkIj.js +410 -0
  78. package/dist/_chunks/editable-currency-cell-renderer-CGELrkIj.js.map +1 -0
  79. package/dist/_chunks/email-input-DJ7EXklP.js +397 -0
  80. package/dist/_chunks/{email-input-B_Y55f5G.js.map → email-input-DJ7EXklP.js.map} +1 -1
  81. package/dist/_chunks/{entity-card-COhmqHly.js → entity-card-DmrgYSEX.js} +38 -20
  82. package/dist/_chunks/{entity-card-COhmqHly.js.map → entity-card-DmrgYSEX.js.map} +1 -1
  83. package/dist/_chunks/entity-summary-CaM1Y-xE.js +291 -0
  84. package/dist/_chunks/entity-summary-CaM1Y-xE.js.map +1 -0
  85. package/dist/_chunks/{fetal-weight-CRz7KE2D.js → fetal-weight-DNCkyeVo.js} +2 -2
  86. package/dist/_chunks/{fetal-weight-CRz7KE2D.js.map → fetal-weight-DNCkyeVo.js.map} +1 -1
  87. package/dist/_chunks/field-array-siUZzfYe.js +146 -0
  88. package/dist/_chunks/field-array-siUZzfYe.js.map +1 -0
  89. package/dist/_chunks/field-value-3jMM0uDx.js +415 -0
  90. package/dist/_chunks/field-value-3jMM0uDx.js.map +1 -0
  91. package/dist/_chunks/{file-upload-5ScQd4fE.js → file-upload-DwZcAK8D.js} +2 -1
  92. package/dist/_chunks/{file-upload-5ScQd4fE.js.map → file-upload-DwZcAK8D.js.map} +1 -1
  93. package/dist/_chunks/{freemium-paywall-DZ2mBS3w.js → freemium-paywall-WYlNO7yT.js} +2 -2
  94. package/dist/_chunks/{freemium-paywall-DZ2mBS3w.js.map → freemium-paywall-WYlNO7yT.js.map} +1 -1
  95. package/dist/_chunks/{gestational-age-calculator-BleUdhbI.js → gestational-age-calculator-DKzEV5Qi.js} +4 -4
  96. package/dist/_chunks/{gestational-age-calculator-BleUdhbI.js.map → gestational-age-calculator-DKzEV5Qi.js.map} +1 -1
  97. package/dist/_chunks/hash-CysBBS_N.js +17 -0
  98. package/dist/_chunks/hash-CysBBS_N.js.map +1 -0
  99. package/dist/_chunks/{hcg-doubling-CnjDXX6U.js → hcg-doubling-C7bmuaU3.js} +2 -2
  100. package/dist/_chunks/{hcg-doubling-CnjDXX6U.js.map → hcg-doubling-C7bmuaU3.js.map} +1 -1
  101. package/dist/_chunks/iban-input-B0TWzR1R.js +436 -0
  102. package/dist/_chunks/iban-input-B0TWzR1R.js.map +1 -0
  103. package/dist/_chunks/icon-picker-0B7KhrF1.js +272 -0
  104. package/dist/_chunks/icon-picker-0B7KhrF1.js.map +1 -0
  105. package/dist/_chunks/image-cropper-D9jqJy19.js +367 -0
  106. package/dist/_chunks/image-cropper-D9jqJy19.js.map +1 -0
  107. package/dist/_chunks/{actions-cell-renderer-DrcaxB0w.js → link-cell-renderer-De_SLjSq.js} +792 -668
  108. package/dist/_chunks/link-cell-renderer-De_SLjSq.js.map +1 -0
  109. package/dist/_chunks/list-checks-BUs75d_o.js +18 -0
  110. package/dist/_chunks/list-checks-BUs75d_o.js.map +1 -0
  111. package/dist/_chunks/lock-CKOIn0IK.js +15 -0
  112. package/dist/_chunks/lock-CKOIn0IK.js.map +1 -0
  113. package/dist/_chunks/{marketplace-app-shell-6T9W4Knl.js → marketplace-app-shell-BGqkywsi.js} +5 -5
  114. package/dist/_chunks/{marketplace-app-shell-6T9W4Knl.js.map → marketplace-app-shell-BGqkywsi.js.map} +1 -1
  115. package/dist/_chunks/message-card-DsHFFiL1.js +319 -0
  116. package/dist/_chunks/message-card-DsHFFiL1.js.map +1 -0
  117. package/dist/_chunks/{message-tray-DwrBLJlf.js → message-tray-C0a6CL1_.js} +172 -135
  118. package/dist/_chunks/message-tray-C0a6CL1_.js.map +1 -0
  119. package/dist/_chunks/{multi-select-BdHHDrRN.js → multi-select-WE4S9FIF.js} +75 -63
  120. package/dist/_chunks/{multi-select-BdHHDrRN.js.map → multi-select-WE4S9FIF.js.map} +1 -1
  121. package/dist/_chunks/nav-grid-9xphY3FM.js +169 -0
  122. package/dist/_chunks/nav-grid-9xphY3FM.js.map +1 -0
  123. package/dist/_chunks/notes-panel-DXiMfuvp.js +320 -0
  124. package/dist/_chunks/notes-panel-DXiMfuvp.js.map +1 -0
  125. package/dist/_chunks/notification-card-BMqNzCIt.js +290 -0
  126. package/dist/_chunks/notification-card-BMqNzCIt.js.map +1 -0
  127. package/dist/_chunks/{notification-tray-Btb9oQeZ.js → notification-tray-BmUlCx3g.js} +201 -166
  128. package/dist/_chunks/notification-tray-BmUlCx3g.js.map +1 -0
  129. package/dist/_chunks/{operator-hero-CP2Nhupm.js → operator-hero-BO8TqzX2.js} +3 -3
  130. package/dist/_chunks/{operator-hero-CP2Nhupm.js.map → operator-hero-BO8TqzX2.js.map} +1 -1
  131. package/dist/_chunks/panel-header-D313n_9-.js +105 -0
  132. package/dist/_chunks/panel-header-D313n_9-.js.map +1 -0
  133. package/dist/_chunks/patient-details-DgfTJimE.js +759 -0
  134. package/dist/_chunks/patient-details-DgfTJimE.js.map +1 -0
  135. package/dist/_chunks/{patient-search-CBC_ySF6.js → patient-search-CSWQKOSP.js} +3 -3
  136. package/dist/_chunks/{patient-search-CBC_ySF6.js.map → patient-search-CSWQKOSP.js.map} +1 -1
  137. package/dist/_chunks/{patient-shell-DV3XEtIB.js → patient-shell-BMwsIKlW.js} +3 -3
  138. package/dist/_chunks/{patient-shell-DV3XEtIB.js.map → patient-shell-BMwsIKlW.js.map} +1 -1
  139. package/dist/_chunks/patient-summary-card-D4NdgYJB.js +452 -0
  140. package/dist/_chunks/patient-summary-card-D4NdgYJB.js.map +1 -0
  141. package/dist/_chunks/patient-table-CERknpd8.js +1110 -0
  142. package/dist/_chunks/patient-table-CERknpd8.js.map +1 -0
  143. package/dist/_chunks/{payment-form-DvjwYVIT.js → payment-form-CxqIXqw7.js} +2 -2
  144. package/dist/_chunks/{payment-form-DvjwYVIT.js.map → payment-form-CxqIXqw7.js.map} +1 -1
  145. package/dist/_chunks/{payment-request-card-DioWKBUq.js → payment-request-card-Blf-MFNY.js} +125 -136
  146. package/dist/_chunks/payment-request-card-Blf-MFNY.js.map +1 -0
  147. package/dist/_chunks/{pdf-viewer-D6BPfW2D.js → pdf-viewer-QfebdLOd.js} +192 -214
  148. package/dist/_chunks/pdf-viewer-QfebdLOd.js.map +1 -0
  149. package/dist/_chunks/{periodontal-chart-card-BuDEMbHE.js → periodontal-chart-card-hRRJY1NN.js} +2 -2
  150. package/dist/_chunks/{periodontal-chart-card-BuDEMbHE.js.map → periodontal-chart-card-hRRJY1NN.js.map} +1 -1
  151. package/dist/_chunks/permission-matrix-Bw5oexUt.js +174 -0
  152. package/dist/_chunks/permission-matrix-Bw5oexUt.js.map +1 -0
  153. package/dist/_chunks/position-grid-CcvqHaKN.js +169 -0
  154. package/dist/_chunks/position-grid-CcvqHaKN.js.map +1 -0
  155. package/dist/_chunks/postal-code-input-UCOYuRY2.js +192 -0
  156. package/dist/_chunks/postal-code-input-UCOYuRY2.js.map +1 -0
  157. package/dist/_chunks/{practice-results-KrTHqZua.js → practice-results-El5Z-oVp.js} +4 -4
  158. package/dist/_chunks/{practice-results-KrTHqZua.js.map → practice-results-El5Z-oVp.js.map} +1 -1
  159. package/dist/_chunks/{pregnancy-dating-DORUAOHB.js → pregnancy-dating-CunHrOpO.js} +4 -4
  160. package/dist/_chunks/{pregnancy-dating-DORUAOHB.js.map → pregnancy-dating-CunHrOpO.js.map} +1 -1
  161. package/dist/_chunks/{pregnancy-weight-gain-DVz4rr7-.js → pregnancy-weight-gain-BUNpTsH-.js} +2 -2
  162. package/dist/_chunks/{pregnancy-weight-gain-DVz4rr7-.js.map → pregnancy-weight-gain-BUNpTsH-.js.map} +1 -1
  163. package/dist/_chunks/{product-hub-panel-e6pW220e.js → product-hub-panel-DtU7KXxm.js} +257 -217
  164. package/dist/_chunks/product-hub-panel-DtU7KXxm.js.map +1 -0
  165. package/dist/_chunks/province-select-D_TZvix3.js +261 -0
  166. package/dist/_chunks/province-select-D_TZvix3.js.map +1 -0
  167. package/dist/_chunks/{public-header.agent-DqkqA-ca.js → public-header.agent-TxmC_x1I.js} +2 -2
  168. package/dist/_chunks/{public-header.agent-DqkqA-ca.js.map → public-header.agent-TxmC_x1I.js.map} +1 -1
  169. package/dist/_chunks/radiograph-panel.agent-tWjN2nHX.js +553 -0
  170. package/dist/_chunks/radiograph-panel.agent-tWjN2nHX.js.map +1 -0
  171. package/dist/_chunks/reviews-panel-DxkSrgMl.js +559 -0
  172. package/dist/_chunks/reviews-panel-DxkSrgMl.js.map +1 -0
  173. package/dist/_chunks/rich-text-editor-C8tyGjfb.js +2621 -0
  174. package/dist/_chunks/rich-text-editor-C8tyGjfb.js.map +1 -0
  175. package/dist/_chunks/{scroll-area-5wNK0Cyz.js → scroll-area-BZOvUhwQ.js} +2 -2
  176. package/dist/_chunks/scroll-area-BZOvUhwQ.js.map +1 -0
  177. package/dist/_chunks/{select-DMLG44F5.js → select-KsyRr8WH.js} +114 -102
  178. package/dist/_chunks/select-KsyRr8WH.js.map +1 -0
  179. package/dist/_chunks/{sheet-BxsE7eQm.js → sheet-umkfZjF6.js} +53 -42
  180. package/dist/_chunks/sheet-umkfZjF6.js.map +1 -0
  181. package/dist/_chunks/{sidebar-DY9jGjgt.js → sidebar-QCp9wHNP.js} +125 -113
  182. package/dist/_chunks/sidebar-QCp9wHNP.js.map +1 -0
  183. package/dist/_chunks/{sign-document-B4DeRhTe.js → sign-document-By6hMOra.js} +2 -2
  184. package/dist/_chunks/{sign-document-B4DeRhTe.js.map → sign-document-By6hMOra.js.map} +1 -1
  185. package/dist/_chunks/{stepper-accordion-Dki6r9ZE.js → stepper-accordion-DC-H-8v4.js} +38 -48
  186. package/dist/_chunks/stepper-accordion-DC-H-8v4.js.map +1 -0
  187. package/dist/_chunks/tab-bar-Bv9nGNdO.js +262 -0
  188. package/dist/_chunks/tab-bar-Bv9nGNdO.js.map +1 -0
  189. package/dist/_chunks/{tabs-BxcOziCo.js → tabs-CYZVKKDl.js} +2 -2
  190. package/dist/_chunks/{tabs-BxcOziCo.js.map → tabs-CYZVKKDl.js.map} +1 -1
  191. package/dist/_chunks/task-card-DCdsI0ZT.js +189 -0
  192. package/dist/_chunks/task-card-DCdsI0ZT.js.map +1 -0
  193. package/dist/_chunks/{task-tray-qOEQflu4.js → task-tray-DNVejijD.js} +2 -2
  194. package/dist/_chunks/{task-tray-qOEQflu4.js.map → task-tray-DNVejijD.js.map} +1 -1
  195. package/dist/_chunks/tasks-panel-C9odmawT.js +757 -0
  196. package/dist/_chunks/tasks-panel-C9odmawT.js.map +1 -0
  197. package/dist/_chunks/token-insert-menu-CFQqTe_n.js +147 -0
  198. package/dist/_chunks/token-insert-menu-CFQqTe_n.js.map +1 -0
  199. package/dist/_chunks/tool-rail-BZx0-yIr.js +524 -0
  200. package/dist/_chunks/tool-rail-BZx0-yIr.js.map +1 -0
  201. package/dist/_chunks/tooth-scheme-DJZtzfeY.js +2133 -0
  202. package/dist/_chunks/tooth-scheme-DJZtzfeY.js.map +1 -0
  203. package/dist/_chunks/{transaction-chip-DK84XCBU.js → transaction-chip-CscoQbxF.js} +88 -61
  204. package/dist/_chunks/transaction-chip-CscoQbxF.js.map +1 -0
  205. package/dist/_chunks/{transcript-panel-3THQX6nJ.js → transcript-panel-CHGHHHdT.js} +95 -83
  206. package/dist/_chunks/transcript-panel-CHGHHHdT.js.map +1 -0
  207. package/dist/_chunks/{unit-converter-YEpD9evj.js → unit-converter-CwlZbfdn.js} +2 -2
  208. package/dist/_chunks/{unit-converter-YEpD9evj.js.map → unit-converter-CwlZbfdn.js.map} +1 -1
  209. package/dist/_chunks/use-clamp-overflow-DQE2kwZ9.js +20 -0
  210. package/dist/_chunks/use-clamp-overflow-DQE2kwZ9.js.map +1 -0
  211. package/dist/_chunks/use-edge-resize-ZnGG7gyO.js.map +1 -1
  212. package/dist/_chunks/use-overflow-collapse-BIOzKbni.js +32 -0
  213. package/dist/_chunks/use-overflow-collapse-BIOzKbni.js.map +1 -0
  214. package/dist/_chunks/use-persistent-state-nZwZAnE9.js +24 -0
  215. package/dist/_chunks/use-persistent-state-nZwZAnE9.js.map +1 -0
  216. package/dist/_chunks/{warning-stack-BsgaEbL8.js → warning-stack--sTrrBDA.js} +86 -101
  217. package/dist/_chunks/warning-stack--sTrrBDA.js.map +1 -0
  218. package/dist/_chunks/{workflow-map-Bdam9pGp.js → workflow-map-M8MBBHQm.js} +107 -119
  219. package/dist/_chunks/workflow-map-M8MBBHQm.js.map +1 -0
  220. package/dist/_chunks/zoom-out-CgVtf2Wx.js +29 -0
  221. package/dist/_chunks/zoom-out-CgVtf2Wx.js.map +1 -0
  222. package/dist/agent/index.js +5 -4
  223. package/dist/agent/index.js.map +1 -1
  224. package/dist/agent/types.d.ts +19 -2
  225. package/dist/agent/types.d.ts.map +1 -1
  226. package/dist/agent-catalog.json +3325 -322
  227. package/dist/agent-i18n/en.json +314 -14
  228. package/dist/components/_shared/entity-card/entity-card.d.ts +6 -0
  229. package/dist/components/_shared/entity-card/entity-card.d.ts.map +1 -1
  230. package/dist/components/_shared/entity-card/index.d.ts +1 -1
  231. package/dist/components/_shared/entity-card/index.d.ts.map +1 -1
  232. package/dist/components/_shared/field-value.d.ts +21 -0
  233. package/dist/components/_shared/field-value.d.ts.map +1 -0
  234. package/dist/components/_shared/field-visibility-cog.d.ts +20 -0
  235. package/dist/components/_shared/field-visibility-cog.d.ts.map +1 -0
  236. package/dist/components/_shared/field-visibility.d.ts +36 -0
  237. package/dist/components/_shared/field-visibility.d.ts.map +1 -0
  238. package/dist/components/_shared/option.d.ts +2 -0
  239. package/dist/components/_shared/option.d.ts.map +1 -1
  240. package/dist/components/_shared/patient-fields.d.ts +119 -0
  241. package/dist/components/_shared/patient-fields.d.ts.map +1 -0
  242. package/dist/components/address-fields/address-fields.agent.d.ts +9 -0
  243. package/dist/components/address-fields/address-fields.agent.d.ts.map +1 -0
  244. package/dist/components/address-fields/address-fields.d.ts +29 -0
  245. package/dist/components/address-fields/address-fields.d.ts.map +1 -0
  246. package/dist/components/address-fields/index.d.ts +5 -0
  247. package/dist/components/address-fields/index.d.ts.map +1 -0
  248. package/dist/components/address-fields/index.js +6 -0
  249. package/dist/components/agenda-card/index.js +1 -1
  250. package/dist/components/agenda-tray/index.js +1 -1
  251. package/dist/components/ai-consent-banner/index.js +1 -1
  252. package/dist/components/ai-prompt-input/index.js +1 -1
  253. package/dist/components/alert/alert.d.ts +5 -0
  254. package/dist/components/alert/alert.d.ts.map +1 -1
  255. package/dist/components/alert/index.js +1 -1
  256. package/dist/components/anamnesis-card/index.js +1 -1
  257. package/dist/components/anatomy-scheme/anatomy-face-paths.d.ts +15 -0
  258. package/dist/components/anatomy-scheme/anatomy-face-paths.d.ts.map +1 -0
  259. package/dist/components/anatomy-scheme/anatomy-muscle-paths.d.ts +20 -0
  260. package/dist/components/anatomy-scheme/anatomy-muscle-paths.d.ts.map +1 -0
  261. package/dist/components/anatomy-scheme/anatomy-scheme-data.d.ts +121 -0
  262. package/dist/components/anatomy-scheme/anatomy-scheme-data.d.ts.map +1 -0
  263. package/dist/components/anatomy-scheme/anatomy-scheme.agent.d.ts +6 -0
  264. package/dist/components/anatomy-scheme/anatomy-scheme.agent.d.ts.map +1 -0
  265. package/dist/components/anatomy-scheme/anatomy-scheme.d.ts +69 -0
  266. package/dist/components/anatomy-scheme/anatomy-scheme.d.ts.map +1 -0
  267. package/dist/components/anatomy-scheme/index.d.ts +6 -0
  268. package/dist/components/anatomy-scheme/index.d.ts.map +1 -0
  269. package/dist/components/anatomy-scheme/index.js +17 -0
  270. package/dist/components/anatomy-scheme/index.js.map +1 -0
  271. package/dist/components/annotation-marker/annotation-marker.d.ts +33 -0
  272. package/dist/components/annotation-marker/annotation-marker.d.ts.map +1 -0
  273. package/dist/components/annotation-marker/index.d.ts +3 -0
  274. package/dist/components/annotation-marker/index.d.ts.map +1 -0
  275. package/dist/components/annotation-marker/index.js +7 -0
  276. package/dist/components/annotation-marker/index.js.map +1 -0
  277. package/dist/components/app-frame/app-frame.d.ts +2 -2
  278. package/dist/components/app-frame/app-frame.d.ts.map +1 -1
  279. package/dist/components/app-frame/index.js +1 -1
  280. package/dist/components/appointment-card/appointment-card.d.ts +25 -1
  281. package/dist/components/appointment-card/appointment-card.d.ts.map +1 -1
  282. package/dist/components/appointment-card/index.js +6 -5
  283. package/dist/components/appointment-card/index.js.map +1 -1
  284. package/dist/components/appointment-timeline/appointment-timeline.agent.d.ts +4 -0
  285. package/dist/components/appointment-timeline/appointment-timeline.agent.d.ts.map +1 -0
  286. package/dist/components/appointment-timeline/appointment-timeline.d.ts +66 -0
  287. package/dist/components/appointment-timeline/appointment-timeline.d.ts.map +1 -0
  288. package/dist/components/appointment-timeline/index.d.ts +4 -0
  289. package/dist/components/appointment-timeline/index.d.ts.map +1 -0
  290. package/dist/components/appointment-timeline/index.js +6 -0
  291. package/dist/components/appointment-timeline/index.js.map +1 -0
  292. package/dist/components/audio-recorder/index.js +1 -1
  293. package/dist/components/autocomplete/autocomplete.d.ts +10 -0
  294. package/dist/components/autocomplete/autocomplete.d.ts.map +1 -1
  295. package/dist/components/autocomplete/index.js +1 -1
  296. package/dist/components/badge/badge.d.ts +6 -2
  297. package/dist/components/badge/badge.d.ts.map +1 -1
  298. package/dist/components/badge/index.js +1 -1
  299. package/dist/components/bishop-score/index.js +1 -1
  300. package/dist/components/bmi-calculator/index.js +1 -1
  301. package/dist/components/booking/index.js +1 -1
  302. package/dist/components/button-group/button-group.d.ts.map +1 -1
  303. package/dist/components/button-group/index.js +1 -1
  304. package/dist/components/care-plan-card/index.js +1 -1
  305. package/dist/components/care-plan-entry-card/index.js +1 -1
  306. package/dist/components/care-plan-header/care-plan-header.agent.d.ts +4 -0
  307. package/dist/components/care-plan-header/care-plan-header.agent.d.ts.map +1 -0
  308. package/dist/components/care-plan-header/care-plan-header.d.ts +111 -0
  309. package/dist/components/care-plan-header/care-plan-header.d.ts.map +1 -0
  310. package/dist/components/care-plan-header/index.d.ts +4 -0
  311. package/dist/components/care-plan-header/index.d.ts.map +1 -0
  312. package/dist/components/care-plan-header/index.js +6 -0
  313. package/dist/components/care-plan-header/index.js.map +1 -0
  314. package/dist/components/chat-message/chat-message.d.ts.map +1 -1
  315. package/dist/components/chat-message/index.js +1 -1
  316. package/dist/components/city-input/city-input.agent.d.ts +8 -0
  317. package/dist/components/city-input/city-input.agent.d.ts.map +1 -0
  318. package/dist/components/city-input/city-input.d.ts +57 -0
  319. package/dist/components/city-input/city-input.d.ts.map +1 -0
  320. package/dist/components/city-input/index.d.ts +5 -0
  321. package/dist/components/city-input/index.d.ts.map +1 -0
  322. package/dist/components/city-input/index.js +6 -0
  323. package/dist/components/city-input/index.js.map +1 -0
  324. package/dist/components/clinical-note-card/clinical-note-card.d.ts +21 -1
  325. package/dist/components/clinical-note-card/clinical-note-card.d.ts.map +1 -1
  326. package/dist/components/clinical-note-card/index.js +1 -1
  327. package/dist/components/combobox/combobox.d.ts +17 -0
  328. package/dist/components/combobox/combobox.d.ts.map +1 -1
  329. package/dist/components/combobox/index.js +1 -1
  330. package/dist/components/connection-status/connection-status.agent.d.ts +4 -0
  331. package/dist/components/connection-status/connection-status.agent.d.ts.map +1 -0
  332. package/dist/components/connection-status/connection-status.d.ts +36 -0
  333. package/dist/components/connection-status/connection-status.d.ts.map +1 -0
  334. package/dist/components/connection-status/index.d.ts +4 -0
  335. package/dist/components/connection-status/index.d.ts.map +1 -0
  336. package/dist/components/connection-status/index.js +6 -0
  337. package/dist/components/connection-status/index.js.map +1 -0
  338. package/dist/components/contact-profile-card/index.js +1 -1
  339. package/dist/components/control-room-rail/control-room-context.d.ts +53 -0
  340. package/dist/components/control-room-rail/control-room-context.d.ts.map +1 -0
  341. package/dist/components/control-room-rail/control-room-rail.agent.d.ts +4 -0
  342. package/dist/components/control-room-rail/control-room-rail.agent.d.ts.map +1 -0
  343. package/dist/components/control-room-rail/control-room-rail.d.ts +35 -0
  344. package/dist/components/control-room-rail/control-room-rail.d.ts.map +1 -0
  345. package/dist/components/control-room-rail/index.d.ts +6 -0
  346. package/dist/components/control-room-rail/index.d.ts.map +1 -0
  347. package/dist/components/control-room-rail/index.js +10 -0
  348. package/dist/components/control-room-rail/index.js.map +1 -0
  349. package/dist/components/counter/counter.d.ts +1 -1
  350. package/dist/components/country-select/country-select.agent.d.ts +8 -0
  351. package/dist/components/country-select/country-select.agent.d.ts.map +1 -0
  352. package/dist/components/country-select/country-select.d.ts +51 -0
  353. package/dist/components/country-select/country-select.d.ts.map +1 -0
  354. package/dist/components/country-select/index.d.ts +6 -0
  355. package/dist/components/country-select/index.d.ts.map +1 -0
  356. package/dist/components/country-select/index.js +9 -0
  357. package/dist/components/country-select/index.js.map +1 -0
  358. package/dist/components/country-select/iso-3166.d.ts +15 -0
  359. package/dist/components/country-select/iso-3166.d.ts.map +1 -0
  360. package/dist/components/cycle-calculator/index.js +1 -1
  361. package/dist/components/data-table/cell-renderers/actions-cell-renderer.d.ts +18 -0
  362. package/dist/components/data-table/cell-renderers/actions-cell-renderer.d.ts.map +1 -1
  363. package/dist/components/data-table/cell-renderers/reorder-cell-renderer.d.ts +34 -0
  364. package/dist/components/data-table/cell-renderers/reorder-cell-renderer.d.ts.map +1 -0
  365. package/dist/components/data-table/filters/select-filter.d.ts.map +1 -1
  366. package/dist/components/data-table/index.d.ts +3 -1
  367. package/dist/components/data-table/index.d.ts.map +1 -1
  368. package/dist/components/data-table/index.js +35 -32
  369. package/dist/components/dependent-selector/index.js +1 -1
  370. package/dist/components/document-scanner/index.js +1 -1
  371. package/dist/components/due-date-calculator/index.js +2 -2
  372. package/dist/components/email-input/email-input.d.ts.map +1 -1
  373. package/dist/components/email-input/index.js +1 -1
  374. package/dist/components/entity-summary/entity-summary.agent.d.ts +4 -0
  375. package/dist/components/entity-summary/entity-summary.agent.d.ts.map +1 -0
  376. package/dist/components/entity-summary/entity-summary.d.ts +92 -0
  377. package/dist/components/entity-summary/entity-summary.d.ts.map +1 -0
  378. package/dist/components/entity-summary/index.d.ts +3 -0
  379. package/dist/components/entity-summary/index.d.ts.map +1 -0
  380. package/dist/components/entity-summary/index.js +5 -0
  381. package/dist/components/entity-summary/index.js.map +1 -0
  382. package/dist/components/fetal-weight/index.js +1 -1
  383. package/dist/components/field-array/field-array.agent.d.ts +4 -0
  384. package/dist/components/field-array/field-array.agent.d.ts.map +1 -0
  385. package/dist/components/field-array/field-array.d.ts +45 -0
  386. package/dist/components/field-array/field-array.d.ts.map +1 -0
  387. package/dist/components/field-array/index.d.ts +4 -0
  388. package/dist/components/field-array/index.d.ts.map +1 -0
  389. package/dist/components/field-array/index.js +6 -0
  390. package/dist/components/field-array/index.js.map +1 -0
  391. package/dist/components/file-upload/index.js +1 -1
  392. package/dist/components/freemium-paywall/freemium-paywall.d.ts +1 -1
  393. package/dist/components/freemium-paywall/index.js +1 -1
  394. package/dist/components/gestational-age-calculator/index.js +1 -1
  395. package/dist/components/hcg-doubling/index.js +1 -1
  396. package/dist/components/iban-input/iban-input.agent.d.ts +4 -0
  397. package/dist/components/iban-input/iban-input.agent.d.ts.map +1 -0
  398. package/dist/components/iban-input/iban-input.d.ts +51 -0
  399. package/dist/components/iban-input/iban-input.d.ts.map +1 -0
  400. package/dist/components/iban-input/index.d.ts +5 -0
  401. package/dist/components/iban-input/index.d.ts.map +1 -0
  402. package/dist/components/iban-input/index.js +13 -0
  403. package/dist/components/iban-input/index.js.map +1 -0
  404. package/dist/components/iban-input/is-valid-iban.d.ts +31 -0
  405. package/dist/components/iban-input/is-valid-iban.d.ts.map +1 -0
  406. package/dist/components/icon-picker/icon-picker.agent.d.ts +4 -0
  407. package/dist/components/icon-picker/icon-picker.agent.d.ts.map +1 -0
  408. package/dist/components/icon-picker/icon-picker.d.ts +41 -0
  409. package/dist/components/icon-picker/icon-picker.d.ts.map +1 -0
  410. package/dist/components/icon-picker/index.d.ts +4 -0
  411. package/dist/components/icon-picker/index.d.ts.map +1 -0
  412. package/dist/components/icon-picker/index.js +6 -0
  413. package/dist/components/icon-picker/index.js.map +1 -0
  414. package/dist/components/image-cropper/crop-geometry.d.ts +30 -0
  415. package/dist/components/image-cropper/crop-geometry.d.ts.map +1 -0
  416. package/dist/components/image-cropper/image-cropper.agent.d.ts +4 -0
  417. package/dist/components/image-cropper/image-cropper.agent.d.ts.map +1 -0
  418. package/dist/components/image-cropper/image-cropper.d.ts +32 -0
  419. package/dist/components/image-cropper/image-cropper.d.ts.map +1 -0
  420. package/dist/components/image-cropper/index.d.ts +5 -0
  421. package/dist/components/image-cropper/index.d.ts.map +1 -0
  422. package/dist/components/image-cropper/index.js +11 -0
  423. package/dist/components/image-cropper/index.js.map +1 -0
  424. package/dist/components/index.d.ts +25 -1
  425. package/dist/components/index.d.ts.map +1 -1
  426. package/dist/components/message-card/index.js +1 -1
  427. package/dist/components/message-card/message-card.d.ts +14 -0
  428. package/dist/components/message-card/message-card.d.ts.map +1 -1
  429. package/dist/components/message-tray/index.js +1 -1
  430. package/dist/components/message-tray/message-tray.agent.d.ts.map +1 -1
  431. package/dist/components/message-tray/message-tray.d.ts +4 -0
  432. package/dist/components/message-tray/message-tray.d.ts.map +1 -1
  433. package/dist/components/multi-select/index.js +1 -1
  434. package/dist/components/multi-select/multi-select.d.ts.map +1 -1
  435. package/dist/components/nav-grid/index.d.ts +4 -0
  436. package/dist/components/nav-grid/index.d.ts.map +1 -0
  437. package/dist/components/nav-grid/index.js +7 -0
  438. package/dist/components/nav-grid/index.js.map +1 -0
  439. package/dist/components/nav-grid/nav-grid.agent.d.ts +4 -0
  440. package/dist/components/nav-grid/nav-grid.agent.d.ts.map +1 -0
  441. package/dist/components/nav-grid/nav-grid.d.ts +41 -0
  442. package/dist/components/nav-grid/nav-grid.d.ts.map +1 -0
  443. package/dist/components/notes-panel/index.d.ts +3 -0
  444. package/dist/components/notes-panel/index.d.ts.map +1 -0
  445. package/dist/components/notes-panel/index.js +5 -0
  446. package/dist/components/notes-panel/index.js.map +1 -0
  447. package/dist/components/notes-panel/notes-panel.agent.d.ts +4 -0
  448. package/dist/components/notes-panel/notes-panel.agent.d.ts.map +1 -0
  449. package/dist/components/notes-panel/notes-panel.d.ts +94 -0
  450. package/dist/components/notes-panel/notes-panel.d.ts.map +1 -0
  451. package/dist/components/notification-card/index.js +1 -1
  452. package/dist/components/notification-card/notification-card.d.ts +15 -0
  453. package/dist/components/notification-card/notification-card.d.ts.map +1 -1
  454. package/dist/components/notification-tray/index.js +1 -1
  455. package/dist/components/notification-tray/notification-tray.agent.d.ts.map +1 -1
  456. package/dist/components/notification-tray/notification-tray.d.ts +4 -0
  457. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  458. package/dist/components/operator-hero/index.js +1 -1
  459. package/dist/components/panel-header/index.d.ts +3 -0
  460. package/dist/components/panel-header/index.d.ts.map +1 -0
  461. package/dist/components/panel-header/index.js +7 -0
  462. package/dist/components/panel-header/index.js.map +1 -0
  463. package/dist/components/panel-header/panel-header.d.ts +41 -0
  464. package/dist/components/panel-header/panel-header.d.ts.map +1 -0
  465. package/dist/components/patient-details/index.d.ts +5 -0
  466. package/dist/components/patient-details/index.d.ts.map +1 -0
  467. package/dist/components/patient-details/index.js +6 -0
  468. package/dist/components/patient-details/index.js.map +1 -0
  469. package/dist/components/patient-details/patient-details.agent.d.ts +4 -0
  470. package/dist/components/patient-details/patient-details.agent.d.ts.map +1 -0
  471. package/dist/components/patient-details/patient-details.d.ts +96 -0
  472. package/dist/components/patient-details/patient-details.d.ts.map +1 -0
  473. package/dist/components/patient-search/index.js +1 -1
  474. package/dist/components/patient-summary-card/index.js +1 -1
  475. package/dist/components/patient-summary-card/patient-summary-card.agent.d.ts.map +1 -1
  476. package/dist/components/patient-summary-card/patient-summary-card.d.ts +40 -1
  477. package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -1
  478. package/dist/components/patient-table/columns.d.ts +69 -40
  479. package/dist/components/patient-table/columns.d.ts.map +1 -1
  480. package/dist/components/patient-table/index.d.ts +2 -6
  481. package/dist/components/patient-table/index.d.ts.map +1 -1
  482. package/dist/components/patient-table/index.js +8 -9
  483. package/dist/components/patient-table/patient-table.d.ts +38 -4
  484. package/dist/components/patient-table/patient-table.d.ts.map +1 -1
  485. package/dist/components/patient-table/types.d.ts +52 -2
  486. package/dist/components/patient-table/types.d.ts.map +1 -1
  487. package/dist/components/patient-table/use-responsive-columns.d.ts +8 -6
  488. package/dist/components/patient-table/use-responsive-columns.d.ts.map +1 -1
  489. package/dist/components/payment-card/index.js +1 -1
  490. package/dist/components/payment-form/index.js +1 -1
  491. package/dist/components/pdf-viewer/index.js +1 -1
  492. package/dist/components/periodontal-chart-card/index.js +1 -1
  493. package/dist/components/permission-matrix/index.d.ts +4 -0
  494. package/dist/components/permission-matrix/index.d.ts.map +1 -0
  495. package/dist/components/permission-matrix/index.js +7 -0
  496. package/dist/components/permission-matrix/index.js.map +1 -0
  497. package/dist/components/permission-matrix/permission-matrix.agent.d.ts +4 -0
  498. package/dist/components/permission-matrix/permission-matrix.agent.d.ts.map +1 -0
  499. package/dist/components/permission-matrix/permission-matrix.d.ts +47 -0
  500. package/dist/components/permission-matrix/permission-matrix.d.ts.map +1 -0
  501. package/dist/components/position-grid/index.d.ts +4 -0
  502. package/dist/components/position-grid/index.d.ts.map +1 -0
  503. package/dist/components/position-grid/index.js +7 -0
  504. package/dist/components/position-grid/index.js.map +1 -0
  505. package/dist/components/position-grid/position-grid.agent.d.ts +4 -0
  506. package/dist/components/position-grid/position-grid.agent.d.ts.map +1 -0
  507. package/dist/components/position-grid/position-grid.d.ts +39 -0
  508. package/dist/components/position-grid/position-grid.d.ts.map +1 -0
  509. package/dist/components/postal-code-input/index.d.ts +5 -0
  510. package/dist/components/postal-code-input/index.d.ts.map +1 -0
  511. package/dist/components/postal-code-input/index.js +6 -0
  512. package/dist/components/postal-code-input/index.js.map +1 -0
  513. package/dist/components/postal-code-input/postal-code-input.agent.d.ts +8 -0
  514. package/dist/components/postal-code-input/postal-code-input.agent.d.ts.map +1 -0
  515. package/dist/components/postal-code-input/postal-code-input.d.ts +27 -0
  516. package/dist/components/postal-code-input/postal-code-input.d.ts.map +1 -0
  517. package/dist/components/practice-results/index.js +1 -1
  518. package/dist/components/pregnancy-dating/index.js +1 -1
  519. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  520. package/dist/components/product-hub-tray/index.js +1 -1
  521. package/dist/components/product-hub-tray/product-hub-tray.d.ts +13 -1
  522. package/dist/components/product-hub-tray/product-hub-tray.d.ts.map +1 -1
  523. package/dist/components/province-select/index.d.ts +6 -0
  524. package/dist/components/province-select/index.d.ts.map +1 -0
  525. package/dist/components/province-select/index.js +7 -0
  526. package/dist/components/province-select/index.js.map +1 -0
  527. package/dist/components/province-select/it-provinces.d.ts +8 -0
  528. package/dist/components/province-select/it-provinces.d.ts.map +1 -0
  529. package/dist/components/province-select/province-select.agent.d.ts +8 -0
  530. package/dist/components/province-select/province-select.agent.d.ts.map +1 -0
  531. package/dist/components/province-select/province-select.d.ts +38 -0
  532. package/dist/components/province-select/province-select.d.ts.map +1 -0
  533. package/dist/components/public-footer/public-footer.d.ts +1 -1
  534. package/dist/components/public-header/index.js +1 -1
  535. package/dist/components/radiograph-panel/index.d.ts +4 -0
  536. package/dist/components/radiograph-panel/index.d.ts.map +1 -0
  537. package/dist/components/radiograph-panel/index.js +7 -0
  538. package/dist/components/radiograph-panel/index.js.map +1 -0
  539. package/dist/components/radiograph-panel/radiograph-panel.agent.d.ts +13 -0
  540. package/dist/components/radiograph-panel/radiograph-panel.agent.d.ts.map +1 -0
  541. package/dist/components/radiograph-panel/radiograph-panel.d.ts +36 -0
  542. package/dist/components/radiograph-panel/radiograph-panel.d.ts.map +1 -0
  543. package/dist/components/reviews-panel/index.js +1 -1
  544. package/dist/components/reviews-panel/reviews-panel.d.ts.map +1 -1
  545. package/dist/components/rich-text-editor/editor-toolbar.d.ts +17 -0
  546. package/dist/components/rich-text-editor/editor-toolbar.d.ts.map +1 -1
  547. package/dist/components/rich-text-editor/index.js +1 -1
  548. package/dist/components/rich-text-editor/rich-text-editor.agent.d.ts.map +1 -1
  549. package/dist/components/rich-text-editor/rich-text-editor.d.ts.map +1 -1
  550. package/dist/components/scroll-area/index.js +1 -1
  551. package/dist/components/select/index.js +1 -1
  552. package/dist/components/select/select.d.ts +8 -2
  553. package/dist/components/select/select.d.ts.map +1 -1
  554. package/dist/components/sheet/index.js +1 -1
  555. package/dist/components/sheet/sheet.d.ts.map +1 -1
  556. package/dist/components/sidebar/index.js +2 -2
  557. package/dist/components/sidebar/sidebar.d.ts.map +1 -1
  558. package/dist/components/sign-document/index.js +1 -1
  559. package/dist/components/skeleton/skeleton.d.ts +1 -1
  560. package/dist/components/stepper-accordion/index.js +1 -1
  561. package/dist/components/tab-bar/index.js +1 -1
  562. package/dist/components/tab-bar/tab-bar.d.ts +18 -1
  563. package/dist/components/tab-bar/tab-bar.d.ts.map +1 -1
  564. package/dist/components/tabs/index.js +1 -1
  565. package/dist/components/task-card/index.js +1 -1
  566. package/dist/components/task-card/task-card.d.ts +14 -6
  567. package/dist/components/task-card/task-card.d.ts.map +1 -1
  568. package/dist/components/task-tray/index.js +1 -1
  569. package/dist/components/tasks-panel/index.d.ts +4 -0
  570. package/dist/components/tasks-panel/index.d.ts.map +1 -0
  571. package/dist/components/tasks-panel/index.js +6 -0
  572. package/dist/components/tasks-panel/index.js.map +1 -0
  573. package/dist/components/tasks-panel/tasks-panel.agent.d.ts +4 -0
  574. package/dist/components/tasks-panel/tasks-panel.agent.d.ts.map +1 -0
  575. package/dist/components/tasks-panel/tasks-panel.d.ts +152 -0
  576. package/dist/components/tasks-panel/tasks-panel.d.ts.map +1 -0
  577. package/dist/components/token-insert-menu/index.d.ts +4 -0
  578. package/dist/components/token-insert-menu/index.d.ts.map +1 -0
  579. package/dist/components/token-insert-menu/index.js +6 -0
  580. package/dist/components/token-insert-menu/index.js.map +1 -0
  581. package/dist/components/token-insert-menu/token-insert-menu.agent.d.ts +4 -0
  582. package/dist/components/token-insert-menu/token-insert-menu.agent.d.ts.map +1 -0
  583. package/dist/components/token-insert-menu/token-insert-menu.d.ts +33 -0
  584. package/dist/components/token-insert-menu/token-insert-menu.d.ts.map +1 -0
  585. package/dist/components/tool-rail/index.d.ts +4 -0
  586. package/dist/components/tool-rail/index.d.ts.map +1 -0
  587. package/dist/components/tool-rail/index.js +6 -0
  588. package/dist/components/tool-rail/index.js.map +1 -0
  589. package/dist/components/tool-rail/tool-rail.agent.d.ts +4 -0
  590. package/dist/components/tool-rail/tool-rail.agent.d.ts.map +1 -0
  591. package/dist/components/tool-rail/tool-rail.d.ts +160 -0
  592. package/dist/components/tool-rail/tool-rail.d.ts.map +1 -0
  593. package/dist/components/tooth-scheme/index.d.ts +2 -2
  594. package/dist/components/tooth-scheme/index.d.ts.map +1 -1
  595. package/dist/components/tooth-scheme/index.js +30 -23
  596. package/dist/components/tooth-scheme/tooth-data.d.ts +112 -1
  597. package/dist/components/tooth-scheme/tooth-data.d.ts.map +1 -1
  598. package/dist/components/tooth-scheme/tooth-scheme.agent.d.ts +2 -2
  599. package/dist/components/tooth-scheme/tooth-scheme.agent.d.ts.map +1 -1
  600. package/dist/components/tooth-scheme/tooth-scheme.d.ts +84 -11
  601. package/dist/components/tooth-scheme/tooth-scheme.d.ts.map +1 -1
  602. package/dist/components/transaction-chip/index.js +1 -1
  603. package/dist/components/transaction-chip/transaction-chip.d.ts +2 -2
  604. package/dist/components/transaction-chip/transaction-chip.d.ts.map +1 -1
  605. package/dist/components/transcript-panel/index.js +1 -1
  606. package/dist/components/transcript-panel/transcript-panel.d.ts +2 -2
  607. package/dist/components/transcript-panel/transcript-panel.d.ts.map +1 -1
  608. package/dist/components/unit-converter/index.js +1 -1
  609. package/dist/components/warning-stack/index.js +1 -1
  610. package/dist/components/warning-stack/warning-stack.d.ts +10 -7
  611. package/dist/components/warning-stack/warning-stack.d.ts.map +1 -1
  612. package/dist/components/workflow/index.js +1 -1
  613. package/dist/hooks/index.d.ts +1 -0
  614. package/dist/hooks/index.d.ts.map +1 -1
  615. package/dist/hooks/index.js +24 -22
  616. package/dist/hooks/index.js.map +1 -1
  617. package/dist/hooks/use-clamp-overflow.d.ts +19 -0
  618. package/dist/hooks/use-clamp-overflow.d.ts.map +1 -0
  619. package/dist/hooks/use-edge-resize.d.ts +2 -2
  620. package/dist/hooks/use-overflow-collapse.d.ts +46 -0
  621. package/dist/hooks/use-overflow-collapse.d.ts.map +1 -0
  622. package/dist/hooks/use-persistent-state.d.ts +7 -1
  623. package/dist/hooks/use-persistent-state.d.ts.map +1 -1
  624. package/dist/hooks/use-scroll-overflow.d.ts +36 -0
  625. package/dist/hooks/use-scroll-overflow.d.ts.map +1 -0
  626. package/dist/i18n/locales/ar.d.ts +475 -26
  627. package/dist/i18n/locales/ar.d.ts.map +1 -1
  628. package/dist/i18n/locales/ar.js +478 -31
  629. package/dist/i18n/locales/ar.js.map +1 -1
  630. package/dist/i18n/locales/de.d.ts +475 -26
  631. package/dist/i18n/locales/de.d.ts.map +1 -1
  632. package/dist/i18n/locales/de.js +480 -31
  633. package/dist/i18n/locales/de.js.map +1 -1
  634. package/dist/i18n/locales/el.d.ts +475 -26
  635. package/dist/i18n/locales/el.d.ts.map +1 -1
  636. package/dist/i18n/locales/el.js +485 -31
  637. package/dist/i18n/locales/el.js.map +1 -1
  638. package/dist/i18n/locales/en.d.ts +476 -34
  639. package/dist/i18n/locales/en.d.ts.map +1 -1
  640. package/dist/i18n/locales/en.js +492 -39
  641. package/dist/i18n/locales/en.js.map +1 -1
  642. package/dist/i18n/locales/es.d.ts +475 -26
  643. package/dist/i18n/locales/es.d.ts.map +1 -1
  644. package/dist/i18n/locales/es.js +477 -31
  645. package/dist/i18n/locales/es.js.map +1 -1
  646. package/dist/i18n/locales/fr.d.ts +475 -26
  647. package/dist/i18n/locales/fr.d.ts.map +1 -1
  648. package/dist/i18n/locales/fr.js +480 -31
  649. package/dist/i18n/locales/fr.js.map +1 -1
  650. package/dist/i18n/locales/hi.d.ts +475 -26
  651. package/dist/i18n/locales/hi.d.ts.map +1 -1
  652. package/dist/i18n/locales/hi.js +476 -31
  653. package/dist/i18n/locales/hi.js.map +1 -1
  654. package/dist/i18n/locales/it.d.ts +475 -26
  655. package/dist/i18n/locales/it.d.ts.map +1 -1
  656. package/dist/i18n/locales/it.js +480 -31
  657. package/dist/i18n/locales/it.js.map +1 -1
  658. package/dist/i18n/locales/ja.d.ts +475 -26
  659. package/dist/i18n/locales/ja.d.ts.map +1 -1
  660. package/dist/i18n/locales/ja.js +481 -31
  661. package/dist/i18n/locales/ja.js.map +1 -1
  662. package/dist/i18n/locales/nl.d.ts +475 -26
  663. package/dist/i18n/locales/nl.d.ts.map +1 -1
  664. package/dist/i18n/locales/nl.js +473 -31
  665. package/dist/i18n/locales/nl.js.map +1 -1
  666. package/dist/i18n/locales/pl.d.ts +475 -26
  667. package/dist/i18n/locales/pl.d.ts.map +1 -1
  668. package/dist/i18n/locales/pl.js +481 -31
  669. package/dist/i18n/locales/pl.js.map +1 -1
  670. package/dist/i18n/locales/pt.d.ts +475 -26
  671. package/dist/i18n/locales/pt.d.ts.map +1 -1
  672. package/dist/i18n/locales/pt.js +485 -31
  673. package/dist/i18n/locales/pt.js.map +1 -1
  674. package/dist/i18n/locales/ro.d.ts +475 -26
  675. package/dist/i18n/locales/ro.d.ts.map +1 -1
  676. package/dist/i18n/locales/ro.js +485 -31
  677. package/dist/i18n/locales/ro.js.map +1 -1
  678. package/dist/i18n/locales/ru.d.ts +475 -26
  679. package/dist/i18n/locales/ru.d.ts.map +1 -1
  680. package/dist/i18n/locales/ru.js +478 -31
  681. package/dist/i18n/locales/ru.js.map +1 -1
  682. package/dist/i18n/locales/sq.d.ts +475 -26
  683. package/dist/i18n/locales/sq.d.ts.map +1 -1
  684. package/dist/i18n/locales/sq.js +482 -31
  685. package/dist/i18n/locales/sq.js.map +1 -1
  686. package/dist/i18n/locales/sv.d.ts +475 -26
  687. package/dist/i18n/locales/sv.d.ts.map +1 -1
  688. package/dist/i18n/locales/sv.js +480 -31
  689. package/dist/i18n/locales/sv.js.map +1 -1
  690. package/dist/i18n/locales/tr.d.ts +475 -26
  691. package/dist/i18n/locales/tr.d.ts.map +1 -1
  692. package/dist/i18n/locales/tr.js +478 -31
  693. package/dist/i18n/locales/tr.js.map +1 -1
  694. package/dist/i18n/locales/zh.d.ts +475 -26
  695. package/dist/i18n/locales/zh.d.ts.map +1 -1
  696. package/dist/i18n/locales/zh.js +473 -31
  697. package/dist/i18n/locales/zh.js.map +1 -1
  698. package/dist/index.js +826 -709
  699. package/dist/index.js.map +1 -1
  700. package/dist/locales/ar.json +480 -31
  701. package/dist/locales/de.json +480 -31
  702. package/dist/locales/el.json +480 -31
  703. package/dist/locales/en.json +480 -31
  704. package/dist/locales/es.json +480 -31
  705. package/dist/locales/fr.json +480 -31
  706. package/dist/locales/hi.json +480 -31
  707. package/dist/locales/it.json +480 -31
  708. package/dist/locales/ja.json +480 -31
  709. package/dist/locales/nl.json +480 -31
  710. package/dist/locales/pl.json +480 -31
  711. package/dist/locales/pt.json +480 -31
  712. package/dist/locales/ro.json +480 -31
  713. package/dist/locales/ru.json +480 -31
  714. package/dist/locales/sq.json +480 -31
  715. package/dist/locales/sv.json +480 -31
  716. package/dist/locales/tr.json +480 -31
  717. package/dist/locales/zh.json +480 -31
  718. package/dist/patterns/alia-assistant/alia-chat-surface.d.ts.map +1 -1
  719. package/dist/patterns/alia-assistant/alia-types.d.ts +9 -0
  720. package/dist/patterns/alia-assistant/alia-types.d.ts.map +1 -1
  721. package/dist/patterns/alia-assistant/index.js +1 -1
  722. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  723. package/dist/patterns/patient-shell/index.js +1 -1
  724. package/dist/tokens.css +9 -1
  725. package/package.json +101 -5
  726. package/dist/_chunks/actions-cell-renderer-DrcaxB0w.js.map +0 -1
  727. package/dist/_chunks/ai-tools-rail-BA_sqy1A.js +0 -373
  728. package/dist/_chunks/ai-tools-rail-BA_sqy1A.js.map +0 -1
  729. package/dist/_chunks/alert-_mUKLmwA.js.map +0 -1
  730. package/dist/_chunks/alia-sidebar-B47qRQb5.js.map +0 -1
  731. package/dist/_chunks/app-frame-BYx1gcV7.js.map +0 -1
  732. package/dist/_chunks/appointment-tray-CZtvtaH-.js +0 -431
  733. package/dist/_chunks/appointment-tray-CZtvtaH-.js.map +0 -1
  734. package/dist/_chunks/autocomplete-DOeGouCL.js.map +0 -1
  735. package/dist/_chunks/badge-CqGsX32l.js.map +0 -1
  736. package/dist/_chunks/chat-message-3V54YipB.js.map +0 -1
  737. package/dist/_chunks/clinical-note-card-DqQYf_D4.js +0 -333
  738. package/dist/_chunks/clinical-note-card-DqQYf_D4.js.map +0 -1
  739. package/dist/_chunks/combobox-Clum7gJ1.js.map +0 -1
  740. package/dist/_chunks/editable-currency-cell-renderer-kgqp_mIw.js +0 -448
  741. package/dist/_chunks/editable-currency-cell-renderer-kgqp_mIw.js.map +0 -1
  742. package/dist/_chunks/email-input-B_Y55f5G.js +0 -396
  743. package/dist/_chunks/message-card-Bx4GmLvf.js +0 -277
  744. package/dist/_chunks/message-card-Bx4GmLvf.js.map +0 -1
  745. package/dist/_chunks/message-tray-DwrBLJlf.js.map +0 -1
  746. package/dist/_chunks/notification-card-BiESdm8q.js +0 -255
  747. package/dist/_chunks/notification-card-BiESdm8q.js.map +0 -1
  748. package/dist/_chunks/notification-tray-Btb9oQeZ.js.map +0 -1
  749. package/dist/_chunks/patient-summary-card-B836_fDB.js +0 -435
  750. package/dist/_chunks/patient-summary-card-B836_fDB.js.map +0 -1
  751. package/dist/_chunks/patient-table-CDuosVru.js +0 -889
  752. package/dist/_chunks/patient-table-CDuosVru.js.map +0 -1
  753. package/dist/_chunks/payment-request-card-DioWKBUq.js.map +0 -1
  754. package/dist/_chunks/pdf-viewer-D6BPfW2D.js.map +0 -1
  755. package/dist/_chunks/product-hub-panel-e6pW220e.js.map +0 -1
  756. package/dist/_chunks/reviews-panel-Dq7LMDcH.js +0 -555
  757. package/dist/_chunks/reviews-panel-Dq7LMDcH.js.map +0 -1
  758. package/dist/_chunks/rich-text-editor-BsV7zUdg.js +0 -2142
  759. package/dist/_chunks/rich-text-editor-BsV7zUdg.js.map +0 -1
  760. package/dist/_chunks/scroll-area-5wNK0Cyz.js.map +0 -1
  761. package/dist/_chunks/select-DMLG44F5.js.map +0 -1
  762. package/dist/_chunks/sheet-BxsE7eQm.js.map +0 -1
  763. package/dist/_chunks/sidebar-DY9jGjgt.js.map +0 -1
  764. package/dist/_chunks/stepper-accordion-Dki6r9ZE.js.map +0 -1
  765. package/dist/_chunks/tab-bar-B1ovILzh.js +0 -105
  766. package/dist/_chunks/tab-bar-B1ovILzh.js.map +0 -1
  767. package/dist/_chunks/task-card-BwY9jaV1.js +0 -124
  768. package/dist/_chunks/task-card-BwY9jaV1.js.map +0 -1
  769. package/dist/_chunks/tooth-scheme-yBr53cvv.js +0 -1330
  770. package/dist/_chunks/tooth-scheme-yBr53cvv.js.map +0 -1
  771. package/dist/_chunks/transaction-chip-DK84XCBU.js.map +0 -1
  772. package/dist/_chunks/transcript-panel-3THQX6nJ.js.map +0 -1
  773. package/dist/_chunks/use-persistent-state-i23OWy6G.js +0 -24
  774. package/dist/_chunks/use-persistent-state-i23OWy6G.js.map +0 -1
  775. package/dist/_chunks/warning-stack-BsgaEbL8.js.map +0 -1
  776. package/dist/_chunks/workflow-map-Bdam9pGp.js.map +0 -1
  777. package/dist/components/ai-tools-rail/ai-tools-rail.agent.d.ts +0 -4
  778. package/dist/components/ai-tools-rail/ai-tools-rail.agent.d.ts.map +0 -1
  779. package/dist/components/ai-tools-rail/ai-tools-rail.d.ts +0 -68
  780. package/dist/components/ai-tools-rail/ai-tools-rail.d.ts.map +0 -1
  781. package/dist/components/ai-tools-rail/index.d.ts +0 -4
  782. package/dist/components/ai-tools-rail/index.d.ts.map +0 -1
  783. package/dist/components/ai-tools-rail/index.js +0 -6
  784. package/dist/components/patient-table/cell-renderers/contact-cell.d.ts +0 -45
  785. package/dist/components/patient-table/cell-renderers/contact-cell.d.ts.map +0 -1
  786. package/dist/components/patient-table/cell-renderers/patient-identity-cell.d.ts +0 -26
  787. package/dist/components/patient-table/cell-renderers/patient-identity-cell.d.ts.map +0 -1
  788. /package/dist/components/{ai-tools-rail → address-fields}/index.js.map +0 -0
@@ -0,0 +1,120 @@
1
+ import { jsxs as k, jsx as n } from "react/jsx-runtime";
2
+ import { forwardRef as c } from "react";
3
+ import { c as t } from "./index-D2ZczOXr.js";
4
+ import { useTranslation as f } from "react-i18next";
5
+ const b = [
6
+ "circle",
7
+ "square",
8
+ "triangle",
9
+ "diamond",
10
+ "cross"
11
+ ];
12
+ function v(o, e, s, a) {
13
+ switch (o) {
14
+ case "circle":
15
+ return `M ${e - a} ${s} a ${a} ${a} 0 1 0 ${2 * a} 0 a ${a} ${a} 0 1 0 ${-2 * a} 0 Z`;
16
+ case "square": {
17
+ const r = a * 0.88;
18
+ return `M ${e - r} ${s - r} H ${e + r} V ${s + r} H ${e - r} Z`;
19
+ }
20
+ case "triangle": {
21
+ const r = a * 0.95;
22
+ return `M ${e} ${s - a} L ${e + r} ${s + a * 0.8} L ${e - r} ${s + a * 0.8} Z`;
23
+ }
24
+ case "diamond":
25
+ return `M ${e} ${s - a} L ${e + a} ${s} L ${e} ${s + a} L ${e - a} ${s} Z`;
26
+ case "cross": {
27
+ const r = a * 0.4;
28
+ return [
29
+ `M ${e - r} ${s - a}`,
30
+ `H ${e + r}`,
31
+ `V ${s - r}`,
32
+ `H ${e + a}`,
33
+ `V ${s + r}`,
34
+ `H ${e + r}`,
35
+ `V ${s + a}`,
36
+ `H ${e - r}`,
37
+ `V ${s + r}`,
38
+ `H ${e - a}`,
39
+ `V ${s - r}`,
40
+ `H ${e - r}`,
41
+ "Z"
42
+ ].join(" ");
43
+ }
44
+ }
45
+ }
46
+ const p = t(
47
+ "ds:block ds:[inline-size:var(--marker-box)] ds:[block-size:var(--marker-box)]",
48
+ {
49
+ variants: {
50
+ tone: {
51
+ neutral: "ds:[--marker-color:var(--muted-foreground)]",
52
+ info: "ds:[--marker-color:var(--info)]",
53
+ success: "ds:[--marker-color:var(--success)]",
54
+ warning: "ds:[--marker-color:var(--warning)]",
55
+ error: "ds:[--marker-color:var(--destructive)]",
56
+ accent: "ds:[--marker-color:var(--accent)]"
57
+ },
58
+ filled: {
59
+ true: "ds:[fill:var(--marker-color)] ds:[stroke:none]",
60
+ false: "ds:[fill:none] ds:[stroke:var(--marker-color)] ds:[stroke-width:2.5]"
61
+ }
62
+ },
63
+ defaultVariants: { tone: "neutral", filled: !0 }
64
+ }
65
+ ), g = t("ds:inline-flex ds:items-center ds:gap-1.5", {
66
+ variants: {
67
+ size: {
68
+ sm: "ds:[--marker-box:0.75rem]",
69
+ md: "ds:[--marker-box:1rem]",
70
+ lg: "ds:[--marker-box:1.25rem]"
71
+ }
72
+ },
73
+ defaultVariants: { size: "md" }
74
+ }), M = c(
75
+ ({
76
+ shape: o,
77
+ tone: e = "neutral",
78
+ filled: s = !0,
79
+ size: a = "md",
80
+ label: r,
81
+ "aria-label": i,
82
+ className: d,
83
+ ...m
84
+ }, $) => {
85
+ const { t: l } = f(), u = i ?? (typeof r == "string" ? r : l(`annotationMarker.shape.${o}`));
86
+ return /* @__PURE__ */ k(
87
+ "span",
88
+ {
89
+ ref: $,
90
+ "data-component": "annotation-marker",
91
+ "data-marker-shape": o,
92
+ "data-marker-tone": e,
93
+ className: g({ size: a, className: d }),
94
+ ...m,
95
+ children: [
96
+ /* @__PURE__ */ n(
97
+ "svg",
98
+ {
99
+ viewBox: "0 0 24 24",
100
+ className: p({ tone: e, filled: s }),
101
+ role: "img",
102
+ "aria-label": r ? void 0 : u,
103
+ "aria-hidden": r ? !0 : void 0,
104
+ focusable: "false",
105
+ children: /* @__PURE__ */ n("path", { d: v(o, 12, 12, 9) })
106
+ }
107
+ ),
108
+ r != null && /* @__PURE__ */ n("span", { children: r })
109
+ ]
110
+ }
111
+ );
112
+ }
113
+ );
114
+ M.displayName = "AnnotationMarker";
115
+ export {
116
+ M as A,
117
+ b as M,
118
+ v as m
119
+ };
120
+ //# sourceMappingURL=annotation-marker-qt5R9WZX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotation-marker-qt5R9WZX.js","sources":["../../src/components/annotation-marker/annotation-marker.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* AnnotationMarker — the shared clinical-scheme marker glyph. */\n/* */\n/* A small presentational glyph used to mark a finding on any charting */\n/* surface (AnatomyScheme region overlay, a finding-type picker, a */\n/* legend, a note card). The SHAPE is the channel — meaning is never */\n/* carried by colour alone (WCAG 1.4.1). The same geometry is shared */\n/* with AnatomyScheme via `markerPath`, so the in-SVG overlay and the */\n/* standalone glyph never drift. */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, type ReactNode } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ------------------------------------------------------------------ */\n/* Vocabulary */\n/* ------------------------------------------------------------------ */\n\nexport type MarkerShape =\n | 'circle'\n | 'square'\n | 'triangle'\n | 'diamond'\n | 'cross';\nexport type MarkerTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\n | 'accent';\n\nexport const MARKER_SHAPES: MarkerShape[] = [\n 'circle',\n 'square',\n 'triangle',\n 'diamond',\n 'cross',\n];\n\n/* ------------------------------------------------------------------ */\n/* Geometry — pure, shared with AnatomyScheme */\n/* ------------------------------------------------------------------ */\n\n/**\n * SVG path `d` for a marker shape centred at `(cx, cy)` with radius `r`,\n * in the parent SVG's own user units. Pure — no React, no DOM. AnatomyScheme\n * draws its finding overlay with this exact function so the figure overlay and\n * the standalone glyph stay visually identical.\n */\nexport function markerPath(\n shape: MarkerShape,\n cx: number,\n cy: number,\n r: number,\n): string {\n switch (shape) {\n case 'circle':\n return `M ${cx - r} ${cy} a ${r} ${r} 0 1 0 ${2 * r} 0 a ${r} ${r} 0 1 0 ${-2 * r} 0 Z`;\n case 'square': {\n const s = r * 0.88;\n return `M ${cx - s} ${cy - s} H ${cx + s} V ${cy + s} H ${cx - s} Z`;\n }\n case 'triangle': {\n const w = r * 0.95;\n return `M ${cx} ${cy - r} L ${cx + w} ${cy + r * 0.8} L ${cx - w} ${cy + r * 0.8} Z`;\n }\n case 'diamond':\n return `M ${cx} ${cy - r} L ${cx + r} ${cy} L ${cx} ${cy + r} L ${cx - r} ${cy} Z`;\n case 'cross': {\n // A filled plus sign — reads as a distinct shape at any fill/stroke.\n const a = r * 0.4;\n return [\n `M ${cx - a} ${cy - r}`,\n `H ${cx + a}`,\n `V ${cy - a}`,\n `H ${cx + r}`,\n `V ${cy + a}`,\n `H ${cx + a}`,\n `V ${cy + r}`,\n `H ${cx - a}`,\n `V ${cy + a}`,\n `H ${cx - r}`,\n `V ${cy - a}`,\n `H ${cx - a}`,\n 'Z',\n ].join(' ');\n }\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA — glyph fill/stroke per tone */\n/* ------------------------------------------------------------------ */\n\n// Each tone resolves to a single token; `filled` fills the shape, otherwise it\n// is drawn as an outline. The shape (not the tone) is the accessible channel.\nconst glyphVariants = cva(\n 'ds:block ds:[inline-size:var(--marker-box)] ds:[block-size:var(--marker-box)]',\n {\n variants: {\n tone: {\n neutral: 'ds:[--marker-color:var(--muted-foreground)]',\n info: 'ds:[--marker-color:var(--info)]',\n success: 'ds:[--marker-color:var(--success)]',\n warning: 'ds:[--marker-color:var(--warning)]',\n error: 'ds:[--marker-color:var(--destructive)]',\n accent: 'ds:[--marker-color:var(--accent)]',\n },\n filled: {\n true: 'ds:[fill:var(--marker-color)] ds:[stroke:none]',\n false:\n 'ds:[fill:none] ds:[stroke:var(--marker-color)] ds:[stroke-width:2.5]',\n },\n },\n defaultVariants: { tone: 'neutral', filled: true },\n },\n);\n\nconst wrapperVariants = cva('ds:inline-flex ds:items-center ds:gap-1.5', {\n variants: {\n size: {\n sm: 'ds:[--marker-box:0.75rem]',\n md: 'ds:[--marker-box:1rem]',\n lg: 'ds:[--marker-box:1.25rem]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\nexport interface AnnotationMarkerProps\n extends\n Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'>,\n VariantProps<typeof wrapperVariants> {\n /** Shape of the marker — the accessible channel (never colour alone). */\n shape: MarkerShape;\n /** Semantic tone. Decorative reinforcement of the shape, not the meaning. */\n tone?: MarkerTone;\n /** Fill the shape (default) or draw it as an outline. */\n filled?: boolean;\n /**\n * Accessible name. Required for an icon-only marker (no `label`); when `label`\n * text is shown, this overrides the visible text for assistive tech.\n */\n 'aria-label'?: string;\n /** Optional visible label rendered after the glyph (e.g. in a legend). */\n label?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* AnnotationMarker */\n/* ------------------------------------------------------------------ */\n\nexport const AnnotationMarker = forwardRef<\n HTMLSpanElement,\n AnnotationMarkerProps\n>(\n (\n {\n shape,\n tone = 'neutral',\n filled = true,\n size = 'md',\n label,\n 'aria-label': ariaLabel,\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const accessibleName =\n ariaLabel ??\n (typeof label === 'string'\n ? label\n : t(`annotationMarker.shape.${shape}`));\n\n return (\n <span\n ref={ref}\n data-component=\"annotation-marker\"\n data-marker-shape={shape}\n data-marker-tone={tone}\n className={wrapperVariants({ size, className })}\n {...props}\n >\n <svg\n viewBox=\"0 0 24 24\"\n className={glyphVariants({ tone, filled })}\n role=\"img\"\n aria-label={label ? undefined : accessibleName}\n aria-hidden={label ? true : undefined}\n focusable=\"false\"\n >\n <path d={markerPath(shape, 12, 12, 9)} />\n </svg>\n {label != null && <span>{label}</span>}\n </span>\n );\n },\n);\n\nAnnotationMarker.displayName = 'AnnotationMarker';\n"],"names":["MARKER_SHAPES","markerPath","shape","cx","cy","r","s","w","a","glyphVariants","cva","wrapperVariants","AnnotationMarker","forwardRef","tone","filled","size","label","ariaLabel","className","props","ref","t","useTranslation","accessibleName","jsxs","jsx"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { jsx as u, jsxs as f } from "react/jsx-runtime";
4
4
  import { useMemo as M } from "react";
5
5
  import { useTranslation as T } from "react-i18next";
6
6
  import { C as I } from "./card-DPmk26CL.js";
7
- import { B as x } from "./badge-CqGsX32l.js";
7
+ import { B as x } from "./badge-DCOqV9mI.js";
8
8
  const _ = 280, S = 14, b = 266, C = 28;
9
9
  function w(t) {
10
10
  if (t < 0) return "preconception";
@@ -410,4 +410,4 @@ export {
410
410
  ht as r,
411
411
  w as t
412
412
  };
413
- //# sourceMappingURL=antenatal-schedule-timeline-35ebkcZT.js.map
413
+ //# sourceMappingURL=antenatal-schedule-timeline-CwXrQRm1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"antenatal-schedule-timeline-35ebkcZT.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-CwXrQRm1.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":";;;;;;;AA8CO,MAAMA,IAAiB,KAEjBC,IAAyB,IAEzBC,IAA4B,KAE5BC,IAAuB;AA6B7B,SAASC,EAAkBC,GAA8B;AAC9D,MAAIA,IAAY,EAAG,QAAO;AAC1B,QAAMC,IAAQ,KAAK,MAAMD,IAAY,CAAC;AACtC,SAAIC,IAAQ,KAAW,UACnBA,IAAQ,KAAW,WACnBA,IAAQ,KAAW,UAChB;AACT;AAOO,SAASC,GACdC,GACAC,GACe;AACf,QAAM,EAAE,QAAAC,GAAQ,MAAAC,EAAA,IAASH;AAEzB,MAAII,GACAC;AAEJ,MAAIH,MAAW,OAAO;AACpB,UAAMI,IAAQN,EAAM,eAAeL;AACnC,IAAAS,IAAmBD,GACnBE,IAAUE,EAAQJ,GAAMX,KAAkBc,IAAQX,EAAqB;AAAA,EACzE,WAAWO,MAAW;AACpB,IAAAE,IAAmBI,EAAQL,GAAMV,CAAsB,GACvDY,IAAUE,EAAQJ,GAAMT,CAAyB;AAAA,OAC5C;AAEL,UAAMe,IAAST,EAAM,aAAa,GAC5BU,IAAiBF,EAAQL,GAAMM,CAAM;AAC3C,IAAAL,IAAmBI,EAAQE,GAAgBjB,CAAsB,GACjEY,IAAUE,EAAQG,GAAgBhB,CAAyB;AAAA,EAC7D;AAEA,QAAMG,IAAYc,EAAyBV,GAAOG,CAAgB,GAC5DQ,IACJf,IAAY,IACR,OACA;AAAA,IACE,OAAO,KAAK,MAAMA,IAAY,CAAC;AAAA,IAC/B,MAAMA,IAAY;AAAA,IAClB,WAAAA;AAAA,EAAA;AAGR,SAAO;AAAA,IACL,SAAAQ;AAAA,IACA,kBAAAD;AAAA,IACA,gBAAAQ;AAAA,IACA,WAAWhB,EAAkBC,CAAS;AAAA,EAAA;AAE1C;AAOO,MAAMgB,IAAkB,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE;AAgB3C,SAASC,GACdV,GACwB;AACxB,SAAOS,EAAgB,IAAI,CAACE,OAAU;AAAA,IACpC,KAAK,IAAIA,CAAI;AAAA,IACb,MAAAA;AAAA,IACA,MAAMR,EAAQH,GAAkBW,IAAO,CAAC;AAAA,EAAA,EACxC;AACJ;AAoBO,MAAMC,KACX;AAAA,EACE,eAAe;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AACZ,GAgBWC,IAAuD;AAAA,EAClE,eAAe;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AACZ;AAGO,SAASC,GAAwBC,GAA8B;AACpE,SAAOF,EAA0BE,CAAS;AAC5C;AAsBA,MAAMC,IAAM,CAACL,GAAcM,IAAI,MAAcN,IAAO,IAAIM;AAQjD,SAASC,EACdC,GACAC,IAA6B,WAC7BC,IAA4B,QACR;AACpB,MAAIF,MAAc,YAAa,QAAO;AAEtC,MAAIA,MAAc;AAEhB,WAAO,EAAE,UAAUH,EAAI,IAAI,CAAC,GAAG,QAAQA,EAAI,IAAI,CAAC,GAAG,QAAQ,aAAA;AAI7D,QAAMM,IACJF,MAAiB,YAAY,6BAA6BA;AAE5D,MAAIC,MAAc;AAChB,YAAQC,GAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA,UACL,UAAUN,EAAI,IAAI,CAAC;AAAA,UACnB,QAAQA,EAAI,IAAI,CAAC;AAAA,UACjB,QAAQ;AAAA,QAAA;AAAA,MAEZ,KAAK;AACH,eAAO;AAAA,UACL,UAAUA,EAAI,IAAI,CAAC;AAAA,UACnB,QAAQA,EAAI,IAAI,CAAC;AAAA,UACjB,QAAQ;AAAA,QAAA;AAAA,MAEZ,KAAK;AACH,eAAO;AAAA,UACL,UAAUA,EAAI,IAAI,CAAC;AAAA,UACnB,QAAQA,EAAI,IAAI,CAAC;AAAA,UACjB,QAAQ;AAAA,QAAA;AAAA,IACV;AAKN,UAAQM,GAAA;AAAA,IACN,KAAK;AACH,aAAO,EAAE,UAAUN,EAAI,IAAI,CAAC,GAAG,QAAQA,EAAI,IAAI,CAAC,GAAG,QAAQ,aAAA;AAAA,IAC7D,KAAK;AACH,aAAO,EAAE,UAAUA,EAAI,IAAI,CAAC,GAAG,QAAQA,EAAI,IAAI,CAAC,GAAG,QAAQ,aAAA;AAAA,IAC7D,KAAK;AACH,aAAO,EAAE,UAAUA,EAAI,IAAI,CAAC,GAAG,QAAQA,EAAI,IAAI,CAAC,GAAG,QAAQ,aAAA;AAAA,EAAa;AAE9E;AAcO,MAAMO,IAAoB,IACpBC,IAAoB;AAG1B,SAASC,EAAwBC,GAAuB;AAE7D,SAAO,QAAQ,KAAK,KAAKA,IAAQ,KAAK,IAAI;AAC5C;AAMO,SAASC,EAAsBC,GAA6B;AACjE,SAAIA,KAAeZ,EAAI,GAAG,CAAC,IAAU,IACjCY,KAAeZ,EAAI,IAAI,CAAC,IAAU,IAClCY,KAAeZ,EAAI,IAAI,CAAC,IAAU,KAClCY,KAAeZ,EAAI,IAAI,CAAC,IAAU,KAC/B;AACT;AA2BO,SAASa,GAAYjC,GAA4C;AACtE,QAAMgC,IAAcrB,EAAyBX,EAAM,UAAUA,EAAM,GAAG,GAChEkC,IAAc,KAAK,MAAML,EAAwB7B,EAAM,KAAK,CAAC,GAC7DmC,IAAkB,KAAK,IAAIH,IAAcE,CAAW,GACpDE,IAAgBL,EAAsBC,CAAW,GACjDK,IAAUF,IAAkBC;AAClC,SAAO;AAAA,IACL,kBAAkBC,IACd7B,EAAQR,EAAM,UAAUkC,CAAW,IACnClC,EAAM;AAAA,IACV,SAAAqC;AAAA,IACA,iBAAAF;AAAA,IACA,eAAAC;AAAA,IACA,aAAaF,IAAcF;AAAA,IAC3B,YACEhC,EAAM,SAAS2B,KAAqB3B,EAAM,SAAS4B;AAAA,EAAA;AAEzD;ACpQA,MAAMU,IAAK,CAACvB,GAAcK,IAAM,MAAcL,IAAO,IAAIK,GAcnDmB,IAAW,CAACC,MAChBA,MAAW,OACP;AAAA,EACE,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUF,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,QAAQ;AACV,IACA;AAAA,EACE,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUA,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,QAAQ;AACV,GAGAG,IAAuB;AAAA,EAC3B,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUH,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AACV,GAGMI,IAAsB;AAAA,EAC1B,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUJ,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AACV,GAGMK,IAAwB;AAAA,EAC5B,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUL,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AACV,GAGMM,IAAa,CAACJ,MACdA,MAAW,OACN;AAAA,EACL,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUF,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,QAAQ;AAAA,IAGRE,MAAW,kBACN;AAAA,EACL,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUF,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,QAAQ;AAAA,IAGL;AAAA,EACL,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUA,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,QAAQ;AAAA,GASNO,IAAyB;AAAA,EAC7B,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUP,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AACV,GAGMQ,IAA2B;AAAA,EAC/B,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUR,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AACV,GAGMS,IAA6B;AAAA,EACjC,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUT,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AACV,GAGMU,IAAM,CAACR,MACXA,MAAW,OACP;AAAA,EACE,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUF,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,QAAQ;AACV,IACA;AAAA;AAAA,EAEE,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUA,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,QAAQ;AACV,GAGAW,IAAwB;AAAA,EAC5B,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUX,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AACV,GAOMY,IAAuB;AAAA,EAC3B,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUZ,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,WAAW,CAAC,WAAW;AAAA,EACvB,QAAQ;AACV,GAGMa,IAAsB;AAAA,EAC1B,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUb,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,WAAW,CAAC,WAAW;AAAA,EACvB,QAAQ;AACV,GAOMc,IAA4C;AAAA,EAChD,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAUd,EAAG,IAAI,CAAC;AAAA,EAClB,QAAQA,EAAG,IAAI,CAAC;AAAA,EAChB,WAAW,CAAC,QAAQ,SAAS;AAAA,EAC7B,QAAQ;AACV;AAGA,SAASe,GAAWb,GAA0C;AAC5D,SAAO;AAAA,IACLD,EAASC,CAAM;AAAA,IACfC;AAAA,IACAC;AAAA,IACAU;AAAA,IACAT;AAAA,IACAC,EAAWJ,CAAM;AAAA,IACjBM;AAAA,IACAD;AAAA,IACAE;AAAA,IACAG;AAAA,IACAF,EAAIR,CAAM;AAAA,IACVS;AAAA,IACAE;AAAA,EAAA;AAEJ;AASA,SAASG,GACP/B,GACAC,GACAC,GACkB;AAClB,MAAIF,MAAc,YAAa,QAAO,CAAA;AAEtC,QAAMgC,IAAgB/B,MAAiB,0BACjCgC,IAAaD,IAAgB,IAAI,GACjCE,IAAWF,IAAgB,KAAK,IAChCG,IAAQpC,EAAmBC,GAAWC,GAAcC,CAAS,GAE7DkC,IAA2B;AAAA,IAC/B;AAAA,MACE,KAAK;AAAA,MACL,UAAU;AAAA,MACV,UAAUrB,EAAGmB,GAAU,CAAC;AAAA;AAAA,MAExB,QAAQC,IAAQA,EAAM,WAAWpB,EAAG,IAAI,CAAC;AAAA,MACzC,QAAQiB,IAAgB,eAAe;AAAA,MACvC,MAAM,EAAE,YAAAC,GAAY,UAAAC,EAAA;AAAA,IAAS;AAAA,EAC/B;AAGF,SAAIC,KACFC,EAAO,KAAK;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,IACV,UAAUD,EAAM;AAAA,IAChB,QAAQA,EAAM;AAAA,IACd,QAAQA,EAAM;AAAA,EAAA,CACf,GAGIC;AACT;AAOA,SAASC,GACPC,GACAC,GAOS;AAIT,MAHID,EAAM,aAAa,CAACA,EAAM,UAAU,SAASC,EAAK,SAAS,KAG3DD,EAAM,gBAAgB,CAACA,EAAM,aAAa,SAASC,EAAK,YAAY;AACtE,WAAO;AAET,UAAQD,EAAM,WAAA;AAAA,IACZ,KAAK;AACH,aAAOC,EAAK;AAAA,IACd,KAAK;AACH,aAAOA,EAAK,YAAY;AAAA,IAC1B,KAAK;AACH,aAAOA,EAAK,YAAY;AAAA,IAC1B,KAAK;AACH,aAAOA,EAAK;AAAA,IACd;AACE,aAAO;AAAA,EAAA;AAEb;AAEA,SAASC,GACPC,GACAC,GACAhE,GACAiE,GAC4C;AAC5C,QAAMC,IAAiBxD,EAAyBqD,GAAO/D,CAAK;AAG5D,SAFqBU,EAAyBsD,GAAKhE,CAAK,IAErC,IAAU,EAAE,QAAQ,QAAQ,MAAM,GAAA,IAEjDkE,KAAkB,IAAU,EAAE,QAAQ,WAAW,MAAM,GAAA,IAEpD,EAAE,QAAQ,YAAY,MAAMA,KAAkBD,EAAA;AACvD;AAOO,SAASE,GACdhE,GACA0D,IAAiC,IACP;AAC1B,QAAM;AAAA,IACJ,OAAA7D,wBAAY,KAAA;AAAA,IACZ,UAAAoE,IAAW;AAAA,IACX,WAAA9C,IAAY;AAAA,IACZ,cAAAC,IAAe;AAAA,IACf,YAAA8C,IAAa;AAAA,IACb,SAAAC;AAAA,IACA,qBAAAC,IAAsB;AAAA,IACtB,gBAAAC,IAAiB;AAAA,IACjB,UAAAP,IAAW;AAAA,EAAA,IACTJ;AAEJ,SAAO;AAAA,IACL,GAAGT,GAAWgB,CAAQ;AAAA,IACtB,GAAGf,GAAe/B,GAAWC,GAAciD,CAAc;AAAA,EAAA,EAExD;AAAA,IAAO,CAACZ,MACPD,GAAaC,GAAO;AAAA,MAClB,WAAAtC;AAAA,MACA,cAAAC;AAAA,MACA,YAAA8C;AAAA,MACA,SAAAC;AAAA,MACA,qBAAAC;AAAA,IAAA,CACD;AAAA,EAAA,EAEF,IAAI,CAACX,MAAkC;AACtC,UAAMG,IAAQzD,EAAQH,GAAkByD,EAAM,QAAQ,GAChDI,IAAM1D,EAAQH,GAAkByD,EAAM,MAAM,GAC5C,EAAE,QAAAa,GAAQ,MAAAC,MAASZ,GAAUC,GAAOC,GAAKhE,GAAOiE,CAAQ;AAC9D,WAAO;AAAA,MACL,GAAGL;AAAA,MACH,OAAAG;AAAA,MACA,KAAAC;AAAA,MACA,QAAQJ,EAAM,aAAaA,EAAM;AAAA,MACjC,QAAAa;AAAA,MACA,MAAAC;AAAA,IAAA;AAAA,EAEJ,CAAC,EACA,KAAK,CAACC,GAAGC,MAAM;AACd,UAAMC,IAAUF,EAAE,WAAWC,EAAE;AAC/B,WAAOC,MAAY,IAAIA,IAAUF,EAAE,SAASC,EAAE;AAAA,EAChD,CAAC;AACL;ACncA,SAASE,GACPL,GACAC,GACgC;AAChC,SAAID,MAAW,SAAe,YAC1BA,MAAW,aACRC,IAD0B,YACP;AAC5B;AAGA,SAASK,EAAQC,GAAsB;AACrC,SAAO,GAAG,KAAK,MAAMA,IAAO,CAAC,CAAC,IAAIA,IAAO,CAAC;AAC5C;AAGA,MAAMC,KAAoD;AAAA,EACxD,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,aAAa;AAAA,EACb,WAAW;AACb;AAMA,SAASC,EAActB,GAA+BuB,GAAsB;AAC1E,SAAOA,EAAE,2BAA2BvB,EAAM,GAAG,IAAIA,EAAM,QAAQ,EAAE;AACnE;AAQO,SAASwB,GACd1B,GACAyB,GACAE,GACmB;AACnB,SAAO3B,EAAO,IAAI,CAACE,OAAW;AAAA,IAC5B,MAAMqB,GAAcrB,EAAM,QAAQ;AAAA,IAClC,OAAOsB,EAActB,GAAOuB,CAAC;AAAA,IAC7B,OAAOvB,EAAM,SACTyB,EAAWzB,EAAM,KAAK,IACtB,GAAGyB,EAAWzB,EAAM,KAAK,CAAC,MAAMyB,EAAWzB,EAAM,GAAG,CAAC;AAAA,EAAA,EACzD;AACJ;AAOO,SAAS0B,GAA0B;AAAA,EACxC,QAAA5B;AACF,GAAmC;AACjC,QAAM,EAAE,GAAAyB,GAAG,MAAAI,EAAA,IAASC,EAAA,GAEdC,IAAgBC;AAAA,IACpB,MAAM,IAAI,KAAK,eAAeH,EAAK,UAAU,EAAE,WAAW,UAAU;AAAA,IACpE,CAACA,EAAK,QAAQ;AAAA,EAAA,GAGVI,IAAa,CAAC/B,MAClBsB,EAActB,GAAOuB,CAAC,GAElBS,IAAc,CAAChC,MACnBA,EAAM,SACF6B,EAAc,OAAO7B,EAAM,KAAK,IAChC,GAAG6B,EAAc,OAAO7B,EAAM,KAAK,CAAC,MAAM6B,EAAc;AAAA,IACtD7B,EAAM;AAAA,EAAA,CACP;AAMP,SACE,gBAAAiC,EAACC,KAAK,SAAQ,YACZ,4BAACA,EAAK,MAAL,EAAU,WAAU,kDACnB,UAAA;AAAA,IAAA,gBAAAD,EAAC,QAAA,EAAK,WAAU,uCACb,UAAAV,EAAE,iCAAiC,GACtC;AAAA,sBACC,MAAA,EAAG,WAAU,kDACX,UAAAzB,EAAO,IAAI,CAACE,MACX,gBAAAmC;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,eAAanC,EAAM;AAAA,QACnB,WAAU;AAAA,QAEV,UAAA;AAAA,UAAA,gBAAAmC,EAAC,QAAA,EAAK,WAAU,kEACd,UAAA;AAAA,YAAA,gBAAAF,EAAC,QAAA,EAAK,WAAU,gCACb,UAAAF,EAAW/B,CAAK,GACnB;AAAA,YACA,gBAAAmC,EAAC,QAAA,EAAK,WAAU,sCACb,UAAA;AAAA,cAAAZ,EAAE,8BAA8BvB,EAAM,QAAQ,EAAE;AAAA,cAAE;AAAA,cAAG;AAAA,cACrDmB,EAAQnB,EAAM,QAAQ;AAAA,cACtBA,EAAM,SAAS,KAAK,MAAMmB,EAAQnB,EAAM,MAAM,CAAC;AAAA,cAAG;AAAA,cAAG;AAAA,cACrDuB,EAAE,4BAA4BvB,EAAM,MAAM,EAAE;AAAA,cAC5CA,EAAM,cAAc,kBACjB,MAAMuB,EAAE,gCAAgC,CAAC,KACzC;AAAA,YAAA,EAAA,CACN;AAAA,UAAA,GACF;AAAA,UACA,gBAAAY,EAAC,QAAA,EAAK,WAAU,4EACd,UAAA;AAAA,YAAA,gBAAAF,EAAC,QAAA,EAAK,WAAU,gCACb,UAAAD,EAAYhC,CAAK,GACpB;AAAA,YACA,gBAAAiC,EAACG,KAAM,SAASlB,GAAmBlB,EAAM,QAAQA,EAAM,IAAI,GACxD,UAAAA,EAAM,WAAW,cAAcA,EAAM,OAClCuB,EAAE,wBAAwB,IAC1BA,EAAE,4BAA4BvB,EAAM,MAAM,EAAE,EAAA,CAClD;AAAA,UAAA,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,MA3BKA,EAAM;AAAA,IAAA,CA6Bd,GACH;AAAA,sBACC,KAAA,EAAE,WAAU,sCACV,UAAAuB,EAAE,8BAA8B,EAAA,CACnC;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;"}
@@ -1,8 +1,9 @@
1
- import { jsxs as n, jsx as s } from "react/jsx-runtime";
2
- import { forwardRef as N, useState as S, useCallback as V } from "react";
1
+ import { jsxs as i, jsx as s } from "react/jsx-runtime";
2
+ import { forwardRef as S, useRef as k, useState as _, useEffect as A } from "react";
3
3
  import { c as a } from "./index-D2ZczOXr.js";
4
- import { useTranslation as _ } from "react-i18next";
5
- const T = a(
4
+ import { useTranslation as E } from "react-i18next";
5
+ import { S as L } from "./scroll-area-BZOvUhwQ.js";
6
+ const R = a(
6
7
  [
7
8
  "ds:h-dvh ds:w-full",
8
9
  "ds:flex ds:flex-col",
@@ -22,9 +23,9 @@ const T = a(
22
23
  "ds:print:[&_[role=banner]]:shadow-none",
23
24
  "ds:print:[&_[role=banner]]:[border-block-end-color:var(--border)]"
24
25
  ].join(" ")
25
- ), A = a(
26
+ ), T = a(
26
27
  ["ds:flex ds:flex-1 ds:items-stretch ds:min-h-0"].join(" ")
27
- ), M = a(
28
+ ), y = a(
28
29
  [
29
30
  // Hidden in the inline flow on mobile — consumers should flip their
30
31
  // Sidebar into overlay mode at narrow viewports, where it portals via
@@ -39,83 +40,93 @@ const T = a(
39
40
  ["ds:hidden ds:md:flex", "ds:shrink-0", "ds:h-full"].join(" ")
40
41
  ), F = a(
41
42
  [
42
- // <main> owns the scroll: the viewport body never scrolls, but this
43
- // element does. That keeps the header + sidebar pinned as chrome.
44
- "ds:flex-1 ds:min-w-0 ds:overflow-auto",
43
+ "ds:flex-1 ds:min-w-0",
44
+ "ds:flex ds:flex-col ds:min-h-0",
45
45
  // Focusable via the header's SkipLink — tabIndex={-1} is on the
46
46
  // element itself so keyboard users land inside the main region.
47
47
  "ds:focus:outline-none"
48
- ].join(" "),
49
- {
50
- variants: {
51
- padded: {
52
- true: [
53
- "ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]",
54
- "ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]"
55
- ].join(" "),
56
- false: ""
57
- }
58
- },
59
- defaultVariants: { padded: !0 }
60
- }
61
- ), y = a("ds:shrink-0"), I = N(
48
+ ].join(" ")
49
+ ), M = a("", {
50
+ variants: {
51
+ padded: {
52
+ true: [
53
+ "ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]",
54
+ "ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]"
55
+ ].join(" "),
56
+ false: ""
57
+ }
58
+ },
59
+ defaultVariants: { padded: !0 }
60
+ }), I = a("ds:shrink-0"), q = S(
62
61
  ({
63
- header: l,
64
- sidebar: t,
65
- children: i,
66
- endSidebar: r,
62
+ header: c,
63
+ sidebar: m,
64
+ children: p,
65
+ endSidebar: n,
67
66
  footer: d,
68
- mainId: c = "main-content",
69
- mainAriaLabel: m,
70
- padded: p = !0,
71
- className: f,
67
+ mainId: f = "main-content",
68
+ mainAriaLabel: v,
69
+ padded: u = !0,
70
+ className: h,
72
71
  mainClassName: b,
73
- ...u
74
- }, h) => {
75
- const { t: v } = _(), x = m ?? v("navigation.main.label", "Main content"), [w, g] = S(!1), j = V((k) => {
76
- const e = k.currentTarget.scrollTop > 0;
77
- g((o) => o === e ? o : e);
78
- }, []);
79
- return /* @__PURE__ */ n(
72
+ ...x
73
+ }, w) => {
74
+ const { t: N } = E(), V = v ?? N("navigation.main.label", "Main content"), o = k(null), [g, j] = _(!1);
75
+ return A(() => {
76
+ const e = o.current;
77
+ if (!e) return;
78
+ const r = () => {
79
+ const t = e.scrollTop > 0;
80
+ j((l) => l === t ? l : t);
81
+ };
82
+ return r(), e.addEventListener("scroll", r, { passive: !0 }), () => e.removeEventListener("scroll", r);
83
+ }, []), /* @__PURE__ */ i(
80
84
  "div",
81
85
  {
82
- ref: h,
83
- "data-app-scrolled": w ? "true" : void 0,
86
+ ref: w,
87
+ "data-app-scrolled": g ? "true" : void 0,
84
88
  "data-component": "app-frame",
85
- className: T({ className: f }),
86
- ...u,
89
+ className: R({ className: h }),
90
+ ...x,
87
91
  children: [
88
- l,
89
- /* @__PURE__ */ n("div", { className: A(), "data-app-frame-slot": "row", children: [
90
- /* @__PURE__ */ s("div", { className: M(), "data-app-frame-slot": "sidebar", children: t }),
92
+ c,
93
+ /* @__PURE__ */ i("div", { className: T(), "data-app-frame-slot": "row", children: [
94
+ /* @__PURE__ */ s("div", { className: y(), "data-app-frame-slot": "sidebar", children: m }),
91
95
  /* @__PURE__ */ s(
92
96
  "main",
93
97
  {
94
- id: c,
98
+ id: f,
95
99
  tabIndex: -1,
96
- "aria-label": x,
97
- onScroll: j,
98
- className: F({ padded: p, className: b }),
99
- children: i
100
+ "aria-label": V,
101
+ className: F({ className: b }),
102
+ children: /* @__PURE__ */ s(
103
+ L,
104
+ {
105
+ ref: o,
106
+ orientation: "vertical",
107
+ className: "ds:flex-1 ds:min-h-0",
108
+ children: /* @__PURE__ */ s("div", { className: M({ padded: u }), children: p })
109
+ }
110
+ )
100
111
  }
101
112
  ),
102
- r ? /* @__PURE__ */ s(
113
+ n ? /* @__PURE__ */ s(
103
114
  "div",
104
115
  {
105
116
  className: C(),
106
117
  "data-app-frame-slot": "end-sidebar",
107
- children: r
118
+ children: n
108
119
  }
109
120
  ) : null
110
121
  ] }),
111
- d ? /* @__PURE__ */ s("div", { className: y(), "data-app-frame-slot": "footer", children: d }) : null
122
+ d ? /* @__PURE__ */ s("div", { className: I(), "data-app-frame-slot": "footer", children: d }) : null
112
123
  ]
113
124
  }
114
125
  );
115
126
  }
116
127
  );
117
- I.displayName = "AppFrame";
128
+ q.displayName = "AppFrame";
118
129
  export {
119
- I as A
130
+ q as A
120
131
  };
121
- //# sourceMappingURL=app-frame-BYx1gcV7.js.map
132
+ //# sourceMappingURL=app-frame-DIEMIC5V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-frame-DIEMIC5V.js","sources":["../../src/components/app-frame/app-frame.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* AppFrame — the always-present application shell. */\n/* */\n/* Layout */\n/* ------ */\n/* */\n/* ┌───────────────────────────────────────────────────────────┐ */\n/* │ Header (100% inline-size, block-start) │ */\n/* ├──────────┬──────────────────────────────────┬──────────────┤ */\n/* │ Sidebar │ Main (<main>) │ endSidebar │ */\n/* │ │ │ (optional) │ */\n/* │ │ │ │ */\n/* ├──────────┴──────────────────────────────────┴──────────────┤ */\n/* │ Footer (optional) │ */\n/* └───────────────────────────────────────────────────────────┘ */\n/* */\n/* Header spans the full inline-size of the shell. Sidebar sits beneath */\n/* the header on the inline-start edge and shares the row with <main>. */\n/* `endSidebar`, when provided, sits on the inline-end edge of the same */\n/* row — used for co-pilot / assistant panels (e.g. AliaSidebar) that */\n/* should dock opposite the nav rail. Footer, when provided, spans the */\n/* full inline-size at the block-end. */\n/* */\n/* Responsive behaviour */\n/* --------------------- */\n/* ≥ md viewports: the sidebar slot renders inline-start of the row */\n/* below the header, sticky to the header's block-end, full remaining */\n/* viewport height. */\n/* < md viewports: the sidebar slot is hidden from the inline flow. */\n/* Consumers should control their sidebar's `state` to `'overlay'` */\n/* on small viewports (the Sidebar portals via Radix Dialog so it */\n/* renders outside AppFrame's subtree in that mode) and wire the */\n/* `<HeaderMenuButton>` to toggle it. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ScrollArea } from '../scroll-area/scroll-area';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\n// Canonical app-shell layout: the root is a VIEWPORT-SIZED flex-col with\n// its own overflow clamp. Header and the row fill it together. The only\n// thing that scrolls is the content region — a kit ScrollArea nested inside\n// <main> — so the header never leaves the top and the sidebar never needs\n// position: sticky. (Using a ScrollArea rather than letting <main> scroll\n// natively gives the main content the same 8px branded overlay scrollbar as\n// the Sidebar and ToolRail, instead of the wider OS-native bar.) This matches\n// the way Gmail / Linear / Notion frame their app surfaces and avoids the\n// flex-item-sticky edge cases that position: sticky has inside a\n// column-flex container.\n//\n// Because the viewport itself never scrolls in this model, the Header's\n// built-in IntersectionObserver (which watches a sentinel against the\n// viewport) cannot detect scroll. AppFrame instead tracks the main\n// ScrollArea viewport's scrollTop, reflects it onto the root via\n// `data-app-scrolled`, and the descendant selectors below drive the\n// `<header role=\"banner\">` border and shadow — producing the same elevation\n// the Header would show in a viewport-scroll context.\nconst rootVariants = cva(\n [\n 'ds:h-dvh ds:w-full',\n 'ds:flex ds:flex-col',\n 'ds:overflow-hidden',\n 'ds:bg-[var(--background)] ds:text-[color:var(--foreground)]',\n // Elevation cascade driven by main's scrollTop (data-app-scrolled).\n // Mirrors the Header's native scroll-linked recipe (see `Brand/Shadows`\n // — one tier up from rest, never two) so the banner looks identical\n // whether it's in a viewport-scroll context (sticky) or slotted into\n // AppFrame where <main> owns the scroll.\n 'ds:data-[app-scrolled=true]:[&_[role=banner]]:shadow-[var(--shadow-md)]',\n 'ds:data-[app-scrolled=true]:[&_[role=banner]]:[border-block-end-color:var(--border)]',\n // Forced-colors: UA strips box-shadow, so the border is the only\n // separation cue. Always render it.\n 'ds:forced-colors:[&_[role=banner]]:[border-block-end-color:CanvasText]',\n // Print: strip shadow, keep border so the banner still reads on paper.\n 'ds:print:[&_[role=banner]]:shadow-none',\n 'ds:print:[&_[role=banner]]:[border-block-end-color:var(--border)]',\n ].join(' '),\n);\n\nconst rowVariants = cva(\n ['ds:flex ds:flex-1 ds:items-stretch ds:min-h-0'].join(' '),\n);\n\nconst sidebarSlotVariants = cva(\n [\n // Hidden in the inline flow on mobile — consumers should flip their\n // Sidebar into overlay mode at narrow viewports, where it portals via\n // Radix Dialog and therefore renders outside AppFrame entirely.\n 'ds:hidden ds:md:flex',\n 'ds:shrink-0',\n // The rail fills the row's full height because the row is `flex\n // items-stretch`. No sticky needed — the row itself never scrolls.\n 'ds:h-full',\n ].join(' '),\n);\n\n// Inline-end slot — same hide-on-mobile behaviour as the nav rail because\n// a 22rem co-pilot panel can't share a phone viewport. Consuming apps\n// should flip Alia (or any inline-end panel) to its overlay/popout mode\n// at narrow viewports.\nconst endSidebarSlotVariants = cva(\n ['ds:hidden ds:md:flex', 'ds:shrink-0', 'ds:h-full'].join(' '),\n);\n\n// <main> is the landmark + skip-link target, but it NO LONGER owns the scroll.\n// A kit `ScrollArea` inside it owns the scroll instead, so the main content's\n// scrollbar is the same 8px branded overlay as the Sidebar and ToolRail\n// (both ScrollArea) rather than the wider OS-native bar that made \"the general\n// scroll area look bigger\". <main> is a flex-col so the ScrollArea (flex-1\n// min-h-0) fills its height; the body still never scrolls — only the viewport.\nconst mainVariants = cva(\n [\n 'ds:flex-1 ds:min-w-0',\n 'ds:flex ds:flex-col ds:min-h-0',\n // Focusable via the header's SkipLink — tabIndex={-1} is on the\n // element itself so keyboard users land inside the main region.\n 'ds:focus:outline-none',\n ].join(' '),\n);\n\n// Inner content wrapper INSIDE the ScrollArea viewport. It owns the `padded`\n// inset so the scrollbar sits at the viewport's true edge (matching the\n// ScrollArea convention used by the rail/sidebar) and the padding scrolls\n// with the content.\nconst mainContentVariants = cva('', {\n variants: {\n padded: {\n true: [\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' '),\n false: '',\n },\n },\n defaultVariants: { padded: true },\n});\n\nconst footerSlotVariants = cva('ds:shrink-0');\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport interface AppFrameProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n VariantProps<typeof mainContentVariants> {\n /** `<Header>` instance rendered full-width at the block-start of the shell. */\n header: ReactNode;\n /** `<Sidebar>` instance rendered inline-start of the row beneath the header on ≥ md viewports. */\n sidebar: ReactNode;\n /** Main content — rendered inside a `<main>` landmark. */\n children: ReactNode;\n /** Optional inline-end docked panel (typically `<AliaSidebar />`) sharing the same row as the main region on ≥ md viewports. Hidden on narrow viewports — consumers should flip to an overlay/popout mode there. */\n endSidebar?: ReactNode;\n /** Optional block-end footer — renders full-width below the sidebar + main row. */\n footer?: ReactNode;\n /**\n * Id applied to the `<main>` element so `<HeaderSkipLink href=\"#{mainId}\" />`\n * can target it. Must be a valid HTML id (letters, digits, `-`, `_`, no\n * spaces). Defaults to `'main-content'`.\n */\n mainId?: string;\n /**\n * Override the landmark's accessible name. Defaults to the i18n'd\n * `ui.navigation.main.label` (\"Main content\").\n */\n mainAriaLabel?: string;\n /** Extra classes applied to the `<main>` landmark. */\n mainClassName?: string;\n}\n\nexport const AppFrame = forwardRef<HTMLDivElement, AppFrameProps>(\n (\n {\n header,\n sidebar,\n children,\n endSidebar,\n footer,\n mainId = 'main-content',\n mainAriaLabel,\n padded = true,\n className,\n mainClassName,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const mainLabel =\n mainAriaLabel ?? t('navigation.main.label', 'Main content');\n\n // The ScrollArea inside <main> owns the scroll, so the header-elevation\n // cascade (data-app-scrolled) is driven off the ScrollArea's viewport\n // rather than <main>. ScrollArea forwards its ref to that viewport.\n const mainViewportRef = useRef<HTMLDivElement>(null);\n const [mainScrolled, setMainScrolled] = useState(false);\n useEffect(() => {\n const viewport = mainViewportRef.current;\n if (!viewport) return;\n const sync = () => {\n const next = viewport.scrollTop > 0;\n setMainScrolled((prev) => (prev === next ? prev : next));\n };\n sync();\n viewport.addEventListener('scroll', sync, { passive: true });\n return () => viewport.removeEventListener('scroll', sync);\n }, []);\n\n return (\n <div\n ref={ref}\n data-app-scrolled={mainScrolled ? 'true' : undefined}\n data-component=\"app-frame\"\n className={rootVariants({ className })}\n {...rest}\n >\n {/* Header is rendered as a direct flex child — NOT wrapped in a slot\n div — so it sits at the block-start of the shell. The root's\n `overflow-hidden` keeps it pinned; no `position: sticky` needed. */}\n {header}\n <div className={rowVariants()} data-app-frame-slot=\"row\">\n <div className={sidebarSlotVariants()} data-app-frame-slot=\"sidebar\">\n {sidebar}\n </div>\n <main\n id={mainId}\n tabIndex={-1}\n aria-label={mainLabel}\n className={mainVariants({ className: mainClassName })}\n >\n <ScrollArea\n ref={mainViewportRef}\n orientation=\"vertical\"\n className=\"ds:flex-1 ds:min-h-0\"\n >\n <div className={mainContentVariants({ padded })}>{children}</div>\n </ScrollArea>\n </main>\n {endSidebar ? (\n <div\n className={endSidebarSlotVariants()}\n data-app-frame-slot=\"end-sidebar\"\n >\n {endSidebar}\n </div>\n ) : null}\n </div>\n {footer ? (\n <div className={footerSlotVariants()} data-app-frame-slot=\"footer\">\n {footer}\n </div>\n ) : null}\n </div>\n );\n },\n);\nAppFrame.displayName = 'AppFrame';\n"],"names":["rootVariants","cva","rowVariants","sidebarSlotVariants","endSidebarSlotVariants","mainVariants","mainContentVariants","footerSlotVariants","AppFrame","forwardRef","header","sidebar","children","endSidebar","footer","mainId","mainAriaLabel","padded","className","mainClassName","rest","ref","t","useTranslation","mainLabel","mainViewportRef","useRef","mainScrolled","setMainScrolled","useState","useEffect","viewport","sync","next","prev","jsxs","jsx","ScrollArea"],"mappings":"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"}