@alfadocs/ui-kit-debug 1.37.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 (517) 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-DYGCTIWB.js → agenda-tray-CBaJASb5.js} +4 -4
  4. package/dist/_chunks/{agenda-tray-DYGCTIWB.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-card-GYHa7VGp.js → anamnesis-summary-card-CclBbiXg.js} +2 -2
  14. package/dist/_chunks/{anamnesis-summary-card-GYHa7VGp.js.map → anamnesis-summary-card-CclBbiXg.js.map} +1 -1
  15. package/dist/_chunks/{anamnesis-summary-rows-Cxtgo2ok.js → anamnesis-summary-rows-DQUqwWc1.js} +7 -7
  16. package/dist/_chunks/{anamnesis-summary-rows-Cxtgo2ok.js.map → anamnesis-summary-rows-DQUqwWc1.js.map} +1 -1
  17. package/dist/_chunks/{appointment-card-WsDGBBut.js → appointment-card-TgR_2GKS.js} +134 -102
  18. package/dist/_chunks/appointment-card-TgR_2GKS.js.map +1 -0
  19. package/dist/_chunks/{appointment-peek-5S4O1VQP.js → appointment-peek-abiR0T9e.js} +3 -3
  20. package/dist/_chunks/{appointment-peek-5S4O1VQP.js.map → appointment-peek-abiR0T9e.js.map} +1 -1
  21. package/dist/_chunks/{appointment-timeline-ByfovxqR.js → appointment-timeline-CCnyUYKz.js} +67 -63
  22. package/dist/_chunks/appointment-timeline-CCnyUYKz.js.map +1 -0
  23. package/dist/_chunks/{appointment-tray-D6UyJHej.js → appointment-tray-N0yEI8UF.js} +5 -5
  24. package/dist/_chunks/{appointment-tray-D6UyJHej.js.map → appointment-tray-N0yEI8UF.js.map} +1 -1
  25. package/dist/_chunks/{audio-recorder-BlQBC7N_.js → audio-recorder-B7dT-Y3v.js} +3 -3
  26. package/dist/_chunks/{audio-recorder-BlQBC7N_.js.map → audio-recorder-B7dT-Y3v.js.map} +1 -1
  27. package/dist/_chunks/{balance-badge-cell-B0Z8Dwn8.js → balance-badge-cell-o6LldMUA.js} +5 -5
  28. package/dist/_chunks/{balance-badge-cell-B0Z8Dwn8.js.map → balance-badge-cell-o6LldMUA.js.map} +1 -1
  29. package/dist/_chunks/{bishop-score-D5b8tktp.js → bishop-score-Cu70iv9C.js} +2 -2
  30. package/dist/_chunks/{bishop-score-D5b8tktp.js.map → bishop-score-Cu70iv9C.js.map} +1 -1
  31. package/dist/_chunks/{bmi-calculator-dOKP-vW4.js → bmi-calculator-C9N19aLX.js} +2 -2
  32. package/dist/_chunks/{bmi-calculator-dOKP-vW4.js.map → bmi-calculator-C9N19aLX.js.map} +1 -1
  33. package/dist/_chunks/{booking-Dp-9qR6F.js → booking-Dn3jvv3K.js} +6 -6
  34. package/dist/_chunks/{booking-Dp-9qR6F.js.map → booking-Dn3jvv3K.js.map} +1 -1
  35. package/dist/_chunks/{button-nJaPh_HC.js → button-CaUe1uyd.js} +11 -7
  36. package/dist/_chunks/button-CaUe1uyd.js.map +1 -0
  37. package/dist/_chunks/{button-group-QmN1VdUW.js → button-group-R32U7SyV.js} +2 -2
  38. package/dist/_chunks/{button-group-QmN1VdUW.js.map → button-group-R32U7SyV.js.map} +1 -1
  39. package/dist/_chunks/{calendar-7GAUlsNO.js → calendar-ChJQzRw-.js} +2 -2
  40. package/dist/_chunks/{calendar-7GAUlsNO.js.map → calendar-ChJQzRw-.js.map} +1 -1
  41. package/dist/_chunks/calendar-workspace-B-fUbm62.js +11372 -0
  42. package/dist/_chunks/calendar-workspace-B-fUbm62.js.map +1 -0
  43. package/dist/_chunks/{care-plan-card-COFOI-fI.js → care-plan-card-BOv0NRle.js} +3 -3
  44. package/dist/_chunks/{care-plan-card-COFOI-fI.js.map → care-plan-card-BOv0NRle.js.map} +1 -1
  45. package/dist/_chunks/{care-plan-entry-card-BOKn0KW-.js → care-plan-entry-card-d-rZD4li.js} +3 -3
  46. package/dist/_chunks/{care-plan-entry-card-BOKn0KW-.js.map → care-plan-entry-card-d-rZD4li.js.map} +1 -1
  47. package/dist/_chunks/{care-plan-header-CbuOuVBw.js → care-plan-header-CEmBXn6-.js} +2 -2
  48. package/dist/_chunks/{care-plan-header-CbuOuVBw.js.map → care-plan-header-CEmBXn6-.js.map} +1 -1
  49. package/dist/_chunks/{carousel.agent-Dv4a4M8L.js → carousel.agent-z1yLBpyC.js} +2 -2
  50. package/dist/_chunks/{carousel.agent-Dv4a4M8L.js.map → carousel.agent-z1yLBpyC.js.map} +1 -1
  51. package/dist/_chunks/{chart-iWl76PXv.js → chart-PF2krCZC.js} +3 -3
  52. package/dist/_chunks/{chart-iWl76PXv.js.map → chart-PF2krCZC.js.map} +1 -1
  53. package/dist/_chunks/{chat-input-qM5QpUSq.js → chat-input-Cj7ZYQr5.js} +2 -2
  54. package/dist/_chunks/{chat-input-qM5QpUSq.js.map → chat-input-Cj7ZYQr5.js.map} +1 -1
  55. package/dist/_chunks/{chat-message-RniXtrCH.js → chat-message-BMVxiUIX.js} +3 -3
  56. package/dist/_chunks/{chat-message-RniXtrCH.js.map → chat-message-BMVxiUIX.js.map} +1 -1
  57. package/dist/_chunks/{code-block-uVjNSI9g.js → code-block-BB-viuTn.js} +2 -2
  58. package/dist/_chunks/{code-block-uVjNSI9g.js.map → code-block-BB-viuTn.js.map} +1 -1
  59. package/dist/_chunks/{connection-status-OEsWjmRk.js → connection-status-BmA9T0UO.js} +3 -3
  60. package/dist/_chunks/{connection-status-OEsWjmRk.js.map → connection-status-BmA9T0UO.js.map} +1 -1
  61. package/dist/_chunks/{contact-profile-card--My1H2UD.js → contact-profile-card-Zt6WNg1u.js} +2 -2
  62. package/dist/_chunks/{contact-profile-card--My1H2UD.js.map → contact-profile-card-Zt6WNg1u.js.map} +1 -1
  63. package/dist/_chunks/{control-room-rail-DQoHdE1U.js → control-room-rail-CnNZusR5.js} +3 -3
  64. package/dist/_chunks/{control-room-rail-DQoHdE1U.js.map → control-room-rail-CnNZusR5.js.map} +1 -1
  65. package/dist/_chunks/{copy-field-fYKpl6aN.js → copy-field-B8XRVmQv.js} +2 -2
  66. package/dist/_chunks/{copy-field-fYKpl6aN.js.map → copy-field-B8XRVmQv.js.map} +1 -1
  67. package/dist/_chunks/credit-card-D9XZsHGA.js +15 -0
  68. package/dist/_chunks/credit-card-D9XZsHGA.js.map +1 -0
  69. package/dist/_chunks/{cycle-calculator-BJeaXiZv.js → cycle-calculator-BH2StWoT.js} +2 -2
  70. package/dist/_chunks/{cycle-calculator-BJeaXiZv.js.map → cycle-calculator-BH2StWoT.js.map} +1 -1
  71. package/dist/_chunks/{dashboard-grid-B23BFzRl.js → dashboard-grid-BcXWL5S9.js} +2 -2
  72. package/dist/_chunks/{dashboard-grid-B23BFzRl.js.map → dashboard-grid-BcXWL5S9.js.map} +1 -1
  73. package/dist/_chunks/{data-table-BYGK-gUJ.js → data-table-CcAx_I1w.js} +7 -7
  74. package/dist/_chunks/{data-table-BYGK-gUJ.js.map → data-table-CcAx_I1w.js.map} +1 -1
  75. package/dist/_chunks/{data-table-tabs-BMR0zsVQ.js → data-table-tabs-B9SXA5VP.js} +3 -3
  76. package/dist/_chunks/{data-table-tabs-BMR0zsVQ.js.map → data-table-tabs-B9SXA5VP.js.map} +1 -1
  77. package/dist/_chunks/{description-list-C1RXMDZ_.js → description-list-BsJ_6CQE.js} +2 -2
  78. package/dist/_chunks/{description-list-C1RXMDZ_.js.map → description-list-BsJ_6CQE.js.map} +1 -1
  79. package/dist/_chunks/{document-preview-DsEyRcNd.js → document-preview-COV0BC6n.js} +2 -2
  80. package/dist/_chunks/{document-preview-DsEyRcNd.js.map → document-preview-COV0BC6n.js.map} +1 -1
  81. package/dist/_chunks/{document-scanner-CbWVtm7u.js → document-scanner-B1abl-A4.js} +2 -2
  82. package/dist/_chunks/{document-scanner-CbWVtm7u.js.map → document-scanner-B1abl-A4.js.map} +1 -1
  83. package/dist/_chunks/{due-date-calculator-Dhc9Ljkb.js → due-date-calculator-Buh_mVHq.js} +2 -2
  84. package/dist/_chunks/{due-date-calculator-Dhc9Ljkb.js.map → due-date-calculator-Buh_mVHq.js.map} +1 -1
  85. package/dist/_chunks/{editable-currency-cell-renderer-D7blbDFY.js → editable-currency-cell-renderer-Psb6XKHR.js} +3 -3
  86. package/dist/_chunks/{editable-currency-cell-renderer-D7blbDFY.js.map → editable-currency-cell-renderer-Psb6XKHR.js.map} +1 -1
  87. package/dist/_chunks/editable-description-ADMVFPUz.js +142 -0
  88. package/dist/_chunks/editable-description-ADMVFPUz.js.map +1 -0
  89. package/dist/_chunks/{editor-overlay-8fKAcRsm.js → editor-overlay-9tcPXNWt.js} +2 -2
  90. package/dist/_chunks/{editor-overlay-8fKAcRsm.js.map → editor-overlay-9tcPXNWt.js.map} +1 -1
  91. package/dist/_chunks/{empty-state-X0sVPfVo.js → empty-state-BUN_UAWf.js} +2 -2
  92. package/dist/_chunks/{empty-state-X0sVPfVo.js.map → empty-state-BUN_UAWf.js.map} +1 -1
  93. package/dist/_chunks/{entity-summary-BbW0mIzU.js → entity-summary-DXejuQ8i.js} +3 -3
  94. package/dist/_chunks/{entity-summary-BbW0mIzU.js.map → entity-summary-DXejuQ8i.js.map} +1 -1
  95. package/dist/_chunks/{error-boundary-ayXFCcq4.js → error-boundary-BNT2iQ1w.js} +2 -2
  96. package/dist/_chunks/{error-boundary-ayXFCcq4.js.map → error-boundary-BNT2iQ1w.js.map} +1 -1
  97. package/dist/_chunks/{face-scheme-uFvhqz6h.js → face-scheme-Dg6ZyLKb.js} +5 -5
  98. package/dist/_chunks/{face-scheme-uFvhqz6h.js.map → face-scheme-Dg6ZyLKb.js.map} +1 -1
  99. package/dist/_chunks/{fetal-weight-C6SxchOv.js → fetal-weight-wx4ycKc6.js} +2 -2
  100. package/dist/_chunks/{fetal-weight-C6SxchOv.js.map → fetal-weight-wx4ycKc6.js.map} +1 -1
  101. package/dist/_chunks/{field-array-C9dmRaIM.js → field-array-BW9KeeXG.js} +3 -3
  102. package/dist/_chunks/{field-array-C9dmRaIM.js.map → field-array-BW9KeeXG.js.map} +1 -1
  103. package/dist/_chunks/{file-manager-DvkFgj7d.js → file-manager-BfLQxF5t.js} +137 -151
  104. package/dist/_chunks/file-manager-BfLQxF5t.js.map +1 -0
  105. package/dist/_chunks/{finished-terminal-Br61Ip4e.js → finished-terminal-DJd7Z_po.js} +2 -2
  106. package/dist/_chunks/{finished-terminal-Br61Ip4e.js.map → finished-terminal-DJd7Z_po.js.map} +1 -1
  107. package/dist/_chunks/{fiscal-code-input-CkwIdB1y.js → fiscal-code-input-ODQRd_Sw.js} +2 -2
  108. package/dist/_chunks/{fiscal-code-input-CkwIdB1y.js.map → fiscal-code-input-ODQRd_Sw.js.map} +1 -1
  109. package/dist/_chunks/folder-BghC8_S2.js +20 -0
  110. package/dist/_chunks/folder-BghC8_S2.js.map +1 -0
  111. package/dist/_chunks/{freemium-paywall-BqGk_SBU.js → freemium-paywall-Cz-O9lQD.js} +2 -2
  112. package/dist/_chunks/{freemium-paywall-BqGk_SBU.js.map → freemium-paywall-Cz-O9lQD.js.map} +1 -1
  113. package/dist/_chunks/{gestational-age-calculator-DDOGaPvg.js → gestational-age-calculator-CwbecTul.js} +2 -2
  114. package/dist/_chunks/{gestational-age-calculator-DDOGaPvg.js.map → gestational-age-calculator-CwbecTul.js.map} +1 -1
  115. package/dist/_chunks/{hcg-doubling-Bb_n6tEa.js → hcg-doubling-BcXriXJe.js} +2 -2
  116. package/dist/_chunks/{hcg-doubling-Bb_n6tEa.js.map → hcg-doubling-BcXriXJe.js.map} +1 -1
  117. package/dist/_chunks/{header-BZ4pZlJV.js → header-3o9o9v_T.js} +2 -2
  118. package/dist/_chunks/{header-BZ4pZlJV.js.map → header-3o9o9v_T.js.map} +1 -1
  119. package/dist/_chunks/{header-settings-B8mLc03Q.js → header-settings-CTe45iDy.js} +4 -4
  120. package/dist/_chunks/{header-settings-B8mLc03Q.js.map → header-settings-CTe45iDy.js.map} +1 -1
  121. package/dist/_chunks/{hover-card-Bcku1GQu.js → hover-card-BMJBVqIf.js} +2 -2
  122. package/dist/_chunks/{hover-card-Bcku1GQu.js.map → hover-card-BMJBVqIf.js.map} +1 -1
  123. package/dist/_chunks/{icon-button-8xqRnkdG.js → icon-button-CehAeZoP.js} +2 -2
  124. package/dist/_chunks/{icon-button-8xqRnkdG.js.map → icon-button-CehAeZoP.js.map} +1 -1
  125. package/dist/_chunks/{icon-button-group-Dj6CRoYR.js → icon-button-group-DkkdIygu.js} +2 -2
  126. package/dist/_chunks/{icon-button-group-Dj6CRoYR.js.map → icon-button-group-DkkdIygu.js.map} +1 -1
  127. package/dist/_chunks/{icon-picker-CTWzlHJr.js → icon-picker-DMEelg9v.js} +3 -3
  128. package/dist/_chunks/{icon-picker-CTWzlHJr.js.map → icon-picker-DMEelg9v.js.map} +1 -1
  129. package/dist/_chunks/{image-cropper-C84NDTB7.js → image-cropper-BjPjT7wU.js} +2 -2
  130. package/dist/_chunks/{image-cropper-C84NDTB7.js.map → image-cropper-BjPjT7wU.js.map} +1 -1
  131. package/dist/_chunks/{info-tip-ey_Pon2y.js → info-tip-iP2Pm9dh.js} +2 -2
  132. package/dist/_chunks/{info-tip-ey_Pon2y.js.map → info-tip-iP2Pm9dh.js.map} +1 -1
  133. package/dist/_chunks/{insert-result-LCNTskNJ.js → insert-result-DPnOBD85.js} +2 -2
  134. package/dist/_chunks/{insert-result-LCNTskNJ.js.map → insert-result-DPnOBD85.js.map} +1 -1
  135. package/dist/_chunks/{key-value-pair-DczGb4yz.js → key-value-pair-DaQI_LZB.js} +2 -2
  136. package/dist/_chunks/{key-value-pair-DczGb4yz.js.map → key-value-pair-DaQI_LZB.js.map} +1 -1
  137. package/dist/_chunks/{link-cell-renderer-BNa8x6oJ.js → link-cell-renderer-s3oHzOwi.js} +2 -2
  138. package/dist/_chunks/{link-cell-renderer-BNa8x6oJ.js.map → link-cell-renderer-s3oHzOwi.js.map} +1 -1
  139. package/dist/_chunks/{locale-picker-BLeHbFSc.js → locale-picker-CH3kfrIG.js} +3 -3
  140. package/dist/_chunks/{locale-picker-BLeHbFSc.js.map → locale-picker-CH3kfrIG.js.map} +1 -1
  141. package/dist/_chunks/{map-view-CCAlC9IL.js → map-view-CHw4RL6w.js} +2 -2
  142. package/dist/_chunks/{map-view-CCAlC9IL.js.map → map-view-CHw4RL6w.js.map} +1 -1
  143. package/dist/_chunks/{marketplace-app-shell-BwH6Aruw.js → marketplace-app-shell-d2EtcUbe.js} +4 -4
  144. package/dist/_chunks/{marketplace-app-shell-BwH6Aruw.js.map → marketplace-app-shell-d2EtcUbe.js.map} +1 -1
  145. package/dist/_chunks/{message-card-Dm5Xshup.js → message-card-V3sFPiQI.js} +3 -3
  146. package/dist/_chunks/{message-card-Dm5Xshup.js.map → message-card-V3sFPiQI.js.map} +1 -1
  147. package/dist/_chunks/{message-tray-BcLyaO-G.js → message-tray-CrRIHfiQ.js} +5 -5
  148. package/dist/_chunks/{message-tray-BcLyaO-G.js.map → message-tray-CrRIHfiQ.js.map} +1 -1
  149. package/dist/_chunks/note-timeline-Dn_XTo1s.js +333 -0
  150. package/dist/_chunks/note-timeline-Dn_XTo1s.js.map +1 -0
  151. package/dist/_chunks/notes-panel-CAD1Ytcj.js +647 -0
  152. package/dist/_chunks/notes-panel-CAD1Ytcj.js.map +1 -0
  153. package/dist/_chunks/{notification-card-ChcK9Wat.js → notification-card-B2gLO6dK.js} +3 -3
  154. package/dist/_chunks/{notification-card-ChcK9Wat.js.map → notification-card-B2gLO6dK.js.map} +1 -1
  155. package/dist/_chunks/{notification-tray-CJ8jOe-U.js → notification-tray-BOEKegVV.js} +5 -5
  156. package/dist/_chunks/{notification-tray-CJ8jOe-U.js.map → notification-tray-BOEKegVV.js.map} +1 -1
  157. package/dist/_chunks/{optical-prescription-cphK41eP.js → optical-prescription-LGgmtcST.js} +2 -2
  158. package/dist/_chunks/{optical-prescription-cphK41eP.js.map → optical-prescription-LGgmtcST.js.map} +1 -1
  159. package/dist/_chunks/{panel-subview-BNXN8OEL.js → panel-subview-Cc2Wtt7D.js} +52 -52
  160. package/dist/_chunks/panel-subview-Cc2Wtt7D.js.map +1 -0
  161. package/dist/_chunks/{patient-details-2cIaL-Zb.js → patient-details-C8ImUrVg.js} +3 -3
  162. package/dist/_chunks/{patient-details-2cIaL-Zb.js.map → patient-details-C8ImUrVg.js.map} +1 -1
  163. package/dist/_chunks/{patient-field-row-IHb2VFc2.js → patient-field-row-BRSOKvme.js} +7 -7
  164. package/dist/_chunks/{patient-field-row-IHb2VFc2.js.map → patient-field-row-BRSOKvme.js.map} +1 -1
  165. package/dist/_chunks/{patient-search-D08b6jgj.js → patient-search-5QcmQKJD.js} +2 -2
  166. package/dist/_chunks/{patient-search-D08b6jgj.js.map → patient-search-5QcmQKJD.js.map} +1 -1
  167. package/dist/_chunks/{patient-summary-card-BzmJH9a-.js → patient-summary-card-BhmKB2KR.js} +8 -8
  168. package/dist/_chunks/patient-summary-card-BhmKB2KR.js.map +1 -0
  169. package/dist/_chunks/{payment-automation-upsell-BLTdE2em.js → payment-automation-upsell-BKmBXU4i.js} +17 -16
  170. package/dist/_chunks/{payment-automation-upsell-BLTdE2em.js.map → payment-automation-upsell-BKmBXU4i.js.map} +1 -1
  171. package/dist/_chunks/{payment-request-card-BxcdvxKR.js → payment-request-card-Cer6XXCn.js} +6 -5
  172. package/dist/_chunks/{payment-request-card-BxcdvxKR.js.map → payment-request-card-Cer6XXCn.js.map} +1 -1
  173. package/dist/_chunks/{periodontal-chart-BF_e3wZp.js → periodontal-chart-DJoZS_o7.js} +2 -2
  174. package/dist/_chunks/{periodontal-chart-BF_e3wZp.js.map → periodontal-chart-DJoZS_o7.js.map} +1 -1
  175. package/dist/_chunks/{periodontal-chart-card-BJEuJuzh.js → periodontal-chart-card-Nd1ZoYWb.js} +2 -2
  176. package/dist/_chunks/{periodontal-chart-card-BJEuJuzh.js.map → periodontal-chart-card-Nd1ZoYWb.js.map} +1 -1
  177. package/dist/_chunks/{popover-DzR5QYxp.js → popover-DO-pssF3.js} +2 -2
  178. package/dist/_chunks/{popover-DzR5QYxp.js.map → popover-DO-pssF3.js.map} +1 -1
  179. package/dist/_chunks/{practice-results-DOcORTkP.js → practice-results-D_jjzwgf.js} +6 -6
  180. package/dist/_chunks/{practice-results-DOcORTkP.js.map → practice-results-D_jjzwgf.js.map} +1 -1
  181. package/dist/_chunks/{pregnancy-dating-nV1_S6w0.js → pregnancy-dating-DcyV9ZRD.js} +2 -2
  182. package/dist/_chunks/{pregnancy-dating-nV1_S6w0.js.map → pregnancy-dating-DcyV9ZRD.js.map} +1 -1
  183. package/dist/_chunks/{pregnancy-weight-gain-tRecShAD.js → pregnancy-weight-gain-Bfq4Kwt5.js} +2 -2
  184. package/dist/_chunks/{pregnancy-weight-gain-tRecShAD.js.map → pregnancy-weight-gain-Bfq4Kwt5.js.map} +1 -1
  185. package/dist/_chunks/{privacy-lock-Be39vQUN.js → privacy-lock-CbFCAMM3.js} +3 -3
  186. package/dist/_chunks/{privacy-lock-Be39vQUN.js.map → privacy-lock-CbFCAMM3.js.map} +1 -1
  187. package/dist/_chunks/{product-hub-panel-C0TO69P7.js → product-hub-panel-w40-_-1s.js} +4 -4
  188. package/dist/_chunks/{product-hub-panel-C0TO69P7.js.map → product-hub-panel-w40-_-1s.js.map} +1 -1
  189. package/dist/_chunks/{public-header.agent-Bl1KFwSE.js → public-header.agent-D-EBVskf.js} +3 -3
  190. package/dist/_chunks/{public-header.agent-Bl1KFwSE.js.map → public-header.agent-D-EBVskf.js.map} +1 -1
  191. package/dist/_chunks/{radiograph-panel.agent-k0G7JuoM.js → radiograph-panel.agent-LrILY2lN.js} +4 -4
  192. package/dist/_chunks/{radiograph-panel.agent-k0G7JuoM.js.map → radiograph-panel.agent-LrILY2lN.js.map} +1 -1
  193. package/dist/_chunks/{receipt-euro-C6k4Gzhr.js → receipt-euro-B1cLM_TN.js} +3 -14
  194. package/dist/_chunks/receipt-euro-B1cLM_TN.js.map +1 -0
  195. package/dist/_chunks/{reviews-panel-BaHZb_ai.js → reviews-panel-2GVuxGeT.js} +5 -5
  196. package/dist/_chunks/{reviews-panel-BaHZb_ai.js.map → reviews-panel-2GVuxGeT.js.map} +1 -1
  197. package/dist/_chunks/{rich-text-editor-BTXlorm5.js → rich-text-editor-C6fE-uP4.js} +5 -5
  198. package/dist/_chunks/{rich-text-editor-BTXlorm5.js.map → rich-text-editor-C6fE-uP4.js.map} +1 -1
  199. package/dist/_chunks/{session-countdown-QMsnRa1x.js → session-countdown-BqppPrw6.js} +2 -2
  200. package/dist/_chunks/{session-countdown-QMsnRa1x.js.map → session-countdown-BqppPrw6.js.map} +1 -1
  201. package/dist/_chunks/{sheet-hm04DGFd.js → sheet-C8WIDFS8.js} +2 -2
  202. package/dist/_chunks/{sheet-hm04DGFd.js.map → sheet-C8WIDFS8.js.map} +1 -1
  203. package/dist/_chunks/{sign-in-with-alfadocs-button-BLe_quy5.js → sign-in-with-alfadocs-button-DWwBJtyE.js} +2 -2
  204. package/dist/_chunks/{sign-in-with-alfadocs-button-BLe_quy5.js.map → sign-in-with-alfadocs-button-DWwBJtyE.js.map} +1 -1
  205. package/dist/_chunks/{signature-request-Dej2g86d.js → signature-request-D_j2aQu1.js} +360 -371
  206. package/dist/_chunks/signature-request-D_j2aQu1.js.map +1 -0
  207. package/dist/_chunks/{skeleton-CZbwyJAA.js → skeleton-B1KTdJ4N.js} +46 -33
  208. package/dist/_chunks/skeleton-B1KTdJ4N.js.map +1 -0
  209. package/dist/_chunks/{slot-grid-8Ko6thzz.js → slot-grid-B3eOPkKD.js} +5 -5
  210. package/dist/_chunks/{slot-grid-8Ko6thzz.js.map → slot-grid-B3eOPkKD.js.map} +1 -1
  211. package/dist/_chunks/{streaming-text-DjFqLSt_.js → streaming-text-CE1u_oGa.js} +2 -2
  212. package/dist/_chunks/{streaming-text-DjFqLSt_.js.map → streaming-text-CE1u_oGa.js.map} +1 -1
  213. package/dist/_chunks/{task-tray-CQ8UAR2j.js → task-tray-DIwjAIes.js} +4 -4
  214. package/dist/_chunks/{task-tray-CQ8UAR2j.js.map → task-tray-DIwjAIes.js.map} +1 -1
  215. package/dist/_chunks/{tasks-panel-CBGMtQ_f.js → tasks-panel-CpcikOeY.js} +6 -6
  216. package/dist/_chunks/{tasks-panel-CBGMtQ_f.js.map → tasks-panel-CpcikOeY.js.map} +1 -1
  217. package/dist/_chunks/{theme-toggle-CMz8YfC1.js → theme-toggle-bI0pgDDv.js} +3 -3
  218. package/dist/_chunks/{theme-toggle-CMz8YfC1.js.map → theme-toggle-bI0pgDDv.js.map} +1 -1
  219. package/dist/_chunks/{toast-8jqtbfAB.js → toast-ZZfhA5u0.js} +2 -2
  220. package/dist/_chunks/{toast-8jqtbfAB.js.map → toast-ZZfhA5u0.js.map} +1 -1
  221. package/dist/_chunks/{token-insert-menu-9Um0JinI.js → token-insert-menu-A9B5AJw6.js} +2 -2
  222. package/dist/_chunks/{token-insert-menu-9Um0JinI.js.map → token-insert-menu-A9B5AJw6.js.map} +1 -1
  223. package/dist/_chunks/tool-rail-D89USYE6.js +799 -0
  224. package/dist/_chunks/tool-rail-D89USYE6.js.map +1 -0
  225. package/dist/_chunks/{tooth-scheme-BWkYxxjR.js → tooth-scheme-DPAq0vQK.js} +3 -3
  226. package/dist/_chunks/{tooth-scheme-BWkYxxjR.js.map → tooth-scheme-DPAq0vQK.js.map} +1 -1
  227. package/dist/_chunks/{transaction-chip-Dth1nThY.js → transaction-chip-CwgcJiqF.js} +47 -46
  228. package/dist/_chunks/{transaction-chip-Dth1nThY.js.map → transaction-chip-CwgcJiqF.js.map} +1 -1
  229. package/dist/_chunks/treatment-receipt-dUm99mdn.js +160 -0
  230. package/dist/_chunks/treatment-receipt-dUm99mdn.js.map +1 -0
  231. package/dist/_chunks/{unit-converter-BTgU50gk.js → unit-converter-C-LpGzrN.js} +2 -2
  232. package/dist/_chunks/{unit-converter-BTgU50gk.js.map → unit-converter-C-LpGzrN.js.map} +1 -1
  233. package/dist/_chunks/user-plus-BtcOLgNU.js +17 -0
  234. package/dist/_chunks/user-plus-BtcOLgNU.js.map +1 -0
  235. package/dist/_chunks/{warning-stack-BW5Dwb3z.js → warning-stack-C0glSB7p.js} +3 -3
  236. package/dist/_chunks/{warning-stack-BW5Dwb3z.js.map → warning-stack-C0glSB7p.js.map} +1 -1
  237. package/dist/_chunks/{workflow-map-CXdsxvUj.js → workflow-map-DhR_h5yw.js} +5 -5
  238. package/dist/_chunks/{workflow-map-CXdsxvUj.js.map → workflow-map-DhR_h5yw.js.map} +1 -1
  239. package/dist/agent-catalog.json +3 -418
  240. package/dist/agent-i18n/en.json +2 -18
  241. package/dist/components/agenda-tray/index.js +1 -1
  242. package/dist/components/ai-consent-banner/index.js +1 -1
  243. package/dist/components/ai-prompt-input/index.js +1 -1
  244. package/dist/components/anamnesis-card/index.js +1 -1
  245. package/dist/components/anamnesis-summary-card/index.js +1 -1
  246. package/dist/components/appointment-card/appointment-card.d.ts +24 -0
  247. package/dist/components/appointment-card/appointment-card.d.ts.map +1 -1
  248. package/dist/components/appointment-card/index.js +2 -2
  249. package/dist/components/appointment-peek/index.js +1 -1
  250. package/dist/components/appointment-timeline/appointment-timeline.d.ts +15 -1
  251. package/dist/components/appointment-timeline/appointment-timeline.d.ts.map +1 -1
  252. package/dist/components/appointment-timeline/index.js +1 -1
  253. package/dist/components/audio-recorder/index.js +1 -1
  254. package/dist/components/bishop-score/index.js +1 -1
  255. package/dist/components/bmi-calculator/index.js +1 -1
  256. package/dist/components/booking/index.js +1 -1
  257. package/dist/components/button/button.d.ts +1 -1
  258. package/dist/components/button/button.d.ts.map +1 -1
  259. package/dist/components/button/index.js +2 -2
  260. package/dist/components/button-group/index.js +1 -1
  261. package/dist/components/calendar/index.js +1 -1
  262. package/dist/components/care-plan-card/index.js +1 -1
  263. package/dist/components/care-plan-entry-card/index.js +1 -1
  264. package/dist/components/care-plan-header/index.js +1 -1
  265. package/dist/components/carousel/index.js +1 -1
  266. package/dist/components/chart/index.js +1 -1
  267. package/dist/components/chat-input/index.js +1 -1
  268. package/dist/components/chat-message/index.js +1 -1
  269. package/dist/components/connection-status/index.js +1 -1
  270. package/dist/components/contact-profile-card/index.js +1 -1
  271. package/dist/components/control-room-rail/index.js +1 -1
  272. package/dist/components/copy-field/index.js +1 -1
  273. package/dist/components/cycle-calculator/index.js +1 -1
  274. package/dist/components/dashboard-grid/index.js +1 -1
  275. package/dist/components/data-table/index.js +4 -4
  276. package/dist/components/data-table-tabs/index.js +1 -1
  277. package/dist/components/description-list/index.js +1 -1
  278. package/dist/components/document-preview/index.js +1 -1
  279. package/dist/components/document-scanner/index.js +1 -1
  280. package/dist/components/due-date-calculator/index.js +1 -1
  281. package/dist/components/editable-description/editable-description.d.ts +6 -0
  282. package/dist/components/editable-description/editable-description.d.ts.map +1 -1
  283. package/dist/components/editable-description/index.js +1 -1
  284. package/dist/components/editor-overlay/index.js +1 -1
  285. package/dist/components/empty-state/index.js +1 -1
  286. package/dist/components/entity-summary/index.js +1 -1
  287. package/dist/components/error-boundary/index.js +1 -1
  288. package/dist/components/face-scheme/index.js +1 -1
  289. package/dist/components/fetal-weight/index.js +1 -1
  290. package/dist/components/field-array/index.js +1 -1
  291. package/dist/components/file-manager/index.js +1 -1
  292. package/dist/components/finished-terminal/index.js +1 -1
  293. package/dist/components/fiscal-code-input/index.js +1 -1
  294. package/dist/components/freemium-paywall/index.js +1 -1
  295. package/dist/components/gestational-age-calculator/index.js +1 -1
  296. package/dist/components/hcg-doubling/index.js +1 -1
  297. package/dist/components/header/index.js +1 -1
  298. package/dist/components/header-settings/index.js +1 -1
  299. package/dist/components/hover-card/index.js +1 -1
  300. package/dist/components/icon-button/index.js +1 -1
  301. package/dist/components/icon-button-group/index.js +1 -1
  302. package/dist/components/icon-picker/index.js +1 -1
  303. package/dist/components/image-cropper/index.js +1 -1
  304. package/dist/components/info-tip/index.js +1 -1
  305. package/dist/components/key-value-pair/index.js +1 -1
  306. package/dist/components/locale-picker/index.js +1 -1
  307. package/dist/components/map-view/index.js +1 -1
  308. package/dist/components/message-card/index.js +1 -1
  309. package/dist/components/message-tray/index.js +1 -1
  310. package/dist/components/note-timeline/index.js +1 -1
  311. package/dist/components/note-timeline/note-timeline.d.ts +17 -0
  312. package/dist/components/note-timeline/note-timeline.d.ts.map +1 -1
  313. package/dist/components/notes-panel/index.js +1 -1
  314. package/dist/components/notes-panel/notes-panel.d.ts +5 -4
  315. package/dist/components/notes-panel/notes-panel.d.ts.map +1 -1
  316. package/dist/components/notification-card/index.js +1 -1
  317. package/dist/components/notification-tray/index.js +1 -1
  318. package/dist/components/optical-prescription/index.js +1 -1
  319. package/dist/components/panel-subview/index.js +1 -1
  320. package/dist/components/panel-subview/panel-subview.d.ts.map +1 -1
  321. package/dist/components/patient-details/index.js +1 -1
  322. package/dist/components/patient-search/index.js +1 -1
  323. package/dist/components/patient-summary-card/index.js +1 -1
  324. package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -1
  325. package/dist/components/patient-table/index.js +1 -1
  326. package/dist/components/payment-card/index.js +1 -1
  327. package/dist/components/periodontal-chart/index.js +1 -1
  328. package/dist/components/periodontal-chart-card/index.js +1 -1
  329. package/dist/components/popover/index.js +1 -1
  330. package/dist/components/practice-results/index.js +1 -1
  331. package/dist/components/pregnancy-dating/index.js +1 -1
  332. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  333. package/dist/components/privacy-lock/index.js +1 -1
  334. package/dist/components/product-hub-tray/index.js +1 -1
  335. package/dist/components/public-header/index.js +1 -1
  336. package/dist/components/radiograph-panel/index.js +1 -1
  337. package/dist/components/reviews-panel/index.js +1 -1
  338. package/dist/components/rich-text-editor/index.js +1 -1
  339. package/dist/components/session-countdown/index.js +1 -1
  340. package/dist/components/sheet/index.js +1 -1
  341. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  342. package/dist/components/skeleton/index.d.ts +1 -1
  343. package/dist/components/skeleton/index.d.ts.map +1 -1
  344. package/dist/components/skeleton/index.js +3 -2
  345. package/dist/components/skeleton/skeleton.d.ts +12 -0
  346. package/dist/components/skeleton/skeleton.d.ts.map +1 -1
  347. package/dist/components/slot-grid/index.js +1 -1
  348. package/dist/components/streaming-text/index.js +1 -1
  349. package/dist/components/task-tray/index.js +1 -1
  350. package/dist/components/tasks-panel/index.js +1 -1
  351. package/dist/components/theme-toggle/index.js +1 -1
  352. package/dist/components/toast/index.js +1 -1
  353. package/dist/components/token-insert-menu/index.js +1 -1
  354. package/dist/components/tool-rail/index.js +1 -1
  355. package/dist/components/tool-rail/tool-rail.d.ts.map +1 -1
  356. package/dist/components/tooth-scheme/index.js +1 -1
  357. package/dist/components/transaction-chip/index.js +1 -1
  358. package/dist/components/transaction-chip/transaction-chip.d.ts +7 -0
  359. package/dist/components/transaction-chip/transaction-chip.d.ts.map +1 -1
  360. package/dist/components/treatment-receipt/index.js +1 -1
  361. package/dist/components/treatment-receipt/treatment-receipt.d.ts +8 -0
  362. package/dist/components/treatment-receipt/treatment-receipt.d.ts.map +1 -1
  363. package/dist/components/unit-converter/index.js +1 -1
  364. package/dist/components/warning-stack/index.js +1 -1
  365. package/dist/components/workflow/index.js +1 -1
  366. package/dist/host-compat.css +13 -4
  367. package/dist/i18n/locales/ar.d.ts +235 -183
  368. package/dist/i18n/locales/ar.d.ts.map +1 -1
  369. package/dist/i18n/locales/ar.js +239 -187
  370. package/dist/i18n/locales/ar.js.map +1 -1
  371. package/dist/i18n/locales/de.d.ts +219 -167
  372. package/dist/i18n/locales/de.d.ts.map +1 -1
  373. package/dist/i18n/locales/de.js +223 -171
  374. package/dist/i18n/locales/de.js.map +1 -1
  375. package/dist/i18n/locales/el.d.ts +234 -182
  376. package/dist/i18n/locales/el.d.ts.map +1 -1
  377. package/dist/i18n/locales/el.js +238 -186
  378. package/dist/i18n/locales/el.js.map +1 -1
  379. package/dist/i18n/locales/en.d.ts +52 -0
  380. package/dist/i18n/locales/en.d.ts.map +1 -1
  381. package/dist/i18n/locales/en.js +56 -4
  382. package/dist/i18n/locales/en.js.map +1 -1
  383. package/dist/i18n/locales/es.d.ts +227 -175
  384. package/dist/i18n/locales/es.d.ts.map +1 -1
  385. package/dist/i18n/locales/es.js +231 -179
  386. package/dist/i18n/locales/es.js.map +1 -1
  387. package/dist/i18n/locales/fr.d.ts +221 -169
  388. package/dist/i18n/locales/fr.d.ts.map +1 -1
  389. package/dist/i18n/locales/fr.js +225 -173
  390. package/dist/i18n/locales/fr.js.map +1 -1
  391. package/dist/i18n/locales/hi.d.ts +235 -183
  392. package/dist/i18n/locales/hi.d.ts.map +1 -1
  393. package/dist/i18n/locales/hi.js +243 -187
  394. package/dist/i18n/locales/hi.js.map +1 -1
  395. package/dist/i18n/locales/it.d.ts +179 -127
  396. package/dist/i18n/locales/it.d.ts.map +1 -1
  397. package/dist/i18n/locales/it.js +183 -131
  398. package/dist/i18n/locales/it.js.map +1 -1
  399. package/dist/i18n/locales/ja.d.ts +233 -181
  400. package/dist/i18n/locales/ja.d.ts.map +1 -1
  401. package/dist/i18n/locales/ja.js +237 -185
  402. package/dist/i18n/locales/ja.js.map +1 -1
  403. package/dist/i18n/locales/nl.d.ts +224 -172
  404. package/dist/i18n/locales/nl.d.ts.map +1 -1
  405. package/dist/i18n/locales/nl.js +228 -176
  406. package/dist/i18n/locales/nl.js.map +1 -1
  407. package/dist/i18n/locales/pl.d.ts +229 -177
  408. package/dist/i18n/locales/pl.d.ts.map +1 -1
  409. package/dist/i18n/locales/pl.js +233 -181
  410. package/dist/i18n/locales/pl.js.map +1 -1
  411. package/dist/i18n/locales/pt.d.ts +229 -177
  412. package/dist/i18n/locales/pt.d.ts.map +1 -1
  413. package/dist/i18n/locales/pt.js +233 -181
  414. package/dist/i18n/locales/pt.js.map +1 -1
  415. package/dist/i18n/locales/ro.d.ts +228 -176
  416. package/dist/i18n/locales/ro.d.ts.map +1 -1
  417. package/dist/i18n/locales/ro.js +232 -180
  418. package/dist/i18n/locales/ro.js.map +1 -1
  419. package/dist/i18n/locales/ru.d.ts +234 -182
  420. package/dist/i18n/locales/ru.d.ts.map +1 -1
  421. package/dist/i18n/locales/ru.js +238 -186
  422. package/dist/i18n/locales/ru.js.map +1 -1
  423. package/dist/i18n/locales/sq.d.ts +228 -176
  424. package/dist/i18n/locales/sq.d.ts.map +1 -1
  425. package/dist/i18n/locales/sq.js +232 -180
  426. package/dist/i18n/locales/sq.js.map +1 -1
  427. package/dist/i18n/locales/sv.d.ts +229 -177
  428. package/dist/i18n/locales/sv.d.ts.map +1 -1
  429. package/dist/i18n/locales/sv.js +233 -181
  430. package/dist/i18n/locales/sv.js.map +1 -1
  431. package/dist/i18n/locales/tr.d.ts +235 -183
  432. package/dist/i18n/locales/tr.d.ts.map +1 -1
  433. package/dist/i18n/locales/tr.js +239 -187
  434. package/dist/i18n/locales/tr.js.map +1 -1
  435. package/dist/i18n/locales/zh.d.ts +228 -176
  436. package/dist/i18n/locales/zh.d.ts.map +1 -1
  437. package/dist/i18n/locales/zh.js +232 -180
  438. package/dist/i18n/locales/zh.js.map +1 -1
  439. package/dist/index.js +785 -784
  440. package/dist/locales/ar.json +239 -187
  441. package/dist/locales/de.json +223 -171
  442. package/dist/locales/el.json +238 -186
  443. package/dist/locales/en.json +56 -4
  444. package/dist/locales/es.json +231 -179
  445. package/dist/locales/fr.json +225 -173
  446. package/dist/locales/hi.json +239 -187
  447. package/dist/locales/it.json +183 -131
  448. package/dist/locales/ja.json +237 -185
  449. package/dist/locales/nl.json +228 -176
  450. package/dist/locales/pl.json +233 -181
  451. package/dist/locales/pt.json +233 -181
  452. package/dist/locales/ro.json +232 -180
  453. package/dist/locales/ru.json +238 -186
  454. package/dist/locales/sq.json +232 -180
  455. package/dist/locales/sv.json +233 -181
  456. package/dist/locales/tr.json +239 -187
  457. package/dist/locales/zh.json +232 -180
  458. package/dist/patterns/alia-assistant/index.js +1 -1
  459. package/dist/patterns/anamnesis/index.js +1 -1
  460. package/dist/patterns/calendar/calendar-appointment-details.d.ts +8 -1
  461. package/dist/patterns/calendar/calendar-appointment-details.d.ts.map +1 -1
  462. package/dist/patterns/calendar/calendar-appointment-details.sections.d.ts +10 -5
  463. package/dist/patterns/calendar/calendar-appointment-details.sections.d.ts.map +1 -1
  464. package/dist/patterns/calendar/calendar-bookings-panel.d.ts +31 -0
  465. package/dist/patterns/calendar/calendar-bookings-panel.d.ts.map +1 -0
  466. package/dist/patterns/calendar/calendar-editor-hydration.d.ts +0 -2
  467. package/dist/patterns/calendar/calendar-editor-hydration.d.ts.map +1 -1
  468. package/dist/patterns/calendar/calendar-info-hover.d.ts +15 -1
  469. package/dist/patterns/calendar/calendar-info-hover.d.ts.map +1 -1
  470. package/dist/patterns/calendar/calendar-privacy.d.ts +23 -0
  471. package/dist/patterns/calendar/calendar-privacy.d.ts.map +1 -0
  472. package/dist/patterns/calendar/calendar-rail-settle.d.ts +14 -0
  473. package/dist/patterns/calendar/calendar-rail-settle.d.ts.map +1 -0
  474. package/dist/patterns/calendar/calendar-upcoming-panel.d.ts +32 -0
  475. package/dist/patterns/calendar/calendar-upcoming-panel.d.ts.map +1 -0
  476. package/dist/patterns/calendar/calendar-waiting-list-panel.d.ts +62 -0
  477. package/dist/patterns/calendar/calendar-waiting-list-panel.d.ts.map +1 -0
  478. package/dist/patterns/calendar/calendar-workspace.d.ts +14 -1
  479. package/dist/patterns/calendar/calendar-workspace.d.ts.map +1 -1
  480. package/dist/patterns/calendar/calendar-workspace.model.d.ts +37 -1
  481. package/dist/patterns/calendar/calendar-workspace.model.d.ts.map +1 -1
  482. package/dist/patterns/calendar/calendar.model.d.ts +8 -2
  483. package/dist/patterns/calendar/calendar.model.d.ts.map +1 -1
  484. package/dist/patterns/calendar/calendar.sheets.d.ts +43 -27
  485. package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -1
  486. package/dist/patterns/calendar/calendar.surface.d.ts.map +1 -1
  487. package/dist/patterns/calendar/calendar.types.d.ts +6 -0
  488. package/dist/patterns/calendar/calendar.types.d.ts.map +1 -1
  489. package/dist/patterns/calendar/index.d.ts +2 -2
  490. package/dist/patterns/calendar/index.d.ts.map +1 -1
  491. package/dist/patterns/calendar/index.js +1 -1
  492. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  493. package/dist/patterns/payment-automation-upsell/index.js +1 -1
  494. package/dist/patterns/signature-request/index.js +1 -1
  495. package/dist/tokens.css +1 -1
  496. package/package.json +3 -1
  497. package/dist/_chunks/appointment-card-WsDGBBut.js.map +0 -1
  498. package/dist/_chunks/appointment-timeline-ByfovxqR.js.map +0 -1
  499. package/dist/_chunks/button-nJaPh_HC.js.map +0 -1
  500. package/dist/_chunks/calendar-workspace-BqKBj26r.js +0 -9715
  501. package/dist/_chunks/calendar-workspace-BqKBj26r.js.map +0 -1
  502. package/dist/_chunks/editable-description-BOfAeY3T.js +0 -112
  503. package/dist/_chunks/editable-description-BOfAeY3T.js.map +0 -1
  504. package/dist/_chunks/file-manager-DvkFgj7d.js.map +0 -1
  505. package/dist/_chunks/note-timeline-CXfSV3yX.js +0 -231
  506. package/dist/_chunks/note-timeline-CXfSV3yX.js.map +0 -1
  507. package/dist/_chunks/notes-panel-4y5JioWN.js +0 -556
  508. package/dist/_chunks/notes-panel-4y5JioWN.js.map +0 -1
  509. package/dist/_chunks/panel-subview-BNXN8OEL.js.map +0 -1
  510. package/dist/_chunks/patient-summary-card-BzmJH9a-.js.map +0 -1
  511. package/dist/_chunks/receipt-euro-C6k4Gzhr.js.map +0 -1
  512. package/dist/_chunks/signature-request-Dej2g86d.js.map +0 -1
  513. package/dist/_chunks/skeleton-CZbwyJAA.js.map +0 -1
  514. package/dist/_chunks/tool-rail-BP8sjxCw.js +0 -667
  515. package/dist/_chunks/tool-rail-BP8sjxCw.js.map +0 -1
  516. package/dist/_chunks/treatment-receipt-D4kOLXOk.js +0 -94
  517. package/dist/_chunks/treatment-receipt-D4kOLXOk.js.map +0 -1
