@alfadocs/ui-kit-debug 1.38.0 → 1.39.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 (491) 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-DvtaM3yg.js} +2 -2
  6. package/dist/_chunks/{ai-consent-banner-De4gzSBZ.js.map → ai-consent-banner-DvtaM3yg.js.map} +1 -1
  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-Dn3jvv3K.js} +5 -5
  32. package/dist/_chunks/{booking-x3J7sS2G.js.map → booking-Dn3jvv3K.js.map} +1 -1
  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-B-fUbm62.js +11372 -0
  40. package/dist/_chunks/calendar-workspace-B-fUbm62.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-CAD1Ytcj.js} +276 -243
  150. package/dist/_chunks/notes-panel-CAD1Ytcj.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-C6fE-uP4.js} +5 -5
  196. package/dist/_chunks/{rich-text-editor-BTXlorm5.js.map → rich-text-editor-C6fE-uP4.js.map} +1 -1
  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/index.js +1 -1
  237. package/dist/components/ai-prompt-input/index.js +1 -1
  238. package/dist/components/anamnesis-card/index.js +1 -1
  239. package/dist/components/appointment-card/appointment-card.d.ts +24 -0
  240. package/dist/components/appointment-card/appointment-card.d.ts.map +1 -1
  241. package/dist/components/appointment-card/index.js +2 -2
  242. package/dist/components/appointment-peek/index.js +1 -1
  243. package/dist/components/appointment-timeline/appointment-timeline.d.ts +15 -1
  244. package/dist/components/appointment-timeline/appointment-timeline.d.ts.map +1 -1
  245. package/dist/components/appointment-timeline/index.js +1 -1
  246. package/dist/components/audio-recorder/index.js +1 -1
  247. package/dist/components/bishop-score/index.js +1 -1
  248. package/dist/components/bmi-calculator/index.js +1 -1
  249. package/dist/components/booking/index.js +1 -1
  250. package/dist/components/button/button.d.ts +1 -1
  251. package/dist/components/button/button.d.ts.map +1 -1
  252. package/dist/components/button/index.js +2 -2
  253. package/dist/components/button-group/index.js +1 -1
  254. package/dist/components/calendar/index.js +1 -1
  255. package/dist/components/care-plan-card/index.js +1 -1
  256. package/dist/components/care-plan-entry-card/index.js +1 -1
  257. package/dist/components/care-plan-header/index.js +1 -1
  258. package/dist/components/carousel/index.js +1 -1
  259. package/dist/components/chart/index.js +1 -1
  260. package/dist/components/chat-input/index.js +1 -1
  261. package/dist/components/chat-message/index.js +1 -1
  262. package/dist/components/connection-status/index.js +1 -1
  263. package/dist/components/contact-profile-card/index.js +1 -1
  264. package/dist/components/control-room-rail/index.js +1 -1
  265. package/dist/components/copy-field/index.js +1 -1
  266. package/dist/components/cycle-calculator/index.js +1 -1
  267. package/dist/components/dashboard-grid/index.js +1 -1
  268. package/dist/components/data-table/index.js +4 -4
  269. package/dist/components/data-table-tabs/index.js +1 -1
  270. package/dist/components/description-list/index.js +1 -1
  271. package/dist/components/document-preview/index.js +1 -1
  272. package/dist/components/document-scanner/index.js +1 -1
  273. package/dist/components/due-date-calculator/index.js +1 -1
  274. package/dist/components/editable-description/index.js +1 -1
  275. package/dist/components/editor-overlay/index.js +1 -1
  276. package/dist/components/empty-state/index.js +1 -1
  277. package/dist/components/entity-summary/index.js +1 -1
  278. package/dist/components/error-boundary/index.js +1 -1
  279. package/dist/components/face-scheme/index.js +1 -1
  280. package/dist/components/fetal-weight/index.js +1 -1
  281. package/dist/components/field-array/index.js +1 -1
  282. package/dist/components/file-manager/index.js +1 -1
  283. package/dist/components/finished-terminal/index.js +1 -1
  284. package/dist/components/fiscal-code-input/index.js +1 -1
  285. package/dist/components/freemium-paywall/index.js +1 -1
  286. package/dist/components/gestational-age-calculator/index.js +1 -1
  287. package/dist/components/hcg-doubling/index.js +1 -1
  288. package/dist/components/header/index.js +1 -1
  289. package/dist/components/header-settings/index.js +1 -1
  290. package/dist/components/hover-card/index.js +1 -1
  291. package/dist/components/icon-button/index.js +1 -1
  292. package/dist/components/icon-button-group/index.js +1 -1
  293. package/dist/components/icon-picker/index.js +1 -1
  294. package/dist/components/image-cropper/index.js +1 -1
  295. package/dist/components/info-tip/index.js +1 -1
  296. package/dist/components/key-value-pair/index.js +1 -1
  297. package/dist/components/locale-picker/index.js +1 -1
  298. package/dist/components/map-view/index.js +1 -1
  299. package/dist/components/message-card/index.js +1 -1
  300. package/dist/components/message-tray/index.js +1 -1
  301. package/dist/components/note-timeline/index.js +1 -1
  302. package/dist/components/note-timeline/note-timeline.d.ts +9 -0
  303. package/dist/components/note-timeline/note-timeline.d.ts.map +1 -1
  304. package/dist/components/notes-panel/index.js +1 -1
  305. package/dist/components/notes-panel/notes-panel.d.ts +5 -4
  306. package/dist/components/notes-panel/notes-panel.d.ts.map +1 -1
  307. package/dist/components/notification-card/index.js +1 -1
  308. package/dist/components/notification-tray/index.js +1 -1
  309. package/dist/components/optical-prescription/index.js +1 -1
  310. package/dist/components/panel-subview/index.js +1 -1
  311. package/dist/components/panel-subview/panel-subview.d.ts.map +1 -1
  312. package/dist/components/patient-details/index.js +1 -1
  313. package/dist/components/patient-search/index.js +1 -1
  314. package/dist/components/patient-summary-card/index.js +1 -1
  315. package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -1
  316. package/dist/components/patient-table/index.js +1 -1
  317. package/dist/components/payment-card/index.js +1 -1
  318. package/dist/components/periodontal-chart/index.js +1 -1
  319. package/dist/components/periodontal-chart-card/index.js +1 -1
  320. package/dist/components/popover/index.js +1 -1
  321. package/dist/components/practice-results/index.js +1 -1
  322. package/dist/components/pregnancy-dating/index.js +1 -1
  323. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  324. package/dist/components/privacy-lock/index.js +1 -1
  325. package/dist/components/product-hub-tray/index.js +1 -1
  326. package/dist/components/public-header/index.js +1 -1
  327. package/dist/components/radiograph-panel/index.js +1 -1
  328. package/dist/components/reviews-panel/index.js +1 -1
  329. package/dist/components/rich-text-editor/index.js +1 -1
  330. package/dist/components/session-countdown/index.js +1 -1
  331. package/dist/components/sheet/index.js +1 -1
  332. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  333. package/dist/components/slot-grid/index.js +1 -1
  334. package/dist/components/streaming-text/index.js +1 -1
  335. package/dist/components/task-tray/index.js +1 -1
  336. package/dist/components/tasks-panel/index.js +1 -1
  337. package/dist/components/theme-toggle/index.js +1 -1
  338. package/dist/components/toast/index.js +1 -1
  339. package/dist/components/token-insert-menu/index.js +1 -1
  340. package/dist/components/tool-rail/index.js +1 -1
  341. package/dist/components/tool-rail/tool-rail.d.ts.map +1 -1
  342. package/dist/components/tooth-scheme/index.js +1 -1
  343. package/dist/components/transaction-chip/index.js +1 -1
  344. package/dist/components/transaction-chip/transaction-chip.d.ts +7 -0
  345. package/dist/components/transaction-chip/transaction-chip.d.ts.map +1 -1
  346. package/dist/components/unit-converter/index.js +1 -1
  347. package/dist/components/warning-stack/index.js +1 -1
  348. package/dist/components/workflow/index.js +1 -1
  349. package/dist/host-compat.css +13 -4
  350. package/dist/i18n/locales/ar.d.ts +235 -183
  351. package/dist/i18n/locales/ar.d.ts.map +1 -1
  352. package/dist/i18n/locales/ar.js +239 -187
  353. package/dist/i18n/locales/ar.js.map +1 -1
  354. package/dist/i18n/locales/de.d.ts +219 -167
  355. package/dist/i18n/locales/de.d.ts.map +1 -1
  356. package/dist/i18n/locales/de.js +223 -171
  357. package/dist/i18n/locales/de.js.map +1 -1
  358. package/dist/i18n/locales/el.d.ts +234 -182
  359. package/dist/i18n/locales/el.d.ts.map +1 -1
  360. package/dist/i18n/locales/el.js +238 -186
  361. package/dist/i18n/locales/el.js.map +1 -1
  362. package/dist/i18n/locales/en.d.ts +52 -0
  363. package/dist/i18n/locales/en.d.ts.map +1 -1
  364. package/dist/i18n/locales/en.js +56 -4
  365. package/dist/i18n/locales/en.js.map +1 -1
  366. package/dist/i18n/locales/es.d.ts +227 -175
  367. package/dist/i18n/locales/es.d.ts.map +1 -1
  368. package/dist/i18n/locales/es.js +231 -179
  369. package/dist/i18n/locales/es.js.map +1 -1
  370. package/dist/i18n/locales/fr.d.ts +221 -169
  371. package/dist/i18n/locales/fr.d.ts.map +1 -1
  372. package/dist/i18n/locales/fr.js +225 -173
  373. package/dist/i18n/locales/fr.js.map +1 -1
  374. package/dist/i18n/locales/hi.d.ts +235 -183
  375. package/dist/i18n/locales/hi.d.ts.map +1 -1
  376. package/dist/i18n/locales/hi.js +243 -187
  377. package/dist/i18n/locales/hi.js.map +1 -1
  378. package/dist/i18n/locales/it.d.ts +179 -127
  379. package/dist/i18n/locales/it.d.ts.map +1 -1
  380. package/dist/i18n/locales/it.js +183 -131
  381. package/dist/i18n/locales/it.js.map +1 -1
  382. package/dist/i18n/locales/ja.d.ts +233 -181
  383. package/dist/i18n/locales/ja.d.ts.map +1 -1
  384. package/dist/i18n/locales/ja.js +237 -185
  385. package/dist/i18n/locales/ja.js.map +1 -1
  386. package/dist/i18n/locales/nl.d.ts +224 -172
  387. package/dist/i18n/locales/nl.d.ts.map +1 -1
  388. package/dist/i18n/locales/nl.js +228 -176
  389. package/dist/i18n/locales/nl.js.map +1 -1
  390. package/dist/i18n/locales/pl.d.ts +229 -177
  391. package/dist/i18n/locales/pl.d.ts.map +1 -1
  392. package/dist/i18n/locales/pl.js +233 -181
  393. package/dist/i18n/locales/pl.js.map +1 -1
  394. package/dist/i18n/locales/pt.d.ts +229 -177
  395. package/dist/i18n/locales/pt.d.ts.map +1 -1
  396. package/dist/i18n/locales/pt.js +233 -181
  397. package/dist/i18n/locales/pt.js.map +1 -1
  398. package/dist/i18n/locales/ro.d.ts +228 -176
  399. package/dist/i18n/locales/ro.d.ts.map +1 -1
  400. package/dist/i18n/locales/ro.js +232 -180
  401. package/dist/i18n/locales/ro.js.map +1 -1
  402. package/dist/i18n/locales/ru.d.ts +234 -182
  403. package/dist/i18n/locales/ru.d.ts.map +1 -1
  404. package/dist/i18n/locales/ru.js +238 -186
  405. package/dist/i18n/locales/ru.js.map +1 -1
  406. package/dist/i18n/locales/sq.d.ts +228 -176
  407. package/dist/i18n/locales/sq.d.ts.map +1 -1
  408. package/dist/i18n/locales/sq.js +232 -180
  409. package/dist/i18n/locales/sq.js.map +1 -1
  410. package/dist/i18n/locales/sv.d.ts +229 -177
  411. package/dist/i18n/locales/sv.d.ts.map +1 -1
  412. package/dist/i18n/locales/sv.js +233 -181
  413. package/dist/i18n/locales/sv.js.map +1 -1
  414. package/dist/i18n/locales/tr.d.ts +235 -183
  415. package/dist/i18n/locales/tr.d.ts.map +1 -1
  416. package/dist/i18n/locales/tr.js +239 -187
  417. package/dist/i18n/locales/tr.js.map +1 -1
  418. package/dist/i18n/locales/zh.d.ts +228 -176
  419. package/dist/i18n/locales/zh.d.ts.map +1 -1
  420. package/dist/i18n/locales/zh.js +232 -180
  421. package/dist/i18n/locales/zh.js.map +1 -1
  422. package/dist/index.js +107 -107
  423. package/dist/locales/ar.json +239 -187
  424. package/dist/locales/de.json +223 -171
  425. package/dist/locales/el.json +238 -186
  426. package/dist/locales/en.json +56 -4
  427. package/dist/locales/es.json +231 -179
  428. package/dist/locales/fr.json +225 -173
  429. package/dist/locales/hi.json +239 -187
  430. package/dist/locales/it.json +183 -131
  431. package/dist/locales/ja.json +237 -185
  432. package/dist/locales/nl.json +228 -176
  433. package/dist/locales/pl.json +233 -181
  434. package/dist/locales/pt.json +233 -181
  435. package/dist/locales/ro.json +232 -180
  436. package/dist/locales/ru.json +238 -186
  437. package/dist/locales/sq.json +232 -180
  438. package/dist/locales/sv.json +233 -181
  439. package/dist/locales/tr.json +239 -187
  440. package/dist/locales/zh.json +232 -180
  441. package/dist/patterns/alia-assistant/index.js +1 -1
  442. package/dist/patterns/anamnesis/index.js +1 -1
  443. package/dist/patterns/calendar/calendar-appointment-details.d.ts +7 -0
  444. package/dist/patterns/calendar/calendar-appointment-details.d.ts.map +1 -1
  445. package/dist/patterns/calendar/calendar-appointment-details.sections.d.ts +10 -5
  446. package/dist/patterns/calendar/calendar-appointment-details.sections.d.ts.map +1 -1
  447. package/dist/patterns/calendar/calendar-bookings-panel.d.ts +31 -0
  448. package/dist/patterns/calendar/calendar-bookings-panel.d.ts.map +1 -0
  449. package/dist/patterns/calendar/calendar-info-hover.d.ts +15 -1
  450. package/dist/patterns/calendar/calendar-info-hover.d.ts.map +1 -1
  451. package/dist/patterns/calendar/calendar-privacy.d.ts +23 -0
  452. package/dist/patterns/calendar/calendar-privacy.d.ts.map +1 -0
  453. package/dist/patterns/calendar/calendar-rail-settle.d.ts +14 -0
  454. package/dist/patterns/calendar/calendar-rail-settle.d.ts.map +1 -0
  455. package/dist/patterns/calendar/calendar-upcoming-panel.d.ts +32 -0
  456. package/dist/patterns/calendar/calendar-upcoming-panel.d.ts.map +1 -0
  457. package/dist/patterns/calendar/calendar-waiting-list-panel.d.ts +62 -0
  458. package/dist/patterns/calendar/calendar-waiting-list-panel.d.ts.map +1 -0
  459. package/dist/patterns/calendar/calendar-workspace.d.ts +14 -1
  460. package/dist/patterns/calendar/calendar-workspace.d.ts.map +1 -1
  461. package/dist/patterns/calendar/calendar-workspace.model.d.ts +37 -1
  462. package/dist/patterns/calendar/calendar-workspace.model.d.ts.map +1 -1
  463. package/dist/patterns/calendar/calendar.model.d.ts +8 -2
  464. package/dist/patterns/calendar/calendar.model.d.ts.map +1 -1
  465. package/dist/patterns/calendar/calendar.sheets.d.ts +43 -27
  466. package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -1
  467. package/dist/patterns/calendar/calendar.surface.d.ts.map +1 -1
  468. package/dist/patterns/calendar/calendar.types.d.ts +6 -0
  469. package/dist/patterns/calendar/calendar.types.d.ts.map +1 -1
  470. package/dist/patterns/calendar/index.d.ts +2 -2
  471. package/dist/patterns/calendar/index.d.ts.map +1 -1
  472. package/dist/patterns/calendar/index.js +1 -1
  473. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  474. package/dist/patterns/payment-automation-upsell/index.js +1 -1
  475. package/dist/patterns/signature-request/index.js +1 -1
  476. package/dist/tokens.css +1 -1
  477. package/package.json +3 -1
  478. package/dist/_chunks/appointment-card-WsDGBBut.js.map +0 -1
  479. package/dist/_chunks/appointment-timeline-D-rNwKpS.js.map +0 -1
  480. package/dist/_chunks/button-nJaPh_HC.js.map +0 -1
  481. package/dist/_chunks/calendar-workspace-Cc1LRVWY.js +0 -9900
  482. package/dist/_chunks/calendar-workspace-Cc1LRVWY.js.map +0 -1
  483. package/dist/_chunks/file-manager-UlcYQv8n.js.map +0 -1
  484. package/dist/_chunks/note-timeline-D2oPuQP6.js.map +0 -1
  485. package/dist/_chunks/notes-panel-CkbfDDzj.js.map +0 -1
  486. package/dist/_chunks/panel-subview-BNXN8OEL.js.map +0 -1
  487. package/dist/_chunks/patient-summary-card-B131Q7Bp.js.map +0 -1
  488. package/dist/_chunks/receipt-euro-C6k4Gzhr.js.map +0 -1
  489. package/dist/_chunks/signature-request-b-86AGlT.js.map +0 -1
  490. package/dist/_chunks/tool-rail-BP8sjxCw.js +0 -667
  491. package/dist/_chunks/tool-rail-BP8sjxCw.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"appointment-peek-5S4O1VQP.js","sources":["../../src/components/appointment-peek/appointment-peek.tsx"],"sourcesContent":["import {\n forwardRef,\n isValidElement,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { Armchair, Clock, EyeOff, Video } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Avatar } from '../avatar';\nimport { DescriptionList } from '../description-list';\nimport { HoverCard } from '../hover-card';\nimport { WorkflowStatusDisplay } from '../workflow-status';\nimport {\n appointmentStateWorkflow,\n type AppointmentState,\n} from '../_shared/entity-card';\n\n/* -------------------------------------------------------------------- */\n/* AppointmentPeek */\n/* */\n/* The body of a calendar hover card: who, when, where, and the status */\n/* in the kit's one status face. Renders inside `HoverCard.Content`; its */\n/* name is a `HoverCard.Heading`, so the card takes its accessible name */\n/* from the patient without the host wiring it. */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-sm)]',\n);\n\nexport interface AppointmentPeekDetail {\n /** Leading glyph, decorative. */\n icon?: ReactNode;\n /** The term, already translated: \"Care\", \"Operator\". */\n label: string;\n value: ReactNode;\n}\n\nexport interface AppointmentPeekProps extends HTMLAttributes<HTMLDivElement> {\n /** Patient name, or the event title for an appointment with no patient. */\n name: string;\n /** Photo for the avatar; initials are drawn from `name` without one. */\n avatarSrc?: string;\n /** Host-formatted time range, e.g. \"09:30–11:00\". */\n time: string;\n /** Chair or room, already translated. With `telehealth`, the visit type. */\n location?: string;\n /** Swaps the chair glyph for a video camera. */\n telehealth?: boolean;\n /**\n * Appointment status, shown through `WorkflowStatusDisplay`. Leave it out\n * when the host has none recorded: no status is not the same as\n * confirmed, so the card shows no status face at all.\n */\n status?: AppointmentState;\n /**\n * Override the status caption, e.g. \"Arrived · waiting 12 min\". Still shown\n * under `privacy`, so keep it free of patient data. Ignored without\n * `status`.\n */\n statusLabel?: string;\n /** Extra rows after time and location: care, operator. */\n details?: AppointmentPeekDetail[];\n /** Indicator chips (Badges): booked online, anamnesis. Never status. */\n flags?: ReactNode;\n /**\n * Masks the name and drops everything personal: avatar, details and\n * flags. Time, place and status stay; they\n * are not patient data.\n */\n privacy?: boolean;\n}\n\nexport const AppointmentPeek = forwardRef<HTMLDivElement, AppointmentPeekProps>(\n (\n {\n name,\n avatarSrc,\n time,\n location,\n telehealth = false,\n status,\n statusLabel,\n details,\n flags,\n privacy = false,\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const workflow = status ? appointmentStateWorkflow(status) : null;\n const StatusIcon = workflow?.Icon;\n\n const LocationIcon = telehealth ? Video : Armchair;\n const showClinical = !privacy;\n\n const rows: {\n icon: ReactElement | null;\n label: string;\n value: ReactNode;\n }[] = [\n { icon: <Clock />, label: t('appointmentPeek.time'), value: time },\n ...(location\n ? [\n {\n icon: <LocationIcon />,\n label: t('appointmentPeek.location'),\n value: location,\n },\n ]\n : []),\n ...(showClinical && details\n ? details.map((detail) => ({\n icon: isValidElement(detail.icon) ? detail.icon : null,\n label: detail.label,\n value: detail.value,\n }))\n : []),\n ];\n\n return (\n <div\n ref={ref}\n data-component=\"appointment-peek\"\n data-status={status}\n className={rootVariants({ className })}\n {...props}\n >\n {/* Avatar, name and the indicator chips together, every fact on its\n own row below, status last: the same identity block as\n PatientDetails. */}\n <div className=\"ds:flex ds:min-w-0 ds:items-start ds:gap-[var(--spacing-sm)]\">\n {privacy ? null : (\n <Avatar\n size=\"sm\"\n name={name}\n src={avatarSrc}\n aria-hidden=\"true\"\n className=\"ds:shrink-0\"\n />\n )}\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <HoverCard.Heading className=\"ds:min-w-0\">\n {privacy ? (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <EyeOff\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0\"\n />\n {t('appointmentPeek.hiddenName')}\n </span>\n ) : (\n name\n )}\n </HoverCard.Heading>\n {showClinical && flags ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {flags}\n </div>\n ) : null}\n </div>\n </div>\n\n <DescriptionList\n layout=\"inline\"\n density=\"compact\"\n divider=\"none\"\n // Label icons in the accent, as in PatientDetails.\n className=\"ds:[--description-list-icon-color:var(--accent)]\"\n >\n {rows.map((row, index) => (\n <DescriptionList.Row key={index} icon={row.icon}>\n <DescriptionList.Term>{row.label}</DescriptionList.Term>\n <DescriptionList.Detail>{row.value}</DescriptionList.Detail>\n </DescriptionList.Row>\n ))}\n </DescriptionList>\n\n {/* The kit's one status face: the same display the details panel,\n AppointmentCard and the history use, so a status never reads\n differently on the grid. Last, so the card reads who, what, then\n where it stands. Nothing at all when none is recorded. */}\n {status && workflow && StatusIcon ? (\n <div data-slot=\"workflow\">\n <WorkflowStatusDisplay\n size=\"sm\"\n value={status}\n option={{\n value: status,\n label: statusLabel ?? t(`appointmentCard.state.${status}`),\n icon: <StatusIcon aria-hidden=\"true\" />,\n tone: workflow.tone,\n }}\n />\n </div>\n ) : null}\n </div>\n );\n },\n);\nAppointmentPeek.displayName = 'AppointmentPeek';\n"],"names":["rootVariants","cva","AppointmentPeek","forwardRef","name","avatarSrc","time","location","telehealth","status","statusLabel","details","flags","privacy","className","props","ref","t","useTranslation","workflow","appointmentStateWorkflow","StatusIcon","LocationIcon","Video","Armchair","showClinical","rows","jsx","Clock","detail","isValidElement","jsxs","Avatar","HoverCard","EyeOff","DescriptionList","row","index","WorkflowStatusDisplay"],"mappings":"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"}
