@alfadocs/ui-kit-debug 0.72.1 → 0.73.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 (556) hide show
  1. package/dist/_chunks/{agenda-tray-loL2A3Cx.js → agenda-tray-CVf-jfWU.js} +3 -3
  2. package/dist/_chunks/{agenda-tray-loL2A3Cx.js.map → agenda-tray-CVf-jfWU.js.map} +1 -1
  3. package/dist/_chunks/{ai-consent-banner-Bke9m8VS.js → ai-consent-banner-DUhr1yNj.js} +2 -2
  4. package/dist/_chunks/{ai-consent-banner-Bke9m8VS.js.map → ai-consent-banner-DUhr1yNj.js.map} +1 -1
  5. package/dist/_chunks/{ai-prompt-input-TVI95hJD.js → ai-prompt-input-DFm58UjY.js} +2 -2
  6. package/dist/_chunks/{ai-prompt-input-TVI95hJD.js.map → ai-prompt-input-DFm58UjY.js.map} +1 -1
  7. package/dist/_chunks/{alia-sidebar-BV5lBSFR.js → alia-sidebar-w6B0TEx7.js} +8 -8
  8. package/dist/_chunks/{alia-sidebar-BV5lBSFR.js.map → alia-sidebar-w6B0TEx7.js.map} +1 -1
  9. package/dist/_chunks/{anamnesis-card-CWO4Ui9c.js → anamnesis-card-CJ5MNbkc.js} +2 -2
  10. package/dist/_chunks/{anamnesis-card-CWO4Ui9c.js.map → anamnesis-card-CJ5MNbkc.js.map} +1 -1
  11. package/dist/_chunks/{antenatal-schedule-timeline-CY-VsLok.js → antenatal-schedule-timeline-BzJZqS-8.js} +3 -3
  12. package/dist/_chunks/{antenatal-schedule-timeline-CY-VsLok.js.map → antenatal-schedule-timeline-BzJZqS-8.js.map} +1 -1
  13. package/dist/_chunks/{appointment-card-Cy4FOkGP.js → appointment-card-DgKI5QKD.js} +2 -2
  14. package/dist/_chunks/{appointment-card-Cy4FOkGP.js.map → appointment-card-DgKI5QKD.js.map} +1 -1
  15. package/dist/_chunks/{appointment-timeline-BWAPPk8F.js → appointment-timeline-DQTG0btW.js} +6 -6
  16. package/dist/_chunks/{appointment-timeline-BWAPPk8F.js.map → appointment-timeline-DQTG0btW.js.map} +1 -1
  17. package/dist/_chunks/{appointment-tray-D3mk04TT.js → appointment-tray-ezyCZN8v.js} +4 -4
  18. package/dist/_chunks/{appointment-tray-D3mk04TT.js.map → appointment-tray-ezyCZN8v.js.map} +1 -1
  19. package/dist/_chunks/{ar-BOqyIfoY.js → ar-B1GhtlBP.js} +2 -2
  20. package/dist/_chunks/{ar-BOqyIfoY.js.map → ar-B1GhtlBP.js.map} +1 -1
  21. package/dist/_chunks/arrow-up-right-C2v_MKsK.js +15 -0
  22. package/dist/_chunks/arrow-up-right-C2v_MKsK.js.map +1 -0
  23. package/dist/_chunks/{audio-recorder-BbjG55dP.js → audio-recorder-CjAY0GAc.js} +3 -3
  24. package/dist/_chunks/{audio-recorder-BbjG55dP.js.map → audio-recorder-CjAY0GAc.js.map} +1 -1
  25. package/dist/_chunks/{benefit-card-Xnxj4Gmo.js → benefit-card-DB1Kdrmc.js} +4 -2
  26. package/dist/_chunks/benefit-card-DB1Kdrmc.js.map +1 -0
  27. package/dist/_chunks/{bishop-score-C6eoak_j.js → bishop-score-Bs6t6Zv1.js} +2 -2
  28. package/dist/_chunks/{bishop-score-C6eoak_j.js.map → bishop-score-Bs6t6Zv1.js.map} +1 -1
  29. package/dist/_chunks/{bmi-calculator-BmQfoEGP.js → bmi-calculator-Bk2GAju7.js} +2 -2
  30. package/dist/_chunks/{bmi-calculator-BmQfoEGP.js.map → bmi-calculator-Bk2GAju7.js.map} +1 -1
  31. package/dist/_chunks/{booking-B62CMY5k.js → booking-CWnZhZ5g.js} +8 -8
  32. package/dist/_chunks/{booking-B62CMY5k.js.map → booking-CWnZhZ5g.js.map} +1 -1
  33. package/dist/_chunks/{button-DD_0Xdmr.js → button-CPGiR_bH.js} +56 -35
  34. package/dist/_chunks/button-CPGiR_bH.js.map +1 -0
  35. package/dist/_chunks/button-group-DzV5wgnx.js +289 -0
  36. package/dist/_chunks/button-group-DzV5wgnx.js.map +1 -0
  37. package/dist/_chunks/camera-VSklPDCv.js +21 -0
  38. package/dist/_chunks/camera-VSklPDCv.js.map +1 -0
  39. package/dist/_chunks/{care-plan-card-DhXbfGzE.js → care-plan-card-CfIP3Vc1.js} +3 -3
  40. package/dist/_chunks/{care-plan-card-DhXbfGzE.js.map → care-plan-card-CfIP3Vc1.js.map} +1 -1
  41. package/dist/_chunks/{care-plan-entry-card-D3YGD6rj.js → care-plan-entry-card-CRbS-G00.js} +3 -3
  42. package/dist/_chunks/{care-plan-entry-card-D3YGD6rj.js.map → care-plan-entry-card-CRbS-G00.js.map} +1 -1
  43. package/dist/_chunks/{care-plan-header-DtQxyfOb.js → care-plan-header-BXvRpGG8.js} +2 -2
  44. package/dist/_chunks/{care-plan-header-DtQxyfOb.js.map → care-plan-header-BXvRpGG8.js.map} +1 -1
  45. package/dist/_chunks/{carousel.agent-j7hWxJWr.js → carousel.agent-CtAAdsAd.js} +2 -2
  46. package/dist/_chunks/{carousel.agent-j7hWxJWr.js.map → carousel.agent-CtAAdsAd.js.map} +1 -1
  47. package/dist/_chunks/{chat-container-BVCoN06N.js → chat-container-HlFnoEIl.js} +4 -2
  48. package/dist/_chunks/{chat-container-BVCoN06N.js.map → chat-container-HlFnoEIl.js.map} +1 -1
  49. package/dist/_chunks/{chat-input-Btq_uuMZ.js → chat-input-BTCDqUDX.js} +2 -2
  50. package/dist/_chunks/{chat-input-Btq_uuMZ.js.map → chat-input-BTCDqUDX.js.map} +1 -1
  51. package/dist/_chunks/{chat-message-DXjjM8z9.js → chat-message-CdjWqZjo.js} +3 -3
  52. package/dist/_chunks/{chat-message-DXjjM8z9.js.map → chat-message-CdjWqZjo.js.map} +1 -1
  53. package/dist/_chunks/{code-block-Cwi7e3HM.js → code-block-BwanBjRh.js} +2 -2
  54. package/dist/_chunks/{code-block-Cwi7e3HM.js.map → code-block-BwanBjRh.js.map} +1 -1
  55. package/dist/_chunks/{connection-status-0HajXMXM.js → connection-status-oEUyrvev.js} +3 -3
  56. package/dist/_chunks/{connection-status-0HajXMXM.js.map → connection-status-oEUyrvev.js.map} +1 -1
  57. package/dist/_chunks/{contact-profile-card-IggiUVpN.js → contact-profile-card-veMV3W4J.js} +2 -2
  58. package/dist/_chunks/{contact-profile-card-IggiUVpN.js.map → contact-profile-card-veMV3W4J.js.map} +1 -1
  59. package/dist/_chunks/{control-room-rail-DaGcsdZ6.js → control-room-rail-CdfrZ6Vr.js} +3 -3
  60. package/dist/_chunks/{control-room-rail-DaGcsdZ6.js.map → control-room-rail-CdfrZ6Vr.js.map} +1 -1
  61. package/dist/_chunks/{copy-field-PAp0-Wr5.js → copy-field-DBc9QquW.js} +2 -2
  62. package/dist/_chunks/{copy-field-PAp0-Wr5.js.map → copy-field-DBc9QquW.js.map} +1 -1
  63. package/dist/_chunks/{cycle-calculator-BNILyVas.js → cycle-calculator-OQp8Ik5U.js} +4 -4
  64. package/dist/_chunks/{cycle-calculator-BNILyVas.js.map → cycle-calculator-OQp8Ik5U.js.map} +1 -1
  65. package/dist/_chunks/{date-picker-CVkD_lOi.js → date-picker-DzQS8mvt.js} +2 -2
  66. package/dist/_chunks/{date-picker-CVkD_lOi.js.map → date-picker-DzQS8mvt.js.map} +1 -1
  67. package/dist/_chunks/{date-picker-variants-DLg-ZrIo.js → date-picker-variants-CYQAm1Gk.js} +116 -115
  68. package/dist/_chunks/{date-picker-variants-DLg-ZrIo.js.map → date-picker-variants-CYQAm1Gk.js.map} +1 -1
  69. package/dist/_chunks/{date-range-picker-Dw12DgV8.js → date-range-picker-Cbz1SKhm.js} +3 -3
  70. package/dist/_chunks/{date-range-picker-Dw12DgV8.js.map → date-range-picker-Cbz1SKhm.js.map} +1 -1
  71. package/dist/_chunks/{date-time-picker-Cd_OJtOy.js → date-time-picker-B5IpU-nd.js} +2 -2
  72. package/dist/_chunks/{date-time-picker-Cd_OJtOy.js.map → date-time-picker-B5IpU-nd.js.map} +1 -1
  73. package/dist/_chunks/{de-DFLsUxeV.js → de-DETDHQ0o.js} +2 -2
  74. package/dist/_chunks/{de-DFLsUxeV.js.map → de-DETDHQ0o.js.map} +1 -1
  75. package/dist/_chunks/{description-list-CmBVxIF5.js → description-list-ClNLdRMy.js} +2 -2
  76. package/dist/_chunks/{description-list-CmBVxIF5.js.map → description-list-ClNLdRMy.js.map} +1 -1
  77. package/dist/_chunks/{document-scanner-B23j4w7X.js → document-scanner-BE6Jz4Ob.js} +198 -230
  78. package/dist/_chunks/document-scanner-BE6Jz4Ob.js.map +1 -0
  79. package/dist/_chunks/{due-date-calculator-CmdAl_JO.js → due-date-calculator-DASNRgnH.js} +4 -4
  80. package/dist/_chunks/{due-date-calculator-CmdAl_JO.js.map → due-date-calculator-DASNRgnH.js.map} +1 -1
  81. package/dist/_chunks/{editable-currency-cell-renderer-z9fJFw6Z.js → editable-currency-cell-renderer-GwfA9tTR.js} +3 -3
  82. package/dist/_chunks/{editable-currency-cell-renderer-z9fJFw6Z.js.map → editable-currency-cell-renderer-GwfA9tTR.js.map} +1 -1
  83. package/dist/_chunks/{editor-overlay-BIOzr8v7.js → editor-overlay-DE3esyio.js} +2 -2
  84. package/dist/_chunks/{editor-overlay-BIOzr8v7.js.map → editor-overlay-DE3esyio.js.map} +1 -1
  85. package/dist/_chunks/{el-OVjBKytp.js → el-HV3jOI0z.js} +2 -2
  86. package/dist/_chunks/{el-OVjBKytp.js.map → el-HV3jOI0z.js.map} +1 -1
  87. package/dist/_chunks/{empty-state-BLy7tigq.js → empty-state-CrLsi0XI.js} +2 -2
  88. package/dist/_chunks/{empty-state-BLy7tigq.js.map → empty-state-CrLsi0XI.js.map} +1 -1
  89. package/dist/_chunks/{entity-summary-DpGziDv5.js → entity-summary--vP698Jn.js} +3 -3
  90. package/dist/_chunks/{entity-summary-DpGziDv5.js.map → entity-summary--vP698Jn.js.map} +1 -1
  91. package/dist/_chunks/eraser-CHOGQfVv.js +21 -0
  92. package/dist/_chunks/eraser-CHOGQfVv.js.map +1 -0
  93. package/dist/_chunks/{es-DKDNrHXG.js → es-Dpo7Olwo.js} +2 -2
  94. package/dist/_chunks/{es-DKDNrHXG.js.map → es-Dpo7Olwo.js.map} +1 -1
  95. package/dist/_chunks/face-scheme-C0rk21gg.js +3146 -0
  96. package/dist/_chunks/face-scheme-C0rk21gg.js.map +1 -0
  97. package/dist/_chunks/{fetal-weight-CVAH8sJ3.js → fetal-weight-1F9N4IMx.js} +2 -2
  98. package/dist/_chunks/{fetal-weight-CVAH8sJ3.js.map → fetal-weight-1F9N4IMx.js.map} +1 -1
  99. package/dist/_chunks/{field-array-CDzc3hTM.js → field-array-DH3Mb1i8.js} +3 -3
  100. package/dist/_chunks/{field-array-CDzc3hTM.js.map → field-array-DH3Mb1i8.js.map} +1 -1
  101. package/dist/_chunks/{field-value-Dj3i52H2.js → field-value-DCXJXKab.js} +5 -5
  102. package/dist/_chunks/{field-value-Dj3i52H2.js.map → field-value-DCXJXKab.js.map} +1 -1
  103. package/dist/_chunks/{file-upload-Kw1rdvFw.js → file-upload-B2SXhRiN.js} +104 -111
  104. package/dist/_chunks/file-upload-B2SXhRiN.js.map +1 -0
  105. package/dist/_chunks/{finished-terminal-Di4gtZ50.js → finished-terminal-C0_mefrf.js} +11 -11
  106. package/dist/_chunks/finished-terminal-C0_mefrf.js.map +1 -0
  107. package/dist/_chunks/{fiscal-code-input-DKNXFXs3.js → fiscal-code-input-DWA6C8x8.js} +2 -2
  108. package/dist/_chunks/{fiscal-code-input-DKNXFXs3.js.map → fiscal-code-input-DWA6C8x8.js.map} +1 -1
  109. package/dist/_chunks/{fr-BfMvQh-v.js → fr-CgD4Jvtq.js} +2 -2
  110. package/dist/_chunks/{fr-BfMvQh-v.js.map → fr-CgD4Jvtq.js.map} +1 -1
  111. package/dist/_chunks/{freemium-paywall-DFoeedwh.js → freemium-paywall-CmV642PA.js} +7 -3
  112. package/dist/_chunks/freemium-paywall-CmV642PA.js.map +1 -0
  113. package/dist/_chunks/{gestational-age-calculator-BwCBPAGX.js → gestational-age-calculator-C9Dfis4I.js} +6 -6
  114. package/dist/_chunks/{gestational-age-calculator-BwCBPAGX.js.map → gestational-age-calculator-C9Dfis4I.js.map} +1 -1
  115. package/dist/_chunks/{hcg-doubling-CSsWxEJc.js → hcg-doubling-Dqj-EqMT.js} +3 -3
  116. package/dist/_chunks/{hcg-doubling-CSsWxEJc.js.map → hcg-doubling-Dqj-EqMT.js.map} +1 -1
  117. package/dist/_chunks/{header-DaXWDw0M.js → header-CjwasYnn.js} +88 -79
  118. package/dist/_chunks/header-CjwasYnn.js.map +1 -0
  119. package/dist/_chunks/{header-settings-B0G_u-wV.js → header-settings-CRQDCYgr.js} +4 -4
  120. package/dist/_chunks/{header-settings-B0G_u-wV.js.map → header-settings-CRQDCYgr.js.map} +1 -1
  121. package/dist/_chunks/{hi-C0GEMwlD.js → hi-Bf8CAP6b.js} +2 -2
  122. package/dist/_chunks/{hi-C0GEMwlD.js.map → hi-Bf8CAP6b.js.map} +1 -1
  123. package/dist/_chunks/highlighter-DSkckT2Q.js +15 -0
  124. package/dist/_chunks/highlighter-DSkckT2Q.js.map +1 -0
  125. package/dist/_chunks/{icon-button-LqoiKcUN.js → icon-button-C_kbcd7I.js} +2 -2
  126. package/dist/_chunks/{icon-button-LqoiKcUN.js.map → icon-button-C_kbcd7I.js.map} +1 -1
  127. package/dist/_chunks/icon-button-group-C_lqXTAj.js +391 -0
  128. package/dist/_chunks/icon-button-group-C_lqXTAj.js.map +1 -0
  129. package/dist/_chunks/{icon-picker-Di6uYDG-.js → icon-picker-BePK27S-.js} +3 -3
  130. package/dist/_chunks/{icon-picker-Di6uYDG-.js.map → icon-picker-BePK27S-.js.map} +1 -1
  131. package/dist/_chunks/{image-cropper-CdmWFrMC.js → image-cropper-DKe4AORY.js} +2 -2
  132. package/dist/_chunks/{image-cropper-CdmWFrMC.js.map → image-cropper-DKe4AORY.js.map} +1 -1
  133. package/dist/_chunks/{insert-result-C7xSDb8q.js → insert-result-D074GtHX.js} +58 -68
  134. package/dist/_chunks/insert-result-D074GtHX.js.map +1 -0
  135. package/dist/_chunks/{isSameWeek-HddDAyJG.js → isSameWeek-BYl5poz_.js} +2 -2
  136. package/dist/_chunks/{isSameWeek-HddDAyJG.js.map → isSameWeek-BYl5poz_.js.map} +1 -1
  137. package/dist/_chunks/{it-5f4hiT2e.js → it-mt1V2DFS.js} +3 -3
  138. package/dist/_chunks/{it-5f4hiT2e.js.map → it-mt1V2DFS.js.map} +1 -1
  139. package/dist/_chunks/{ja-U0_2inl_.js → ja-CbOHn2TO.js} +2 -2
  140. package/dist/_chunks/{ja-U0_2inl_.js.map → ja-CbOHn2TO.js.map} +1 -1
  141. package/dist/_chunks/{key-value-pair-Byyyc_9J.js → key-value-pair-LHKfDT_9.js} +2 -2
  142. package/dist/_chunks/{key-value-pair-Byyyc_9J.js.map → key-value-pair-LHKfDT_9.js.map} +1 -1
  143. package/dist/_chunks/{link-cell-renderer-BCppbMec.js → link-cell-renderer-CLI7sBkX.js} +803 -778
  144. package/dist/_chunks/link-cell-renderer-CLI7sBkX.js.map +1 -0
  145. package/dist/_chunks/{locale-picker-DzF7Q5Y8.js → locale-picker-Cbfqc0_N.js} +3 -3
  146. package/dist/_chunks/{locale-picker-DzF7Q5Y8.js.map → locale-picker-Cbfqc0_N.js.map} +1 -1
  147. package/dist/_chunks/{map-view-ByPvWG_9.js → map-view-CsaHfoo6.js} +2 -2
  148. package/dist/_chunks/{map-view-ByPvWG_9.js.map → map-view-CsaHfoo6.js.map} +1 -1
  149. package/dist/_chunks/{marketplace-app-shell-BCYiOvKZ.js → marketplace-app-shell-Dm6S-hun.js} +6 -6
  150. package/dist/_chunks/marketplace-app-shell-Dm6S-hun.js.map +1 -0
  151. package/dist/_chunks/{message-card-BZnnffyB.js → message-card-ievotOFa.js} +3 -3
  152. package/dist/_chunks/{message-card-BZnnffyB.js.map → message-card-ievotOFa.js.map} +1 -1
  153. package/dist/_chunks/{message-tray-cUHOCdU0.js → message-tray-BFlu8clI.js} +4 -4
  154. package/dist/_chunks/{message-tray-cUHOCdU0.js.map → message-tray-BFlu8clI.js.map} +1 -1
  155. package/dist/_chunks/{nl-CDVnnx1U.js → nl-C6Y0QXnm.js} +2 -2
  156. package/dist/_chunks/{nl-CDVnnx1U.js.map → nl-C6Y0QXnm.js.map} +1 -1
  157. package/dist/_chunks/{notes-panel-CMyjUXD4.js → notes-panel-B_8-Mebz.js} +3 -3
  158. package/dist/_chunks/{notes-panel-CMyjUXD4.js.map → notes-panel-B_8-Mebz.js.map} +1 -1
  159. package/dist/_chunks/{notification-card-BHJ07FkH.js → notification-card-D29_sVA1.js} +3 -3
  160. package/dist/_chunks/{notification-card-BHJ07FkH.js.map → notification-card-D29_sVA1.js.map} +1 -1
  161. package/dist/_chunks/{notification-tray-Dzm1c3Wy.js → notification-tray-CzIzz3bX.js} +4 -4
  162. package/dist/_chunks/{notification-tray-Dzm1c3Wy.js.map → notification-tray-CzIzz3bX.js.map} +1 -1
  163. package/dist/_chunks/optical-prescription-BQ75_kf6.js +1260 -0
  164. package/dist/_chunks/optical-prescription-BQ75_kf6.js.map +1 -0
  165. package/dist/_chunks/{patient-details-pU_E5xM2.js → patient-details-JkOI3Ijd.js} +6 -6
  166. package/dist/_chunks/{patient-details-pU_E5xM2.js.map → patient-details-JkOI3Ijd.js.map} +1 -1
  167. package/dist/_chunks/{patient-search-X9SUZGpy.js → patient-search-BaUJ_Y-N.js} +47 -45
  168. package/dist/_chunks/patient-search-BaUJ_Y-N.js.map +1 -0
  169. package/dist/_chunks/{patient-summary-card--t3BjTdU.js → patient-summary-card-CQOLMH3E.js} +4 -4
  170. package/dist/_chunks/{patient-summary-card--t3BjTdU.js.map → patient-summary-card-CQOLMH3E.js.map} +1 -1
  171. package/dist/_chunks/{patient-table-BgWgNIMf.js → patient-table-B_mOe-ZT.js} +2 -2
  172. package/dist/_chunks/{patient-table-BgWgNIMf.js.map → patient-table-B_mOe-ZT.js.map} +1 -1
  173. package/dist/_chunks/{payment-request-card-2ts7ITxd.js → payment-request-card-C0fqlKqO.js} +25 -24
  174. package/dist/_chunks/{payment-request-card-2ts7ITxd.js.map → payment-request-card-C0fqlKqO.js.map} +1 -1
  175. package/dist/_chunks/pen-line-D0De5zdl.js +21 -0
  176. package/dist/_chunks/pen-line-D0De5zdl.js.map +1 -0
  177. package/dist/_chunks/{periodontal-chart-card-6c6Lt4ws.js → periodontal-chart-card-WVjJAheq.js} +2 -2
  178. package/dist/_chunks/{periodontal-chart-card-6c6Lt4ws.js.map → periodontal-chart-card-WVjJAheq.js.map} +1 -1
  179. package/dist/_chunks/{pl-BWNumNrg.js → pl-BdazJAOp.js} +3 -3
  180. package/dist/_chunks/{pl-BWNumNrg.js.map → pl-BdazJAOp.js.map} +1 -1
  181. package/dist/_chunks/{popover-uJ6BvEU3.js → popover-DGTKfLWh.js} +2 -2
  182. package/dist/_chunks/{popover-uJ6BvEU3.js.map → popover-DGTKfLWh.js.map} +1 -1
  183. package/dist/_chunks/{practice-results-CSEHTH2V.js → practice-results-BCr7jMt1.js} +5 -5
  184. package/dist/_chunks/{practice-results-CSEHTH2V.js.map → practice-results-BCr7jMt1.js.map} +1 -1
  185. package/dist/_chunks/{pregnancy-dating-CxVAA6_4.js → pregnancy-dating-IsDVfqJX.js} +6 -6
  186. package/dist/_chunks/{pregnancy-dating-CxVAA6_4.js.map → pregnancy-dating-IsDVfqJX.js.map} +1 -1
  187. package/dist/_chunks/{pregnancy-weight-gain-C7zyrwow.js → pregnancy-weight-gain-B-CkVYnU.js} +2 -2
  188. package/dist/_chunks/{pregnancy-weight-gain-C7zyrwow.js.map → pregnancy-weight-gain-B-CkVYnU.js.map} +1 -1
  189. package/dist/_chunks/{privacy-lock-DrRmK8C7.js → privacy-lock-YYBiI_bY.js} +3 -3
  190. package/dist/_chunks/{privacy-lock-DrRmK8C7.js.map → privacy-lock-YYBiI_bY.js.map} +1 -1
  191. package/dist/_chunks/{product-hub-panel-CaZqttvm.js → product-hub-panel-CTld1r5V.js} +3 -3
  192. package/dist/_chunks/{product-hub-panel-CaZqttvm.js.map → product-hub-panel-CTld1r5V.js.map} +1 -1
  193. package/dist/_chunks/{pt-zqdQuryr.js → pt-B3UKvhHp.js} +2 -2
  194. package/dist/_chunks/{pt-zqdQuryr.js.map → pt-B3UKvhHp.js.map} +1 -1
  195. package/dist/_chunks/{public-header.agent-C-opZaOw.js → public-header.agent-rX_VA6hd.js} +107 -103
  196. package/dist/_chunks/public-header.agent-rX_VA6hd.js.map +1 -0
  197. package/dist/_chunks/{radiograph-panel.agent-D1x33moc.js → radiograph-panel.agent-e488ooH8.js} +40 -57
  198. package/dist/_chunks/radiograph-panel.agent-e488ooH8.js.map +1 -0
  199. package/dist/_chunks/{reviews-panel-liUj6OPX.js → reviews-panel-DmOjvmyH.js} +4 -4
  200. package/dist/_chunks/{reviews-panel-liUj6OPX.js.map → reviews-panel-DmOjvmyH.js.map} +1 -1
  201. package/dist/_chunks/{rich-text-editor-DUgznqOf.js → rich-text-editor-CgA2bYwi.js} +186 -195
  202. package/dist/_chunks/rich-text-editor-CgA2bYwi.js.map +1 -0
  203. package/dist/_chunks/{ro-CornQr64.js → ro-DVTEQpPK.js} +2 -2
  204. package/dist/_chunks/{ro-CornQr64.js.map → ro-DVTEQpPK.js.map} +1 -1
  205. package/dist/_chunks/{ru-CKAXNYVD.js → ru-C-Mp40SC.js} +3 -3
  206. package/dist/_chunks/{ru-CKAXNYVD.js.map → ru-C-Mp40SC.js.map} +1 -1
  207. package/dist/_chunks/{session-countdown-qr8EO5QY.js → session-countdown-C8AsE072.js} +2 -2
  208. package/dist/_chunks/{session-countdown-qr8EO5QY.js.map → session-countdown-C8AsE072.js.map} +1 -1
  209. package/dist/_chunks/{sheet-B_X54aZo.js → sheet-D5K0LB3q.js} +2 -2
  210. package/dist/_chunks/{sheet-B_X54aZo.js.map → sheet-D5K0LB3q.js.map} +1 -1
  211. package/dist/_chunks/{sidebar-B0OBmJrC.js → sidebar-CtU35PIX.js} +70 -67
  212. package/dist/_chunks/sidebar-CtU35PIX.js.map +1 -0
  213. package/dist/_chunks/{sign-document-nK03S73h.js → sign-document-Bfk0WpWV.js} +2 -2
  214. package/dist/_chunks/{sign-document-nK03S73h.js.map → sign-document-Bfk0WpWV.js.map} +1 -1
  215. package/dist/_chunks/{sign-in-with-alfadocs-button-LppxjlFt.js → sign-in-with-alfadocs-button-UlYefZpI.js} +2 -2
  216. package/dist/_chunks/{sign-in-with-alfadocs-button-LppxjlFt.js.map → sign-in-with-alfadocs-button-UlYefZpI.js.map} +1 -1
  217. package/dist/_chunks/{signature-capture-Ct_4Md4e.js → signature-capture-DN52VNKL.js} +206 -189
  218. package/dist/_chunks/signature-capture-DN52VNKL.js.map +1 -0
  219. package/dist/_chunks/{signature-field-jgwYgUhO.js → signature-field-0rFODJlW.js} +47 -41
  220. package/dist/_chunks/signature-field-0rFODJlW.js.map +1 -0
  221. package/dist/_chunks/{slot-grid-FsqumOaS.js → slot-grid-CQSULZjd.js} +4 -4
  222. package/dist/_chunks/{slot-grid-FsqumOaS.js.map → slot-grid-CQSULZjd.js.map} +1 -1
  223. package/dist/_chunks/{sq-CIIvqXZv.js → sq-DierVlw-.js} +2 -2
  224. package/dist/_chunks/{sq-CIIvqXZv.js.map → sq-DierVlw-.js.map} +1 -1
  225. package/dist/_chunks/{streaming-text-Cedc05ya.js → streaming-text-C5bYz7LL.js} +2 -2
  226. package/dist/_chunks/{streaming-text-Cedc05ya.js.map → streaming-text-C5bYz7LL.js.map} +1 -1
  227. package/dist/_chunks/subDays-DIKRViZm.js +8 -0
  228. package/dist/_chunks/{subDays-DGSOp9d9.js.map → subDays-DIKRViZm.js.map} +1 -1
  229. package/dist/_chunks/{sv-Kpk1pzjz.js → sv-gQWo_19z.js} +2 -2
  230. package/dist/_chunks/{sv-Kpk1pzjz.js.map → sv-gQWo_19z.js.map} +1 -1
  231. package/dist/_chunks/{task-tray-DP5A3Qnc.js → task-tray-Br3vc0O1.js} +3 -3
  232. package/dist/_chunks/{task-tray-DP5A3Qnc.js.map → task-tray-Br3vc0O1.js.map} +1 -1
  233. package/dist/_chunks/{tasks-panel-BuxaYtEF.js → tasks-panel-LCK5ZXvU.js} +5 -5
  234. package/dist/_chunks/{tasks-panel-BuxaYtEF.js.map → tasks-panel-LCK5ZXvU.js.map} +1 -1
  235. package/dist/_chunks/{theme-toggle-dtdy5EaL.js → theme-toggle-BJCz_UOi.js} +3 -3
  236. package/dist/_chunks/{theme-toggle-dtdy5EaL.js.map → theme-toggle-BJCz_UOi.js.map} +1 -1
  237. package/dist/_chunks/{toast.agent-BSxl057x.js → toast.agent-uV8CeAy6.js} +2 -2
  238. package/dist/_chunks/{toast.agent-BSxl057x.js.map → toast.agent-uV8CeAy6.js.map} +1 -1
  239. package/dist/_chunks/{token-insert-menu-Pok4nExI.js → token-insert-menu-BYv6yoZI.js} +2 -2
  240. package/dist/_chunks/{token-insert-menu-Pok4nExI.js.map → token-insert-menu-BYv6yoZI.js.map} +1 -1
  241. package/dist/_chunks/{tool-rail-BZx0-yIr.js → tool-rail-AaTqxkIM.js} +2 -2
  242. package/dist/_chunks/{tool-rail-BZx0-yIr.js.map → tool-rail-AaTqxkIM.js.map} +1 -1
  243. package/dist/_chunks/{tooth-scheme-D_rso4uu.js → tooth-scheme-CX49GycY.js} +3 -3
  244. package/dist/_chunks/{tooth-scheme-D_rso4uu.js.map → tooth-scheme-CX49GycY.js.map} +1 -1
  245. package/dist/_chunks/{tr-DHaeLFxG.js → tr-Btm6M3Km.js} +2 -2
  246. package/dist/_chunks/{tr-DHaeLFxG.js.map → tr-Btm6M3Km.js.map} +1 -1
  247. package/dist/_chunks/{transaction-chip-B6iWoVmU.js → transaction-chip-DJCstquX.js} +41 -51
  248. package/dist/_chunks/transaction-chip-DJCstquX.js.map +1 -0
  249. package/dist/_chunks/type-ggmfVs23.js +16 -0
  250. package/dist/_chunks/type-ggmfVs23.js.map +1 -0
  251. package/dist/_chunks/{unit-converter-fEqluT8b.js → unit-converter-3uL_tMCm.js} +2 -2
  252. package/dist/_chunks/{unit-converter-fEqluT8b.js.map → unit-converter-3uL_tMCm.js.map} +1 -1
  253. package/dist/_chunks/upload-BfT2hzMg.js +16 -0
  254. package/dist/_chunks/upload-BfT2hzMg.js.map +1 -0
  255. package/dist/_chunks/use-priority-overflow-c9SjxZkZ.js +101 -0
  256. package/dist/_chunks/use-priority-overflow-c9SjxZkZ.js.map +1 -0
  257. package/dist/_chunks/use-visual-viewport-pin-ChurOsHM.js +31 -0
  258. package/dist/_chunks/use-visual-viewport-pin-ChurOsHM.js.map +1 -0
  259. package/dist/_chunks/{warning-stack-BaMI7-n7.js → warning-stack-BlG_Ujy3.js} +3 -3
  260. package/dist/_chunks/{warning-stack-BaMI7-n7.js.map → warning-stack-BlG_Ujy3.js.map} +1 -1
  261. package/dist/_chunks/{workflow-map-qWsgCldq.js → workflow-map-C643Q43h.js} +5 -5
  262. package/dist/_chunks/{workflow-map-qWsgCldq.js.map → workflow-map-C643Q43h.js.map} +1 -1
  263. package/dist/_chunks/{zh-CN-BncsTBwM.js → zh-CN-DkVN4vsB.js} +3 -3
  264. package/dist/_chunks/{zh-CN-BncsTBwM.js.map → zh-CN-DkVN4vsB.js.map} +1 -1
  265. package/dist/agent-catalog.json +845 -1034
  266. package/dist/agent-i18n/en.json +42 -69
  267. package/dist/brand/product-lockup/product-lockup.d.ts +1 -1
  268. package/dist/components/_shared/calendar-class-names.d.ts.map +1 -1
  269. package/dist/components/agenda-tray/index.js +1 -1
  270. package/dist/components/ai-consent-banner/index.js +1 -1
  271. package/dist/components/ai-prompt-input/index.js +1 -1
  272. package/dist/components/anamnesis-card/index.js +1 -1
  273. package/dist/components/appointment-card/index.js +2 -2
  274. package/dist/components/appointment-timeline/index.js +1 -1
  275. package/dist/components/audio-recorder/index.js +1 -1
  276. package/dist/components/benefit-card/benefit-card.d.ts.map +1 -1
  277. package/dist/components/benefit-card/index.js +1 -1
  278. package/dist/components/bishop-score/index.js +1 -1
  279. package/dist/components/bmi-calculator/index.js +1 -1
  280. package/dist/components/booking/index.js +1 -1
  281. package/dist/components/button/button.d.ts +8 -1
  282. package/dist/components/button/button.d.ts.map +1 -1
  283. package/dist/components/button/index.js +2 -2
  284. package/dist/components/button-group/button-group.d.ts +16 -0
  285. package/dist/components/button-group/button-group.d.ts.map +1 -1
  286. package/dist/components/button-group/index.js +1 -1
  287. package/dist/components/care-plan-card/index.js +1 -1
  288. package/dist/components/care-plan-entry-card/index.js +1 -1
  289. package/dist/components/care-plan-header/index.js +1 -1
  290. package/dist/components/carousel/index.js +1 -1
  291. package/dist/components/chat-container/chat-container.d.ts.map +1 -1
  292. package/dist/components/chat-container/index.js +1 -1
  293. package/dist/components/chat-input/index.js +1 -1
  294. package/dist/components/chat-message/index.js +1 -1
  295. package/dist/components/connection-status/index.js +1 -1
  296. package/dist/components/contact-profile-card/index.js +1 -1
  297. package/dist/components/control-room-rail/index.js +1 -1
  298. package/dist/components/copy-field/index.js +1 -1
  299. package/dist/components/counter/counter.d.ts +1 -1
  300. package/dist/components/cycle-calculator/index.js +1 -1
  301. package/dist/components/data-table/data-table.d.ts +2 -8
  302. package/dist/components/data-table/data-table.d.ts.map +1 -1
  303. package/dist/components/data-table/index.js +2 -2
  304. package/dist/components/data-table/toolbar.d.ts +4 -10
  305. package/dist/components/data-table/toolbar.d.ts.map +1 -1
  306. package/dist/components/date-picker/index.js +1 -1
  307. package/dist/components/date-range-picker/index.js +1 -1
  308. package/dist/components/date-time-picker/index.js +1 -1
  309. package/dist/components/description-list/index.js +1 -1
  310. package/dist/components/document-scanner/document-scanner.d.ts.map +1 -1
  311. package/dist/components/document-scanner/index.js +1 -1
  312. package/dist/components/due-date-calculator/index.js +2 -2
  313. package/dist/components/editor-overlay/index.js +1 -1
  314. package/dist/components/empty-state/index.js +1 -1
  315. package/dist/components/entity-summary/index.js +1 -1
  316. package/dist/components/face-scheme/face-scheme-data.d.ts +167 -0
  317. package/dist/components/face-scheme/face-scheme-data.d.ts.map +1 -1
  318. package/dist/components/face-scheme/face-scheme.agent.d.ts.map +1 -1
  319. package/dist/components/face-scheme/face-scheme.d.ts +112 -2
  320. package/dist/components/face-scheme/face-scheme.d.ts.map +1 -1
  321. package/dist/components/face-scheme/index.d.ts +2 -2
  322. package/dist/components/face-scheme/index.d.ts.map +1 -1
  323. package/dist/components/face-scheme/index.js +25 -14
  324. package/dist/components/fetal-weight/index.js +1 -1
  325. package/dist/components/field-array/index.js +1 -1
  326. package/dist/components/file-upload/file-upload.d.ts +1 -0
  327. package/dist/components/file-upload/file-upload.d.ts.map +1 -1
  328. package/dist/components/file-upload/index.d.ts +1 -1
  329. package/dist/components/file-upload/index.d.ts.map +1 -1
  330. package/dist/components/file-upload/index.js +4 -3
  331. package/dist/components/finished-terminal/finished-terminal.d.ts.map +1 -1
  332. package/dist/components/finished-terminal/index.js +1 -1
  333. package/dist/components/fiscal-code-input/index.js +1 -1
  334. package/dist/components/flag/flag.d.ts +1 -1
  335. package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
  336. package/dist/components/freemium-paywall/index.js +1 -1
  337. package/dist/components/gestational-age-calculator/index.js +1 -1
  338. package/dist/components/hcg-doubling/index.js +1 -1
  339. package/dist/components/header/header.d.ts.map +1 -1
  340. package/dist/components/header/index.js +1 -1
  341. package/dist/components/header-settings/index.js +1 -1
  342. package/dist/components/icon-button/index.js +1 -1
  343. package/dist/components/icon-button-group/icon-button-group.d.ts +6 -0
  344. package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
  345. package/dist/components/icon-button-group/index.js +1 -1
  346. package/dist/components/icon-picker/index.js +1 -1
  347. package/dist/components/image-cropper/index.js +1 -1
  348. package/dist/components/index.d.ts +0 -1
  349. package/dist/components/index.d.ts.map +1 -1
  350. package/dist/components/key-value-pair/index.js +1 -1
  351. package/dist/components/link/link.d.ts +1 -1
  352. package/dist/components/locale-picker/index.js +1 -1
  353. package/dist/components/map-view/index.js +1 -1
  354. package/dist/components/matrix-rain/matrix-rain.d.ts +1 -1
  355. package/dist/components/message-card/index.js +1 -1
  356. package/dist/components/message-tray/index.js +1 -1
  357. package/dist/components/notes-panel/index.js +1 -1
  358. package/dist/components/notification-card/index.js +1 -1
  359. package/dist/components/notification-tray/index.js +1 -1
  360. package/dist/components/optical-prescription/index.d.ts +4 -2
  361. package/dist/components/optical-prescription/index.d.ts.map +1 -1
  362. package/dist/components/optical-prescription/index.js +29 -26
  363. package/dist/components/optical-prescription/optical-prescription-charts.d.ts +78 -0
  364. package/dist/components/optical-prescription/optical-prescription-charts.d.ts.map +1 -0
  365. package/dist/components/optical-prescription/optical-prescription-data.d.ts +29 -0
  366. package/dist/components/optical-prescription/optical-prescription-data.d.ts.map +1 -1
  367. package/dist/components/optical-prescription/optical-prescription.agent.d.ts.map +1 -1
  368. package/dist/components/optical-prescription/optical-prescription.d.ts +9 -0
  369. package/dist/components/optical-prescription/optical-prescription.d.ts.map +1 -1
  370. package/dist/components/patient-details/index.js +1 -1
  371. package/dist/components/patient-search/index.js +1 -1
  372. package/dist/components/patient-search/patient-search.d.ts.map +1 -1
  373. package/dist/components/patient-summary-card/index.js +1 -1
  374. package/dist/components/patient-table/index.js +1 -1
  375. package/dist/components/payment-card/index.js +1 -1
  376. package/dist/components/periodontal-chart-card/index.js +1 -1
  377. package/dist/components/popover/index.js +1 -1
  378. package/dist/components/practice-results/index.js +1 -1
  379. package/dist/components/pregnancy-dating/index.js +1 -1
  380. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  381. package/dist/components/privacy-lock/index.js +1 -1
  382. package/dist/components/product-hub-tray/index.js +1 -1
  383. package/dist/components/public-header/index.js +1 -1
  384. package/dist/components/public-header/public-header.d.ts +1 -1
  385. package/dist/components/public-header/public-header.d.ts.map +1 -1
  386. package/dist/components/radiograph-panel/index.js +1 -1
  387. package/dist/components/radiograph-panel/radiograph-panel.d.ts +2 -2
  388. package/dist/components/radiograph-panel/radiograph-panel.d.ts.map +1 -1
  389. package/dist/components/reviews-panel/index.js +1 -1
  390. package/dist/components/rich-text-editor/index.js +1 -1
  391. package/dist/components/session-countdown/index.js +1 -1
  392. package/dist/components/sheet/index.js +1 -1
  393. package/dist/components/sidebar/index.js +1 -1
  394. package/dist/components/sidebar/sidebar.d.ts.map +1 -1
  395. package/dist/components/sign-document/index.js +1 -1
  396. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  397. package/dist/components/signature-capture/index.js +1 -1
  398. package/dist/components/signature-capture/signature-capture.d.ts.map +1 -1
  399. package/dist/components/signature-field/index.js +1 -1
  400. package/dist/components/signature-field/signature-field.d.ts +7 -0
  401. package/dist/components/signature-field/signature-field.d.ts.map +1 -1
  402. package/dist/components/skeleton-scheme/index.js +1194 -0
  403. package/dist/components/skeleton-scheme/index.js.map +1 -0
  404. package/dist/components/slot-grid/index.js +1 -1
  405. package/dist/components/streaming-text/index.js +1 -1
  406. package/dist/components/task-tray/index.js +1 -1
  407. package/dist/components/tasks-panel/index.js +1 -1
  408. package/dist/components/theme-toggle/index.js +1 -1
  409. package/dist/components/toast/index.js +1 -1
  410. package/dist/components/token-insert-menu/index.js +1 -1
  411. package/dist/components/tool-rail/index.js +1 -1
  412. package/dist/components/tooth-scheme/index.js +1 -1
  413. package/dist/components/transaction-chip/index.js +1 -1
  414. package/dist/components/unit-converter/index.js +1 -1
  415. package/dist/components/warning-stack/index.js +1 -1
  416. package/dist/components/workflow/index.js +1 -1
  417. package/dist/hooks/index.d.ts +2 -0
  418. package/dist/hooks/index.d.ts.map +1 -1
  419. package/dist/hooks/index.js +40 -35
  420. package/dist/hooks/index.js.map +1 -1
  421. package/dist/hooks/use-priority-overflow.d.ts +63 -0
  422. package/dist/hooks/use-priority-overflow.d.ts.map +1 -0
  423. package/dist/hooks/use-visual-viewport-pin.d.ts +32 -0
  424. package/dist/hooks/use-visual-viewport-pin.d.ts.map +1 -0
  425. package/dist/i18n/locales/ar.d.ts +170 -9
  426. package/dist/i18n/locales/ar.d.ts.map +1 -1
  427. package/dist/i18n/locales/ar.js +173 -12
  428. package/dist/i18n/locales/ar.js.map +1 -1
  429. package/dist/i18n/locales/de.d.ts +170 -9
  430. package/dist/i18n/locales/de.d.ts.map +1 -1
  431. package/dist/i18n/locales/de.js +173 -12
  432. package/dist/i18n/locales/de.js.map +1 -1
  433. package/dist/i18n/locales/el.d.ts +170 -9
  434. package/dist/i18n/locales/el.d.ts.map +1 -1
  435. package/dist/i18n/locales/el.js +173 -12
  436. package/dist/i18n/locales/el.js.map +1 -1
  437. package/dist/i18n/locales/en.d.ts +170 -9
  438. package/dist/i18n/locales/en.d.ts.map +1 -1
  439. package/dist/i18n/locales/en.js +173 -12
  440. package/dist/i18n/locales/en.js.map +1 -1
  441. package/dist/i18n/locales/es.d.ts +170 -9
  442. package/dist/i18n/locales/es.d.ts.map +1 -1
  443. package/dist/i18n/locales/es.js +173 -12
  444. package/dist/i18n/locales/es.js.map +1 -1
  445. package/dist/i18n/locales/fr.d.ts +170 -9
  446. package/dist/i18n/locales/fr.d.ts.map +1 -1
  447. package/dist/i18n/locales/fr.js +173 -12
  448. package/dist/i18n/locales/fr.js.map +1 -1
  449. package/dist/i18n/locales/hi.d.ts +170 -9
  450. package/dist/i18n/locales/hi.d.ts.map +1 -1
  451. package/dist/i18n/locales/hi.js +173 -12
  452. package/dist/i18n/locales/hi.js.map +1 -1
  453. package/dist/i18n/locales/it.d.ts +170 -9
  454. package/dist/i18n/locales/it.d.ts.map +1 -1
  455. package/dist/i18n/locales/it.js +173 -12
  456. package/dist/i18n/locales/it.js.map +1 -1
  457. package/dist/i18n/locales/ja.d.ts +170 -9
  458. package/dist/i18n/locales/ja.d.ts.map +1 -1
  459. package/dist/i18n/locales/ja.js +173 -12
  460. package/dist/i18n/locales/ja.js.map +1 -1
  461. package/dist/i18n/locales/nl.d.ts +170 -9
  462. package/dist/i18n/locales/nl.d.ts.map +1 -1
  463. package/dist/i18n/locales/nl.js +173 -12
  464. package/dist/i18n/locales/nl.js.map +1 -1
  465. package/dist/i18n/locales/pl.d.ts +170 -9
  466. package/dist/i18n/locales/pl.d.ts.map +1 -1
  467. package/dist/i18n/locales/pl.js +173 -12
  468. package/dist/i18n/locales/pl.js.map +1 -1
  469. package/dist/i18n/locales/pt.d.ts +170 -9
  470. package/dist/i18n/locales/pt.d.ts.map +1 -1
  471. package/dist/i18n/locales/pt.js +173 -12
  472. package/dist/i18n/locales/pt.js.map +1 -1
  473. package/dist/i18n/locales/ro.d.ts +170 -9
  474. package/dist/i18n/locales/ro.d.ts.map +1 -1
  475. package/dist/i18n/locales/ro.js +173 -12
  476. package/dist/i18n/locales/ro.js.map +1 -1
  477. package/dist/i18n/locales/ru.d.ts +170 -9
  478. package/dist/i18n/locales/ru.d.ts.map +1 -1
  479. package/dist/i18n/locales/ru.js +173 -12
  480. package/dist/i18n/locales/ru.js.map +1 -1
  481. package/dist/i18n/locales/sq.d.ts +170 -9
  482. package/dist/i18n/locales/sq.d.ts.map +1 -1
  483. package/dist/i18n/locales/sq.js +173 -12
  484. package/dist/i18n/locales/sq.js.map +1 -1
  485. package/dist/i18n/locales/sv.d.ts +170 -9
  486. package/dist/i18n/locales/sv.d.ts.map +1 -1
  487. package/dist/i18n/locales/sv.js +173 -12
  488. package/dist/i18n/locales/sv.js.map +1 -1
  489. package/dist/i18n/locales/tr.d.ts +170 -9
  490. package/dist/i18n/locales/tr.d.ts.map +1 -1
  491. package/dist/i18n/locales/tr.js +173 -12
  492. package/dist/i18n/locales/tr.js.map +1 -1
  493. package/dist/i18n/locales/zh.d.ts +170 -9
  494. package/dist/i18n/locales/zh.d.ts.map +1 -1
  495. package/dist/i18n/locales/zh.js +173 -12
  496. package/dist/i18n/locales/zh.js.map +1 -1
  497. package/dist/index.js +774 -761
  498. package/dist/index.js.map +1 -1
  499. package/dist/locales/ar.json +173 -12
  500. package/dist/locales/de.json +173 -12
  501. package/dist/locales/el.json +173 -12
  502. package/dist/locales/en.json +173 -12
  503. package/dist/locales/es.json +173 -12
  504. package/dist/locales/fr.json +173 -12
  505. package/dist/locales/hi.json +173 -12
  506. package/dist/locales/it.json +173 -12
  507. package/dist/locales/ja.json +173 -12
  508. package/dist/locales/nl.json +173 -12
  509. package/dist/locales/pl.json +173 -12
  510. package/dist/locales/pt.json +173 -12
  511. package/dist/locales/ro.json +173 -12
  512. package/dist/locales/ru.json +173 -12
  513. package/dist/locales/sq.json +173 -12
  514. package/dist/locales/sv.json +173 -12
  515. package/dist/locales/tr.json +173 -12
  516. package/dist/locales/zh.json +173 -12
  517. package/dist/patterns/alia-assistant/index.js +1 -1
  518. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  519. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts +1 -1
  520. package/dist/tokens.css +2 -2
  521. package/package.json +5 -5
  522. package/dist/_chunks/benefit-card-Xnxj4Gmo.js.map +0 -1
  523. package/dist/_chunks/button-DD_0Xdmr.js.map +0 -1
  524. package/dist/_chunks/button-group-CvEnVzY7.js +0 -119
  525. package/dist/_chunks/button-group-CvEnVzY7.js.map +0 -1
  526. package/dist/_chunks/document-scanner-B23j4w7X.js.map +0 -1
  527. package/dist/_chunks/face-scheme-DruX4mca.js +0 -1450
  528. package/dist/_chunks/face-scheme-DruX4mca.js.map +0 -1
  529. package/dist/_chunks/file-upload-Kw1rdvFw.js.map +0 -1
  530. package/dist/_chunks/finished-terminal-Di4gtZ50.js.map +0 -1
  531. package/dist/_chunks/freemium-paywall-DFoeedwh.js.map +0 -1
  532. package/dist/_chunks/header-DaXWDw0M.js.map +0 -1
  533. package/dist/_chunks/icon-button-group-C48khLE0.js +0 -206
  534. package/dist/_chunks/icon-button-group-C48khLE0.js.map +0 -1
  535. package/dist/_chunks/insert-result-C7xSDb8q.js.map +0 -1
  536. package/dist/_chunks/link-cell-renderer-BCppbMec.js.map +0 -1
  537. package/dist/_chunks/marketplace-app-shell-BCYiOvKZ.js.map +0 -1
  538. package/dist/_chunks/optical-prescription-Bmlbuopi.js +0 -653
  539. package/dist/_chunks/optical-prescription-Bmlbuopi.js.map +0 -1
  540. package/dist/_chunks/patient-search-X9SUZGpy.js.map +0 -1
  541. package/dist/_chunks/patient-shell-oiIRqEAl.js +0 -162
  542. package/dist/_chunks/patient-shell-oiIRqEAl.js.map +0 -1
  543. package/dist/_chunks/public-header.agent-C-opZaOw.js.map +0 -1
  544. package/dist/_chunks/radiograph-panel.agent-D1x33moc.js.map +0 -1
  545. package/dist/_chunks/rich-text-editor-DUgznqOf.js.map +0 -1
  546. package/dist/_chunks/sidebar-B0OBmJrC.js.map +0 -1
  547. package/dist/_chunks/signature-capture-Ct_4Md4e.js.map +0 -1
  548. package/dist/_chunks/signature-field-jgwYgUhO.js.map +0 -1
  549. package/dist/_chunks/subDays-DGSOp9d9.js +0 -8
  550. package/dist/_chunks/transaction-chip-B6iWoVmU.js.map +0 -1
  551. package/dist/patterns/patient-shell/index.d.ts +0 -12
  552. package/dist/patterns/patient-shell/index.d.ts.map +0 -1
  553. package/dist/patterns/patient-shell/index.js +0 -5
  554. package/dist/patterns/patient-shell/index.js.map +0 -1
  555. package/dist/patterns/patient-shell/patient-shell.d.ts +0 -62
  556. package/dist/patterns/patient-shell/patient-shell.d.ts.map +0 -1