@@ -0,0 +1,142 @@
1
+ import { jsx as s, jsxs as t } from "react/jsx-runtime";
2
+ import { forwardRef as z, useState as I, useRef as T, useMemo as V } from "react";
3
+ import { c as i } from "./index-D2ZczOXr.js";
4
+ import { useTranslation as L } from "react-i18next";
5
+ import { B as M } from "./button-CaUe1uyd.js";
6
+ import { I as _ } from "./icon-button-CehAeZoP.js";
7
+ import { C as $, S as R } from "./skeleton-B1KTdJ4N.js";
8
+ import { P as A } from "./pencil-B1sKKyuT.js";
9
+ const x = i(
10
+ "ds:flex ds:min-w-0 ds:items-start ds:gap-[var(--spacing-xs)]"
11
+ ), b = i(
12
+ [
13
+ "ds:m-0 ds:flex ds:min-w-0 ds:flex-1 ds:list-none ds:flex-col ds:p-0",
14
+ "ds:gap-[var(--spacing-2xs)]"
15
+ ].join(" ")
16
+ ), O = ["80%", "60%", "66%"], P = i(
17
+ "ds:m-0 ds:min-w-0 ds:flex-1 type-body-sm ds:text-[color:var(--muted-foreground)]"
18
+ ), v = i(
19
+ "ds:flex ds:items-start ds:gap-[var(--spacing-xs)] type-body-sm ds:text-[color:var(--foreground)]"
20
+ ), N = i(
21
+ [
22
+ "ds:mt-[var(--spacing-sm)] ds:size-[var(--spacing-xs)] ds:shrink-0 ds:self-start",
23
+ "ds:rounded-[var(--radius-full)] ds:bg-[color:var(--border)]"
24
+ ].join(" ")
25
+ ), G = z(
26
+ ({
27
+ value: c,
28
+ maxLines: r = 3,
29
+ loading: d = !1,
30
+ onEdit: m,
31
+ editButtonRef: y,
32
+ emptyLabel: w,
33
+ editLabel: D,
34
+ seeMoreLabel: E,
35
+ showLessLabel: k,
36
+ className: p,
37
+ ...f
38
+ }, u) => {
39
+ const { t: n } = L(), [o, C] = I(!1), h = T(!1);
40
+ d && (h.current = !0);
41
+ const j = h.current ? $ : "", a = V(
42
+ () => (c ?? "").split(/\r?\n/).map((e) => e.trim()).filter(Boolean),
43
+ [c]
44
+ ), B = Math.max(0, a.length - r), S = o ? a : a.slice(0, r), g = D ?? n("editableDescription.edit");
45
+ return d && a.length === 0 ? /* @__PURE__ */ s(
46
+ "div",
47
+ {
48
+ ...f,
49
+ ref: u,
50
+ "data-component": "editable-description",
51
+ "data-loading": "",
52
+ "aria-busy": "true",
53
+ className: [x(), p].filter(Boolean).join(" "),
54
+ children: /* @__PURE__ */ s("ul", { "aria-hidden": "true", className: b(), children: O.slice(0, Math.max(1, r)).map(
55
+ (e, l) => /* @__PURE__ */ t("li", { className: v(), children: [
56
+ /* @__PURE__ */ s("span", { className: N() }),
57
+ /* @__PURE__ */ s(
58
+ R,
59
+ {
60
+ variant: "text",
61
+ size: "sm",
62
+ stagger: l,
63
+ width: e,
64
+ className: "ds:mt-[var(--spacing-xs)]"
65
+ }
66
+ )
67
+ ] }, e)
68
+ ) })
69
+ }
70
+ ) : /* @__PURE__ */ t(
71
+ "div",
72
+ {
73
+ ...f,
74
+ ref: u,
75
+ "data-component": "editable-description",
76
+ "data-empty": a.length === 0 ? "" : void 0,
77
+ "aria-busy": d || void 0,
78
+ className: [x(), p].filter(Boolean).join(" "),
79
+ children: [
80
+ a.length === 0 ? /* @__PURE__ */ s("p", { "data-editable-description-empty": "", className: P(), children: w ?? n("editableDescription.empty") }) : /* @__PURE__ */ t("ul", { className: `${b()} ${j}`.trim(), children: [
81
+ S.map((e, l) => /* @__PURE__ */ t(
82
+ "li",
83
+ {
84
+ "data-editable-description-line": "",
85
+ className: v(),
86
+ children: [
87
+ /* @__PURE__ */ s("span", { "aria-hidden": "true", className: N() }),
88
+ /* @__PURE__ */ s("span", { className: "ds:min-w-0 ds:[overflow-wrap:anywhere]", children: e })
89
+ ]
90
+ },
91
+ `${l}-${e}`
92
+ )),
93
+ B > 0 ? (
94
+ // An ITEM of the list, aligned with the text rather than the
95
+ // dots, so opening it does not shift the column.
96
+ /* @__PURE__ */ t("li", { className: "ds:flex ds:items-start ds:gap-[var(--spacing-xs)]", children: [
97
+ /* @__PURE__ */ s(
98
+ "span",
99
+ {
100
+ "aria-hidden": "true",
101
+ className: "ds:size-[var(--spacing-xs)] ds:shrink-0"
102
+ }
103
+ ),
104
+ /* @__PURE__ */ s(
105
+ M,
106
+ {
107
+ intent: "link",
108
+ size: "sm",
109
+ "data-editable-description-toggle": "",
110
+ className: "ds:!ps-0 ds:!pe-0",
111
+ "aria-expanded": o,
112
+ onClick: () => C((e) => !e),
113
+ children: o ? k ?? n("editableDescription.showLess") : E ?? n("editableDescription.seeMore")
114
+ }
115
+ )
116
+ ] })
117
+ ) : null
118
+ ] }),
119
+ m ? /* @__PURE__ */ s(
120
+ _,
121
+ {
122
+ ref: y,
123
+ icon: /* @__PURE__ */ s(A, { "aria-hidden": "true" }),
124
+ intent: "ghost",
125
+ size: "sm",
126
+ className: "ds:-mt-[var(--spacing-sm)] ds:shrink-0",
127
+ "aria-label": g,
128
+ tooltip: g,
129
+ "data-editable-description-edit": "",
130
+ onClick: m
131
+ }
132
+ ) : null
133
+ ]
134
+ }
135
+ );
136
+ }
137
+ );
138
+ G.displayName = "EditableDescription";
139
+ export {
140
+ G as E
141
+ };
142
+ //# sourceMappingURL=editable-description-ADMVFPUz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editable-description-ADMVFPUz.js","sources":["../../src/components/editable-description/editable-description.tsx"],"sourcesContent":["import {\n forwardRef,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type Ref,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { Pencil } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '../button/button';\nimport { IconButton } from '../button/icon-button';\nimport { CONTENT_ENTER_CLASS, Skeleton } from '../skeleton/skeleton';\n\n/* -------------------------------------------------------------------- */\n/* EditableDescription */\n/* */\n/* A record's free-text description, set as bulleted lines, with a pencil */\n/* beside it when the reader may edit. An appointment's description, a */\n/* task's description, a treatment's remark. PLAIN text only: patient */\n/* notes are rich text and belong to NotesPanel and NoteTimeline. */\n/* */\n/* In practice this text is written as a list (\"sensitive lower left\", */\n/* \"review the bitewings\", \"allow extra time\"), so it is set as one, a */\n/* dot per line, rather than as a paragraph pretending to be prose. */\n/* */\n/* Long descriptions cut at the LINE, not at a rendered row: `maxLines` */\n/* bullets, then a \"See more\" that is itself an item of the list, so the */\n/* column does not shift when it opens. */\n/* */\n/* It DISPLAYS and asks to edit; it does not own the editor. `onEdit` */\n/* hands over to the host, which opens its form, in a rail panel a */\n/* `PanelSubview` with a `TextArea`. Omit `onEdit` for a read-only view. */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:min-w-0 ds:items-start ds:gap-[var(--spacing-xs)]',\n);\n\nconst listVariants = cva(\n [\n 'ds:m-0 ds:flex ds:min-w-0 ds:flex-1 ds:list-none ds:flex-col ds:p-0',\n 'ds:gap-[var(--spacing-2xs)]',\n ].join(' '),\n);\n\n/* Ragged on purpose: three lines of one length read as a block, not text. */\nconst LOADING_LINE_WIDTHS = ['80%', '60%', '66%'] as const;\n\nconst emptyVariants = cva(\n 'ds:m-0 ds:min-w-0 ds:flex-1 type-body-sm ds:text-[color:var(--muted-foreground)]',\n);\n\nconst lineVariants = cva(\n 'ds:flex ds:items-start ds:gap-[var(--spacing-xs)] type-body-sm ds:text-[color:var(--foreground)]',\n);\n\n/* `--spacing-sm` is (line-height − dot) / 2 for this type scale, so the dot\n centres on the FIRST line; `self-start` keeps it there when a line wraps. */\nconst dotVariants = cva(\n [\n 'ds:mt-[var(--spacing-sm)] ds:size-[var(--spacing-xs)] ds:shrink-0 ds:self-start',\n 'ds:rounded-[var(--radius-full)] ds:bg-[color:var(--border)]',\n ].join(' '),\n);\n\nexport interface EditableDescriptionProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> {\n /** The description. One bullet per non-empty line. */\n value?: string | null;\n /** Lines shown before the rest go behind \"See more\". Default `3`. */\n maxLines?: number;\n /**\n * The description is being read. With nothing to show yet, it renders\n * bulleted placeholder lines and no pencil. With a `value` already on screen\n * (a refresh) it keeps the text and only sets `aria-busy`.\n */\n loading?: boolean;\n /** Fires from the pencil. Omit for a read-only description. */\n onEdit?: () => void;\n /** Receives the pencil button, so a host can return focus to it. */\n editButtonRef?: Ref<HTMLButtonElement>;\n /** Shown when there are no lines. Defaults to the kit's translated text. */\n emptyLabel?: string;\n /** Accessible name and tooltip of the pencil. Defaults to the kit's text. */\n editLabel?: string;\n /** Disclosure labels. Default to the kit's translated text. */\n seeMoreLabel?: string;\n showLessLabel?: string;\n}\n\nexport const EditableDescription = forwardRef<\n HTMLDivElement,\n EditableDescriptionProps\n>(\n (\n {\n value,\n maxLines = 3,\n loading = false,\n onEdit,\n editButtonRef,\n emptyLabel,\n editLabel,\n seeMoreLabel,\n showLessLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const [expanded, setExpanded] = useState(false);\n /* Settle in only when this content REPLACES a skeleton. Content that was\n simply there from the start must not fade: it would read as invisible\n for one animation to any test or reader that looks at once. */\n const followedLoading = useRef(false);\n if (loading) followedLoading.current = true;\n const enterClass = followedLoading.current ? CONTENT_ENTER_CLASS : '';\n\n const lines = useMemo(\n () =>\n (value ?? '')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean),\n [value],\n );\n\n const hiddenCount = Math.max(0, lines.length - maxLines);\n const shown = expanded ? lines : lines.slice(0, maxLines);\n const resolvedEditLabel = editLabel ?? t('editableDescription.edit');\n\n // A first read shows the placeholder. A REFRESH keeps the lines it has and\n // only marks the block busy: real text never gives way to a skeleton.\n if (loading && lines.length === 0) {\n return (\n <div\n {...rest}\n ref={ref}\n data-component=\"editable-description\"\n data-loading=\"\"\n aria-busy=\"true\"\n className={[rootVariants(), className].filter(Boolean).join(' ')}\n >\n <ul aria-hidden=\"true\" className={listVariants()}>\n {LOADING_LINE_WIDTHS.slice(0, Math.max(1, maxLines)).map(\n (width, index) => (\n <li key={width} className={lineVariants()}>\n <span className={dotVariants()} />\n <Skeleton\n variant=\"text\"\n size=\"sm\"\n stagger={index}\n width={width}\n className=\"ds:mt-[var(--spacing-xs)]\"\n />\n </li>\n ),\n )}\n </ul>\n </div>\n );\n }\n\n return (\n <div\n {...rest}\n ref={ref}\n data-component=\"editable-description\"\n data-empty={lines.length === 0 ? '' : undefined}\n aria-busy={loading || undefined}\n className={[rootVariants(), className].filter(Boolean).join(' ')}\n >\n {lines.length === 0 ? (\n <p data-editable-description-empty=\"\" className={emptyVariants()}>\n {emptyLabel ?? t('editableDescription.empty')}\n </p>\n ) : (\n <ul className={`${listVariants()} ${enterClass}`.trim()}>\n {shown.map((line, index) => (\n <li\n key={`${index}-${line}`}\n data-editable-description-line=\"\"\n className={lineVariants()}\n >\n <span aria-hidden=\"true\" className={dotVariants()} />\n <span className=\"ds:min-w-0 ds:[overflow-wrap:anywhere]\">\n {line}\n </span>\n </li>\n ))}\n {hiddenCount > 0 ? (\n // An ITEM of the list, aligned with the text rather than the\n // dots, so opening it does not shift the column.\n <li className=\"ds:flex ds:items-start ds:gap-[var(--spacing-xs)]\">\n <span\n aria-hidden=\"true\"\n className=\"ds:size-[var(--spacing-xs)] ds:shrink-0\"\n />\n <Button\n intent=\"link\"\n size=\"sm\"\n data-editable-description-toggle=\"\"\n className=\"ds:!ps-0 ds:!pe-0\"\n aria-expanded={expanded}\n onClick={() => setExpanded((previous) => !previous)}\n >\n {expanded\n ? (showLessLabel ?? t('editableDescription.showLess'))\n : (seeMoreLabel ?? t('editableDescription.seeMore'))}\n </Button>\n </li>\n ) : null}\n </ul>\n )}\n {onEdit ? (\n <IconButton\n ref={editButtonRef}\n icon={<Pencil aria-hidden=\"true\" />}\n intent=\"ghost\"\n size=\"sm\"\n // Pulled up so the 2rem button centres on the first text line.\n className=\"ds:-mt-[var(--spacing-sm)] ds:shrink-0\"\n aria-label={resolvedEditLabel}\n tooltip={resolvedEditLabel}\n data-editable-description-edit=\"\"\n onClick={onEdit}\n />\n ) : null}\n </div>\n );\n },\n);\nEditableDescription.displayName = 'EditableDescription';\n"],"names":["rootVariants","cva","listVariants","LOADING_LINE_WIDTHS","emptyVariants","lineVariants","dotVariants","EditableDescription","forwardRef","value","maxLines","loading","onEdit","editButtonRef","emptyLabel","editLabel","seeMoreLabel","showLessLabel","className","rest","ref","t","useTranslation","expanded","setExpanded","useState","followedLoading","useRef","enterClass","CONTENT_ENTER_CLASS","lines","useMemo","line","hiddenCount","shown","resolvedEditLabel","jsx","width","index","Skeleton","jsxs","Button","previous","IconButton","Pencil"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx as s, jsxs as f } from "react/jsx-runtime";
2
2
  import { useRef as p, useId as w, useCallback as y, useEffect as k } from "react";
