@alfadocs/ui-kit-debug 1.38.0 → 1.40.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 (511) hide show
  1. package/dist/_chunks/{actions-cell-renderer-CUn1pqEq.js → actions-cell-renderer-BXBy9c0f.js} +3 -3
  2. package/dist/_chunks/{actions-cell-renderer-CUn1pqEq.js.map → actions-cell-renderer-BXBy9c0f.js.map} +1 -1
  3. package/dist/_chunks/{agenda-tray-CG6jUjKc.js → agenda-tray-CBaJASb5.js} +3 -3
  4. package/dist/_chunks/{agenda-tray-CG6jUjKc.js.map → agenda-tray-CBaJASb5.js.map} +1 -1
  5. package/dist/_chunks/{ai-consent-banner-De4gzSBZ.js → ai-consent-banner-D7I2U-cz.js} +37 -36
  6. package/dist/_chunks/ai-consent-banner-D7I2U-cz.js.map +1 -0
  7. package/dist/_chunks/{ai-prompt-input-DdxlaI7q.js → ai-prompt-input-DXknpQCB.js} +2 -2
  8. package/dist/_chunks/{ai-prompt-input-DdxlaI7q.js.map → ai-prompt-input-DXknpQCB.js.map} +1 -1
  9. package/dist/_chunks/{alia-sidebar-B6bXlZZk.js → alia-sidebar-CUqaJNPQ.js} +7 -7
  10. package/dist/_chunks/{alia-sidebar-B6bXlZZk.js.map → alia-sidebar-CUqaJNPQ.js.map} +1 -1
  11. package/dist/_chunks/{anamnesis-card-DGwINeNn.js → anamnesis-card-xtEhyojD.js} +2 -2
  12. package/dist/_chunks/{anamnesis-card-DGwINeNn.js.map → anamnesis-card-xtEhyojD.js.map} +1 -1
  13. package/dist/_chunks/{anamnesis-summary-rows-Cxtgo2ok.js → anamnesis-summary-rows-DQUqwWc1.js} +7 -7
  14. package/dist/_chunks/{anamnesis-summary-rows-Cxtgo2ok.js.map → anamnesis-summary-rows-DQUqwWc1.js.map} +1 -1
  15. package/dist/_chunks/{appointment-card-WsDGBBut.js → appointment-card-TgR_2GKS.js} +134 -102
  16. package/dist/_chunks/appointment-card-TgR_2GKS.js.map +1 -0
  17. package/dist/_chunks/{appointment-peek-5S4O1VQP.js → appointment-peek-abiR0T9e.js} +3 -3
  18. package/dist/_chunks/{appointment-peek-5S4O1VQP.js.map → appointment-peek-abiR0T9e.js.map} +1 -1
  19. package/dist/_chunks/{appointment-timeline-D-rNwKpS.js → appointment-timeline-CCnyUYKz.js} +67 -63
  20. package/dist/_chunks/appointment-timeline-CCnyUYKz.js.map +1 -0
  21. package/dist/_chunks/{appointment-tray-CK2CULg_.js → appointment-tray-N0yEI8UF.js} +4 -4
  22. package/dist/_chunks/{appointment-tray-CK2CULg_.js.map → appointment-tray-N0yEI8UF.js.map} +1 -1
  23. package/dist/_chunks/{audio-recorder-BlQBC7N_.js → audio-recorder-B7dT-Y3v.js} +3 -3
  24. package/dist/_chunks/{audio-recorder-BlQBC7N_.js.map → audio-recorder-B7dT-Y3v.js.map} +1 -1
  25. package/dist/_chunks/{balance-badge-cell-DHs5p0bA.js → balance-badge-cell-o6LldMUA.js} +5 -5
  26. package/dist/_chunks/{balance-badge-cell-DHs5p0bA.js.map → balance-badge-cell-o6LldMUA.js.map} +1 -1
  27. package/dist/_chunks/{bishop-score-D5b8tktp.js → bishop-score-Cu70iv9C.js} +2 -2
  28. package/dist/_chunks/{bishop-score-D5b8tktp.js.map → bishop-score-Cu70iv9C.js.map} +1 -1
  29. package/dist/_chunks/{bmi-calculator-dOKP-vW4.js → bmi-calculator-C9N19aLX.js} +2 -2
  30. package/dist/_chunks/{bmi-calculator-dOKP-vW4.js.map → bmi-calculator-C9N19aLX.js.map} +1 -1
  31. package/dist/_chunks/{booking-x3J7sS2G.js → booking-D43ASl8y.js} +1110 -1104
  32. package/dist/_chunks/booking-D43ASl8y.js.map +1 -0
  33. package/dist/_chunks/{button-nJaPh_HC.js → button-CaUe1uyd.js} +11 -7
  34. package/dist/_chunks/button-CaUe1uyd.js.map +1 -0
  35. package/dist/_chunks/{button-group-QmN1VdUW.js → button-group-R32U7SyV.js} +2 -2
  36. package/dist/_chunks/{button-group-QmN1VdUW.js.map → button-group-R32U7SyV.js.map} +1 -1
  37. package/dist/_chunks/{calendar-7GAUlsNO.js → calendar-ChJQzRw-.js} +2 -2
  38. package/dist/_chunks/{calendar-7GAUlsNO.js.map → calendar-ChJQzRw-.js.map} +1 -1
  39. package/dist/_chunks/calendar-workspace-SN23GsXX.js +11378 -0
  40. package/dist/_chunks/calendar-workspace-SN23GsXX.js.map +1 -0
  41. package/dist/_chunks/{care-plan-card-COFOI-fI.js → care-plan-card-BOv0NRle.js} +3 -3
  42. package/dist/_chunks/{care-plan-card-COFOI-fI.js.map → care-plan-card-BOv0NRle.js.map} +1 -1
  43. package/dist/_chunks/{care-plan-entry-card-BOKn0KW-.js → care-plan-entry-card-d-rZD4li.js} +3 -3
  44. package/dist/_chunks/{care-plan-entry-card-BOKn0KW-.js.map → care-plan-entry-card-d-rZD4li.js.map} +1 -1
  45. package/dist/_chunks/{care-plan-header-CbuOuVBw.js → care-plan-header-CEmBXn6-.js} +2 -2
  46. package/dist/_chunks/{care-plan-header-CbuOuVBw.js.map → care-plan-header-CEmBXn6-.js.map} +1 -1
  47. package/dist/_chunks/{carousel.agent-Dv4a4M8L.js → carousel.agent-z1yLBpyC.js} +2 -2
  48. package/dist/_chunks/{carousel.agent-Dv4a4M8L.js.map → carousel.agent-z1yLBpyC.js.map} +1 -1
  49. package/dist/_chunks/{chart-iWl76PXv.js → chart-PF2krCZC.js} +3 -3
  50. package/dist/_chunks/{chart-iWl76PXv.js.map → chart-PF2krCZC.js.map} +1 -1
  51. package/dist/_chunks/{chat-input-qM5QpUSq.js → chat-input-Cj7ZYQr5.js} +2 -2
  52. package/dist/_chunks/{chat-input-qM5QpUSq.js.map → chat-input-Cj7ZYQr5.js.map} +1 -1
  53. package/dist/_chunks/{chat-message-RniXtrCH.js → chat-message-BMVxiUIX.js} +3 -3
  54. package/dist/_chunks/{chat-message-RniXtrCH.js.map → chat-message-BMVxiUIX.js.map} +1 -1
  55. package/dist/_chunks/{code-block-uVjNSI9g.js → code-block-BB-viuTn.js} +2 -2
  56. package/dist/_chunks/{code-block-uVjNSI9g.js.map → code-block-BB-viuTn.js.map} +1 -1
  57. package/dist/_chunks/{connection-status-OEsWjmRk.js → connection-status-BmA9T0UO.js} +3 -3
  58. package/dist/_chunks/{connection-status-OEsWjmRk.js.map → connection-status-BmA9T0UO.js.map} +1 -1
  59. package/dist/_chunks/{contact-profile-card--My1H2UD.js → contact-profile-card-Zt6WNg1u.js} +2 -2
  60. package/dist/_chunks/{contact-profile-card--My1H2UD.js.map → contact-profile-card-Zt6WNg1u.js.map} +1 -1
  61. package/dist/_chunks/{control-room-rail-DQoHdE1U.js → control-room-rail-CnNZusR5.js} +3 -3
  62. package/dist/_chunks/{control-room-rail-DQoHdE1U.js.map → control-room-rail-CnNZusR5.js.map} +1 -1
  63. package/dist/_chunks/{copy-field-fYKpl6aN.js → copy-field-B8XRVmQv.js} +2 -2
  64. package/dist/_chunks/{copy-field-fYKpl6aN.js.map → copy-field-B8XRVmQv.js.map} +1 -1
  65. package/dist/_chunks/credit-card-D9XZsHGA.js +15 -0
  66. package/dist/_chunks/credit-card-D9XZsHGA.js.map +1 -0
  67. package/dist/_chunks/{cycle-calculator-BJeaXiZv.js → cycle-calculator-BH2StWoT.js} +2 -2
  68. package/dist/_chunks/{cycle-calculator-BJeaXiZv.js.map → cycle-calculator-BH2StWoT.js.map} +1 -1
  69. package/dist/_chunks/{dashboard-grid-B23BFzRl.js → dashboard-grid-BcXWL5S9.js} +2 -2
  70. package/dist/_chunks/{dashboard-grid-B23BFzRl.js.map → dashboard-grid-BcXWL5S9.js.map} +1 -1
  71. package/dist/_chunks/{data-table-Dy1lyumT.js → data-table-CcAx_I1w.js} +6 -6
  72. package/dist/_chunks/{data-table-Dy1lyumT.js.map → data-table-CcAx_I1w.js.map} +1 -1
  73. package/dist/_chunks/{data-table-tabs-BMR0zsVQ.js → data-table-tabs-B9SXA5VP.js} +3 -3
  74. package/dist/_chunks/{data-table-tabs-BMR0zsVQ.js.map → data-table-tabs-B9SXA5VP.js.map} +1 -1
  75. package/dist/_chunks/{description-list-C1RXMDZ_.js → description-list-BsJ_6CQE.js} +2 -2
  76. package/dist/_chunks/{description-list-C1RXMDZ_.js.map → description-list-BsJ_6CQE.js.map} +1 -1
  77. package/dist/_chunks/{document-preview-DsEyRcNd.js → document-preview-COV0BC6n.js} +2 -2
  78. package/dist/_chunks/{document-preview-DsEyRcNd.js.map → document-preview-COV0BC6n.js.map} +1 -1
  79. package/dist/_chunks/{document-scanner-CbWVtm7u.js → document-scanner-B1abl-A4.js} +2 -2
  80. package/dist/_chunks/{document-scanner-CbWVtm7u.js.map → document-scanner-B1abl-A4.js.map} +1 -1
  81. package/dist/_chunks/{due-date-calculator-Dhc9Ljkb.js → due-date-calculator-Buh_mVHq.js} +2 -2
  82. package/dist/_chunks/{due-date-calculator-Dhc9Ljkb.js.map → due-date-calculator-Buh_mVHq.js.map} +1 -1
  83. package/dist/_chunks/{editable-currency-cell-renderer-D7blbDFY.js → editable-currency-cell-renderer-Psb6XKHR.js} +3 -3
  84. package/dist/_chunks/{editable-currency-cell-renderer-D7blbDFY.js.map → editable-currency-cell-renderer-Psb6XKHR.js.map} +1 -1
  85. package/dist/_chunks/{editable-description-7ptNpJEg.js → editable-description-ADMVFPUz.js} +3 -3
  86. package/dist/_chunks/{editable-description-7ptNpJEg.js.map → editable-description-ADMVFPUz.js.map} +1 -1
  87. package/dist/_chunks/{editor-overlay-8fKAcRsm.js → editor-overlay-9tcPXNWt.js} +2 -2
  88. package/dist/_chunks/{editor-overlay-8fKAcRsm.js.map → editor-overlay-9tcPXNWt.js.map} +1 -1
  89. package/dist/_chunks/{empty-state-X0sVPfVo.js → empty-state-BUN_UAWf.js} +2 -2
  90. package/dist/_chunks/{empty-state-X0sVPfVo.js.map → empty-state-BUN_UAWf.js.map} +1 -1
  91. package/dist/_chunks/{entity-summary-BbW0mIzU.js → entity-summary-DXejuQ8i.js} +3 -3
  92. package/dist/_chunks/{entity-summary-BbW0mIzU.js.map → entity-summary-DXejuQ8i.js.map} +1 -1
  93. package/dist/_chunks/{error-boundary-ayXFCcq4.js → error-boundary-BNT2iQ1w.js} +2 -2
  94. package/dist/_chunks/{error-boundary-ayXFCcq4.js.map → error-boundary-BNT2iQ1w.js.map} +1 -1
  95. package/dist/_chunks/{face-scheme-uFvhqz6h.js → face-scheme-Dg6ZyLKb.js} +5 -5
  96. package/dist/_chunks/{face-scheme-uFvhqz6h.js.map → face-scheme-Dg6ZyLKb.js.map} +1 -1
  97. package/dist/_chunks/{fetal-weight-C6SxchOv.js → fetal-weight-wx4ycKc6.js} +2 -2
  98. package/dist/_chunks/{fetal-weight-C6SxchOv.js.map → fetal-weight-wx4ycKc6.js.map} +1 -1
  99. package/dist/_chunks/{field-array-C9dmRaIM.js → field-array-BW9KeeXG.js} +3 -3
  100. package/dist/_chunks/{field-array-C9dmRaIM.js.map → field-array-BW9KeeXG.js.map} +1 -1
  101. package/dist/_chunks/{file-manager-UlcYQv8n.js → file-manager-BfLQxF5t.js} +136 -150
  102. package/dist/_chunks/file-manager-BfLQxF5t.js.map +1 -0
  103. package/dist/_chunks/{finished-terminal-Br61Ip4e.js → finished-terminal-DJd7Z_po.js} +2 -2
  104. package/dist/_chunks/{finished-terminal-Br61Ip4e.js.map → finished-terminal-DJd7Z_po.js.map} +1 -1
  105. package/dist/_chunks/{fiscal-code-input-CkwIdB1y.js → fiscal-code-input-ODQRd_Sw.js} +2 -2
  106. package/dist/_chunks/{fiscal-code-input-CkwIdB1y.js.map → fiscal-code-input-ODQRd_Sw.js.map} +1 -1
  107. package/dist/_chunks/folder-BghC8_S2.js +20 -0
  108. package/dist/_chunks/folder-BghC8_S2.js.map +1 -0
  109. package/dist/_chunks/{freemium-paywall-BqGk_SBU.js → freemium-paywall-Cz-O9lQD.js} +2 -2
  110. package/dist/_chunks/{freemium-paywall-BqGk_SBU.js.map → freemium-paywall-Cz-O9lQD.js.map} +1 -1
  111. package/dist/_chunks/{gestational-age-calculator-DDOGaPvg.js → gestational-age-calculator-CwbecTul.js} +2 -2
  112. package/dist/_chunks/{gestational-age-calculator-DDOGaPvg.js.map → gestational-age-calculator-CwbecTul.js.map} +1 -1
  113. package/dist/_chunks/{hcg-doubling-Bb_n6tEa.js → hcg-doubling-BcXriXJe.js} +2 -2
  114. package/dist/_chunks/{hcg-doubling-Bb_n6tEa.js.map → hcg-doubling-BcXriXJe.js.map} +1 -1
  115. package/dist/_chunks/{header-BZ4pZlJV.js → header-3o9o9v_T.js} +2 -2
  116. package/dist/_chunks/{header-BZ4pZlJV.js.map → header-3o9o9v_T.js.map} +1 -1
  117. package/dist/_chunks/{header-settings-B8mLc03Q.js → header-settings-CTe45iDy.js} +4 -4
  118. package/dist/_chunks/{header-settings-B8mLc03Q.js.map → header-settings-CTe45iDy.js.map} +1 -1
  119. package/dist/_chunks/{hover-card-Bcku1GQu.js → hover-card-BMJBVqIf.js} +2 -2
  120. package/dist/_chunks/{hover-card-Bcku1GQu.js.map → hover-card-BMJBVqIf.js.map} +1 -1
  121. package/dist/_chunks/{icon-button-8xqRnkdG.js → icon-button-CehAeZoP.js} +2 -2
  122. package/dist/_chunks/{icon-button-8xqRnkdG.js.map → icon-button-CehAeZoP.js.map} +1 -1
  123. package/dist/_chunks/{icon-button-group-Dj6CRoYR.js → icon-button-group-DkkdIygu.js} +2 -2
  124. package/dist/_chunks/{icon-button-group-Dj6CRoYR.js.map → icon-button-group-DkkdIygu.js.map} +1 -1
  125. package/dist/_chunks/{icon-picker-CTWzlHJr.js → icon-picker-DMEelg9v.js} +3 -3
  126. package/dist/_chunks/{icon-picker-CTWzlHJr.js.map → icon-picker-DMEelg9v.js.map} +1 -1
  127. package/dist/_chunks/{image-cropper-C84NDTB7.js → image-cropper-BjPjT7wU.js} +2 -2
  128. package/dist/_chunks/{image-cropper-C84NDTB7.js.map → image-cropper-BjPjT7wU.js.map} +1 -1
  129. package/dist/_chunks/{info-tip-ey_Pon2y.js → info-tip-iP2Pm9dh.js} +2 -2
  130. package/dist/_chunks/{info-tip-ey_Pon2y.js.map → info-tip-iP2Pm9dh.js.map} +1 -1
  131. package/dist/_chunks/{insert-result-LCNTskNJ.js → insert-result-DPnOBD85.js} +2 -2
  132. package/dist/_chunks/{insert-result-LCNTskNJ.js.map → insert-result-DPnOBD85.js.map} +1 -1
  133. package/dist/_chunks/{key-value-pair-DczGb4yz.js → key-value-pair-DaQI_LZB.js} +2 -2
  134. package/dist/_chunks/{key-value-pair-DczGb4yz.js.map → key-value-pair-DaQI_LZB.js.map} +1 -1
  135. package/dist/_chunks/{link-cell-renderer-BNa8x6oJ.js → link-cell-renderer-s3oHzOwi.js} +2 -2
  136. package/dist/_chunks/{link-cell-renderer-BNa8x6oJ.js.map → link-cell-renderer-s3oHzOwi.js.map} +1 -1
  137. package/dist/_chunks/{locale-picker-BLeHbFSc.js → locale-picker-CH3kfrIG.js} +3 -3
  138. package/dist/_chunks/{locale-picker-BLeHbFSc.js.map → locale-picker-CH3kfrIG.js.map} +1 -1
  139. package/dist/_chunks/{map-view-CCAlC9IL.js → map-view-CHw4RL6w.js} +2 -2
  140. package/dist/_chunks/{map-view-CCAlC9IL.js.map → map-view-CHw4RL6w.js.map} +1 -1
  141. package/dist/_chunks/{marketplace-app-shell-BwH6Aruw.js → marketplace-app-shell-d2EtcUbe.js} +4 -4
  142. package/dist/_chunks/{marketplace-app-shell-BwH6Aruw.js.map → marketplace-app-shell-d2EtcUbe.js.map} +1 -1
  143. package/dist/_chunks/{message-card-Dm5Xshup.js → message-card-V3sFPiQI.js} +3 -3
  144. package/dist/_chunks/{message-card-Dm5Xshup.js.map → message-card-V3sFPiQI.js.map} +1 -1
  145. package/dist/_chunks/{message-tray-CXjVsKqp.js → message-tray-CrRIHfiQ.js} +4 -4
  146. package/dist/_chunks/{message-tray-CXjVsKqp.js.map → message-tray-CrRIHfiQ.js.map} +1 -1
  147. package/dist/_chunks/{note-timeline-D2oPuQP6.js → note-timeline-Dn_XTo1s.js} +131 -90
  148. package/dist/_chunks/note-timeline-Dn_XTo1s.js.map +1 -0
  149. package/dist/_chunks/{notes-panel-CkbfDDzj.js → notes-panel-CmTqIWlS.js} +277 -241
  150. package/dist/_chunks/notes-panel-CmTqIWlS.js.map +1 -0
  151. package/dist/_chunks/{notification-card-ChcK9Wat.js → notification-card-B2gLO6dK.js} +3 -3
  152. package/dist/_chunks/{notification-card-ChcK9Wat.js.map → notification-card-B2gLO6dK.js.map} +1 -1
  153. package/dist/_chunks/{notification-tray-_NoChRKi.js → notification-tray-BOEKegVV.js} +4 -4
  154. package/dist/_chunks/{notification-tray-_NoChRKi.js.map → notification-tray-BOEKegVV.js.map} +1 -1
  155. package/dist/_chunks/{optical-prescription-cphK41eP.js → optical-prescription-LGgmtcST.js} +2 -2
  156. package/dist/_chunks/{optical-prescription-cphK41eP.js.map → optical-prescription-LGgmtcST.js.map} +1 -1
  157. package/dist/_chunks/{panel-subview-BNXN8OEL.js → panel-subview-Cc2Wtt7D.js} +52 -52
  158. package/dist/_chunks/panel-subview-Cc2Wtt7D.js.map +1 -0
  159. package/dist/_chunks/{patient-details-2cIaL-Zb.js → patient-details-C8ImUrVg.js} +3 -3
  160. package/dist/_chunks/{patient-details-2cIaL-Zb.js.map → patient-details-C8ImUrVg.js.map} +1 -1
  161. package/dist/_chunks/{patient-field-row-IHb2VFc2.js → patient-field-row-BRSOKvme.js} +7 -7
  162. package/dist/_chunks/{patient-field-row-IHb2VFc2.js.map → patient-field-row-BRSOKvme.js.map} +1 -1
  163. package/dist/_chunks/{patient-search-D08b6jgj.js → patient-search-5QcmQKJD.js} +2 -2
  164. package/dist/_chunks/{patient-search-D08b6jgj.js.map → patient-search-5QcmQKJD.js.map} +1 -1
  165. package/dist/_chunks/{patient-summary-card-B131Q7Bp.js → patient-summary-card-BhmKB2KR.js} +7 -7
  166. package/dist/_chunks/patient-summary-card-BhmKB2KR.js.map +1 -0
  167. package/dist/_chunks/{payment-automation-upsell-BLTdE2em.js → payment-automation-upsell-BKmBXU4i.js} +17 -16
  168. package/dist/_chunks/{payment-automation-upsell-BLTdE2em.js.map → payment-automation-upsell-BKmBXU4i.js.map} +1 -1
  169. package/dist/_chunks/{payment-request-card-BxcdvxKR.js → payment-request-card-Cer6XXCn.js} +6 -5
  170. package/dist/_chunks/{payment-request-card-BxcdvxKR.js.map → payment-request-card-Cer6XXCn.js.map} +1 -1
  171. package/dist/_chunks/{periodontal-chart-BF_e3wZp.js → periodontal-chart-DJoZS_o7.js} +2 -2
  172. package/dist/_chunks/{periodontal-chart-BF_e3wZp.js.map → periodontal-chart-DJoZS_o7.js.map} +1 -1
  173. package/dist/_chunks/{periodontal-chart-card-BJEuJuzh.js → periodontal-chart-card-Nd1ZoYWb.js} +2 -2
  174. package/dist/_chunks/{periodontal-chart-card-BJEuJuzh.js.map → periodontal-chart-card-Nd1ZoYWb.js.map} +1 -1
  175. package/dist/_chunks/{popover-DzR5QYxp.js → popover-DO-pssF3.js} +2 -2
  176. package/dist/_chunks/{popover-DzR5QYxp.js.map → popover-DO-pssF3.js.map} +1 -1
  177. package/dist/_chunks/{practice-results-CBNRJNnY.js → practice-results-D_jjzwgf.js} +5 -5
  178. package/dist/_chunks/{practice-results-CBNRJNnY.js.map → practice-results-D_jjzwgf.js.map} +1 -1
  179. package/dist/_chunks/{pregnancy-dating-nV1_S6w0.js → pregnancy-dating-DcyV9ZRD.js} +2 -2
  180. package/dist/_chunks/{pregnancy-dating-nV1_S6w0.js.map → pregnancy-dating-DcyV9ZRD.js.map} +1 -1
  181. package/dist/_chunks/{pregnancy-weight-gain-tRecShAD.js → pregnancy-weight-gain-Bfq4Kwt5.js} +2 -2
  182. package/dist/_chunks/{pregnancy-weight-gain-tRecShAD.js.map → pregnancy-weight-gain-Bfq4Kwt5.js.map} +1 -1
  183. package/dist/_chunks/{privacy-lock-Be39vQUN.js → privacy-lock-CbFCAMM3.js} +3 -3
  184. package/dist/_chunks/{privacy-lock-Be39vQUN.js.map → privacy-lock-CbFCAMM3.js.map} +1 -1
  185. package/dist/_chunks/{product-hub-panel-C3bMjscm.js → product-hub-panel-w40-_-1s.js} +3 -3
  186. package/dist/_chunks/{product-hub-panel-C3bMjscm.js.map → product-hub-panel-w40-_-1s.js.map} +1 -1
  187. package/dist/_chunks/{public-header.agent-Bl1KFwSE.js → public-header.agent-D-EBVskf.js} +3 -3
  188. package/dist/_chunks/{public-header.agent-Bl1KFwSE.js.map → public-header.agent-D-EBVskf.js.map} +1 -1
  189. package/dist/_chunks/{radiograph-panel.agent-k0G7JuoM.js → radiograph-panel.agent-LrILY2lN.js} +4 -4
  190. package/dist/_chunks/{radiograph-panel.agent-k0G7JuoM.js.map → radiograph-panel.agent-LrILY2lN.js.map} +1 -1
  191. package/dist/_chunks/{receipt-euro-C6k4Gzhr.js → receipt-euro-B1cLM_TN.js} +3 -14
  192. package/dist/_chunks/receipt-euro-B1cLM_TN.js.map +1 -0
  193. package/dist/_chunks/{reviews-panel-Cy969x7q.js → reviews-panel-2GVuxGeT.js} +4 -4
  194. package/dist/_chunks/{reviews-panel-Cy969x7q.js.map → reviews-panel-2GVuxGeT.js.map} +1 -1
  195. package/dist/_chunks/{rich-text-editor-BTXlorm5.js → rich-text-editor-BJ1-Lkao.js} +1024 -932
  196. package/dist/_chunks/rich-text-editor-BJ1-Lkao.js.map +1 -0
  197. package/dist/_chunks/{session-countdown-QMsnRa1x.js → session-countdown-BqppPrw6.js} +2 -2
  198. package/dist/_chunks/{session-countdown-QMsnRa1x.js.map → session-countdown-BqppPrw6.js.map} +1 -1
  199. package/dist/_chunks/{sheet-hm04DGFd.js → sheet-C8WIDFS8.js} +2 -2
  200. package/dist/_chunks/{sheet-hm04DGFd.js.map → sheet-C8WIDFS8.js.map} +1 -1
  201. package/dist/_chunks/{sign-in-with-alfadocs-button-BLe_quy5.js → sign-in-with-alfadocs-button-DWwBJtyE.js} +2 -2
  202. package/dist/_chunks/{sign-in-with-alfadocs-button-BLe_quy5.js.map → sign-in-with-alfadocs-button-DWwBJtyE.js.map} +1 -1
  203. package/dist/_chunks/{signature-request-b-86AGlT.js → signature-request-D_j2aQu1.js} +359 -370
  204. package/dist/_chunks/signature-request-D_j2aQu1.js.map +1 -0
  205. package/dist/_chunks/{slot-grid-Bk3GZL1p.js → slot-grid-B3eOPkKD.js} +4 -4
  206. package/dist/_chunks/{slot-grid-Bk3GZL1p.js.map → slot-grid-B3eOPkKD.js.map} +1 -1
  207. package/dist/_chunks/{streaming-text-DjFqLSt_.js → streaming-text-CE1u_oGa.js} +2 -2
  208. package/dist/_chunks/{streaming-text-DjFqLSt_.js.map → streaming-text-CE1u_oGa.js.map} +1 -1
  209. package/dist/_chunks/{task-tray-5co9Jr2L.js → task-tray-DIwjAIes.js} +3 -3
  210. package/dist/_chunks/{task-tray-5co9Jr2L.js.map → task-tray-DIwjAIes.js.map} +1 -1
  211. package/dist/_chunks/{tasks-panel-BpH-x7U3.js → tasks-panel-CpcikOeY.js} +5 -5
  212. package/dist/_chunks/{tasks-panel-BpH-x7U3.js.map → tasks-panel-CpcikOeY.js.map} +1 -1
  213. package/dist/_chunks/{theme-toggle-CMz8YfC1.js → theme-toggle-bI0pgDDv.js} +3 -3
  214. package/dist/_chunks/{theme-toggle-CMz8YfC1.js.map → theme-toggle-bI0pgDDv.js.map} +1 -1
  215. package/dist/_chunks/{toast-8jqtbfAB.js → toast-ZZfhA5u0.js} +2 -2
  216. package/dist/_chunks/{toast-8jqtbfAB.js.map → toast-ZZfhA5u0.js.map} +1 -1
  217. package/dist/_chunks/{token-insert-menu-9Um0JinI.js → token-insert-menu-A9B5AJw6.js} +2 -2
  218. package/dist/_chunks/{token-insert-menu-9Um0JinI.js.map → token-insert-menu-A9B5AJw6.js.map} +1 -1
  219. package/dist/_chunks/tool-rail-D89USYE6.js +799 -0
  220. package/dist/_chunks/tool-rail-D89USYE6.js.map +1 -0
  221. package/dist/_chunks/{tooth-scheme-BWkYxxjR.js → tooth-scheme-DPAq0vQK.js} +3 -3
  222. package/dist/_chunks/{tooth-scheme-BWkYxxjR.js.map → tooth-scheme-DPAq0vQK.js.map} +1 -1
  223. package/dist/_chunks/{transaction-chip-Dth1nThY.js → transaction-chip-CwgcJiqF.js} +47 -46
  224. package/dist/_chunks/{transaction-chip-Dth1nThY.js.map → transaction-chip-CwgcJiqF.js.map} +1 -1
  225. package/dist/_chunks/{unit-converter-BTgU50gk.js → unit-converter-C-LpGzrN.js} +2 -2
  226. package/dist/_chunks/{unit-converter-BTgU50gk.js.map → unit-converter-C-LpGzrN.js.map} +1 -1
  227. package/dist/_chunks/user-plus-BtcOLgNU.js +17 -0
  228. package/dist/_chunks/user-plus-BtcOLgNU.js.map +1 -0
  229. package/dist/_chunks/{warning-stack-BW5Dwb3z.js → warning-stack-C0glSB7p.js} +3 -3
  230. package/dist/_chunks/{warning-stack-BW5Dwb3z.js.map → warning-stack-C0glSB7p.js.map} +1 -1
  231. package/dist/_chunks/{workflow-map-CXdsxvUj.js → workflow-map-DhR_h5yw.js} +5 -5
  232. package/dist/_chunks/{workflow-map-CXdsxvUj.js.map → workflow-map-DhR_h5yw.js.map} +1 -1
  233. package/dist/agent-catalog.json +3 -418
  234. package/dist/agent-i18n/en.json +2 -18
  235. package/dist/components/agenda-tray/index.js +1 -1
  236. package/dist/components/ai-consent-banner/ai-consent-banner.d.ts +9 -0
  237. package/dist/components/ai-consent-banner/ai-consent-banner.d.ts.map +1 -1
  238. package/dist/components/ai-consent-banner/index.d.ts +1 -1
  239. package/dist/components/ai-consent-banner/index.d.ts.map +1 -1
  240. package/dist/components/ai-consent-banner/index.js +1 -1
  241. package/dist/components/ai-prompt-input/index.js +1 -1
  242. package/dist/components/anamnesis-card/index.js +1 -1
  243. package/dist/components/appointment-card/appointment-card.d.ts +24 -0
  244. package/dist/components/appointment-card/appointment-card.d.ts.map +1 -1
  245. package/dist/components/appointment-card/index.js +2 -2
  246. package/dist/components/appointment-peek/index.js +1 -1
  247. package/dist/components/appointment-timeline/appointment-timeline.d.ts +15 -1
  248. package/dist/components/appointment-timeline/appointment-timeline.d.ts.map +1 -1
  249. package/dist/components/appointment-timeline/index.js +1 -1
  250. package/dist/components/audio-recorder/index.js +1 -1
  251. package/dist/components/bishop-score/index.js +1 -1
  252. package/dist/components/bmi-calculator/index.js +1 -1
  253. package/dist/components/booking/booking-types.d.ts +6 -0
  254. package/dist/components/booking/booking-types.d.ts.map +1 -1
  255. package/dist/components/booking/booking.d.ts.map +1 -1
  256. package/dist/components/booking/cascade.d.ts +6 -0
  257. package/dist/components/booking/cascade.d.ts.map +1 -1
  258. package/dist/components/booking/index.js +1 -1
  259. package/dist/components/button/button.d.ts +1 -1
  260. package/dist/components/button/button.d.ts.map +1 -1
  261. package/dist/components/button/index.js +2 -2
  262. package/dist/components/button-group/index.js +1 -1
  263. package/dist/components/calendar/index.js +1 -1
  264. package/dist/components/care-plan-card/index.js +1 -1
  265. package/dist/components/care-plan-entry-card/index.js +1 -1
  266. package/dist/components/care-plan-header/index.js +1 -1
  267. package/dist/components/carousel/index.js +1 -1
  268. package/dist/components/chart/index.js +1 -1
  269. package/dist/components/chat-input/index.js +1 -1
  270. package/dist/components/chat-message/index.js +1 -1
  271. package/dist/components/connection-status/index.js +1 -1
  272. package/dist/components/contact-profile-card/index.js +1 -1
  273. package/dist/components/control-room-rail/index.js +1 -1
  274. package/dist/components/copy-field/index.js +1 -1
  275. package/dist/components/cycle-calculator/index.js +1 -1
  276. package/dist/components/dashboard-grid/index.js +1 -1
  277. package/dist/components/data-table/index.js +4 -4
  278. package/dist/components/data-table-tabs/index.js +1 -1
  279. package/dist/components/description-list/index.js +1 -1
  280. package/dist/components/document-preview/index.js +1 -1
  281. package/dist/components/document-scanner/index.js +1 -1
  282. package/dist/components/due-date-calculator/index.js +1 -1
  283. package/dist/components/editable-description/index.js +1 -1
  284. package/dist/components/editor-overlay/index.js +1 -1
  285. package/dist/components/empty-state/index.js +1 -1
  286. package/dist/components/entity-summary/index.js +1 -1
  287. package/dist/components/error-boundary/index.js +1 -1
  288. package/dist/components/face-scheme/index.js +1 -1
  289. package/dist/components/fetal-weight/index.js +1 -1
  290. package/dist/components/field-array/index.js +1 -1
  291. package/dist/components/file-manager/index.js +1 -1
  292. package/dist/components/finished-terminal/index.js +1 -1
  293. package/dist/components/fiscal-code-input/index.js +1 -1
  294. package/dist/components/freemium-paywall/index.js +1 -1
  295. package/dist/components/gestational-age-calculator/index.js +1 -1
  296. package/dist/components/hcg-doubling/index.js +1 -1
  297. package/dist/components/header/index.js +1 -1
  298. package/dist/components/header-settings/index.js +1 -1
  299. package/dist/components/hover-card/index.js +1 -1
  300. package/dist/components/icon-button/index.js +1 -1
  301. package/dist/components/icon-button-group/index.js +1 -1
  302. package/dist/components/icon-picker/index.js +1 -1
  303. package/dist/components/image-cropper/index.js +1 -1
  304. package/dist/components/info-tip/index.js +1 -1
  305. package/dist/components/key-value-pair/index.js +1 -1
  306. package/dist/components/locale-picker/index.js +1 -1
  307. package/dist/components/map-view/index.js +1 -1
  308. package/dist/components/message-card/index.js +1 -1
  309. package/dist/components/message-tray/index.js +1 -1
  310. package/dist/components/note-timeline/index.js +1 -1
  311. package/dist/components/note-timeline/note-timeline.d.ts +9 -0
  312. package/dist/components/note-timeline/note-timeline.d.ts.map +1 -1
  313. package/dist/components/notes-panel/index.d.ts +1 -0
  314. package/dist/components/notes-panel/index.d.ts.map +1 -1
  315. package/dist/components/notes-panel/index.js +1 -1
  316. package/dist/components/notes-panel/notes-panel.d.ts +13 -5
  317. package/dist/components/notes-panel/notes-panel.d.ts.map +1 -1
  318. package/dist/components/notification-card/index.js +1 -1
  319. package/dist/components/notification-tray/index.js +1 -1
  320. package/dist/components/optical-prescription/index.js +1 -1
  321. package/dist/components/panel-subview/index.js +1 -1
  322. package/dist/components/panel-subview/panel-subview.d.ts.map +1 -1
  323. package/dist/components/patient-details/index.js +1 -1
  324. package/dist/components/patient-search/index.js +1 -1
  325. package/dist/components/patient-summary-card/index.js +1 -1
  326. package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -1
  327. package/dist/components/patient-table/index.js +1 -1
  328. package/dist/components/payment-card/index.js +1 -1
  329. package/dist/components/periodontal-chart/index.js +1 -1
  330. package/dist/components/periodontal-chart-card/index.js +1 -1
  331. package/dist/components/popover/index.js +1 -1
  332. package/dist/components/practice-results/index.js +1 -1
  333. package/dist/components/pregnancy-dating/index.js +1 -1
  334. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  335. package/dist/components/privacy-lock/index.js +1 -1
  336. package/dist/components/product-hub-tray/index.js +1 -1
  337. package/dist/components/public-header/index.js +1 -1
  338. package/dist/components/radiograph-panel/index.js +1 -1
  339. package/dist/components/reviews-panel/index.js +1 -1
  340. package/dist/components/rich-text-editor/index.d.ts +1 -1
  341. package/dist/components/rich-text-editor/index.d.ts.map +1 -1
  342. package/dist/components/rich-text-editor/index.js +1 -1
  343. package/dist/components/rich-text-editor/rich-text-editor.d.ts +48 -0
  344. package/dist/components/rich-text-editor/rich-text-editor.d.ts.map +1 -1
  345. package/dist/components/session-countdown/index.js +1 -1
  346. package/dist/components/sheet/index.js +1 -1
  347. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  348. package/dist/components/slot-grid/index.js +1 -1
  349. package/dist/components/streaming-text/index.js +1 -1
  350. package/dist/components/task-tray/index.js +1 -1
  351. package/dist/components/tasks-panel/index.js +1 -1
  352. package/dist/components/theme-toggle/index.js +1 -1
  353. package/dist/components/toast/index.js +1 -1
  354. package/dist/components/token-insert-menu/index.js +1 -1
  355. package/dist/components/tool-rail/index.js +1 -1
  356. package/dist/components/tool-rail/tool-rail.d.ts.map +1 -1
  357. package/dist/components/tooth-scheme/index.js +1 -1
  358. package/dist/components/transaction-chip/index.js +1 -1
  359. package/dist/components/transaction-chip/transaction-chip.d.ts +7 -0
  360. package/dist/components/transaction-chip/transaction-chip.d.ts.map +1 -1
  361. package/dist/components/unit-converter/index.js +1 -1
  362. package/dist/components/warning-stack/index.js +1 -1
  363. package/dist/components/workflow/index.js +1 -1
  364. package/dist/host-compat.css +13 -4
  365. package/dist/i18n/locales/ar.d.ts +248 -194
  366. package/dist/i18n/locales/ar.d.ts.map +1 -1
  367. package/dist/i18n/locales/ar.js +253 -199
  368. package/dist/i18n/locales/ar.js.map +1 -1
  369. package/dist/i18n/locales/de.d.ts +232 -178
  370. package/dist/i18n/locales/de.d.ts.map +1 -1
  371. package/dist/i18n/locales/de.js +237 -183
  372. package/dist/i18n/locales/de.js.map +1 -1
  373. package/dist/i18n/locales/el.d.ts +247 -193
  374. package/dist/i18n/locales/el.d.ts.map +1 -1
  375. package/dist/i18n/locales/el.js +252 -198
  376. package/dist/i18n/locales/el.js.map +1 -1
  377. package/dist/i18n/locales/en.d.ts +54 -0
  378. package/dist/i18n/locales/en.d.ts.map +1 -1
  379. package/dist/i18n/locales/en.js +59 -5
  380. package/dist/i18n/locales/en.js.map +1 -1
  381. package/dist/i18n/locales/es.d.ts +240 -186
  382. package/dist/i18n/locales/es.d.ts.map +1 -1
  383. package/dist/i18n/locales/es.js +245 -191
  384. package/dist/i18n/locales/es.js.map +1 -1
  385. package/dist/i18n/locales/fr.d.ts +234 -180
  386. package/dist/i18n/locales/fr.d.ts.map +1 -1
  387. package/dist/i18n/locales/fr.js +239 -185
  388. package/dist/i18n/locales/fr.js.map +1 -1
  389. package/dist/i18n/locales/hi.d.ts +248 -194
  390. package/dist/i18n/locales/hi.d.ts.map +1 -1
  391. package/dist/i18n/locales/hi.js +257 -199
  392. package/dist/i18n/locales/hi.js.map +1 -1
  393. package/dist/i18n/locales/it.d.ts +192 -138
  394. package/dist/i18n/locales/it.d.ts.map +1 -1
  395. package/dist/i18n/locales/it.js +197 -143
  396. package/dist/i18n/locales/it.js.map +1 -1
  397. package/dist/i18n/locales/ja.d.ts +246 -192
  398. package/dist/i18n/locales/ja.d.ts.map +1 -1
  399. package/dist/i18n/locales/ja.js +251 -197
  400. package/dist/i18n/locales/ja.js.map +1 -1
  401. package/dist/i18n/locales/nl.d.ts +237 -183
  402. package/dist/i18n/locales/nl.d.ts.map +1 -1
  403. package/dist/i18n/locales/nl.js +242 -188
  404. package/dist/i18n/locales/nl.js.map +1 -1
  405. package/dist/i18n/locales/pl.d.ts +242 -188
  406. package/dist/i18n/locales/pl.d.ts.map +1 -1
  407. package/dist/i18n/locales/pl.js +247 -193
  408. package/dist/i18n/locales/pl.js.map +1 -1
  409. package/dist/i18n/locales/pt.d.ts +242 -188
  410. package/dist/i18n/locales/pt.d.ts.map +1 -1
  411. package/dist/i18n/locales/pt.js +247 -193
  412. package/dist/i18n/locales/pt.js.map +1 -1
  413. package/dist/i18n/locales/ro.d.ts +241 -187
  414. package/dist/i18n/locales/ro.d.ts.map +1 -1
  415. package/dist/i18n/locales/ro.js +246 -192
  416. package/dist/i18n/locales/ro.js.map +1 -1
  417. package/dist/i18n/locales/ru.d.ts +247 -193
  418. package/dist/i18n/locales/ru.d.ts.map +1 -1
  419. package/dist/i18n/locales/ru.js +252 -198
  420. package/dist/i18n/locales/ru.js.map +1 -1
  421. package/dist/i18n/locales/sq.d.ts +241 -187
  422. package/dist/i18n/locales/sq.d.ts.map +1 -1
  423. package/dist/i18n/locales/sq.js +246 -192
  424. package/dist/i18n/locales/sq.js.map +1 -1
  425. package/dist/i18n/locales/sv.d.ts +242 -188
  426. package/dist/i18n/locales/sv.d.ts.map +1 -1
  427. package/dist/i18n/locales/sv.js +247 -193
  428. package/dist/i18n/locales/sv.js.map +1 -1
  429. package/dist/i18n/locales/tr.d.ts +248 -194
  430. package/dist/i18n/locales/tr.d.ts.map +1 -1
  431. package/dist/i18n/locales/tr.js +253 -199
  432. package/dist/i18n/locales/tr.js.map +1 -1
  433. package/dist/i18n/locales/zh.d.ts +241 -187
  434. package/dist/i18n/locales/zh.d.ts.map +1 -1
  435. package/dist/i18n/locales/zh.js +246 -192
  436. package/dist/i18n/locales/zh.js.map +1 -1
  437. package/dist/index.js +107 -107
  438. package/dist/locales/ar.json +253 -199
  439. package/dist/locales/de.json +237 -183
  440. package/dist/locales/el.json +252 -198
  441. package/dist/locales/en.json +59 -5
  442. package/dist/locales/es.json +245 -191
  443. package/dist/locales/fr.json +239 -185
  444. package/dist/locales/hi.json +253 -199
  445. package/dist/locales/it.json +197 -143
  446. package/dist/locales/ja.json +251 -197
  447. package/dist/locales/nl.json +242 -188
  448. package/dist/locales/pl.json +247 -193
  449. package/dist/locales/pt.json +247 -193
  450. package/dist/locales/ro.json +246 -192
  451. package/dist/locales/ru.json +252 -198
  452. package/dist/locales/sq.json +246 -192
  453. package/dist/locales/sv.json +247 -193
  454. package/dist/locales/tr.json +253 -199
  455. package/dist/locales/zh.json +246 -192
  456. package/dist/patterns/alia-assistant/index.js +1 -1
  457. package/dist/patterns/anamnesis/index.js +1 -1
  458. package/dist/patterns/calendar/calendar-appointment-details.d.ts +7 -0
  459. package/dist/patterns/calendar/calendar-appointment-details.d.ts.map +1 -1
  460. package/dist/patterns/calendar/calendar-appointment-details.sections.d.ts +10 -5
  461. package/dist/patterns/calendar/calendar-appointment-details.sections.d.ts.map +1 -1
  462. package/dist/patterns/calendar/calendar-bookings-panel.d.ts +31 -0
  463. package/dist/patterns/calendar/calendar-bookings-panel.d.ts.map +1 -0
  464. package/dist/patterns/calendar/calendar-info-hover.d.ts +15 -1
  465. package/dist/patterns/calendar/calendar-info-hover.d.ts.map +1 -1
  466. package/dist/patterns/calendar/calendar-privacy.d.ts +23 -0
  467. package/dist/patterns/calendar/calendar-privacy.d.ts.map +1 -0
  468. package/dist/patterns/calendar/calendar-rail-settle.d.ts +14 -0
  469. package/dist/patterns/calendar/calendar-rail-settle.d.ts.map +1 -0
  470. package/dist/patterns/calendar/calendar-upcoming-panel.d.ts +32 -0
  471. package/dist/patterns/calendar/calendar-upcoming-panel.d.ts.map +1 -0
  472. package/dist/patterns/calendar/calendar-waiting-list-panel.d.ts +62 -0
  473. package/dist/patterns/calendar/calendar-waiting-list-panel.d.ts.map +1 -0
  474. package/dist/patterns/calendar/calendar-workspace.d.ts +14 -1
  475. package/dist/patterns/calendar/calendar-workspace.d.ts.map +1 -1
  476. package/dist/patterns/calendar/calendar-workspace.model.d.ts +37 -1
  477. package/dist/patterns/calendar/calendar-workspace.model.d.ts.map +1 -1
  478. package/dist/patterns/calendar/calendar.journey.d.ts +9 -1
  479. package/dist/patterns/calendar/calendar.journey.d.ts.map +1 -1
  480. package/dist/patterns/calendar/calendar.model.d.ts +8 -2
  481. package/dist/patterns/calendar/calendar.model.d.ts.map +1 -1
  482. package/dist/patterns/calendar/calendar.sheets.d.ts +49 -28
  483. package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -1
  484. package/dist/patterns/calendar/calendar.surface.d.ts.map +1 -1
  485. package/dist/patterns/calendar/calendar.types.d.ts +6 -0
  486. package/dist/patterns/calendar/calendar.types.d.ts.map +1 -1
  487. package/dist/patterns/calendar/index.d.ts +2 -2
  488. package/dist/patterns/calendar/index.d.ts.map +1 -1
  489. package/dist/patterns/calendar/index.js +1 -1
  490. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  491. package/dist/patterns/payment-automation-upsell/index.js +1 -1
  492. package/dist/patterns/signature-request/index.js +1 -1
  493. package/dist/tokens.css +1 -1
  494. package/package.json +3 -1
  495. package/dist/_chunks/ai-consent-banner-De4gzSBZ.js.map +0 -1
  496. package/dist/_chunks/appointment-card-WsDGBBut.js.map +0 -1
  497. package/dist/_chunks/appointment-timeline-D-rNwKpS.js.map +0 -1
  498. package/dist/_chunks/booking-x3J7sS2G.js.map +0 -1
  499. package/dist/_chunks/button-nJaPh_HC.js.map +0 -1
  500. package/dist/_chunks/calendar-workspace-Cc1LRVWY.js +0 -9900
  501. package/dist/_chunks/calendar-workspace-Cc1LRVWY.js.map +0 -1
  502. package/dist/_chunks/file-manager-UlcYQv8n.js.map +0 -1
  503. package/dist/_chunks/note-timeline-D2oPuQP6.js.map +0 -1
  504. package/dist/_chunks/notes-panel-CkbfDDzj.js.map +0 -1
  505. package/dist/_chunks/panel-subview-BNXN8OEL.js.map +0 -1
  506. package/dist/_chunks/patient-summary-card-B131Q7Bp.js.map +0 -1
  507. package/dist/_chunks/receipt-euro-C6k4Gzhr.js.map +0 -1
  508. package/dist/_chunks/rich-text-editor-BTXlorm5.js.map +0 -1
  509. package/dist/_chunks/signature-request-b-86AGlT.js.map +0 -1
  510. package/dist/_chunks/tool-rail-BP8sjxCw.js +0 -667
  511. package/dist/_chunks/tool-rail-BP8sjxCw.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfadocs/ui-kit-debug",