@@ -2,9 +2,9 @@ import { jsx as e, jsxs as n } from "react/jsx-runtime";
2
2
  import { forwardRef as P, useRef as T, useImperativeHandle as q, useMemo as B } from "react";
3
3
  import { c as H } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as K } from "react-i18next";
5
- import { I as M } from "./icon-button-LqoiKcUN.js";
5
+ import { I as M } from "./icon-button-C_kbcd7I.js";
6
6
  import { S as A } from "./skeleton-CZbwyJAA.js";
7
- import { E as D } from "./empty-state-BLy7tigq.js";
7
+ import { E as D } from "./empty-state-CrLsi0XI.js";
8
8
  import { A as V } from "./agenda-card-BCGaQazD.js";
9
9
  import { u as F } from "./registry-DvAUVLHh.js";
10
10
  import { C as G } from "./calendar-days-BGWklvE-.js";
@@ -212,4 +212,4 @@ export {
212
212
  U as A,
213
213
  L as a
214
214
  };
215
- //# sourceMappingURL=agenda-tray-loL2A3Cx.js.map
215
+ //# sourceMappingURL=agenda-tray-CVf-jfWU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agenda-tray-loL2A3Cx.js","sources":["../../src/components/agenda-tray/agenda-tray.agent.ts","../../src/components/agenda-tray/agenda-tray.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AgendaTray. */\n/* */\n/* Tray-level surface: read appointment ids + lifecycle status (never */\n/* patient names / treatments), and route an activation through the */\n/* curated handle. AgendaTray is in-page (no open/close). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AgendaTrayHandle } from './agenda-tray';\n\nexport const agendaTrayAgent: AgentAdapter<AgendaTrayHandle> = {\n id: 'agenda-tray',\n // `pick` (NON-persisting): select_item activates / opens an appointment by\n // firing onOpenAppointment — it does not store a \"selected\" value on the tray\n // (there is no selection state slot), so this is a pick, not select_single.\n capabilities: ['pick'],\n state: {\n items: {\n type: 'Array<{ id: string; status: string }>',\n descriptionKey: 'ui.agent.agendaTray.state.items',\n description:\n 'Currently-displayed appointments. Ids + status only — never patient identity.',\n read: (handle) => handle.getItems(),\n },\n },\n actions: {\n select_item: {\n // Activates (opens) an appointment — pure navigation, no data mutation.\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n descriptionKey: 'ui.agent.agendaTray.actions.selectItem',\n description: 'Activate the appointment with the given id.',\n examples: [\n { args: { id: 'appt-204' }, note: 'Open appointment appt-204.' },\n ],\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'agenda-tray',\n description: 'Marks the AgendaTray wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific tray from the agent.',\n },\n item: {\n attr: 'data-appointment-id',\n description:\n 'Stable appointment id emitted on each rendered AgendaCard inside the tray.',\n },\n },\n};\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CalendarDays, Plus } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { AgendaCard, type AgendaItem } from '../agenda-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { agendaTrayAgent } from './agenda-tray.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst agendaTrayVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:overflow-hidden',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/**\n * Curated imperative handle for AgendaTray. Exposed as the forwardRef\n * target so a future agent / MCP UI bridge can drive the tray without\n * touching the DOM. See `agenda-tray.agent.ts`.\n */\nexport interface AgendaTrayHandle {\n getItems: () => Array<{ id: string; status: string }>;\n selectItem: (id: string) => void;\n}\n\nexport interface AgendaTrayProps\n extends\n Omit<HTMLAttributes<HTMLElement>, 'onClick' | 'id'>,\n VariantProps<typeof agendaTrayVariants> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so\n * an agent / MCP UI bridge can address this specific tray.\n */\n id?: string;\n items: AgendaItem[];\n /** Section title — rendered in the header. Localised by the consumer. */\n title?: string;\n /** Optional small caption (e.g. localised date) shown next to the title. */\n caption?: string;\n size?: 'sm' | 'md';\n onOpenAppointment?: (item: AgendaItem) => void;\n onAddAppointment?: () => void;\n /** Localised label for the \"Add\" affordance. */\n addLabel?: string;\n loading?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n /** Optional CTA wired into the empty state (EmptyState primaryAction). */\n emptyAction?: { label: string; onClick: () => void };\n /**\n * Pinned footer link (e.g. \"All upcoming appointments\"). Localised by\n * the consumer; rendered after the list, before the section closes.\n */\n viewAllLabel?: string;\n /** Fires when the footer link is activated. Required to render it. */\n onViewAll?: () => void;\n /**\n * Per-row trailing action toolbar, forwarded to each AgendaCard's\n * `actions` slot.\n */\n renderItemActions?: (item: AgendaItem) => ReactNode;\n /**\n * Constrain the list to the tray's own height and scroll inside it —\n * pair with a height/max-height on `className`. The scroll region is\n * keyboard-focusable so it stays operable without a pointer.\n */\n scrollable?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const AgendaTray = forwardRef<HTMLElement, AgendaTrayProps>(\n (\n {\n id,\n items,\n title,\n caption,\n size = 'sm',\n onOpenAppointment,\n onAddAppointment,\n addLabel,\n loading = false,\n emptyTitle,\n emptyDescription,\n emptyAction,\n viewAllLabel,\n onViewAll,\n renderItemActions,\n scrollable = false,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const heading = title ?? t('agendaTray.title', \"Today's appointments\");\n const resolvedAddLabel = addLabel ?? t('agendaTray.add', 'Add appointment');\n const isEmpty = !loading && items.length === 0;\n\n let body: ReactNode;\n if (loading) {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n {[0, 1, 2].map((i) => (\n <Skeleton key={i} variant=\"rectangular\" height=\"2.5rem\" />\n ))}\n </div>\n );\n } else if (isEmpty) {\n body = (\n <div className=\"ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('agendaTray.empty.title', 'No appointments')}\n description={\n emptyDescription ??\n t(\n 'agendaTray.empty.description',\n 'New appointments will appear here.',\n )\n }\n primaryAction={emptyAction}\n />\n </div>\n );\n } else {\n body = (\n <ul\n className={[\n // flex-1 unconditionally so a footer pins to the tray's\n // bottom edge in equal-height grid rows.\n 'ds:flex ds:list-none ds:flex-col ds:flex-1 ds:min-h-0',\n // Keyboard-focusable when it scrolls (axe\n // scrollable-region-focusable) — pair with a height on the\n // tray's className.\n scrollable ? 'ds:overflow-y-auto' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- scrollable list must be keyboard focusable (axe scrollable-region-focusable)\n tabIndex={scrollable ? 0 : undefined}\n aria-label={scrollable ? heading : undefined}\n >\n {items.map((item) => (\n <AgendaCard\n key={item.id}\n item={item}\n size={size}\n onActivate={onOpenAppointment}\n actions={renderItemActions?.(item)}\n data-appointment-id={item.id}\n />\n ))}\n </ul>\n );\n }\n\n /* Curated imperative handle for agent integration. See\n * agenda-tray.agent.ts. */\n const itemsRef = useRef<AgendaItem[]>(items);\n itemsRef.current = items;\n\n const innerRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => innerRef.current as HTMLElement, []);\n\n const handle = useMemo<AgendaTrayHandle>(\n () => ({\n getItems: () =>\n itemsRef.current.map((i) => ({\n id: i.id,\n status: i.status ?? 'confirmed',\n })),\n selectItem: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onOpenAppointment?.(found);\n },\n }),\n [onOpenAppointment],\n );\n\n useAgentRegistration(agendaTrayAgent, handle, id);\n\n return (\n <section\n ref={innerRef}\n aria-label={heading}\n data-component=\"agenda-tray\"\n data-component-id={id}\n className={agendaTrayVariants({ size, className })}\n {...rest}\n >\n <header className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)] ds:min-w-0\">\n <h3 className=\"ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-title-card\">\n <CalendarDays aria-hidden=\"true\" className=\"ds:size-4\" />\n {heading}\n </h3>\n {caption ? (\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {caption}\n </span>\n ) : null}\n </div>\n {onAddAppointment ? (\n <IconButton\n icon={<Plus />}\n intent=\"outline\"\n size=\"sm\"\n aria-label={resolvedAddLabel}\n onClick={onAddAppointment}\n />\n ) : null}\n </header>\n {body}\n {viewAllLabel && onViewAll && !isEmpty && !loading ? (\n <footer className=\"ds:[border-block-start:var(--border-width-sm)_solid_var(--card-border)] ds:p-[var(--spacing-sm)]\">\n <button\n type=\"button\"\n onClick={onViewAll}\n className={[\n 'type-label ds:text-[color:var(--link)] ds:underline ds:underline-offset-2 ds:hover:no-underline',\n 'ds:rounded-[var(--radius-sm)] ds:min-h-[var(--min-target-size)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n >\n {viewAllLabel}\n </button>\n </footer>\n ) : null}\n </section>\n );\n },\n);\n\nAgendaTray.displayName = 'AgendaTray';\n"],"names":["agendaTrayAgent","handle","args","agendaTrayVariants","cva","AgendaTray","forwardRef","id","items","title","caption","size","onOpenAppointment","onAddAppointment","addLabel","loading","emptyTitle","emptyDescription","emptyAction","viewAllLabel","onViewAll","renderItemActions","scrollable","className","rest","ref","t","useTranslation","heading","resolvedAddLabel","isEmpty","body","jsx","i","Skeleton","EmptyState","item","AgendaCard","itemsRef","useRef","innerRef","useImperativeHandle","useMemo","targetId","found","useAgentRegistration","jsxs","CalendarDays","IconButton","Plus"],"mappings":"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"}
1
+ {"version":3,"file":"agenda-tray-CVf-jfWU.js","sources":["../../src/components/agenda-tray/agenda-tray.agent.ts","../../src/components/agenda-tray/agenda-tray.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AgendaTray. */\n/* */\n/* Tray-level surface: read appointment ids + lifecycle status (never */\n/* patient names / treatments), and route an activation through the */\n/* curated handle. AgendaTray is in-page (no open/close). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AgendaTrayHandle } from './agenda-tray';\n\nexport const agendaTrayAgent: AgentAdapter<AgendaTrayHandle> = {\n id: 'agenda-tray',\n // `pick` (NON-persisting): select_item activates / opens an appointment by\n // firing onOpenAppointment — it does not store a \"selected\" value on the tray\n // (there is no selection state slot), so this is a pick, not select_single.\n capabilities: ['pick'],\n state: {\n items: {\n type: 'Array<{ id: string; status: string }>',\n descriptionKey: 'ui.agent.agendaTray.state.items',\n description:\n 'Currently-displayed appointments. Ids + status only — never patient identity.',\n read: (handle) => handle.getItems(),\n },\n },\n actions: {\n select_item: {\n // Activates (opens) an appointment — pure navigation, no data mutation.\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n descriptionKey: 'ui.agent.agendaTray.actions.selectItem',\n description: 'Activate the appointment with the given id.',\n examples: [\n { args: { id: 'appt-204' }, note: 'Open appointment appt-204.' },\n ],\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'agenda-tray',\n description: 'Marks the AgendaTray wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific tray from the agent.',\n },\n item: {\n attr: 'data-appointment-id',\n description:\n 'Stable appointment id emitted on each rendered AgendaCard inside the tray.',\n },\n },\n};\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CalendarDays, Plus } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { AgendaCard, type AgendaItem } from '../agenda-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { agendaTrayAgent } from './agenda-tray.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst agendaTrayVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:overflow-hidden',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/**\n * Curated imperative handle for AgendaTray. Exposed as the forwardRef\n * target so a future agent / MCP UI bridge can drive the tray without\n * touching the DOM. See `agenda-tray.agent.ts`.\n */\nexport interface AgendaTrayHandle {\n getItems: () => Array<{ id: string; status: string }>;\n selectItem: (id: string) => void;\n}\n\nexport interface AgendaTrayProps\n extends\n Omit<HTMLAttributes<HTMLElement>, 'onClick' | 'id'>,\n VariantProps<typeof agendaTrayVariants> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so\n * an agent / MCP UI bridge can address this specific tray.\n */\n id?: string;\n items: AgendaItem[];\n /** Section title — rendered in the header. Localised by the consumer. */\n title?: string;\n /** Optional small caption (e.g. localised date) shown next to the title. */\n caption?: string;\n size?: 'sm' | 'md';\n onOpenAppointment?: (item: AgendaItem) => void;\n onAddAppointment?: () => void;\n /** Localised label for the \"Add\" affordance. */\n addLabel?: string;\n loading?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n /** Optional CTA wired into the empty state (EmptyState primaryAction). */\n emptyAction?: { label: string; onClick: () => void };\n /**\n * Pinned footer link (e.g. \"All upcoming appointments\"). Localised by\n * the consumer; rendered after the list, before the section closes.\n */\n viewAllLabel?: string;\n /** Fires when the footer link is activated. Required to render it. */\n onViewAll?: () => void;\n /**\n * Per-row trailing action toolbar, forwarded to each AgendaCard's\n * `actions` slot.\n */\n renderItemActions?: (item: AgendaItem) => ReactNode;\n /**\n * Constrain the list to the tray's own height and scroll inside it —\n * pair with a height/max-height on `className`. The scroll region is\n * keyboard-focusable so it stays operable without a pointer.\n */\n scrollable?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const AgendaTray = forwardRef<HTMLElement, AgendaTrayProps>(\n (\n {\n id,\n items,\n title,\n caption,\n size = 'sm',\n onOpenAppointment,\n onAddAppointment,\n addLabel,\n loading = false,\n emptyTitle,\n emptyDescription,\n emptyAction,\n viewAllLabel,\n onViewAll,\n renderItemActions,\n scrollable = false,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const heading = title ?? t('agendaTray.title', \"Today's appointments\");\n const resolvedAddLabel = addLabel ?? t('agendaTray.add', 'Add appointment');\n const isEmpty = !loading && items.length === 0;\n\n let body: ReactNode;\n if (loading) {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n {[0, 1, 2].map((i) => (\n <Skeleton key={i} variant=\"rectangular\" height=\"2.5rem\" />\n ))}\n </div>\n );\n } else if (isEmpty) {\n body = (\n <div className=\"ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('agendaTray.empty.title', 'No appointments')}\n description={\n emptyDescription ??\n t(\n 'agendaTray.empty.description',\n 'New appointments will appear here.',\n )\n }\n primaryAction={emptyAction}\n />\n </div>\n );\n } else {\n body = (\n <ul\n className={[\n // flex-1 unconditionally so a footer pins to the tray's\n // bottom edge in equal-height grid rows.\n 'ds:flex ds:list-none ds:flex-col ds:flex-1 ds:min-h-0',\n // Keyboard-focusable when it scrolls (axe\n // scrollable-region-focusable) — pair with a height on the\n // tray's className.\n scrollable ? 'ds:overflow-y-auto' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- scrollable list must be keyboard focusable (axe scrollable-region-focusable)\n tabIndex={scrollable ? 0 : undefined}\n aria-label={scrollable ? heading : undefined}\n >\n {items.map((item) => (\n <AgendaCard\n key={item.id}\n item={item}\n size={size}\n onActivate={onOpenAppointment}\n actions={renderItemActions?.(item)}\n data-appointment-id={item.id}\n />\n ))}\n </ul>\n );\n }\n\n /* Curated imperative handle for agent integration. See\n * agenda-tray.agent.ts. */\n const itemsRef = useRef<AgendaItem[]>(items);\n itemsRef.current = items;\n\n const innerRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => innerRef.current as HTMLElement, []);\n\n const handle = useMemo<AgendaTrayHandle>(\n () => ({\n getItems: () =>\n itemsRef.current.map((i) => ({\n id: i.id,\n status: i.status ?? 'confirmed',\n })),\n selectItem: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onOpenAppointment?.(found);\n },\n }),\n [onOpenAppointment],\n );\n\n useAgentRegistration(agendaTrayAgent, handle, id);\n\n return (\n <section\n ref={innerRef}\n aria-label={heading}\n data-component=\"agenda-tray\"\n data-component-id={id}\n className={agendaTrayVariants({ size, className })}\n {...rest}\n >\n <header className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)] ds:min-w-0\">\n <h3 className=\"ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-title-card\">\n <CalendarDays aria-hidden=\"true\" className=\"ds:size-4\" />\n {heading}\n </h3>\n {caption ? (\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {caption}\n </span>\n ) : null}\n </div>\n {onAddAppointment ? (\n <IconButton\n icon={<Plus />}\n intent=\"outline\"\n size=\"sm\"\n aria-label={resolvedAddLabel}\n onClick={onAddAppointment}\n />\n ) : null}\n </header>\n {body}\n {viewAllLabel && onViewAll && !isEmpty && !loading ? (\n <footer className=\"ds:[border-block-start:var(--border-width-sm)_solid_var(--card-border)] ds:p-[var(--spacing-sm)]\">\n <button\n type=\"button\"\n onClick={onViewAll}\n className={[\n 'type-label ds:text-[color:var(--link)] ds:underline ds:underline-offset-2 ds:hover:no-underline',\n 'ds:rounded-[var(--radius-sm)] ds:min-h-[var(--min-target-size)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n >\n {viewAllLabel}\n </button>\n </footer>\n ) : null}\n </section>\n );\n },\n);\n\nAgendaTray.displayName = 'AgendaTray';\n"],"names":["agendaTrayAgent","handle","args","agendaTrayVariants","cva","AgendaTray","forwardRef","id","items","title","caption","size","onOpenAppointment","onAddAppointment","addLabel","loading","emptyTitle","emptyDescription","emptyAction","viewAllLabel","onViewAll","renderItemActions","scrollable","className","rest","ref","t","useTranslation","heading","resolvedAddLabel","isEmpty","body","jsx","i","Skeleton","EmptyState","item","AgendaCard","itemsRef","useRef","innerRef","useImperativeHandle","useMemo","targetId","found","useAgentRegistration","jsxs","CalendarDays","IconButton","Plus"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { c as L } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as R } from "react-i18next";
5
5
  import { A as d } from "./alert-KJbsPYkI.js";
6
6
  import { B as w } from "./badge-DCOqV9mI.js";
7
- import { B as T } from "./button-DD_0Xdmr.js";
7
+ import { B as T } from "./button-CPGiR_bH.js";
8
8
  import { C as V } from "./checkbox-BuZ1u__2.js";
9
9
  import { S as j } from "./spinner-hbwuKwMf.js";
10
10
  import { T as z } from "./timestamp-BV2lC-wV.js";
@@ -167,4 +167,4 @@ export {
167
167
  P as A,
168
168
  K as a
169
169
  };
170
- //# sourceMappingURL=ai-consent-banner-Bke9m8VS.js.map
170
+ //# sourceMappingURL=ai-consent-banner-DUhr1yNj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-consent-banner-Bke9m8VS.js","sources":["../../src/components/ai-consent-banner/ai-consent-banner.agent.ts","../../src/components/ai-consent-banner/ai-consent-banner.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AiConsentBanner. */\n/* */\n/* Read-only structural surface: the current consent state and whether */\n/* the grant affordance is armed. Identifiers / structural state ONLY — */\n/* never the grantee's name or any PHI. The real consent gate lives */\n/* server-side; this adapter does not expose a grant action so an agent */\n/* cannot consent on a user's behalf. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AiConsentBannerHandle } from './ai-consent-banner';\n\nexport const aiConsentBannerAgent: AgentAdapter<AiConsentBannerHandle> = {\n id: 'ai-consent-banner',\n capabilities: [],\n state: {\n consentState: {\n type: \"'granted' | 'required' | 'pending'\",\n descriptionKey: 'ui.agent.aiConsentBanner.state.consentState',\n description:\n 'Current consent state. Structural only — never the grantee identity.',\n read: (handle) => handle.getState(),\n },\n armed: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiConsentBanner.state.armed',\n description:\n 'Whether the consent confirmation checkbox is ticked (required state only).',\n read: (handle) => handle.isArmed(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'ai-consent-banner',\n description: 'Marks the AiConsentBanner root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific banner from the agent.',\n },\n },\n};\n","import {\n forwardRef,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Alert } from '../alert/alert';\nimport { Badge } from '../badge/badge';\nimport { Button } from '../button/button';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { Spinner } from '../spinner/spinner';\nimport { Timestamp } from '../timestamp/timestamp';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { aiConsentBannerAgent } from './ai-consent-banner.agent';\n\n/* -------------------------------------------------------------------- */\n/* AiConsentBanner */\n/* */\n/* Presentational AI-consent gate surfaced above an AI-assisted surface */\n/* (e.g. Alfascribe consultation transcription). The SERVER owns the */\n/* real gate — this component only reflects the consent record and lets */\n/* the operator initiate a grant; it never enforces access itself. */\n/* */\n/* Three states drive the Alert variant + body: */\n/* - granted → success Alert with a Badge + when/who it was granted. */\n/* - required → info Alert with a Checkbox-gated Grant Button. */\n/* - pending → info Alert in a disabled, Spinner-busy state while the */\n/* server persists the grant. */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `aiConsentBanner.*` namespace. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA — root */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n state: {\n granted: '',\n required: '',\n pending: '',\n },\n },\n defaultVariants: {\n state: 'required',\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* State derivation */\n/* -------------------------------------------------------------------- */\n\nexport type AiConsentState = NonNullable<\n VariantProps<typeof rootVariants>['state']\n>;\n\n/** Pending wins over granted/required so the busy state is never masked. */\nfunction deriveState(granted: boolean, pending: boolean): AiConsentState {\n if (pending) return 'pending';\n return granted ? 'granted' : 'required';\n}\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\n/** Agent-readiness curated handle. Exposes the structural consent state only. */\nexport interface AiConsentBannerHandle {\n /** Current derived state: 'granted' | 'required' | 'pending'. */\n getState: () => AiConsentState;\n /** Whether the Grant affordance is currently armed (checkbox ticked). */\n isArmed: () => boolean;\n}\n\nexport interface AiConsentBannerProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children' | 'role'\n> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so an\n * agent / MCP UI bridge can address this specific banner. Mirrored to the\n * real DOM `id`.\n */\n id?: string;\n /** Whether consent has already been granted. Server-sourced. */\n granted: boolean;\n /**\n * When consent was granted — ISO-8601 string, ms-epoch, or Date. Rendered\n * via `Timestamp` in the granted state.\n */\n grantedAt?: string | number | Date;\n /** Who granted consent (operator display name / role). Granted state only. */\n grantedBy?: string;\n /**\n * Whether the current user is allowed to grant consent. When `false`, the\n * required-state Grant affordance is hidden and a not-allowed note shows.\n * Default `true`.\n */\n canGrant?: boolean;\n /** The grant is being persisted server-side — shows the busy Spinner state. */\n pending?: boolean;\n /** Fired when the operator confirms the consent grant. */\n onGrantConsent?: () => void;\n /** Override the region's accessible name. */\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const AiConsentBanner = forwardRef<HTMLDivElement, AiConsentBannerProps>(\n (\n {\n id,\n granted,\n grantedAt,\n grantedBy,\n canGrant = true,\n pending = false,\n onGrantConsent,\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const state = deriveState(granted, pending);\n\n // Local arm switch — the required state gates the Grant Button behind an\n // explicit \"I understand\" checkbox so consent is never one mis-click away.\n const [armed, setArmed] = useState(false);\n\n const armedRef = useRef(armed);\n armedRef.current = armed;\n\n const handle = useMemo<AiConsentBannerHandle>(\n () => ({\n getState: () => deriveState(granted, pending),\n isArmed: () => armedRef.current,\n }),\n [granted, pending],\n );\n useAgentRegistration(aiConsentBannerAgent, handle, id);\n\n const resolvedAriaLabel =\n ariaLabel ?? t('aiConsentBanner.regionLabel', 'AI assistance consent');\n\n // Alert variant per state: granted → success, required/pending → info.\n const alertVariant = state === 'granted' ? 'success' : 'info';\n\n let body: React.ReactNode;\n if (state === 'granted') {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Badge variant=\"success\">\n {t('aiConsentBanner.badge.granted', 'Consent granted')}\n </Badge>\n {grantedAt !== undefined ? (\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.grantedAtPrefix', 'Granted')}{' '}\n <Timestamp value={grantedAt} format=\"relative\" shape=\"inline\" />\n </span>\n ) : null}\n </div>\n {grantedBy ? (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.grantedBy', {\n name: grantedBy,\n defaultValue: 'By {{name}}',\n })}\n </p>\n ) : null}\n </div>\n );\n } else if (state === 'pending') {\n body = (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Spinner\n variant=\"pulse\"\n size=\"sm\"\n label={t('aiConsentBanner.pendingLabel', 'Saving consent…')}\n />\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.pendingLabel', 'Saving consent…')}\n </span>\n </div>\n );\n } else {\n // required\n body = canGrant ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <Checkbox\n checked={armed}\n onCheckedChange={(next) => setArmed(next === true)}\n label={t(\n 'aiConsentBanner.confirmLabel',\n 'I confirm consent has been obtained for AI assistance.',\n )}\n />\n <Alert.Action>\n <Button\n intent=\"primary\"\n size=\"sm\"\n disabled={!armed}\n onClick={onGrantConsent}\n >\n {t('aiConsentBanner.grantButton', 'Grant consent')}\n </Button>\n </Alert.Action>\n </div>\n ) : (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t(\n 'aiConsentBanner.notAllowed',\n 'You do not have permission to grant AI assistance consent.',\n )}\n </p>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n aria-busy={state === 'pending' ? true : undefined}\n data-component=\"ai-consent-banner\"\n data-component-id={id}\n data-state={state}\n id={id}\n className={rootVariants({ state, className })}\n {...rest}\n >\n <Alert\n variant={alertVariant}\n icon={state === 'pending' ? null : undefined}\n >\n <Alert.Title>\n {t('aiConsentBanner.title', 'AI assistance consent')}\n </Alert.Title>\n <Alert.Description>\n {state === 'granted'\n ? t(\n 'aiConsentBanner.description.granted',\n 'AI assistance is enabled for this record.',\n )\n : t(\n 'aiConsentBanner.description.required',\n 'AI assistance requires recorded consent before it can run.',\n )}\n </Alert.Description>\n {body}\n </Alert>\n </div>\n );\n },\n);\n\nAiConsentBanner.displayName = 'AiConsentBanner';\n"],"names":["aiConsentBannerAgent","handle","rootVariants","cva","deriveState","granted","pending","AiConsentBanner","forwardRef","id","grantedAt","grantedBy","canGrant","onGrantConsent","ariaLabel","className","rest","ref","t","useTranslation","state","armed","setArmed","useState","armedRef","useRef","useMemo","useAgentRegistration","resolvedAriaLabel","alertVariant","body","jsxs","jsx","Badge","Timestamp","Spinner","Checkbox","next","Alert","Button"],"mappings":"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"}
1
+ {"version":3,"file":"ai-consent-banner-DUhr1yNj.js","sources":["../../src/components/ai-consent-banner/ai-consent-banner.agent.ts","../../src/components/ai-consent-banner/ai-consent-banner.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AiConsentBanner. */\n/* */\n/* Read-only structural surface: the current consent state and whether */\n/* the grant affordance is armed. Identifiers / structural state ONLY — */\n/* never the grantee's name or any PHI. The real consent gate lives */\n/* server-side; this adapter does not expose a grant action so an agent */\n/* cannot consent on a user's behalf. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AiConsentBannerHandle } from './ai-consent-banner';\n\nexport const aiConsentBannerAgent: AgentAdapter<AiConsentBannerHandle> = {\n id: 'ai-consent-banner',\n capabilities: [],\n state: {\n consentState: {\n type: \"'granted' | 'required' | 'pending'\",\n descriptionKey: 'ui.agent.aiConsentBanner.state.consentState',\n description:\n 'Current consent state. Structural only — never the grantee identity.',\n read: (handle) => handle.getState(),\n },\n armed: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiConsentBanner.state.armed',\n description:\n 'Whether the consent confirmation checkbox is ticked (required state only).',\n read: (handle) => handle.isArmed(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'ai-consent-banner',\n description: 'Marks the AiConsentBanner root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific banner from the agent.',\n },\n },\n};\n","import {\n forwardRef,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Alert } from '../alert/alert';\nimport { Badge } from '../badge/badge';\nimport { Button } from '../button/button';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { Spinner } from '../spinner/spinner';\nimport { Timestamp } from '../timestamp/timestamp';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { aiConsentBannerAgent } from './ai-consent-banner.agent';\n\n/* -------------------------------------------------------------------- */\n/* AiConsentBanner */\n/* */\n/* Presentational AI-consent gate surfaced above an AI-assisted surface */\n/* (e.g. Alfascribe consultation transcription). The SERVER owns the */\n/* real gate — this component only reflects the consent record and lets */\n/* the operator initiate a grant; it never enforces access itself. */\n/* */\n/* Three states drive the Alert variant + body: */\n/* - granted → success Alert with a Badge + when/who it was granted. */\n/* - required → info Alert with a Checkbox-gated Grant Button. */\n/* - pending → info Alert in a disabled, Spinner-busy state while the */\n/* server persists the grant. */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `aiConsentBanner.*` namespace. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA — root */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n state: {\n granted: '',\n required: '',\n pending: '',\n },\n },\n defaultVariants: {\n state: 'required',\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* State derivation */\n/* -------------------------------------------------------------------- */\n\nexport type AiConsentState = NonNullable<\n VariantProps<typeof rootVariants>['state']\n>;\n\n/** Pending wins over granted/required so the busy state is never masked. */\nfunction deriveState(granted: boolean, pending: boolean): AiConsentState {\n if (pending) return 'pending';\n return granted ? 'granted' : 'required';\n}\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\n/** Agent-readiness curated handle. Exposes the structural consent state only. */\nexport interface AiConsentBannerHandle {\n /** Current derived state: 'granted' | 'required' | 'pending'. */\n getState: () => AiConsentState;\n /** Whether the Grant affordance is currently armed (checkbox ticked). */\n isArmed: () => boolean;\n}\n\nexport interface AiConsentBannerProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children' | 'role'\n> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so an\n * agent / MCP UI bridge can address this specific banner. Mirrored to the\n * real DOM `id`.\n */\n id?: string;\n /** Whether consent has already been granted. Server-sourced. */\n granted: boolean;\n /**\n * When consent was granted — ISO-8601 string, ms-epoch, or Date. Rendered\n * via `Timestamp` in the granted state.\n */\n grantedAt?: string | number | Date;\n /** Who granted consent (operator display name / role). Granted state only. */\n grantedBy?: string;\n /**\n * Whether the current user is allowed to grant consent. When `false`, the\n * required-state Grant affordance is hidden and a not-allowed note shows.\n * Default `true`.\n */\n canGrant?: boolean;\n /** The grant is being persisted server-side — shows the busy Spinner state. */\n pending?: boolean;\n /** Fired when the operator confirms the consent grant. */\n onGrantConsent?: () => void;\n /** Override the region's accessible name. */\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const AiConsentBanner = forwardRef<HTMLDivElement, AiConsentBannerProps>(\n (\n {\n id,\n granted,\n grantedAt,\n grantedBy,\n canGrant = true,\n pending = false,\n onGrantConsent,\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const state = deriveState(granted, pending);\n\n // Local arm switch — the required state gates the Grant Button behind an\n // explicit \"I understand\" checkbox so consent is never one mis-click away.\n const [armed, setArmed] = useState(false);\n\n const armedRef = useRef(armed);\n armedRef.current = armed;\n\n const handle = useMemo<AiConsentBannerHandle>(\n () => ({\n getState: () => deriveState(granted, pending),\n isArmed: () => armedRef.current,\n }),\n [granted, pending],\n );\n useAgentRegistration(aiConsentBannerAgent, handle, id);\n\n const resolvedAriaLabel =\n ariaLabel ?? t('aiConsentBanner.regionLabel', 'AI assistance consent');\n\n // Alert variant per state: granted → success, required/pending → info.\n const alertVariant = state === 'granted' ? 'success' : 'info';\n\n let body: React.ReactNode;\n if (state === 'granted') {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Badge variant=\"success\">\n {t('aiConsentBanner.badge.granted', 'Consent granted')}\n </Badge>\n {grantedAt !== undefined ? (\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.grantedAtPrefix', 'Granted')}{' '}\n <Timestamp value={grantedAt} format=\"relative\" shape=\"inline\" />\n </span>\n ) : null}\n </div>\n {grantedBy ? (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.grantedBy', {\n name: grantedBy,\n defaultValue: 'By {{name}}',\n })}\n </p>\n ) : null}\n </div>\n );\n } else if (state === 'pending') {\n body = (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Spinner\n variant=\"pulse\"\n size=\"sm\"\n label={t('aiConsentBanner.pendingLabel', 'Saving consent…')}\n />\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.pendingLabel', 'Saving consent…')}\n </span>\n </div>\n );\n } else {\n // required\n body = canGrant ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <Checkbox\n checked={armed}\n onCheckedChange={(next) => setArmed(next === true)}\n label={t(\n 'aiConsentBanner.confirmLabel',\n 'I confirm consent has been obtained for AI assistance.',\n )}\n />\n <Alert.Action>\n <Button\n intent=\"primary\"\n size=\"sm\"\n disabled={!armed}\n onClick={onGrantConsent}\n >\n {t('aiConsentBanner.grantButton', 'Grant consent')}\n </Button>\n </Alert.Action>\n </div>\n ) : (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t(\n 'aiConsentBanner.notAllowed',\n 'You do not have permission to grant AI assistance consent.',\n )}\n </p>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n aria-busy={state === 'pending' ? true : undefined}\n data-component=\"ai-consent-banner\"\n data-component-id={id}\n data-state={state}\n id={id}\n className={rootVariants({ state, className })}\n {...rest}\n >\n <Alert\n variant={alertVariant}\n icon={state === 'pending' ? null : undefined}\n >\n <Alert.Title>\n {t('aiConsentBanner.title', 'AI assistance consent')}\n </Alert.Title>\n <Alert.Description>\n {state === 'granted'\n ? t(\n 'aiConsentBanner.description.granted',\n 'AI assistance is enabled for this record.',\n )\n : t(\n 'aiConsentBanner.description.required',\n 'AI assistance requires recorded consent before it can run.',\n )}\n </Alert.Description>\n {body}\n </Alert>\n </div>\n );\n },\n);\n\nAiConsentBanner.displayName = 'AiConsentBanner';\n"],"names":["aiConsentBannerAgent","handle","rootVariants","cva","deriveState","granted","pending","AiConsentBanner","forwardRef","id","grantedAt","grantedBy","canGrant","onGrantConsent","ariaLabel","className","rest","ref","t","useTranslation","state","armed","setArmed","useState","armedRef","useRef","useMemo","useAgentRegistration","resolvedAriaLabel","alertVariant","body","jsxs","jsx","Badge","Timestamp","Spinner","Checkbox","next","Alert","Button"],"mappings":"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"}
@@ -7,7 +7,7 @@ import { u as Oe } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
7
7
  import { u as Re } from "./registry-DvAUVLHh.js";
8
8
  import { _ as g } from "./index-4xgbg-sn.js";
9
9
  import { u as De } from "./index-BcMWc8W2.js";
10
- import { I as te } from "./icon-button-LqoiKcUN.js";
10
+ import { I as te } from "./icon-button-C_kbcd7I.js";
11
11
  import { S as We } from "./select-BmCbJMJS.js";
12
12
  import { S as _e } from "./send-C5kDJ-Mz.js";
13
13
  import { X as Ae } from "./x-B5YnXwCz.js";
@@ -497,4 +497,4 @@ export {
497
497
  Ze as A,
498
498
  Le as a
499
499
  };
500
- //# sourceMappingURL=ai-prompt-input-TVI95hJD.js.map
500
+ //# sourceMappingURL=ai-prompt-input-DFm58UjY.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-prompt-input-TVI95hJD.js","sources":["../../src/components/ai-prompt-input/ai-prompt-input.agent.ts","../../src/components/ai-prompt-input/ai-prompt-input.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AIPromptInput. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AIPromptInputHandle } from './ai-prompt-input';\n\nexport const aiPromptInputAgent: AgentAdapter<AIPromptInputHandle> = {\n id: 'ai-prompt-input',\n capabilities: ['edit_inline', 'submit'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.aiPromptInput.state.value',\n description: 'Current text in the composer (no PHI processing).',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiPromptInput.state.isEmpty',\n description: 'True when the composer has no text and no attachments.',\n read: (handle) => handle.isEmpty(),\n },\n isSubmitting: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiPromptInput.state.isSubmitting',\n description:\n 'True while an onSubmit invocation is in flight (best-effort).',\n read: (handle) => handle.isSubmitting(),\n },\n },\n actions: {\n set_value: {\n // Sets a form/input value — reversible via the same UI.\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: { value: { type: 'string' } },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.setValue',\n description: 'Replace the composer text with the given value.',\n examples: [\n {\n args: { value: 'Summarise the last visit' },\n note: 'Replace composer text.',\n },\n ],\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n // Loses the user's (potentially long) draft — irreversible from this UI.\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.clear',\n description: 'Clear text and attachments. Irreversible from the same UI.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n submit: {\n // Hands the composer state to onSubmit, which dispatches to an external\n // AI/host system — openWorld.\n safety: 'write',\n openWorld: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.submit',\n description: 'Submit the current composer state via onSubmit.',\n invoke: (handle) => {\n handle.submit();\n },\n },\n focus: {\n // Pure ephemeral focus state.\n safety: 'read',\n descriptionKey: 'ui.agent.aiPromptInput.actions.focus',\n description: 'Move keyboard focus into the textarea.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'ai-prompt-input',\n description: 'Marks the AIPromptInput wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop; addresses a specific composer instance.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type ClipboardEvent,\n type CompositionEvent,\n type KeyboardEvent,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { aiPromptInputAgent } from './ai-prompt-input.agent';\nimport { Command } from 'cmdk';\nimport { useDropzone } from 'react-dropzone';\nimport { Send, X } from 'lucide-react';\nimport { IconButton } from '../button';\nimport { Select, type SelectOption } from '../select/select';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface AIPromptCommand {\n id: string;\n label: string;\n description?: string;\n}\n\nexport interface AIPromptModel {\n id: string;\n label: string;\n}\n\nexport interface AIPromptAttachment {\n id: string;\n file: File;\n}\n\nexport interface AIPromptSubmitPayload {\n text: string;\n command?: string;\n attachments: AIPromptAttachment[];\n modelId?: string;\n}\n\ntype NativeTextareaProps = Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'size' | 'onSubmit' | 'children'\n>;\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-input',\n 'ds:shadow-[var(--shadow-input)]',\n 'ds:transition-[border-color,box-shadow] ds:duration-[var(--animation-duration)]',\n 'ds:focus-within:border-[color:var(--primary)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/** Curated imperative handle for agent / external automation. */\nexport interface AIPromptInputHandle {\n /** Current composer text. */\n getValue: () => string;\n /** True when text is empty and no attachments are pending. */\n isEmpty: () => boolean;\n /** True while a submit is in flight. */\n isSubmitting: () => boolean;\n /** Replace the composer text. */\n setValue: (value: string) => void;\n /** Clear text and attachments. */\n clear: () => void;\n /** Programmatically submit. */\n submit: () => void;\n /** Move keyboard focus into the textarea. */\n focus: () => void;\n}\n\nexport interface AIPromptInputProps\n extends NativeTextareaProps, VariantProps<typeof rootVariants> {\n /** Slash-command catalog. The DS owns the menu; apps own the commands. */\n commands?: AIPromptCommand[];\n /** Model catalog rendered as a Radix Select in the footer. */\n models?: AIPromptModel[];\n defaultModelId?: string;\n modelId?: string;\n onModelChange?: (id: string) => void;\n /** Maximum attachment size in bytes. */\n maxSize?: number;\n /** `accept` forwarded to react-dropzone. */\n accept?: Record<string, string[]>;\n /** Optional active context pill — dismissible via Backspace when focused. */\n context?: string;\n onContextDismiss?: () => void;\n onSubmit?: (payload: AIPromptSubmitPayload) => void;\n onAttach?: (files: File[]) => void;\n onAttachmentRejected?: (reason: string) => void;\n minRows?: number;\n maxRows?: number;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const AIPromptInput = forwardRef<HTMLDivElement, AIPromptInputProps>(\n (\n {\n commands = [],\n models,\n defaultModelId,\n modelId,\n onModelChange,\n maxSize,\n accept,\n context,\n onContextDismiss,\n onSubmit,\n onAttach,\n onAttachmentRejected,\n minRows = 2,\n maxRows = 8,\n value,\n defaultValue,\n size = 'md',\n disabled,\n className,\n placeholder,\n onChange,\n onKeyDown,\n onCompositionStart,\n onCompositionEnd,\n onPaste,\n id,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const textareaId = useId();\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n const composingRef = useRef(false);\n const slashMenuRef = useRef<HTMLDivElement | null>(null);\n\n const setRefs = useCallback((node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n }, []);\n\n const [currentValueRaw, setPromptValue] = useControllableState<string>({\n value: value === undefined ? undefined : String(value),\n defaultValue: String(defaultValue ?? ''),\n });\n const currentValue = currentValueRaw ?? '';\n\n const [attachments, setAttachments] = useState<AIPromptAttachment[]>([]);\n const [slashOpen, setSlashOpen] = useState(false);\n const [slashQuery, setSlashQuery] = useState('');\n\n const [currentModelRaw, setPromptModel] = useControllableState<string>({\n value: modelId,\n defaultValue: defaultModelId ?? models?.[0]?.id ?? '',\n onChange: onModelChange,\n });\n const currentModel = currentModelRaw ?? '';\n\n /* ── Auto-grow ── */\n const resize = useCallback(() => {\n const el = innerRef.current;\n if (!el) return;\n const styles = window.getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight) || 24;\n const padTop = parseFloat(styles.paddingTop) || 0;\n const padBot = parseFloat(styles.paddingBottom) || 0;\n const borderTop = parseFloat(styles.borderTopWidth) || 0;\n const borderBot = parseFloat(styles.borderBottomWidth) || 0;\n const chrome = padTop + padBot + borderTop + borderBot;\n const minH = lineHeight * minRows + chrome;\n const maxH = lineHeight * maxRows + chrome;\n el.style.height = 'auto';\n const next = Math.max(minH, Math.min(el.scrollHeight, maxH));\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > maxH ? 'auto' : 'hidden';\n }, [minRows, maxRows]);\n\n useIsomorphicLayoutEffect(() => {\n resize();\n }, [resize, currentValue]);\n\n /* ── Slash detection ── */\n const detectSlash = useCallback((text: string, caretPos: number) => {\n // Find the start of the current line.\n const before = text.slice(0, caretPos);\n const lineStart = before.lastIndexOf('\\n') + 1;\n const lineText = text.slice(lineStart, caretPos);\n if (lineText.startsWith('/')) {\n const afterSlash = lineText.slice(1);\n // Only open if the characters after '/' contain no whitespace.\n if (!/\\s/.test(afterSlash)) {\n setSlashOpen(true);\n setSlashQuery(afterSlash);\n return;\n }\n }\n setSlashOpen(false);\n setSlashQuery('');\n }, []);\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n setPromptValue(e.target.value);\n if (composingRef.current) return;\n onChange?.(e);\n const caret = e.target.selectionStart ?? e.target.value.length;\n detectSlash(e.target.value, caret);\n };\n\n const handleCompositionStart = (\n e: CompositionEvent<HTMLTextAreaElement>,\n ) => {\n composingRef.current = true;\n onCompositionStart?.(e);\n };\n const handleCompositionEnd = (e: CompositionEvent<HTMLTextAreaElement>) => {\n composingRef.current = false;\n onCompositionEnd?.(e);\n };\n\n const isIMEKey = (e: KeyboardEvent<HTMLTextAreaElement>) =>\n e.nativeEvent.isComposing || e.keyCode === 229 || composingRef.current;\n\n const handleSubmit = useCallback(() => {\n const text = currentValue.trim();\n if (!text && attachments.length === 0) return;\n // Extract any leading command token.\n let command: string | undefined;\n let body = currentValue;\n const m = currentValue.match(/^\\/(\\S+)\\s?/);\n if (m) {\n command = m[1];\n body = currentValue.slice(m[0].length);\n }\n onSubmit?.({\n text: body,\n command,\n attachments,\n modelId: currentModel || undefined,\n });\n setPromptValue('');\n setAttachments([]);\n }, [currentValue, attachments, onSubmit, currentModel, setPromptValue]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<AIPromptInputHandle>(\n () => ({\n getValue: () => currentValue,\n isEmpty: () => !currentValue.trim() && attachments.length === 0,\n isSubmitting: () => false,\n setValue: (next: string) => {\n setPromptValue(next);\n },\n clear: () => {\n setPromptValue('');\n setAttachments([]);\n },\n submit: () => {\n handleSubmit();\n },\n focus: () => {\n innerRef.current?.focus();\n },\n }),\n [currentValue, attachments, setPromptValue, handleSubmit],\n );\n useAgentRegistration(aiPromptInputAgent, agentHandle, id);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (isIMEKey(e)) return;\n\n // Slash menu open — Escape closes; ArrowDown/ArrowUp/Enter handled by cmdk.\n if (slashOpen) {\n if (e.key === 'Escape') {\n e.preventDefault();\n setSlashOpen(false);\n return;\n }\n }\n\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const insertCommand = (cmd: AIPromptCommand) => {\n const el = innerRef.current;\n if (!el) return;\n const caret = el.selectionStart ?? currentValue.length;\n const before = currentValue.slice(0, caret);\n const lineStart = before.lastIndexOf('\\n') + 1;\n // Extend past any non-whitespace characters that follow the caret so\n // we replace the ENTIRE slash token (\"/fi|xBug more\" → \"/fixBug more\"),\n // not just the part before the caret (which would garble the tail).\n let endOfSlashToken = caret;\n while (\n endOfSlashToken < currentValue.length &&\n !/\\s/.test(currentValue[endOfSlashToken])\n ) {\n endOfSlashToken += 1;\n }\n const afterSlash = currentValue.slice(endOfSlashToken);\n const nextValue =\n currentValue.slice(0, lineStart) + `/${cmd.id} ` + afterSlash;\n setPromptValue(nextValue);\n // External consumers mirror the same synthetic event pattern other\n // text inputs in the system use — the native `onChange` fires via React.\n setSlashOpen(false);\n setSlashQuery('');\n queueMicrotask(() => el.focus());\n };\n\n /* ── Clipboard paste: strip rich HTML to plaintext, hand files to onAttach ── */\n const handlePaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {\n onPaste?.(e);\n if (e.defaultPrevented) return;\n const { clipboardData } = e;\n if (!clipboardData) return;\n const files: File[] = [];\n for (let i = 0; i < clipboardData.items.length; i += 1) {\n const item = clipboardData.items[i];\n if (item.kind === 'file') {\n const f = item.getAsFile();\n if (f) files.push(f);\n }\n }\n if (files.length > 0) {\n e.preventDefault();\n acceptFiles(files);\n }\n };\n\n /* ── Dropzone ── */\n const acceptFiles = useCallback(\n (files: File[]) => {\n const next: AIPromptAttachment[] = [];\n for (const f of files) {\n if (typeof maxSize === 'number' && f.size > maxSize) {\n onAttachmentRejected?.(\n t('chat.attachment.rejected', { reason: 'size' }),\n );\n continue;\n }\n next.push({\n id: crypto.randomUUID?.() ?? `att-${Math.random()}`,\n file: f,\n });\n }\n if (next.length > 0) {\n setAttachments((prev) => [...prev, ...next]);\n onAttach?.(next.map((a) => a.file));\n }\n },\n [maxSize, onAttach, onAttachmentRejected, t],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop: acceptFiles,\n maxSize,\n accept,\n noClick: true,\n noKeyboard: true,\n });\n\n const removeAttachment = (id: string) => {\n setAttachments((prev) => prev.filter((a) => a.id !== id));\n };\n\n const effectiveId = id ?? textareaId;\n const labelId = `${effectiveId}-label`;\n const slashListId = `${effectiveId}-slash-list`;\n\n const modelOptions: SelectOption<string>[] =\n models?.map((m) => ({ value: m.id, label: m.label })) ?? [];\n\n return (\n <div\n ref={rootRef}\n {...getRootProps({\n className: [\n rootVariants({ size, className }),\n isDragActive\n ? 'ds:outline ds:outline-dashed ds:outline-[color:var(--primary)] ds:outline-offset-2 ds:bg-[color:var(--primary)]/5'\n : '',\n ].join(' '),\n })}\n aria-label={t('chat.attachmentZone')}\n data-component=\"ai-prompt-input\"\n data-component-id={id}\n >\n {/* Hidden file input owned by react-dropzone. The aria-label\n covers axe's `label` rule (the input is visually-hidden but\n still reachable programmatically). */}\n <input aria-label={t('chat.attachmentZone')} {...getInputProps()} />\n\n {context ? (\n <div className=\"ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)]\">\n {/* Native <button> — not a span with role=\"button\" — per\n 05-accessibility \"Interactive elements use the right tag\".\n Enter/Space dispatch naturally via the native button;\n Backspace/Delete also dismiss (pill convention). */}\n <button\n type=\"button\"\n aria-label={t('chat.contextActive', { name: context })}\n onClick={onContextDismiss}\n onKeyDown={(e) => {\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault();\n onContextDismiss?.();\n }\n }}\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:border ds:border-[color:var(--accent)]/30',\n 'ds:bg-[color:var(--accent)]/10 ds:text-[color:var(--foreground)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'type-body-sm',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n >\n {t('chat.contextActive', { name: context })}\n </button>\n </div>\n ) : null}\n\n <label id={labelId} htmlFor={effectiveId} className=\"ds:sr-only\">\n {t('chat.prompt')}\n </label>\n\n <div className=\"ds:relative\">\n {/* The textarea takes on a combobox role only while the slash\n popup is open. ARIA 1.2 permits `role=\"combobox\"` on a\n textarea — that's what makes `aria-expanded` / `aria-controls`\n valid here. When the popup is closed the textarea reverts to\n its plain implicit role so we don't add the aria attrs at all. */}\n <textarea\n ref={setRefs}\n id={effectiveId}\n rows={minRows}\n value={currentValue}\n disabled={disabled}\n placeholder={placeholder ?? t('chat.input.placeholder')}\n aria-labelledby={labelId}\n role={slashOpen ? 'combobox' : undefined}\n aria-controls={slashOpen ? slashListId : undefined}\n aria-expanded={slashOpen ? true : undefined}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n className={[\n 'ds:w-full ds:resize-none ds:bg-transparent ds:outline-none',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]',\n 'ds:placeholder:text-[color:var(--muted-foreground)]',\n 'ds:leading-[var(--line-height-base)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed',\n ].join(' ')}\n {...rest}\n />\n\n {slashOpen ? (\n <div\n ref={slashMenuRef}\n className={[\n 'ds:absolute ds:start-[var(--spacing-md)] ds:top-full ds:z-50',\n 'ds:mt-[var(--spacing-xs)]',\n 'ds:min-w-[240px] ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:bg-[color:var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:shadow-[var(--shadow-md)]',\n // Match the Dialog / DropdownMenu open pattern: fade + scale\n // in from 95%. Origin set to the block-start so the menu\n // appears to expand from the textarea it sits beneath.\n 'ds:origin-top ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:zoom-in-95',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n id={slashListId}\n >\n <Command label={t('chat.slashMenu.label')} loop>\n <Command.Input\n value={slashQuery}\n onValueChange={setSlashQuery}\n className=\"ds:sr-only\"\n />\n <Command.List className=\"ds:max-h-60 ds:overflow-y-auto ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n <Command.Empty className=\"type-body-sm ds:text-[color:var(--muted-foreground)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]\">\n {t('chat.slashMenu.empty')}\n </Command.Empty>\n {commands.map((cmd) => (\n <Command.Item\n key={cmd.id}\n value={cmd.id}\n onSelect={() => insertCommand(cmd)}\n className={[\n 'ds:flex ds:flex-col ds:gap-[2px]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-body-sm ds:cursor-pointer',\n 'ds:aria-selected:bg-muted/20',\n 'ds:data-[selected=true]:bg-muted/20',\n ].join(' ')}\n >\n <span className=\"ds:font-medium\">/{cmd.id}</span>\n {cmd.description ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {cmd.description}\n </span>\n ) : null}\n </Command.Item>\n ))}\n </Command.List>\n </Command>\n </div>\n ) : null}\n </div>\n\n {attachments.length > 0 ? (\n <div\n role=\"group\"\n aria-label={t('chat.attachmentZone')}\n className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]\"\n >\n {attachments.map((att) => (\n <AttachmentChip\n key={att.id}\n file={att.file}\n onRemove={() => removeAttachment(att.id)}\n />\n ))}\n </div>\n ) : null}\n\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n {models && models.length > 0 ? (\n <div className=\"ds:me-auto ds:min-w-[140px]\">\n <Select\n aria-label={t('chat.model.select')}\n options={modelOptions}\n value={currentModel || ''}\n onValueChange={(v) => {\n setPromptModel(v);\n }}\n size=\"sm\"\n />\n </div>\n ) : (\n <div className=\"ds:me-auto\" />\n )}\n <span className=\"ds:sr-only\">{t('chat.input.sendHint')}</span>\n <IconButton\n icon={<Send />}\n aria-label={t('chat.send')}\n intent=\"primary\"\n size=\"sm\"\n disabled={\n disabled || (!currentValue.trim() && attachments.length === 0)\n }\n onClick={handleSubmit}\n aria-keyshortcuts=\"Meta+Enter Control+Enter\"\n />\n </div>\n </div>\n );\n },\n);\n\nAIPromptInput.displayName = 'AIPromptInput';\n\n/* ------------------------------------------------------------------ */\n/* Attachment chip */\n/* ------------------------------------------------------------------ */\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction AttachmentChip({\n file,\n onRemove,\n}: {\n file: File;\n onRemove: () => void;\n}): ReactNode {\n const { t } = useTranslation();\n return (\n <span\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:bg-muted/30',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-meta',\n // Entrance when a file is attached via drop / paste / picker.\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-bottom-1',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n >\n <span className=\"ds:truncate ds:max-w-[16ch]\">{file.name}</span>\n <span className=\"ds:text-[color:var(--muted-foreground)] ds:tabular-nums\">\n {formatSize(file.size)}\n </span>\n <IconButton\n icon={<X />}\n aria-label={t('chat.attachment.remove', { name: file.name })}\n intent=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n />\n </span>\n );\n}\n"],"names":["aiPromptInputAgent","handle","args","rootVariants","cva","AIPromptInput","forwardRef","commands","models","defaultModelId","modelId","onModelChange","maxSize","accept","context","onContextDismiss","onSubmit","onAttach","onAttachmentRejected","minRows","maxRows","value","defaultValue","size","disabled","className","placeholder","onChange","onKeyDown","onCompositionStart","onCompositionEnd","onPaste","id","rest","ref","t","useTranslation","textareaId","useId","innerRef","useRef","composingRef","slashMenuRef","setRefs","useCallback","node","currentValueRaw","setPromptValue","useControllableState","currentValue","attachments","setAttachments","useState","slashOpen","setSlashOpen","slashQuery","setSlashQuery","currentModelRaw","setPromptModel","_a","currentModel","resize","el","styles","lineHeight","padTop","padBot","borderTop","borderBot","chrome","minH","maxH","next","useIsomorphicLayoutEffect","detectSlash","text","caretPos","lineStart","lineText","afterSlash","handleChange","caret","handleCompositionStart","handleCompositionEnd","isIMEKey","handleSubmit","command","body","m","rootRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","handleKeyDown","insertCommand","cmd","endOfSlashToken","nextValue","handlePaste","clipboardData","files","i","item","f","acceptFiles","prev","a","getRootProps","getInputProps","isDragActive","useDropzone","removeAttachment","effectiveId","labelId","slashListId","modelOptions","jsxs","jsx","Command","att","AttachmentChip","Select","v","IconButton","Send","formatSize","bytes","file","onRemove","X"],"mappings":"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"}
1
+ {"version":3,"file":"ai-prompt-input-DFm58UjY.js","sources":["../../src/components/ai-prompt-input/ai-prompt-input.agent.ts","../../src/components/ai-prompt-input/ai-prompt-input.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AIPromptInput. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AIPromptInputHandle } from './ai-prompt-input';\n\nexport const aiPromptInputAgent: AgentAdapter<AIPromptInputHandle> = {\n id: 'ai-prompt-input',\n capabilities: ['edit_inline', 'submit'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.aiPromptInput.state.value',\n description: 'Current text in the composer (no PHI processing).',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiPromptInput.state.isEmpty',\n description: 'True when the composer has no text and no attachments.',\n read: (handle) => handle.isEmpty(),\n },\n isSubmitting: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiPromptInput.state.isSubmitting',\n description:\n 'True while an onSubmit invocation is in flight (best-effort).',\n read: (handle) => handle.isSubmitting(),\n },\n },\n actions: {\n set_value: {\n // Sets a form/input value — reversible via the same UI.\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: { value: { type: 'string' } },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.setValue',\n description: 'Replace the composer text with the given value.',\n examples: [\n {\n args: { value: 'Summarise the last visit' },\n note: 'Replace composer text.',\n },\n ],\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n // Loses the user's (potentially long) draft — irreversible from this UI.\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.clear',\n description: 'Clear text and attachments. Irreversible from the same UI.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n submit: {\n // Hands the composer state to onSubmit, which dispatches to an external\n // AI/host system — openWorld.\n safety: 'write',\n openWorld: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.submit',\n description: 'Submit the current composer state via onSubmit.',\n invoke: (handle) => {\n handle.submit();\n },\n },\n focus: {\n // Pure ephemeral focus state.\n safety: 'read',\n descriptionKey: 'ui.agent.aiPromptInput.actions.focus',\n description: 'Move keyboard focus into the textarea.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'ai-prompt-input',\n description: 'Marks the AIPromptInput wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop; addresses a specific composer instance.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type ClipboardEvent,\n type CompositionEvent,\n type KeyboardEvent,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { aiPromptInputAgent } from './ai-prompt-input.agent';\nimport { Command } from 'cmdk';\nimport { useDropzone } from 'react-dropzone';\nimport { Send, X } from 'lucide-react';\nimport { IconButton } from '../button';\nimport { Select, type SelectOption } from '../select/select';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface AIPromptCommand {\n id: string;\n label: string;\n description?: string;\n}\n\nexport interface AIPromptModel {\n id: string;\n label: string;\n}\n\nexport interface AIPromptAttachment {\n id: string;\n file: File;\n}\n\nexport interface AIPromptSubmitPayload {\n text: string;\n command?: string;\n attachments: AIPromptAttachment[];\n modelId?: string;\n}\n\ntype NativeTextareaProps = Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'size' | 'onSubmit' | 'children'\n>;\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-input',\n 'ds:shadow-[var(--shadow-input)]',\n 'ds:transition-[border-color,box-shadow] ds:duration-[var(--animation-duration)]',\n 'ds:focus-within:border-[color:var(--primary)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/** Curated imperative handle for agent / external automation. */\nexport interface AIPromptInputHandle {\n /** Current composer text. */\n getValue: () => string;\n /** True when text is empty and no attachments are pending. */\n isEmpty: () => boolean;\n /** True while a submit is in flight. */\n isSubmitting: () => boolean;\n /** Replace the composer text. */\n setValue: (value: string) => void;\n /** Clear text and attachments. */\n clear: () => void;\n /** Programmatically submit. */\n submit: () => void;\n /** Move keyboard focus into the textarea. */\n focus: () => void;\n}\n\nexport interface AIPromptInputProps\n extends NativeTextareaProps, VariantProps<typeof rootVariants> {\n /** Slash-command catalog. The DS owns the menu; apps own the commands. */\n commands?: AIPromptCommand[];\n /** Model catalog rendered as a Radix Select in the footer. */\n models?: AIPromptModel[];\n defaultModelId?: string;\n modelId?: string;\n onModelChange?: (id: string) => void;\n /** Maximum attachment size in bytes. */\n maxSize?: number;\n /** `accept` forwarded to react-dropzone. */\n accept?: Record<string, string[]>;\n /** Optional active context pill — dismissible via Backspace when focused. */\n context?: string;\n onContextDismiss?: () => void;\n onSubmit?: (payload: AIPromptSubmitPayload) => void;\n onAttach?: (files: File[]) => void;\n onAttachmentRejected?: (reason: string) => void;\n minRows?: number;\n maxRows?: number;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const AIPromptInput = forwardRef<HTMLDivElement, AIPromptInputProps>(\n (\n {\n commands = [],\n models,\n defaultModelId,\n modelId,\n onModelChange,\n maxSize,\n accept,\n context,\n onContextDismiss,\n onSubmit,\n onAttach,\n onAttachmentRejected,\n minRows = 2,\n maxRows = 8,\n value,\n defaultValue,\n size = 'md',\n disabled,\n className,\n placeholder,\n onChange,\n onKeyDown,\n onCompositionStart,\n onCompositionEnd,\n onPaste,\n id,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const textareaId = useId();\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n const composingRef = useRef(false);\n const slashMenuRef = useRef<HTMLDivElement | null>(null);\n\n const setRefs = useCallback((node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n }, []);\n\n const [currentValueRaw, setPromptValue] = useControllableState<string>({\n value: value === undefined ? undefined : String(value),\n defaultValue: String(defaultValue ?? ''),\n });\n const currentValue = currentValueRaw ?? '';\n\n const [attachments, setAttachments] = useState<AIPromptAttachment[]>([]);\n const [slashOpen, setSlashOpen] = useState(false);\n const [slashQuery, setSlashQuery] = useState('');\n\n const [currentModelRaw, setPromptModel] = useControllableState<string>({\n value: modelId,\n defaultValue: defaultModelId ?? models?.[0]?.id ?? '',\n onChange: onModelChange,\n });\n const currentModel = currentModelRaw ?? '';\n\n /* ── Auto-grow ── */\n const resize = useCallback(() => {\n const el = innerRef.current;\n if (!el) return;\n const styles = window.getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight) || 24;\n const padTop = parseFloat(styles.paddingTop) || 0;\n const padBot = parseFloat(styles.paddingBottom) || 0;\n const borderTop = parseFloat(styles.borderTopWidth) || 0;\n const borderBot = parseFloat(styles.borderBottomWidth) || 0;\n const chrome = padTop + padBot + borderTop + borderBot;\n const minH = lineHeight * minRows + chrome;\n const maxH = lineHeight * maxRows + chrome;\n el.style.height = 'auto';\n const next = Math.max(minH, Math.min(el.scrollHeight, maxH));\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > maxH ? 'auto' : 'hidden';\n }, [minRows, maxRows]);\n\n useIsomorphicLayoutEffect(() => {\n resize();\n }, [resize, currentValue]);\n\n /* ── Slash detection ── */\n const detectSlash = useCallback((text: string, caretPos: number) => {\n // Find the start of the current line.\n const before = text.slice(0, caretPos);\n const lineStart = before.lastIndexOf('\\n') + 1;\n const lineText = text.slice(lineStart, caretPos);\n if (lineText.startsWith('/')) {\n const afterSlash = lineText.slice(1);\n // Only open if the characters after '/' contain no whitespace.\n if (!/\\s/.test(afterSlash)) {\n setSlashOpen(true);\n setSlashQuery(afterSlash);\n return;\n }\n }\n setSlashOpen(false);\n setSlashQuery('');\n }, []);\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n setPromptValue(e.target.value);\n if (composingRef.current) return;\n onChange?.(e);\n const caret = e.target.selectionStart ?? e.target.value.length;\n detectSlash(e.target.value, caret);\n };\n\n const handleCompositionStart = (\n e: CompositionEvent<HTMLTextAreaElement>,\n ) => {\n composingRef.current = true;\n onCompositionStart?.(e);\n };\n const handleCompositionEnd = (e: CompositionEvent<HTMLTextAreaElement>) => {\n composingRef.current = false;\n onCompositionEnd?.(e);\n };\n\n const isIMEKey = (e: KeyboardEvent<HTMLTextAreaElement>) =>\n e.nativeEvent.isComposing || e.keyCode === 229 || composingRef.current;\n\n const handleSubmit = useCallback(() => {\n const text = currentValue.trim();\n if (!text && attachments.length === 0) return;\n // Extract any leading command token.\n let command: string | undefined;\n let body = currentValue;\n const m = currentValue.match(/^\\/(\\S+)\\s?/);\n if (m) {\n command = m[1];\n body = currentValue.slice(m[0].length);\n }\n onSubmit?.({\n text: body,\n command,\n attachments,\n modelId: currentModel || undefined,\n });\n setPromptValue('');\n setAttachments([]);\n }, [currentValue, attachments, onSubmit, currentModel, setPromptValue]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<AIPromptInputHandle>(\n () => ({\n getValue: () => currentValue,\n isEmpty: () => !currentValue.trim() && attachments.length === 0,\n isSubmitting: () => false,\n setValue: (next: string) => {\n setPromptValue(next);\n },\n clear: () => {\n setPromptValue('');\n setAttachments([]);\n },\n submit: () => {\n handleSubmit();\n },\n focus: () => {\n innerRef.current?.focus();\n },\n }),\n [currentValue, attachments, setPromptValue, handleSubmit],\n );\n useAgentRegistration(aiPromptInputAgent, agentHandle, id);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (isIMEKey(e)) return;\n\n // Slash menu open — Escape closes; ArrowDown/ArrowUp/Enter handled by cmdk.\n if (slashOpen) {\n if (e.key === 'Escape') {\n e.preventDefault();\n setSlashOpen(false);\n return;\n }\n }\n\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const insertCommand = (cmd: AIPromptCommand) => {\n const el = innerRef.current;\n if (!el) return;\n const caret = el.selectionStart ?? currentValue.length;\n const before = currentValue.slice(0, caret);\n const lineStart = before.lastIndexOf('\\n') + 1;\n // Extend past any non-whitespace characters that follow the caret so\n // we replace the ENTIRE slash token (\"/fi|xBug more\" → \"/fixBug more\"),\n // not just the part before the caret (which would garble the tail).\n let endOfSlashToken = caret;\n while (\n endOfSlashToken < currentValue.length &&\n !/\\s/.test(currentValue[endOfSlashToken])\n ) {\n endOfSlashToken += 1;\n }\n const afterSlash = currentValue.slice(endOfSlashToken);\n const nextValue =\n currentValue.slice(0, lineStart) + `/${cmd.id} ` + afterSlash;\n setPromptValue(nextValue);\n // External consumers mirror the same synthetic event pattern other\n // text inputs in the system use — the native `onChange` fires via React.\n setSlashOpen(false);\n setSlashQuery('');\n queueMicrotask(() => el.focus());\n };\n\n /* ── Clipboard paste: strip rich HTML to plaintext, hand files to onAttach ── */\n const handlePaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {\n onPaste?.(e);\n if (e.defaultPrevented) return;\n const { clipboardData } = e;\n if (!clipboardData) return;\n const files: File[] = [];\n for (let i = 0; i < clipboardData.items.length; i += 1) {\n const item = clipboardData.items[i];\n if (item.kind === 'file') {\n const f = item.getAsFile();\n if (f) files.push(f);\n }\n }\n if (files.length > 0) {\n e.preventDefault();\n acceptFiles(files);\n }\n };\n\n /* ── Dropzone ── */\n const acceptFiles = useCallback(\n (files: File[]) => {\n const next: AIPromptAttachment[] = [];\n for (const f of files) {\n if (typeof maxSize === 'number' && f.size > maxSize) {\n onAttachmentRejected?.(\n t('chat.attachment.rejected', { reason: 'size' }),\n );\n continue;\n }\n next.push({\n id: crypto.randomUUID?.() ?? `att-${Math.random()}`,\n file: f,\n });\n }\n if (next.length > 0) {\n setAttachments((prev) => [...prev, ...next]);\n onAttach?.(next.map((a) => a.file));\n }\n },\n [maxSize, onAttach, onAttachmentRejected, t],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop: acceptFiles,\n maxSize,\n accept,\n noClick: true,\n noKeyboard: true,\n });\n\n const removeAttachment = (id: string) => {\n setAttachments((prev) => prev.filter((a) => a.id !== id));\n };\n\n const effectiveId = id ?? textareaId;\n const labelId = `${effectiveId}-label`;\n const slashListId = `${effectiveId}-slash-list`;\n\n const modelOptions: SelectOption<string>[] =\n models?.map((m) => ({ value: m.id, label: m.label })) ?? [];\n\n return (\n <div\n ref={rootRef}\n {...getRootProps({\n className: [\n rootVariants({ size, className }),\n isDragActive\n ? 'ds:outline ds:outline-dashed ds:outline-[color:var(--primary)] ds:outline-offset-2 ds:bg-[color:var(--primary)]/5'\n : '',\n ].join(' '),\n })}\n aria-label={t('chat.attachmentZone')}\n data-component=\"ai-prompt-input\"\n data-component-id={id}\n >\n {/* Hidden file input owned by react-dropzone. The aria-label\n covers axe's `label` rule (the input is visually-hidden but\n still reachable programmatically). */}\n <input aria-label={t('chat.attachmentZone')} {...getInputProps()} />\n\n {context ? (\n <div className=\"ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)]\">\n {/* Native <button> — not a span with role=\"button\" — per\n 05-accessibility \"Interactive elements use the right tag\".\n Enter/Space dispatch naturally via the native button;\n Backspace/Delete also dismiss (pill convention). */}\n <button\n type=\"button\"\n aria-label={t('chat.contextActive', { name: context })}\n onClick={onContextDismiss}\n onKeyDown={(e) => {\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault();\n onContextDismiss?.();\n }\n }}\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:border ds:border-[color:var(--accent)]/30',\n 'ds:bg-[color:var(--accent)]/10 ds:text-[color:var(--foreground)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'type-body-sm',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n >\n {t('chat.contextActive', { name: context })}\n </button>\n </div>\n ) : null}\n\n <label id={labelId} htmlFor={effectiveId} className=\"ds:sr-only\">\n {t('chat.prompt')}\n </label>\n\n <div className=\"ds:relative\">\n {/* The textarea takes on a combobox role only while the slash\n popup is open. ARIA 1.2 permits `role=\"combobox\"` on a\n textarea — that's what makes `aria-expanded` / `aria-controls`\n valid here. When the popup is closed the textarea reverts to\n its plain implicit role so we don't add the aria attrs at all. */}\n <textarea\n ref={setRefs}\n id={effectiveId}\n rows={minRows}\n value={currentValue}\n disabled={disabled}\n placeholder={placeholder ?? t('chat.input.placeholder')}\n aria-labelledby={labelId}\n role={slashOpen ? 'combobox' : undefined}\n aria-controls={slashOpen ? slashListId : undefined}\n aria-expanded={slashOpen ? true : undefined}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n className={[\n 'ds:w-full ds:resize-none ds:bg-transparent ds:outline-none',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]',\n 'ds:placeholder:text-[color:var(--muted-foreground)]',\n 'ds:leading-[var(--line-height-base)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed',\n ].join(' ')}\n {...rest}\n />\n\n {slashOpen ? (\n <div\n ref={slashMenuRef}\n className={[\n 'ds:absolute ds:start-[var(--spacing-md)] ds:top-full ds:z-50',\n 'ds:mt-[var(--spacing-xs)]',\n 'ds:min-w-[240px] ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:bg-[color:var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:shadow-[var(--shadow-md)]',\n // Match the Dialog / DropdownMenu open pattern: fade + scale\n // in from 95%. Origin set to the block-start so the menu\n // appears to expand from the textarea it sits beneath.\n 'ds:origin-top ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:zoom-in-95',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n id={slashListId}\n >\n <Command label={t('chat.slashMenu.label')} loop>\n <Command.Input\n value={slashQuery}\n onValueChange={setSlashQuery}\n className=\"ds:sr-only\"\n />\n <Command.List className=\"ds:max-h-60 ds:overflow-y-auto ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n <Command.Empty className=\"type-body-sm ds:text-[color:var(--muted-foreground)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]\">\n {t('chat.slashMenu.empty')}\n </Command.Empty>\n {commands.map((cmd) => (\n <Command.Item\n key={cmd.id}\n value={cmd.id}\n onSelect={() => insertCommand(cmd)}\n className={[\n 'ds:flex ds:flex-col ds:gap-[2px]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-body-sm ds:cursor-pointer',\n 'ds:aria-selected:bg-muted/20',\n 'ds:data-[selected=true]:bg-muted/20',\n ].join(' ')}\n >\n <span className=\"ds:font-medium\">/{cmd.id}</span>\n {cmd.description ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {cmd.description}\n </span>\n ) : null}\n </Command.Item>\n ))}\n </Command.List>\n </Command>\n </div>\n ) : null}\n </div>\n\n {attachments.length > 0 ? (\n <div\n role=\"group\"\n aria-label={t('chat.attachmentZone')}\n className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]\"\n >\n {attachments.map((att) => (\n <AttachmentChip\n key={att.id}\n file={att.file}\n onRemove={() => removeAttachment(att.id)}\n />\n ))}\n </div>\n ) : null}\n\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n {models && models.length > 0 ? (\n <div className=\"ds:me-auto ds:min-w-[140px]\">\n <Select\n aria-label={t('chat.model.select')}\n options={modelOptions}\n value={currentModel || ''}\n onValueChange={(v) => {\n setPromptModel(v);\n }}\n size=\"sm\"\n />\n </div>\n ) : (\n <div className=\"ds:me-auto\" />\n )}\n <span className=\"ds:sr-only\">{t('chat.input.sendHint')}</span>\n <IconButton\n icon={<Send />}\n aria-label={t('chat.send')}\n intent=\"primary\"\n size=\"sm\"\n disabled={\n disabled || (!currentValue.trim() && attachments.length === 0)\n }\n onClick={handleSubmit}\n aria-keyshortcuts=\"Meta+Enter Control+Enter\"\n />\n </div>\n </div>\n );\n },\n);\n\nAIPromptInput.displayName = 'AIPromptInput';\n\n/* ------------------------------------------------------------------ */\n/* Attachment chip */\n/* ------------------------------------------------------------------ */\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction AttachmentChip({\n file,\n onRemove,\n}: {\n file: File;\n onRemove: () => void;\n}): ReactNode {\n const { t } = useTranslation();\n return (\n <span\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:bg-muted/30',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-meta',\n // Entrance when a file is attached via drop / paste / picker.\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-bottom-1',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n >\n <span className=\"ds:truncate ds:max-w-[16ch]\">{file.name}</span>\n <span className=\"ds:text-[color:var(--muted-foreground)] ds:tabular-nums\">\n {formatSize(file.size)}\n </span>\n <IconButton\n icon={<X />}\n aria-label={t('chat.attachment.remove', { name: file.name })}\n intent=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n />\n </span>\n );\n}\n"],"names":["aiPromptInputAgent","handle","args","rootVariants","cva","AIPromptInput","forwardRef","commands","models","defaultModelId","modelId","onModelChange","maxSize","accept","context","onContextDismiss","onSubmit","onAttach","onAttachmentRejected","minRows","maxRows","value","defaultValue","size","disabled","className","placeholder","onChange","onKeyDown","onCompositionStart","onCompositionEnd","onPaste","id","rest","ref","t","useTranslation","textareaId","useId","innerRef","useRef","composingRef","slashMenuRef","setRefs","useCallback","node","currentValueRaw","setPromptValue","useControllableState","currentValue","attachments","setAttachments","useState","slashOpen","setSlashOpen","slashQuery","setSlashQuery","currentModelRaw","setPromptModel","_a","currentModel","resize","el","styles","lineHeight","padTop","padBot","borderTop","borderBot","chrome","minH","maxH","next","useIsomorphicLayoutEffect","detectSlash","text","caretPos","lineStart","lineText","afterSlash","handleChange","caret","handleCompositionStart","handleCompositionEnd","isIMEKey","handleSubmit","command","body","m","rootRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","handleKeyDown","insertCommand","cmd","endOfSlashToken","nextValue","handlePaste","clipboardData","files","i","item","f","acceptFiles","prev","a","getRootProps","getInputProps","isDragActive","useDropzone","removeAttachment","effectiveId","labelId","slashListId","modelOptions","jsxs","jsx","Command","att","AttachmentChip","Select","v","IconButton","Send","formatSize","bytes","file","onRemove","X"],"mappings":"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"}
@@ -3,16 +3,16 @@ import { useId as Se, forwardRef as O, useState as L, useMemo as G, useCallback
3
3
  import * as Te from "@radix-ui/react-dialog";
4
4
  import { useTranslation as x } from "react-i18next";
5
5
  import { F as Ee } from "./floating-action-button-pojvb9gG.js";
6
- import { I as w } from "./icon-button-LqoiKcUN.js";
7
- import { S as Z } from "./sheet-B_X54aZo.js";
6
+ import { I as w } from "./icon-button-C_kbcd7I.js";
7
+ import { S as Z } from "./sheet-D5K0LB3q.js";
8
8
  import { X as te } from "./x-B5YnXwCz.js";
9
9
  import { A as _e } from "./astroid-BN4f5VXU.js";
10
10
  import { A as $ } from "./avatar-BNQNhoyL.js";
11
- import { B as S } from "./button-DD_0Xdmr.js";
12
- import { C as Re } from "./chat-container-BVCoN06N.js";
13
- import { C as Pe } from "./chat-message-DXjjM8z9.js";
14
- import { C as ne, P as Be } from "./chat-input-Btq_uuMZ.js";
15
- import { S as Ue } from "./streaming-text-Cedc05ya.js";
11
+ import { B as S } from "./button-CPGiR_bH.js";
12
+ import { C as Re } from "./chat-container-HlFnoEIl.js";
13
+ import { C as Pe } from "./chat-message-CdjWqZjo.js";
14
+ import { C as ne, P as Be } from "./chat-input-BTCDqUDX.js";
15
+ import { S as Ue } from "./streaming-text-C5bYz7LL.js";
16
16
  import { a as le, S as oe } from "./suggestion-chip-Bk4PmYTg.js";
17
17
  import { T as Oe } from "./typing-indicator-DHeVN4ob.js";
18
18
  import { P as $e } from "./progress-DA413-zn.js";
@@ -1180,4 +1180,4 @@ export {
1180
1180
  hs as b,
1181
1181
  xs as c
1182
1182
  };
1183
- //# sourceMappingURL=alia-sidebar-BV5lBSFR.js.map
1183
+ //# sourceMappingURL=alia-sidebar-w6B0TEx7.js.map