3
3
  import { useTranslation as E } from "react-i18next";
4
4
  import { c as j } from "./index-D2ZczOXr.js";
5
- import { I } from "./icon-button-8xqRnkdG.js";
5
+ import { I } from "./icon-button-CehAeZoP.js";
6
6
  import { X as N } from "./x-B5YnXwCz.js";
7
7
  const z = j(
8
8
  [
@@ -86,4 +86,4 @@ function D({
86
86
  export {
87
87
  D as E
88
88
  };
89
- //# sourceMappingURL=editor-overlay-8fKAcRsm.js.map
89
+ //# sourceMappingURL=editor-overlay-9tcPXNWt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"editor-overlay-8fKAcRsm.js","sources":["../../src/components/editor-overlay/editor-overlay.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* EditorOverlay — a non-modal, liquid-glass bar docked INSIDE an */\n/* editor region (Gemini / Mac Mail \"Help me write\" style). */\n/* */\n/* Unlike Dialog it does NOT centre on screen, trap focus, or make the */\n/* page inert — and there is NO scrim, so the editor stays visible and */\n/* usable behind it. It expands from the AI pill into a frosted, */\n/* translucent, rounded bar across the editor's block-end edge. The */\n/* host must be `position: relative` (the RichTextEditor editor region */\n/* is); the overlay anchors to it absolutely. Escape and the close */\n/* button dismiss it. Reusable for any editor-attached surface (AI */\n/* draft, future inline tools). */\n/* ------------------------------------------------------------------ */\n\nimport { useCallback, useEffect, useId, useRef, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { cva } from 'class-variance-authority';\n\nimport { IconButton } from '../button';\n\nexport interface EditorOverlayProps {\n /** Controlled visibility. */\n open: boolean;\n /** Close request (Escape or the close button). */\n onClose: () => void;\n /** Optional visible heading; renders a header row with a close button. */\n title?: ReactNode;\n /** Accessible name for the overlay region (use when there is no visible title). */\n ariaLabel?: string;\n /** Body content. */\n children: ReactNode;\n /** Optional footer slot (e.g. action buttons), right-aligned. */\n footer?: ReactNode;\n /**\n * Opaque instance id, emitted on the wrapper as `data-component-id`. Pass it\n * when more than one overlay can be mounted so an agent / automation tool can\n * tell them apart (PRS §26 §6).\n */\n id?: string;\n /** Extra classes on the glass card. */\n className?: string;\n}\n\n// Non-blocking liquid-glass bar docked across the editor's block-end edge,\n// expanding from the AI pill. No scrim — the editor stays visible + usable.\nconst cardVariants = cva(\n [\n // Spans the editor's block-end edge (a docked bar) and expands from the pill.\n 'ds:absolute ds:z-20',\n 'ds:[inset-inline-start:var(--spacing-md)] ds:[inset-inline-end:var(--spacing-md)]',\n 'ds:[inset-block-end:var(--spacing-md)]',\n // Slim docked bar — compact but with a little breathing room.\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-lg)]',\n // Apple \"Liquid Glass\": a translucent base + backdrop blur/saturate so the\n // editor shows through, a specular top \"rim\" + inner hairline ring, and a\n // soft drop shadow for a floating slab. --card-border is theme-aware (dark\n // hairline on light themes, bright on dark), so the rim reads in all four.\n 'ds:bg-[color-mix(in_srgb,var(--popover)_64%,transparent)]',\n 'ds:backdrop-blur-xl ds:backdrop-saturate-150',\n 'ds:border ds:border-[color-mix(in_srgb,var(--card-border)_70%,transparent)]',\n 'ds:shadow-[inset_0_1px_0_0_var(--card-border),inset_0_0_0_1px_color-mix(in_srgb,var(--card-border)_35%,transparent),var(--shadow-lg)]',\n // Liquid-glass grow out of the pill (bottom-inline-end origin).\n 'ds:origin-bottom-right ds:animate-in ds:fade-in-0 ds:zoom-in-95',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n);\n\nconst titleClass =\n 'ds:text-[length:var(--font-size-base)] ds:font-medium ds:text-[color:var(--foreground)]';\n\nexport function EditorOverlay({\n open,\n onClose,\n title,\n ariaLabel,\n children,\n footer,\n id,\n className,\n}: EditorOverlayProps): React.JSX.Element | null {\n const { t } = useTranslation();\n const cardRef = useRef<HTMLDivElement>(null);\n const restoreFocusRef = useRef<HTMLElement | null>(null);\n const titleId = useId();\n\n const handleClose = useCallback(() => onClose(), [onClose]);\n\n useEffect(() => {\n if (!open) return undefined;\n restoreFocusRef.current = document.activeElement as HTMLElement | null;\n // Move focus into the overlay (non-modal: we don't trap it, just seed it).\n const raf = window.requestAnimationFrame(() => {\n const focusable = cardRef.current?.querySelector<HTMLElement>(\n 'input, textarea, button, [tabindex]:not([tabindex=\"-1\"])',\n );\n (focusable ?? cardRef.current)?.focus();\n });\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n handleClose();\n }\n };\n document.addEventListener('keydown', onKeyDown);\n return () => {\n window.cancelAnimationFrame(raf);\n document.removeEventListener('keydown', onKeyDown);\n restoreFocusRef.current?.focus?.();\n };\n }, [open, handleClose]);\n\n if (!open) return null;\n\n return (\n <div data-component=\"editor-overlay\" data-component-id={id}>\n <div\n ref={cardRef}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={title ? titleId : undefined}\n aria-label={title ? undefined : ariaLabel}\n tabIndex={-1}\n className={[cardVariants(), className].filter(Boolean).join(' ')}\n >\n {/* Header only when there's a visible title — a title-less overlay is a\n header-less composer (named via ariaLabel) whose consumer provides\n its own inline close so no empty band is reserved for it. */}\n {title ? (\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <div id={titleId} className={titleClass}>\n {title}\n </div>\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<X />}\n aria-label={t('common.close')}\n onClick={handleClose}\n />\n </div>\n ) : null}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {children}\n </div>\n {footer ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-sm)]\">\n {footer}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n"],"names":["cardVariants","cva","titleClass","EditorOverlay","open","onClose","title","ariaLabel","children","footer","id","className","t","useTranslation","cardRef","useRef","restoreFocusRef","titleId","useId","handleClose","useCallback","useEffect","raf","_b","_a","onKeyDown","event","jsx","jsxs","IconButton","X"],"mappings":";;;;;;AA8CA,MAAMA,IAAeC;AAAA,EACnB;AAAA;AAAA,IAEE;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMC,IACJ;AAEK,SAASC,EAAc;AAAA,EAC5B,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,IAAAC;AAAA,EACA,WAAAC;AACF,GAAiD;AAC/C,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAUC,EAAuB,IAAI,GACrCC,IAAkBD,EAA2B,IAAI,GACjDE,IAAUC,EAAA,GAEVC,IAAcC,EAAY,MAAMf,KAAW,CAACA,CAAO,CAAC;AA0B1D,SAxBAgB,EAAU,MAAM;AACd,QAAI,CAACjB,EAAM;AACX,IAAAY,EAAgB,UAAU,SAAS;AAEnC,UAAMM,IAAM,OAAO,sBAAsB,MAAM;;AAI7C,OAACC,MAHiBC,IAAAV,EAAQ,YAAR,gBAAAU,EAAiB;AAAA,QACjC;AAAA,YAEYV,EAAQ,YAArB,QAAAS,EAA+B;AAAA,IAClC,CAAC,GACKE,IAAY,CAACC,MAA+B;AAChD,MAAIA,EAAM,QAAQ,aAChBA,EAAM,gBAAA,GACNP,EAAA;AAAA,IAEJ;AACA,oBAAS,iBAAiB,WAAWM,CAAS,GACvC,MAAM;;AACX,aAAO,qBAAqBH,CAAG,GAC/B,SAAS,oBAAoB,WAAWG,CAAS,IACjDF,KAAAC,IAAAR,EAAgB,YAAhB,gBAAAQ,EAAyB,UAAzB,QAAAD,EAAA,KAAAC;AAAA,IACF;AAAA,EACF,GAAG,CAACpB,GAAMe,CAAW,CAAC,GAEjBf,IAGH,gBAAAuB,EAAC,OAAA,EAAI,kBAAe,kBAAiB,qBAAmBjB,GACtD,UAAA,gBAAAkB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKd;AAAA,MACL,MAAK;AAAA,MACL,cAAW;AAAA,MACX,mBAAiBR,IAAQW,IAAU;AAAA,MACnC,cAAYX,IAAQ,SAAYC;AAAA,MAChC,UAAU;AAAA,MACV,WAAW,CAACP,EAAA,GAAgBW,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAK9D,UAAA;AAAA,QAAAL,IACC,gBAAAsB,EAAC,OAAA,EAAI,WAAU,yEACb,UAAA;AAAA,UAAA,gBAAAD,EAAC,OAAA,EAAI,IAAIV,GAAS,WAAWf,GAC1B,UAAAI,GACH;AAAA,UACA,gBAAAqB;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,QAAO;AAAA,cACP,wBAAOC,GAAA,EAAE;AAAA,cACT,cAAYlB,EAAE,cAAc;AAAA,cAC5B,SAASO;AAAA,YAAA;AAAA,UAAA;AAAA,QACX,EAAA,CACF,IACE;AAAA,QACJ,gBAAAQ,EAAC,OAAA,EAAI,WAAU,kDACZ,UAAAnB,EAAA,CACH;AAAA,QACCC,IACC,gBAAAkB,EAAC,OAAA,EAAI,WAAU,kFACZ,aACH,IACE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAER,IAvCgB;AAyCpB;"}
1
+ {"version":3,"file":"editor-overlay-9tcPXNWt.js","sources":["../../src/components/editor-overlay/editor-overlay.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* EditorOverlay — a non-modal, liquid-glass bar docked INSIDE an */\n/* editor region (Gemini / Mac Mail \"Help me write\" style). */\n/* */\n/* Unlike Dialog it does NOT centre on screen, trap focus, or make the */\n/* page inert — and there is NO scrim, so the editor stays visible and */\n/* usable behind it. It expands from the AI pill into a frosted, */\n/* translucent, rounded bar across the editor's block-end edge. The */\n/* host must be `position: relative` (the RichTextEditor editor region */\n/* is); the overlay anchors to it absolutely. Escape and the close */\n/* button dismiss it. Reusable for any editor-attached surface (AI */\n/* draft, future inline tools). */\n/* ------------------------------------------------------------------ */\n\nimport { useCallback, useEffect, useId, useRef, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { cva } from 'class-variance-authority';\n\nimport { IconButton } from '../button';\n\nexport interface EditorOverlayProps {\n /** Controlled visibility. */\n open: boolean;\n /** Close request (Escape or the close button). */\n onClose: () => void;\n /** Optional visible heading; renders a header row with a close button. */\n title?: ReactNode;\n /** Accessible name for the overlay region (use when there is no visible title). */\n ariaLabel?: string;\n /** Body content. */\n children: ReactNode;\n /** Optional footer slot (e.g. action buttons), right-aligned. */\n footer?: ReactNode;\n /**\n * Opaque instance id, emitted on the wrapper as `data-component-id`. Pass it\n * when more than one overlay can be mounted so an agent / automation tool can\n * tell them apart (PRS §26 §6).\n */\n id?: string;\n /** Extra classes on the glass card. */\n className?: string;\n}\n\n// Non-blocking liquid-glass bar docked across the editor's block-end edge,\n// expanding from the AI pill. No scrim — the editor stays visible + usable.\nconst cardVariants = cva(\n [\n // Spans the editor's block-end edge (a docked bar) and expands from the pill.\n 'ds:absolute ds:z-20',\n 'ds:[inset-inline-start:var(--spacing-md)] ds:[inset-inline-end:var(--spacing-md)]',\n 'ds:[inset-block-end:var(--spacing-md)]',\n // Slim docked bar — compact but with a little breathing room.\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-lg)]',\n // Apple \"Liquid Glass\": a translucent base + backdrop blur/saturate so the\n // editor shows through, a specular top \"rim\" + inner hairline ring, and a\n // soft drop shadow for a floating slab. --card-border is theme-aware (dark\n // hairline on light themes, bright on dark), so the rim reads in all four.\n 'ds:bg-[color-mix(in_srgb,var(--popover)_64%,transparent)]',\n 'ds:backdrop-blur-xl ds:backdrop-saturate-150',\n 'ds:border ds:border-[color-mix(in_srgb,var(--card-border)_70%,transparent)]',\n 'ds:shadow-[inset_0_1px_0_0_var(--card-border),inset_0_0_0_1px_color-mix(in_srgb,var(--card-border)_35%,transparent),var(--shadow-lg)]',\n // Liquid-glass grow out of the pill (bottom-inline-end origin).\n 'ds:origin-bottom-right ds:animate-in ds:fade-in-0 ds:zoom-in-95',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n);\n\nconst titleClass =\n 'ds:text-[length:var(--font-size-base)] ds:font-medium ds:text-[color:var(--foreground)]';\n\nexport function EditorOverlay({\n open,\n onClose,\n title,\n ariaLabel,\n children,\n footer,\n id,\n className,\n}: EditorOverlayProps): React.JSX.Element | null {\n const { t } = useTranslation();\n const cardRef = useRef<HTMLDivElement>(null);\n const restoreFocusRef = useRef<HTMLElement | null>(null);\n const titleId = useId();\n\n const handleClose = useCallback(() => onClose(), [onClose]);\n\n useEffect(() => {\n if (!open) return undefined;\n restoreFocusRef.current = document.activeElement as HTMLElement | null;\n // Move focus into the overlay (non-modal: we don't trap it, just seed it).\n const raf = window.requestAnimationFrame(() => {\n const focusable = cardRef.current?.querySelector<HTMLElement>(\n 'input, textarea, button, [tabindex]:not([tabindex=\"-1\"])',\n );\n (focusable ?? cardRef.current)?.focus();\n });\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n handleClose();\n }\n };\n document.addEventListener('keydown', onKeyDown);\n return () => {\n window.cancelAnimationFrame(raf);\n document.removeEventListener('keydown', onKeyDown);\n restoreFocusRef.current?.focus?.();\n };\n }, [open, handleClose]);\n\n if (!open) return null;\n\n return (\n <div data-component=\"editor-overlay\" data-component-id={id}>\n <div\n ref={cardRef}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={title ? titleId : undefined}\n aria-label={title ? undefined : ariaLabel}\n tabIndex={-1}\n className={[cardVariants(), className].filter(Boolean).join(' ')}\n >\n {/* Header only when there's a visible title — a title-less overlay is a\n header-less composer (named via ariaLabel) whose consumer provides\n its own inline close so no empty band is reserved for it. */}\n {title ? (\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <div id={titleId} className={titleClass}>\n {title}\n </div>\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<X />}\n aria-label={t('common.close')}\n onClick={handleClose}\n />\n </div>\n ) : null}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {children}\n </div>\n {footer ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-sm)]\">\n {footer}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n"],"names":["cardVariants","cva","titleClass","EditorOverlay","open","onClose","title","ariaLabel","children","footer","id","className","t","useTranslation","cardRef","useRef","restoreFocusRef","titleId","useId","handleClose","useCallback","useEffect","raf","_b","_a","onKeyDown","event","jsx","jsxs","IconButton","X"],"mappings":";;;;;;AA8CA,MAAMA,IAAeC;AAAA,EACnB;AAAA;AAAA,IAEE;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMC,IACJ;AAEK,SAASC,EAAc;AAAA,EAC5B,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,IAAAC;AAAA,EACA,WAAAC;AACF,GAAiD;AAC/C,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAUC,EAAuB,IAAI,GACrCC,IAAkBD,EAA2B,IAAI,GACjDE,IAAUC,EAAA,GAEVC,IAAcC,EAAY,MAAMf,KAAW,CAACA,CAAO,CAAC;AA0B1D,SAxBAgB,EAAU,MAAM;AACd,QAAI,CAACjB,EAAM;AACX,IAAAY,EAAgB,UAAU,SAAS;AAEnC,UAAMM,IAAM,OAAO,sBAAsB,MAAM;;AAI7C,OAACC,MAHiBC,IAAAV,EAAQ,YAAR,gBAAAU,EAAiB;AAAA,QACjC;AAAA,YAEYV,EAAQ,YAArB,QAAAS,EAA+B;AAAA,IAClC,CAAC,GACKE,IAAY,CAACC,MAA+B;AAChD,MAAIA,EAAM,QAAQ,aAChBA,EAAM,gBAAA,GACNP,EAAA;AAAA,IAEJ;AACA,oBAAS,iBAAiB,WAAWM,CAAS,GACvC,MAAM;;AACX,aAAO,qBAAqBH,CAAG,GAC/B,SAAS,oBAAoB,WAAWG,CAAS,IACjDF,KAAAC,IAAAR,EAAgB,YAAhB,gBAAAQ,EAAyB,UAAzB,QAAAD,EAAA,KAAAC;AAAA,IACF;AAAA,EACF,GAAG,CAACpB,GAAMe,CAAW,CAAC,GAEjBf,IAGH,gBAAAuB,EAAC,OAAA,EAAI,kBAAe,kBAAiB,qBAAmBjB,GACtD,UAAA,gBAAAkB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKd;AAAA,MACL,MAAK;AAAA,MACL,cAAW;AAAA,MACX,mBAAiBR,IAAQW,IAAU;AAAA,MACnC,cAAYX,IAAQ,SAAYC;AAAA,MAChC,UAAU;AAAA,MACV,WAAW,CAACP,EAAA,GAAgBW,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAK9D,UAAA;AAAA,QAAAL,IACC,gBAAAsB,EAAC,OAAA,EAAI,WAAU,yEACb,UAAA;AAAA,UAAA,gBAAAD,EAAC,OAAA,EAAI,IAAIV,GAAS,WAAWf,GAC1B,UAAAI,GACH;AAAA,UACA,gBAAAqB;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,QAAO;AAAA,cACP,wBAAOC,GAAA,EAAE;AAAA,cACT,cAAYlB,EAAE,cAAc;AAAA,cAC5B,SAASO;AAAA,YAAA;AAAA,UAAA;AAAA,QACX,EAAA,CACF,IACE;AAAA,QACJ,gBAAAQ,EAAC,OAAA,EAAI,WAAU,kDACZ,UAAAnB,EAAA,CACH;AAAA,QACCC,IACC,gBAAAkB,EAAC,OAAA,EAAI,WAAU,kFACZ,aACH,IACE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAER,IAvCgB;AAyCpB;"}
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as d, Fragment as U } from "react/jsx-runtime";
2
2
  import { forwardRef as u, useId as H, useRef as F, useState as P, useCallback as N, useEffect as q, useContext as g, createContext as M } from "react";
3
3
  import { c as m } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as Z } from "react-i18next";
5
- import { B as x } from "./button-nJaPh_HC.js";
5
+ import { B as x } from "./button-CaUe1uyd.js";
6
6
  function G(t, s) {
7
7
  t && (typeof t == "function" ? t(s) : t.current = s);
8
8
  }
@@ -312,4 +312,4 @@ const lt = Object.assign(C, {
312
312
  export {
313
313
  lt as E
314
314
  };
315
- //# sourceMappingURL=empty-state-X0sVPfVo.js.map
315
+ //# sourceMappingURL=empty-state-BUN_UAWf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"empty-state-X0sVPfVo.js","sources":["../../src/components/empty-state/empty-state.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '../button/button';\n\n/* ------------------------------------------------------------------ */\n/* Ref helper */\n/* ------------------------------------------------------------------ */\n\nfunction setRef<T>(ref: Ref<T>, value: T | null) {\n if (!ref) return;\n if (typeof ref === 'function') ref(value);\n else (ref as { current: T | null }).current = value;\n}\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface EmptyStateContextValue {\n size: 'sm' | 'md' | 'lg';\n variant: 'first-use' | 'no-results' | 'error';\n titleId: string;\n registerTitle: () => void;\n}\n\nconst EmptyStateContext = createContext<EmptyStateContextValue>({\n size: 'md',\n variant: 'first-use',\n titleId: '',\n registerTitle: () => {},\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst emptyStateVariants = cva(\n 'ds:flex ds:flex-col ds:items-center ds:text-center ds:max-w-md ds:ms-auto ds:me-auto ds:w-full',\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-md)] ds:gap-[var(--spacing-sm)]',\n md: 'ds:p-[var(--spacing-lg)] ds:gap-[var(--spacing-md)]',\n lg: 'ds:p-[var(--spacing-lg)] ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst illustrationVariants = cva(\n 'ds:flex ds:items-center ds:justify-center ds:flex-shrink-0',\n {\n variants: {\n size: {\n sm: 'ds:w-[80px] ds:h-[80px]',\n md: 'ds:w-[160px] ds:h-[160px]',\n lg: 'ds:w-[240px] ds:h-[240px]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst titleVariants = cva('type-title-card ds:text-[var(--foreground)]', {\n variants: {\n size: {\n sm: 'ds:[--type-title-card-size:var(--font-size-sm)]',\n md: '',\n lg: 'ds:[--type-title-card-size:var(--font-size-xl)]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\nconst descriptionVariants = cva(\n 'type-body-sm ds:text-[var(--muted-foreground)]',\n {\n variants: {\n size: {\n sm: 'ds:[--type-body-sm-size:var(--font-size-xs)]',\n md: '',\n lg: 'ds:[--type-body-sm-size:var(--font-size-base)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Built-in illustrations */\n/* ------------------------------------------------------------------ */\n\nfunction FirstUseIllustration() {\n return (\n <svg\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"ds:w-full ds:h-full\"\n >\n <circle\n cx=\"60\"\n cy=\"60\"\n r=\"50\"\n fill=\"var(--muted)\"\n stroke=\"var(--muted-foreground)\"\n strokeWidth=\"2\"\n />\n <rect x=\"55\" y=\"30\" width=\"10\" height=\"60\" rx=\"5\" fill=\"var(--primary)\" />\n <rect x=\"30\" y=\"55\" width=\"60\" height=\"10\" rx=\"5\" fill=\"var(--accent)\" />\n </svg>\n );\n}\n\nfunction NoResultsIllustration() {\n return (\n <svg\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"ds:w-full ds:h-full\"\n >\n <circle cx=\"52\" cy=\"52\" r=\"28\" stroke=\"var(--muted)\" strokeWidth=\"6\" />\n <line\n x1=\"72\"\n y1=\"72\"\n x2=\"92\"\n y2=\"92\"\n stroke=\"var(--muted)\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"42\"\n y1=\"52\"\n x2=\"62\"\n y2=\"52\"\n stroke=\"var(--muted-foreground)\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction ErrorIllustration() {\n return (\n <svg\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"ds:w-full ds:h-full\"\n >\n <path\n d=\"M60 15 L110 95 H10 Z\"\n fill=\"var(--destructive)\"\n fillOpacity=\"0.1\"\n stroke=\"var(--destructive)\"\n strokeOpacity=\"0.4\"\n strokeWidth=\"3\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"56\"\n y=\"45\"\n width=\"8\"\n height=\"26\"\n rx=\"4\"\n fill=\"var(--destructive)\"\n fillOpacity=\"0.6\"\n />\n <circle\n cx=\"60\"\n cy=\"82\"\n r=\"5\"\n fill=\"var(--destructive)\"\n fillOpacity=\"0.6\"\n />\n </svg>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Subcomponents */\n/* ------------------------------------------------------------------ */\n\nconst EmptyStateIllustration = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ children, className, ...props }, ref) => {\n const { size } = useContext(EmptyStateContext);\n return (\n <div\n ref={ref}\n aria-hidden=\"true\"\n className={illustrationVariants({ size, className })}\n {...props}\n >\n {children}\n </div>\n );\n});\nEmptyStateIllustration.displayName = 'EmptyState.Illustration';\n\nconst EmptyStateTitle = forwardRef<\n HTMLHeadingElement,\n HTMLAttributes<HTMLHeadingElement>\n>(({ children, className, ...props }, ref) => {\n const { size, titleId, registerTitle } = useContext(EmptyStateContext);\n const callbackRef = useCallback(\n (node: HTMLHeadingElement | null) => {\n if (node) registerTitle();\n if (typeof ref === 'function') ref(node);\n else if (ref)\n (ref as { current: HTMLHeadingElement | null }).current = node;\n },\n [ref, registerTitle],\n );\n return (\n <h3\n ref={callbackRef}\n id={titleId}\n className={titleVariants({ size, className })}\n {...props}\n >\n {children}\n </h3>\n );\n});\nEmptyStateTitle.displayName = 'EmptyState.Title';\n\nconst EmptyStateDescription = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ children, className, ...props }, ref) => {\n const { size } = useContext(EmptyStateContext);\n return (\n <p\n ref={ref}\n className={descriptionVariants({ size, className })}\n {...props}\n >\n {children}\n </p>\n );\n});\nEmptyStateDescription.displayName = 'EmptyState.Description';\n\nconst actionsVariants = cva(\n 'ds:flex ds:flex-row ds:flex-wrap ds:items-center ds:justify-center ds:gap-[var(--spacing-md)]',\n);\n\nconst EmptyStateActions = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ children, className, ...props }, ref) => (\n <div ref={ref} className={actionsVariants({ className })} {...props}>\n {children}\n </div>\n));\nEmptyStateActions.displayName = 'EmptyState.Actions';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface EmptyStateProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'title'>,\n VariantProps<typeof emptyStateVariants> {\n variant: 'first-use' | 'no-results' | 'error';\n size?: 'sm' | 'md' | 'lg';\n title?: string;\n description?: string;\n primaryAction?: { label: string; onClick: () => void };\n secondaryAction?: { label: string; onClick: () => void; href?: string };\n autoFocus?: boolean;\n children?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nconst EmptyStateRoot = forwardRef<HTMLDivElement, EmptyStateProps>(\n (\n {\n variant,\n size = 'md',\n title,\n description,\n primaryAction,\n secondaryAction,\n autoFocus = false,\n children,\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const titleId = useId();\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [hasTitle, setHasTitle] = useState(false);\n const registerTitle = useCallback(() => setHasTitle(true), []);\n\n useEffect(() => {\n if (!autoFocus) return;\n const firstBtn = containerRef.current?.querySelector<HTMLElement>(\n 'button:not([disabled]), a[href]',\n );\n firstBtn?.focus();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const roleProps =\n variant === 'no-results'\n ? { role: 'status' as const, 'aria-live': 'polite' as const }\n : { role: 'region' as const };\n\n const defaultTitle =\n variant === 'first-use'\n ? t('emptyState.firstUse.title')\n : variant === 'no-results'\n ? t('emptyState.noResults.title')\n : t('emptyState.error.title');\n\n const defaultDescription =\n variant === 'first-use'\n ? t('emptyState.firstUse.description')\n : variant === 'no-results'\n ? t('emptyState.noResults.description')\n : t('emptyState.error.description');\n\n const defaultCtaLabel =\n variant === 'first-use'\n ? t('emptyState.firstUse.cta')\n : variant === 'no-results'\n ? t('emptyState.noResults.cta')\n : t('emptyState.error.cta');\n\n const buttonSize = size === 'sm' ? ('sm' as const) : ('md' as const);\n\n const safeHref = (href: string) =>\n /^(https?:\\/\\/|\\/|#)/.test(href) ? href : '#';\n\n return (\n <EmptyStateContext.Provider\n value={{ size, variant, titleId, registerTitle }}\n >\n <div\n ref={(node) => {\n containerRef.current = node;\n setRef(ref, node);\n }}\n aria-labelledby={hasTitle || !children ? titleId : undefined}\n {...roleProps}\n className={emptyStateVariants({ size, className })}\n data-component=\"empty-state\"\n {...props}\n >\n {children ?? (\n <>\n <EmptyStateIllustration>\n {variant === 'first-use' && <FirstUseIllustration />}\n {variant === 'no-results' && <NoResultsIllustration />}\n {variant === 'error' && <ErrorIllustration />}\n </EmptyStateIllustration>\n <EmptyStateTitle>{title ?? defaultTitle}</EmptyStateTitle>\n <EmptyStateDescription>\n {description ?? defaultDescription}\n </EmptyStateDescription>\n {(primaryAction || secondaryAction) && (\n <EmptyStateActions>\n {primaryAction && (\n <Button\n intent=\"primary\"\n size={buttonSize}\n onClick={primaryAction.onClick}\n >\n {primaryAction.label ?? defaultCtaLabel}\n </Button>\n )}\n {secondaryAction &&\n (secondaryAction.href ? (\n <Button intent=\"ghost\" size={buttonSize} asChild>\n <a\n href={safeHref(secondaryAction.href!)}\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </a>\n </Button>\n ) : (\n <Button\n intent=\"ghost\"\n size={buttonSize}\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </Button>\n ))}\n </EmptyStateActions>\n )}\n </>\n )}\n </div>\n </EmptyStateContext.Provider>\n );\n },\n);\nEmptyStateRoot.displayName = 'EmptyState';\n\n/* ------------------------------------------------------------------ */\n/* Compound export */\n/* ------------------------------------------------------------------ */\n\nexport const EmptyState = Object.assign(EmptyStateRoot, {\n Illustration: EmptyStateIllustration,\n Title: EmptyStateTitle,\n Description: EmptyStateDescription,\n Actions: EmptyStateActions,\n});\n"],"names":["setRef","ref","value","EmptyStateContext","createContext","emptyStateVariants","cva","illustrationVariants","titleVariants","descriptionVariants","FirstUseIllustration","jsxs","jsx","NoResultsIllustration","ErrorIllustration","EmptyStateIllustration","forwardRef","children","className","props","size","useContext","EmptyStateTitle","titleId","registerTitle","callbackRef","useCallback","node","EmptyStateDescription","actionsVariants","EmptyStateActions","EmptyStateRoot","variant","title","description","primaryAction","secondaryAction","autoFocus","t","useTranslation","useId","containerRef","useRef","hasTitle","setHasTitle","useState","useEffect","firstBtn","_a","roleProps","defaultTitle","defaultDescription","defaultCtaLabel","buttonSize","safeHref","href","Fragment","Button","EmptyState"],"mappings":"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"}
1
+ {"version":3,"file":"empty-state-BUN_UAWf.js","sources":["../../src/components/empty-state/empty-state.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '../button/button';\n\n/* ------------------------------------------------------------------ */\n/* Ref helper */\n/* ------------------------------------------------------------------ */\n\nfunction setRef<T>(ref: Ref<T>, value: T | null) {\n if (!ref) return;\n if (typeof ref === 'function') ref(value);\n else (ref as { current: T | null }).current = value;\n}\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface EmptyStateContextValue {\n size: 'sm' | 'md' | 'lg';\n variant: 'first-use' | 'no-results' | 'error';\n titleId: string;\n registerTitle: () => void;\n}\n\nconst EmptyStateContext = createContext<EmptyStateContextValue>({\n size: 'md',\n variant: 'first-use',\n titleId: '',\n registerTitle: () => {},\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst emptyStateVariants = cva(\n 'ds:flex ds:flex-col ds:items-center ds:text-center ds:max-w-md ds:ms-auto ds:me-auto ds:w-full',\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-md)] ds:gap-[var(--spacing-sm)]',\n md: 'ds:p-[var(--spacing-lg)] ds:gap-[var(--spacing-md)]',\n lg: 'ds:p-[var(--spacing-lg)] ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst illustrationVariants = cva(\n 'ds:flex ds:items-center ds:justify-center ds:flex-shrink-0',\n {\n variants: {\n size: {\n sm: 'ds:w-[80px] ds:h-[80px]',\n md: 'ds:w-[160px] ds:h-[160px]',\n lg: 'ds:w-[240px] ds:h-[240px]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst titleVariants = cva('type-title-card ds:text-[var(--foreground)]', {\n variants: {\n size: {\n sm: 'ds:[--type-title-card-size:var(--font-size-sm)]',\n md: '',\n lg: 'ds:[--type-title-card-size:var(--font-size-xl)]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\nconst descriptionVariants = cva(\n 'type-body-sm ds:text-[var(--muted-foreground)]',\n {\n variants: {\n size: {\n sm: 'ds:[--type-body-sm-size:var(--font-size-xs)]',\n md: '',\n lg: 'ds:[--type-body-sm-size:var(--font-size-base)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Built-in illustrations */\n/* ------------------------------------------------------------------ */\n\nfunction FirstUseIllustration() {\n return (\n <svg\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"ds:w-full ds:h-full\"\n >\n <circle\n cx=\"60\"\n cy=\"60\"\n r=\"50\"\n fill=\"var(--muted)\"\n stroke=\"var(--muted-foreground)\"\n strokeWidth=\"2\"\n />\n <rect x=\"55\" y=\"30\" width=\"10\" height=\"60\" rx=\"5\" fill=\"var(--primary)\" />\n <rect x=\"30\" y=\"55\" width=\"60\" height=\"10\" rx=\"5\" fill=\"var(--accent)\" />\n </svg>\n );\n}\n\nfunction NoResultsIllustration() {\n return (\n <svg\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"ds:w-full ds:h-full\"\n >\n <circle cx=\"52\" cy=\"52\" r=\"28\" stroke=\"var(--muted)\" strokeWidth=\"6\" />\n <line\n x1=\"72\"\n y1=\"72\"\n x2=\"92\"\n y2=\"92\"\n stroke=\"var(--muted)\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"42\"\n y1=\"52\"\n x2=\"62\"\n y2=\"52\"\n stroke=\"var(--muted-foreground)\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction ErrorIllustration() {\n return (\n <svg\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"ds:w-full ds:h-full\"\n >\n <path\n d=\"M60 15 L110 95 H10 Z\"\n fill=\"var(--destructive)\"\n fillOpacity=\"0.1\"\n stroke=\"var(--destructive)\"\n strokeOpacity=\"0.4\"\n strokeWidth=\"3\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"56\"\n y=\"45\"\n width=\"8\"\n height=\"26\"\n rx=\"4\"\n fill=\"var(--destructive)\"\n fillOpacity=\"0.6\"\n />\n <circle\n cx=\"60\"\n cy=\"82\"\n r=\"5\"\n fill=\"var(--destructive)\"\n fillOpacity=\"0.6\"\n />\n </svg>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Subcomponents */\n/* ------------------------------------------------------------------ */\n\nconst EmptyStateIllustration = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ children, className, ...props }, ref) => {\n const { size } = useContext(EmptyStateContext);\n return (\n <div\n ref={ref}\n aria-hidden=\"true\"\n className={illustrationVariants({ size, className })}\n {...props}\n >\n {children}\n </div>\n );\n});\nEmptyStateIllustration.displayName = 'EmptyState.Illustration';\n\nconst EmptyStateTitle = forwardRef<\n HTMLHeadingElement,\n HTMLAttributes<HTMLHeadingElement>\n>(({ children, className, ...props }, ref) => {\n const { size, titleId, registerTitle } = useContext(EmptyStateContext);\n const callbackRef = useCallback(\n (node: HTMLHeadingElement | null) => {\n if (node) registerTitle();\n if (typeof ref === 'function') ref(node);\n else if (ref)\n (ref as { current: HTMLHeadingElement | null }).current = node;\n },\n [ref, registerTitle],\n );\n return (\n <h3\n ref={callbackRef}\n id={titleId}\n className={titleVariants({ size, className })}\n {...props}\n >\n {children}\n </h3>\n );\n});\nEmptyStateTitle.displayName = 'EmptyState.Title';\n\nconst EmptyStateDescription = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ children, className, ...props }, ref) => {\n const { size } = useContext(EmptyStateContext);\n return (\n <p\n ref={ref}\n className={descriptionVariants({ size, className })}\n {...props}\n >\n {children}\n </p>\n );\n});\nEmptyStateDescription.displayName = 'EmptyState.Description';\n\nconst actionsVariants = cva(\n 'ds:flex ds:flex-row ds:flex-wrap ds:items-center ds:justify-center ds:gap-[var(--spacing-md)]',\n);\n\nconst EmptyStateActions = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ children, className, ...props }, ref) => (\n <div ref={ref} className={actionsVariants({ className })} {...props}>\n {children}\n </div>\n));\nEmptyStateActions.displayName = 'EmptyState.Actions';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface EmptyStateProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'title'>,\n VariantProps<typeof emptyStateVariants> {\n variant: 'first-use' | 'no-results' | 'error';\n size?: 'sm' | 'md' | 'lg';\n title?: string;\n description?: string;\n primaryAction?: { label: string; onClick: () => void };\n secondaryAction?: { label: string; onClick: () => void; href?: string };\n autoFocus?: boolean;\n children?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nconst EmptyStateRoot = forwardRef<HTMLDivElement, EmptyStateProps>(\n (\n {\n variant,\n size = 'md',\n title,\n description,\n primaryAction,\n secondaryAction,\n autoFocus = false,\n children,\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const titleId = useId();\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [hasTitle, setHasTitle] = useState(false);\n const registerTitle = useCallback(() => setHasTitle(true), []);\n\n useEffect(() => {\n if (!autoFocus) return;\n const firstBtn = containerRef.current?.querySelector<HTMLElement>(\n 'button:not([disabled]), a[href]',\n );\n firstBtn?.focus();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const roleProps =\n variant === 'no-results'\n ? { role: 'status' as const, 'aria-live': 'polite' as const }\n : { role: 'region' as const };\n\n const defaultTitle =\n variant === 'first-use'\n ? t('emptyState.firstUse.title')\n : variant === 'no-results'\n ? t('emptyState.noResults.title')\n : t('emptyState.error.title');\n\n const defaultDescription =\n variant === 'first-use'\n ? t('emptyState.firstUse.description')\n : variant === 'no-results'\n ? t('emptyState.noResults.description')\n : t('emptyState.error.description');\n\n const defaultCtaLabel =\n variant === 'first-use'\n ? t('emptyState.firstUse.cta')\n : variant === 'no-results'\n ? t('emptyState.noResults.cta')\n : t('emptyState.error.cta');\n\n const buttonSize = size === 'sm' ? ('sm' as const) : ('md' as const);\n\n const safeHref = (href: string) =>\n /^(https?:\\/\\/|\\/|#)/.test(href) ? href : '#';\n\n return (\n <EmptyStateContext.Provider\n value={{ size, variant, titleId, registerTitle }}\n >\n <div\n ref={(node) => {\n containerRef.current = node;\n setRef(ref, node);\n }}\n aria-labelledby={hasTitle || !children ? titleId : undefined}\n {...roleProps}\n className={emptyStateVariants({ size, className })}\n data-component=\"empty-state\"\n {...props}\n >\n {children ?? (\n <>\n <EmptyStateIllustration>\n {variant === 'first-use' && <FirstUseIllustration />}\n {variant === 'no-results' && <NoResultsIllustration />}\n {variant === 'error' && <ErrorIllustration />}\n </EmptyStateIllustration>\n <EmptyStateTitle>{title ?? defaultTitle}</EmptyStateTitle>\n <EmptyStateDescription>\n {description ?? defaultDescription}\n </EmptyStateDescription>\n {(primaryAction || secondaryAction) && (\n <EmptyStateActions>\n {primaryAction && (\n <Button\n intent=\"primary\"\n size={buttonSize}\n onClick={primaryAction.onClick}\n >\n {primaryAction.label ?? defaultCtaLabel}\n </Button>\n )}\n {secondaryAction &&\n (secondaryAction.href ? (\n <Button intent=\"ghost\" size={buttonSize} asChild>\n <a\n href={safeHref(secondaryAction.href!)}\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </a>\n </Button>\n ) : (\n <Button\n intent=\"ghost\"\n size={buttonSize}\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </Button>\n ))}\n </EmptyStateActions>\n )}\n </>\n )}\n </div>\n </EmptyStateContext.Provider>\n );\n },\n);\nEmptyStateRoot.displayName = 'EmptyState';\n\n/* ------------------------------------------------------------------ */\n/* Compound export */\n/* ------------------------------------------------------------------ */\n\nexport const EmptyState = Object.assign(EmptyStateRoot, {\n Illustration: EmptyStateIllustration,\n Title: EmptyStateTitle,\n Description: EmptyStateDescription,\n Actions: EmptyStateActions,\n});\n"],"names":["setRef","ref","value","EmptyStateContext","createContext","emptyStateVariants","cva","illustrationVariants","titleVariants","descriptionVariants","FirstUseIllustration","jsxs","jsx","NoResultsIllustration","ErrorIllustration","EmptyStateIllustration","forwardRef","children","className","props","size","useContext","EmptyStateTitle","titleId","registerTitle","callbackRef","useCallback","node","EmptyStateDescription","actionsVariants","EmptyStateActions","EmptyStateRoot","variant","title","description","primaryAction","secondaryAction","autoFocus","t","useTranslation","useId","containerRef","useRef","hasTitle","setHasTitle","useState","useEffect","firstBtn","_a","roleProps","defaultTitle","defaultDescription","defaultCtaLabel","buttonSize","safeHref","href","Fragment","Button","EmptyState"],"mappings":"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"}
@@ -3,8 +3,8 @@ import { forwardRef as q, useId as w, useRef as f, useImperativeHandle as K, use
3
3
  import { useTranslation as D } from "react-i18next";
4
4
  import { A as I } from "./alert-CiQ5Pa3Q.js";
5
5
  import { A as H } from "./avatar-CkDeQOSI.js";
6
- import { B as $ } from "./button-nJaPh_HC.js";
7
- import { I as O } from "./icon-button-8xqRnkdG.js";
6
+ import { B as $ } from "./button-CaUe1uyd.js";
7
+ import { I as O } from "./icon-button-CehAeZoP.js";
8
8
  import { C } from "./card-DPmk26CL.js";
9
9
  import { L as F } from "./link-CPb_pZPr.js";
10
10
  import { P as G } from "./panel-header-D_mTdhUp.js";
@@ -274,4 +274,4 @@ function ae({ section: t }) {
274
274
  export {
275
275
  be as E
276
276
  };
277
- //# sourceMappingURL=entity-summary-BbW0mIzU.js.map
277
+ //# sourceMappingURL=entity-summary-DXejuQ8i.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity-summary-BbW0mIzU.js","sources":["../../node_modules/lucide-react/dist/esm/icons/contact-round.mjs","../../src/components/entity-summary/entity-summary.agent.ts","../../src/components/entity-summary/entity-summary.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M16 2v2\", key: \"scm5qe\" }],\n [\"path\", { d: \"M17.915 22a6 6 0 0 0-12 0\", key: \"suqz9p\" }],\n [\"path\", { d: \"M8 2v2\", key: \"pbkmx\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"4\", key: \"4exip2\" }],\n [\"rect\", { x: \"3\", y: \"4\", width: \"18\", height: \"18\", rx: \"2\", key: \"12vinp\" }]\n];\nconst ContactRound = createLucideIcon(\"contact-round\", __iconNode);\n\nexport { __iconNode, ContactRound as default };\n//# sourceMappingURL=contact-round.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — EntitySummary. */\n/* */\n/* The AI narrative brief (\"Sintesi IA\") for an entity. The agent can */\n/* read the brief's STRUCTURE (generated-at + section ids / headings / */\n/* tone / item counts — fixed category labels, never the entity name or */\n/* the bullet items, both PHI) and drive the two affordances: regenerate */\n/* the brief and dismiss the panel. Generation itself is gated upstream */\n/* by AiConsentBanner; this adapter only re-requests an already-consented */\n/* brief. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { EntitySummaryHandle } from './entity-summary';\n\nexport const entitySummaryAgent: AgentAdapter<EntitySummaryHandle> = {\n id: 'entity-summary',\n // 'close' backs close; regenerate is a host-driven refresh with no\n // dedicated capability in the closed vocabulary.\n capabilities: ['close'],\n state: {\n sections: {\n type: 'Array<{ id: string; heading: string; tone: \"default\" | \"attention\"; itemCount: number }>',\n descriptionKey: 'ui.agent.entitySummary.state.sections',\n description:\n 'Structural section list — ids, fixed category headings, tone and item counts. Never the entity name or the bullet items (both PHI).',\n read: (handle) => handle.getState().sections,\n },\n generatedAtIso: {\n type: 'string | undefined',\n descriptionKey: 'ui.agent.entitySummary.state.generatedAtIso',\n description: 'ISO-8601 instant the brief was generated, when known.',\n read: (handle) => handle.getState().generatedAtIso,\n },\n },\n actions: {\n regenerate: {\n // Re-requests a fresh brief from the model — reaches an external system.\n safety: 'write',\n openWorld: true,\n descriptionKey: 'ui.agent.entitySummary.actions.regenerate',\n description:\n 'Request the host to regenerate the AI brief. No-op when the regenerate affordance is not available.',\n invoke: (handle) => {\n if (handle.canRegenerate()) handle.regenerate();\n },\n },\n close: {\n // Ephemeral panel-visibility change — read.\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.entitySummary.actions.close',\n description:\n 'Dismiss the summary panel. No-op when the close affordance is not available (e.g. docked in the rail).',\n invoke: (handle) => {\n if (handle.canClose()) handle.close();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'entity-summary',\n description: 'Marks the EntitySummary panel region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific summary panel from the agent.',\n },\n },\n};\n","import {\n forwardRef,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ContactRound, Clock, RefreshCw, X } from 'lucide-react';\nimport { Alert } from '../alert';\nimport { Avatar } from '../avatar';\nimport { Button } from '../button';\nimport { Card } from '../card';\nimport { IconButton } from '../button/icon-button';\nimport { Link } from '../link';\nimport { PanelHeader } from '../panel-header';\nimport { Timestamp } from '../timestamp';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { entitySummaryAgent } from './entity-summary.agent';\n\n/* ------------------------------------------------------------------ */\n/* EntitySummary — the AI narrative brief for an entity. */\n/* */\n/* The kit form of platform's \"Sintesi IA\": a generated, sectioned */\n/* brief of a patient / care plan — header (entity · generated-at · */\n/* regenerate · corpus stats), N labelled sections of bullet items */\n/* (with inline entity links), and a BETA disclaimer. The `attention` */\n/* section tone carries the clinically valuable risk flags. */\n/* */\n/* The kit owns the layout, i18n and theming; the consumer passes */\n/* structured `sections` (data-in) so the brief re-themes and */\n/* localises rather than rendering a model HTML blob. Gate generation */\n/* behind `AiConsentBanner` upstream. */\n/* ------------------------------------------------------------------ */\n\n/** A corpus stat shown in the header (e.g. `{ value: 5, label: 'care plans' }`). */\nexport interface EntitySummaryStat {\n value: string | number;\n label: string;\n}\n\n/** One narrative section — a heading over a list of bullet items. */\nexport interface EntitySummarySection {\n id: string;\n heading: string;\n /**\n * Leading glyph for the section. On default sections it's the scannability\n * anchor shown in a `--primary`-tinted medallion beside the heading (e.g. a\n * calendar for \"Scheduled\", a wallet for \"Financial\"); omit it to render no\n * medallion. On `attention` sections it overrides the warning Alert's icon\n * (which defaults to an alert triangle).\n */\n icon?: ReactNode;\n /**\n * `attention` renders the section as the kit's warning `Alert` — the\n * standard risk-flag treatment (border, warning surface, alert glyph,\n * `--warning-foreground` text) — for clinically important callouts.\n */\n tone?: 'default' | 'attention';\n /** Bullet items — `ReactNode` so consumers compose inline entity links. */\n items: ReactNode[];\n}\n\n/**\n * Curated agent handle for EntitySummary. Exposes structural state only —\n * never the entity name or the section items (both PHI). See\n * `entity-summary.agent.ts`.\n */\nexport interface EntitySummaryHandle {\n /** Structural snapshot — generated-at + section ids/headings/tone/count. No PHI. */\n getState: () => {\n generatedAtIso?: string;\n sections: Array<{\n id: string;\n heading: string;\n tone: 'default' | 'attention';\n itemCount: number;\n }>;\n };\n /** Whether the regenerate affordance is available. */\n canRegenerate: () => boolean;\n /** Request the host to regenerate the brief (mirrors onRegenerate). */\n regenerate: () => void;\n /** Whether the close affordance is available. */\n canClose: () => boolean;\n /** Dismiss the panel (mirrors onClose). */\n close: () => void;\n}\n\nexport interface EntitySummaryProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'title' | 'children'\n> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so an\n * agent / MCP UI bridge can address this specific summary panel.\n */\n id?: string;\n /** Panel title. Defaults to the localised \"AI summary\". */\n title?: string;\n /** Entity name shown beside its avatar in the header (links when `entityHref` is set). */\n entityName?: string;\n /** Entity href for the name link. */\n entityHref?: string;\n /** Avatar image URL for the entity. Falls back to initials derived from `entityName`. */\n entityAvatarSrc?: string;\n /** ISO-8601 instant the brief was generated. */\n generatedAtIso?: string;\n /** Corpus the brief was built from, shown as a compact KPI card. */\n stats?: EntitySummaryStat[];\n /** The narrative sections, in order. */\n sections: EntitySummarySection[];\n /** Regenerate the brief. Omit to hide the affordance. */\n onRegenerate?: () => void;\n /** Regenerate-button label. */\n regenerateLabel?: string;\n /**\n * Dismiss the panel. Renders a close button in the panel header for\n * STANDALONE use (outside the rail). When docked in `ControlRoomRail`, omit\n * this — the rail injects its own close via `PanelHeaderActionsProvider`\n * (passing it while docked would render a duplicate close control).\n */\n onClose?: () => void;\n /** Footer disclaimer. Defaults to the BETA clinical-judgement note. */\n disclaimer?: ReactNode;\n /** BCP-47 locale for the generated-at timestamp. */\n locale?: string;\n /** Accessible name for the panel region (defaults to `title`). */\n 'aria-label'?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Section presentation. The `attention` tone renders a different */\n/* element tree (the kit's warning Alert) rather than a class variant, */\n/* so the branch lives in `Section`; these constants carry the shared */\n/* class sets for the default (prose) sections. */\n/* ------------------------------------------------------------------ */\n\n// The default section's leading icon chip — a --primary-tinted medallion\n// that anchors the heading. No tone variants: the attention tone is owned\n// by the Alert primitive, so this stays a plain class set.\nconst MEDALLION_CLASSES =\n 'ds:flex ds:size-7 ds:shrink-0 ds:items-center ds:justify-center ds:rounded-[var(--radius-md)] ds:[&_svg]:size-4 ds:bg-primary/10 ds:text-[color:var(--primary)]';\n\n// The bullet list shared by every section — indented disc items.\nconst ITEMS_CLASSES =\n 'ds:m-0 ds:flex ds:list-disc ds:flex-col ds:gap-[var(--spacing-2xs)] ds:ps-[var(--spacing-md)] type-body-sm';\n\nexport const EntitySummary = forwardRef<HTMLElement, EntitySummaryProps>(\n function EntitySummary(\n {\n id,\n title,\n entityName,\n entityHref,\n entityAvatarSrc,\n generatedAtIso,\n stats,\n sections,\n onRegenerate,\n regenerateLabel,\n onClose,\n disclaimer,\n locale,\n className,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n ) {\n const { t } = useTranslation();\n const headingId = useId();\n const heading =\n title ?? t('entitySummary.title', { defaultValue: 'AI summary' });\n\n /* ----- Agent handle (structural state + regenerate / close) ----- */\n const sectionsRef = useRef(sections);\n sectionsRef.current = sections;\n const generatedAtRef = useRef(generatedAtIso);\n generatedAtRef.current = generatedAtIso;\n const onRegenerateRef = useRef(onRegenerate);\n onRegenerateRef.current = onRegenerate;\n const onCloseRef = useRef(onClose);\n onCloseRef.current = onClose;\n\n const rootRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLElement, []);\n\n const handle = useMemo<EntitySummaryHandle>(\n () => ({\n // Structural only — section headings are fixed category labels, never\n // the entity name or the bullet items (both PHI).\n getState: () => ({\n generatedAtIso: generatedAtRef.current,\n sections: sectionsRef.current.map((s) => ({\n id: s.id,\n heading: s.heading,\n tone: s.tone ?? 'default',\n itemCount: s.items.length,\n })),\n }),\n canRegenerate: () => !!onRegenerateRef.current,\n regenerate: () => onRegenerateRef.current?.(),\n canClose: () => !!onCloseRef.current,\n close: () => onCloseRef.current?.(),\n }),\n [],\n );\n useAgentRegistration(entitySummaryAgent, handle, id);\n\n // The generated-at line — the brief's \"subtitle\" under the entity name,\n // or a standalone line when there's no entity. A clock glyph leads it.\n const generatedLine = generatedAtIso ? (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)] type-meta ds:text-[color:var(--muted-foreground)]\">\n <Clock aria-hidden=\"true\" className=\"ds:size-3.5 ds:shrink-0\" />\n <span>\n {t('entitySummary.generatedAt', { defaultValue: 'Generated' })}\n </span>\n <Timestamp value={generatedAtIso} format=\"absolute\" locale={locale} />\n </span>\n ) : null;\n\n return (\n <section\n ref={rootRef}\n data-component=\"entity-summary\"\n data-component-id={id}\n aria-labelledby={ariaLabel ? undefined : headingId}\n aria-label={ariaLabel}\n className={['ds:flex ds:flex-col', className].filter(Boolean).join(' ')}\n {...rest}\n >\n {/* Header — the shared rail-panel pattern. Title + Regenerate;\n the close affordance is injected by the rail, not the panel. */}\n <PanelHeader\n title={heading}\n icon={<ContactRound aria-hidden=\"true\" />}\n headingId={ariaLabel ? undefined : headingId}\n sticky\n divider\n actions={\n onRegenerate || onClose ? (\n <>\n {onRegenerate ? (\n <Button\n type=\"button\"\n size=\"sm\"\n intent=\"ghost\"\n startIcon={<RefreshCw aria-hidden=\"true\" />}\n onClick={onRegenerate}\n >\n {regenerateLabel ??\n t('entitySummary.regenerate', {\n defaultValue: 'Regenerate',\n })}\n </Button>\n ) : null}\n {onClose ? (\n <IconButton\n icon={<X aria-hidden=\"true\" />}\n size=\"sm\"\n intent=\"ghost\"\n aria-label={t('common.close', { defaultValue: 'Close' })}\n onClick={onClose}\n />\n ) : null}\n </>\n ) : undefined\n }\n />\n\n {/* Body */}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:p-[var(--spacing-md)]\">\n {entityName || generatedAtIso || (stats && stats.length > 0) ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {/* Identity — the entity's avatar + name, generated-at as the\n subtitle beneath. Without a name, the generated line stands\n alone. */}\n {entityName ? (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Avatar\n name={entityName}\n src={entityAvatarSrc}\n size=\"sm\"\n className=\"ds:shrink-0\"\n />\n <div className=\"ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n {entityHref ? (\n <Link\n href={entityHref}\n className=\"type-body-sm ds:font-semibold\"\n >\n {entityName}\n </Link>\n ) : (\n <span className=\"type-body-sm ds:font-semibold ds:text-[color:var(--foreground)]\">\n {entityName}\n </span>\n )}\n {generatedLine}\n </div>\n </div>\n ) : (\n generatedLine\n )}\n\n {/* Corpus stats — a compact KPI card: value over label, with a\n hairline divider between cells. */}\n {stats && stats.length > 0 ? (\n <Card variant=\"elevated\">\n {/* eslint-disable-next-line jsx-a11y/no-redundant-roles -- role=\"list\" restores list semantics that ds:list-none strips in Safari/VoiceOver */}\n <ul\n role=\"list\"\n className=\"ds:m-0 ds:flex ds:list-none ds:items-stretch\"\n >\n {stats.map((stat, index) => (\n <li\n key={`${stat.label}-${index}`}\n className={[\n 'ds:flex ds:flex-1 ds:flex-col ds:items-center ds:gap-[var(--spacing-2xs)] ds:p-[var(--spacing-sm)] ds:text-center',\n index > 0\n ? 'ds:border-s ds:border-[color:var(--card-border)]'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <span className=\"type-metric ds:[--type-metric-size:var(--font-size-lg)] ds:text-[color:var(--foreground)]\">\n {stat.value}\n </span>\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {stat.label}\n </span>\n </li>\n ))}\n </ul>\n </Card>\n ) : null}\n </div>\n ) : null}\n\n {/* Sections */}\n {sections.map((section) => (\n <Section key={section.id} section={section} />\n ))}\n\n {/* Disclaimer */}\n <p className=\"ds:m-0 type-meta ds:text-[color:var(--muted-foreground)]\">\n {disclaimer ??\n t('entitySummary.disclaimer', {\n defaultValue:\n 'Does not replace clinical judgement · verify accuracy before clinical use · BETA',\n })}\n </p>\n </div>\n </section>\n );\n },\n);\n\nfunction Section({ section }: { section: EntitySummarySection }): ReactNode {\n const headingId = useId();\n\n // The risk-flag section composes the kit's warning `Alert` primitive rather\n // than re-painting the warning tokens by hand — same border, surface, alert\n // glyph, and `--warning-foreground` treatment as every other warning in the\n // app. `live=\"off\"`: the brief is static content, not a just-occurred event,\n // so the items read in normal flow instead of being announced assertively.\n // A per-section `icon` overrides Alert's default alert triangle.\n if (section.tone === 'attention') {\n // The shared `--shadow-card` lifts the warning callout to the same\n // elevation as the surrounding section cards, so the stack reads as one\n // set of raised panels rather than a flat warning band among cards.\n return (\n <Alert\n variant=\"warning\"\n live=\"off\"\n icon={section.icon}\n className=\"ds:shadow-[var(--shadow-card)]\"\n >\n <Alert.Title as=\"h3\">{section.heading}</Alert.Title>\n <ul className={ITEMS_CLASSES}>\n {section.items.map((item, index) => (\n <li key={index}>{item}</li>\n ))}\n </ul>\n </Alert>\n );\n }\n\n // Default sections are raised cards — the scannable \"panel per topic\" stack,\n // matching platform's Sintesi IA. The card owns its own padding (so we drive\n // it from a single content div rather than Card.Header/Body) and is named by\n // its heading for assistive tech.\n return (\n <Card variant=\"elevated\" aria-labelledby={headingId}>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {section.icon ? (\n <span aria-hidden=\"true\" className={MEDALLION_CLASSES}>\n {section.icon}\n </span>\n ) : null}\n <h3\n id={headingId}\n className=\"ds:m-0 type-eyebrow ds:text-[color:var(--foreground)]\"\n >\n {section.heading}\n </h3>\n </div>\n <ul className={`${ITEMS_CLASSES} ds:text-[color:var(--foreground)]`}>\n {section.items.map((item, index) => (\n <li key={index}>{item}</li>\n ))}\n </ul>\n </div>\n </Card>\n );\n}\n"],"names":["__iconNode","ContactRound","createLucideIcon","entitySummaryAgent","handle","MEDALLION_CLASSES","ITEMS_CLASSES","EntitySummary","forwardRef","id","title","entityName","entityHref","entityAvatarSrc","generatedAtIso","stats","sections","onRegenerate","regenerateLabel","onClose","disclaimer","locale","className","ariaLabel","rest","ref","t","useTranslation","headingId","useId","heading","sectionsRef","useRef","generatedAtRef","onRegenerateRef","onCloseRef","rootRef","useImperativeHandle","useMemo","s","_a","useAgentRegistration","generatedLine","jsxs","jsx","Clock","Timestamp","PanelHeader","Fragment","Button","RefreshCw","IconButton","X","Avatar","Link","Card","stat","index","section","Section","Alert","item"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"entity-summary-DXejuQ8i.js","sources":["../../node_modules/lucide-react/dist/esm/icons/contact-round.mjs","../../src/components/entity-summary/entity-summary.agent.ts","../../src/components/entity-summary/entity-summary.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M16 2v2\", key: \"scm5qe\" }],\n [\"path\", { d: \"M17.915 22a6 6 0 0 0-12 0\", key: \"suqz9p\" }],\n [\"path\", { d: \"M8 2v2\", key: \"pbkmx\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"4\", key: \"4exip2\" }],\n [\"rect\", { x: \"3\", y: \"4\", width: \"18\", height: \"18\", rx: \"2\", key: \"12vinp\" }]\n];\nconst ContactRound = createLucideIcon(\"contact-round\", __iconNode);\n\nexport { __iconNode, ContactRound as default };\n//# sourceMappingURL=contact-round.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — EntitySummary. */\n/* */\n/* The AI narrative brief (\"Sintesi IA\") for an entity. The agent can */\n/* read the brief's STRUCTURE (generated-at + section ids / headings / */\n/* tone / item counts — fixed category labels, never the entity name or */\n/* the bullet items, both PHI) and drive the two affordances: regenerate */\n/* the brief and dismiss the panel. Generation itself is gated upstream */\n/* by AiConsentBanner; this adapter only re-requests an already-consented */\n/* brief. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { EntitySummaryHandle } from './entity-summary';\n\nexport const entitySummaryAgent: AgentAdapter<EntitySummaryHandle> = {\n id: 'entity-summary',\n // 'close' backs close; regenerate is a host-driven refresh with no\n // dedicated capability in the closed vocabulary.\n capabilities: ['close'],\n state: {\n sections: {\n type: 'Array<{ id: string; heading: string; tone: \"default\" | \"attention\"; itemCount: number }>',\n descriptionKey: 'ui.agent.entitySummary.state.sections',\n description:\n 'Structural section list — ids, fixed category headings, tone and item counts. Never the entity name or the bullet items (both PHI).',\n read: (handle) => handle.getState().sections,\n },\n generatedAtIso: {\n type: 'string | undefined',\n descriptionKey: 'ui.agent.entitySummary.state.generatedAtIso',\n description: 'ISO-8601 instant the brief was generated, when known.',\n read: (handle) => handle.getState().generatedAtIso,\n },\n },\n actions: {\n regenerate: {\n // Re-requests a fresh brief from the model — reaches an external system.\n safety: 'write',\n openWorld: true,\n descriptionKey: 'ui.agent.entitySummary.actions.regenerate',\n description:\n 'Request the host to regenerate the AI brief. No-op when the regenerate affordance is not available.',\n invoke: (handle) => {\n if (handle.canRegenerate()) handle.regenerate();\n },\n },\n close: {\n // Ephemeral panel-visibility change — read.\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.entitySummary.actions.close',\n description:\n 'Dismiss the summary panel. No-op when the close affordance is not available (e.g. docked in the rail).',\n invoke: (handle) => {\n if (handle.canClose()) handle.close();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'entity-summary',\n description: 'Marks the EntitySummary panel region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific summary panel from the agent.',\n },\n },\n};\n","import {\n forwardRef,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ContactRound, Clock, RefreshCw, X } from 'lucide-react';\nimport { Alert } from '../alert';\nimport { Avatar } from '../avatar';\nimport { Button } from '../button';\nimport { Card } from '../card';\nimport { IconButton } from '../button/icon-button';\nimport { Link } from '../link';\nimport { PanelHeader } from '../panel-header';\nimport { Timestamp } from '../timestamp';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { entitySummaryAgent } from './entity-summary.agent';\n\n/* ------------------------------------------------------------------ */\n/* EntitySummary — the AI narrative brief for an entity. */\n/* */\n/* The kit form of platform's \"Sintesi IA\": a generated, sectioned */\n/* brief of a patient / care plan — header (entity · generated-at · */\n/* regenerate · corpus stats), N labelled sections of bullet items */\n/* (with inline entity links), and a BETA disclaimer. The `attention` */\n/* section tone carries the clinically valuable risk flags. */\n/* */\n/* The kit owns the layout, i18n and theming; the consumer passes */\n/* structured `sections` (data-in) so the brief re-themes and */\n/* localises rather than rendering a model HTML blob. Gate generation */\n/* behind `AiConsentBanner` upstream. */\n/* ------------------------------------------------------------------ */\n\n/** A corpus stat shown in the header (e.g. `{ value: 5, label: 'care plans' }`). */\nexport interface EntitySummaryStat {\n value: string | number;\n label: string;\n}\n\n/** One narrative section — a heading over a list of bullet items. */\nexport interface EntitySummarySection {\n id: string;\n heading: string;\n /**\n * Leading glyph for the section. On default sections it's the scannability\n * anchor shown in a `--primary`-tinted medallion beside the heading (e.g. a\n * calendar for \"Scheduled\", a wallet for \"Financial\"); omit it to render no\n * medallion. On `attention` sections it overrides the warning Alert's icon\n * (which defaults to an alert triangle).\n */\n icon?: ReactNode;\n /**\n * `attention` renders the section as the kit's warning `Alert` — the\n * standard risk-flag treatment (border, warning surface, alert glyph,\n * `--warning-foreground` text) — for clinically important callouts.\n */\n tone?: 'default' | 'attention';\n /** Bullet items — `ReactNode` so consumers compose inline entity links. */\n items: ReactNode[];\n}\n\n/**\n * Curated agent handle for EntitySummary. Exposes structural state only —\n * never the entity name or the section items (both PHI). See\n * `entity-summary.agent.ts`.\n */\nexport interface EntitySummaryHandle {\n /** Structural snapshot — generated-at + section ids/headings/tone/count. No PHI. */\n getState: () => {\n generatedAtIso?: string;\n sections: Array<{\n id: string;\n heading: string;\n tone: 'default' | 'attention';\n itemCount: number;\n }>;\n };\n /** Whether the regenerate affordance is available. */\n canRegenerate: () => boolean;\n /** Request the host to regenerate the brief (mirrors onRegenerate). */\n regenerate: () => void;\n /** Whether the close affordance is available. */\n canClose: () => boolean;\n /** Dismiss the panel (mirrors onClose). */\n close: () => void;\n}\n\nexport interface EntitySummaryProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'title' | 'children'\n> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so an\n * agent / MCP UI bridge can address this specific summary panel.\n */\n id?: string;\n /** Panel title. Defaults to the localised \"AI summary\". */\n title?: string;\n /** Entity name shown beside its avatar in the header (links when `entityHref` is set). */\n entityName?: string;\n /** Entity href for the name link. */\n entityHref?: string;\n /** Avatar image URL for the entity. Falls back to initials derived from `entityName`. */\n entityAvatarSrc?: string;\n /** ISO-8601 instant the brief was generated. */\n generatedAtIso?: string;\n /** Corpus the brief was built from, shown as a compact KPI card. */\n stats?: EntitySummaryStat[];\n /** The narrative sections, in order. */\n sections: EntitySummarySection[];\n /** Regenerate the brief. Omit to hide the affordance. */\n onRegenerate?: () => void;\n /** Regenerate-button label. */\n regenerateLabel?: string;\n /**\n * Dismiss the panel. Renders a close button in the panel header for\n * STANDALONE use (outside the rail). When docked in `ControlRoomRail`, omit\n * this — the rail injects its own close via `PanelHeaderActionsProvider`\n * (passing it while docked would render a duplicate close control).\n */\n onClose?: () => void;\n /** Footer disclaimer. Defaults to the BETA clinical-judgement note. */\n disclaimer?: ReactNode;\n /** BCP-47 locale for the generated-at timestamp. */\n locale?: string;\n /** Accessible name for the panel region (defaults to `title`). */\n 'aria-label'?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Section presentation. The `attention` tone renders a different */\n/* element tree (the kit's warning Alert) rather than a class variant, */\n/* so the branch lives in `Section`; these constants carry the shared */\n/* class sets for the default (prose) sections. */\n/* ------------------------------------------------------------------ */\n\n// The default section's leading icon chip — a --primary-tinted medallion\n// that anchors the heading. No tone variants: the attention tone is owned\n// by the Alert primitive, so this stays a plain class set.\nconst MEDALLION_CLASSES =\n 'ds:flex ds:size-7 ds:shrink-0 ds:items-center ds:justify-center ds:rounded-[var(--radius-md)] ds:[&_svg]:size-4 ds:bg-primary/10 ds:text-[color:var(--primary)]';\n\n// The bullet list shared by every section — indented disc items.\nconst ITEMS_CLASSES =\n 'ds:m-0 ds:flex ds:list-disc ds:flex-col ds:gap-[var(--spacing-2xs)] ds:ps-[var(--spacing-md)] type-body-sm';\n\nexport const EntitySummary = forwardRef<HTMLElement, EntitySummaryProps>(\n function EntitySummary(\n {\n id,\n title,\n entityName,\n entityHref,\n entityAvatarSrc,\n generatedAtIso,\n stats,\n sections,\n onRegenerate,\n regenerateLabel,\n onClose,\n disclaimer,\n locale,\n className,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n ) {\n const { t } = useTranslation();\n const headingId = useId();\n const heading =\n title ?? t('entitySummary.title', { defaultValue: 'AI summary' });\n\n /* ----- Agent handle (structural state + regenerate / close) ----- */\n const sectionsRef = useRef(sections);\n sectionsRef.current = sections;\n const generatedAtRef = useRef(generatedAtIso);\n generatedAtRef.current = generatedAtIso;\n const onRegenerateRef = useRef(onRegenerate);\n onRegenerateRef.current = onRegenerate;\n const onCloseRef = useRef(onClose);\n onCloseRef.current = onClose;\n\n const rootRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLElement, []);\n\n const handle = useMemo<EntitySummaryHandle>(\n () => ({\n // Structural only — section headings are fixed category labels, never\n // the entity name or the bullet items (both PHI).\n getState: () => ({\n generatedAtIso: generatedAtRef.current,\n sections: sectionsRef.current.map((s) => ({\n id: s.id,\n heading: s.heading,\n tone: s.tone ?? 'default',\n itemCount: s.items.length,\n })),\n }),\n canRegenerate: () => !!onRegenerateRef.current,\n regenerate: () => onRegenerateRef.current?.(),\n canClose: () => !!onCloseRef.current,\n close: () => onCloseRef.current?.(),\n }),\n [],\n );\n useAgentRegistration(entitySummaryAgent, handle, id);\n\n // The generated-at line — the brief's \"subtitle\" under the entity name,\n // or a standalone line when there's no entity. A clock glyph leads it.\n const generatedLine = generatedAtIso ? (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)] type-meta ds:text-[color:var(--muted-foreground)]\">\n <Clock aria-hidden=\"true\" className=\"ds:size-3.5 ds:shrink-0\" />\n <span>\n {t('entitySummary.generatedAt', { defaultValue: 'Generated' })}\n </span>\n <Timestamp value={generatedAtIso} format=\"absolute\" locale={locale} />\n </span>\n ) : null;\n\n return (\n <section\n ref={rootRef}\n data-component=\"entity-summary\"\n data-component-id={id}\n aria-labelledby={ariaLabel ? undefined : headingId}\n aria-label={ariaLabel}\n className={['ds:flex ds:flex-col', className].filter(Boolean).join(' ')}\n {...rest}\n >\n {/* Header — the shared rail-panel pattern. Title + Regenerate;\n the close affordance is injected by the rail, not the panel. */}\n <PanelHeader\n title={heading}\n icon={<ContactRound aria-hidden=\"true\" />}\n headingId={ariaLabel ? undefined : headingId}\n sticky\n divider\n actions={\n onRegenerate || onClose ? (\n <>\n {onRegenerate ? (\n <Button\n type=\"button\"\n size=\"sm\"\n intent=\"ghost\"\n startIcon={<RefreshCw aria-hidden=\"true\" />}\n onClick={onRegenerate}\n >\n {regenerateLabel ??\n t('entitySummary.regenerate', {\n defaultValue: 'Regenerate',\n })}\n </Button>\n ) : null}\n {onClose ? (\n <IconButton\n icon={<X aria-hidden=\"true\" />}\n size=\"sm\"\n intent=\"ghost\"\n aria-label={t('common.close', { defaultValue: 'Close' })}\n onClick={onClose}\n />\n ) : null}\n </>\n ) : undefined\n }\n />\n\n {/* Body */}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:p-[var(--spacing-md)]\">\n {entityName || generatedAtIso || (stats && stats.length > 0) ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {/* Identity — the entity's avatar + name, generated-at as the\n subtitle beneath. Without a name, the generated line stands\n alone. */}\n {entityName ? (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Avatar\n name={entityName}\n src={entityAvatarSrc}\n size=\"sm\"\n className=\"ds:shrink-0\"\n />\n <div className=\"ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n {entityHref ? (\n <Link\n href={entityHref}\n className=\"type-body-sm ds:font-semibold\"\n >\n {entityName}\n </Link>\n ) : (\n <span className=\"type-body-sm ds:font-semibold ds:text-[color:var(--foreground)]\">\n {entityName}\n </span>\n )}\n {generatedLine}\n </div>\n </div>\n ) : (\n generatedLine\n )}\n\n {/* Corpus stats — a compact KPI card: value over label, with a\n hairline divider between cells. */}\n {stats && stats.length > 0 ? (\n <Card variant=\"elevated\">\n {/* eslint-disable-next-line jsx-a11y/no-redundant-roles -- role=\"list\" restores list semantics that ds:list-none strips in Safari/VoiceOver */}\n <ul\n role=\"list\"\n className=\"ds:m-0 ds:flex ds:list-none ds:items-stretch\"\n >\n {stats.map((stat, index) => (\n <li\n key={`${stat.label}-${index}`}\n className={[\n 'ds:flex ds:flex-1 ds:flex-col ds:items-center ds:gap-[var(--spacing-2xs)] ds:p-[var(--spacing-sm)] ds:text-center',\n index > 0\n ? 'ds:border-s ds:border-[color:var(--card-border)]'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <span className=\"type-metric ds:[--type-metric-size:var(--font-size-lg)] ds:text-[color:var(--foreground)]\">\n {stat.value}\n </span>\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {stat.label}\n </span>\n </li>\n ))}\n </ul>\n </Card>\n ) : null}\n </div>\n ) : null}\n\n {/* Sections */}\n {sections.map((section) => (\n <Section key={section.id} section={section} />\n ))}\n\n {/* Disclaimer */}\n <p className=\"ds:m-0 type-meta ds:text-[color:var(--muted-foreground)]\">\n {disclaimer ??\n t('entitySummary.disclaimer', {\n defaultValue:\n 'Does not replace clinical judgement · verify accuracy before clinical use · BETA',\n })}\n </p>\n </div>\n </section>\n );\n },\n);\n\nfunction Section({ section }: { section: EntitySummarySection }): ReactNode {\n const headingId = useId();\n\n // The risk-flag section composes the kit's warning `Alert` primitive rather\n // than re-painting the warning tokens by hand — same border, surface, alert\n // glyph, and `--warning-foreground` treatment as every other warning in the\n // app. `live=\"off\"`: the brief is static content, not a just-occurred event,\n // so the items read in normal flow instead of being announced assertively.\n // A per-section `icon` overrides Alert's default alert triangle.\n if (section.tone === 'attention') {\n // The shared `--shadow-card` lifts the warning callout to the same\n // elevation as the surrounding section cards, so the stack reads as one\n // set of raised panels rather than a flat warning band among cards.\n return (\n <Alert\n variant=\"warning\"\n live=\"off\"\n icon={section.icon}\n className=\"ds:shadow-[var(--shadow-card)]\"\n >\n <Alert.Title as=\"h3\">{section.heading}</Alert.Title>\n <ul className={ITEMS_CLASSES}>\n {section.items.map((item, index) => (\n <li key={index}>{item}</li>\n ))}\n </ul>\n </Alert>\n );\n }\n\n // Default sections are raised cards — the scannable \"panel per topic\" stack,\n // matching platform's Sintesi IA. The card owns its own padding (so we drive\n // it from a single content div rather than Card.Header/Body) and is named by\n // its heading for assistive tech.\n return (\n <Card variant=\"elevated\" aria-labelledby={headingId}>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {section.icon ? (\n <span aria-hidden=\"true\" className={MEDALLION_CLASSES}>\n {section.icon}\n </span>\n ) : null}\n <h3\n id={headingId}\n className=\"ds:m-0 type-eyebrow ds:text-[color:var(--foreground)]\"\n >\n {section.heading}\n </h3>\n </div>\n <ul className={`${ITEMS_CLASSES} ds:text-[color:var(--foreground)]`}>\n {section.items.map((item, index) => (\n <li key={index}>{item}</li>\n ))}\n </ul>\n </div>\n </Card>\n );\n}\n"],"names":["__iconNode","ContactRound","createLucideIcon","entitySummaryAgent","handle","MEDALLION_CLASSES","ITEMS_CLASSES","EntitySummary","forwardRef","id","title","entityName","entityHref","entityAvatarSrc","generatedAtIso","stats","sections","onRegenerate","regenerateLabel","onClose","disclaimer","locale","className","ariaLabel","rest","ref","t","useTranslation","headingId","useId","heading","sectionsRef","useRef","generatedAtRef","onRegenerateRef","onCloseRef","rootRef","useImperativeHandle","useMemo","s","_a","useAgentRegistration","generatedLine","jsxs","jsx","Clock","Timestamp","PanelHeader","Fragment","Button","RefreshCw","IconButton","X","Avatar","Link","Card","stat","index","section","Section","Alert","item"],"mappings":"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","x_google_ignoreList":[0]}
@@ -4,7 +4,7 @@ var i = (n, e, r) => u(n, typeof e != "symbol" ? e + "" : e, r);
4
4
  import { jsx as a, Fragment as y } from "react/jsx-runtime";
5
5
  import { Component as f } from "react";
6
6
  import { useTranslation as v } from "react-i18next";
7
- import { E } from "./empty-state-X0sVPfVo.js";
7
+ import { E } from "./empty-state-BUN_UAWf.js";
8
8
  function p({
9
9
  size: n,
10
10
  title: e,
@@ -87,4 +87,4 @@ i(b, "displayName", "ErrorBoundary");
87
87
  export {
88
88
  b as E
89
89
  };
90
- //# sourceMappingURL=error-boundary-ayXFCcq4.js.map
90
+ //# sourceMappingURL=error-boundary-BNT2iQ1w.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-boundary-ayXFCcq4.js","sources":["../../src/components/error-boundary/error-boundary.tsx"],"sourcesContent":["import { Component, type ErrorInfo, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { EmptyState } from '../empty-state/empty-state';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/** What the boundary caught, handed to a render-prop fallback. */\nexport interface ErrorBoundaryState {\n error: Error;\n /**\n * Runs `onRetry` if the host gave one, then clears the error and re-renders\n * the children — the same call the default face's action makes, so a host\n * that replaces the face does not silently lose its own recovery.\n */\n reset: () => void;\n}\n\nexport interface ErrorBoundaryProps {\n children?: ReactNode;\n /**\n * Replaces the default face. A function receives the error and a `reset`,\n * so a host can offer its own recovery instead of a reload.\n */\n fallback?: ReactNode | ((state: ErrorBoundaryState) => ReactNode);\n /** Report the crash — logging, telemetry, a support channel. */\n onError?: (error: Error, info: ErrorInfo) => void;\n /**\n * Clear the error when any of these change, so a route change or a new\n * record recovers without the user pressing anything.\n */\n resetKeys?: readonly unknown[];\n /** Overrides for the default face; each falls back to the kit's own copy. */\n title?: string;\n description?: string;\n /**\n * Shown as the face's action, and run by a render-prop's `reset` too.\n *\n * Called BEFORE the boundary clears. That is enough for a synchronous\n * recovery — a state flip, a cache clear. It is NOT enough on its own for an\n * async one: the boundary clears on the next line, so a refetch that has not\n * resolved re-renders into the same failure. Pair an async recovery with\n * `resetKeys`, so the settled data is what clears the error.\n */\n onRetry?: () => void;\n size?: 'sm' | 'md' | 'lg';\n}\n\n/* ------------------------------------------------------------------ */\n/* Default face */\n/* ------------------------------------------------------------------ */\n\n/**\n * A function component so the copy can come from `useTranslation` — the class\n * below cannot call a hook. It adds no strings of its own: an unset title or\n * description falls through to `EmptyState`'s own error copy, which already\n * ships in every locale.\n */\nfunction ErrorBoundaryFallback({\n size,\n title,\n description,\n onRetry,\n}: Pick<ErrorBoundaryProps, 'size' | 'title' | 'description' | 'onRetry'>) {\n const { t } = useTranslation();\n\n return (\n <EmptyState\n variant=\"error\"\n size={size}\n {...(title === undefined ? {} : { title })}\n {...(description === undefined ? {} : { description })}\n {...(onRetry === undefined\n ? {}\n : {\n primaryAction: {\n label: t('emptyState.error.cta'),\n onClick: onRetry,\n },\n })}\n />\n );\n}\n\nErrorBoundaryFallback.displayName = 'ErrorBoundaryFallback';\n\n/* ------------------------------------------------------------------ */\n/* Boundary */\n/* ------------------------------------------------------------------ */\n\n/**\n * Catches a render error below it and shows the kit's error face instead of\n * unmounting the tree to a blank page.\n *\n * A CLASS COMPONENT, by sanctioned exception — see\n * `src/docs/23-constraints.mdx` §9. React 18 exposes `getDerivedStateFromError`\n * and `componentDidCatch` on classes only; there is no hook form, and no\n * function component can catch a descendant's render error. The exception is\n * this file, and it is the reason the kit had no boundary at all.\n *\n * It catches RENDER errors. An event handler, a timeout or a rejected promise\n * never reaches it — React does not route those through a boundary — so a host\n * still handles its own async failures.\n */\nclass ErrorBoundary extends Component<\n ErrorBoundaryProps,\n { error: Error | null }\n> {\n static displayName = 'ErrorBoundary';\n\n state: { error: Error | null } = { error: null };\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n this.props.onError?.(error, info);\n }\n\n /**\n * A changed key clears the error. Compared by identity and in order, so a\n * host passing a fresh array of the same values does not re-render into the\n * same failure forever.\n *\n * `previousState` is load-bearing. React commits the caught error as an\n * ordinary update, so the first `componentDidUpdate` after a catch still sees\n * the props from the last HEALTHY commit. When the prop change is itself what\n * crashed the child — `resetKeys={[patientId]}` around something that throws\n * on the new patient, which is the documented use — the keys have moved, and\n * without this guard the boundary would clear on the very commit that caught\n * and render straight back into the failure. It settles on the second catch,\n * but the subtree renders twice and `onError` fires twice for one crash.\n */\n componentDidUpdate(\n previous: ErrorBoundaryProps,\n previousState: { error: Error | null },\n ) {\n if (this.state.error === null || previousState.error === null) return;\n\n const before = previous.resetKeys;\n const after = this.props.resetKeys;\n\n if (before === undefined || after === undefined) return;\n\n const moved =\n before.length !== after.length ||\n after.some((key, index) => !Object.is(key, before[index]));\n\n if (moved) this.reset();\n }\n\n reset = () => {\n this.setState({ error: null });\n };\n\n handleRetry = () => {\n /* The host's own recovery runs FIRST — a refetch, a cache clear — so the\n re-render it enables happens after it, not into the same failure. */\n this.props.onRetry?.();\n this.reset();\n };\n\n render() {\n const { error } = this.state;\n const { children, fallback, title, description, onRetry, size } =\n this.props;\n\n if (error === null) return <>{children}</>;\n\n const face =\n typeof fallback === 'function' ? (\n fallback({ error, reset: this.handleRetry })\n ) : fallback !== undefined ? (\n fallback\n ) : (\n <ErrorBoundaryFallback\n size={size}\n title={title}\n description={description}\n {...(onRetry === undefined ? {} : { onRetry: this.handleRetry })}\n />\n );\n\n /* The marker wraps EVERY caught branch, the host's own fallback included.\n Scoping it to the default face would make the contract below a lie: a\n host that supplies a fallback would render no marker while having very\n much caught, and anything reading its absence would call the surface\n healthy. */\n return <div data-component=\"error-boundary\">{face}</div>;\n }\n}\n\nexport { ErrorBoundary };\n"],"names":["ErrorBoundaryFallback","size","title","description","onRetry","useTranslation","jsx","EmptyState","ErrorBoundary","Component","__publicField","_b","_a","error","info","previous","previousState","before","after","key","index","children","fallback","Fragment","face"],"mappings":";;;;;;;AA2DA,SAASA,EAAsB;AAAA,EAC7B,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AACF,GAA2E;AACzE,QAAM,EAAE,EAAA,IAAMC,EAAA;AAEd,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAAN;AAAA,MACC,GAAIC,MAAU,SAAY,CAAA,IAAK,EAAE,OAAAA,EAAA;AAAA,MACjC,GAAIC,MAAgB,SAAY,CAAA,IAAK,EAAE,aAAAA,EAAA;AAAA,MACvC,GAAIC,MAAY,SACb,KACA;AAAA,QACE,eAAe;AAAA,UACb,OAAO,EAAE,sBAAsB;AAAA,UAC/B,SAASA;AAAA,QAAA;AAAA,MACX;AAAA,IACF;AAAA,EAAA;AAGV;AAEAJ,EAAsB,cAAc;AAoBpC,MAAMQ,UAAsBC,EAG1B;AAAA,EAHF;AAAA;AAME,IAAAC,EAAA,eAAiC,EAAE,OAAO,KAAA;AA0C1C,IAAAA,EAAA,eAAQ,MAAM;AACZ,WAAK,SAAS,EAAE,OAAO,KAAA,CAAM;AAAA,IAC/B;AAEA,IAAAA,EAAA,qBAAc,MAAM;;AAGlB,OAAAC,KAAAC,IAAA,KAAK,OAAM,YAAX,QAAAD,EAAA,KAAAC,IACA,KAAK,MAAA;AAAA,IACP;AAAA;AAAA,EAjDA,OAAO,yBAAyBC,GAAc;AAC5C,WAAO,EAAE,OAAAA,EAAA;AAAA,EACX;AAAA,EAEA,kBAAkBA,GAAcC,GAAiB;;AAC/C,KAAAH,KAAAC,IAAA,KAAK,OAAM,YAAX,QAAAD,EAAA,KAAAC,GAAqBC,GAAOC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,mBACEC,GACAC,GACA;AACA,QAAI,KAAK,MAAM,UAAU,QAAQA,EAAc,UAAU,KAAM;AAE/D,UAAMC,IAASF,EAAS,WAClBG,IAAQ,KAAK,MAAM;AAEzB,QAAID,MAAW,UAAaC,MAAU,OAAW;AAMjD,KAHED,EAAO,WAAWC,EAAM,UACxBA,EAAM,KAAK,CAACC,GAAKC,MAAU,CAAC,OAAO,GAAGD,GAAKF,EAAOG,CAAK,CAAC,CAAC,WAE3C,MAAA;AAAA,EAClB;AAAA,EAaA,SAAS;AACP,UAAM,EAAE,OAAAP,MAAU,KAAK,OACjB,EAAE,UAAAQ,GAAU,UAAAC,GAAU,OAAApB,GAAO,aAAAC,GAAa,SAAAC,GAAS,MAAAH,MACvD,KAAK;AAEP,QAAIY,MAAU,KAAM,QAAO,gBAAAP,EAAAiB,GAAA,EAAG,UAAAF,GAAS;AAEvC,UAAMG,IACJ,OAAOF,KAAa,aAClBA,EAAS,EAAE,OAAAT,GAAO,OAAO,KAAK,YAAA,CAAa,IACzCS,MAAa,SACfA,IAEA,gBAAAhB;AAAA,MAACN;AAAA,MAAA;AAAA,QACC,MAAAC;AAAA,QACA,OAAAC;AAAA,QACA,aAAAC;AAAA,QACC,GAAIC,MAAY,SAAY,CAAA,IAAK,EAAE,SAAS,KAAK,YAAA;AAAA,MAAY;AAAA,IAAA;AASpE,WAAO,gBAAAE,EAAC,OAAA,EAAI,kBAAe,kBAAkB,UAAAkB,GAAK;AAAA,EACpD;AACF;AAnFEd,EAJIF,GAIG,eAAc;"}
1
+ {"version":3,"file":"error-boundary-BNT2iQ1w.js","sources":["../../src/components/error-boundary/error-boundary.tsx"],"sourcesContent":["import { Component, type ErrorInfo, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { EmptyState } from '../empty-state/empty-state';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/** What the boundary caught, handed to a render-prop fallback. */\nexport interface ErrorBoundaryState {\n error: Error;\n /**\n * Runs `onRetry` if the host gave one, then clears the error and re-renders\n * the children — the same call the default face's action makes, so a host\n * that replaces the face does not silently lose its own recovery.\n */\n reset: () => void;\n}\n\nexport interface ErrorBoundaryProps {\n children?: ReactNode;\n /**\n * Replaces the default face. A function receives the error and a `reset`,\n * so a host can offer its own recovery instead of a reload.\n */\n fallback?: ReactNode | ((state: ErrorBoundaryState) => ReactNode);\n /** Report the crash — logging, telemetry, a support channel. */\n onError?: (error: Error, info: ErrorInfo) => void;\n /**\n * Clear the error when any of these change, so a route change or a new\n * record recovers without the user pressing anything.\n */\n resetKeys?: readonly unknown[];\n /** Overrides for the default face; each falls back to the kit's own copy. */\n title?: string;\n description?: string;\n /**\n * Shown as the face's action, and run by a render-prop's `reset` too.\n *\n * Called BEFORE the boundary clears. That is enough for a synchronous\n * recovery — a state flip, a cache clear. It is NOT enough on its own for an\n * async one: the boundary clears on the next line, so a refetch that has not\n * resolved re-renders into the same failure. Pair an async recovery with\n * `resetKeys`, so the settled data is what clears the error.\n */\n onRetry?: () => void;\n size?: 'sm' | 'md' | 'lg';\n}\n\n/* ------------------------------------------------------------------ */\n/* Default face */\n/* ------------------------------------------------------------------ */\n\n/**\n * A function component so the copy can come from `useTranslation` — the class\n * below cannot call a hook. It adds no strings of its own: an unset title or\n * description falls through to `EmptyState`'s own error copy, which already\n * ships in every locale.\n */\nfunction ErrorBoundaryFallback({\n size,\n title,\n description,\n onRetry,\n}: Pick<ErrorBoundaryProps, 'size' | 'title' | 'description' | 'onRetry'>) {\n const { t } = useTranslation();\n\n return (\n <EmptyState\n variant=\"error\"\n size={size}\n {...(title === undefined ? {} : { title })}\n {...(description === undefined ? {} : { description })}\n {...(onRetry === undefined\n ? {}\n : {\n primaryAction: {\n label: t('emptyState.error.cta'),\n onClick: onRetry,\n },\n })}\n />\n );\n}\n\nErrorBoundaryFallback.displayName = 'ErrorBoundaryFallback';\n\n/* ------------------------------------------------------------------ */\n/* Boundary */\n/* ------------------------------------------------------------------ */\n\n/**\n * Catches a render error below it and shows the kit's error face instead of\n * unmounting the tree to a blank page.\n *\n * A CLASS COMPONENT, by sanctioned exception — see\n * `src/docs/23-constraints.mdx` §9. React 18 exposes `getDerivedStateFromError`\n * and `componentDidCatch` on classes only; there is no hook form, and no\n * function component can catch a descendant's render error. The exception is\n * this file, and it is the reason the kit had no boundary at all.\n *\n * It catches RENDER errors. An event handler, a timeout or a rejected promise\n * never reaches it — React does not route those through a boundary — so a host\n * still handles its own async failures.\n */\nclass ErrorBoundary extends Component<\n ErrorBoundaryProps,\n { error: Error | null }\n> {\n static displayName = 'ErrorBoundary';\n\n state: { error: Error | null } = { error: null };\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n this.props.onError?.(error, info);\n }\n\n /**\n * A changed key clears the error. Compared by identity and in order, so a\n * host passing a fresh array of the same values does not re-render into the\n * same failure forever.\n *\n * `previousState` is load-bearing. React commits the caught error as an\n * ordinary update, so the first `componentDidUpdate` after a catch still sees\n * the props from the last HEALTHY commit. When the prop change is itself what\n * crashed the child — `resetKeys={[patientId]}` around something that throws\n * on the new patient, which is the documented use — the keys have moved, and\n * without this guard the boundary would clear on the very commit that caught\n * and render straight back into the failure. It settles on the second catch,\n * but the subtree renders twice and `onError` fires twice for one crash.\n */\n componentDidUpdate(\n previous: ErrorBoundaryProps,\n previousState: { error: Error | null },\n ) {\n if (this.state.error === null || previousState.error === null) return;\n\n const before = previous.resetKeys;\n const after = this.props.resetKeys;\n\n if (before === undefined || after === undefined) return;\n\n const moved =\n before.length !== after.length ||\n after.some((key, index) => !Object.is(key, before[index]));\n\n if (moved) this.reset();\n }\n\n reset = () => {\n this.setState({ error: null });\n };\n\n handleRetry = () => {\n /* The host's own recovery runs FIRST — a refetch, a cache clear — so the\n re-render it enables happens after it, not into the same failure. */\n this.props.onRetry?.();\n this.reset();\n };\n\n render() {\n const { error } = this.state;\n const { children, fallback, title, description, onRetry, size } =\n this.props;\n\n if (error === null) return <>{children}</>;\n\n const face =\n typeof fallback === 'function' ? (\n fallback({ error, reset: this.handleRetry })\n ) : fallback !== undefined ? (\n fallback\n ) : (\n <ErrorBoundaryFallback\n size={size}\n title={title}\n description={description}\n {...(onRetry === undefined ? {} : { onRetry: this.handleRetry })}\n />\n );\n\n /* The marker wraps EVERY caught branch, the host's own fallback included.\n Scoping it to the default face would make the contract below a lie: a\n host that supplies a fallback would render no marker while having very\n much caught, and anything reading its absence would call the surface\n healthy. */\n return <div data-component=\"error-boundary\">{face}</div>;\n }\n}\n\nexport { ErrorBoundary };\n"],"names":["ErrorBoundaryFallback","size","title","description","onRetry","useTranslation","jsx","EmptyState","ErrorBoundary","Component","__publicField","_b","_a","error","info","previous","previousState","before","after","key","index","children","fallback","Fragment","face"],"mappings":";;;;;;;AA2DA,SAASA,EAAsB;AAAA,EAC7B,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AACF,GAA2E;AACzE,QAAM,EAAE,EAAA,IAAMC,EAAA;AAEd,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAAN;AAAA,MACC,GAAIC,MAAU,SAAY,CAAA,IAAK,EAAE,OAAAA,EAAA;AAAA,MACjC,GAAIC,MAAgB,SAAY,CAAA,IAAK,EAAE,aAAAA,EAAA;AAAA,MACvC,GAAIC,MAAY,SACb,KACA;AAAA,QACE,eAAe;AAAA,UACb,OAAO,EAAE,sBAAsB;AAAA,UAC/B,SAASA;AAAA,QAAA;AAAA,MACX;AAAA,IACF;AAAA,EAAA;AAGV;AAEAJ,EAAsB,cAAc;AAoBpC,MAAMQ,UAAsBC,EAG1B;AAAA,EAHF;AAAA;AAME,IAAAC,EAAA,eAAiC,EAAE,OAAO,KAAA;AA0C1C,IAAAA,EAAA,eAAQ,MAAM;AACZ,WAAK,SAAS,EAAE,OAAO,KAAA,CAAM;AAAA,IAC/B;AAEA,IAAAA,EAAA,qBAAc,MAAM;;AAGlB,OAAAC,KAAAC,IAAA,KAAK,OAAM,YAAX,QAAAD,EAAA,KAAAC,IACA,KAAK,MAAA;AAAA,IACP;AAAA;AAAA,EAjDA,OAAO,yBAAyBC,GAAc;AAC5C,WAAO,EAAE,OAAAA,EAAA;AAAA,EACX;AAAA,EAEA,kBAAkBA,GAAcC,GAAiB;;AAC/C,KAAAH,KAAAC,IAAA,KAAK,OAAM,YAAX,QAAAD,EAAA,KAAAC,GAAqBC,GAAOC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,mBACEC,GACAC,GACA;AACA,QAAI,KAAK,MAAM,UAAU,QAAQA,EAAc,UAAU,KAAM;AAE/D,UAAMC,IAASF,EAAS,WAClBG,IAAQ,KAAK,MAAM;AAEzB,QAAID,MAAW,UAAaC,MAAU,OAAW;AAMjD,KAHED,EAAO,WAAWC,EAAM,UACxBA,EAAM,KAAK,CAACC,GAAKC,MAAU,CAAC,OAAO,GAAGD,GAAKF,EAAOG,CAAK,CAAC,CAAC,WAE3C,MAAA;AAAA,EAClB;AAAA,EAaA,SAAS;AACP,UAAM,EAAE,OAAAP,MAAU,KAAK,OACjB,EAAE,UAAAQ,GAAU,UAAAC,GAAU,OAAApB,GAAO,aAAAC,GAAa,SAAAC,GAAS,MAAAH,MACvD,KAAK;AAEP,QAAIY,MAAU,KAAM,QAAO,gBAAAP,EAAAiB,GAAA,EAAG,UAAAF,GAAS;AAEvC,UAAMG,IACJ,OAAOF,KAAa,aAClBA,EAAS,EAAE,OAAAT,GAAO,OAAO,KAAK,YAAA,CAAa,IACzCS,MAAa,SACfA,IAEA,gBAAAhB;AAAA,MAACN;AAAA,MAAA;AAAA,QACC,MAAAC;AAAA,QACA,OAAAC;AAAA,QACA,aAAAC;AAAA,QACC,GAAIC,MAAY,SAAY,CAAA,IAAK,EAAE,SAAS,KAAK,YAAA;AAAA,MAAY;AAAA,IAAA;AASpE,WAAO,gBAAAE,EAAC,OAAA,EAAI,kBAAe,kBAAkB,UAAAkB,GAAK;AAAA,EACpD;AACF;AAnFEd,EAJIF,GAIG,eAAc;"}