3
- "version": "1.38.0",
3
+ "version": "1.40.0",
4
4
  "type": "module",
5
5
  "description": "AlfaDocs shared design system — tokens, components, patterns, and translations for platform, booking, and alfascribe. (debug build — identical runtime to @alfadocs/ui-kit, ships source maps for symbolication).",
6
6
  "license": "BUSL-1.1",
@@ -953,6 +953,7 @@
953
953
  "build:icon-map": "node scripts/build-icon-map.mjs",
954
954
  "check:icon-map": "node scripts/build-icon-map.mjs --check",
955
955
  "typecheck": "tsc -b",
956
+ "gate": "node scripts/gate.mjs",
956
957
  "test": "vitest run",
957
958
  "lint": "eslint .",
958
959
  "lint:fix": "eslint . --fix",
@@ -970,6 +971,7 @@
970
971
  "check:i18n-parity": "node --experimental-strip-types scripts/check-i18n-parity.ts",
971
972
  "check:i18n-plurals": "node --experimental-strip-types scripts/check-i18n-plurals.ts",
972
973
  "check:i18n-coverage": "node --experimental-strip-types scripts/check-i18n-coverage.ts",
974
+ "check:i18n-untranslated": "node --experimental-strip-types scripts/check-i18n-untranslated.ts",
973
975
  "seed:i18n-coverage": "node --experimental-strip-types scripts/seed-i18n-coverage.ts",