1
+ {"version":3,"file":"appointment-peek-abiR0T9e.js","sources":["../../src/components/appointment-peek/appointment-peek.tsx"],"sourcesContent":["import {\n forwardRef,\n isValidElement,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { Armchair, Clock, EyeOff, Video } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Avatar } from '../avatar';\nimport { DescriptionList } from '../description-list';\nimport { HoverCard } from '../hover-card';\nimport { WorkflowStatusDisplay } from '../workflow-status';\nimport {\n appointmentStateWorkflow,\n type AppointmentState,\n} from '../_shared/entity-card';\n\n/* -------------------------------------------------------------------- */\n/* AppointmentPeek */\n/* */\n/* The body of a calendar hover card: who, when, where, and the status */\n/* in the kit's one status face. Renders inside `HoverCard.Content`; its */\n/* name is a `HoverCard.Heading`, so the card takes its accessible name */\n/* from the patient without the host wiring it. */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-sm)]',\n);\n\nexport interface AppointmentPeekDetail {\n /** Leading glyph, decorative. */\n icon?: ReactNode;\n /** The term, already translated: \"Care\", \"Operator\". */\n label: string;\n value: ReactNode;\n}\n\nexport interface AppointmentPeekProps extends HTMLAttributes<HTMLDivElement> {\n /** Patient name, or the event title for an appointment with no patient. */\n name: string;\n /** Photo for the avatar; initials are drawn from `name` without one. */\n avatarSrc?: string;\n /** Host-formatted time range, e.g. \"09:30–11:00\". */\n time: string;\n /** Chair or room, already translated. With `telehealth`, the visit type. */\n location?: string;\n /** Swaps the chair glyph for a video camera. */\n telehealth?: boolean;\n /**\n * Appointment status, shown through `WorkflowStatusDisplay`. Leave it out\n * when the host has none recorded: no status is not the same as\n * confirmed, so the card shows no status face at all.\n */\n status?: AppointmentState;\n /**\n * Override the status caption, e.g. \"Arrived · waiting 12 min\". Still shown\n * under `privacy`, so keep it free of patient data. Ignored without\n * `status`.\n */\n statusLabel?: string;\n /** Extra rows after time and location: care, operator. */\n details?: AppointmentPeekDetail[];\n /** Indicator chips (Badges): booked online, anamnesis. Never status. */\n flags?: ReactNode;\n /**\n * Masks the name and drops everything personal: avatar, details and\n * flags. Time, place and status stay; they\n * are not patient data.\n */\n privacy?: boolean;\n}\n\nexport const AppointmentPeek = forwardRef<HTMLDivElement, AppointmentPeekProps>(\n (\n {\n name,\n avatarSrc,\n time,\n location,\n telehealth = false,\n status,\n statusLabel,\n details,\n flags,\n privacy = false,\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const workflow = status ? appointmentStateWorkflow(status) : null;\n const StatusIcon = workflow?.Icon;\n\n const LocationIcon = telehealth ? Video : Armchair;\n const showClinical = !privacy;\n\n const rows: {\n icon: ReactElement | null;\n label: string;\n value: ReactNode;\n }[] = [\n { icon: <Clock />, label: t('appointmentPeek.time'), value: time },\n ...(location\n ? [\n {\n icon: <LocationIcon />,\n label: t('appointmentPeek.location'),\n value: location,\n },\n ]\n : []),\n ...(showClinical && details\n ? details.map((detail) => ({\n icon: isValidElement(detail.icon) ? detail.icon : null,\n label: detail.label,\n value: detail.value,\n }))\n : []),\n ];\n\n return (\n <div\n ref={ref}\n data-component=\"appointment-peek\"\n data-status={status}\n className={rootVariants({ className })}\n {...props}\n >\n {/* Avatar, name and the indicator chips together, every fact on its\n own row below, status last: the same identity block as\n PatientDetails. */}\n <div className=\"ds:flex ds:min-w-0 ds:items-start ds:gap-[var(--spacing-sm)]\">\n {privacy ? null : (\n <Avatar\n size=\"sm\"\n name={name}\n src={avatarSrc}\n aria-hidden=\"true\"\n className=\"ds:shrink-0\"\n />\n )}\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <HoverCard.Heading className=\"ds:min-w-0\">\n {privacy ? (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <EyeOff\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0\"\n />\n {t('appointmentPeek.hiddenName')}\n </span>\n ) : (\n name\n )}\n </HoverCard.Heading>\n {showClinical && flags ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {flags}\n </div>\n ) : null}\n </div>\n </div>\n\n <DescriptionList\n layout=\"inline\"\n density=\"compact\"\n divider=\"none\"\n // Label icons in the accent, as in PatientDetails.\n className=\"ds:[--description-list-icon-color:var(--accent)]\"\n >\n {rows.map((row, index) => (\n <DescriptionList.Row key={index} icon={row.icon}>\n <DescriptionList.Term>{row.label}</DescriptionList.Term>\n <DescriptionList.Detail>{row.value}</DescriptionList.Detail>\n </DescriptionList.Row>\n ))}\n </DescriptionList>\n\n {/* The kit's one status face: the same display the details panel,\n AppointmentCard and the history use, so a status never reads\n differently on the grid. Last, so the card reads who, what, then\n where it stands. Nothing at all when none is recorded. */}\n {status && workflow && StatusIcon ? (\n <div data-slot=\"workflow\">\n <WorkflowStatusDisplay\n size=\"sm\"\n value={status}\n option={{\n value: status,\n label: statusLabel ?? t(`appointmentCard.state.${status}`),\n icon: <StatusIcon aria-hidden=\"true\" />,\n tone: workflow.tone,\n }}\n />\n </div>\n ) : null}\n </div>\n );\n },\n);\nAppointmentPeek.displayName = 'AppointmentPeek';\n"],"names":["rootVariants","cva","AppointmentPeek","forwardRef","name","avatarSrc","time","location","telehealth","status","statusLabel","details","flags","privacy","className","props","ref","t","useTranslation","workflow","appointmentStateWorkflow","StatusIcon","LocationIcon","Video","Armchair","showClinical","rows","jsx","Clock","detail","isValidElement","jsxs","Avatar","HoverCard","EyeOff","DescriptionList","row","index","WorkflowStatusDisplay"],"mappings":"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"}
@@ -1,20 +1,20 @@
1
- import { jsxs as x, jsx as o, Fragment as je } from "react/jsx-runtime";
2
- import { forwardRef as Ce, useId as He, useMemo as j, useRef as v, useState as $, useEffect as Me, useCallback as b, useImperativeHandle as Ne } from "react";
3
- import { c as _e } from "./index-D2ZczOXr.js";
4
- import { useTranslation as Fe } from "react-i18next";
5
- import { A as ne } from "./appointment-card-WsDGBBut.js";
6
- import { B as P } from "./button-nJaPh_HC.js";
7
- import { B as ze } from "./button-group-QmN1VdUW.js";
8
- import { D as Ae } from "./date-picker-6tFnKFty.js";
9
- import { P as Be } from "./panel-header-D_mTdhUp.js";
10
- import { S as Ke } from "./skeleton-B1KTdJ4N.js";
11
- import { E as Ee } from "./empty-state-X0sVPfVo.js";
1
+ import { jsxs as x, jsx as o, Fragment as He } from "react/jsx-runtime";
2
+ import { forwardRef as Me, useId as Ne, useMemo as j, useRef as v, useState as $, useEffect as _e, useCallback as b, useImperativeHandle as Fe } from "react";
3
+ import { c as ze } from "./index-D2ZczOXr.js";
4
+ import { useTranslation as Ae } from "react-i18next";
5
+ import { A as ne } from "./appointment-card-TgR_2GKS.js";
6
+ import { B as P } from "./button-CaUe1uyd.js";
7
+ import { B as Be } from "./button-group-R32U7SyV.js";
8
+ import { D as Ke } from "./date-picker-6tFnKFty.js";
9
+ import { P as Ee } from "./panel-header-D_mTdhUp.js";
10
+ import { S as Ye } from "./skeleton-B1KTdJ4N.js";
11
+ import { E as $e } from "./empty-state-BUN_UAWf.js";
12
12
  import { u as ae } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