974
976
  "chromatic": "chromatic --exit-zero-on-changes"
975
977
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai-consent-banner-De4gzSBZ.js","sources":["../../src/components/ai-consent-banner/ai-consent-banner.agent.ts","../../src/components/ai-consent-banner/ai-consent-banner.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AiConsentBanner. */\n/* */\n/* Read-only structural surface: the current consent state and whether */\n/* the grant affordance is armed. Identifiers / structural state ONLY — */\n/* never the grantee's name or any PHI. The real consent gate lives */\n/* server-side; this adapter does not expose a grant action so an agent */\n/* cannot consent on a user's behalf. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AiConsentBannerHandle } from './ai-consent-banner';\n\nexport const aiConsentBannerAgent: AgentAdapter<AiConsentBannerHandle> = {\n id: 'ai-consent-banner',\n capabilities: [],\n state: {\n consentState: {\n type: \"'granted' | 'required' | 'pending'\",\n descriptionKey: 'ui.agent.aiConsentBanner.state.consentState',\n description:\n 'Current consent state. Structural only — never the grantee identity.',\n read: (handle) => handle.getState(),\n },\n armed: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiConsentBanner.state.armed',\n description:\n 'Whether the consent confirmation checkbox is ticked (required state only).',\n read: (handle) => handle.isArmed(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'ai-consent-banner',\n description: 'Marks the AiConsentBanner root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific banner from the agent.',\n },\n },\n};\n","import {\n forwardRef,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Alert } from '../alert/alert';\nimport { Badge } from '../badge/badge';\nimport { Button } from '../button/button';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { Spinner } from '../spinner/spinner';\nimport { Timestamp } from '../timestamp/timestamp';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { aiConsentBannerAgent } from './ai-consent-banner.agent';\n\n/* -------------------------------------------------------------------- */\n/* AiConsentBanner */\n/* */\n/* Presentational AI-consent gate surfaced above an AI-assisted surface */\n/* (e.g. Alfascribe consultation transcription). The SERVER owns the */\n/* real gate — this component only reflects the consent record and lets */\n/* the operator initiate a grant; it never enforces access itself. */\n/* */\n/* Three states drive the Alert variant + body: */\n/* - granted → success Alert with a Badge + when/who it was granted. */\n/* - required → info Alert with a Checkbox-gated Grant Button. */\n/* - pending → info Alert in a disabled, Spinner-busy state while the */\n/* server persists the grant. */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `aiConsentBanner.*` namespace. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA — root */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n state: {\n granted: '',\n required: '',\n pending: '',\n },\n },\n defaultVariants: {\n state: 'required',\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* State derivation */\n/* -------------------------------------------------------------------- */\n\nexport type AiConsentState = NonNullable<\n VariantProps<typeof rootVariants>['state']\n>;\n\n/** Pending wins over granted/required so the busy state is never masked. */\nfunction deriveState(granted: boolean, pending: boolean): AiConsentState {\n if (pending) return 'pending';\n return granted ? 'granted' : 'required';\n}\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\n/** Agent-readiness curated handle. Exposes the structural consent state only. */\nexport interface AiConsentBannerHandle {\n /** Current derived state: 'granted' | 'required' | 'pending'. */\n getState: () => AiConsentState;\n /** Whether the Grant affordance is currently armed (checkbox ticked). */\n isArmed: () => boolean;\n}\n\nexport interface AiConsentBannerProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children' | 'role'\n> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so an\n * agent / MCP UI bridge can address this specific banner. Mirrored to the\n * real DOM `id`.\n */\n id?: string;\n /** Whether consent has already been granted. Server-sourced. */\n granted: boolean;\n /**\n * When consent was granted — ISO-8601 string, ms-epoch, or Date. Rendered\n * via `Timestamp` in the granted state.\n */\n grantedAt?: string | number | Date;\n /** Who granted consent (operator display name / role). Granted state only. */\n grantedBy?: string;\n /**\n * Whether the current user is allowed to grant consent. When `false`, the\n * required-state Grant affordance is hidden and a not-allowed note shows.\n * Default `true`.\n */\n canGrant?: boolean;\n /** The grant is being persisted server-side — shows the busy Spinner state. */\n pending?: boolean;\n /** Fired when the operator confirms the consent grant. */\n onGrantConsent?: () => void;\n /** Override the region's accessible name. */\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const AiConsentBanner = forwardRef<HTMLDivElement, AiConsentBannerProps>(\n (\n {\n id,\n granted,\n grantedAt,\n grantedBy,\n canGrant = true,\n pending = false,\n onGrantConsent,\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const state = deriveState(granted, pending);\n\n // Local arm switch — the required state gates the Grant Button behind an\n // explicit \"I understand\" checkbox so consent is never one mis-click away.\n const [armed, setArmed] = useState(false);\n\n const armedRef = useRef(armed);\n armedRef.current = armed;\n\n const handle = useMemo<AiConsentBannerHandle>(\n () => ({\n getState: () => deriveState(granted, pending),\n isArmed: () => armedRef.current,\n }),\n [granted, pending],\n );\n useAgentRegistration(aiConsentBannerAgent, handle, id);\n\n const resolvedAriaLabel =\n ariaLabel ?? t('aiConsentBanner.regionLabel', 'AI assistance consent');\n\n // Alert variant per state: granted → success, required/pending → info.\n const alertVariant = state === 'granted' ? 'success' : 'info';\n\n let body: React.ReactNode;\n if (state === 'granted') {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Badge variant=\"success\">\n {t('aiConsentBanner.badge.granted', 'Consent granted')}\n </Badge>\n {grantedAt !== undefined ? (\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.grantedAtPrefix', 'Granted')}{' '}\n <Timestamp value={grantedAt} format=\"relative\" shape=\"inline\" />\n </span>\n ) : null}\n </div>\n {grantedBy ? (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.grantedBy', {\n name: grantedBy,\n defaultValue: 'By {{name}}',\n })}\n </p>\n ) : null}\n </div>\n );\n } else if (state === 'pending') {\n body = (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Spinner\n variant=\"pulse\"\n size=\"sm\"\n label={t('aiConsentBanner.pendingLabel', 'Saving consent…')}\n />\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.pendingLabel', 'Saving consent…')}\n </span>\n </div>\n );\n } else {\n // required\n body = canGrant ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <Checkbox\n checked={armed}\n onCheckedChange={(next) => setArmed(next === true)}\n label={t(\n 'aiConsentBanner.confirmLabel',\n 'I confirm consent has been obtained for AI assistance.',\n )}\n />\n <Alert.Action>\n <Button\n intent=\"primary\"\n size=\"sm\"\n disabled={!armed}\n onClick={onGrantConsent}\n >\n {t('aiConsentBanner.grantButton', 'Grant consent')}\n </Button>\n </Alert.Action>\n </div>\n ) : (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t(\n 'aiConsentBanner.notAllowed',\n 'You do not have permission to grant AI assistance consent.',\n )}\n </p>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n aria-busy={state === 'pending' ? true : undefined}\n data-component=\"ai-consent-banner\"\n data-component-id={id}\n data-state={state}\n id={id}\n className={rootVariants({ state, className })}\n {...rest}\n >\n <Alert\n variant={alertVariant}\n icon={state === 'pending' ? null : undefined}\n >\n <Alert.Title>\n {t('aiConsentBanner.title', 'AI assistance consent')}\n </Alert.Title>\n <Alert.Description>\n {state === 'granted'\n ? t(\n 'aiConsentBanner.description.granted',\n 'AI assistance is enabled for this record.',\n )\n : t(\n 'aiConsentBanner.description.required',\n 'AI assistance requires recorded consent before it can run.',\n )}\n </Alert.Description>\n {body}\n </Alert>\n </div>\n );\n },\n);\n\nAiConsentBanner.displayName = 'AiConsentBanner';\n"],"names":["aiConsentBannerAgent","handle","rootVariants","cva","deriveState","granted","pending","AiConsentBanner","forwardRef","id","grantedAt","grantedBy","canGrant","onGrantConsent","ariaLabel","className","rest","ref","t","useTranslation","state","armed","setArmed","useState","armedRef","useRef","useMemo","useAgentRegistration","resolvedAriaLabel","alertVariant","body","jsxs","jsx","Badge","Timestamp","Spinner","Checkbox","next","Alert","Button"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"appointment-card-WsDGBBut.js","sources":["../../node_modules/lucide-react/dist/esm/icons/clipboard-plus.mjs","../../node_modules/lucide-react/dist/esm/icons/file-pen-line.mjs","../../node_modules/lucide-react/dist/esm/icons/message-square-text.mjs","../../src/components/appointment-card/appointment-card.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"8\", height: \"4\", x: \"8\", y: \"2\", rx: \"1\", ry: \"1\", key: \"tgr4d6\" }],\n [\n \"path\",\n {\n d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\",\n key: \"116196\"\n }\n ],\n [\"path\", { d: \"M9 14h6\", key: \"159ibu\" }],\n [\"path\", { d: \"M12 17v-6\", key: \"1y8rbf\" }]\n];\nconst ClipboardPlus = createLucideIcon(\"clipboard-plus\", __iconNode);\n\nexport { __iconNode, ClipboardPlus as default };\n//# sourceMappingURL=clipboard-plus.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M14.364 13.634a2 2 0 0 0-.506.854l-.837 2.87a.5.5 0 0 0 .62.62l2.87-.837a2 2 0 0 0 .854-.506l4.013-4.009a1 1 0 0 0-3.004-3.004z\",\n key: \"ukzhwg\"\n }\n ],\n [\"path\", { d: \"M14.487 7.858A1 1 0 0 1 14 7V2\", key: \"1klhew\" }],\n [\n \"path\",\n {\n d: \"M20 19.645V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l2.516 2.516\",\n key: \"rxaxab\"\n }\n ],\n [\"path\", { d: \"M8 18h1\", key: \"13wk12\" }]\n];\nconst FilePenLine = createLucideIcon(\"file-pen-line\", __iconNode);\n\nexport { __iconNode, FilePenLine as default };\n//# sourceMappingURL=file-pen-line.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z\",\n key: \"18887p\"\n }\n ],\n [\"path\", { d: \"M7 11h10\", key: \"1twpyw\" }],\n [\"path\", { d: \"M7 15h6\", key: \"d9of3u\" }],\n [\"path\", { d: \"M7 7h8\", key: \"af5zfr\" }]\n];\nconst MessageSquareText = createLucideIcon(\"message-square-text\", __iconNode);\n\nexport { __iconNode, MessageSquareText as default };\n//# sourceMappingURL=message-square-text.mjs.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n Armchair,\n ChevronRight,\n ClipboardPlus,\n FileSignature,\n Globe,\n MapPin,\n MessageSquareText,\n Repeat,\n Star,\n UserX,\n Video,\n} from 'lucide-react';\nimport { Avatar } from '../avatar/avatar';\nimport { Badge } from '../badge/badge';\nimport { Tag } from '../tag/tag';\nimport { Timestamp } from '../timestamp/timestamp';\nimport { TransactionChip } from '../transaction-chip/transaction-chip';\nimport {\n appointmentStateWorkflow,\n colorIdToToken,\n colorIdToAvatarToken,\n isSafeEntityUrl,\n} from '../_shared/entity-card';\nimport type { AppointmentState } from '../_shared/entity-card';\nimport { WorkflowStatusDisplay } from '../workflow-status';\n\n/*\n * Closed colour-dot class map. `colorIdToToken` resolves the operator's\n * numeric colour id to one of a fixed set of palette tokens; the operator\n * dot needs a *static* Tailwind class for each so the compiler can emit it\n * (dynamic `ds:bg-[…]` strings are not seen by the JIT). The keys mirror the\n * exact token strings the shared helper returns.\n */\nconst OPERATOR_DOT_CLASS: Record<string, string> = {\n 'var(--color-violet-500)': 'ds:bg-[var(--color-violet-500)]',\n 'var(--color-purple-500)': 'ds:bg-[var(--color-purple-500)]',\n 'var(--color-magenta-500)': 'ds:bg-[var(--color-magenta-500)]',\n 'var(--color-blue-500)': 'ds:bg-[var(--color-blue-500)]',\n 'var(--color-green-500)': 'ds:bg-[var(--color-green-500)]',\n 'var(--color-red-500)': 'ds:bg-[var(--color-red-500)]',\n 'var(--color-yellow-500)': 'ds:bg-[var(--color-yellow-500)]',\n 'var(--color-indigo-500)': 'ds:bg-[var(--color-indigo-500)]',\n 'var(--color-orange-500)': 'ds:bg-[var(--color-orange-500)]',\n 'var(--color-fuchsia-500)': 'ds:bg-[var(--color-fuchsia-500)]',\n 'var(--color-grey-700)': 'ds:bg-[var(--color-grey-700)]',\n};\n\nfunction operatorDotClass(colorId: number | string | undefined): string {\n return (\n OPERATOR_DOT_CLASS[colorIdToToken(colorId)] ??\n 'ds:bg-[var(--color-grey-700)]'\n );\n}\n\n/** Age in whole years from a DOB string, or undefined if unparseable. */\nfunction ageFromDob(dobIso: string | undefined): number | undefined {\n if (!dobIso) return undefined;\n const dob = new Date(dobIso);\n if (Number.isNaN(dob.getTime())) return undefined;\n const now = new Date();\n let age = now.getFullYear() - dob.getFullYear();\n const monthDiff = now.getMonth() - dob.getMonth();\n if (monthDiff < 0 || (monthDiff === 0 && now.getDate() < dob.getDate())) {\n age--;\n }\n return age < 0 || age > 130 ? undefined : age;\n}\n\n/* -------------------------------------------------------------------- */\n/* AppointmentCard */\n/* */\n/* Single-row appointment surface — sibling of AgendaCard, but richer: */\n/* leading timestamp, operator + patient avatars with the operator */\n/* colour dot, a lifecycle-state Badge (announced by label, never colour */\n/* alone), treatment / tooth Tags, and an optional advance-deposit */\n/* TransactionChip. State→Badge-variant + colour-id→token + URL-safety */\n/* come from the shared `_shared/entity-card` helpers. */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `appointmentCard.*` namespace (plus shared `financial.*` for money). */\n/* -------------------------------------------------------------------- */\n\n// Back-compat / one-stop import — the URL guard lives in the shared helper.\nexport { isSafeEntityUrl as isSafeAppointmentUrl } from '../_shared/is-safe-url';\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\n/** Appointment delivery channel. */\nexport type AppointmentType = 'inPractice' | 'telehealth';\n\n/** First-visit tri-state flag. */\nexport type AppointmentFirstVisit = 'yes' | 'no' | 'unknown';\n\n/** Operator (clinician) summary — name + optional palette colour id. */\nexport interface AppointmentOperator {\n /** Operator display name — drives the avatar initials + accessible name. */\n name: string;\n /** Numeric palette colour id, resolved to a kit token for the colour dot. */\n colorId?: number | string;\n}\n\n/** Patient summary — identity + optional age driver. */\nexport interface AppointmentPatient {\n /** Patient display name. */\n name: string;\n /** Optional avatar image URL. */\n avatarUrl?: string;\n /** ISO-8601 date of birth — when present, the card renders the age as a\n * suffix on the name (e.g. \"Carol Danvers · 45\"). */\n dobIso?: string;\n}\n\n/** One treatment line within the appointment. */\nexport interface AppointmentTreatment {\n /** Localised care / treatment name. */\n careName: string;\n /** Optional tooth elements (e.g. FDI ids) the treatment targets. */\n elements?: string[];\n}\n\n/** Booking-reason metadata captured at online-booking time. */\nexport interface AppointmentBookingReason {\n /** Localised booking-reason description. */\n description: string;\n /** Expected duration in minutes. */\n durationMin?: number;\n /** Advance / deposit amount in cents (non-negative). */\n advanceAmountCents?: number;\n /** Localised specialty label. */\n specialty?: string;\n}\n\n/** Money summary for the appointment. */\nexport interface AppointmentMoney {\n /** Total billable amount in cents. When present, rendered as a\n * TransactionChip. */\n billableAmountCents?: number;\n /** Outstanding unpaid amount in cents. When > 0, rendered as a warning\n * TransactionChip so the front desk can flag it at a glance. */\n unpaidAmountCents?: number;\n}\n\n/** Signing status for documents attached to the appointment. */\nexport interface AppointmentSigning {\n /** How many documents require a signature. */\n required: number;\n /** How many have been completed so far. */\n toComplete: number;\n}\n\n/** Boolean appointment flags surfaced as chips / indicators. */\nexport interface AppointmentFlags {\n bookedOnline?: boolean;\n noPatientAssigned?: boolean;\n highlightedAnamnesis?: boolean;\n billable?: boolean;\n}\n\nexport interface AppointmentItem {\n /** Stable appointment identifier. */\n id: string;\n /** ISO-8601 start instant. */\n startIso: string;\n /** Duration in minutes. */\n durationMin: number;\n /** Lifecycle state — drives the Badge variant + label. */\n state: AppointmentState;\n /** Delivery channel — drives the leading type glyph. */\n type: AppointmentType;\n /** First-visit flag. */\n firstVisit?: AppointmentFirstVisit;\n /** Assigned operator. */\n operator?: AppointmentOperator;\n /** Chair / room label — surfaced as a chip. */\n chair?: string;\n /**\n * The care plan this appointment belongs to, when any — surfaced as a chip\n * (`Care plan {number}`). `url` is the deep link the consumer may use for\n * navigation; the chip itself is non-interactive so it never nests an anchor\n * inside the row's own stretched link.\n */\n carePlan?: { number: string; url?: string };\n /** Patient identity. */\n patient?: AppointmentPatient;\n /** Treatment lines. */\n treatments?: AppointmentTreatment[];\n /** Online booking-reason metadata. */\n bookingReason?: AppointmentBookingReason;\n /** Boolean flags. */\n flags?: AppointmentFlags;\n /** Money summary — billable + unpaid amounts. */\n money?: AppointmentMoney;\n /** Whether this appointment is part of a recurring series. */\n recurring?: boolean;\n /** Signing status for attached documents. */\n signing?: AppointmentSigning;\n /** A note left by the patient at booking time. When present, a small\n * message icon signals it. */\n bookingNote?: string;\n /** Optional deep link — when present (and safe) the row renders as an anchor. */\n url?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* CVA — row */\n/* -------------------------------------------------------------------- */\n\nconst appointmentCardVariants = cva(\n [\n 'ds:relative ds:flex ds:items-start ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:text-start ds:group',\n 'ds:bg-[var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:transition-[colors,border-color,box-shadow] ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n 'ds:forced-colors:border ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-sm)]',\n md: 'ds:p-[var(--spacing-md)]',\n },\n interactive: {\n true: 'ds:hover:bg-[color:var(--muted)]/40 ds:cursor-pointer',\n false: '',\n },\n surface: {\n // `flat` (default) is the chrome-less row used inside a bordered\n // AppointmentTray. `elevated` gives each row its own card chrome\n // (border + shadow) for use directly on a rail, e.g. AppointmentTimeline.\n // Uses `--shadow-sm` (a row lift), not `--shadow-card`/`--shadow-lg`:\n // the rail's `overflow-y:auto` scroll region clips `overflow-x` at a\n // narrow gutter, so a wide 30px-blur shadow gets a hard-edged clip.\n flat: '',\n elevated:\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2 ds:shadow-[var(--shadow-sm)]',\n },\n selected: {\n // The row the host has marked as the active/selected appointment —\n // matches the `current` note's info-tinted accent: a solid\n // inline-start bar plus a soft info wash, so the eye keeps its\n // place in the list after a click.\n true: 'ds:border-s-2 ds:border-s-[color:var(--info)] ds:bg-[color:var(--info)]/10',\n false: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n interactive: false,\n surface: 'flat',\n selected: false,\n },\n },\n);\n\nconst stretchedLinkClass = [\n // Interactive elements need a box to remain keyboard-focusable in browsers.\n 'ds:inline-flex ds:min-w-0',\n 'ds:focus-visible:outline-none',\n \"ds:after:content-[''] ds:after:absolute ds:after:inset-0 ds:after:rounded-[var(--radius-md)]\",\n 'ds:after:pointer-events-auto',\n 'ds:focus-visible:after:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:after:outline-solid',\n 'ds:focus-visible:after:outline-[color:var(--ring)]',\n 'ds:focus-visible:after:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:after:outline-[CanvasText]',\n].join(' ');\n\nconst TYPE_ICON: Record<AppointmentType, typeof MapPin> = {\n inPractice: MapPin,\n telehealth: Video,\n};\n\n/* -------------------------------------------------------------------- */\n/* Props */\n/* -------------------------------------------------------------------- */\n\nexport interface AppointmentCardProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'onClick' | 'title'>,\n VariantProps<typeof appointmentCardVariants> {\n /** The appointment to render. */\n item: AppointmentItem;\n /** Visual density. */\n size?: 'sm' | 'md';\n /**\n * `'flat'` (default) — chrome-less row for use inside a bordered\n * `AppointmentTray`. `'elevated'` — each row carries its own card chrome\n * (border + shadow), for placing rows directly on a rail (AppointmentTimeline).\n */\n surface?: 'flat' | 'elevated';\n /** BCP-47 locale override for the timestamp + currency. */\n locale?: string;\n /** ISO-4217 currency code for the advance-deposit chip. Defaults to `EUR`. */\n currency?: string;\n /**\n * Show the patient identity (avatar + name as the row title). Default `true`.\n * Set `false` in single-patient surfaces (e.g. a patient's own\n * `AppointmentTimeline`) where repeating the name is redundant — the row then\n * leads with the operator as its title, falling back to a generic label.\n */\n showPatient?: boolean;\n /** Fires when the row is activated. */\n onActivate?: (item: AppointmentItem) => void;\n /**\n * Mark this row as the active/selected appointment — an info-tinted\n * inline-start bar plus a soft wash, so the eye keeps its place in the\n * list after a click. Renders `aria-current=\"true\"` for assistive tech.\n */\n selected?: boolean;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const AppointmentCard = forwardRef<HTMLDivElement, AppointmentCardProps>(\n (\n {\n item,\n size = 'sm',\n surface = 'flat',\n locale,\n currency = 'EUR',\n showPatient = true,\n onActivate,\n selected = false,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const interactive = !!onActivate;\n const hasSafeUrl = !!item.url && isSafeEntityUrl(item.url);\n\n const patientName = item.patient?.name ?? t('appointmentCard.noPatient');\n const operatorName = item.operator?.name;\n const stateLabel = t(`appointmentCard.state.${item.state}`);\n const stateWorkflow = appointmentStateWorkflow(item.state);\n const StateIcon = stateWorkflow.Icon;\n const patientAge = ageFromDob(item.patient?.dobIso);\n const noPatient = item.flags?.noPatientAssigned || !item.patient;\n\n const avatarSize = size === 'md' ? 'md' : 'sm';\n const TypeIcon = TYPE_ICON[item.type];\n\n // In single-patient context the patient name is redundant, so the row leads\n // with the operator (the \"who am I seeing\") and falls back to a generic\n // label when no operator is set.\n const title = showPatient\n ? patientName\n : (operatorName ?? t('appointmentCard.appointment'));\n\n const ariaLabel = showPatient\n ? t('appointmentCard.itemLabel', {\n patient: patientName,\n state: stateLabel,\n })\n : t('appointmentCard.itemLabelGeneric', { title, state: stateLabel });\n\n const titleNode = (\n <span className=\"ds:min-w-0 ds:truncate type-title-item ds:text-[color:var(--foreground)]\">\n {title}\n {showPatient && patientAge !== undefined ? (\n <span className=\"ds:ms-[var(--spacing-2xs)] ds:font-normal ds:text-[color:var(--muted-foreground)]\">\n · {patientAge}\n </span>\n ) : null}\n </span>\n );\n\n let activator: ReactNode;\n if (interactive && hasSafeUrl) {\n activator = (\n <a\n href={item.url}\n aria-label={ariaLabel}\n className={stretchedLinkClass}\n onClick={(e) => {\n if (e.defaultPrevented || e.metaKey || e.ctrlKey || e.shiftKey)\n return;\n onActivate?.(item);\n }}\n >\n {titleNode}\n </a>\n );\n } else if (interactive) {\n activator = (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n className={\n stretchedLinkClass +\n ' ds:bg-transparent ds:border-0 ds:p-0 ds:text-start'\n }\n onClick={() => onActivate?.(item)}\n >\n {titleNode}\n </button>\n );\n } else {\n activator = titleNode;\n }\n\n // Treatment / tooth-element Tags. Each treatment becomes one Tag; the\n // tooth elements (when present) are appended to the visible label.\n const treatmentTags = (item.treatments ?? []).map((tx, index) => {\n const label =\n tx.elements && tx.elements.length > 0\n ? t('appointmentCard.treatmentWithElements', {\n care: tx.careName,\n elements: tx.elements.join(', '),\n })\n : tx.careName;\n return (\n <Tag\n key={`${tx.careName}-${index}`}\n label={label}\n variant=\"neutral\"\n fill=\"outline\"\n size=\"sm\"\n maxInlineSize=\"12rem\"\n />\n );\n });\n\n const advanceCents = item.bookingReason?.advanceAmountCents;\n const hasAdvance = typeof advanceCents === 'number' && advanceCents > 0;\n const unpaidCents = item.money?.unpaidAmountCents;\n const hasUnpaid = typeof unpaidCents === 'number' && unpaidCents > 0;\n\n return (\n <div\n ref={ref}\n /* `listitem` by default — the card is normally a list child. A\n consumer composing a richer row (card plus its own action row)\n owns the semantics instead and passes `role=\"presentation\"`,\n so the two do not nest. `rest` is spread after this. */\n role=\"listitem\"\n data-component=\"appointment-card\"\n data-component-id={item.id}\n data-state={item.state}\n data-type={item.type}\n aria-current={selected ? 'true' : undefined}\n className={appointmentCardVariants({\n size,\n interactive,\n surface,\n selected,\n className,\n })}\n {...rest}\n >\n {/* Leading rail: type glyph + start time + duration */}\n {/* min-w, not a fixed w: a 12-hour time (\"10:30 AM\") plus the type\n glyph is wider than 4rem, and must never wrap AM/PM onto a\n second line. */}\n <span className=\"ds:flex ds:min-w-20 ds:shrink-0 ds:flex-col ds:items-start ds:gap-[var(--spacing-2xs)]\">\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] ds:whitespace-nowrap ds:text-[color:var(--muted-foreground)]\">\n <TypeIcon aria-hidden=\"true\" className=\"ds:size-3.5 ds:shrink-0\" />\n <span className=\"ds:sr-only\">\n {t(`appointmentCard.type.${item.type}`)}\n </span>\n <Timestamp\n value={item.startIso}\n format=\"absolute\"\n shape=\"bare\"\n locale={locale}\n absoluteFormat={{ hour: 'numeric', minute: '2-digit' }}\n className=\"type-body-sm ds:font-medium ds:text-[color:var(--foreground)] ds:tabular-nums\"\n />\n </span>\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {t('appointmentCard.duration', { count: item.durationMin })}\n </span>\n </span>\n\n {/* Operator avatar with colour dot */}\n {operatorName ? (\n <span className=\"ds:relative ds:shrink-0\">\n <Avatar\n name={operatorName}\n color={colorIdToAvatarToken(item.operator?.colorId)}\n size={avatarSize}\n aria-hidden=\"true\"\n role=\"presentation\"\n aria-label={undefined}\n />\n <span\n aria-hidden=\"true\"\n className={\n 'ds:absolute ds:bottom-0 ds:end-0 ds:size-2.5 ds:rounded-[var(--radius-full)] ds:border ds:border-[color:var(--card)] ' +\n operatorDotClass(item.operator?.colorId)\n }\n />\n </span>\n ) : null}\n\n {/* Main content column */}\n <div className=\"ds:flex-1 ds:min-w-0 ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:items-start ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex-1 ds:min-w-0 ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {showPatient && item.patient?.avatarUrl ? (\n <Avatar\n name={patientName}\n src={item.patient.avatarUrl}\n size={avatarSize}\n className=\"ds:shrink-0\"\n aria-hidden=\"true\"\n role=\"presentation\"\n aria-label={undefined}\n />\n ) : null}\n {showPatient && noPatient ? (\n <span\n className={`ds:shrink-0 ds:inline-flex ds:items-center ds:justify-center ds:rounded-[var(--radius-full)] ds:bg-[color:var(--muted)] ds:text-[color:var(--muted-foreground)] ${\n avatarSize === 'md' ? 'ds:size-10' : 'ds:size-8'\n }`}\n >\n <UserX aria-hidden=\"true\" className=\"ds:size-4\" />\n </span>\n ) : null}\n {activator}\n </div>\n {/* The kit's read-only status surface, not a bare Badge: an\n appointment's status is the same thing on a card, in a details\n footer and in a history entry, so it wears one face and takes\n its tone and glyph from the shared map. */}\n <WorkflowStatusDisplay\n size=\"sm\"\n value={item.state}\n option={{\n value: item.state,\n label: stateLabel,\n icon: <StateIcon aria-hidden=\"true\" />,\n tone: stateWorkflow.tone,\n }}\n className=\"ds:shrink-0\"\n />\n </div>\n\n {/* Meta line: operator name · specialty · first visit · booking note\n (chair moved to a chip below). When the patient is hidden the\n operator is promoted to the title, so it drops out of the meta. */}\n {(showPatient && operatorName) ||\n item.bookingReason?.specialty ||\n item.firstVisit === 'yes' ||\n item.firstVisit === 'unknown' ||\n item.bookingNote ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-sm)] ds:gap-y-[var(--spacing-2xs)] type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {showPatient && operatorName ? <span>{operatorName}</span> : null}\n {item.bookingReason?.specialty ? (\n <span>{item.bookingReason.specialty}</span>\n ) : null}\n {item.firstVisit === 'yes' ? (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <Star aria-hidden=\"true\" className=\"ds:size-3 ds:shrink-0\" />\n {t('appointmentCard.firstVisit')}\n </span>\n ) : null}\n {item.firstVisit === 'unknown' ? (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <Star aria-hidden=\"true\" className=\"ds:size-3 ds:shrink-0\" />\n {t('appointmentCard.firstVisitUnknown')}\n </span>\n ) : null}\n {item.bookingNote ? (\n <span\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\"\n title={t('appointmentCard.hasBookingNote')}\n >\n <MessageSquareText\n aria-hidden=\"true\"\n className=\"ds:size-3 ds:shrink-0\"\n />\n {t('appointmentCard.hasBookingNote')}\n </span>\n ) : null}\n </div>\n ) : null}\n\n {/* Booking reason */}\n {item.bookingReason?.description ? (\n <span className=\"type-body-sm ds:text-[color:var(--foreground)] ds:truncate\">\n {item.bookingReason.description}\n </span>\n ) : null}\n\n {/* Treatment / tooth Tags */}\n {treatmentTags.length > 0 ? (\n <div className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-2xs)]\">\n {treatmentTags}\n </div>\n ) : null}\n\n {/* Chips: care plan · chair · flags · recurring · signing ·\n advance-deposit · unpaid balance · billable */}\n {item.carePlan ||\n item.chair ||\n item.flags?.bookedOnline ||\n item.flags?.highlightedAnamnesis ||\n item.flags?.billable ||\n item.recurring ||\n item.signing ||\n hasAdvance ||\n hasUnpaid ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {item.carePlan ? (\n <Badge\n variant=\"accentSoft\"\n size=\"sm\"\n leading={<ClipboardPlus />}\n >\n {t('appointmentCard.carePlan', {\n number: item.carePlan.number,\n })}\n </Badge>\n ) : null}\n {item.chair ? (\n <Badge variant=\"neutral\" size=\"sm\" leading={<Armchair />}>\n {t('appointmentCard.chair', { chair: item.chair })}\n </Badge>\n ) : null}\n {item.flags?.bookedOnline ? (\n <Badge variant=\"info\" size=\"sm\" leading={<Globe />}>\n {t('appointmentCard.flag.bookedOnline')}\n </Badge>\n ) : null}\n {item.flags?.highlightedAnamnesis ? (\n <Badge variant=\"warning\" size=\"sm\" withDot>\n {t('appointmentCard.flag.highlightedAnamnesis')}\n </Badge>\n ) : null}\n {item.recurring ? (\n <Badge variant=\"neutral\" size=\"sm\" leading={<Repeat />}>\n {t('appointmentCard.recurring')}\n </Badge>\n ) : null}\n {item.signing ? (\n <Badge\n variant={\n item.signing.toComplete >= item.signing.required\n ? 'success'\n : 'warning'\n }\n size=\"sm\"\n leading={<FileSignature />}\n >\n {t('appointmentCard.signing', {\n complete: item.signing.toComplete,\n required: item.signing.required,\n })}\n </Badge>\n ) : null}\n {item.flags?.billable ? (\n <Badge variant=\"success\" size=\"sm\" withDot>\n {t('appointmentCard.flag.billable')}\n </Badge>\n ) : null}\n {hasAdvance ? (\n <TransactionChip\n state=\"to-invoice\"\n amount={(advanceCents as number) / 100}\n currency={currency}\n locale={locale}\n size=\"sm\"\n showLabel\n />\n ) : null}\n {hasUnpaid ? (\n <TransactionChip\n state=\"debt\"\n amount={unpaidCents / 100}\n currency={currency}\n locale={locale}\n size=\"sm\"\n showLabel\n />\n ) : null}\n </div>\n ) : null}\n </div>\n\n {interactive ? (\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:self-center ds:text-[color:var(--muted-foreground)] ds:opacity-0 ds:transition-opacity ds:motion-reduce:transition-none ds:group-hover:opacity-100 ds:group-focus-within:opacity-100 ds:rtl:rotate-180\"\n />\n ) : null}\n </div>\n );\n },\n);\n\nAppointmentCard.displayName = 'AppointmentCard';\n"],"names":["__iconNode","ClipboardPlus","createLucideIcon","FilePenLine","MessageSquareText","OPERATOR_DOT_CLASS","operatorDotClass","colorId","colorIdToToken","ageFromDob","dobIso","dob","now","age","monthDiff","appointmentCardVariants","cva","stretchedLinkClass","TYPE_ICON","MapPin","Video","AppointmentCard","forwardRef","item","size","surface","locale","currency","showPatient","onActivate","selected","className","rest","ref","t","useTranslation","interactive","hasSafeUrl","isSafeEntityUrl","patientName","_a","operatorName","_b","stateLabel","stateWorkflow","appointmentStateWorkflow","StateIcon","patientAge","_c","noPatient","_d","avatarSize","TypeIcon","title","ariaLabel","titleNode","jsxs","activator","jsx","e","treatmentTags","tx","index","label","Tag","advanceCents","_e","hasAdvance","unpaidCents","_f","hasUnpaid","Timestamp","Avatar","colorIdToAvatarToken","_g","_h","_i","UserX","WorkflowStatusDisplay","_j","_k","Star","_l","_m","_n","_o","Badge","Armchair","_p","Globe","_q","Repeat","FileSignature","_r","TransactionChip","ChevronRight"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"appointment-timeline-D-rNwKpS.js","sources":["../../src/components/appointment-timeline/appointment-timeline.agent.ts","../../src/components/appointment-timeline/appointment-timeline.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AppointmentTimeline. */\n/* */\n/* Timeline surface: read appointment ids + lifecycle state (never */\n/* patient names / treatments), activate a row through the curated handle, */\n/* and re-anchor the scroll on today. In-page (no open/close). */\n/* `showPatient` is presentation only — it changes which name each row */\n/* leads with, never what the adapter reads or exposes. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AppointmentTimelineHandle } from './appointment-timeline';\n\nexport const appointmentTimelineAgent: AgentAdapter<AppointmentTimelineHandle> =\n {\n id: 'appointment-timeline',\n // 'pick' backs select_item (non-persisting activation through\n // onOpenAppointment); 'scroll' backs jump_to_today, which re-anchors the\n // scroll viewport (mirrors practice-results' scroll_to_result).\n capabilities: ['scroll', 'pick'],\n state: {\n items: {\n type: 'Array<{ id: string; state: string }>',\n descriptionKey: 'ui.agent.appointmentTimeline.state.items',\n description:\n 'Currently-rendered appointments. Ids + lifecycle state only — never patient identity.',\n read: (handle) => handle.getItems(),\n },\n },\n actions: {\n select_item: {\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.appointmentTimeline.actions.selectItem',\n description: 'Activate the appointment with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n jump_to_today: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.appointmentTimeline.actions.jumpToToday',\n description: \"Re-anchor the timeline scroll on today's appointments.\",\n invoke: (handle) => {\n handle.jumpToToday();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'appointment-timeline',\n description: 'Marks the AppointmentTimeline wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific timeline from the agent.',\n },\n item: {\n attr: 'data-appointment-id',\n description:\n 'Stable appointment id emitted on each rendered AppointmentCard inside the timeline.',\n },\n },\n };\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\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 { CalendarDays } from 'lucide-react';\nimport { AppointmentCard, type AppointmentItem } from '../appointment-card';\nimport { Button } from '../button';\nimport { ButtonGroup } from '../button-group';\nimport { DatePicker } from '../date-picker';\nimport { PanelHeader } from '../panel-header';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { usePrefersReducedMotion } from '../../hooks/use-prefers-reduced-motion';\nimport { REFLOW_ROW_CLASS, useListReflow } from '../../hooks/use-list-reflow';\nimport { useExitTransition } from '../../hooks/use-exit-transition';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { appointmentTimelineAgent } from './appointment-timeline.agent';\n\n/* -------------------------------------------------------------------- */\n/* AppointmentTimeline */\n/* */\n/* A vertical, day-grouped appointment timeline for the Control Room */\n/* rail. Unlike AppointmentTray (a bordered card of a flat list), this */\n/* fills the rail edge-to-edge: appointments are grouped under day */\n/* headers, the scroll is anchored on TODAY, and it scrolls infinitely */\n/* into the past and future — the consumer feeds more via onLoadEarlier */\n/* / onLoadLater as either edge is reached (scroll position is preserved */\n/* when earlier items prepend). Date-filter presets + a jump-to-date */\n/* picker re-anchor the scroll. Top + bottom transparent gradient fades */\n/* (a block-axis mask) signal more content beyond each edge. */\n/* */\n/* Each row reuses AppointmentCard (care-plan + chair chips included). */\n/* All visible text flows through useTranslation('ui') against the */\n/* `appointmentTimeline.*` namespace; no PHI reaches the agent adapter. */\n/* -------------------------------------------------------------------- */\n\n/* How close (px) to an edge before the matching load callback fires. */\nconst EDGE_LOAD_THRESHOLD = 96;\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\n/** Curated imperative handle — identifiers + lifecycle state only. */\nexport interface AppointmentTimelineHandle {\n getItems: () => Array<{ id: string; state: string }>;\n selectItem: (id: string) => void;\n jumpToToday: () => void;\n}\n\nexport interface AppointmentTimelineProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'onClick' | 'id' | 'title'\n> {\n /** Stable instance id, surfaced as `data-component-id`. */\n id?: string;\n /** Appointments to render — any order; grouped + sorted internally. */\n items: AppointmentItem[];\n /**\n * ISO-8601 \"now\" anchor — the timeline scrolls to this day on mount and the\n * \"Today\" preset returns to it. Defaults to the current instant. Stories pass\n * a fixed value for deterministic snapshots.\n */\n nowIso?: string;\n /** Panel heading. Defaults to the localised \"Appointments\". */\n title?: string;\n /** BCP-47 locale override for day headers + each AppointmentCard. */\n locale?: string;\n /** ISO-4217 currency code passed to each AppointmentCard. */\n currency?: string;\n /** Visual density passed to each AppointmentCard. */\n size?: 'sm' | 'md';\n /**\n * Lead each row with the PATIENT (avatar + name as the row title) rather\n * than the operator. Default `false`: the timeline was built for a\n * patient-scoped rail, where repeating the name on every row is noise. A\n * clinic-wide agenda — \"who is coming in next\" across the practice —\n * passes `true`, and rows with no patient read as \"No patient\".\n */\n showPatient?: boolean;\n /** Fires when a row is activated. */\n onOpenAppointment?: (item: AppointmentItem) => void;\n /**\n * The id of the currently selected appointment. The matching card\n * renders with `selected` (info-tinted accent + `aria-current`) so the\n * eye keeps its place in the list after a click.\n */\n selectedId?: string;\n\n /* ----- Infinite scroll ----- */\n /** Load earlier (past) appointments — fired when the top edge is reached. */\n onLoadEarlier?: () => void;\n /** Load later (future) appointments — fired when the bottom edge is reached. */\n onLoadLater?: () => void;\n /** Whether more past appointments exist. Defaults to `true` when `onLoadEarlier` is set. */\n hasMoreEarlier?: boolean;\n /** Whether more future appointments exist. Defaults to `true` when `onLoadLater` is set. */\n hasMoreLater?: boolean;\n /** Show a loading row at the top edge. */\n loadingEarlier?: boolean;\n /** Show a loading row at the bottom edge. */\n loadingLater?: boolean;\n\n /* ----- Filters ----- */\n /** Show the date-filter row (presets + jump-to-date). Default `true`. */\n showFilters?: boolean;\n /**\n * Fired when a jump-to-date / preset targets a day outside the loaded range,\n * so the consumer can load it. The timeline scrolls to the nearest rendered\n * day until then.\n */\n onJumpToDate?: (dateIso: string) => void;\n\n /* ----- Empty ----- */\n emptyTitle?: string;\n emptyDescription?: string;\n\n /** Accessible name for the panel region (defaults to `title`). */\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:h-full ds:min-h-0',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n ].join(' '),\n { variants: { size: { sm: '', md: '' } }, defaultVariants: { size: 'sm' } },\n);\n\n/* Scroll region with a block-axis fade mask. The CSS custom properties flip to\n `transparent` at whichever edge has more content (data-fade-top /\n data-fade-bottom), mirroring the TabBar edge-mask technique on the Y axis.\n Disabled under reduced-motion, the accessible theme, and forced-colors. */\nconst scrollRegionClasses = [\n 'ds:flex-1 ds:min-h-0 ds:overflow-y-auto',\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]',\n 'ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]',\n 'ds:[--atl-mask-top:black] ds:[--atl-mask-bottom:black]',\n 'ds:data-[fade-top=true]:[--atl-mask-top:transparent]',\n 'ds:data-[fade-bottom=true]:[--atl-mask-bottom:transparent]',\n 'ds:[mask-image:linear-gradient(to_bottom,var(--atl-mask-top)_0,black_var(--atl-fade-distance,var(--spacing-lg)),black_calc(100%-var(--atl-fade-distance,var(--spacing-lg))),var(--atl-mask-bottom)_100%)]',\n 'ds:motion-reduce:[mask-image:none]',\n 'ds:[.theme-accessible_&]:[mask-image:none]',\n 'ds:forced-colors:[mask-image:none]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:[outline-offset:-2px]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\n/* -------------------------------------------------------------------- */\n/* Day grouping + header labels */\n/* -------------------------------------------------------------------- */\n\ninterface DayGroup {\n key: string;\n date: Date;\n items: AppointmentItem[];\n}\n\n/** Local calendar day key (`YYYY-MM-DD`) — sorts chronologically as a string. */\nfunction localDayKey(d: Date): string {\n const m = `${d.getMonth() + 1}`.padStart(2, '0');\n const day = `${d.getDate()}`.padStart(2, '0');\n return `${d.getFullYear()}-${m}-${day}`;\n}\n\nfunction groupByDay(items: AppointmentItem[]): DayGroup[] {\n const sorted = [...items].sort(\n (a, b) => +new Date(a.startIso) - +new Date(b.startIso),\n );\n const map = new Map<string, DayGroup>();\n for (const item of sorted) {\n const d = new Date(item.startIso);\n const key = localDayKey(d);\n let group = map.get(key);\n if (!group) {\n group = {\n key,\n date: new Date(d.getFullYear(), d.getMonth(), d.getDate()),\n items: [],\n };\n map.set(key, group);\n }\n group.items.push(item);\n }\n return [...map.values()];\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const AppointmentTimeline = forwardRef<\n HTMLElement,\n AppointmentTimelineProps\n>(\n (\n {\n id,\n items,\n nowIso,\n title,\n locale,\n currency,\n size = 'sm',\n showPatient = false,\n onOpenAppointment,\n selectedId,\n onLoadEarlier,\n onLoadLater,\n hasMoreEarlier,\n hasMoreLater,\n loadingEarlier = false,\n loadingLater = false,\n showFilters = true,\n onJumpToDate,\n emptyTitle,\n emptyDescription,\n className,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const jumpId = useId();\n const prefersReducedMotion = usePrefersReducedMotion();\n const resolvedLocale = locale ?? i18n.language;\n\n const heading = title ?? t('appointmentTimeline.title');\n const now = useMemo(\n () => (nowIso ? new Date(nowIso) : new Date()),\n [nowIso],\n );\n\n const groups = useMemo(() => groupByDay(items), [items]);\n\n /* Reflow + exit transitions — the same pair notes and tasks use. When\n an appointment is added or removed, surviving cards slide to their\n new positions instead of snapping; a removed card fades out in place\n before the host drops it, so the removal reads as a removal. */\n const reduceMotion = prefersReducedMotion || undefined;\n const flatItemIds = useMemo(\n () => groups.flatMap((g) => g.items.map((i) => i.id)).join(),\n [groups],\n );\n const { containerRef: reflowRef } = useListReflow<HTMLOListElement>({\n key: flatItemIds,\n reduceMotion,\n });\n const exitTransition = useExitTransition({ reduceMotion });\n\n /* Track removed items so they can fade out in place. The previous\n items array is diffed against the current one; removed ids are held\n in `leavingItems` and rendered after the live groups, faded, until\n the exit transition elapses and drops them. */\n const prevItemsRef = useRef(items);\n const [leavingItems, setLeavingItems] = useState<AppointmentItem[]>([]);\n useEffect(() => {\n const prev = prevItemsRef.current;\n if (prev === items) return;\n const currentIds = new Set(items.map((i) => i.id));\n const removed = prev.filter((i) => !currentIds.has(i.id));\n if (removed.length > 0) {\n setLeavingItems((prev) => [...prev, ...removed]);\n removed.forEach((item) => {\n exitTransition.leave(item.id, () => {\n setLeavingItems((prev) => prev.filter((i) => i.id !== item.id));\n });\n });\n }\n prevItemsRef.current = items;\n }, [items, exitTransition]);\n\n const moreEarlier = hasMoreEarlier ?? !!onLoadEarlier;\n const moreLater = hasMoreLater ?? !!onLoadLater;\n\n /* The day to anchor on: today if present, else the nearest upcoming day,\n else the last day we have. */\n const anchorKey = useMemo(() => {\n if (groups.length === 0) return undefined;\n const todayKey = localDayKey(now);\n const keys = groups.map((g) => g.key);\n if (keys.includes(todayKey)) return todayKey;\n return keys.find((k) => k >= todayKey) ?? keys[keys.length - 1];\n }, [groups, now]);\n\n const scrollRef = useRef<HTMLDivElement>(null);\n const dayElRefs = useRef<Map<string, HTMLElement>>(new Map());\n const hasAnchored = useRef(false);\n const prevFirstKey = useRef<string | undefined>(undefined);\n const prevScrollHeight = useRef(0);\n\n const [fadeTop, setFadeTop] = useState(false);\n const [fadeBottom, setFadeBottom] = useState(false);\n\n const updateEdges = useCallback(() => {\n const region = scrollRef.current;\n if (!region) return;\n const { scrollTop, scrollHeight, clientHeight } = region;\n setFadeTop(scrollTop > 1);\n setFadeBottom(scrollTop + clientHeight < scrollHeight - 1);\n }, []);\n\n /* Scroll a day into view at the top of the region. Falls back to the\n nearest rendered day on/after the target (presets may land on an empty\n day). Uses getBoundingClientRect so it is offsetParent-agnostic. */\n const scrollToKey = useCallback(\n (targetKey: string, smooth: boolean) => {\n const region = scrollRef.current;\n if (!region) return;\n let el = dayElRefs.current.get(targetKey);\n if (!el) {\n const keys = [...dayElRefs.current.keys()].sort();\n const next =\n keys.find((k) => k >= targetKey) ?? keys[keys.length - 1];\n el = next ? dayElRefs.current.get(next) : undefined;\n }\n if (!el) return;\n const delta =\n el.getBoundingClientRect().top - region.getBoundingClientRect().top;\n region.scrollTo({\n top: region.scrollTop + delta,\n behavior: smooth && !prefersReducedMotion ? 'smooth' : 'auto',\n });\n },\n [prefersReducedMotion],\n );\n\n /* Anchor on mount; preserve the viewport when earlier days prepend. */\n useIsomorphicLayoutEffect(() => {\n const region = scrollRef.current;\n if (!region) return;\n const firstKey = groups[0]?.key;\n if (!hasAnchored.current) {\n if (groups.length > 0 && anchorKey) {\n scrollToKey(anchorKey, false);\n hasAnchored.current = true;\n }\n } else if (\n prevFirstKey.current &&\n firstKey &&\n firstKey < prevFirstKey.current\n ) {\n const grew = region.scrollHeight - prevScrollHeight.current;\n if (grew > 0) region.scrollTop += grew;\n }\n prevFirstKey.current = firstKey;\n prevScrollHeight.current = region.scrollHeight;\n updateEdges();\n }, [groups, anchorKey, scrollToKey, updateEdges]);\n\n /* Recompute the fades when the region resizes. */\n useIsomorphicLayoutEffect(() => {\n const region = scrollRef.current;\n if (!region || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(updateEdges);\n observer.observe(region);\n return () => observer.disconnect();\n }, [updateEdges]);\n\n const handleScroll = useCallback(() => {\n updateEdges();\n const region = scrollRef.current;\n if (!region) return;\n const { scrollTop, scrollHeight, clientHeight } = region;\n if (\n onLoadEarlier &&\n moreEarlier &&\n !loadingEarlier &&\n scrollTop <= EDGE_LOAD_THRESHOLD\n ) {\n onLoadEarlier();\n }\n if (\n onLoadLater &&\n moreLater &&\n !loadingLater &&\n scrollHeight - scrollTop - clientHeight <= EDGE_LOAD_THRESHOLD\n ) {\n onLoadLater();\n }\n }, [\n updateEdges,\n onLoadEarlier,\n onLoadLater,\n moreEarlier,\n moreLater,\n loadingEarlier,\n loadingLater,\n ]);\n\n /* ----- Filter actions ----- */\n const jumpTo = useCallback(\n (date: Date) => {\n const key = localDayKey(date);\n const known = dayElRefs.current.has(key);\n scrollToKey(key, true);\n if (!known) onJumpToDate?.(date.toISOString());\n },\n [scrollToKey, onJumpToDate],\n );\n\n const handleToday = useCallback(() => jumpTo(now), [jumpTo, now]);\n const handleThisWeek = useCallback(() => {\n const start = new Date(now);\n const dow = (start.getDay() + 6) % 7; // Monday-based week start\n start.setDate(start.getDate() - dow);\n jumpTo(start);\n }, [jumpTo, now]);\n const handleThisMonth = useCallback(() => {\n jumpTo(new Date(now.getFullYear(), now.getMonth(), 1));\n }, [jumpTo, now]);\n\n /* ----- Agent handle ----- */\n const itemsRef = useRef<AppointmentItem[]>(items);\n itemsRef.current = items;\n const innerRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => innerRef.current as HTMLElement, []);\n\n const handle = useMemo<AppointmentTimelineHandle>(\n () => ({\n getItems: () =>\n itemsRef.current.map((i) => ({ id: i.id, state: i.state })),\n selectItem: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onOpenAppointment?.(found);\n },\n jumpToToday: () => scrollToKey(localDayKey(now), true),\n }),\n [onOpenAppointment, scrollToKey, now],\n );\n useAgentRegistration(appointmentTimelineAgent, handle, id);\n\n const isEmpty = groups.length === 0 && !loadingEarlier && !loadingLater;\n\n const loadingRow = (key: string) => (\n <div\n key={key}\n aria-hidden=\"true\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)] ds:py-[var(--spacing-xs)]\"\n >\n <Skeleton variant=\"rectangular\" height=\"3.5rem\" />\n </div>\n );\n\n return (\n <section\n ref={innerRef}\n data-component=\"appointment-timeline\"\n data-component-id={id}\n aria-label={ariaLabel ?? heading}\n className={rootVariants({ size, className })}\n {...rest}\n >\n {/* Shared rail header: title + (optional) filter row + divider. This\n panel owns its own scroll/fill, so the header stays a fixed band\n (sticky={false}). The rail injects the favourite/close cluster via\n PanelHeaderActionsProvider; standalone it renders none. */}\n <PanelHeader\n icon={<CalendarDays />}\n title={heading}\n filters={\n showFilters ? (\n <>\n <ButtonGroup label={t('appointmentTimeline.filtersLabel')}>\n <Button intent=\"outline\" size=\"sm\" onClick={handleToday}>\n {t('appointmentTimeline.today')}\n </Button>\n <Button intent=\"outline\" size=\"sm\" onClick={handleThisWeek}>\n {t('appointmentTimeline.thisWeek')}\n </Button>\n <Button intent=\"outline\" size=\"sm\" onClick={handleThisMonth}>\n {t('appointmentTimeline.thisMonth')}\n </Button>\n </ButtonGroup>\n <label htmlFor={jumpId} className=\"ds:sr-only\">\n {t('appointmentTimeline.jumpToDate')}\n </label>\n <DatePicker\n id={jumpId}\n size=\"sm\"\n placeholder={t('appointmentTimeline.jumpToDate')}\n onChange={(date) => {\n if (date) jumpTo(date);\n }}\n />\n </>\n ) : undefined\n }\n />\n\n {isEmpty ? (\n <div className=\"ds:flex-1 ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('appointmentTimeline.empty.title')}\n description={\n emptyDescription ?? t('appointmentTimeline.empty.description')\n }\n />\n </div>\n ) : (\n <div\n ref={scrollRef}\n // The scroll region must be keyboard-focusable so arrow / Home /\n // End can drive it (axe scrollable-region-focusable); jsx-a11y's\n // generic rule doesn't know this element scrolls.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n onScroll={handleScroll}\n data-fade-top={fadeTop ? 'true' : undefined}\n data-fade-bottom={fadeBottom ? 'true' : undefined}\n className={scrollRegionClasses}\n >\n {loadingEarlier ? loadingRow('loading-earlier') : null}\n {/* eslint-disable-next-line jsx-a11y/no-redundant-roles -- role=\"list\" is NOT redundant: WebKit drops implicit list semantics when list-style is none */}\n <ol\n ref={reflowRef}\n role=\"list\"\n className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-md)] ds:p-0\"\n >\n {groups.map((group) => (\n <li\n key={group.key}\n ref={(node) => {\n if (node) dayElRefs.current.set(group.key, node);\n else dayElRefs.current.delete(group.key);\n }}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\"\n >\n <DayHeader\n date={group.date}\n now={now}\n locale={resolvedLocale}\n todayLabel={t('appointmentTimeline.today')}\n tomorrowLabel={t('appointmentTimeline.tomorrow')}\n yesterdayLabel={t('appointmentTimeline.yesterday')}\n />\n {/* eslint-disable-next-line jsx-a11y/no-redundant-roles -- role=\"list\" is NOT redundant: WebKit drops implicit list semantics when list-style is none */}\n <ul\n role=\"list\"\n className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-0\"\n >\n {group.items.map((item) => (\n <AppointmentCard\n key={item.id}\n item={item}\n size={size}\n surface=\"elevated\"\n showPatient={showPatient}\n locale={resolvedLocale}\n currency={currency}\n onActivate={onOpenAppointment}\n selected={item.id === selectedId}\n data-appointment-id={item.id}\n data-reflow-id={item.id}\n className={REFLOW_ROW_CLASS}\n />\n ))}\n </ul>\n </li>\n ))}\n {/* Leaving cards: removed from state but held for the exit\n fade. Rendered without `data-reflow-id` so the reflow hook\n ignores them; faded via `data-leaving`. */}\n {leavingItems.length > 0\n ? leavingItems.map((item) => (\n <AppointmentCard\n key={`leaving-${item.id}`}\n item={item}\n size={size}\n surface=\"elevated\"\n showPatient={showPatient}\n locale={resolvedLocale}\n currency={currency}\n aria-hidden=\"true\"\n data-leaving\n className={[\n 'ds:opacity-0',\n 'ds:transition-opacity',\n 'ds:duration-[var(--animation-duration)]',\n 'ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n ].join(' ')}\n />\n ))\n : null}\n </ol>\n {loadingLater ? loadingRow('loading-later') : null}\n </div>\n )}\n </section>\n );\n },\n);\n\nAppointmentTimeline.displayName = 'AppointmentTimeline';\n\n/* -------------------------------------------------------------------- */\n/* Day header — sticky label per day group */\n/* -------------------------------------------------------------------- */\n\ninterface DayHeaderProps {\n date: Date;\n now: Date;\n locale: string | undefined;\n todayLabel: string;\n tomorrowLabel: string;\n yesterdayLabel: string;\n}\n\nfunction DayHeader({\n date,\n now,\n locale,\n todayLabel,\n tomorrowLabel,\n yesterdayLabel,\n}: DayHeaderProps): ReactNode {\n const key = localDayKey(date);\n const todayKey = localDayKey(now);\n const tomorrow = new Date(now);\n tomorrow.setDate(now.getDate() + 1);\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n\n const isToday = key === todayKey;\n\n let label: string;\n if (isToday) label = todayLabel;\n else if (key === localDayKey(tomorrow)) label = tomorrowLabel;\n else if (key === localDayKey(yesterday)) label = yesterdayLabel;\n else {\n const sameYear = date.getFullYear() === now.getFullYear();\n label = new Intl.DateTimeFormat(locale, {\n weekday: 'short',\n day: 'numeric',\n month: 'short',\n ...(sameYear ? {} : { year: 'numeric' }),\n }).format(date);\n }\n\n // Today's group is marked with the brand colour + a leading dot so the\n // current day reads at a glance. `--primary` clears AA on the card in every\n // theme (violet-500 light, magenta on dark); the dot is decorative.\n return (\n <div\n data-today={isToday ? 'true' : undefined}\n className={[\n 'ds:sticky ds:top-0 ds:z-[1] ds:bg-[color:var(--card)] ds:py-[var(--spacing-2xs)]',\n 'ds:flex ds:items-center ds:gap-[var(--spacing-2xs)] type-eyebrow',\n isToday\n ? 'ds:text-[color:var(--primary)] ds:font-semibold'\n : 'ds:text-[color:var(--muted-foreground)]',\n ].join(' ')}\n >\n {isToday ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:size-1.5 ds:shrink-0 ds:rounded-[var(--radius-full)] ds:bg-[color:var(--primary)]\"\n />\n ) : null}\n {label}\n </div>\n );\n}\n\n/** Re-export of the size variant union for downstream typing. */\nexport type AppointmentTimelineSize = NonNullable<\n VariantProps<typeof rootVariants>['size']\n>;\n"],"names":["appointmentTimelineAgent","handle","args","EDGE_LOAD_THRESHOLD","rootVariants","cva","scrollRegionClasses","localDayKey","d","m","day","groupByDay","items","sorted","a","b","map","item","key","group","AppointmentTimeline","forwardRef","id","nowIso","title","locale","currency","size","showPatient","onOpenAppointment","selectedId","onLoadEarlier","onLoadLater","hasMoreEarlier","hasMoreLater","loadingEarlier","loadingLater","showFilters","onJumpToDate","emptyTitle","emptyDescription","className","ariaLabel","rest","ref","t","i18n","useTranslation","jumpId","useId","prefersReducedMotion","usePrefersReducedMotion","resolvedLocale","heading","now","useMemo","groups","reduceMotion","flatItemIds","g","i","reflowRef","useListReflow","exitTransition","useExitTransition","prevItemsRef","useRef","leavingItems","setLeavingItems","useState","useEffect","prev","currentIds","removed","moreEarlier","moreLater","anchorKey","todayKey","keys","k","scrollRef","dayElRefs","hasAnchored","prevFirstKey","prevScrollHeight","fadeTop","setFadeTop","fadeBottom","setFadeBottom","updateEdges","useCallback","region","scrollTop","scrollHeight","clientHeight","scrollToKey","targetKey","smooth","el","next","delta","useIsomorphicLayoutEffect","firstKey","_a","grew","observer","handleScroll","jumpTo","date","known","handleToday","handleThisWeek","start","dow","handleThisMonth","itemsRef","innerRef","useImperativeHandle","targetId","found","useAgentRegistration","isEmpty","loadingRow","jsx","Skeleton","jsxs","PanelHeader","CalendarDays","Fragment","ButtonGroup","Button","DatePicker","EmptyState","node","DayHeader","AppointmentCard","REFLOW_ROW_CLASS","todayLabel","tomorrowLabel","yesterdayLabel","tomorrow","yesterday","isToday","label","sameYear"],"mappings":"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"}