13
- import { u as Ye } from "./use-prefers-reduced-motion-BMwIQRjB.js";
14
- import { a as $e, u as Pe, R as We } from "./use-list-reflow-Cw43nxw5.js";
15
- import { u as qe } from "./registry-DvAUVLHh.js";
16
- import { C as Ge } from "./calendar-days-BGWklvE-.js";
17
- const Ve = {
13
+ import { u as Pe } from "./use-prefers-reduced-motion-BMwIQRjB.js";
14
+ import { a as We, u as qe, R as Ge } from "./use-list-reflow-Cw43nxw5.js";
15
+ import { u as Ve } from "./registry-DvAUVLHh.js";
16
+ import { C as Le } from "./calendar-days-BGWklvE-.js";
17
+ const Oe = {
18
18
  id: "appointment-timeline",
19
19
  // 'pick' backs select_item (non-persisting activation through
20
20
  // onOpenAppointment); 'scroll' backs jump_to_today, which re-anchors the
@@ -70,13 +70,13 @@ const Ve = {
70
70
  description: "Stable appointment id emitted on each rendered AppointmentCard inside the timeline."
71
71
  }
72
72
  }
73
- }, ie = 96, Le = _e(
73
+ }, ie = 96, Qe = ze(
74
74
  [
75
75
  "ds:flex ds:flex-col ds:h-full ds:min-h-0",
76
76
  "ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]"
77
77
  ].join(" "),
78
78
  { variants: { size: { sm: "", md: "" } }, defaultVariants: { size: "sm" } }
79
- ), Oe = [
79
+ ), Ue = [
80
80
  "ds:flex-1 ds:min-h-0 ds:overflow-y-auto",
81
81
  "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]",
82
82
  "ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]",
@@ -95,7 +95,7 @@ function k(i) {
95
95
  const n = `${i.getMonth() + 1}`.padStart(2, "0"), d = `${i.getDate()}`.padStart(2, "0");
96
96
  return `${i.getFullYear()}-${n}-${d}`;
97
97
  }
98
- function Qe(i) {
98
+ function Xe(i) {
99
99
  const n = [...i].sort(
100
100
  (g, m) => +new Date(g.startIso) - +new Date(m.startIso)
101
101
  ), d = /* @__PURE__ */ new Map();
@@ -110,7 +110,7 @@ function Qe(i) {
110
110
  }
111
111
  return [...d.values()];
112
112
  }
113
- const Ue = Ce(
113
+ const Ze = Me(
114
114
  ({
115
115
  id: i,
116
116
  items: n,
@@ -134,19 +134,21 @@ const Ue = Ce(
134
134
  emptyDescription: ce,
135
135
  className: de,
136
136
  "aria-label": me,
137
- ...pe
138
- }, ue) => {
139
- const { t: l, i18n: fe } = Fe(), W = He(), z = Ye(), A = m ?? fe.language, q = g ?? l("appointmentTimeline.title"), c = j(
137
+ headerExtra: pe,
138
+ hideDefaultStatus: ue = !1,
139
+ ...fe
140
+ }, ge) => {
141
+ const { t: l, i18n: he } = Ae(), W = Ne(), z = Pe(), A = m ?? he.language, q = g ?? l("appointmentTimeline.title"), c = j(
140
142
  () => d ? new Date(d) : /* @__PURE__ */ new Date(),
141
143
  [d]
142
- ), u = j(() => Qe(n), [n]), G = z || void 0, ge = j(
144
+ ), u = j(() => Xe(n), [n]), G = z || void 0, ye = j(
143
145
  () => u.flatMap((e) => e.items.map((t) => t.id)).join(),
144
146
  [u]
145
- ), { containerRef: he } = $e({
146
- key: ge,
147
+ ), { containerRef: ve } = We({
148
+ key: ye,
147
149
  reduceMotion: G
148
- }), V = Pe({ reduceMotion: G }), L = v(n), [O, Q] = $([]);
149
- Me(() => {
150
+ }), V = qe({ reduceMotion: G }), L = v(n), [O, Q] = $([]);
151
+ _e(() => {
150
152
  const e = L.current;
151
153
  if (e === n) return;
152
154
  const t = new Set(n.map((a) => a.id)), s = e.filter((a) => !t.has(a.id));
@@ -160,18 +162,18 @@ const Ue = Ce(
160
162
  if (u.length === 0) return;
161
163
  const e = k(c), t = u.map((s) => s.key);
162
164
  return t.includes(e) ? e : t.find((s) => s >= e) ?? t[t.length - 1];
163
- }, [u, c]), D = v(null), w = v(/* @__PURE__ */ new Map()), Z = v(!1), K = v(void 0), J = v(0), [ye, ve] = $(!1), [ke, Te] = $(!1), R = b(() => {
165
+ }, [u, c]), D = v(null), w = v(/* @__PURE__ */ new Map()), Z = v(!1), K = v(void 0), J = v(0), [ke, Te] = $(!1), [be, xe] = $(!1), R = b(() => {
164
166
  const e = D.current;
165
167
  if (!e) return;
166
168
  const { scrollTop: t, scrollHeight: s, clientHeight: a } = e;
167
- ve(t > 1), Te(t + a < s - 1);
169
+ Te(t > 1), xe(t + a < s - 1);
168
170
  }, []), I = b(
169
171
  (e, t) => {
170
172
  const s = D.current;
171
173
  if (!s) return;
172
174
  let a = w.current.get(e);
173
175
  if (!a) {
174
- const S = [...w.current.keys()].sort(), se = S.find((Se) => Se >= e) ?? S[S.length - 1];
176
+ const S = [...w.current.keys()].sort(), se = S.find((Ce) => Ce >= e) ?? S[S.length - 1];
175
177
  a = se ? w.current.get(se) : void 0;
176
178
  }
177
179
  if (!a) return;
@@ -201,7 +203,7 @@ const Ue = Ce(
201
203
  const t = new ResizeObserver(R);
202
204
  return t.observe(e), () => t.disconnect();
203
205
  }, [R]);
204
- const be = b(() => {
206
+ const De = b(() => {
205
207
  R();
206
208
  const e = D.current;
207
209
  if (!e) return;
@@ -221,16 +223,16 @@ const Ue = Ce(
221
223
  I(t, !0), s || _ == null || _(e.toISOString());
222
224
  },
223
225
  [I, _]
224
- ), xe = b(() => T(c), [T, c]), De = b(() => {
226
+ ), we = b(() => T(c), [T, c]), Re = b(() => {
225
227
  const e = new Date(c), t = (e.getDay() + 6) % 7;
226
228
  e.setDate(e.getDate() - t), T(e);
227
- }, [T, c]), we = b(() => {
229
+ }, [T, c]), Ie = b(() => {
228
230
  T(new Date(c.getFullYear(), c.getMonth(), 1));
229
231
  }, [T, c]), E = v(n);
230
232
  E.current = n;
231
233
  const ee = v(null);
232
- Ne(ue, () => ee.current, []);
233
- const Re = j(
234
+ Fe(ge, () => ee.current, []);
235
+ const Se = j(
234
236
  () => ({
235
237
  getItems: () => E.current.map((e) => ({ id: e.id, state: e.state })),
236
238
  selectItem: (e) => {
@@ -241,13 +243,13 @@ const Ue = Ce(
241
243
  }),
242
244
  [y, I, c]
243
245
  );
244
- qe(Ve, Re, i);
245
- const Ie = u.length === 0 && !M && !N, te = (e) => /* @__PURE__ */ o(
246
+ Ve(Oe, Se, i);
247
+ const je = u.length === 0 && !M && !N, te = (e) => /* @__PURE__ */ o(
246
248
  "div",
247
249
  {
248
250
  "aria-hidden": "true",
249
251
  className: "ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)] ds:py-[var(--spacing-xs)]",
250
- children: /* @__PURE__ */ o(Ke, { variant: "rectangular", height: "3.5rem" })
252
+ children: /* @__PURE__ */ o(Ye, { variant: "rectangular", height: "3.5rem" })
251
253
  },
252
254
  e
253
255
  );
@@ -258,23 +260,23 @@ const Ue = Ce(
258
260
  "data-component": "appointment-timeline",
259
261
  "data-component-id": i,
260
262
  "aria-label": me ?? q,
261
- className: Le({ size: r, className: de }),
262
- ...pe,
263
+ className: Qe({ size: r, className: de }),
264
+ ...fe,
263
265
  children: [
264
266
  /* @__PURE__ */ o(
265
- Be,
267
+ Ee,
266
268
  {
267
- icon: /* @__PURE__ */ o(Ge, {}),
269
+ icon: /* @__PURE__ */ o(Le, {}),
268
270
  title: q,
269
- filters: re ? /* @__PURE__ */ x(je, { children: [
270
- /* @__PURE__ */ x(ze, { label: l("appointmentTimeline.filtersLabel"), children: [
271
- /* @__PURE__ */ o(P, { intent: "outline", size: "sm", onClick: xe, children: l("appointmentTimeline.today") }),
272
- /* @__PURE__ */ o(P, { intent: "outline", size: "sm", onClick: De, children: l("appointmentTimeline.thisWeek") }),
273
- /* @__PURE__ */ o(P, { intent: "outline", size: "sm", onClick: we, children: l("appointmentTimeline.thisMonth") })
271
+ filters: re ? /* @__PURE__ */ x(He, { children: [
272
+ /* @__PURE__ */ x(Be, { label: l("appointmentTimeline.filtersLabel"), children: [
273
+ /* @__PURE__ */ o(P, { intent: "outline", size: "sm", onClick: we, children: l("appointmentTimeline.today") }),
274
+ /* @__PURE__ */ o(P, { intent: "outline", size: "sm", onClick: Re, children: l("appointmentTimeline.thisWeek") }),
275
+ /* @__PURE__ */ o(P, { intent: "outline", size: "sm", onClick: Ie, children: l("appointmentTimeline.thisMonth") })
274
276
  ] }),
275
277
  /* @__PURE__ */ o("label", { htmlFor: W, className: "ds:sr-only", children: l("appointmentTimeline.jumpToDate") }),
276
278
  /* @__PURE__ */ o(
277
- Ae,
279
+ Ke,
278
280
  {
279
281
  id: W,
280
282
  size: "sm",
@@ -287,8 +289,9 @@ const Ue = Ce(
287
289
  ] }) : void 0
288
290
  }
289
291
  ),
290
- Ie ? /* @__PURE__ */ o("div", { className: "ds:flex-1 ds:p-[var(--spacing-md)]", children: /* @__PURE__ */ o(
291
- Ee,
292
+ pe,
293
+ je ? /* @__PURE__ */ o("div", { className: "ds:flex-1 ds:p-[var(--spacing-md)]", children: /* @__PURE__ */ o(
294
+ $e,
292
295
  {
293
296
  variant: "first-use",
294
297
  size: "sm",
@@ -300,16 +303,16 @@ const Ue = Ce(
300
303
  {
301
304
  ref: D,
302
305
  tabIndex: 0,
303
- onScroll: be,
304
- "data-fade-top": ye ? "true" : void 0,
305
- "data-fade-bottom": ke ? "true" : void 0,
306
- className: Oe,
306
+ onScroll: De,
307
+ "data-fade-top": ke ? "true" : void 0,
308
+ "data-fade-bottom": be ? "true" : void 0,
309
+ className: Ue,
307
310
  children: [
308
311
  M ? te("loading-earlier") : null,
309
312
  /* @__PURE__ */ x(
310
313
  "ol",
311
314
  {
312
- ref: he,
315
+ ref: ve,
313
316
  role: "list",
314
317
  className: "ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-md)] ds:p-0",
315
318
  children: [
@@ -322,7 +325,7 @@ const Ue = Ce(
322
325
  className: "ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]",
323
326
  children: [
324
327
  /* @__PURE__ */ o(
325
- Xe,
328
+ Je,
326
329
  {
327
330
  date: e.date,
328
331
  now: c,
@@ -348,9 +351,10 @@ const Ue = Ce(
348
351
  currency: h,
349
352
  onActivate: y,
350
353
  selected: t.id === H,
354
+ hideDefaultStatus: ue,
351
355
  "data-appointment-id": t.id,
352
356
  "data-reflow-id": t.id,
353
- className: We
357
+ className: Ge
354
358
  },
355
359
  t.id
356
360
  ))
@@ -393,8 +397,8 @@ const Ue = Ce(
393
397
  );
394
398
  }
395
399
  );
396
- Ue.displayName = "AppointmentTimeline";
397
- function Xe({
400
+ Ze.displayName = "AppointmentTimeline";
401
+ function Je({
398
402
  date: i,
399
403
  now: n,
400
404
  locale: d,
@@ -443,7 +447,7 @@ function Xe({
443
447
  );
444
448
  }
445
449
  export {
446
- Ue as A,
447
- Ve as a
450
+ Ze as A,
451
+ Oe as a
448
452
  };
449
- //# sourceMappingURL=appointment-timeline-D-rNwKpS.js.map
453
+ //# sourceMappingURL=appointment-timeline-CCnyUYKz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appointment-timeline-CCnyUYKz.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 * Content rendered between the header/filter row and the scroll region —\n * a summary strip, a \"happening now\" band, anything the host needs\n * ahead of the day-grouped list. Omitted by default (no change to\n * today's layout). Not part of the scroll region: it stays fixed like\n * the header above it.\n */\n headerExtra?: ReactNode;\n /**\n * Forwarded to every row's `AppointmentCard`: withhold the lifecycle\n * badge for the default/expected state (`confirmed`). Default `false`\n * (today's behaviour — every state shows its badge).\n */\n hideDefaultStatus?: boolean;\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 headerExtra,\n hideDefaultStatus = false,\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 {headerExtra}\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 hideDefaultStatus={hideDefaultStatus}\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","headerExtra","hideDefaultStatus","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":";;;;;;;;;;;;;;;;AAaO,MAAMA,KACX;AAAA,EACE,IAAI;AAAA;AAAA;AAAA;AAAA,EAIJ,cAAc,CAAC,UAAU,MAAM;AAAA,EAC/B,OAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aACE;AAAA,MACF,MAAM,CAACC,MAAWA,EAAO,SAAA;AAAA,IAAS;AAAA,EACpC;AAAA,EAEF,SAAS;AAAA,IACP,aAAa;AAAA,MACX,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY,EAAE,IAAI,EAAE,MAAM,WAAS;AAAA,QACnC,UAAU,CAAC,IAAI;AAAA,MAAA;AAAA,MAEjB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACA,GAAQC,MAAyB;AACxC,QAAAD,EAAO,WAAWC,EAAK,EAAE;AAAA,MAC3B;AAAA,IAAA;AAAA,IAEF,eAAe;AAAA,MACb,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACD,MAAW;AAClB,QAAAA,EAAO,YAAA;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IAAA;AAAA,IAEf,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aACE;AAAA,IAAA;AAAA,IAEJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aACE;AAAA,IAAA;AAAA,EACJ;AAEJ,GCzBIE,KAAsB,IAuGtBC,KAAeC;AAAA,EACnB;AAAA,IACE;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI,GAAA,KAAQ,iBAAiB,EAAE,MAAM,OAAK;AAC1E,GAMMC,KAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;AAaV,SAASC,EAAYC,GAAiB;AACpC,QAAMC,IAAI,GAAGD,EAAE,SAAA,IAAa,CAAC,GAAG,SAAS,GAAG,GAAG,GACzCE,IAAM,GAAGF,EAAE,QAAA,CAAS,GAAG,SAAS,GAAG,GAAG;AAC5C,SAAO,GAAGA,EAAE,YAAA,CAAa,IAAIC,CAAC,IAAIC,CAAG;AACvC;AAEA,SAASC,GAAWC,GAAsC;AACxD,QAAMC,IAAS,CAAC,GAAGD,CAAK,EAAE;AAAA,IACxB,CAACE,GAAGC,MAAM,CAAC,IAAI,KAAKD,EAAE,QAAQ,IAAI,CAAC,IAAI,KAAKC,EAAE,QAAQ;AAAA,EAAA,GAElDC,wBAAU,IAAA;AAChB,aAAWC,KAAQJ,GAAQ;AACzB,UAAML,IAAI,IAAI,KAAKS,EAAK,QAAQ,GAC1BC,IAAMX,EAAYC,CAAC;AACzB,QAAIW,IAAQH,EAAI,IAAIE,CAAG;AACvB,IAAKC,MACHA,IAAQ;AAAA,MACN,KAAAD;AAAA,MACA,MAAM,IAAI,KAAKV,EAAE,YAAA,GAAeA,EAAE,SAAA,GAAYA,EAAE,SAAS;AAAA,MACzD,OAAO,CAAA;AAAA,IAAC,GAEVQ,EAAI,IAAIE,GAAKC,CAAK,IAEpBA,EAAM,MAAM,KAAKF,CAAI;AAAA,EACvB;AACA,SAAO,CAAC,GAAGD,EAAI,QAAQ;AACzB;AAMO,MAAMI,KAAsBC;AAAA,EAIjC,CACE;AAAA,IACE,IAAAC;AAAA,IACA,OAAAV;AAAA,IACA,QAAAW;AAAA,IACA,OAAAC;AAAA,IACA,QAAAC;AAAA,IACA,UAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,aAAAC,IAAc;AAAA,IACd,mBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,eAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,gBAAAC,IAAiB;AAAA,IACjB,cAAAC,IAAe;AAAA,IACf,aAAAC,KAAc;AAAA,IACd,cAAAC;AAAA,IACA,YAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,WAAAC;AAAA,IACA,cAAcC;AAAA,IACd,aAAAC;AAAA,IACA,mBAAAC,KAAoB;AAAA,IACpB,GAAGC;AAAA,EAAA,GAELC,OACG;AACH,UAAM,EAAE,GAAAC,GAAG,MAAAC,GAAA,IAASC,GAAA,GACdC,IAASC,GAAA,GACTC,IAAuBC,GAAA,GACvBC,IAAiB7B,KAAUuB,GAAK,UAEhCO,IAAU/B,KAASuB,EAAE,2BAA2B,GAChDS,IAAMC;AAAA,MACV,MAAOlC,IAAS,IAAI,KAAKA,CAAM,wBAAQ,KAAA;AAAA,MACvC,CAACA,CAAM;AAAA,IAAA,GAGHmC,IAASD,EAAQ,MAAM9C,GAAWC,CAAK,GAAG,CAACA,CAAK,CAAC,GAMjD+C,IAAeP,KAAwB,QACvCQ,KAAcH;AAAA,MAClB,MAAMC,EAAO,QAAQ,CAACG,MAAMA,EAAE,MAAM,IAAI,CAACC,MAAMA,EAAE,EAAE,CAAC,EAAE,KAAA;AAAA,MACtD,CAACJ,CAAM;AAAA,IAAA,GAEH,EAAE,cAAcK,GAAA,IAAcC,GAAgC;AAAA,MAClE,KAAKJ;AAAA,MACL,cAAAD;AAAA,IAAA,CACD,GACKM,IAAiBC,GAAkB,EAAE,cAAAP,GAAc,GAMnDQ,IAAeC,EAAOxD,CAAK,GAC3B,CAACyD,GAAcC,CAAe,IAAIC,EAA4B,CAAA,CAAE;AACtE,IAAAC,GAAU,MAAM;AACd,YAAMC,IAAON,EAAa;AAC1B,UAAIM,MAAS7D,EAAO;AACpB,YAAM8D,IAAa,IAAI,IAAI9D,EAAM,IAAI,CAACkD,MAAMA,EAAE,EAAE,CAAC,GAC3Ca,IAAUF,EAAK,OAAO,CAACX,MAAM,CAACY,EAAW,IAAIZ,EAAE,EAAE,CAAC;AACxD,MAAIa,EAAQ,SAAS,MACnBL,EAAgB,CAACG,MAAS,CAAC,GAAGA,GAAM,GAAGE,CAAO,CAAC,GAC/CA,EAAQ,QAAQ,CAAC1D,MAAS;AACxB,QAAAgD,EAAe,MAAMhD,EAAK,IAAI,MAAM;AAClC,UAAAqD,EAAgB,CAACG,MAASA,EAAK,OAAO,CAACX,MAAMA,EAAE,OAAO7C,EAAK,EAAE,CAAC;AAAA,QAChE,CAAC;AAAA,MACH,CAAC,IAEHkD,EAAa,UAAUvD;AAAA,IACzB,GAAG,CAACA,GAAOqD,CAAc,CAAC;AAE1B,UAAMW,IAAc3C,KAAkB,CAAC,CAACF,GAClC8C,IAAY3C,MAAgB,CAAC,CAACF,GAI9B8C,IAAYrB,EAAQ,MAAM;AAC9B,UAAIC,EAAO,WAAW,EAAG;AACzB,YAAMqB,IAAWxE,EAAYiD,CAAG,GAC1BwB,IAAOtB,EAAO,IAAI,CAACG,MAAMA,EAAE,GAAG;AACpC,aAAImB,EAAK,SAASD,CAAQ,IAAUA,IAC7BC,EAAK,KAAK,CAACC,MAAMA,KAAKF,CAAQ,KAAKC,EAAKA,EAAK,SAAS,CAAC;AAAA,IAChE,GAAG,CAACtB,GAAQF,CAAG,CAAC,GAEV0B,IAAYd,EAAuB,IAAI,GACvCe,IAAYf,EAAiC,oBAAI,KAAK,GACtDgB,IAAchB,EAAO,EAAK,GAC1BiB,IAAejB,EAA2B,MAAS,GACnDkB,IAAmBlB,EAAO,CAAC,GAE3B,CAACmB,IAASC,EAAU,IAAIjB,EAAS,EAAK,GACtC,CAACkB,IAAYC,EAAa,IAAInB,EAAS,EAAK,GAE5CoB,IAAcC,EAAY,MAAM;AACpC,YAAMC,IAASX,EAAU;AACzB,UAAI,CAACW,EAAQ;AACb,YAAM,EAAE,WAAAC,GAAW,cAAAC,GAAc,cAAAC,EAAA,IAAiBH;AAClD,MAAAL,GAAWM,IAAY,CAAC,GACxBJ,GAAcI,IAAYE,IAAeD,IAAe,CAAC;AAAA,IAC3D,GAAG,CAAA,CAAE,GAKCE,IAAcL;AAAA,MAClB,CAACM,GAAmBC,MAAoB;AACtC,cAAMN,IAASX,EAAU;AACzB,YAAI,CAACW,EAAQ;AACb,YAAIO,IAAKjB,EAAU,QAAQ,IAAIe,CAAS;AACxC,YAAI,CAACE,GAAI;AACP,gBAAMpB,IAAO,CAAC,GAAGG,EAAU,QAAQ,KAAA,CAAM,EAAE,KAAA,GACrCkB,KACJrB,EAAK,KAAK,CAACC,OAAMA,MAAKiB,CAAS,KAAKlB,EAAKA,EAAK,SAAS,CAAC;AAC1D,UAAAoB,IAAKC,KAAOlB,EAAU,QAAQ,IAAIkB,EAAI,IAAI;AAAA,QAC5C;AACA,YAAI,CAACD,EAAI;AACT,cAAME,IACJF,EAAG,sBAAA,EAAwB,MAAMP,EAAO,wBAAwB;AAClE,QAAAA,EAAO,SAAS;AAAA,UACd,KAAKA,EAAO,YAAYS;AAAA,UACxB,UAAUH,KAAU,CAAC/C,IAAuB,WAAW;AAAA,QAAA,CACxD;AAAA,MACH;AAAA,MACA,CAACA,CAAoB;AAAA,IAAA;AAIvB,IAAAmD,GAA0B,MAAM;;AAC9B,YAAMV,IAASX,EAAU;AACzB,UAAI,CAACW,EAAQ;AACb,YAAMW,KAAWC,IAAA/C,EAAO,CAAC,MAAR,gBAAA+C,EAAW;AAC5B,UAAI,CAACrB,EAAY;AACf,QAAI1B,EAAO,SAAS,KAAKoB,MACvBmB,EAAYnB,GAAW,EAAK,GAC5BM,EAAY,UAAU;AAAA,eAGxBC,EAAa,WACbmB,KACAA,IAAWnB,EAAa,SACxB;AACA,cAAMqB,IAAOb,EAAO,eAAeP,EAAiB;AACpD,QAAIoB,IAAO,MAAGb,EAAO,aAAaa;AAAA,MACpC;AACA,MAAArB,EAAa,UAAUmB,GACvBlB,EAAiB,UAAUO,EAAO,cAClCF,EAAA;AAAA,IACF,GAAG,CAACjC,GAAQoB,GAAWmB,GAAaN,CAAW,CAAC,GAGhDY,GAA0B,MAAM;AAC9B,YAAMV,IAASX,EAAU;AACzB,UAAI,CAACW,KAAU,OAAO,iBAAmB,IAAa;AACtD,YAAMc,IAAW,IAAI,eAAehB,CAAW;AAC/C,aAAAgB,EAAS,QAAQd,CAAM,GAChB,MAAMc,EAAS,WAAA;AAAA,IACxB,GAAG,CAAChB,CAAW,CAAC;AAEhB,UAAMiB,KAAehB,EAAY,MAAM;AACrC,MAAAD,EAAA;AACA,YAAME,IAASX,EAAU;AACzB,UAAI,CAACW,EAAQ;AACb,YAAM,EAAE,WAAAC,GAAW,cAAAC,GAAc,cAAAC,EAAA,IAAiBH;AAClD,MACE9D,KACA6C,KACA,CAACzC,KACD2D,KAAa3F,MAEb4B,EAAA,GAGAC,KACA6C,KACA,CAACzC,KACD2D,IAAeD,IAAYE,KAAgB7F,MAE3C6B,EAAA;AAAA,IAEJ,GAAG;AAAA,MACD2D;AAAA,MACA5D;AAAA,MACAC;AAAA,MACA4C;AAAA,MACAC;AAAA,MACA1C;AAAA,MACAC;AAAA,IAAA,CACD,GAGKyE,IAASjB;AAAA,MACb,CAACkB,MAAe;AACd,cAAM5F,IAAMX,EAAYuG,CAAI,GACtBC,IAAQ5B,EAAU,QAAQ,IAAIjE,CAAG;AACvC,QAAA+E,EAAY/E,GAAK,EAAI,GAChB6F,KAAOzE,KAAA,QAAAA,EAAewE,EAAK;MAClC;AAAA,MACA,CAACb,GAAa3D,CAAY;AAAA,IAAA,GAGtB0E,KAAcpB,EAAY,MAAMiB,EAAOrD,CAAG,GAAG,CAACqD,GAAQrD,CAAG,CAAC,GAC1DyD,KAAiBrB,EAAY,MAAM;AACvC,YAAMsB,IAAQ,IAAI,KAAK1D,CAAG,GACpB2D,KAAOD,EAAM,OAAA,IAAW,KAAK;AACnC,MAAAA,EAAM,QAAQA,EAAM,QAAA,IAAYC,CAAG,GACnCN,EAAOK,CAAK;AAAA,IACd,GAAG,CAACL,GAAQrD,CAAG,CAAC,GACV4D,KAAkBxB,EAAY,MAAM;AACxC,MAAAiB,EAAO,IAAI,KAAKrD,EAAI,YAAA,GAAeA,EAAI,YAAY,CAAC,CAAC;AAAA,IACvD,GAAG,CAACqD,GAAQrD,CAAG,CAAC,GAGV6D,IAAWjD,EAA0BxD,CAAK;AAChD,IAAAyG,EAAS,UAAUzG;AACnB,UAAM0G,KAAWlD,EAAoB,IAAI;AACzC,IAAAmD,GAAoBzE,IAAK,MAAMwE,GAAS,SAAwB,CAAA,CAAE;AAElE,UAAMrH,KAASwD;AAAA,MACb,OAAO;AAAA,QACL,UAAU,MACR4D,EAAS,QAAQ,IAAI,CAACvD,OAAO,EAAE,IAAIA,EAAE,IAAI,OAAOA,EAAE,QAAQ;AAAA,QAC5D,YAAY,CAAC0D,MAAqB;AAChC,gBAAMC,IAAQJ,EAAS,QAAQ,KAAK,CAACvD,MAAMA,EAAE,OAAO0D,CAAQ;AAC5D,UAAIC,qBAA2BA;AAAA,QACjC;AAAA,QACA,aAAa,MAAMxB,EAAY1F,EAAYiD,CAAG,GAAG,EAAI;AAAA,MAAA;AAAA,MAEvD,CAAC3B,GAAmBoE,GAAazC,CAAG;AAAA,IAAA;AAEtC,IAAAkE,GAAqB1H,IAA0BC,IAAQqB,CAAE;AAEzD,UAAMqG,KAAUjE,EAAO,WAAW,KAAK,CAACvB,KAAkB,CAACC,GAErDwF,KAAa,CAAC1G,MAClB,gBAAA2G;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,eAAY;AAAA,QACZ,WAAU;AAAA,QAEV,UAAA,gBAAAA,EAACC,IAAA,EAAS,SAAQ,eAAc,QAAO,SAAA,CAAS;AAAA,MAAA;AAAA,MAJ3C5G;AAAA,IAAA;AAQT,WACE,gBAAA6G;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKT;AAAA,QACL,kBAAe;AAAA,QACf,qBAAmBhG;AAAA,QACnB,cAAYoB,MAAaa;AAAA,QACzB,WAAWnD,GAAa,EAAE,MAAAuB,GAAM,WAAAc,IAAW;AAAA,QAC1C,GAAGI;AAAA,QAMJ,UAAA;AAAA,UAAA,gBAAAgF;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,wBAAOC,IAAA,EAAa;AAAA,cACpB,OAAO1E;AAAA,cACP,SACElB,KACE,gBAAA0F,EAAAG,IAAA,EACE,UAAA;AAAA,gBAAA,gBAAAH,EAACI,IAAA,EAAY,OAAOpF,EAAE,kCAAkC,GACtD,UAAA;AAAA,kBAAA,gBAAA8E,EAACO,GAAA,EAAO,QAAO,WAAU,MAAK,MAAK,SAASpB,IACzC,UAAAjE,EAAE,2BAA2B,EAAA,CAChC;AAAA,kBACA,gBAAA8E,EAACO,GAAA,EAAO,QAAO,WAAU,MAAK,MAAK,SAASnB,IACzC,UAAAlE,EAAE,8BAA8B,EAAA,CACnC;AAAA,kBACA,gBAAA8E,EAACO,GAAA,EAAO,QAAO,WAAU,MAAK,MAAK,SAAShB,IACzC,UAAArE,EAAE,+BAA+B,EAAA,CACpC;AAAA,gBAAA,GACF;AAAA,gBACA,gBAAA8E,EAAC,WAAM,SAAS3E,GAAQ,WAAU,cAC/B,UAAAH,EAAE,gCAAgC,GACrC;AAAA,gBACA,gBAAA8E;AAAA,kBAACQ;AAAA,kBAAA;AAAA,oBACC,IAAInF;AAAA,oBACJ,MAAK;AAAA,oBACL,aAAaH,EAAE,gCAAgC;AAAA,oBAC/C,UAAU,CAAC+D,MAAS;AAClB,sBAAIA,OAAaA,CAAI;AAAA,oBACvB;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACF,EAAA,CACF,IACE;AAAA,YAAA;AAAA,UAAA;AAAA,UAIPnE;AAAA,UAEAgF,KACC,gBAAAE,EAAC,OAAA,EAAI,WAAU,sCACb,UAAA,gBAAAA;AAAA,YAACS;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,OAAO/F,MAAcQ,EAAE,iCAAiC;AAAA,cACxD,aACEP,MAAoBO,EAAE,uCAAuC;AAAA,YAAA;AAAA,UAAA,GAGnE,IAEA,gBAAAgF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAK7C;AAAA,cAKL,UAAU;AAAA,cACV,UAAU0B;AAAA,cACV,iBAAerB,KAAU,SAAS;AAAA,cAClC,oBAAkBE,KAAa,SAAS;AAAA,cACxC,WAAWnF;AAAA,cAEV,UAAA;AAAA,gBAAA6B,IAAiByF,GAAW,iBAAiB,IAAI;AAAA,gBAElD,gBAAAG;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,KAAKhE;AAAA,oBACL,MAAK;AAAA,oBACL,WAAU;AAAA,oBAET,UAAA;AAAA,sBAAAL,EAAO,IAAI,CAACvC,MACX,gBAAA4G;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BAEC,KAAK,CAACQ,MAAS;AACb,4BAAIA,IAAMpD,EAAU,QAAQ,IAAIhE,EAAM,KAAKoH,CAAI,IAC1CpD,EAAU,QAAQ,OAAOhE,EAAM,GAAG;AAAA,0BACzC;AAAA,0BACA,WAAU;AAAA,0BAEV,UAAA;AAAA,4BAAA,gBAAA0G;AAAA,8BAACW;AAAA,8BAAA;AAAA,gCACC,MAAMrH,EAAM;AAAA,gCACZ,KAAAqC;AAAA,gCACA,QAAQF;AAAA,gCACR,YAAYP,EAAE,2BAA2B;AAAA,gCACzC,eAAeA,EAAE,8BAA8B;AAAA,gCAC/C,gBAAgBA,EAAE,+BAA+B;AAAA,8BAAA;AAAA,4BAAA;AAAA,4BAGnD,gBAAA8E;AAAA,8BAAC;AAAA,8BAAA;AAAA,gCACC,MAAK;AAAA,gCACL,WAAU;AAAA,gCAET,UAAA1G,EAAM,MAAM,IAAI,CAACF,MAChB,gBAAA4G;AAAA,kCAACY;AAAA,kCAAA;AAAA,oCAEC,MAAAxH;AAAA,oCACA,MAAAU;AAAA,oCACA,SAAQ;AAAA,oCACR,aAAAC;AAAA,oCACA,QAAQ0B;AAAA,oCACR,UAAA5B;AAAA,oCACA,YAAYG;AAAA,oCACZ,UAAUZ,EAAK,OAAOa;AAAA,oCACtB,mBAAAc;AAAA,oCACA,uBAAqB3B,EAAK;AAAA,oCAC1B,kBAAgBA,EAAK;AAAA,oCACrB,WAAWyH;AAAA,kCAAA;AAAA,kCAZNzH,EAAK;AAAA,gCAAA,CAcb;AAAA,8BAAA;AAAA,4BAAA;AAAA,0BACH;AAAA,wBAAA;AAAA,wBArCKE,EAAM;AAAA,sBAAA,CAuCd;AAAA,sBAIAkD,EAAa,SAAS,IACnBA,EAAa,IAAI,CAACpD,MAChB,gBAAA4G;AAAA,wBAACY;AAAA,wBAAA;AAAA,0BAEC,MAAAxH;AAAA,0BACA,MAAAU;AAAA,0BACA,SAAQ;AAAA,0BACR,aAAAC;AAAA,0BACA,QAAQ0B;AAAA,0BACR,UAAA5B;AAAA,0BACA,eAAY;AAAA,0BACZ,gBAAY;AAAA,0BACZ,WAAW;AAAA,4BACT;AAAA,4BACA;AAAA,4BACA;AAAA,4BACA;AAAA,4BACA;AAAA,0BAAA,EACA,KAAK,GAAG;AAAA,wBAAA;AAAA,wBAfL,WAAWT,EAAK,EAAE;AAAA,sBAAA,CAiB1B,IACD;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAELmB,IAAewF,GAAW,eAAe,IAAI;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAChD;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEAxG,GAAoB,cAAc;AAelC,SAASoH,GAAU;AAAA,EACjB,MAAA1B;AAAA,EACA,KAAAtD;AAAA,EACA,QAAA/B;AAAA,EACA,YAAAkH;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AACF,GAA8B;AAC5B,QAAM3H,IAAMX,EAAYuG,CAAI,GACtB/B,IAAWxE,EAAYiD,CAAG,GAC1BsF,IAAW,IAAI,KAAKtF,CAAG;AAC7B,EAAAsF,EAAS,QAAQtF,EAAI,QAAA,IAAY,CAAC;AAClC,QAAMuF,IAAY,IAAI,KAAKvF,CAAG;AAC9B,EAAAuF,EAAU,QAAQvF,EAAI,QAAA,IAAY,CAAC;AAEnC,QAAMwF,IAAU9H,MAAQ6D;AAExB,MAAIkE;AACJ,MAAID,EAAS,CAAAC,IAAQN;AAAA,WACZzH,MAAQX,EAAYuI,CAAQ,EAAG,CAAAG,IAAQL;AAAA,WACvC1H,MAAQX,EAAYwI,CAAS,EAAG,CAAAE,IAAQJ;AAAA,OAC5C;AACH,UAAMK,IAAWpC,EAAK,YAAA,MAAkBtD,EAAI,YAAA;AAC5C,IAAAyF,IAAQ,IAAI,KAAK,eAAexH,GAAQ;AAAA,MACtC,SAAS;AAAA,MACT,KAAK;AAAA,MACL,OAAO;AAAA,MACP,GAAIyH,IAAW,CAAA,IAAK,EAAE,MAAM,UAAA;AAAA,IAAU,CACvC,EAAE,OAAOpC,CAAI;AAAA,EAChB;AAKA,SACE,gBAAAiB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,cAAYiB,IAAU,SAAS;AAAA,MAC/B,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACAA,IACI,oDACA;AAAA,MAAA,EACJ,KAAK,GAAG;AAAA,MAET,UAAA;AAAA,QAAAA,IACC,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAU;AAAA,UAAA;AAAA,QAAA,IAEV;AAAA,QACHoB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;"}
@@ -2,10 +2,10 @@ import { jsx as t, jsxs as d } from "react/jsx-runtime";
2
2
  import { forwardRef as j, useRef as h, useImperativeHandle as z, useMemo as P } from "react";
3
3
  import { c as E } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as H } from "react-i18next";
5
- import { I as M } from "./icon-button-8xqRnkdG.js";
5
+ import { I as M } from "./icon-button-CehAeZoP.js";
6
6
  import { S as q } from "./skeleton-B1KTdJ4N.js";
7
- import { E as K } from "./empty-state-X0sVPfVo.js";
8
- import { A as V } from "./appointment-card-WsDGBBut.js";
7
+ import { E as K } from "./empty-state-BUN_UAWf.js";
8
+ import { A as V } from "./appointment-card-TgR_2GKS.js";
9
9
  import { u as _ } from "./registry-DvAUVLHh.js";
10
10
  import { C as B } from "./calendar-days-BGWklvE-.js";
11
11
  import { P as D } from "./plus-DzMQ_c6b.js";
@@ -190,4 +190,4 @@ export {
190
190
  ae as a,
191
191
  L as b
192
192
  };
193
- //# sourceMappingURL=appointment-tray-CK2CULg_.js.map
193
+ //# sourceMappingURL=appointment-tray-N0yEI8UF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"appointment-tray-CK2CULg_.js","sources":["../../src/components/appointment-card/appointment-card.agent.ts","../../src/components/appointment-card/appointment-tray.agent.ts","../../src/components/appointment-card/appointment-tray.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AppointmentCard. */\n/* */\n/* Single-appointment surface. Activation is owned by the consumer / */\n/* host tray; the card emits a DOM hook so a future MCP UI bridge can */\n/* address one rendered card by its appointment id. Read-only — the card */\n/* exposes no imperative handle of its own (the tray owns activation). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\n\nexport const appointmentCardAgent: AgentAdapter = {\n id: 'appointment-card',\n // 'pick' (non-persisting activation) is host-delegated: the card exposes no\n // handle of its own — its enclosing AppointmentTray performs the pick via\n // `appointment-tray.select_item`, addressing this card by its data-component-id.\n capabilities: ['pick'],\n state: {},\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'appointment-card',\n description:\n 'Marks the element as a kit AppointmentCard. The root also emits data-component-id sourced from item.id, data-state with the appointment lifecycle, and data-type with the delivery channel.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'item.id',\n description: 'Sourced from item.id — the stable appointment identifier.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — AppointmentTray. */\n/* */\n/* Tray-level surface: read appointment ids + lifecycle state (never */\n/* patient names / treatments), and route an activation through the */\n/* curated handle. AppointmentTray is in-page (no open/close). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AppointmentTrayHandle } from './appointment-tray';\n\nexport const appointmentTrayAgent: AgentAdapter<AppointmentTrayHandle> = {\n id: 'appointment-tray',\n // 'pick' (non-persisting activation): select_item routes an activation\n // through onActivate — it does not persist a \"selected appointment\" value,\n // so this is a focus/pick, not a select_single.\n capabilities: ['pick'],\n state: {\n items: {\n type: 'Array<{ id: string; state: string }>',\n descriptionKey: 'ui.agent.appointmentTray.state.items',\n description:\n 'Currently-displayed 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.appointmentTray.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 },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'appointment-tray',\n description: 'Marks the AppointmentTray 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 tray from the agent.',\n },\n item: {\n attr: 'data-appointment-id',\n description:\n 'Stable appointment id emitted on each rendered AppointmentCard inside the tray.',\n },\n },\n};\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CalendarDays, Plus } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { AppointmentCard, type AppointmentItem } from './appointment-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { appointmentTrayAgent } from './appointment-tray.agent';\n\n/* -------------------------------------------------------------------- */\n/* AppointmentTray */\n/* */\n/* Bordered panel that hosts a list of AppointmentCards — header with a */\n/* title + optional caption + an \"Add\" affordance, a body that branches */\n/* on loading (Skeleton) / empty (EmptyState) / list. Mirrors AgendaTray */\n/* but composes the richer AppointmentCard row. */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `appointmentTray.*` namespace. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA — panel surface */\n/* -------------------------------------------------------------------- */\n\nconst appointmentTrayVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:overflow-hidden',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\n/**\n * Curated imperative handle for AppointmentTray — the forwardRef target so a\n * future agent / MCP UI bridge can drive the tray without touching the DOM.\n * Reads identifiers + lifecycle state only, never patient identity. See\n * `appointment-tray.agent.ts`.\n */\nexport interface AppointmentTrayHandle {\n getItems: () => Array<{ id: string; state: string }>;\n selectItem: (id: string) => void;\n}\n\nexport interface AppointmentTrayProps\n extends\n Omit<HTMLAttributes<HTMLElement>, 'onClick' | 'id'>,\n VariantProps<typeof appointmentTrayVariants> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so an\n * agent / MCP UI bridge can address this specific tray.\n */\n id?: string;\n /** The appointments to render. */\n items: AppointmentItem[];\n /** Section title — rendered in the header. Localised by the consumer. */\n title?: string;\n /** Optional small caption (e.g. localised date) shown next to the title. */\n caption?: string;\n /** Visual density passed through to each AppointmentCard. */\n size?: 'sm' | 'md';\n /** BCP-47 locale override passed to each AppointmentCard. */\n locale?: string;\n /** ISO-4217 currency code passed to each AppointmentCard. */\n currency?: string;\n onOpenAppointment?: (item: AppointmentItem) => void;\n onAddAppointment?: () => void;\n /** Localised label for the \"Add\" affordance. */\n addLabel?: string;\n loading?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const AppointmentTray = forwardRef<HTMLElement, AppointmentTrayProps>(\n (\n {\n id,\n items,\n title,\n caption,\n size = 'sm',\n locale,\n currency,\n onOpenAppointment,\n onAddAppointment,\n addLabel,\n loading = false,\n emptyTitle,\n emptyDescription,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const heading = title ?? t('appointmentTray.title');\n const resolvedAddLabel = addLabel ?? t('appointmentTray.add');\n const isEmpty = !loading && items.length === 0;\n\n let body: ReactNode;\n if (loading) {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n {[0, 1, 2].map((i) => (\n <Skeleton key={i} variant=\"rectangular\" height=\"3.5rem\" />\n ))}\n </div>\n );\n } else if (isEmpty) {\n body = (\n <div className=\"ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('appointmentTray.empty.title')}\n description={\n emptyDescription ?? t('appointmentTray.empty.description')\n }\n />\n </div>\n );\n } else {\n body = (\n <ul className=\"ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-2xs)] ds:p-[var(--spacing-2xs)]\">\n {items.map((item) => (\n <AppointmentCard\n key={item.id}\n item={item}\n size={size}\n locale={locale}\n currency={currency}\n onActivate={onOpenAppointment}\n data-appointment-id={item.id}\n />\n ))}\n </ul>\n );\n }\n\n /* Curated imperative handle for agent integration. See\n * appointment-tray.agent.ts. */\n const itemsRef = useRef<AppointmentItem[]>(items);\n itemsRef.current = items;\n\n const innerRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => innerRef.current as HTMLElement, []);\n\n const handle = useMemo<AppointmentTrayHandle>(\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 }),\n [onOpenAppointment],\n );\n\n useAgentRegistration(appointmentTrayAgent, handle, id);\n\n return (\n <section\n ref={innerRef}\n aria-label={heading}\n data-component=\"appointment-tray\"\n data-component-id={id}\n className={appointmentTrayVariants({ size, className })}\n {...rest}\n >\n <header className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)] ds:min-w-0\">\n <h3 className=\"ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-title-card\">\n <CalendarDays aria-hidden=\"true\" className=\"ds:size-4\" />\n {heading}\n </h3>\n {caption ? (\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {caption}\n </span>\n ) : null}\n </div>\n {onAddAppointment ? (\n <IconButton\n icon={<Plus />}\n intent=\"outline\"\n size=\"sm\"\n aria-label={resolvedAddLabel}\n onClick={onAddAppointment}\n />\n ) : null}\n </header>\n {body}\n </section>\n );\n },\n);\n\nAppointmentTray.displayName = 'AppointmentTray';\n"],"names":["appointmentCardAgent","appointmentTrayAgent","handle","args","appointmentTrayVariants","cva","AppointmentTray","forwardRef","id","items","title","caption","size","locale","currency","onOpenAppointment","onAddAppointment","addLabel","loading","emptyTitle","emptyDescription","className","rest","ref","t","useTranslation","heading","resolvedAddLabel","isEmpty","body","jsx","i","Skeleton","EmptyState","item","AppointmentCard","itemsRef","useRef","innerRef","useImperativeHandle","useMemo","targetId","found","useAgentRegistration","jsxs","CalendarDays","IconButton","Plus"],"mappings":"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"}
1
+ {"version":3,"file":"appointment-tray-N0yEI8UF.js","sources":["../../src/components/appointment-card/appointment-card.agent.ts","../../src/components/appointment-card/appointment-tray.agent.ts","../../src/components/appointment-card/appointment-tray.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AppointmentCard. */\n/* */\n/* Single-appointment surface. Activation is owned by the consumer / */\n/* host tray; the card emits a DOM hook so a future MCP UI bridge can */\n/* address one rendered card by its appointment id. Read-only — the card */\n/* exposes no imperative handle of its own (the tray owns activation). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\n\nexport const appointmentCardAgent: AgentAdapter = {\n id: 'appointment-card',\n // 'pick' (non-persisting activation) is host-delegated: the card exposes no\n // handle of its own — its enclosing AppointmentTray performs the pick via\n // `appointment-tray.select_item`, addressing this card by its data-component-id.\n capabilities: ['pick'],\n state: {},\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'appointment-card',\n description:\n 'Marks the element as a kit AppointmentCard. The root also emits data-component-id sourced from item.id, data-state with the appointment lifecycle, and data-type with the delivery channel.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'item.id',\n description: 'Sourced from item.id — the stable appointment identifier.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — AppointmentTray. */\n/* */\n/* Tray-level surface: read appointment ids + lifecycle state (never */\n/* patient names / treatments), and route an activation through the */\n/* curated handle. AppointmentTray is in-page (no open/close). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AppointmentTrayHandle } from './appointment-tray';\n\nexport const appointmentTrayAgent: AgentAdapter<AppointmentTrayHandle> = {\n id: 'appointment-tray',\n // 'pick' (non-persisting activation): select_item routes an activation\n // through onActivate — it does not persist a \"selected appointment\" value,\n // so this is a focus/pick, not a select_single.\n capabilities: ['pick'],\n state: {\n items: {\n type: 'Array<{ id: string; state: string }>',\n descriptionKey: 'ui.agent.appointmentTray.state.items',\n description:\n 'Currently-displayed 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.appointmentTray.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 },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'appointment-tray',\n description: 'Marks the AppointmentTray 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 tray from the agent.',\n },\n item: {\n attr: 'data-appointment-id',\n description:\n 'Stable appointment id emitted on each rendered AppointmentCard inside the tray.',\n },\n },\n};\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CalendarDays, Plus } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { AppointmentCard, type AppointmentItem } from './appointment-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { appointmentTrayAgent } from './appointment-tray.agent';\n\n/* -------------------------------------------------------------------- */\n/* AppointmentTray */\n/* */\n/* Bordered panel that hosts a list of AppointmentCards — header with a */\n/* title + optional caption + an \"Add\" affordance, a body that branches */\n/* on loading (Skeleton) / empty (EmptyState) / list. Mirrors AgendaTray */\n/* but composes the richer AppointmentCard row. */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `appointmentTray.*` namespace. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA — panel surface */\n/* -------------------------------------------------------------------- */\n\nconst appointmentTrayVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:overflow-hidden',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\n/**\n * Curated imperative handle for AppointmentTray — the forwardRef target so a\n * future agent / MCP UI bridge can drive the tray without touching the DOM.\n * Reads identifiers + lifecycle state only, never patient identity. See\n * `appointment-tray.agent.ts`.\n */\nexport interface AppointmentTrayHandle {\n getItems: () => Array<{ id: string; state: string }>;\n selectItem: (id: string) => void;\n}\n\nexport interface AppointmentTrayProps\n extends\n Omit<HTMLAttributes<HTMLElement>, 'onClick' | 'id'>,\n VariantProps<typeof appointmentTrayVariants> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so an\n * agent / MCP UI bridge can address this specific tray.\n */\n id?: string;\n /** The appointments to render. */\n items: AppointmentItem[];\n /** Section title — rendered in the header. Localised by the consumer. */\n title?: string;\n /** Optional small caption (e.g. localised date) shown next to the title. */\n caption?: string;\n /** Visual density passed through to each AppointmentCard. */\n size?: 'sm' | 'md';\n /** BCP-47 locale override passed to each AppointmentCard. */\n locale?: string;\n /** ISO-4217 currency code passed to each AppointmentCard. */\n currency?: string;\n onOpenAppointment?: (item: AppointmentItem) => void;\n onAddAppointment?: () => void;\n /** Localised label for the \"Add\" affordance. */\n addLabel?: string;\n loading?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const AppointmentTray = forwardRef<HTMLElement, AppointmentTrayProps>(\n (\n {\n id,\n items,\n title,\n caption,\n size = 'sm',\n locale,\n currency,\n onOpenAppointment,\n onAddAppointment,\n addLabel,\n loading = false,\n emptyTitle,\n emptyDescription,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const heading = title ?? t('appointmentTray.title');\n const resolvedAddLabel = addLabel ?? t('appointmentTray.add');\n const isEmpty = !loading && items.length === 0;\n\n let body: ReactNode;\n if (loading) {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n {[0, 1, 2].map((i) => (\n <Skeleton key={i} variant=\"rectangular\" height=\"3.5rem\" />\n ))}\n </div>\n );\n } else if (isEmpty) {\n body = (\n <div className=\"ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('appointmentTray.empty.title')}\n description={\n emptyDescription ?? t('appointmentTray.empty.description')\n }\n />\n </div>\n );\n } else {\n body = (\n <ul className=\"ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-2xs)] ds:p-[var(--spacing-2xs)]\">\n {items.map((item) => (\n <AppointmentCard\n key={item.id}\n item={item}\n size={size}\n locale={locale}\n currency={currency}\n onActivate={onOpenAppointment}\n data-appointment-id={item.id}\n />\n ))}\n </ul>\n );\n }\n\n /* Curated imperative handle for agent integration. See\n * appointment-tray.agent.ts. */\n const itemsRef = useRef<AppointmentItem[]>(items);\n itemsRef.current = items;\n\n const innerRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => innerRef.current as HTMLElement, []);\n\n const handle = useMemo<AppointmentTrayHandle>(\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 }),\n [onOpenAppointment],\n );\n\n useAgentRegistration(appointmentTrayAgent, handle, id);\n\n return (\n <section\n ref={innerRef}\n aria-label={heading}\n data-component=\"appointment-tray\"\n data-component-id={id}\n className={appointmentTrayVariants({ size, className })}\n {...rest}\n >\n <header className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)] ds:min-w-0\">\n <h3 className=\"ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-title-card\">\n <CalendarDays aria-hidden=\"true\" className=\"ds:size-4\" />\n {heading}\n </h3>\n {caption ? (\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {caption}\n </span>\n ) : null}\n </div>\n {onAddAppointment ? (\n <IconButton\n icon={<Plus />}\n intent=\"outline\"\n size=\"sm\"\n aria-label={resolvedAddLabel}\n onClick={onAddAppointment}\n />\n ) : null}\n </header>\n {body}\n </section>\n );\n },\n);\n\nAppointmentTray.displayName = 'AppointmentTray';\n"],"names":["appointmentCardAgent","appointmentTrayAgent","handle","args","appointmentTrayVariants","cva","AppointmentTray","forwardRef","id","items","title","caption","size","locale","currency","onOpenAppointment","onAddAppointment","addLabel","loading","emptyTitle","emptyDescription","className","rest","ref","t","useTranslation","heading","resolvedAddLabel","isEmpty","body","jsx","i","Skeleton","EmptyState","item","AppointmentCard","itemsRef","useRef","innerRef","useImperativeHandle","useMemo","targetId","found","useAgentRegistration","jsxs","CalendarDays","IconButton","Plus"],"mappings":"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"}
@@ -2,8 +2,8 @@ import { jsxs as R, jsx as s, Fragment as se } from "react/jsx-runtime";
2
2
  import { forwardRef as ne, useReducer as ae, useState as x, useRef as l, useEffect as N, useCallback as h, useMemo as de, useImperativeHandle as ce } from "react";
3
3
  import { c as oe } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as ue } from "react-i18next";
5
- import { B as G } from "./button-nJaPh_HC.js";
6
- import { I as D } from "./icon-button-8xqRnkdG.js";
5
+ import { B as G } from "./button-CaUe1uyd.js";
6
+ import { I as D } from "./icon-button-CehAeZoP.js";
7
7
  import { S as pe } from "./select-CLSUnKjF.js";
8
8
  import { A as le } from "./audio-visualiser-l6zPd0AG.js";
9
9
  import { A as F } from "./alert-CiQ5Pa3Q.js";
@@ -447,4 +447,4 @@ export {
447
447
  De as A,
448
448
  Re as a
449
449
  };
450
- //# sourceMappingURL=audio-recorder-BlQBC7N_.js.map
450
+ //# sourceMappingURL=audio-recorder-B7dT-Y3v.js.map