@alfadocs/ui-kit-debug 1.96.0 → 1.97.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 (303) hide show
  1. package/dist/_chunks/{address-autocomplete-DR4Xn23Z.js → address-autocomplete-DC-H-MZw.js} +2 -2
  2. package/dist/_chunks/{address-autocomplete-DR4Xn23Z.js.map → address-autocomplete-DC-H-MZw.js.map} +1 -1
  3. package/dist/_chunks/{address-fields-qxQkGwPf.js → address-fields-D5Ije0S2.js} +7 -7
  4. package/dist/_chunks/{address-fields-qxQkGwPf.js.map → address-fields-D5Ije0S2.js.map} +1 -1
  5. package/dist/_chunks/{agenda-card-BhY342MA.js → agenda-card-bRQ4j6U6.js} +2 -2
  6. package/dist/_chunks/{agenda-card-BhY342MA.js.map → agenda-card-bRQ4j6U6.js.map} +1 -1
  7. package/dist/_chunks/{agenda-tray-BmxBGEci.js → agenda-tray-CzE3E8GU.js} +2 -2
  8. package/dist/_chunks/{agenda-tray-BmxBGEci.js.map → agenda-tray-CzE3E8GU.js.map} +1 -1
  9. package/dist/_chunks/{alia-sidebar-ovRX_oti.js → alia-sidebar-B5mu44g2.js} +3 -3
  10. package/dist/_chunks/{alia-sidebar-ovRX_oti.js.map → alia-sidebar-B5mu44g2.js.map} +1 -1
  11. package/dist/_chunks/{anamnesis-summary-rows-CdRUXoaA.js → anamnesis-summary-rows-B9HqOGd7.js} +4 -4
  12. package/dist/_chunks/{anamnesis-summary-rows-CdRUXoaA.js.map → anamnesis-summary-rows-B9HqOGd7.js.map} +1 -1
  13. package/dist/_chunks/{appointment-card-Csx4544A.js → appointment-card-zPr0brha.js} +3 -3
  14. package/dist/_chunks/{appointment-card-Csx4544A.js.map → appointment-card-zPr0brha.js.map} +1 -1
  15. package/dist/_chunks/{appointment-peek-CcDCWb-F.js → appointment-peek-xFTBany4.js} +3 -3
  16. package/dist/_chunks/{appointment-peek-CcDCWb-F.js.map → appointment-peek-xFTBany4.js.map} +1 -1
  17. package/dist/_chunks/{appointment-timeline-DW6FN6u8.js → appointment-timeline-AKkVx9AN.js} +2 -2
  18. package/dist/_chunks/{appointment-timeline-DW6FN6u8.js.map → appointment-timeline-AKkVx9AN.js.map} +1 -1
  19. package/dist/_chunks/{appointment-tray-CZfXwHWz.js → appointment-tray-B8qQBW65.js} +2 -2
  20. package/dist/_chunks/{appointment-tray-CZfXwHWz.js.map → appointment-tray-B8qQBW65.js.map} +1 -1
  21. package/dist/_chunks/{aspect-ratio-DeSNzASA.js → aspect-ratio-B-6cyOpm.js} +13 -13
  22. package/dist/_chunks/aspect-ratio-B-6cyOpm.js.map +1 -0
  23. package/dist/_chunks/{autocomplete-BXMcNoa3.js → autocomplete-D10ydpgi.js} +2 -2
  24. package/dist/_chunks/{autocomplete-BXMcNoa3.js.map → autocomplete-D10ydpgi.js.map} +1 -1
  25. package/dist/_chunks/{avatar-a6042Ox2.js → avatar-BoqdWsNe.js} +2 -2
  26. package/dist/_chunks/avatar-BoqdWsNe.js.map +1 -0
  27. package/dist/_chunks/{balance-badge-cell-DcBmtijD.js → balance-badge-cell-DaZokVZY.js} +3 -3
  28. package/dist/_chunks/{balance-badge-cell-DcBmtijD.js.map → balance-badge-cell-DaZokVZY.js.map} +1 -1
  29. package/dist/_chunks/{breadcrumb-Bn29NCnf.js → breadcrumb-zxa_PNhF.js} +2 -2
  30. package/dist/_chunks/breadcrumb-zxa_PNhF.js.map +1 -0
  31. package/dist/_chunks/{calendar-CmiMS4FJ.js → calendar-DVe5eArk.js} +2 -2
  32. package/dist/_chunks/{calendar-CmiMS4FJ.js.map → calendar-DVe5eArk.js.map} +1 -1
  33. package/dist/_chunks/{calendar-appointment-editor-dialog-BOZ5wk96.js → calendar-appointment-editor-dialog-26LEMx0q.js} +12 -12
  34. package/dist/_chunks/{calendar-appointment-editor-dialog-BOZ5wk96.js.map → calendar-appointment-editor-dialog-26LEMx0q.js.map} +1 -1
  35. package/dist/_chunks/{chat-message-LRO_6Ee3.js → chat-message-CkBCAcwn.js} +2 -2
  36. package/dist/_chunks/{chat-message-LRO_6Ee3.js.map → chat-message-CkBCAcwn.js.map} +1 -1
  37. package/dist/_chunks/{city-input-CA59CjnV.js → city-input-DXipzTfZ.js} +3 -3
  38. package/dist/_chunks/{city-input-CA59CjnV.js.map → city-input-DXipzTfZ.js.map} +1 -1
  39. package/dist/_chunks/{clinical-note-card-CWHFnCmY.js → clinical-note-card--juv_ELr.js} +2 -2
  40. package/dist/_chunks/{clinical-note-card-CWHFnCmY.js.map → clinical-note-card--juv_ELr.js.map} +1 -1
  41. package/dist/_chunks/{combobox-D-gpgEDy.js → combobox-duuDRI1t.js} +2 -2
  42. package/dist/_chunks/{combobox-D-gpgEDy.js.map → combobox-duuDRI1t.js.map} +1 -1
  43. package/dist/_chunks/{command-palette-B3dVqm9D.js → command-palette-DxQBU4wH.js} +3 -3
  44. package/dist/_chunks/command-palette-DxQBU4wH.js.map +1 -0
  45. package/dist/_chunks/{contact-profile-card-jBf9U4At.js → contact-profile-card-QPUgGu-t.js} +57 -57
  46. package/dist/_chunks/contact-profile-card-QPUgGu-t.js.map +1 -0
  47. package/dist/_chunks/{copy-field-hgVSc51W.js → copy-field-BaYEDJ9f.js} +24 -24
  48. package/dist/_chunks/copy-field-BaYEDJ9f.js.map +1 -0
  49. package/dist/_chunks/{country-select-BfmX9y5i.js → country-select-CUuGOAoZ.js} +2 -2
  50. package/dist/_chunks/{country-select-BfmX9y5i.js.map → country-select-CUuGOAoZ.js.map} +1 -1
  51. package/dist/_chunks/{data-table-xUDjZS_O.js → data-table-C4UT4L9B.js} +3 -3
  52. package/dist/_chunks/{data-table-xUDjZS_O.js.map → data-table-C4UT4L9B.js.map} +1 -1
  53. package/dist/_chunks/{data-table-tabs-CcgU2lr5.js → data-table-tabs-Db7zToFD.js} +2 -2
  54. package/dist/_chunks/{data-table-tabs-CcgU2lr5.js.map → data-table-tabs-Db7zToFD.js.map} +1 -1
  55. package/dist/_chunks/{dependent-selector-CyNi7M_f.js → dependent-selector-DRN0P0Kr.js} +2 -2
  56. package/dist/_chunks/{dependent-selector-CyNi7M_f.js.map → dependent-selector-DRN0P0Kr.js.map} +1 -1
  57. package/dist/_chunks/{document-preview-DWIQryMW.js → document-preview-U8H6tnDJ.js} +2 -2
  58. package/dist/_chunks/{document-preview-DWIQryMW.js.map → document-preview-U8H6tnDJ.js.map} +1 -1
  59. package/dist/_chunks/{document-scanner-BQP0Rqrt.js → document-scanner-Bf3VUp00.js} +24 -24
  60. package/dist/_chunks/document-scanner-Bf3VUp00.js.map +1 -0
  61. package/dist/_chunks/{editable-currency-cell-renderer-BEaj2NT_.js → editable-currency-cell-renderer-BUdFMh67.js} +2 -2
  62. package/dist/_chunks/{editable-currency-cell-renderer-BEaj2NT_.js.map → editable-currency-cell-renderer-BUdFMh67.js.map} +1 -1
  63. package/dist/_chunks/{email-input-C7THAwh2.js → email-input-BEO3vonE.js} +2 -2
  64. package/dist/_chunks/{email-input-C7THAwh2.js.map → email-input-BEO3vonE.js.map} +1 -1
  65. package/dist/_chunks/{entity-summary-BJdfIsk_.js → entity-summary-B4p8zP1J.js} +2 -2
  66. package/dist/_chunks/{entity-summary-BJdfIsk_.js.map → entity-summary-B4p8zP1J.js.map} +1 -1
  67. package/dist/_chunks/{face-scheme-BmygzbZr.js → face-scheme-DdVLQ5dP.js} +3 -3
  68. package/dist/_chunks/{face-scheme-BmygzbZr.js.map → face-scheme-DdVLQ5dP.js.map} +1 -1
  69. package/dist/_chunks/{file-manager-Ba_TcfCj.js → file-manager-B4K2j7jB.js} +4 -4
  70. package/dist/_chunks/{file-manager-Ba_TcfCj.js.map → file-manager-B4K2j7jB.js.map} +1 -1
  71. package/dist/_chunks/{fiscal-code-input-BzWmNDnl.js → fiscal-code-input-BBvU7sAo.js} +2 -2
  72. package/dist/_chunks/{fiscal-code-input-BzWmNDnl.js.map → fiscal-code-input-BBvU7sAo.js.map} +1 -1
  73. package/dist/_chunks/{forgot-password-form-BCk4rGIh.js → forgot-password-form-CeTb5p-x.js} +2 -2
  74. package/dist/_chunks/{forgot-password-form-BCk4rGIh.js.map → forgot-password-form-CeTb5p-x.js.map} +1 -1
  75. package/dist/_chunks/{header-settings-C2D74i4g.js → header-settings-Df9q1uHt.js} +2 -2
  76. package/dist/_chunks/{header-settings-C2D74i4g.js.map → header-settings-Df9q1uHt.js.map} +1 -1
  77. package/dist/_chunks/{heatmap-C9tEvqEm.js → heatmap-B2Z1_kDn.js} +2 -2
  78. package/dist/_chunks/{heatmap-C9tEvqEm.js.map → heatmap-B2Z1_kDn.js.map} +1 -1
  79. package/dist/_chunks/{help-me-write-templates-BJSf24xS.js → help-me-write-templates-ra5a__Yy.js} +2 -2
  80. package/dist/_chunks/{help-me-write-templates-BJSf24xS.js.map → help-me-write-templates-ra5a__Yy.js.map} +1 -1
  81. package/dist/_chunks/{iban-input-B9L2QDHh.js → iban-input-DuTwKok5.js} +2 -2
  82. package/dist/_chunks/{iban-input-B9L2QDHh.js.map → iban-input-DuTwKok5.js.map} +1 -1
  83. package/dist/_chunks/{icon-picker-DQMG9L6M.js → icon-picker-BmU6gpZT.js} +2 -2
  84. package/dist/_chunks/{icon-picker-DQMG9L6M.js.map → icon-picker-BmU6gpZT.js.map} +1 -1
  85. package/dist/_chunks/{input-surface-iBmxVBfr.js → input-surface-BMffm2Vd.js} +4 -4
  86. package/dist/_chunks/{input-surface-iBmxVBfr.js.map → input-surface-BMffm2Vd.js.map} +1 -1
  87. package/dist/_chunks/{link-cell-renderer-OmvrkUeN.js → link-cell-renderer-DKMgD-2v.js} +4 -4
  88. package/dist/_chunks/{link-cell-renderer-OmvrkUeN.js.map → link-cell-renderer-DKMgD-2v.js.map} +1 -1
  89. package/dist/_chunks/{locale-picker-B1NAHW4U.js → locale-picker-C86h8Yt1.js} +2 -2
  90. package/dist/_chunks/{locale-picker-B1NAHW4U.js.map → locale-picker-C86h8Yt1.js.map} +1 -1
  91. package/dist/_chunks/{login-dev-card-DcfcFJrm.js → login-dev-card-D5BV5j1i.js} +4 -4
  92. package/dist/_chunks/{login-dev-card-DcfcFJrm.js.map → login-dev-card-D5BV5j1i.js.map} +1 -1
  93. package/dist/_chunks/{map-view--c9bJDRw.js → map-view-V7etHnyF.js} +2 -2
  94. package/dist/_chunks/map-view-V7etHnyF.js.map +1 -0
  95. package/dist/_chunks/{marketplace-app-shell-DDZI-uBl.js → marketplace-app-shell-D2qgIuXX.js} +4 -4
  96. package/dist/_chunks/{marketplace-app-shell-DDZI-uBl.js.map → marketplace-app-shell-D2qgIuXX.js.map} +1 -1
  97. package/dist/_chunks/{message-card-B6SduXJv.js → message-card-BzJEITml.js} +2 -2
  98. package/dist/_chunks/{message-card-B6SduXJv.js.map → message-card-BzJEITml.js.map} +1 -1
  99. package/dist/_chunks/{message-tray-18_TrLCy.js → message-tray-DiPgJbOb.js} +2 -2
  100. package/dist/_chunks/{message-tray-18_TrLCy.js.map → message-tray-DiPgJbOb.js.map} +1 -1
  101. package/dist/_chunks/{multi-select-i5MFRpXg.js → multi-select-Df3R8lv_.js} +30 -30
  102. package/dist/_chunks/multi-select-Df3R8lv_.js.map +1 -0
  103. package/dist/_chunks/{navigation-menu-DbaSlvdO.js → navigation-menu-1MrpIVkY.js} +3 -3
  104. package/dist/_chunks/navigation-menu-1MrpIVkY.js.map +1 -0
  105. package/dist/_chunks/{notes-panel-DfjF83IK.js → notes-panel-BbNLYcdv.js} +3 -3
  106. package/dist/_chunks/{notes-panel-DfjF83IK.js.map → notes-panel-BbNLYcdv.js.map} +1 -1
  107. package/dist/_chunks/{operator-hero-N_ziNGFF.js → operator-hero-BcuPTzS_.js} +2 -2
  108. package/dist/_chunks/{operator-hero-N_ziNGFF.js.map → operator-hero-BcuPTzS_.js.map} +1 -1
  109. package/dist/_chunks/{pagination-DvKGrsXu.js → pagination-C7N_NiRN.js} +2 -2
  110. package/dist/_chunks/{pagination-DvKGrsXu.js.map → pagination-C7N_NiRN.js.map} +1 -1
  111. package/dist/_chunks/{password-input-BokZ_rnT.js → password-input-SJGHFdOO.js} +2 -2
  112. package/dist/_chunks/{password-input-BokZ_rnT.js.map → password-input-SJGHFdOO.js.map} +1 -1
  113. package/dist/_chunks/{patient-details-DGHkAErB.js → patient-details-DoIOWP6j.js} +3 -3
  114. package/dist/_chunks/{patient-details-DGHkAErB.js.map → patient-details-DoIOWP6j.js.map} +1 -1
  115. package/dist/_chunks/{patient-field-row-BVK4y98C.js → patient-field-row--dCDO5oB.js} +9 -9
  116. package/dist/_chunks/{patient-field-row-BVK4y98C.js.map → patient-field-row--dCDO5oB.js.map} +1 -1
  117. package/dist/_chunks/{patient-search-CL6dtBIq.js → patient-search-DJy0IZSx.js} +2 -2
  118. package/dist/_chunks/{patient-search-CL6dtBIq.js.map → patient-search-DJy0IZSx.js.map} +1 -1
  119. package/dist/_chunks/{patient-summary-card-DXz07c2X.js → patient-summary-card-CL04aq8h.js} +3 -3
  120. package/dist/_chunks/{patient-summary-card-DXz07c2X.js.map → patient-summary-card-CL04aq8h.js.map} +1 -1
  121. package/dist/_chunks/{payment-automation-upsell-CZk6f8aK.js → payment-automation-upsell-BPF0c-5D.js} +2 -2
  122. package/dist/_chunks/{payment-automation-upsell-CZk6f8aK.js.map → payment-automation-upsell-BPF0c-5D.js.map} +1 -1
  123. package/dist/_chunks/{pdf-viewer-gAsNUsA8.js → pdf-viewer-DlceXkfW.js} +267 -286
  124. package/dist/_chunks/pdf-viewer-DlceXkfW.js.map +1 -0
  125. package/dist/_chunks/{phone-input-DJ4BN8tG.js → phone-input-BL8Sj6OG.js} +3 -3
  126. package/dist/_chunks/phone-input-BL8Sj6OG.js.map +1 -0
  127. package/dist/_chunks/{postal-code-input-CfZOnIkW.js → postal-code-input-dJdSAVkP.js} +2 -2
  128. package/dist/_chunks/{postal-code-input-CfZOnIkW.js.map → postal-code-input-dJdSAVkP.js.map} +1 -1
  129. package/dist/_chunks/{practice-profile-hero-DKmnB-M0.js → practice-profile-hero-B8vykoci.js} +2 -2
  130. package/dist/_chunks/{practice-profile-hero-DKmnB-M0.js.map → practice-profile-hero-B8vykoci.js.map} +1 -1
  131. package/dist/_chunks/{practice-results-ZOVlrb43.js → practice-results-U-5kpnJa.js} +3 -3
  132. package/dist/_chunks/{practice-results-ZOVlrb43.js.map → practice-results-U-5kpnJa.js.map} +1 -1
  133. package/dist/_chunks/{province-select-D64whw0m.js → province-select-cVOlwEc5.js} +2 -2
  134. package/dist/_chunks/{province-select-D64whw0m.js.map → province-select-cVOlwEc5.js.map} +1 -1
  135. package/dist/_chunks/{public-footer-BiPiU_lk.js → public-footer-t6gx6sjn.js} +163 -152
  136. package/dist/_chunks/public-footer-t6gx6sjn.js.map +1 -0
  137. package/dist/_chunks/{registration-form-K4j2tdLt.js → registration-form-JzzTomhd.js} +5 -5
  138. package/dist/_chunks/{registration-form-K4j2tdLt.js.map → registration-form-JzzTomhd.js.map} +1 -1
  139. package/dist/_chunks/{reserved.agent-TRbKB39d.js → reserved.agent-CB-92Vi9.js} +8 -8
  140. package/dist/_chunks/{reserved.agent-TRbKB39d.js.map → reserved.agent-CB-92Vi9.js.map} +1 -1
  141. package/dist/_chunks/{reset-password-form-C6XLV7SI.js → reset-password-form-DDdGEoIL.js} +3 -3
  142. package/dist/_chunks/{reset-password-form-C6XLV7SI.js.map → reset-password-form-DDdGEoIL.js.map} +1 -1
  143. package/dist/_chunks/{rich-text-editor-CJfT08It.js → rich-text-editor-F04przIt.js} +2 -2
  144. package/dist/_chunks/{rich-text-editor-CJfT08It.js.map → rich-text-editor-F04przIt.js.map} +1 -1
  145. package/dist/_chunks/{search-bar-mA4bPe3t.js → search-bar-CQ9_V3EJ.js} +2 -2
  146. package/dist/_chunks/{search-bar-mA4bPe3t.js.map → search-bar-CQ9_V3EJ.js.map} +1 -1
  147. package/dist/_chunks/{search-input-BAlDd05M.js → search-input-CRAMo1CA.js} +2 -2
  148. package/dist/_chunks/{search-input-BAlDd05M.js.map → search-input-CRAMo1CA.js.map} +1 -1
  149. package/dist/_chunks/{send-registration-link-form-yLSfcaPk.js → send-registration-link-form-DHCQpA4C.js} +3 -3
  150. package/dist/_chunks/{send-registration-link-form-yLSfcaPk.js.map → send-registration-link-form-DHCQpA4C.js.map} +1 -1
  151. package/dist/_chunks/{sidebar-BS24EnYd.js → sidebar-2VsPlNkZ.js} +3 -3
  152. package/dist/_chunks/sidebar-2VsPlNkZ.js.map +1 -0
  153. package/dist/_chunks/{sign-document-BiOTs1P4.js → sign-document-B5qZhthO.js} +10 -10
  154. package/dist/_chunks/sign-document-B5qZhthO.js.map +1 -0
  155. package/dist/_chunks/{signature-capture-Chqh62Pc.js → signature-capture-BJc7kfqi.js} +2 -2
  156. package/dist/_chunks/signature-capture-BJc7kfqi.js.map +1 -0
  157. package/dist/_chunks/{signature-field-Y01UB5DA.js → signature-field-DjabvRZm.js} +28 -34
  158. package/dist/_chunks/{signature-field-Y01UB5DA.js.map → signature-field-DjabvRZm.js.map} +1 -1
  159. package/dist/_chunks/{signature-request-CLtMgQKi.js → signature-request-CQ0torGq.js} +2 -2
  160. package/dist/_chunks/{signature-request-CLtMgQKi.js.map → signature-request-CQ0torGq.js.map} +1 -1
  161. package/dist/_chunks/{signed-out-frame-CRwVTCjY.js → signed-out-frame-BcQE00H1.js} +2 -2
  162. package/dist/_chunks/{signed-out-frame-CRwVTCjY.js.map → signed-out-frame-BcQE00H1.js.map} +1 -1
  163. package/dist/_chunks/{stat-Dno2ZihS.js → stat-BFKZV50y.js} +137 -117
  164. package/dist/_chunks/stat-BFKZV50y.js.map +1 -0
  165. package/dist/_chunks/{state-backed-text-input-Cgh4ms3p.js → state-backed-text-input-DVETOhSS.js} +2 -2
  166. package/dist/_chunks/{state-backed-text-input-Cgh4ms3p.js.map → state-backed-text-input-DVETOhSS.js.map} +1 -1
  167. package/dist/_chunks/{stepper-accordion-DDTSOUHc.js → stepper-accordion-CYjrmRte.js} +44 -44
  168. package/dist/_chunks/stepper-accordion-CYjrmRte.js.map +1 -0
  169. package/dist/_chunks/{task-editor-qXfMbHsy.js → task-editor-BiPGFXtB.js} +3 -3
  170. package/dist/_chunks/{task-editor-qXfMbHsy.js.map → task-editor-BiPGFXtB.js.map} +1 -1
  171. package/dist/_chunks/{text-input-CaG9ApoE.js → text-input-B6iAgCr3.js} +2 -2
  172. package/dist/_chunks/{text-input-CaG9ApoE.js.map → text-input-B6iAgCr3.js.map} +1 -1
  173. package/dist/_chunks/{timeline-B32dylRJ.js → timeline-tn5QQJdS.js} +2 -2
  174. package/dist/_chunks/{timeline-B32dylRJ.js.map → timeline-tn5QQJdS.js.map} +1 -1
  175. package/dist/_chunks/{transcript-panel-CoHHpcFg.js → transcript-panel-A781Pkzr.js} +2 -2
  176. package/dist/_chunks/{transcript-panel-CoHHpcFg.js.map → transcript-panel-A781Pkzr.js.map} +1 -1
  177. package/dist/_chunks/{use-appointment-details-read-UXXvBeGZ.js → use-appointment-details-read-BbIoPWO6.js} +5 -5
  178. package/dist/_chunks/{use-appointment-details-read-UXXvBeGZ.js.map → use-appointment-details-read-BbIoPWO6.js.map} +1 -1
  179. package/dist/_chunks/{widget-picker-B9HpT2Tb.js → widget-picker-DNYIqRT1.js} +2 -2
  180. package/dist/_chunks/{widget-picker-B9HpT2Tb.js.map → widget-picker-DNYIqRT1.js.map} +1 -1
  181. package/dist/_chunks/{workflow-map-flsvqQ3L.js → workflow-map-k-dQkpe7.js} +20 -20
  182. package/dist/_chunks/{workflow-map-flsvqQ3L.js.map → workflow-map-k-dQkpe7.js.map} +1 -1
  183. package/dist/_chunks/{workflow-status-HQ6ziE46.js → workflow-status-9wb7iWUd.js} +2 -2
  184. package/dist/_chunks/{workflow-status-HQ6ziE46.js.map → workflow-status-9wb7iWUd.js.map} +1 -1
  185. package/dist/_chunks/{workflow-webhook-action-BD-6UyOs.js → workflow-webhook-action-B_52rH7O.js} +3 -3
  186. package/dist/_chunks/{workflow-webhook-action-BD-6UyOs.js.map → workflow-webhook-action-B_52rH7O.js.map} +1 -1
  187. package/dist/agent-catalog.json +1 -1
  188. package/dist/components/_shared/input-surface.d.ts +3 -3
  189. package/dist/components/address-autocomplete/index.js +1 -1
  190. package/dist/components/address-fields/index.js +1 -1
  191. package/dist/components/agenda-card/index.js +1 -1
  192. package/dist/components/agenda-tray/index.js +1 -1
  193. package/dist/components/appointment-card/index.js +2 -2
  194. package/dist/components/appointment-details-panel/index.js +1 -1
  195. package/dist/components/appointment-peek/index.js +1 -1
  196. package/dist/components/appointment-timeline/index.js +1 -1
  197. package/dist/components/aspect-ratio/index.js +1 -1
  198. package/dist/components/autocomplete/index.js +1 -1
  199. package/dist/components/avatar/index.js +1 -1
  200. package/dist/components/booking/index.js +1 -1
  201. package/dist/components/breadcrumb/index.js +1 -1
  202. package/dist/components/calendar/index.js +1 -1
  203. package/dist/components/chat-message/index.js +1 -1
  204. package/dist/components/city-input/index.js +1 -1
  205. package/dist/components/clinical-note-card/index.js +1 -1
  206. package/dist/components/combobox/index.js +1 -1
  207. package/dist/components/command-palette/index.js +1 -1
  208. package/dist/components/contact-profile-card/index.js +1 -1
  209. package/dist/components/copy-field/index.js +1 -1
  210. package/dist/components/country-select/index.js +1 -1
  211. package/dist/components/data-table/index.js +3 -3
  212. package/dist/components/data-table-tabs/index.js +1 -1
  213. package/dist/components/dependent-selector/index.js +1 -1
  214. package/dist/components/document-preview/index.js +1 -1
  215. package/dist/components/document-scanner/index.js +1 -1
  216. package/dist/components/email-input/index.js +1 -1
  217. package/dist/components/entity-summary/index.js +1 -1
  218. package/dist/components/face-scheme/index.js +1 -1
  219. package/dist/components/file-manager/index.js +1 -1
  220. package/dist/components/fiscal-code-input/index.js +1 -1
  221. package/dist/components/header-settings/index.js +1 -1
  222. package/dist/components/heatmap/index.js +1 -1
  223. package/dist/components/iban-input/index.js +1 -1
  224. package/dist/components/icon-picker/index.js +1 -1
  225. package/dist/components/locale-picker/index.js +1 -1
  226. package/dist/components/map-view/index.js +1 -1
  227. package/dist/components/message-card/index.js +1 -1
  228. package/dist/components/message-tray/index.js +1 -1
  229. package/dist/components/multi-select/index.js +1 -1
  230. package/dist/components/navigation-menu/index.js +1 -1
  231. package/dist/components/notes-panel/index.js +1 -1
  232. package/dist/components/operator-hero/index.js +1 -1
  233. package/dist/components/pagination/index.js +1 -1
  234. package/dist/components/password-input/index.js +1 -1
  235. package/dist/components/patient-details/index.js +1 -1
  236. package/dist/components/patient-search/index.js +1 -1
  237. package/dist/components/patient-summary-card/index.js +1 -1
  238. package/dist/components/patient-table/index.js +1 -1
  239. package/dist/components/pdf-viewer/index.js +1 -1
  240. package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
  241. package/dist/components/phone-input/index.js +1 -1
  242. package/dist/components/postal-code-input/index.js +1 -1
  243. package/dist/components/practice-profile-hero/index.js +1 -1
  244. package/dist/components/practice-results/index.js +1 -1
  245. package/dist/components/province-select/index.js +1 -1
  246. package/dist/components/public-footer/index.js +1 -1
  247. package/dist/components/public-footer/public-footer.d.ts.map +1 -1
  248. package/dist/components/rich-text-editor/index.js +1 -1
  249. package/dist/components/search-bar/index.js +1 -1
  250. package/dist/components/search-input/index.js +1 -1
  251. package/dist/components/sidebar/index.js +1 -1
  252. package/dist/components/sign-document/index.js +1 -1
  253. package/dist/components/signature-capture/index.js +1 -1
  254. package/dist/components/signature-field/index.js +1 -1
  255. package/dist/components/signature-field/signature-field.d.ts.map +1 -1
  256. package/dist/components/stat/index.js +1 -1
  257. package/dist/components/stat/stat.d.ts +8 -0
  258. package/dist/components/stat/stat.d.ts.map +1 -1
  259. package/dist/components/stepper-accordion/index.js +1 -1
  260. package/dist/components/task-editor/index.js +1 -1
  261. package/dist/components/text-input/index.js +1 -1
  262. package/dist/components/timeline/index.js +1 -1
  263. package/dist/components/transcript-panel/index.js +1 -1
  264. package/dist/components/widget-picker/index.js +1 -1
  265. package/dist/components/workflow/index.js +1 -1
  266. package/dist/components/workflow-status/index.js +1 -1
  267. package/dist/core.css +1 -1
  268. package/dist/host-compat.css +13 -1
  269. package/dist/index.js +88 -88
  270. package/dist/patterns/alia-assistant/index.js +1 -1
  271. package/dist/patterns/anamnesis/index.js +1 -1
  272. package/dist/patterns/calendar/index.js +1 -1
  273. package/dist/patterns/forgot-password-form/index.js +1 -1
  274. package/dist/patterns/help-me-write-templates/index.js +1 -1
  275. package/dist/patterns/login-form/index.js +1 -1
  276. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  277. package/dist/patterns/payment-automation-upsell/index.js +1 -1
  278. package/dist/patterns/registration-form/index.js +1 -1
  279. package/dist/patterns/reset-password-form/index.js +1 -1
  280. package/dist/patterns/send-registration-link-form/index.js +1 -1
  281. package/dist/patterns/signature-request/index.js +1 -1
  282. package/dist/patterns/signed-out-frame/index.js +1 -1
  283. package/dist/patterns/workflow-webhook-action/index.js +1 -1
  284. package/dist/tokens.css +1 -1
  285. package/package.json +1 -1
  286. package/dist/_chunks/aspect-ratio-DeSNzASA.js.map +0 -1
  287. package/dist/_chunks/avatar-a6042Ox2.js.map +0 -1
  288. package/dist/_chunks/breadcrumb-Bn29NCnf.js.map +0 -1
  289. package/dist/_chunks/command-palette-B3dVqm9D.js.map +0 -1
  290. package/dist/_chunks/contact-profile-card-jBf9U4At.js.map +0 -1
  291. package/dist/_chunks/copy-field-hgVSc51W.js.map +0 -1
  292. package/dist/_chunks/document-scanner-BQP0Rqrt.js.map +0 -1
  293. package/dist/_chunks/map-view--c9bJDRw.js.map +0 -1
  294. package/dist/_chunks/multi-select-i5MFRpXg.js.map +0 -1
  295. package/dist/_chunks/navigation-menu-DbaSlvdO.js.map +0 -1
  296. package/dist/_chunks/pdf-viewer-gAsNUsA8.js.map +0 -1
  297. package/dist/_chunks/phone-input-DJ4BN8tG.js.map +0 -1
  298. package/dist/_chunks/public-footer-BiPiU_lk.js.map +0 -1
  299. package/dist/_chunks/sidebar-BS24EnYd.js.map +0 -1
  300. package/dist/_chunks/sign-document-BiOTs1P4.js.map +0 -1
  301. package/dist/_chunks/signature-capture-Chqh62Pc.js.map +0 -1
  302. package/dist/_chunks/stat-Dno2ZihS.js.map +0 -1
  303. package/dist/_chunks/stepper-accordion-DDTSOUHc.js.map +0 -1
@@ -12,7 +12,7 @@ import { E as pe } from "./empty-state-DwJ5YNzz.js";
12
12
  import { F as X } from "./form-field-CyHfOVKF.js";
13
13
  import { S as ue } from "./spinner-CoflYlEx.js";
14
14
  import { T as se } from "./text-area-COMVJ1yE.js";
15
- import { S as re } from "./state-backed-text-input-Cgh4ms3p.js";
15
+ import { S as re } from "./state-backed-text-input-DVETOhSS.js";
16
16
  import { SafeHtml as fe } from "../safe-html/index.js";
17
17
  import { P as ge } from "./pencil-B1sKKyuT.js";
18
18
  import { T as he } from "./trash-2-uumy3fy1.js";
@@ -684,4 +684,4 @@ export {
684
684
  Ie as b,
685
685
  nr as u
686
686
  };
687
- //# sourceMappingURL=help-me-write-templates-BJSf24xS.js.map
687
+ //# sourceMappingURL=help-me-write-templates-ra5a__Yy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"help-me-write-templates-BJSf24xS.js","sources":["../../src/patterns/help-me-write-templates/help-me-write-templates.tsx"],"sourcesContent":["/**\n * Help me write templates (HTP-6383) — practice-shared AI templates in the\n * RichTextEditor.\n *\n * Runtime pattern: real consuming apps mount this in production (surfaced via\n * `src/patterns/index.ts` and the `./patterns/help-me-write-templates`\n * subpath). Templates are an AI action of the editor itself, next to\n * spelling and auto-format: a Templates segment in the AI pill and in the\n * selection bubble (`aiTemplates`). Picking one rewrites the selection, else\n * the whole note, then this pattern offers Undo. The editor keeps the\n * patient AI-consent gate and resume-after-grant for all of it.\n *\n * Parts, usable on their own or wired together by `useHelpMeWriteTemplates`:\n * - `HelpMeWriteTemplatesBar` — the Help-me-write bar (`renderHelpMeWrite`):\n * a free prompt with an optional mic, the draft and Insert.\n * - `AiTemplateManager` — the dialog to list, create, edit, delete and\n * reorder templates.\n * - `AiCreditsExhaustedNotice`: the out-of-credits state the bar shows when\n * an AI call rejects with `AiCreditsExhaustedError`, from the bar or the\n * pill. It lives in `src/components/ai-credits-notice/` (shared with\n * VoiceControlPanel) and is re-exported here, with `AiCreditsInfo`.\n * - `HelpMeWriteUndoNotice` — the success notice with Undo after a template\n * rewrote the note.\n *\n * The host owns the templates (list + persistence) and the AI call. The kit\n * never talks to a backend.\n */\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type DragEvent,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\nimport {\n GripVertical,\n Mic,\n Pencil,\n Plus,\n RotateCcw,\n Send,\n Square,\n Trash2,\n X,\n} from 'lucide-react';\n\nimport { Alert } from '../../components/alert';\nimport {\n AiCreditsExhaustedNotice,\n type AiCreditsInfo,\n} from '../../components/ai-credits-notice';\nimport { Button, IconButton } from '../../components/button';\nimport { Dialog } from '../../components/dialog';\nimport { EditorOverlay } from '../../components/editor-overlay';\nimport { EmptyState } from '../../components/empty-state';\nimport { FormField } from '../../components/form-field';\nimport type {\n HelpMeWriteRenderContext,\n RichTextEditorAiApplied,\n RichTextEditorAiTemplates,\n RichTextEditorProps,\n} from '../../components/rich-text-editor';\nimport { Spinner } from '../../components/spinner';\nimport { TextArea } from '../../components/text-area';\nimport { StateBackedTextInput } from '../../components/_shared/state-backed-text-input';\nimport { SafeHtml } from '../../components/_shared/safe-html';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/** A practice-shared AI template. */\nexport interface AiTemplate {\n id: string;\n /** Up to 100 characters, unique within the practice. */\n name: string;\n /** One line under the name in the Templates menu. */\n description?: string;\n /** The instructions sent to the AI, up to 4000 characters. */\n prompt: string;\n /**\n * @deprecated The list order is the menu order: the first template is the\n * one most people use. Ignored; reorder with `onReorderTemplates`.\n */\n isDefault?: boolean;\n}\n\n/** What the manager hands `onSaveTemplate`: `id` is absent for a new one. */\nexport type AiTemplateDraft = Omit<AiTemplate, 'id'> & { id?: string };\n\n/** One Help-me-write request. `template` is absent for a free prompt. */\nexport interface HelpMeWriteRequest {\n template?: AiTemplate;\n /** The free prompt, or extra instructions for a template. May be ''. */\n prompt: string;\n /**\n * The context, as plain text. For a template, the text it rewrites. For\n * the free prompt, what the draft is about. From the AI pill it is the\n * whole note; from the selection bubble, the selected text.\n */\n sourceText: string;\n /** Where `sourceText` came from. */\n scope?: 'document' | 'selection';\n signal: AbortSignal;\n}\n\n/**\n * Throw (or reject with) this from `onGenerate` when the practice is out of\n * AI credits (the platform endpoint's 402), and the bar shows the\n * out-of-credits notice instead of a generic error.\n */\nexport class AiCreditsExhaustedError extends Error {\n constructor(message = 'AI credits exhausted') {\n super(message);\n this.name = 'AiCreditsExhaustedError';\n }\n}\n\n// The out-of-credits notice and its info type moved to the component layer\n// (`src/components/ai-credits-notice/`) so VoiceControlPanel can share them.\n// Re-exported here so every existing import keeps working.\nexport {\n AiCreditsExhaustedNotice,\n type AiCreditsExhaustedNoticeProps,\n type AiCreditsInfo,\n} from '../../components/ai-credits-notice';\n\nexport type HelpMeWriteApplyMode = 'replace' | 'below' | 'insert';\n\n/** Fired after a draft lands in the editor. */\nexport interface HelpMeWriteApplied {\n mode: HelpMeWriteApplyMode;\n template?: AiTemplate;\n /** The editor's HTML before the change. */\n previousHtml: string;\n /** Puts `previousHtml` back in the editor (what Undo does). */\n undo: () => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Shared classes */\n/* ------------------------------------------------------------------ */\n\n// Match the composer's input height (--min-target-size), like the kit bar.\nconst ACTION_SIZE = 'ds:!size-[var(--min-target-size)]';\nconst BRAND_ACTION = `${ACTION_SIZE} ds:bg-[image:var(--gradient-brand)] ds:rounded-full`;\n// The recording mic goes solid destructive, as in the kit's own bar.\nconst RECORDING_MIC =\n 'ds:aria-pressed:!bg-[var(--destructive)] ds:aria-pressed:!text-[var(--destructive-foreground)]';\nconst metaClass =\n 'ds:m-0 ds:text-[length:var(--font-size-sm)] ds:text-[color:var(--muted-foreground)]';\nconst eyebrowClass =\n 'type-eyebrow ds:m-0 ds:text-[color:var(--muted-foreground)]';\nconst previewClass = [\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--border)]',\n 'ds:bg-[color-mix(in_srgb,var(--background)_70%,transparent)]',\n 'ds:p-[var(--spacing-sm)] ds:[max-block-size:14rem] ds:overflow-y-auto',\n 'ds:text-[length:var(--font-size-sm)] ds:text-[color:var(--foreground)]',\n 'ds:[&_ul]:list-disc ds:[&_ul]:ps-[var(--spacing-md)]',\n 'ds:[&_h3]:font-medium ds:[&_h3]:[margin-block-start:var(--spacing-xs)]',\n 'ds:[&_p]:[margin-block-end:var(--spacing-xs)]',\n 'ds:[&>:first-child]:[margin-block-start:0]',\n].join(' ');\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\n// Join dictated text onto the prompt with a single space.\nfunction joinWith(base: string, extra: string): string {\n if (!extra) return base;\n if (!base) return extra;\n return /\\s$/.test(base) ? `${base}${extra}` : `${base} ${extra}`;\n}\n\nfunction isAbort(err: unknown): boolean {\n return (\n typeof err === 'object' &&\n err !== null &&\n 'name' in err &&\n (err as { name?: string }).name === 'AbortError'\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* HelpMeWriteTemplatesBar */\n/* ------------------------------------------------------------------ */\n\nexport interface HelpMeWriteTemplatesBarProps {\n /** What `RichTextEditor`'s `renderHelpMeWrite` hands its host. */\n context: HelpMeWriteRenderContext;\n /**\n * @deprecated Templates run from the editor's AI pill (`aiTemplates`),\n * not from this bar. Ignored.\n */\n templates?: AiTemplate[];\n /** The AI call. Reject with `AiCreditsExhaustedError` when out of credits. */\n onGenerate: (request: HelpMeWriteRequest) => Promise<string>;\n /** @deprecated The manager opens from the pill's Templates menu. Ignored. */\n onManageTemplates?: (mode: 'list' | 'create') => void;\n /** After a draft lands. */\n onApplied?: (applied: HelpMeWriteApplied) => void;\n /** Shown in the out-of-credits notice. */\n credits?: AiCreditsInfo;\n /** Show the mic in the prompt when the editor has `onDictate`. Default true. */\n enableDictation?: boolean;\n /** Ignore Escape (e.g. while the manager dialog above it is open). */\n suspendClose?: boolean;\n}\n\n/**\n * The Help-me-write bar, docked in the editor's AI slot: a free prompt with\n * an optional mic, then the draft and Insert. It also shows the\n * out-of-credits notice, including when a pill action ran out.\n */\nexport function HelpMeWriteTemplatesBar({\n context,\n onGenerate,\n onApplied,\n credits,\n enableDictation = true,\n suspendClose = false,\n}: HelpMeWriteTemplatesBarProps): React.JSX.Element {\n const { t } = useTranslation('ui');\n const { open } = context;\n const draftId = useId();\n const errorId = useId();\n const [prompt, setPrompt] = useState('');\n const [loading, setLoading] = useState(false);\n const [errored, setErrored] = useState(false);\n const [outOfCredits, setOutOfCredits] = useState(false);\n const [draft, setDraft] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const onDictate = enableDictation ? context.onDictate : undefined;\n\n /* ---- Mic in the prompt (the editor's own dictation seam) ---- */\n const [isDictating, setIsDictating] = useState(false);\n const [interim, setInterim] = useState('');\n const [announcement, setAnnouncement] = useState('');\n const dictateAbortRef = useRef<AbortController | null>(null);\n const stopDictation = useCallback(() => dictateAbortRef.current?.abort(), []);\n const toggleDictation = useCallback(() => {\n if (isDictating) {\n stopDictation();\n return;\n }\n if (!onDictate) return;\n const controller = new AbortController();\n dictateAbortRef.current = controller;\n setIsDictating(true);\n setAnnouncement(t('helpMeWriteTemplates.bar.listening'));\n onDictate({\n signal: controller.signal,\n onPartialTranscript: (text) => {\n if (!controller.signal.aborted) setInterim(text);\n },\n onFinalTranscript: (text) => {\n if (controller.signal.aborted) return;\n setInterim('');\n const trimmed = text.trim();\n if (trimmed) {\n setPrompt((p) => joinWith(p, trimmed));\n setAnnouncement(trimmed);\n }\n },\n })\n .catch((err: unknown) => {\n // Out of credits shows the notice; other dictation errors are\n // non-fatal (the user can type instead).\n if (err instanceof AiCreditsExhaustedError) setOutOfCredits(true);\n })\n .finally(() => {\n setInterim('');\n if (dictateAbortRef.current === controller) {\n dictateAbortRef.current = null;\n setIsDictating(false);\n setAnnouncement('');\n }\n });\n }, [isDictating, onDictate, stopDictation, t]);\n\n // Each open starts fresh.\n useEffect(() => {\n if (open) {\n setPrompt('');\n setLoading(false);\n setErrored(false);\n // Opened because an AI call ran out of credits: start on the notice.\n setOutOfCredits(context.creditsExhausted);\n setDraft(null);\n } else {\n abortRef.current?.abort();\n dictateAbortRef.current?.abort();\n }\n // Only on open/close; `context` is a fresh object every editor render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n useEffect(\n () => () => {\n abortRef.current?.abort();\n dictateAbortRef.current?.abort();\n },\n [],\n );\n\n const run = useCallback(() => {\n if (loading || !prompt.trim()) return;\n stopDictation();\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n setErrored(false);\n setLoading(true);\n const onSelection = context.scope === 'selection';\n onGenerate({\n prompt: prompt.trim(),\n sourceText: onSelection ? context.selectionText : context.getText(),\n scope: onSelection ? 'selection' : 'document',\n signal: controller.signal,\n })\n .then((result) => {\n if (controller.signal.aborted) return;\n setDraft(result);\n setLoading(false);\n })\n .catch((err: unknown) => {\n if (controller.signal.aborted || isAbort(err)) return;\n if (err instanceof AiCreditsExhaustedError) setOutOfCredits(true);\n else setErrored(true);\n setLoading(false);\n });\n // `context` is a fresh object every editor render; read it at call time.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loading, prompt, onGenerate, stopDictation]);\n\n const { onClose: contextClose } = context;\n const close = useCallback(() => {\n if (suspendClose) return;\n contextClose();\n }, [suspendClose, contextClose]);\n\n const insert = () => {\n if (draft === null) return;\n const previousHtml = context.getHTML();\n context.insertAtSelection(draft);\n context.onClose();\n const { setContent } = context;\n onApplied?.({\n mode: context.scope === 'selection' ? 'replace' : 'insert',\n previousHtml,\n undo: () => setContent(previousHtml),\n });\n };\n\n let body: ReactNode;\n if (outOfCredits) {\n body = (\n <AiCreditsExhaustedNotice\n credits={credits}\n onBack={() => setOutOfCredits(false)}\n footnote={t('helpMeWriteTemplates.credits.kept')}\n />\n );\n } else if (draft !== null) {\n body = (\n <>\n <section\n aria-labelledby={draftId}\n className=\"ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-2xs)]\"\n >\n <h2 id={draftId} className={eyebrowClass}>\n {t('helpMeWriteTemplates.bar.after')}\n </h2>\n <SafeHtml\n html={draft}\n profile=\"rich-text\"\n className={previewClass}\n tabIndex={0}\n />\n </section>\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Button intent=\"ghost\" startIcon={<X />} onClick={context.onClose}>\n {t('helpMeWriteTemplates.bar.discard')}\n </Button>\n <Button\n intent=\"ghost\"\n startIcon={<RotateCcw />}\n onClick={() => {\n setDraft(null);\n run();\n }}\n >\n {t('helpMeWriteTemplates.bar.retry')}\n </Button>\n <span className=\"ds:flex-1\" aria-hidden=\"true\" />\n <Button intent=\"primary\" onClick={insert}>\n {context.scope === 'selection'\n ? t('helpMeWriteTemplates.bar.replace')\n : t('helpMeWriteTemplates.bar.insert')}\n </Button>\n </div>\n </>\n );\n } else {\n // While dictating the field shows the committed prompt plus live interim\n // text, read-only so the stream is not fought over by typing.\n const fieldValue = isDictating ? joinWith(prompt, interim) : prompt;\n body = (\n <>\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <IconButton\n size=\"md\"\n intent=\"outline\"\n className={ACTION_SIZE}\n icon={<X />}\n aria-label={t('helpMeWriteTemplates.bar.close')}\n onClick={context.onClose}\n />\n <div className=\"ds:min-w-0 ds:flex-1\">\n <TextArea\n size=\"md\"\n value={fieldValue}\n onChange={(event) => setPrompt(event.target.value)}\n placeholder={t('editor.ai.promptPlaceholder')}\n aria-label={t('editor.ai.promptLabel')}\n autoResize\n minRows={1}\n maxRows={3}\n readOnly={loading || isDictating}\n tone={errored ? 'error' : 'default'}\n aria-describedby={errored ? errorId : undefined}\n />\n </div>\n {onDictate ? (\n <IconButton\n size=\"md\"\n intent=\"outline\"\n className={\n isDictating ? `${ACTION_SIZE} ${RECORDING_MIC}` : ACTION_SIZE\n }\n icon={\n isDictating ? <Square className=\"ds:fill-current\" /> : <Mic />\n }\n aria-pressed={isDictating}\n aria-label={\n isDictating\n ? t('helpMeWriteTemplates.bar.dictateStop')\n : t('helpMeWriteTemplates.bar.dictateStart')\n }\n disabled={loading}\n onClick={toggleDictation}\n />\n ) : null}\n <IconButton\n size=\"md\"\n intent=\"primary\"\n className={BRAND_ACTION}\n icon={loading ? <Spinner size=\"sm\" variant=\"pulse\" /> : <Send />}\n disabled={loading || !prompt.trim()}\n aria-busy={loading || undefined}\n aria-label={t('helpMeWriteTemplates.bar.write')}\n onClick={run}\n />\n </div>\n {onDictate ? (\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {announcement}\n </p>\n ) : null}\n {errored ? (\n <p id={errorId} role=\"alert\" className={metaClass}>\n {t('helpMeWriteTemplates.bar.error')}\n </p>\n ) : null}\n <p className={metaClass}>\n {context.scope === 'selection'\n ? t('helpMeWriteTemplates.bar.contextSelection')\n : t('helpMeWriteTemplates.bar.contextDocument')}{' '}\n {context.privacyNotice}\n </p>\n </>\n );\n }\n\n return (\n <EditorOverlay\n open={open}\n onClose={close}\n ariaLabel={t('editor.ai.helpMeWrite')}\n >\n <div className=\"ds:contents\" data-component=\"help-me-write-templates-bar\">\n {body}\n </div>\n </EditorOverlay>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* AiTemplateManager */\n/* ------------------------------------------------------------------ */\n\n/* The kit's list-reorder idiom (Sidebar favourites, anamnesis): HTML5 drag\n on the row, a grip handle that also moves with Alt+Arrow / Alt+Home /\n Alt+End, and a polite announcement of every move. Rows are keyed, so the\n moved row's handle keeps focus. */\nconst reorderRowClass = cva('', {\n variants: {\n dragging: { true: 'ds:opacity-60', false: '' },\n dropTarget: {\n true: 'ds:outline-[length:var(--focus-ring-width)] ds:outline-dashed ds:outline-[var(--primary)] ds:outline-offset-[-2px]',\n false: '',\n },\n },\n defaultVariants: { dragging: false, dropTarget: false },\n});\n\nfunction useReorder(\n templates: AiTemplate[],\n onReorder: ((orderedIds: string[]) => void | Promise<void>) | undefined,\n) {\n const { t } = useTranslation('ui');\n const [dragSource, setDragSource] = useState<number | null>(null);\n const [dropTarget, setDropTarget] = useState<number | null>(null);\n const [message, setMessage] = useState('');\n // Toggle an invisible suffix so a repeated move is announced again.\n const toggle = useRef(false);\n\n const move = (from: number, to: number): void => {\n const target = Math.max(0, Math.min(templates.length - 1, to));\n if (!onReorder || target === from) return;\n const ids = templates.map((tpl) => tpl.id);\n const [moved] = ids.splice(from, 1);\n ids.splice(target, 0, moved);\n void onReorder(ids);\n toggle.current = !toggle.current;\n const text = t('helpMeWriteTemplates.manager.reorderAnnounce', {\n label: templates[from].name,\n to: target + 1,\n total: templates.length,\n });\n setMessage(toggle.current ? text : `${text}\\u200b`);\n };\n\n const rowProps = (index: number) =>\n onReorder\n ? {\n draggable: true as const,\n onDragStart: (event: DragEvent<HTMLElement>) => {\n setDragSource(index);\n event.dataTransfer.effectAllowed = 'move';\n // Firefox needs data to start a drag.\n event.dataTransfer.setData('text/plain', String(index));\n },\n onDragEnd: () => {\n setDragSource(null);\n setDropTarget(null);\n },\n onDragOver: (event: DragEvent<HTMLElement>) => {\n if (dragSource === null) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = 'move';\n setDropTarget(index);\n },\n onDragLeave: () => setDropTarget(null),\n onDrop: (event: DragEvent<HTMLElement>) => {\n event.preventDefault();\n const source = dragSource;\n setDragSource(null);\n setDropTarget(null);\n if (source !== null) move(source, index);\n },\n }\n : {};\n\n const rowClass = (index: number): string =>\n reorderRowClass({\n dragging: dragSource === index,\n dropTarget: dropTarget === index && dragSource !== index,\n });\n\n const handle = (index: number, name: string): ReactNode => (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<GripVertical aria-hidden=\"true\" />}\n aria-label={t('helpMeWriteTemplates.manager.reorderHandle', {\n label: name,\n })}\n className=\"ds:cursor-grab ds:active:cursor-grabbing\"\n onKeyDown={(event: KeyboardEvent<HTMLButtonElement>) => {\n if (!event.altKey) return;\n const to =\n event.key === 'ArrowUp'\n ? index - 1\n : event.key === 'ArrowDown'\n ? index + 1\n : event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? templates.length - 1\n : null;\n if (to === null) return;\n event.preventDefault();\n move(index, to);\n }}\n />\n );\n\n const liveRegion = (\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {message}\n </span>\n );\n\n return { rowProps, rowClass, handle, liveRegion };\n}\n\nexport interface AiTemplateManagerProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Open on the list (default) or straight on a new-template form. */\n initialMode?: 'list' | 'create';\n templates: AiTemplate[];\n /** Persist a new (no `id`) or edited template. A rejection keeps the form open. */\n onSaveTemplate: (draft: AiTemplateDraft) => void | Promise<void>;\n /** Omit to hide Delete. */\n onDeleteTemplate?: (id: string) => void | Promise<void>;\n /**\n * Persist a new order (every template id, first to last): the order of\n * the Templates menu. Omit to hide the drag handles.\n */\n onReorderTemplates?: (orderedIds: string[]) => void | Promise<void>;\n}\n\ninterface FormState {\n id?: string;\n name: string;\n description: string;\n prompt: string;\n submitted: boolean;\n}\n\nconst EMPTY_FORM: FormState = {\n name: '',\n description: '',\n prompt: '',\n submitted: false,\n};\n\n/** List, create, edit and delete the practice's templates. */\nexport function AiTemplateManager({\n open,\n onOpenChange,\n initialMode = 'list',\n templates,\n onSaveTemplate,\n onDeleteTemplate,\n onReorderTemplates,\n}: AiTemplateManagerProps): React.JSX.Element {\n const { t } = useTranslation('ui');\n const reorder = useReorder(templates, onReorderTemplates);\n const [form, setForm] = useState<FormState | null>(null);\n const [saving, setSaving] = useState(false);\n const [saveFailed, setSaveFailed] = useState(false);\n const [pendingDelete, setPendingDelete] = useState<AiTemplate | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [deleteFailed, setDeleteFailed] = useState(false);\n\n // Wait for the host: the confirmation stays open (busy) until the delete\n // settles, and shows an error if it fails.\n const confirmDelete = async () => {\n if (!pendingDelete || deleting) return;\n setDeleting(true);\n setDeleteFailed(false);\n try {\n await onDeleteTemplate?.(pendingDelete.id);\n setPendingDelete(null);\n } catch {\n setDeleteFailed(true);\n } finally {\n setDeleting(false);\n }\n };\n\n useEffect(() => {\n if (open) {\n setSaveFailed(false);\n setForm(initialMode === 'create' ? { ...EMPTY_FORM } : null);\n }\n // Only when it opens; `templates` changing mid-edit keeps the form.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n const nameTaken = (name: string, id?: string): boolean =>\n templates.some(\n (tpl) => tpl.id !== id && tpl.name.toLowerCase() === name.toLowerCase(),\n );\n\n const nameError = (() => {\n if (!form?.submitted) return undefined;\n const name = form.name.trim();\n if (!name) return t('helpMeWriteTemplates.manager.nameRequired');\n return nameTaken(name, form.id)\n ? t('helpMeWriteTemplates.manager.nameTaken')\n : undefined;\n })();\n const promptError =\n form?.submitted && !form.prompt.trim()\n ? t('helpMeWriteTemplates.manager.promptRequired')\n : undefined;\n\n const save = async () => {\n if (!form || saving) return;\n const next = { ...form, submitted: true };\n setForm(next);\n const name = next.name.trim();\n const prompt = next.prompt.trim();\n if (!name || !prompt || nameTaken(name, next.id)) return;\n setSaving(true);\n setSaveFailed(false);\n try {\n await onSaveTemplate({\n id: next.id,\n name,\n description: next.description.trim() || undefined,\n prompt,\n });\n setForm(null);\n } catch {\n setSaveFailed(true);\n } finally {\n setSaving(false);\n }\n };\n\n const title = form\n ? form.id\n ? t('helpMeWriteTemplates.manager.formEdit')\n : t('helpMeWriteTemplates.manager.formNew')\n : t('helpMeWriteTemplates.manager.title');\n\n return (\n <>\n <Dialog open={open} onOpenChange={onOpenChange}>\n <Dialog.Content size=\"lg\">\n <div className=\"ds:contents\" data-component=\"ai-template-manager\">\n <Dialog.Header>\n <Dialog.Title>{title}</Dialog.Title>\n <Dialog.Description>\n {t('helpMeWriteTemplates.manager.description')}\n </Dialog.Description>\n </Dialog.Header>\n <Dialog.Body>\n {form ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {saveFailed ? (\n <Alert variant=\"error\">\n {t('helpMeWriteTemplates.manager.saveError')}\n </Alert>\n ) : null}\n <FormField\n label={t('helpMeWriteTemplates.manager.name')}\n error={nameError}\n required\n >\n <StateBackedTextInput\n value={form.name}\n maxLength={100}\n placeholder={t(\n 'helpMeWriteTemplates.manager.namePlaceholder',\n )}\n onChange={(event) =>\n setForm({ ...form, name: event.target.value })\n }\n />\n </FormField>\n <FormField\n label={t('helpMeWriteTemplates.manager.descLabel')}\n description={t('helpMeWriteTemplates.manager.descHint')}\n optional\n >\n <StateBackedTextInput\n value={form.description}\n maxLength={120}\n onChange={(event) =>\n setForm({ ...form, description: event.target.value })\n }\n />\n </FormField>\n <FormField\n label={t('helpMeWriteTemplates.manager.prompt')}\n description={t(\n 'helpMeWriteTemplates.manager.promptDescription',\n )}\n error={promptError}\n required\n >\n <TextArea\n value={form.prompt}\n maxLength={4000}\n autoResize\n minRows={4}\n maxRows={10}\n onChange={(event) =>\n setForm({ ...form, prompt: event.target.value })\n }\n />\n </FormField>\n </div>\n ) : templates.length === 0 ? (\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={t('helpMeWriteTemplates.manager.emptyTitle')}\n description={t(\n 'helpMeWriteTemplates.manager.emptyDescription',\n )}\n primaryAction={{\n label: t('helpMeWriteTemplates.manager.new'),\n onClick: () => setForm({ ...EMPTY_FORM }),\n }}\n />\n ) : (\n <ul\n aria-label={t('helpMeWriteTemplates.manager.listLabel')}\n className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-0\"\n >\n {templates.map((tpl, index) => (\n <li\n key={tpl.id}\n {...reorder.rowProps(index)}\n className={`ds:flex ds:items-start ds:gap-[var(--spacing-sm)] ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--border)] ds:p-[var(--spacing-sm)] ${reorder.rowClass(index)}`}\n >\n {onReorderTemplates\n ? reorder.handle(index, tpl.name)\n : null}\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-title-item ds:text-[color:var(--foreground)]\">\n {tpl.name}\n </span>\n </div>\n <p className={`${metaClass} ds:line-clamp-2`}>\n {tpl.description || tpl.prompt}\n </p>\n </div>\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<Pencil />}\n aria-label={t('helpMeWriteTemplates.manager.edit', {\n name: tpl.name,\n })}\n onClick={() =>\n setForm({\n id: tpl.id,\n name: tpl.name,\n description: tpl.description ?? '',\n prompt: tpl.prompt,\n submitted: false,\n })\n }\n />\n {onDeleteTemplate ? (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<Trash2 />}\n aria-label={t('helpMeWriteTemplates.manager.delete', {\n name: tpl.name,\n })}\n onClick={() => setPendingDelete(tpl)}\n />\n ) : null}\n </li>\n ))}\n </ul>\n )}\n {reorder.liveRegion}\n </Dialog.Body>\n <Dialog.Footer>\n {form ? (\n <>\n <Button intent=\"secondary\" onClick={() => setForm(null)}>\n {t('helpMeWriteTemplates.manager.cancel')}\n </Button>\n <Button\n intent=\"primary\"\n loading={saving}\n onClick={() => void save()}\n >\n {t('helpMeWriteTemplates.manager.save')}\n </Button>\n </>\n ) : (\n <>\n {templates.length > 0 ? (\n <Button\n intent=\"outline\"\n startIcon={<Plus />}\n onClick={() => setForm({ ...EMPTY_FORM })}\n >\n {t('helpMeWriteTemplates.manager.new')}\n </Button>\n ) : null}\n <Dialog.Close asChild>\n <Button intent=\"primary\">\n {t('helpMeWriteTemplates.manager.done')}\n </Button>\n </Dialog.Close>\n </>\n )}\n </Dialog.Footer>\n </div>\n </Dialog.Content>\n </Dialog>\n <Dialog\n open={pendingDelete != null}\n onOpenChange={(next) => {\n if (!next && !deleting) {\n setPendingDelete(null);\n setDeleteFailed(false);\n }\n }}\n >\n <Dialog.Content size=\"sm\" variant=\"alert\">\n <Dialog.Header>\n <Dialog.Title>\n {t('helpMeWriteTemplates.manager.deleteTitle', {\n name: pendingDelete?.name ?? '',\n })}\n </Dialog.Title>\n <Dialog.Description>\n {t('helpMeWriteTemplates.manager.deleteDescription')}\n </Dialog.Description>\n </Dialog.Header>\n {deleteFailed ? (\n <Dialog.Body>\n <Alert variant=\"error\">\n {t('helpMeWriteTemplates.manager.deleteError')}\n </Alert>\n </Dialog.Body>\n ) : null}\n <Dialog.Footer>\n <Dialog.Close asChild>\n <Button intent=\"secondary\" disabled={deleting}>\n {t('helpMeWriteTemplates.manager.cancel')}\n </Button>\n </Dialog.Close>\n <Button\n intent=\"destructive\"\n loading={deleting}\n onClick={() => void confirmDelete()}\n >\n {t('helpMeWriteTemplates.manager.deleteConfirm')}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog>\n </>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* HelpMeWriteUndoNotice */\n/* ------------------------------------------------------------------ */\n\nexport interface HelpMeWriteUndoNoticeProps {\n /** The change to offer Undo for; `null` hides the notice. */\n applied: HelpMeWriteApplied | null;\n onUndo: () => void;\n onDismiss: () => void;\n}\n\n/** \"Note rewritten with …\" plus Undo; takes focus when it appears. */\nexport function HelpMeWriteUndoNotice({\n applied,\n onUndo,\n onDismiss,\n}: HelpMeWriteUndoNoticeProps): React.JSX.Element | null {\n const { t } = useTranslation('ui');\n const undoRef = useRef<HTMLButtonElement>(null);\n useEffect(() => {\n if (applied) undoRef.current?.focus();\n }, [applied]);\n if (!applied?.template) return null;\n const name = applied.template.name;\n return (\n <Alert\n variant=\"success\"\n dismissible\n onOpenChange={(isOpen) => {\n if (!isOpen) onDismiss();\n }}\n data-component=\"help-me-write-undo-notice\"\n >\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span>\n {applied.mode === 'below'\n ? t('helpMeWriteTemplates.undo.addedBelow', { name })\n : t('helpMeWriteTemplates.undo.replaced', { name })}\n </span>\n <Button ref={undoRef} intent=\"outline\" size=\"sm\" onClick={onUndo}>\n {t('helpMeWriteTemplates.undo.undo')}\n </Button>\n </div>\n </Alert>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* useHelpMeWriteTemplates — the whole thing in one call */\n/* ------------------------------------------------------------------ */\n\nexport interface UseHelpMeWriteTemplatesOptions {\n templates: AiTemplate[];\n /** The AI call, for both templates (from the pill) and the free prompt. */\n onGenerate: HelpMeWriteTemplatesBarProps['onGenerate'];\n /** Enables the manager (create / edit). Omit for read-only template users. */\n onSaveTemplate?: AiTemplateManagerProps['onSaveTemplate'];\n /** Enables Delete in the manager. */\n onDeleteTemplate?: AiTemplateManagerProps['onDeleteTemplate'];\n /** Enables drag-and-drop reordering in the manager (the menu order). */\n onReorderTemplates?: AiTemplateManagerProps['onReorderTemplates'];\n credits?: AiCreditsInfo;\n /** Mic in the bar's prompt when the editor has `onDictate`. Default true. */\n enableDictation?: boolean;\n /** Also told about every applied draft (e.g. for analytics). */\n onApplied?: (applied: HelpMeWriteApplied) => void;\n /**\n * Shows the AI-credits/bundles hover card on every AI trigger the editor\n * has (this bar's own segment included, via `editorProps`). One wiring\n * covers both the bar's existing out-of-credits notice (`credits`, shown\n * only once the practice actually runs out) and this always-available\n * hover preview.\n */\n creditsNotice?: RichTextEditorProps['aiCreditsNotice'];\n}\n\n/** The `RichTextEditor` props the hook drives; spread them on the editor. */\nexport interface HelpMeWriteTemplatesEditorProps {\n renderHelpMeWrite: (context: HelpMeWriteRenderContext) => ReactNode;\n aiTemplates: RichTextEditorAiTemplates;\n onAiApplied: (applied: RichTextEditorAiApplied) => void;\n aiCreditsNotice?: RichTextEditorProps['aiCreditsNotice'];\n}\n\nexport interface UseHelpMeWriteTemplatesResult extends HelpMeWriteTemplatesEditorProps {\n /** All three editor props at once: `<RichTextEditor {...hmw.editorProps} />`. */\n editorProps: HelpMeWriteTemplatesEditorProps;\n /** Mount once, anywhere (a portalled dialog); `null` without `onSaveTemplate`. */\n manager: ReactNode;\n /** Place where the Undo notice should show, e.g. above the editor. */\n undoNotice: ReactNode;\n openManager: (mode?: 'list' | 'create') => void;\n}\n\n/**\n * Wires templates, the Help-me-write bar, the manager and Undo into the\n * editor. Templates run from the editor's AI pill and selection bubble;\n * the bar is the free prompt. Usage:\n *\n * const hmw = useHelpMeWriteTemplates({ templates, onGenerate, onSaveTemplate });\n * {hmw.undoNotice}\n * <RichTextEditor {...hmw.editorProps} … />\n * {hmw.manager}\n */\nexport function useHelpMeWriteTemplates({\n templates,\n onGenerate,\n onSaveTemplate,\n onDeleteTemplate,\n onReorderTemplates,\n credits,\n enableDictation,\n onApplied,\n creditsNotice,\n}: UseHelpMeWriteTemplatesOptions): UseHelpMeWriteTemplatesResult {\n const [manager, setManager] = useState<{\n open: boolean;\n mode: 'list' | 'create';\n }>({ open: false, mode: 'list' });\n const [applied, setApplied] = useState<HelpMeWriteApplied | null>(null);\n const openManager = useCallback(\n (mode: 'list' | 'create' = 'list') => setManager({ open: true, mode }),\n [],\n );\n\n const renderHelpMeWrite = useCallback(\n (context: HelpMeWriteRenderContext): ReactNode => (\n <HelpMeWriteTemplatesBar\n context={context}\n onGenerate={onGenerate}\n credits={credits}\n enableDictation={enableDictation}\n suspendClose={manager.open}\n onApplied={onApplied}\n />\n ),\n [onGenerate, credits, enableDictation, manager.open, onApplied],\n );\n\n // The editor runs templates; the host's full template (with its prompt)\n // goes to `onGenerate`, looked up by id.\n const aiTemplates = useMemo<RichTextEditorAiTemplates>(() => {\n const byId = new Map(templates.map((tpl) => [tpl.id, tpl]));\n return {\n templates,\n onRun: ({ template, text, scope, signal }): Promise<string> => {\n const full = byId.get(template.id);\n if (!full) return Promise.reject(new Error('Unknown template'));\n return onGenerate({\n template: full,\n prompt: '',\n sourceText: text,\n scope,\n signal,\n });\n },\n onManage: onSaveTemplate ? openManager : undefined,\n };\n }, [templates, onGenerate, onSaveTemplate, openManager]);\n\n const onAiApplied = useCallback(\n (event: RichTextEditorAiApplied): void => {\n if (event.action !== 'template' || !event.template) return;\n const template = templates.find((tpl) => tpl.id === event.template?.id);\n const change: HelpMeWriteApplied = {\n mode: 'replace',\n template,\n previousHtml: event.previousHtml,\n undo: event.undo,\n };\n setApplied(template ? change : null);\n onApplied?.(change);\n },\n [templates, onApplied],\n );\n\n const managerNode = useMemo(\n () =>\n onSaveTemplate ? (\n <AiTemplateManager\n open={manager.open}\n initialMode={manager.mode}\n onOpenChange={(isOpen) => setManager((m) => ({ ...m, open: isOpen }))}\n templates={templates}\n onSaveTemplate={onSaveTemplate}\n onDeleteTemplate={onDeleteTemplate}\n onReorderTemplates={onReorderTemplates}\n />\n ) : null,\n [manager, templates, onSaveTemplate, onDeleteTemplate, onReorderTemplates],\n );\n\n const undoNotice = (\n <HelpMeWriteUndoNotice\n applied={applied}\n onUndo={() => {\n applied?.undo();\n setApplied(null);\n }}\n onDismiss={() => setApplied(null)}\n />\n );\n\n const editorProps = useMemo<HelpMeWriteTemplatesEditorProps>(\n () => ({\n renderHelpMeWrite,\n aiTemplates,\n onAiApplied,\n aiCreditsNotice: creditsNotice,\n }),\n [renderHelpMeWrite, aiTemplates, onAiApplied, creditsNotice],\n );\n\n return {\n ...editorProps,\n editorProps,\n manager: managerNode,\n undoNotice,\n openManager,\n };\n}\n"],"names":["AiCreditsExhaustedError","message","ACTION_SIZE","BRAND_ACTION","RECORDING_MIC","metaClass","eyebrowClass","previewClass","joinWith","base","extra","isAbort","err","HelpMeWriteTemplatesBar","context","onGenerate","onApplied","credits","enableDictation","suspendClose","t","useTranslation","open","draftId","useId","errorId","prompt","setPrompt","useState","loading","setLoading","errored","setErrored","outOfCredits","setOutOfCredits","draft","setDraft","abortRef","useRef","onDictate","isDictating","setIsDictating","interim","setInterim","announcement","setAnnouncement","dictateAbortRef","stopDictation","useCallback","_a","toggleDictation","controller","text","trimmed","p","useEffect","_b","run","onSelection","result","contextClose","close","insert","previousHtml","setContent","body","jsx","AiCreditsExhaustedNotice","jsxs","Fragment","SafeHtml","Button","X","RotateCcw","fieldValue","IconButton","TextArea","event","Square","Mic","Spinner","Send","EditorOverlay","reorderRowClass","cva","useReorder","templates","onReorder","dragSource","setDragSource","dropTarget","setDropTarget","setMessage","toggle","move","from","to","target","ids","tpl","moved","index","source","name","GripVertical","EMPTY_FORM","AiTemplateManager","onOpenChange","initialMode","onSaveTemplate","onDeleteTemplate","onReorderTemplates","reorder","form","setForm","saving","setSaving","saveFailed","setSaveFailed","pendingDelete","setPendingDelete","deleting","setDeleting","deleteFailed","setDeleteFailed","confirmDelete","nameTaken","id","nameError","promptError","save","next","title","Dialog","Alert","FormField","StateBackedTextInput","EmptyState","Pencil","Trash2","Plus","HelpMeWriteUndoNotice","applied","onUndo","onDismiss","undoRef","isOpen","useHelpMeWriteTemplates","creditsNotice","manager","setManager","setApplied","openManager","mode","renderHelpMeWrite","aiTemplates","useMemo","byId","template","scope","signal","full","onAiApplied","change","managerNode","m","undoNotice","editorProps"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAqHO,MAAMA,WAAgC,MAAM;AAAA,EACjD,YAAYC,IAAU,wBAAwB;AAC5C,UAAMA,CAAO,GACb,KAAK,OAAO;AAAA,EACd;AACF;AA4BA,MAAMC,IAAc,qCACdC,KAAe,GAAGD,CAAW,wDAE7BE,KACJ,kGACIC,IACJ,uFACIC,KACJ,+DACIC,KAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;AAOV,SAASC,GAASC,GAAcC,GAAuB;AACrD,SAAKA,IACAD,IACE,MAAM,KAAKA,CAAI,IAAI,GAAGA,CAAI,GAAGC,CAAK,KAAK,GAAGD,CAAI,IAAIC,CAAK,KAD5CA,IADCD;AAGrB;AAEA,SAASE,GAAQC,GAAuB;AACtC,SACE,OAAOA,KAAQ,YACfA,MAAQ,QACR,UAAUA,KACTA,EAA0B,SAAS;AAExC;AAiCO,SAASC,GAAwB;AAAA,EACtC,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,cAAAC,IAAe;AACjB,GAAoD;AAClD,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAe,IAAI,GAC3B,EAAE,MAAAC,MAASR,GACXS,IAAUC,GAAA,GACVC,IAAUD,GAAA,GACV,CAACE,GAAQC,CAAS,IAAIC,EAAS,EAAE,GACjC,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAK,GACtC,CAACG,GAASC,CAAU,IAAIJ,EAAS,EAAK,GACtC,CAACK,GAAcC,CAAe,IAAIN,EAAS,EAAK,GAChD,CAACO,GAAOC,CAAQ,IAAIR,EAAwB,IAAI,GAChDS,IAAWC,EAA+B,IAAI,GAC9CC,IAAYrB,IAAkBJ,EAAQ,YAAY,QAGlD,CAAC0B,GAAaC,CAAc,IAAIb,EAAS,EAAK,GAC9C,CAACc,GAASC,CAAU,IAAIf,EAAS,EAAE,GACnC,CAACgB,GAAcC,CAAe,IAAIjB,EAAS,EAAE,GAC7CkB,IAAkBR,EAA+B,IAAI,GACrDS,IAAgBC,EAAY,MAAA;;AAAM,YAAAC,IAAAH,EAAgB,YAAhB,gBAAAG,EAAyB;AAAA,KAAS,EAAE,GACtEC,KAAkBF,EAAY,MAAM;AACxC,QAAIR,GAAa;AACf,MAAAO,EAAA;AACA;AAAA,IACF;AACA,QAAI,CAACR,EAAW;AAChB,UAAMY,IAAa,IAAI,gBAAA;AACvB,IAAAL,EAAgB,UAAUK,GAC1BV,EAAe,EAAI,GACnBI,EAAgBzB,EAAE,oCAAoC,CAAC,GACvDmB,EAAU;AAAA,MACR,QAAQY,EAAW;AAAA,MACnB,qBAAqB,CAACC,MAAS;AAC7B,QAAKD,EAAW,OAAO,aAAoBC,CAAI;AAAA,MACjD;AAAA,MACA,mBAAmB,CAACA,MAAS;AAC3B,YAAID,EAAW,OAAO,QAAS;AAC/B,QAAAR,EAAW,EAAE;AACb,cAAMU,IAAUD,EAAK,KAAA;AACrB,QAAIC,MACF1B,EAAU,CAAC2B,MAAM9C,GAAS8C,GAAGD,CAAO,CAAC,GACrCR,EAAgBQ,CAAO;AAAA,MAE3B;AAAA,IAAA,CACD,EACE,MAAM,CAACzC,MAAiB;AAGvB,MAAIA,aAAeZ,MAAyBkC,EAAgB,EAAI;AAAA,IAClE,CAAC,EACA,QAAQ,MAAM;AACb,MAAAS,EAAW,EAAE,GACTG,EAAgB,YAAYK,MAC9BL,EAAgB,UAAU,MAC1BL,EAAe,EAAK,GACpBI,EAAgB,EAAE;AAAA,IAEtB,CAAC;AAAA,EACL,GAAG,CAACL,GAAaD,GAAWQ,GAAe3B,CAAC,CAAC;AAG7C,EAAAmC,EAAU,MAAM;;AACd,IAAIjC,KACFK,EAAU,EAAE,GACZG,EAAW,EAAK,GAChBE,EAAW,EAAK,GAEhBE,EAAgBpB,EAAQ,gBAAgB,GACxCsB,EAAS,IAAI,OAEba,IAAAZ,EAAS,YAAT,QAAAY,EAAkB,UAClBO,IAAAV,EAAgB,YAAhB,QAAAU,EAAyB;AAAA,EAI7B,GAAG,CAAClC,CAAI,CAAC,GAETiC;AAAA,IACE,MAAM,MAAM;;AACV,OAAAN,IAAAZ,EAAS,YAAT,QAAAY,EAAkB,UAClBO,IAAAV,EAAgB,YAAhB,QAAAU,EAAyB;AAAA,IAC3B;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,QAAMC,IAAMT,EAAY,MAAM;;AAC5B,QAAInB,KAAW,CAACH,EAAO,OAAQ;AAC/B,IAAAqB,EAAA,IACAE,IAAAZ,EAAS,YAAT,QAAAY,EAAkB;AAClB,UAAME,IAAa,IAAI,gBAAA;AACvB,IAAAd,EAAS,UAAUc,GACnBnB,EAAW,EAAK,GAChBF,EAAW,EAAI;AACf,UAAM4B,IAAc5C,EAAQ,UAAU;AACtC,IAAAC,EAAW;AAAA,MACT,QAAQW,EAAO,KAAA;AAAA,MACf,YAAYgC,IAAc5C,EAAQ,gBAAgBA,EAAQ,QAAA;AAAA,MAC1D,OAAO4C,IAAc,cAAc;AAAA,MACnC,QAAQP,EAAW;AAAA,IAAA,CACpB,EACE,KAAK,CAACQ,MAAW;AAChB,MAAIR,EAAW,OAAO,YACtBf,EAASuB,CAAM,GACf7B,EAAW,EAAK;AAAA,IAClB,CAAC,EACA,MAAM,CAAClB,MAAiB;AACvB,MAAIuC,EAAW,OAAO,WAAWxC,GAAQC,CAAG,MACxCA,aAAeZ,KAAyBkC,EAAgB,EAAI,MAChD,EAAI,GACpBJ,EAAW,EAAK;AAAA,IAClB,CAAC;AAAA,EAGL,GAAG,CAACD,GAASH,GAAQX,GAAYgC,CAAa,CAAC,GAEzC,EAAE,SAASa,EAAA,IAAiB9C,GAC5B+C,KAAQb,EAAY,MAAM;AAC9B,IAAI7B,KACJyC,EAAA;AAAA,EACF,GAAG,CAACzC,GAAcyC,CAAY,CAAC,GAEzBE,KAAS,MAAM;AACnB,QAAI3B,MAAU,KAAM;AACpB,UAAM4B,IAAejD,EAAQ,QAAA;AAC7B,IAAAA,EAAQ,kBAAkBqB,CAAK,GAC/BrB,EAAQ,QAAA;AACR,UAAM,EAAE,YAAAkD,MAAelD;AACvB,IAAAE,KAAA,QAAAA,EAAY;AAAA,MACV,MAAMF,EAAQ,UAAU,cAAc,YAAY;AAAA,MAClD,cAAAiD;AAAA,MACA,MAAM,MAAMC,EAAWD,CAAY;AAAA,IAAA;AAAA,EAEvC;AAEA,MAAIE;AACJ,MAAIhC;AACF,IAAAgC,IACE,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,SAAAlD;AAAA,QACA,QAAQ,MAAMiB,EAAgB,EAAK;AAAA,QACnC,UAAUd,EAAE,mCAAmC;AAAA,MAAA;AAAA,IAAA;AAAA,WAG1Ce,MAAU;AACnB,IAAA8B,IACE,gBAAAG,EAAAC,GAAA,EACE,UAAA;AAAA,MAAA,gBAAAD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,mBAAiB7C;AAAA,UACjB,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAA2C,EAAC,QAAG,IAAI3C,GAAS,WAAWjB,IACzB,UAAAc,EAAE,gCAAgC,GACrC;AAAA,YACA,gBAAA8C;AAAA,cAACI;AAAA,cAAA;AAAA,gBACC,MAAMnC;AAAA,gBACN,SAAQ;AAAA,gBACR,WAAW5B;AAAA,gBACX,UAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,gBAAA6D,EAAC,OAAA,EAAI,WAAU,mEACb,UAAA;AAAA,QAAA,gBAAAF,EAACK,GAAA,EAAO,QAAO,SAAQ,WAAW,gBAAAL,EAACM,IAAA,CAAA,CAAE,GAAI,SAAS1D,EAAQ,SACvD,UAAAM,EAAE,kCAAkC,GACvC;AAAA,QACA,gBAAA8C;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,QAAO;AAAA,YACP,6BAAYE,IAAA,EAAU;AAAA,YACtB,SAAS,MAAM;AACb,cAAArC,EAAS,IAAI,GACbqB,EAAA;AAAA,YACF;AAAA,YAEC,YAAE,gCAAgC;AAAA,UAAA;AAAA,QAAA;AAAA,QAErC,gBAAAS,EAAC,QAAA,EAAK,WAAU,aAAY,eAAY,QAAO;AAAA,QAC/C,gBAAAA,EAACK,GAAA,EAAO,QAAO,WAAU,SAAST,IAC/B,UAAAhD,EAAQ,UAAU,cACfM,EAAE,kCAAkC,IACpCA,EAAE,iCAAiC,EAAA,CACzC;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,OAEG;AAGL,UAAMsD,IAAalC,IAAchC,GAASkB,GAAQgB,CAAO,IAAIhB;AAC7D,IAAAuC,IACE,gBAAAG,EAAAC,GAAA,EACE,UAAA;AAAA,MAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,sDACb,UAAA;AAAA,QAAA,gBAAAF;AAAA,UAACS;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAWzE;AAAA,YACX,wBAAOsE,IAAA,EAAE;AAAA,YACT,cAAYpD,EAAE,gCAAgC;AAAA,YAC9C,SAASN,EAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,QAEnB,gBAAAoD,EAAC,OAAA,EAAI,WAAU,wBACb,UAAA,gBAAAA;AAAA,UAACU;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAOF;AAAA,YACP,UAAU,CAACG,MAAUlD,EAAUkD,EAAM,OAAO,KAAK;AAAA,YACjD,aAAazD,EAAE,6BAA6B;AAAA,YAC5C,cAAYA,EAAE,uBAAuB;AAAA,YACrC,YAAU;AAAA,YACV,SAAS;AAAA,YACT,SAAS;AAAA,YACT,UAAUS,KAAWW;AAAA,YACrB,MAAMT,IAAU,UAAU;AAAA,YAC1B,oBAAkBA,IAAUN,IAAU;AAAA,UAAA;AAAA,QAAA,GAE1C;AAAA,QACCc,IACC,gBAAA2B;AAAA,UAACS;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WACEnC,IAAc,GAAGtC,CAAW,IAAIE,EAAa,KAAKF;AAAA,YAEpD,MACEsC,IAAc,gBAAA0B,EAACY,IAAA,EAAO,WAAU,kBAAA,CAAkB,sBAAMC,IAAA,EAAI;AAAA,YAE9D,gBAAcvC;AAAA,YACd,cAEMpB,EADJoB,IACM,yCACA,uCADsC;AAAA,YAG9C,UAAUX;AAAA,YACV,SAASqB;AAAA,UAAA;AAAA,QAAA,IAET;AAAA,QACJ,gBAAAgB;AAAA,UAACS;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAWxE;AAAA,YACX,MAAM0B,IAAU,gBAAAqC,EAACc,IAAA,EAAQ,MAAK,MAAK,SAAQ,QAAA,CAAQ,IAAK,gBAAAd,EAACe,IAAA,CAAA,CAAK;AAAA,YAC9D,UAAUpD,KAAW,CAACH,EAAO,KAAA;AAAA,YAC7B,aAAWG,KAAW;AAAA,YACtB,cAAYT,EAAE,gCAAgC;AAAA,YAC9C,SAASqC;AAAA,UAAA;AAAA,QAAA;AAAA,MACX,GACF;AAAA,MACClB,IACC,gBAAA2B,EAAC,KAAA,EAAE,WAAU,cAAa,MAAK,UAAS,aAAU,UAC/C,UAAAtB,EAAA,CACH,IACE;AAAA,MACHb,IACC,gBAAAmC,EAAC,KAAA,EAAE,IAAIzC,GAAS,MAAK,SAAQ,WAAWpB,GACrC,UAAAe,EAAE,gCAAgC,EAAA,CACrC,IACE;AAAA,MACJ,gBAAAgD,EAAC,KAAA,EAAE,WAAW/D,GACX,UAAA;AAAA,QAAAS,EAAQ,UAAU,cACfM,EAAE,2CAA2C,IAC7CA,EAAE,0CAA0C;AAAA,QAAG;AAAA,QAClDN,EAAQ;AAAA,MAAA,EAAA,CACX;AAAA,IAAA,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAoD;AAAA,IAACgB;AAAA,IAAA;AAAA,MACC,MAAA5D;AAAA,MACA,SAASuC;AAAA,MACT,WAAWzC,EAAE,uBAAuB;AAAA,MAEpC,4BAAC,OAAA,EAAI,WAAU,eAAc,kBAAe,+BACzC,UAAA6C,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN;AAUA,MAAMkB,KAAkBC,GAAI,IAAI;AAAA,EAC9B,UAAU;AAAA,IACR,UAAU,EAAE,MAAM,iBAAiB,OAAO,GAAA;AAAA,IAC1C,YAAY;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,IAAA;AAAA,EACT;AAAA,EAEF,iBAAiB,EAAE,UAAU,IAAO,YAAY,GAAA;AAClD,CAAC;AAED,SAASC,GACPC,GACAC,GACA;AACA,QAAM,EAAE,GAAAnE,EAAA,IAAMC,EAAe,IAAI,GAC3B,CAACmE,GAAYC,CAAa,IAAI7D,EAAwB,IAAI,GAC1D,CAAC8D,GAAYC,CAAa,IAAI/D,EAAwB,IAAI,GAC1D,CAAC3B,GAAS2F,CAAU,IAAIhE,EAAS,EAAE,GAEnCiE,IAASvD,EAAO,EAAK,GAErBwD,IAAO,CAACC,GAAcC,MAAqB;AAC/C,UAAMC,IAAS,KAAK,IAAI,GAAG,KAAK,IAAIX,EAAU,SAAS,GAAGU,CAAE,CAAC;AAC7D,QAAI,CAACT,KAAaU,MAAWF,EAAM;AACnC,UAAMG,IAAMZ,EAAU,IAAI,CAACa,MAAQA,EAAI,EAAE,GACnC,CAACC,CAAK,IAAIF,EAAI,OAAOH,GAAM,CAAC;AAClC,IAAAG,EAAI,OAAOD,GAAQ,GAAGG,CAAK,GACtBb,EAAUW,CAAG,GAClBL,EAAO,UAAU,CAACA,EAAO;AACzB,UAAMzC,IAAOhC,EAAE,gDAAgD;AAAA,MAC7D,OAAOkE,EAAUS,CAAI,EAAE;AAAA,MACvB,IAAIE,IAAS;AAAA,MACb,OAAOX,EAAU;AAAA,IAAA,CAClB;AACD,IAAAM,EAAWC,EAAO,UAAUzC,IAAO,GAAGA,CAAI,GAAQ;AAAA,EACpD;AAyEA,SAAO,EAAE,UAvEQ,CAACiD,MAChBd,IACI;AAAA,IACE,WAAW;AAAA,IACX,aAAa,CAACV,MAAkC;AAC9C,MAAAY,EAAcY,CAAK,GACnBxB,EAAM,aAAa,gBAAgB,QAEnCA,EAAM,aAAa,QAAQ,cAAc,OAAOwB,CAAK,CAAC;AAAA,IACxD;AAAA,IACA,WAAW,MAAM;AACf,MAAAZ,EAAc,IAAI,GAClBE,EAAc,IAAI;AAAA,IACpB;AAAA,IACA,YAAY,CAACd,MAAkC;AAC7C,MAAIW,MAAe,SACnBX,EAAM,eAAA,GACNA,EAAM,aAAa,aAAa,QAChCc,EAAcU,CAAK;AAAA,IACrB;AAAA,IACA,aAAa,MAAMV,EAAc,IAAI;AAAA,IACrC,QAAQ,CAACd,MAAkC;AACzC,MAAAA,EAAM,eAAA;AACN,YAAMyB,IAASd;AACf,MAAAC,EAAc,IAAI,GAClBE,EAAc,IAAI,GACdW,MAAW,QAAMR,EAAKQ,GAAQD,CAAK;AAAA,IACzC;AAAA,EAAA,IAEF,CAAA,GA0Ca,UAxCF,CAACA,MAChBlB,GAAgB;AAAA,IACd,UAAUK,MAAea;AAAA,IACzB,YAAYX,MAAeW,KAASb,MAAea;AAAA,EAAA,CACpD,GAoC0B,QAlCd,CAACA,GAAeE,MAC7B,gBAAArC;AAAA,IAACS;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,QAAO;AAAA,MACP,MAAM,gBAAAT,EAACsC,IAAA,EAAa,eAAY,OAAA,CAAO;AAAA,MACvC,cAAYpF,EAAE,8CAA8C;AAAA,QAC1D,OAAOmF;AAAA,MAAA,CACR;AAAA,MACD,WAAU;AAAA,MACV,WAAW,CAAC1B,MAA4C;AACtD,YAAI,CAACA,EAAM,OAAQ;AACnB,cAAMmB,IACJnB,EAAM,QAAQ,YACVwB,IAAQ,IACRxB,EAAM,QAAQ,cACZwB,IAAQ,IACRxB,EAAM,QAAQ,SACZ,IACAA,EAAM,QAAQ,QACZS,EAAU,SAAS,IACnB;AACZ,QAAIU,MAAO,SACXnB,EAAM,eAAA,GACNiB,EAAKO,GAAOL,CAAE;AAAA,MAChB;AAAA,IAAA;AAAA,EAAA,GAUiC,8BALlC,QAAA,EAAK,MAAK,UAAS,aAAU,UAAS,WAAU,cAC9C,UAAA/F,EAAA,CACH,EAGmC;AACvC;AA2BA,MAAMwG,IAAwB;AAAA,EAC5B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,WAAW;AACb;AAGO,SAASC,GAAkB;AAAA,EAChC,MAAApF;AAAA,EACA,cAAAqF;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,WAAAtB;AAAA,EACA,gBAAAuB;AAAA,EACA,kBAAAC;AAAA,EACA,oBAAAC;AACF,GAA8C;AAC5C,QAAM,EAAE,EAAA,IAAM1F,EAAe,IAAI,GAC3B2F,IAAU3B,GAAWC,GAAWyB,CAAkB,GAClD,CAACE,GAAMC,CAAO,IAAItF,EAA2B,IAAI,GACjD,CAACuF,GAAQC,CAAS,IAAIxF,EAAS,EAAK,GACpC,CAACyF,GAAYC,CAAa,IAAI1F,EAAS,EAAK,GAC5C,CAAC2F,GAAeC,CAAgB,IAAI5F,EAA4B,IAAI,GACpE,CAAC6F,GAAUC,CAAW,IAAI9F,EAAS,EAAK,GACxC,CAAC+F,GAAcC,CAAe,IAAIhG,EAAS,EAAK,GAIhDiG,IAAgB,YAAY;AAChC,QAAI,GAACN,KAAiBE,IACtB;AAAA,MAAAC,EAAY,EAAI,GAChBE,EAAgB,EAAK;AACrB,UAAI;AACF,eAAMd,KAAA,gBAAAA,EAAmBS,EAAc,MACvCC,EAAiB,IAAI;AAAA,MACvB,QAAQ;AACN,QAAAI,EAAgB,EAAI;AAAA,MACtB,UAAA;AACE,QAAAF,EAAY,EAAK;AAAA,MACnB;AAAA;AAAA,EACF;AAEA,EAAAnE,EAAU,MAAM;AACd,IAAIjC,MACFgG,EAAc,EAAK,GACnBJ,EAAQN,MAAgB,WAAW,EAAE,GAAGH,EAAA,IAAe,IAAI;AAAA,EAI/D,GAAG,CAACnF,CAAI,CAAC;AAET,QAAMwG,IAAY,CAACvB,GAAcwB,MAC/BzC,EAAU;AAAA,IACR,CAACa,MAAQA,EAAI,OAAO4B,KAAM5B,EAAI,KAAK,kBAAkBI,EAAK,YAAA;AAAA,EAAY,GAGpEyB,KAAa,MAAM;AACvB,QAAI,EAACf,KAAA,QAAAA,EAAM,WAAW;AACtB,UAAMV,IAAOU,EAAK,KAAK,KAAA;AACvB,WAAKV,IACEuB,EAAUvB,GAAMU,EAAK,EAAE,IAC1B,EAAE,wCAAwC,IAC1C,SAHc,EAAE,2CAA2C;AAAA,EAIjE,GAAA,GACMgB,IACJhB,KAAA,QAAAA,EAAM,aAAa,CAACA,EAAK,OAAO,SAC5B,EAAE,6CAA6C,IAC/C,QAEAiB,IAAO,YAAY;AACvB,QAAI,CAACjB,KAAQE,EAAQ;AACrB,UAAMgB,IAAO,EAAE,GAAGlB,GAAM,WAAW,GAAA;AACnC,IAAAC,EAAQiB,CAAI;AACZ,UAAM5B,IAAO4B,EAAK,KAAK,KAAA,GACjBzG,IAASyG,EAAK,OAAO,KAAA;AAC3B,QAAI,GAAC5B,KAAQ,CAAC7E,KAAUoG,EAAUvB,GAAM4B,EAAK,EAAE,IAC/C;AAAA,MAAAf,EAAU,EAAI,GACdE,EAAc,EAAK;AACnB,UAAI;AACF,cAAMT,EAAe;AAAA,UACnB,IAAIsB,EAAK;AAAA,UACT,MAAA5B;AAAA,UACA,aAAa4B,EAAK,YAAY,KAAA,KAAU;AAAA,UACxC,QAAAzG;AAAA,QAAA,CACD,GACDwF,EAAQ,IAAI;AAAA,MACd,QAAQ;AACN,QAAAI,EAAc,EAAI;AAAA,MACpB,UAAA;AACE,QAAAF,EAAU,EAAK;AAAA,MACjB;AAAA;AAAA,EACF,GAEMgB,IAAQnB,IACVA,EAAK,KACH,EAAE,uCAAuC,IACzC,EAAE,sCAAsC,IAC1C,EAAE,oCAAoC;AAE1C,SACE,gBAAA7C,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAH,EAACmE,GAAA,EAAO,MAAA/G,GAAY,cAAAqF,GAClB,UAAA,gBAAAzC,EAACmE,EAAO,SAAP,EAAe,MAAK,MACnB,UAAA,gBAAAjE,EAAC,OAAA,EAAI,WAAU,eAAc,kBAAe,uBAC1C,UAAA;AAAA,MAAA,gBAAAA,EAACiE,EAAO,QAAP,EACC,UAAA;AAAA,QAAA,gBAAAnE,EAACmE,EAAO,OAAP,EAAc,UAAAD,EAAA,CAAM;AAAA,0BACpBC,EAAO,aAAP,EACE,UAAA,EAAE,0CAA0C,EAAA,CAC/C;AAAA,MAAA,GACF;AAAA,MACA,gBAAAjE,EAACiE,EAAO,MAAP,EACE,UAAA;AAAA,QAAApB,IACC,gBAAA7C,EAAC,OAAA,EAAI,WAAU,kDACZ,UAAA;AAAA,UAAAiD,sBACEiB,GAAA,EAAM,SAAQ,SACZ,UAAA,EAAE,wCAAwC,GAC7C,IACE;AAAA,UACJ,gBAAApE;AAAA,YAACqE;AAAA,YAAA;AAAA,cACC,OAAO,EAAE,mCAAmC;AAAA,cAC5C,OAAOP;AAAA,cACP,UAAQ;AAAA,cAER,UAAA,gBAAA9D;AAAA,gBAACsE;AAAA,gBAAA;AAAA,kBACC,OAAOvB,EAAK;AAAA,kBACZ,WAAW;AAAA,kBACX,aAAa;AAAA,oBACX;AAAA,kBAAA;AAAA,kBAEF,UAAU,CAACpC,MACTqC,EAAQ,EAAE,GAAGD,GAAM,MAAMpC,EAAM,OAAO,MAAA,CAAO;AAAA,gBAAA;AAAA,cAAA;AAAA,YAEjD;AAAA,UAAA;AAAA,UAEF,gBAAAX;AAAA,YAACqE;AAAA,YAAA;AAAA,cACC,OAAO,EAAE,wCAAwC;AAAA,cACjD,aAAa,EAAE,uCAAuC;AAAA,cACtD,UAAQ;AAAA,cAER,UAAA,gBAAArE;AAAA,gBAACsE;AAAA,gBAAA;AAAA,kBACC,OAAOvB,EAAK;AAAA,kBACZ,WAAW;AAAA,kBACX,UAAU,CAACpC,MACTqC,EAAQ,EAAE,GAAGD,GAAM,aAAapC,EAAM,OAAO,MAAA,CAAO;AAAA,gBAAA;AAAA,cAAA;AAAA,YAExD;AAAA,UAAA;AAAA,UAEF,gBAAAX;AAAA,YAACqE;AAAA,YAAA;AAAA,cACC,OAAO,EAAE,qCAAqC;AAAA,cAC9C,aAAa;AAAA,gBACX;AAAA,cAAA;AAAA,cAEF,OAAON;AAAA,cACP,UAAQ;AAAA,cAER,UAAA,gBAAA/D;AAAA,gBAACU;AAAA,gBAAA;AAAA,kBACC,OAAOqC,EAAK;AAAA,kBACZ,WAAW;AAAA,kBACX,YAAU;AAAA,kBACV,SAAS;AAAA,kBACT,SAAS;AAAA,kBACT,UAAU,CAACpC,MACTqC,EAAQ,EAAE,GAAGD,GAAM,QAAQpC,EAAM,OAAO,MAAA,CAAO;AAAA,gBAAA;AAAA,cAAA;AAAA,YAEnD;AAAA,UAAA;AAAA,QACF,EAAA,CACF,IACES,EAAU,WAAW,IACvB,gBAAApB;AAAA,UAACuE;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,OAAO,EAAE,yCAAyC;AAAA,YAClD,aAAa;AAAA,cACX;AAAA,YAAA;AAAA,YAEF,eAAe;AAAA,cACb,OAAO,EAAE,kCAAkC;AAAA,cAC3C,SAAS,MAAMvB,EAAQ,EAAE,GAAGT,GAAY;AAAA,YAAA;AAAA,UAC1C;AAAA,QAAA,IAGF,gBAAAvC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,cAAY,EAAE,wCAAwC;AAAA,YACtD,WAAU;AAAA,YAET,UAAAoB,EAAU,IAAI,CAACa,GAAKE,MACnB,gBAAAjC;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEE,GAAG4C,EAAQ,SAASX,CAAK;AAAA,gBAC1B,WAAW,sJAAsJW,EAAQ,SAASX,CAAK,CAAC;AAAA,gBAEvL,UAAA;AAAA,kBAAAU,IACGC,EAAQ,OAAOX,GAAOF,EAAI,IAAI,IAC9B;AAAA,kBACJ,gBAAA/B,EAAC,OAAA,EAAI,WAAU,wEACb,UAAA;AAAA,oBAAA,gBAAAF,EAAC,OAAA,EAAI,WAAU,mEACb,UAAA,gBAAAA,EAAC,UAAK,WAAU,qDACb,UAAAiC,EAAI,KAAA,CACP,EAAA,CACF;AAAA,oBACA,gBAAAjC,EAAC,OAAE,WAAW,GAAG7D,CAAS,oBACvB,UAAA8F,EAAI,eAAeA,EAAI,OAAA,CAC1B;AAAA,kBAAA,GACF;AAAA,kBACA,gBAAAjC;AAAA,oBAACS;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,wBAAO+D,IAAA,EAAO;AAAA,sBACd,cAAY,EAAE,qCAAqC;AAAA,wBACjD,MAAMvC,EAAI;AAAA,sBAAA,CACX;AAAA,sBACD,SAAS,MACPe,EAAQ;AAAA,wBACN,IAAIf,EAAI;AAAA,wBACR,MAAMA,EAAI;AAAA,wBACV,aAAaA,EAAI,eAAe;AAAA,wBAChC,QAAQA,EAAI;AAAA,wBACZ,WAAW;AAAA,sBAAA,CACZ;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAGJW,IACC,gBAAA5C;AAAA,oBAACS;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,wBAAOgE,IAAA,EAAO;AAAA,sBACd,cAAY,EAAE,uCAAuC;AAAA,wBACnD,MAAMxC,EAAI;AAAA,sBAAA,CACX;AAAA,sBACD,SAAS,MAAMqB,EAAiBrB,CAAG;AAAA,oBAAA;AAAA,kBAAA,IAEnC;AAAA,gBAAA;AAAA,cAAA;AAAA,cA5CCA,EAAI;AAAA,YAAA,CA8CZ;AAAA,UAAA;AAAA,QAAA;AAAA,QAGJa,EAAQ;AAAA,MAAA,GACX;AAAA,MACA,gBAAA9C,EAACmE,EAAO,QAAP,EACE,cACC,gBAAAjE,EAAAC,GAAA,EACE,UAAA;AAAA,QAAA,gBAAAH,EAACK,GAAA,EAAO,QAAO,aAAY,SAAS,MAAM2C,EAAQ,IAAI,GACnD,UAAA,EAAE,qCAAqC,EAAA,CAC1C;AAAA,QACA,gBAAAhD;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,QAAO;AAAA,YACP,SAAS4C;AAAA,YACT,SAAS,MAAM,KAAKe,EAAA;AAAA,YAEnB,YAAE,mCAAmC;AAAA,UAAA;AAAA,QAAA;AAAA,MACxC,EAAA,CACF,IAEA,gBAAA9D,EAAAC,GAAA,EACG,UAAA;AAAA,QAAAiB,EAAU,SAAS,IAClB,gBAAApB;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,QAAO;AAAA,YACP,6BAAYqE,IAAA,EAAK;AAAA,YACjB,SAAS,MAAM1B,EAAQ,EAAE,GAAGT,GAAY;AAAA,YAEvC,YAAE,kCAAkC;AAAA,UAAA;AAAA,QAAA,IAErC;AAAA,QACJ,gBAAAvC,EAACmE,EAAO,OAAP,EAAa,SAAO,IACnB,UAAA,gBAAAnE,EAACK,GAAA,EAAO,QAAO,WACZ,UAAA,EAAE,mCAAmC,GACxC,EAAA,CACF;AAAA,MAAA,EAAA,CACF,EAAA,CAEJ;AAAA,IAAA,EAAA,CACF,GACF,GACF;AAAA,IACA,gBAAAL;AAAA,MAACmE;AAAA,MAAA;AAAA,QACC,MAAMd,KAAiB;AAAA,QACvB,cAAc,CAACY,MAAS;AACtB,UAAI,CAACA,KAAQ,CAACV,MACZD,EAAiB,IAAI,GACrBI,EAAgB,EAAK;AAAA,QAEzB;AAAA,QAEA,4BAACS,EAAO,SAAP,EAAe,MAAK,MAAK,SAAQ,SAChC,UAAA;AAAA,UAAA,gBAAAjE,EAACiE,EAAO,QAAP,EACC,UAAA;AAAA,YAAA,gBAAAnE,EAACmE,EAAO,OAAP,EACE,UAAA,EAAE,4CAA4C;AAAA,cAC7C,OAAMd,KAAA,gBAAAA,EAAe,SAAQ;AAAA,YAAA,CAC9B,GACH;AAAA,8BACCc,EAAO,aAAP,EACE,UAAA,EAAE,gDAAgD,EAAA,CACrD;AAAA,UAAA,GACF;AAAA,UACCV,IACC,gBAAAzD,EAACmE,EAAO,MAAP,EACC,UAAA,gBAAAnE,EAACoE,GAAA,EAAM,SAAQ,SACZ,UAAA,EAAE,0CAA0C,EAAA,CAC/C,GACF,IACE;AAAA,UACJ,gBAAAlE,EAACiE,EAAO,QAAP,EACC,UAAA;AAAA,YAAA,gBAAAnE,EAACmE,EAAO,OAAP,EAAa,SAAO,IACnB,UAAA,gBAAAnE,EAACK,GAAA,EAAO,QAAO,aAAY,UAAUkD,GAClC,UAAA,EAAE,qCAAqC,GAC1C,GACF;AAAA,YACA,gBAAAvD;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,QAAO;AAAA,gBACP,SAASkD;AAAA,gBACT,SAAS,MAAM,KAAKI,EAAA;AAAA,gBAEnB,YAAE,4CAA4C;AAAA,cAAA;AAAA,YAAA;AAAA,UACjD,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AAcO,SAASgB,GAAsB;AAAA,EACpC,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AACF,GAAyD;AACvD,QAAM,EAAE,GAAA5H,EAAA,IAAMC,EAAe,IAAI,GAC3B4H,IAAU3G,EAA0B,IAAI;AAI9C,MAHAiB,EAAU,MAAM;;AACd,IAAIuF,OAAS7F,IAAAgG,EAAQ,YAAR,QAAAhG,EAAiB;AAAA,EAChC,GAAG,CAAC6F,CAAO,CAAC,GACR,EAACA,KAAA,QAAAA,EAAS,UAAU,QAAO;AAC/B,QAAMvC,IAAOuC,EAAQ,SAAS;AAC9B,SACE,gBAAA5E;AAAA,IAACoE;AAAA,IAAA;AAAA,MACC,SAAQ;AAAA,MACR,aAAW;AAAA,MACX,cAAc,CAACY,MAAW;AACxB,QAAKA,KAAQF,EAAA;AAAA,MACf;AAAA,MACA,kBAAe;AAAA,MAEf,UAAA,gBAAA5E,EAAC,OAAA,EAAI,WAAU,mEACb,UAAA;AAAA,QAAA,gBAAAF,EAAC,QAAA,EACE,UAAA4E,EAAQ,SAAS,UACd1H,EAAE,wCAAwC,EAAE,MAAAmF,EAAA,CAAM,IAClDnF,EAAE,sCAAsC,EAAE,MAAAmF,EAAA,CAAM,GACtD;AAAA,QACA,gBAAArC,EAACK,GAAA,EAAO,KAAK0E,GAAS,QAAO,WAAU,MAAK,MAAK,SAASF,GACvD,UAAA3H,EAAE,gCAAgC,EAAA,CACrC;AAAA,MAAA,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;AA2DO,SAAS+H,GAAwB;AAAA,EACtC,WAAA7D;AAAA,EACA,YAAAvE;AAAA,EACA,gBAAA8F;AAAA,EACA,kBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,SAAA9F;AAAA,EACA,iBAAAC;AAAA,EACA,WAAAF;AAAA,EACA,eAAAoI;AACF,GAAkE;AAChE,QAAM,CAACC,GAASC,CAAU,IAAI1H,EAG3B,EAAE,MAAM,IAAO,MAAM,QAAQ,GAC1B,CAACkH,GAASS,CAAU,IAAI3H,EAAoC,IAAI,GAChE4H,IAAcxG;AAAA,IAClB,CAACyG,IAA0B,WAAWH,EAAW,EAAE,MAAM,IAAM,MAAAG,GAAM;AAAA,IACrE,CAAA;AAAA,EAAC,GAGGC,IAAoB1G;AAAA,IACxB,CAAClC,MACC,gBAAAoD;AAAA,MAACrD;AAAA,MAAA;AAAA,QACC,SAAAC;AAAA,QACA,YAAAC;AAAA,QACA,SAAAE;AAAA,QACA,iBAAAC;AAAA,QACA,cAAcmI,EAAQ;AAAA,QACtB,WAAArI;AAAA,MAAA;AAAA,IAAA;AAAA,IAGJ,CAACD,GAAYE,GAASC,GAAiBmI,EAAQ,MAAMrI,CAAS;AAAA,EAAA,GAK1D2I,IAAcC,EAAmC,MAAM;AAC3D,UAAMC,IAAO,IAAI,IAAIvE,EAAU,IAAI,CAACa,MAAQ,CAACA,EAAI,IAAIA,CAAG,CAAC,CAAC;AAC1D,WAAO;AAAA,MACL,WAAAb;AAAA,MACA,OAAO,CAAC,EAAE,UAAAwE,GAAU,MAAA1G,GAAM,OAAA2G,GAAO,QAAAC,QAA8B;AAC7D,cAAMC,IAAOJ,EAAK,IAAIC,EAAS,EAAE;AACjC,eAAKG,IACElJ,EAAW;AAAA,UAChB,UAAUkJ;AAAA,UACV,QAAQ;AAAA,UACR,YAAY7G;AAAA,UACZ,OAAA2G;AAAA,UACA,QAAAC;AAAA,QAAA,CACD,IAPiB,QAAQ,OAAO,IAAI,MAAM,kBAAkB,CAAC;AAAA,MAQhE;AAAA,MACA,UAAUnD,IAAiB2C,IAAc;AAAA,IAAA;AAAA,EAE7C,GAAG,CAAClE,GAAWvE,GAAY8F,GAAgB2C,CAAW,CAAC,GAEjDU,IAAclH;AAAA,IAClB,CAAC6B,MAAyC;AACxC,UAAIA,EAAM,WAAW,cAAc,CAACA,EAAM,SAAU;AACpD,YAAMiF,IAAWxE,EAAU,KAAK,CAACa;;AAAQ,eAAAA,EAAI,SAAOlD,IAAA4B,EAAM,aAAN,gBAAA5B,EAAgB;AAAA,OAAE,GAChEkH,IAA6B;AAAA,QACjC,MAAM;AAAA,QACN,UAAAL;AAAA,QACA,cAAcjF,EAAM;AAAA,QACpB,MAAMA,EAAM;AAAA,MAAA;AAEd,MAAA0E,EAAWO,IAAWK,IAAS,IAAI,GACnCnJ,KAAA,QAAAA,EAAYmJ;AAAA,IACd;AAAA,IACA,CAAC7E,GAAWtE,CAAS;AAAA,EAAA,GAGjBoJ,IAAcR;AAAA,IAClB,MACE/C,IACE,gBAAA3C;AAAA,MAACwC;AAAA,MAAA;AAAA,QACC,MAAM2C,EAAQ;AAAA,QACd,aAAaA,EAAQ;AAAA,QACrB,cAAc,CAACH,MAAWI,EAAW,CAACe,OAAO,EAAE,GAAGA,GAAG,MAAMnB,EAAA,EAAS;AAAA,QACpE,WAAA5D;AAAA,QACA,gBAAAuB;AAAA,QACA,kBAAAC;AAAA,QACA,oBAAAC;AAAA,MAAA;AAAA,IAAA,IAEA;AAAA,IACN,CAACsC,GAAS/D,GAAWuB,GAAgBC,GAAkBC,CAAkB;AAAA,EAAA,GAGrEuD,IACJ,gBAAApG;AAAA,IAAC2E;AAAA,IAAA;AAAA,MACC,SAAAC;AAAA,MACA,QAAQ,MAAM;AACZ,QAAAA,KAAA,QAAAA,EAAS,QACTS,EAAW,IAAI;AAAA,MACjB;AAAA,MACA,WAAW,MAAMA,EAAW,IAAI;AAAA,IAAA;AAAA,EAAA,GAI9BgB,IAAcX;AAAA,IAClB,OAAO;AAAA,MACL,mBAAAF;AAAA,MACA,aAAAC;AAAA,MACA,aAAAO;AAAA,MACA,iBAAiBd;AAAA,IAAA;AAAA,IAEnB,CAACM,GAAmBC,GAAaO,GAAad,CAAa;AAAA,EAAA;AAG7D,SAAO;AAAA,IACL,GAAGmB;AAAA,IACH,aAAAA;AAAA,IACA,SAASH;AAAA,IACT,YAAAE;AAAA,IACA,aAAAd;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"help-me-write-templates-ra5a__Yy.js","sources":["../../src/patterns/help-me-write-templates/help-me-write-templates.tsx"],"sourcesContent":["/**\n * Help me write templates (HTP-6383) — practice-shared AI templates in the\n * RichTextEditor.\n *\n * Runtime pattern: real consuming apps mount this in production (surfaced via\n * `src/patterns/index.ts` and the `./patterns/help-me-write-templates`\n * subpath). Templates are an AI action of the editor itself, next to\n * spelling and auto-format: a Templates segment in the AI pill and in the\n * selection bubble (`aiTemplates`). Picking one rewrites the selection, else\n * the whole note, then this pattern offers Undo. The editor keeps the\n * patient AI-consent gate and resume-after-grant for all of it.\n *\n * Parts, usable on their own or wired together by `useHelpMeWriteTemplates`:\n * - `HelpMeWriteTemplatesBar` — the Help-me-write bar (`renderHelpMeWrite`):\n * a free prompt with an optional mic, the draft and Insert.\n * - `AiTemplateManager` — the dialog to list, create, edit, delete and\n * reorder templates.\n * - `AiCreditsExhaustedNotice`: the out-of-credits state the bar shows when\n * an AI call rejects with `AiCreditsExhaustedError`, from the bar or the\n * pill. It lives in `src/components/ai-credits-notice/` (shared with\n * VoiceControlPanel) and is re-exported here, with `AiCreditsInfo`.\n * - `HelpMeWriteUndoNotice` — the success notice with Undo after a template\n * rewrote the note.\n *\n * The host owns the templates (list + persistence) and the AI call. The kit\n * never talks to a backend.\n */\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type DragEvent,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\nimport {\n GripVertical,\n Mic,\n Pencil,\n Plus,\n RotateCcw,\n Send,\n Square,\n Trash2,\n X,\n} from 'lucide-react';\n\nimport { Alert } from '../../components/alert';\nimport {\n AiCreditsExhaustedNotice,\n type AiCreditsInfo,\n} from '../../components/ai-credits-notice';\nimport { Button, IconButton } from '../../components/button';\nimport { Dialog } from '../../components/dialog';\nimport { EditorOverlay } from '../../components/editor-overlay';\nimport { EmptyState } from '../../components/empty-state';\nimport { FormField } from '../../components/form-field';\nimport type {\n HelpMeWriteRenderContext,\n RichTextEditorAiApplied,\n RichTextEditorAiTemplates,\n RichTextEditorProps,\n} from '../../components/rich-text-editor';\nimport { Spinner } from '../../components/spinner';\nimport { TextArea } from '../../components/text-area';\nimport { StateBackedTextInput } from '../../components/_shared/state-backed-text-input';\nimport { SafeHtml } from '../../components/_shared/safe-html';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/** A practice-shared AI template. */\nexport interface AiTemplate {\n id: string;\n /** Up to 100 characters, unique within the practice. */\n name: string;\n /** One line under the name in the Templates menu. */\n description?: string;\n /** The instructions sent to the AI, up to 4000 characters. */\n prompt: string;\n /**\n * @deprecated The list order is the menu order: the first template is the\n * one most people use. Ignored; reorder with `onReorderTemplates`.\n */\n isDefault?: boolean;\n}\n\n/** What the manager hands `onSaveTemplate`: `id` is absent for a new one. */\nexport type AiTemplateDraft = Omit<AiTemplate, 'id'> & { id?: string };\n\n/** One Help-me-write request. `template` is absent for a free prompt. */\nexport interface HelpMeWriteRequest {\n template?: AiTemplate;\n /** The free prompt, or extra instructions for a template. May be ''. */\n prompt: string;\n /**\n * The context, as plain text. For a template, the text it rewrites. For\n * the free prompt, what the draft is about. From the AI pill it is the\n * whole note; from the selection bubble, the selected text.\n */\n sourceText: string;\n /** Where `sourceText` came from. */\n scope?: 'document' | 'selection';\n signal: AbortSignal;\n}\n\n/**\n * Throw (or reject with) this from `onGenerate` when the practice is out of\n * AI credits (the platform endpoint's 402), and the bar shows the\n * out-of-credits notice instead of a generic error.\n */\nexport class AiCreditsExhaustedError extends Error {\n constructor(message = 'AI credits exhausted') {\n super(message);\n this.name = 'AiCreditsExhaustedError';\n }\n}\n\n// The out-of-credits notice and its info type moved to the component layer\n// (`src/components/ai-credits-notice/`) so VoiceControlPanel can share them.\n// Re-exported here so every existing import keeps working.\nexport {\n AiCreditsExhaustedNotice,\n type AiCreditsExhaustedNoticeProps,\n type AiCreditsInfo,\n} from '../../components/ai-credits-notice';\n\nexport type HelpMeWriteApplyMode = 'replace' | 'below' | 'insert';\n\n/** Fired after a draft lands in the editor. */\nexport interface HelpMeWriteApplied {\n mode: HelpMeWriteApplyMode;\n template?: AiTemplate;\n /** The editor's HTML before the change. */\n previousHtml: string;\n /** Puts `previousHtml` back in the editor (what Undo does). */\n undo: () => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Shared classes */\n/* ------------------------------------------------------------------ */\n\n// Match the composer's input height (--min-target-size), like the kit bar.\nconst ACTION_SIZE = 'ds:!size-[var(--min-target-size)]';\nconst BRAND_ACTION = `${ACTION_SIZE} ds:bg-[image:var(--gradient-brand)] ds:rounded-full`;\n// The recording mic goes solid destructive, as in the kit's own bar.\nconst RECORDING_MIC =\n 'ds:aria-pressed:!bg-[var(--destructive)] ds:aria-pressed:!text-[var(--destructive-foreground)]';\nconst metaClass =\n 'ds:m-0 ds:text-[length:var(--font-size-sm)] ds:text-[color:var(--muted-foreground)]';\nconst eyebrowClass =\n 'type-eyebrow ds:m-0 ds:text-[color:var(--muted-foreground)]';\nconst previewClass = [\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--border)]',\n 'ds:bg-[color-mix(in_srgb,var(--background)_70%,transparent)]',\n 'ds:p-[var(--spacing-sm)] ds:[max-block-size:14rem] ds:overflow-y-auto',\n 'ds:text-[length:var(--font-size-sm)] ds:text-[color:var(--foreground)]',\n 'ds:[&_ul]:list-disc ds:[&_ul]:ps-[var(--spacing-md)]',\n 'ds:[&_h3]:font-medium ds:[&_h3]:[margin-block-start:var(--spacing-xs)]',\n 'ds:[&_p]:[margin-block-end:var(--spacing-xs)]',\n 'ds:[&>:first-child]:[margin-block-start:0]',\n].join(' ');\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\n// Join dictated text onto the prompt with a single space.\nfunction joinWith(base: string, extra: string): string {\n if (!extra) return base;\n if (!base) return extra;\n return /\\s$/.test(base) ? `${base}${extra}` : `${base} ${extra}`;\n}\n\nfunction isAbort(err: unknown): boolean {\n return (\n typeof err === 'object' &&\n err !== null &&\n 'name' in err &&\n (err as { name?: string }).name === 'AbortError'\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* HelpMeWriteTemplatesBar */\n/* ------------------------------------------------------------------ */\n\nexport interface HelpMeWriteTemplatesBarProps {\n /** What `RichTextEditor`'s `renderHelpMeWrite` hands its host. */\n context: HelpMeWriteRenderContext;\n /**\n * @deprecated Templates run from the editor's AI pill (`aiTemplates`),\n * not from this bar. Ignored.\n */\n templates?: AiTemplate[];\n /** The AI call. Reject with `AiCreditsExhaustedError` when out of credits. */\n onGenerate: (request: HelpMeWriteRequest) => Promise<string>;\n /** @deprecated The manager opens from the pill's Templates menu. Ignored. */\n onManageTemplates?: (mode: 'list' | 'create') => void;\n /** After a draft lands. */\n onApplied?: (applied: HelpMeWriteApplied) => void;\n /** Shown in the out-of-credits notice. */\n credits?: AiCreditsInfo;\n /** Show the mic in the prompt when the editor has `onDictate`. Default true. */\n enableDictation?: boolean;\n /** Ignore Escape (e.g. while the manager dialog above it is open). */\n suspendClose?: boolean;\n}\n\n/**\n * The Help-me-write bar, docked in the editor's AI slot: a free prompt with\n * an optional mic, then the draft and Insert. It also shows the\n * out-of-credits notice, including when a pill action ran out.\n */\nexport function HelpMeWriteTemplatesBar({\n context,\n onGenerate,\n onApplied,\n credits,\n enableDictation = true,\n suspendClose = false,\n}: HelpMeWriteTemplatesBarProps): React.JSX.Element {\n const { t } = useTranslation('ui');\n const { open } = context;\n const draftId = useId();\n const errorId = useId();\n const [prompt, setPrompt] = useState('');\n const [loading, setLoading] = useState(false);\n const [errored, setErrored] = useState(false);\n const [outOfCredits, setOutOfCredits] = useState(false);\n const [draft, setDraft] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const onDictate = enableDictation ? context.onDictate : undefined;\n\n /* ---- Mic in the prompt (the editor's own dictation seam) ---- */\n const [isDictating, setIsDictating] = useState(false);\n const [interim, setInterim] = useState('');\n const [announcement, setAnnouncement] = useState('');\n const dictateAbortRef = useRef<AbortController | null>(null);\n const stopDictation = useCallback(() => dictateAbortRef.current?.abort(), []);\n const toggleDictation = useCallback(() => {\n if (isDictating) {\n stopDictation();\n return;\n }\n if (!onDictate) return;\n const controller = new AbortController();\n dictateAbortRef.current = controller;\n setIsDictating(true);\n setAnnouncement(t('helpMeWriteTemplates.bar.listening'));\n onDictate({\n signal: controller.signal,\n onPartialTranscript: (text) => {\n if (!controller.signal.aborted) setInterim(text);\n },\n onFinalTranscript: (text) => {\n if (controller.signal.aborted) return;\n setInterim('');\n const trimmed = text.trim();\n if (trimmed) {\n setPrompt((p) => joinWith(p, trimmed));\n setAnnouncement(trimmed);\n }\n },\n })\n .catch((err: unknown) => {\n // Out of credits shows the notice; other dictation errors are\n // non-fatal (the user can type instead).\n if (err instanceof AiCreditsExhaustedError) setOutOfCredits(true);\n })\n .finally(() => {\n setInterim('');\n if (dictateAbortRef.current === controller) {\n dictateAbortRef.current = null;\n setIsDictating(false);\n setAnnouncement('');\n }\n });\n }, [isDictating, onDictate, stopDictation, t]);\n\n // Each open starts fresh.\n useEffect(() => {\n if (open) {\n setPrompt('');\n setLoading(false);\n setErrored(false);\n // Opened because an AI call ran out of credits: start on the notice.\n setOutOfCredits(context.creditsExhausted);\n setDraft(null);\n } else {\n abortRef.current?.abort();\n dictateAbortRef.current?.abort();\n }\n // Only on open/close; `context` is a fresh object every editor render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n useEffect(\n () => () => {\n abortRef.current?.abort();\n dictateAbortRef.current?.abort();\n },\n [],\n );\n\n const run = useCallback(() => {\n if (loading || !prompt.trim()) return;\n stopDictation();\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n setErrored(false);\n setLoading(true);\n const onSelection = context.scope === 'selection';\n onGenerate({\n prompt: prompt.trim(),\n sourceText: onSelection ? context.selectionText : context.getText(),\n scope: onSelection ? 'selection' : 'document',\n signal: controller.signal,\n })\n .then((result) => {\n if (controller.signal.aborted) return;\n setDraft(result);\n setLoading(false);\n })\n .catch((err: unknown) => {\n if (controller.signal.aborted || isAbort(err)) return;\n if (err instanceof AiCreditsExhaustedError) setOutOfCredits(true);\n else setErrored(true);\n setLoading(false);\n });\n // `context` is a fresh object every editor render; read it at call time.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loading, prompt, onGenerate, stopDictation]);\n\n const { onClose: contextClose } = context;\n const close = useCallback(() => {\n if (suspendClose) return;\n contextClose();\n }, [suspendClose, contextClose]);\n\n const insert = () => {\n if (draft === null) return;\n const previousHtml = context.getHTML();\n context.insertAtSelection(draft);\n context.onClose();\n const { setContent } = context;\n onApplied?.({\n mode: context.scope === 'selection' ? 'replace' : 'insert',\n previousHtml,\n undo: () => setContent(previousHtml),\n });\n };\n\n let body: ReactNode;\n if (outOfCredits) {\n body = (\n <AiCreditsExhaustedNotice\n credits={credits}\n onBack={() => setOutOfCredits(false)}\n footnote={t('helpMeWriteTemplates.credits.kept')}\n />\n );\n } else if (draft !== null) {\n body = (\n <>\n <section\n aria-labelledby={draftId}\n className=\"ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-2xs)]\"\n >\n <h2 id={draftId} className={eyebrowClass}>\n {t('helpMeWriteTemplates.bar.after')}\n </h2>\n <SafeHtml\n html={draft}\n profile=\"rich-text\"\n className={previewClass}\n tabIndex={0}\n />\n </section>\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Button intent=\"ghost\" startIcon={<X />} onClick={context.onClose}>\n {t('helpMeWriteTemplates.bar.discard')}\n </Button>\n <Button\n intent=\"ghost\"\n startIcon={<RotateCcw />}\n onClick={() => {\n setDraft(null);\n run();\n }}\n >\n {t('helpMeWriteTemplates.bar.retry')}\n </Button>\n <span className=\"ds:flex-1\" aria-hidden=\"true\" />\n <Button intent=\"primary\" onClick={insert}>\n {context.scope === 'selection'\n ? t('helpMeWriteTemplates.bar.replace')\n : t('helpMeWriteTemplates.bar.insert')}\n </Button>\n </div>\n </>\n );\n } else {\n // While dictating the field shows the committed prompt plus live interim\n // text, read-only so the stream is not fought over by typing.\n const fieldValue = isDictating ? joinWith(prompt, interim) : prompt;\n body = (\n <>\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <IconButton\n size=\"md\"\n intent=\"outline\"\n className={ACTION_SIZE}\n icon={<X />}\n aria-label={t('helpMeWriteTemplates.bar.close')}\n onClick={context.onClose}\n />\n <div className=\"ds:min-w-0 ds:flex-1\">\n <TextArea\n size=\"md\"\n value={fieldValue}\n onChange={(event) => setPrompt(event.target.value)}\n placeholder={t('editor.ai.promptPlaceholder')}\n aria-label={t('editor.ai.promptLabel')}\n autoResize\n minRows={1}\n maxRows={3}\n readOnly={loading || isDictating}\n tone={errored ? 'error' : 'default'}\n aria-describedby={errored ? errorId : undefined}\n />\n </div>\n {onDictate ? (\n <IconButton\n size=\"md\"\n intent=\"outline\"\n className={\n isDictating ? `${ACTION_SIZE} ${RECORDING_MIC}` : ACTION_SIZE\n }\n icon={\n isDictating ? <Square className=\"ds:fill-current\" /> : <Mic />\n }\n aria-pressed={isDictating}\n aria-label={\n isDictating\n ? t('helpMeWriteTemplates.bar.dictateStop')\n : t('helpMeWriteTemplates.bar.dictateStart')\n }\n disabled={loading}\n onClick={toggleDictation}\n />\n ) : null}\n <IconButton\n size=\"md\"\n intent=\"primary\"\n className={BRAND_ACTION}\n icon={loading ? <Spinner size=\"sm\" variant=\"pulse\" /> : <Send />}\n disabled={loading || !prompt.trim()}\n aria-busy={loading || undefined}\n aria-label={t('helpMeWriteTemplates.bar.write')}\n onClick={run}\n />\n </div>\n {onDictate ? (\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {announcement}\n </p>\n ) : null}\n {errored ? (\n <p id={errorId} role=\"alert\" className={metaClass}>\n {t('helpMeWriteTemplates.bar.error')}\n </p>\n ) : null}\n <p className={metaClass}>\n {context.scope === 'selection'\n ? t('helpMeWriteTemplates.bar.contextSelection')\n : t('helpMeWriteTemplates.bar.contextDocument')}{' '}\n {context.privacyNotice}\n </p>\n </>\n );\n }\n\n return (\n <EditorOverlay\n open={open}\n onClose={close}\n ariaLabel={t('editor.ai.helpMeWrite')}\n >\n <div className=\"ds:contents\" data-component=\"help-me-write-templates-bar\">\n {body}\n </div>\n </EditorOverlay>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* AiTemplateManager */\n/* ------------------------------------------------------------------ */\n\n/* The kit's list-reorder idiom (Sidebar favourites, anamnesis): HTML5 drag\n on the row, a grip handle that also moves with Alt+Arrow / Alt+Home /\n Alt+End, and a polite announcement of every move. Rows are keyed, so the\n moved row's handle keeps focus. */\nconst reorderRowClass = cva('', {\n variants: {\n dragging: { true: 'ds:opacity-60', false: '' },\n dropTarget: {\n true: 'ds:outline-[length:var(--focus-ring-width)] ds:outline-dashed ds:outline-[var(--primary)] ds:outline-offset-[-2px]',\n false: '',\n },\n },\n defaultVariants: { dragging: false, dropTarget: false },\n});\n\nfunction useReorder(\n templates: AiTemplate[],\n onReorder: ((orderedIds: string[]) => void | Promise<void>) | undefined,\n) {\n const { t } = useTranslation('ui');\n const [dragSource, setDragSource] = useState<number | null>(null);\n const [dropTarget, setDropTarget] = useState<number | null>(null);\n const [message, setMessage] = useState('');\n // Toggle an invisible suffix so a repeated move is announced again.\n const toggle = useRef(false);\n\n const move = (from: number, to: number): void => {\n const target = Math.max(0, Math.min(templates.length - 1, to));\n if (!onReorder || target === from) return;\n const ids = templates.map((tpl) => tpl.id);\n const [moved] = ids.splice(from, 1);\n ids.splice(target, 0, moved);\n void onReorder(ids);\n toggle.current = !toggle.current;\n const text = t('helpMeWriteTemplates.manager.reorderAnnounce', {\n label: templates[from].name,\n to: target + 1,\n total: templates.length,\n });\n setMessage(toggle.current ? text : `${text}\\u200b`);\n };\n\n const rowProps = (index: number) =>\n onReorder\n ? {\n draggable: true as const,\n onDragStart: (event: DragEvent<HTMLElement>) => {\n setDragSource(index);\n event.dataTransfer.effectAllowed = 'move';\n // Firefox needs data to start a drag.\n event.dataTransfer.setData('text/plain', String(index));\n },\n onDragEnd: () => {\n setDragSource(null);\n setDropTarget(null);\n },\n onDragOver: (event: DragEvent<HTMLElement>) => {\n if (dragSource === null) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = 'move';\n setDropTarget(index);\n },\n onDragLeave: () => setDropTarget(null),\n onDrop: (event: DragEvent<HTMLElement>) => {\n event.preventDefault();\n const source = dragSource;\n setDragSource(null);\n setDropTarget(null);\n if (source !== null) move(source, index);\n },\n }\n : {};\n\n const rowClass = (index: number): string =>\n reorderRowClass({\n dragging: dragSource === index,\n dropTarget: dropTarget === index && dragSource !== index,\n });\n\n const handle = (index: number, name: string): ReactNode => (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<GripVertical aria-hidden=\"true\" />}\n aria-label={t('helpMeWriteTemplates.manager.reorderHandle', {\n label: name,\n })}\n className=\"ds:cursor-grab ds:active:cursor-grabbing\"\n onKeyDown={(event: KeyboardEvent<HTMLButtonElement>) => {\n if (!event.altKey) return;\n const to =\n event.key === 'ArrowUp'\n ? index - 1\n : event.key === 'ArrowDown'\n ? index + 1\n : event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? templates.length - 1\n : null;\n if (to === null) return;\n event.preventDefault();\n move(index, to);\n }}\n />\n );\n\n const liveRegion = (\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {message}\n </span>\n );\n\n return { rowProps, rowClass, handle, liveRegion };\n}\n\nexport interface AiTemplateManagerProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Open on the list (default) or straight on a new-template form. */\n initialMode?: 'list' | 'create';\n templates: AiTemplate[];\n /** Persist a new (no `id`) or edited template. A rejection keeps the form open. */\n onSaveTemplate: (draft: AiTemplateDraft) => void | Promise<void>;\n /** Omit to hide Delete. */\n onDeleteTemplate?: (id: string) => void | Promise<void>;\n /**\n * Persist a new order (every template id, first to last): the order of\n * the Templates menu. Omit to hide the drag handles.\n */\n onReorderTemplates?: (orderedIds: string[]) => void | Promise<void>;\n}\n\ninterface FormState {\n id?: string;\n name: string;\n description: string;\n prompt: string;\n submitted: boolean;\n}\n\nconst EMPTY_FORM: FormState = {\n name: '',\n description: '',\n prompt: '',\n submitted: false,\n};\n\n/** List, create, edit and delete the practice's templates. */\nexport function AiTemplateManager({\n open,\n onOpenChange,\n initialMode = 'list',\n templates,\n onSaveTemplate,\n onDeleteTemplate,\n onReorderTemplates,\n}: AiTemplateManagerProps): React.JSX.Element {\n const { t } = useTranslation('ui');\n const reorder = useReorder(templates, onReorderTemplates);\n const [form, setForm] = useState<FormState | null>(null);\n const [saving, setSaving] = useState(false);\n const [saveFailed, setSaveFailed] = useState(false);\n const [pendingDelete, setPendingDelete] = useState<AiTemplate | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [deleteFailed, setDeleteFailed] = useState(false);\n\n // Wait for the host: the confirmation stays open (busy) until the delete\n // settles, and shows an error if it fails.\n const confirmDelete = async () => {\n if (!pendingDelete || deleting) return;\n setDeleting(true);\n setDeleteFailed(false);\n try {\n await onDeleteTemplate?.(pendingDelete.id);\n setPendingDelete(null);\n } catch {\n setDeleteFailed(true);\n } finally {\n setDeleting(false);\n }\n };\n\n useEffect(() => {\n if (open) {\n setSaveFailed(false);\n setForm(initialMode === 'create' ? { ...EMPTY_FORM } : null);\n }\n // Only when it opens; `templates` changing mid-edit keeps the form.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n const nameTaken = (name: string, id?: string): boolean =>\n templates.some(\n (tpl) => tpl.id !== id && tpl.name.toLowerCase() === name.toLowerCase(),\n );\n\n const nameError = (() => {\n if (!form?.submitted) return undefined;\n const name = form.name.trim();\n if (!name) return t('helpMeWriteTemplates.manager.nameRequired');\n return nameTaken(name, form.id)\n ? t('helpMeWriteTemplates.manager.nameTaken')\n : undefined;\n })();\n const promptError =\n form?.submitted && !form.prompt.trim()\n ? t('helpMeWriteTemplates.manager.promptRequired')\n : undefined;\n\n const save = async () => {\n if (!form || saving) return;\n const next = { ...form, submitted: true };\n setForm(next);\n const name = next.name.trim();\n const prompt = next.prompt.trim();\n if (!name || !prompt || nameTaken(name, next.id)) return;\n setSaving(true);\n setSaveFailed(false);\n try {\n await onSaveTemplate({\n id: next.id,\n name,\n description: next.description.trim() || undefined,\n prompt,\n });\n setForm(null);\n } catch {\n setSaveFailed(true);\n } finally {\n setSaving(false);\n }\n };\n\n const title = form\n ? form.id\n ? t('helpMeWriteTemplates.manager.formEdit')\n : t('helpMeWriteTemplates.manager.formNew')\n : t('helpMeWriteTemplates.manager.title');\n\n return (\n <>\n <Dialog open={open} onOpenChange={onOpenChange}>\n <Dialog.Content size=\"lg\">\n <div className=\"ds:contents\" data-component=\"ai-template-manager\">\n <Dialog.Header>\n <Dialog.Title>{title}</Dialog.Title>\n <Dialog.Description>\n {t('helpMeWriteTemplates.manager.description')}\n </Dialog.Description>\n </Dialog.Header>\n <Dialog.Body>\n {form ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {saveFailed ? (\n <Alert variant=\"error\">\n {t('helpMeWriteTemplates.manager.saveError')}\n </Alert>\n ) : null}\n <FormField\n label={t('helpMeWriteTemplates.manager.name')}\n error={nameError}\n required\n >\n <StateBackedTextInput\n value={form.name}\n maxLength={100}\n placeholder={t(\n 'helpMeWriteTemplates.manager.namePlaceholder',\n )}\n onChange={(event) =>\n setForm({ ...form, name: event.target.value })\n }\n />\n </FormField>\n <FormField\n label={t('helpMeWriteTemplates.manager.descLabel')}\n description={t('helpMeWriteTemplates.manager.descHint')}\n optional\n >\n <StateBackedTextInput\n value={form.description}\n maxLength={120}\n onChange={(event) =>\n setForm({ ...form, description: event.target.value })\n }\n />\n </FormField>\n <FormField\n label={t('helpMeWriteTemplates.manager.prompt')}\n description={t(\n 'helpMeWriteTemplates.manager.promptDescription',\n )}\n error={promptError}\n required\n >\n <TextArea\n value={form.prompt}\n maxLength={4000}\n autoResize\n minRows={4}\n maxRows={10}\n onChange={(event) =>\n setForm({ ...form, prompt: event.target.value })\n }\n />\n </FormField>\n </div>\n ) : templates.length === 0 ? (\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={t('helpMeWriteTemplates.manager.emptyTitle')}\n description={t(\n 'helpMeWriteTemplates.manager.emptyDescription',\n )}\n primaryAction={{\n label: t('helpMeWriteTemplates.manager.new'),\n onClick: () => setForm({ ...EMPTY_FORM }),\n }}\n />\n ) : (\n <ul\n aria-label={t('helpMeWriteTemplates.manager.listLabel')}\n className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-0\"\n >\n {templates.map((tpl, index) => (\n <li\n key={tpl.id}\n {...reorder.rowProps(index)}\n className={`ds:flex ds:items-start ds:gap-[var(--spacing-sm)] ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--border)] ds:p-[var(--spacing-sm)] ${reorder.rowClass(index)}`}\n >\n {onReorderTemplates\n ? reorder.handle(index, tpl.name)\n : null}\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-title-item ds:text-[color:var(--foreground)]\">\n {tpl.name}\n </span>\n </div>\n <p className={`${metaClass} ds:line-clamp-2`}>\n {tpl.description || tpl.prompt}\n </p>\n </div>\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<Pencil />}\n aria-label={t('helpMeWriteTemplates.manager.edit', {\n name: tpl.name,\n })}\n onClick={() =>\n setForm({\n id: tpl.id,\n name: tpl.name,\n description: tpl.description ?? '',\n prompt: tpl.prompt,\n submitted: false,\n })\n }\n />\n {onDeleteTemplate ? (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<Trash2 />}\n aria-label={t('helpMeWriteTemplates.manager.delete', {\n name: tpl.name,\n })}\n onClick={() => setPendingDelete(tpl)}\n />\n ) : null}\n </li>\n ))}\n </ul>\n )}\n {reorder.liveRegion}\n </Dialog.Body>\n <Dialog.Footer>\n {form ? (\n <>\n <Button intent=\"secondary\" onClick={() => setForm(null)}>\n {t('helpMeWriteTemplates.manager.cancel')}\n </Button>\n <Button\n intent=\"primary\"\n loading={saving}\n onClick={() => void save()}\n >\n {t('helpMeWriteTemplates.manager.save')}\n </Button>\n </>\n ) : (\n <>\n {templates.length > 0 ? (\n <Button\n intent=\"outline\"\n startIcon={<Plus />}\n onClick={() => setForm({ ...EMPTY_FORM })}\n >\n {t('helpMeWriteTemplates.manager.new')}\n </Button>\n ) : null}\n <Dialog.Close asChild>\n <Button intent=\"primary\">\n {t('helpMeWriteTemplates.manager.done')}\n </Button>\n </Dialog.Close>\n </>\n )}\n </Dialog.Footer>\n </div>\n </Dialog.Content>\n </Dialog>\n <Dialog\n open={pendingDelete != null}\n onOpenChange={(next) => {\n if (!next && !deleting) {\n setPendingDelete(null);\n setDeleteFailed(false);\n }\n }}\n >\n <Dialog.Content size=\"sm\" variant=\"alert\">\n <Dialog.Header>\n <Dialog.Title>\n {t('helpMeWriteTemplates.manager.deleteTitle', {\n name: pendingDelete?.name ?? '',\n })}\n </Dialog.Title>\n <Dialog.Description>\n {t('helpMeWriteTemplates.manager.deleteDescription')}\n </Dialog.Description>\n </Dialog.Header>\n {deleteFailed ? (\n <Dialog.Body>\n <Alert variant=\"error\">\n {t('helpMeWriteTemplates.manager.deleteError')}\n </Alert>\n </Dialog.Body>\n ) : null}\n <Dialog.Footer>\n <Dialog.Close asChild>\n <Button intent=\"secondary\" disabled={deleting}>\n {t('helpMeWriteTemplates.manager.cancel')}\n </Button>\n </Dialog.Close>\n <Button\n intent=\"destructive\"\n loading={deleting}\n onClick={() => void confirmDelete()}\n >\n {t('helpMeWriteTemplates.manager.deleteConfirm')}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog>\n </>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* HelpMeWriteUndoNotice */\n/* ------------------------------------------------------------------ */\n\nexport interface HelpMeWriteUndoNoticeProps {\n /** The change to offer Undo for; `null` hides the notice. */\n applied: HelpMeWriteApplied | null;\n onUndo: () => void;\n onDismiss: () => void;\n}\n\n/** \"Note rewritten with …\" plus Undo; takes focus when it appears. */\nexport function HelpMeWriteUndoNotice({\n applied,\n onUndo,\n onDismiss,\n}: HelpMeWriteUndoNoticeProps): React.JSX.Element | null {\n const { t } = useTranslation('ui');\n const undoRef = useRef<HTMLButtonElement>(null);\n useEffect(() => {\n if (applied) undoRef.current?.focus();\n }, [applied]);\n if (!applied?.template) return null;\n const name = applied.template.name;\n return (\n <Alert\n variant=\"success\"\n dismissible\n onOpenChange={(isOpen) => {\n if (!isOpen) onDismiss();\n }}\n data-component=\"help-me-write-undo-notice\"\n >\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span>\n {applied.mode === 'below'\n ? t('helpMeWriteTemplates.undo.addedBelow', { name })\n : t('helpMeWriteTemplates.undo.replaced', { name })}\n </span>\n <Button ref={undoRef} intent=\"outline\" size=\"sm\" onClick={onUndo}>\n {t('helpMeWriteTemplates.undo.undo')}\n </Button>\n </div>\n </Alert>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* useHelpMeWriteTemplates — the whole thing in one call */\n/* ------------------------------------------------------------------ */\n\nexport interface UseHelpMeWriteTemplatesOptions {\n templates: AiTemplate[];\n /** The AI call, for both templates (from the pill) and the free prompt. */\n onGenerate: HelpMeWriteTemplatesBarProps['onGenerate'];\n /** Enables the manager (create / edit). Omit for read-only template users. */\n onSaveTemplate?: AiTemplateManagerProps['onSaveTemplate'];\n /** Enables Delete in the manager. */\n onDeleteTemplate?: AiTemplateManagerProps['onDeleteTemplate'];\n /** Enables drag-and-drop reordering in the manager (the menu order). */\n onReorderTemplates?: AiTemplateManagerProps['onReorderTemplates'];\n credits?: AiCreditsInfo;\n /** Mic in the bar's prompt when the editor has `onDictate`. Default true. */\n enableDictation?: boolean;\n /** Also told about every applied draft (e.g. for analytics). */\n onApplied?: (applied: HelpMeWriteApplied) => void;\n /**\n * Shows the AI-credits/bundles hover card on every AI trigger the editor\n * has (this bar's own segment included, via `editorProps`). One wiring\n * covers both the bar's existing out-of-credits notice (`credits`, shown\n * only once the practice actually runs out) and this always-available\n * hover preview.\n */\n creditsNotice?: RichTextEditorProps['aiCreditsNotice'];\n}\n\n/** The `RichTextEditor` props the hook drives; spread them on the editor. */\nexport interface HelpMeWriteTemplatesEditorProps {\n renderHelpMeWrite: (context: HelpMeWriteRenderContext) => ReactNode;\n aiTemplates: RichTextEditorAiTemplates;\n onAiApplied: (applied: RichTextEditorAiApplied) => void;\n aiCreditsNotice?: RichTextEditorProps['aiCreditsNotice'];\n}\n\nexport interface UseHelpMeWriteTemplatesResult extends HelpMeWriteTemplatesEditorProps {\n /** All three editor props at once: `<RichTextEditor {...hmw.editorProps} />`. */\n editorProps: HelpMeWriteTemplatesEditorProps;\n /** Mount once, anywhere (a portalled dialog); `null` without `onSaveTemplate`. */\n manager: ReactNode;\n /** Place where the Undo notice should show, e.g. above the editor. */\n undoNotice: ReactNode;\n openManager: (mode?: 'list' | 'create') => void;\n}\n\n/**\n * Wires templates, the Help-me-write bar, the manager and Undo into the\n * editor. Templates run from the editor's AI pill and selection bubble;\n * the bar is the free prompt. Usage:\n *\n * const hmw = useHelpMeWriteTemplates({ templates, onGenerate, onSaveTemplate });\n * {hmw.undoNotice}\n * <RichTextEditor {...hmw.editorProps} … />\n * {hmw.manager}\n */\nexport function useHelpMeWriteTemplates({\n templates,\n onGenerate,\n onSaveTemplate,\n onDeleteTemplate,\n onReorderTemplates,\n credits,\n enableDictation,\n onApplied,\n creditsNotice,\n}: UseHelpMeWriteTemplatesOptions): UseHelpMeWriteTemplatesResult {\n const [manager, setManager] = useState<{\n open: boolean;\n mode: 'list' | 'create';\n }>({ open: false, mode: 'list' });\n const [applied, setApplied] = useState<HelpMeWriteApplied | null>(null);\n const openManager = useCallback(\n (mode: 'list' | 'create' = 'list') => setManager({ open: true, mode }),\n [],\n );\n\n const renderHelpMeWrite = useCallback(\n (context: HelpMeWriteRenderContext): ReactNode => (\n <HelpMeWriteTemplatesBar\n context={context}\n onGenerate={onGenerate}\n credits={credits}\n enableDictation={enableDictation}\n suspendClose={manager.open}\n onApplied={onApplied}\n />\n ),\n [onGenerate, credits, enableDictation, manager.open, onApplied],\n );\n\n // The editor runs templates; the host's full template (with its prompt)\n // goes to `onGenerate`, looked up by id.\n const aiTemplates = useMemo<RichTextEditorAiTemplates>(() => {\n const byId = new Map(templates.map((tpl) => [tpl.id, tpl]));\n return {\n templates,\n onRun: ({ template, text, scope, signal }): Promise<string> => {\n const full = byId.get(template.id);\n if (!full) return Promise.reject(new Error('Unknown template'));\n return onGenerate({\n template: full,\n prompt: '',\n sourceText: text,\n scope,\n signal,\n });\n },\n onManage: onSaveTemplate ? openManager : undefined,\n };\n }, [templates, onGenerate, onSaveTemplate, openManager]);\n\n const onAiApplied = useCallback(\n (event: RichTextEditorAiApplied): void => {\n if (event.action !== 'template' || !event.template) return;\n const template = templates.find((tpl) => tpl.id === event.template?.id);\n const change: HelpMeWriteApplied = {\n mode: 'replace',\n template,\n previousHtml: event.previousHtml,\n undo: event.undo,\n };\n setApplied(template ? change : null);\n onApplied?.(change);\n },\n [templates, onApplied],\n );\n\n const managerNode = useMemo(\n () =>\n onSaveTemplate ? (\n <AiTemplateManager\n open={manager.open}\n initialMode={manager.mode}\n onOpenChange={(isOpen) => setManager((m) => ({ ...m, open: isOpen }))}\n templates={templates}\n onSaveTemplate={onSaveTemplate}\n onDeleteTemplate={onDeleteTemplate}\n onReorderTemplates={onReorderTemplates}\n />\n ) : null,\n [manager, templates, onSaveTemplate, onDeleteTemplate, onReorderTemplates],\n );\n\n const undoNotice = (\n <HelpMeWriteUndoNotice\n applied={applied}\n onUndo={() => {\n applied?.undo();\n setApplied(null);\n }}\n onDismiss={() => setApplied(null)}\n />\n );\n\n const editorProps = useMemo<HelpMeWriteTemplatesEditorProps>(\n () => ({\n renderHelpMeWrite,\n aiTemplates,\n onAiApplied,\n aiCreditsNotice: creditsNotice,\n }),\n [renderHelpMeWrite, aiTemplates, onAiApplied, creditsNotice],\n );\n\n return {\n ...editorProps,\n editorProps,\n manager: managerNode,\n undoNotice,\n openManager,\n };\n}\n"],"names":["AiCreditsExhaustedError","message","ACTION_SIZE","BRAND_ACTION","RECORDING_MIC","metaClass","eyebrowClass","previewClass","joinWith","base","extra","isAbort","err","HelpMeWriteTemplatesBar","context","onGenerate","onApplied","credits","enableDictation","suspendClose","t","useTranslation","open","draftId","useId","errorId","prompt","setPrompt","useState","loading","setLoading","errored","setErrored","outOfCredits","setOutOfCredits","draft","setDraft","abortRef","useRef","onDictate","isDictating","setIsDictating","interim","setInterim","announcement","setAnnouncement","dictateAbortRef","stopDictation","useCallback","_a","toggleDictation","controller","text","trimmed","p","useEffect","_b","run","onSelection","result","contextClose","close","insert","previousHtml","setContent","body","jsx","AiCreditsExhaustedNotice","jsxs","Fragment","SafeHtml","Button","X","RotateCcw","fieldValue","IconButton","TextArea","event","Square","Mic","Spinner","Send","EditorOverlay","reorderRowClass","cva","useReorder","templates","onReorder","dragSource","setDragSource","dropTarget","setDropTarget","setMessage","toggle","move","from","to","target","ids","tpl","moved","index","source","name","GripVertical","EMPTY_FORM","AiTemplateManager","onOpenChange","initialMode","onSaveTemplate","onDeleteTemplate","onReorderTemplates","reorder","form","setForm","saving","setSaving","saveFailed","setSaveFailed","pendingDelete","setPendingDelete","deleting","setDeleting","deleteFailed","setDeleteFailed","confirmDelete","nameTaken","id","nameError","promptError","save","next","title","Dialog","Alert","FormField","StateBackedTextInput","EmptyState","Pencil","Trash2","Plus","HelpMeWriteUndoNotice","applied","onUndo","onDismiss","undoRef","isOpen","useHelpMeWriteTemplates","creditsNotice","manager","setManager","setApplied","openManager","mode","renderHelpMeWrite","aiTemplates","useMemo","byId","template","scope","signal","full","onAiApplied","change","managerNode","m","undoNotice","editorProps"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { forwardRef as Le, useContext as _e, useState as O, useRef as _, useId a
3
3
  import { c as re } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as Ke } from "react-i18next";
5
5
  import { u as Pe, F as Ue, a as we } from "./form-field-context-DtiROUJV.js";
6
- import { I as te, c as Ze, a as G, b as K } from "./input-surface-iBmxVBfr.js";
6
+ import { I as te, c as Ze, a as G, b as K } from "./input-surface-BMffm2Vd.js";
7
7
  import { c as ze } from "./compose-refs-C0k0tdqF.js";
8
8
  import { u as De } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
9
9
  import { u as je } from "./registry-DvAUVLHh.js";
@@ -433,4 +433,4 @@ export {
433
433
  qe as i,
434
434
  Je as w
435
435
  };
436
- //# sourceMappingURL=iban-input-B9L2QDHh.js.map
436
+ //# sourceMappingURL=iban-input-DuTwKok5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"iban-input-B9L2QDHh.js","sources":["../../src/components/iban-input/iban-input.agent.ts","../../src/components/iban-input/is-valid-iban.ts","../../src/components/iban-input/iban-input.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — IbanInput. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { IbanInputHandle } from './iban-input';\n\nexport const ibanInputAgent: AgentAdapter<IbanInputHandle> = {\n id: 'iban-input',\n capabilities: ['set_value'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.ibanInput.state.value',\n description:\n 'Current IBAN, normalised (uppercased, [A-Z0-9], no spaces, ≤34 characters).',\n read: (handle) => handle.getValue(),\n },\n isValid: {\n type: 'boolean',\n descriptionKey: 'ui.agent.ibanInput.state.isValid',\n description:\n 'Whether the value is a structurally complete IBAN with a passing mod-97-10 checksum.',\n read: (handle) => handle.isValid(),\n },\n },\n actions: {\n set_value: {\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.ibanInput.actions.setValue',\n description:\n 'Replace the IBAN. The value is uppercased and stripped to [A-Z0-9], capped at 34 characters.',\n examples: [\n {\n args: { value: 'DE89370400440532013000' },\n note: 'A complete, checksum-valid German IBAN.',\n },\n ],\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.ibanInput.actions.clear',\n description: 'Empty the input. Loses any typed value.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n focus: {\n safety: 'read',\n descriptionKey: 'ui.agent.ibanInput.actions.focus',\n description: 'Move keyboard focus to the IBAN input.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'iban-input',\n description: 'Marks the IbanInput wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* IBAN validation — ISO 13616 structure + ISO 7064 mod-97-10 checksum. */\n/* */\n/* No third-party dependency: the mod-97 reduction is done in chunks so */\n/* no BigInt is needed, and the per-country length table is the published */\n/* IBAN registry (SEPA + common others). Mirrors the validation-helper */\n/* shape of `is-valid-codice-fiscale.ts`. */\n/* -------------------------------------------------------------------- */\n\n/** Why an IBAN is (in)valid — drives the component's error messaging. */\nexport type IbanReason =\n | 'valid'\n | 'empty'\n | 'incomplete'\n | 'badFormat'\n | 'badChecksum';\n\n/**\n * Published IBAN lengths by ISO-3166 alpha-2 country code (the SEPA zone plus\n * the common non-SEPA registry entries). Used to decide when a typed value is\n * \"complete\" so the component never flags a partially-entered IBAN as invalid.\n */\nexport const IBAN_LENGTHS: Record<string, number> = {\n AD: 24,\n AE: 23,\n AL: 28,\n AT: 20,\n AZ: 28,\n BA: 20,\n BE: 16,\n BG: 22,\n BH: 22,\n BR: 29,\n BY: 28,\n CH: 21,\n CR: 22,\n CY: 28,\n CZ: 24,\n DE: 22,\n DK: 18,\n DO: 28,\n EE: 20,\n EG: 29,\n ES: 24,\n FI: 18,\n FO: 18,\n FR: 27,\n GB: 22,\n GE: 22,\n GI: 23,\n GL: 18,\n GR: 27,\n GT: 28,\n HR: 21,\n HU: 28,\n IE: 22,\n IL: 23,\n IS: 26,\n IT: 27,\n JO: 30,\n KW: 30,\n KZ: 20,\n LB: 28,\n LC: 32,\n LI: 21,\n LT: 20,\n LU: 20,\n LV: 21,\n MC: 27,\n MD: 24,\n ME: 22,\n MK: 19,\n MR: 27,\n MT: 31,\n MU: 30,\n NL: 18,\n NO: 15,\n PK: 24,\n PL: 28,\n PS: 29,\n PT: 25,\n QA: 29,\n RO: 24,\n RS: 22,\n SA: 24,\n SC: 31,\n SE: 24,\n SI: 19,\n SK: 24,\n SM: 27,\n TN: 24,\n TR: 26,\n UA: 29,\n VG: 24,\n XK: 20,\n};\n\n/** The shortest registered IBAN (Norway, 15) — the completeness floor for an\n * unknown country code. */\nexport const MIN_IBAN_LENGTH = 15;\n/** The longest registered IBAN (34) — the hard input cap. */\nexport const MAX_IBAN_LENGTH = 34;\n\n/**\n * ISO 7064 mod-97-10. Moves the leading 4 characters (country + check digits)\n * to the end, maps letters A–Z to 10–35, and reduces the resulting decimal\n * string modulo 97 in chunks (avoids BigInt). A valid IBAN yields `1`.\n *\n * Assumes `value` is already normalised to `[A-Z0-9]` (uppercase, no spaces).\n */\nexport function ibanMod97(value: string): number {\n const rearranged = value.slice(4) + value.slice(0, 4);\n let remainder = 0;\n for (let i = 0; i < rearranged.length; i += 1) {\n const code = rearranged.charCodeAt(i);\n // A–Z (65–90) → \"10\"..\"35\"; 0–9 stay as the single digit character.\n const mapped =\n code >= 65 && code <= 90 ? String(code - 55) : String.fromCharCode(code);\n for (let j = 0; j < mapped.length; j += 1) {\n remainder = (remainder * 10 + (mapped.charCodeAt(j) - 48)) % 97;\n }\n }\n return remainder;\n}\n\n/**\n * Classify a normalised (uppercased, `[A-Z0-9]`, ≤34-char) IBAN string. Returns\n * `'incomplete'` while the value is shorter than its country expects so the\n * caller can stay silent mid-entry, and only `'badFormat'` / `'badChecksum'`\n * once the value is structurally complete.\n */\nexport function classifyIban(raw: string): IbanReason {\n if (raw === '') return 'empty';\n const country = /^[A-Z]{2}/.test(raw) ? raw.slice(0, 2) : undefined;\n const expected = country ? IBAN_LENGTHS[country] : undefined;\n // Over-length for a known country is a definite format error.\n if (expected && raw.length > expected) return 'badFormat';\n const complete = expected\n ? raw.length === expected\n : raw.length >= MIN_IBAN_LENGTH;\n if (!complete) return 'incomplete';\n // Structural shape: 2 letters, 2 check digits, then BBAN alphanumerics.\n if (!/^[A-Z]{2}\\d{2}[A-Z0-9]+$/.test(raw)) return 'badFormat';\n return ibanMod97(raw) === 1 ? 'valid' : 'badChecksum';\n}\n\n/** Convenience boolean wrapper around {@link classifyIban}. */\nexport function isValidIban(raw: string): boolean {\n return classifyIban(raw) === 'valid';\n}\n","import {\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type ClipboardEvent,\n type CompositionEvent,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CircleAlert, CircleCheck } from 'lucide-react';\nimport {\n FormFieldContext,\n useFormField,\n useFormFieldControlId,\n} from '../form-field/form-field-context';\nimport {\n INPUT_SURFACE_CHROME,\n INPUT_SURFACE_HEIGHT,\n INPUT_SURFACE_TEXT,\n INPUT_SURFACE_TONE,\n} from '../_shared/input-surface';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent';\nimport { ibanInputAgent } from './iban-input.agent';\nimport {\n classifyIban,\n MAX_IBAN_LENGTH,\n type IbanReason,\n} from './is-valid-iban';\n\n/** Agent-readiness curated handle for IbanInput. */\nexport interface IbanInputHandle {\n getValue: () => string;\n setValue: (value: string) => void;\n clear: () => void;\n focus: () => void;\n isValid: () => boolean;\n}\n\n/** Structured payload emitted on every keystroke alongside the raw value. */\nexport interface IbanChangeMeta {\n /** Structurally complete AND the mod-97-10 checksum matches. */\n isValid: boolean;\n /** Whether the value has reached its country's expected length. */\n isComplete: boolean;\n /** Why the value is (in)valid — drives consumer messaging. */\n reason: IbanReason;\n}\n\nexport interface IbanInputProps {\n /** Controlled value (raw, uppercased, no spaces). Pair with onChange. */\n value?: string;\n /** Uncontrolled initial value. Normalised on mount. */\n defaultValue?: string;\n /** Fires on every keystroke with the normalised raw string + meta. */\n onChange?: (raw: string, meta: IbanChangeMeta) => void;\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n /** When the invalid tone + error string surface. Never marks partial input invalid. */\n validateOn?: 'change' | 'blur' | 'submit';\n /** Controlled escape hatch to force the invalid state (e.g. bank rejection). */\n showError?: boolean;\n /** Overrides the kit's default i18n error string. */\n errorMessage?: string;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n placeholder?: string;\n /** Render the format caption when NOT inside a FormField. */\n showFormatHint?: boolean;\n id?: string;\n name?: string;\n className?: string;\n 'aria-label'?: string;\n}\n\nconst wrapperVariants = cva(\n ['ds:relative ds:flex ds:items-center ds:w-full', INPUT_SURFACE_CHROME].join(\n ' ',\n ),\n {\n variants: {\n size: {\n sm: INPUT_SURFACE_HEIGHT.sm,\n md: INPUT_SURFACE_HEIGHT.md,\n lg: INPUT_SURFACE_HEIGHT.lg,\n },\n tone: {\n default: INPUT_SURFACE_TONE.default,\n error: `${INPUT_SURFACE_TONE.error} ds:focus-within:outline-destructive`,\n },\n },\n defaultVariants: { size: 'md', tone: 'default' },\n },\n);\n\nconst inputVariants = cva(\n [\n // dir=\"ltr\" + tabular-nums keep the IBAN rendering left-to-right and evenly\n // spaced even under an RTL/CJK surrounding UI — this is a value-RENDERING\n // concern (the IBAN is never mirrored), not a layout-direction violation,\n // so logical-prop rules don't apply to the IBAN glyphs themselves.\n 'ds:w-full ds:min-w-0 ds:bg-transparent ds:text-foreground ds:placeholder:text-muted-foreground',\n 'ds:border-0 ds:outline-none ds:tabular-nums ds:uppercase ds:tracking-wide',\n 'ds:disabled:cursor-not-allowed',\n 'ds:read-only:cursor-default',\n ].join(' '),\n {\n variants: {\n size: {\n sm: `ds:ps-3 ds:pe-3 ${INPUT_SURFACE_TEXT.sm}`,\n md: `ds:ps-3 ds:pe-3 ${INPUT_SURFACE_TEXT.md}`,\n lg: `ds:ps-4 ds:pe-4 ${INPUT_SURFACE_TEXT.lg}`,\n },\n hasEnd: {\n true: 'ds:pe-10',\n false: '',\n },\n },\n defaultVariants: { size: 'md', hasEnd: false },\n },\n);\n\nconst adornmentEnd =\n 'ds:absolute ds:inset-y-0 ds:end-0 ds:pe-3 ds:flex ds:items-center ds:pointer-events-none ds:[&_svg]:size-4';\n\nconst captionBase = 'type-body-sm ds:mt-[var(--spacing-xs)]';\n\n/** Uppercase, strip non-[A-Z0-9], normalise full-width / Eastern-Arabic\n * digits, and cap at 34 characters. */\nfunction normaliseIban(input: string): string {\n return (\n input\n .normalize('NFKC')\n // Eastern-Arabic & Extended-Arabic-Indic digits → ASCII (otp-input precedent).\n .replace(/[٠-٩]/g, (c) => String(c.charCodeAt(0) - 0x0660))\n .replace(/[۰-۹]/g, (c) => String(c.charCodeAt(0) - 0x06f0))\n .toUpperCase()\n .replace(/[^A-Z0-9]/g, '')\n .slice(0, MAX_IBAN_LENGTH)\n );\n}\n\n/** Count [A-Z0-9] characters before `position` in the RAW (pre-normalise)\n * string, so the caret can be restored after re-normalising. */\nfunction countKeptBefore(str: string, position: number): number {\n let kept = 0;\n for (let i = 0; i < position && i < str.length; i += 1) {\n const c = str[i];\n if (\n (c >= '0' && c <= '9') ||\n (c >= 'A' && c <= 'Z') ||\n (c >= 'a' && c <= 'z')\n ) {\n kept += 1;\n }\n }\n return kept;\n}\n\nexport const IbanInput = forwardRef<HTMLInputElement, IbanInputProps>(\n function IbanInput(\n {\n value,\n defaultValue,\n onChange,\n size = 'md',\n tone = 'default',\n validateOn = 'blur',\n showError,\n errorMessage,\n disabled,\n readOnly,\n required,\n placeholder,\n showFormatHint = true,\n id,\n name,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n ) {\n const { t } = useTranslation('ui');\n const ctx = useFormField();\n const inFormField = useContext(FormFieldContext) !== null;\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(() =>\n normaliseIban(defaultValue ?? ''),\n );\n const currentValue = isControlled\n ? normaliseIban(value ?? '')\n : internalValue;\n\n const [blurred, setBlurred] = useState(false);\n const composingRef = useRef(false);\n const pendingCaretRef = useRef<number | null>(null);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const composedRef = composeRefs(ref, inputRef);\n\n const reactId = useId();\n const generatedHintId = `${reactId}-hint`;\n const generatedStatusId = `${reactId}-status`;\n const generatedErrorId = `${reactId}-error`;\n\n // DEV-time guard: a standalone field with no visible label needs an\n // aria-label, mirroring Button's icon-only guard. No-op in production.\n useEffect(() => {\n const isDev =\n typeof import.meta !== 'undefined' &&\n typeof import.meta.env !== 'undefined' &&\n import.meta.env.DEV === true;\n if (isDev && !inFormField && !ariaLabel) {\n console.warn(\n '[IbanInput] No FormField/label and no `aria-label` — the field has no accessible name. Wrap it in a FormField or pass `aria-label`.',\n );\n }\n }, [inFormField, ariaLabel]);\n\n const reason = useMemo(() => classifyIban(currentValue), [currentValue]);\n // \"Complete\" = the value has reached its country's expected length, so the\n // classifier has moved past 'incomplete' to a definitive verdict.\n const isComplete = reason !== 'empty' && reason !== 'incomplete';\n const isValid = reason === 'valid';\n\n const effectiveDisabled =\n (inFormField ? ctx.disabled : false) || Boolean(disabled);\n const effectiveRequired =\n (inFormField ? ctx.required : false) || Boolean(required);\n\n // Whether the component's OWN feedback should surface. `showError` is a\n // controlled escape hatch (e.g. the bank rejected the IBAN); otherwise the\n // client only flags a COMPLETE value that fails its structural/checksum\n // check — never a partially-typed one — and `validateOn` governs the trigger.\n const ownFeedbackActive =\n !readOnly &&\n (Boolean(showError) ||\n (isComplete &&\n !isValid &&\n (validateOn === 'change' || (validateOn === 'blur' && blurred))));\n\n // When inside a FormField with its own error, FormField's role=alert wins\n // and this component stays silent (no double message / duplicate\n // aria-describedby target).\n const formFieldHasError = inFormField && ctx.invalid;\n const showOwnError = ownFeedbackActive && !formFieldHasError;\n\n const effectiveInvalid = formFieldHasError || showOwnError;\n const effectiveTone: 'default' | 'error' =\n effectiveInvalid || tone === 'error' ? 'error' : 'default';\n\n const ownErrorText = useMemo(() => {\n if (errorMessage) return errorMessage;\n if (reason === 'badChecksum') return t('inputs.iban.errorChecksum');\n if (reason === 'badFormat') return t('inputs.iban.errorFormat');\n return t('inputs.iban.errorIncomplete');\n }, [errorMessage, reason, t]);\n\n const wantsHint = !inFormField && showFormatHint && !readOnly;\n const standaloneDescribedBy = inFormField\n ? undefined\n : [\n wantsHint ? generatedHintId : null,\n showOwnError ? generatedErrorId : generatedStatusId,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n const describedBy = inFormField\n ? ctx.describedBy || undefined\n : standaloneDescribedBy;\n\n const inputId = useFormFieldControlId(ctx, id);\n\n const emit = useCallback(\n (next: string) => {\n const nextReason = classifyIban(next);\n onChange?.(next, {\n isValid: nextReason === 'valid',\n isComplete: nextReason !== 'empty' && nextReason !== 'incomplete',\n reason: nextReason,\n });\n },\n [onChange],\n );\n\n const commit = useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n emit(next);\n },\n [isControlled, emit],\n );\n\n // Restore caret after a normalising re-render that may have changed the\n // string length (mid-string edit / paste). Mirrors phone-input's caret\n // discipline.\n useIsomorphicLayoutEffect(() => {\n if (pendingCaretRef.current == null) return;\n const pos = pendingCaretRef.current;\n pendingCaretRef.current = null;\n const node = inputRef.current;\n if (node && document.activeElement === node) {\n const safePos = Math.min(pos, node.value.length);\n node.setSelectionRange(safePos, safePos);\n }\n });\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (readOnly) return;\n if (composingRef.current) return;\n const target = event.target;\n const raw = target.value;\n const caret = target.selectionStart ?? raw.length;\n const keptBefore = countKeptBefore(raw, caret);\n const next = normaliseIban(raw);\n pendingCaretRef.current = Math.min(keptBefore, next.length);\n commit(next);\n };\n\n const handleCompositionStart = () => {\n composingRef.current = true;\n };\n\n const handleCompositionEnd = (\n event: CompositionEvent<HTMLInputElement>,\n ) => {\n composingRef.current = false;\n if (readOnly) return;\n const next = normaliseIban(event.currentTarget.value);\n pendingCaretRef.current = next.length;\n commit(next);\n };\n\n const handlePaste = (event: ClipboardEvent<HTMLInputElement>) => {\n if (readOnly) return;\n const text = event.clipboardData.getData('text');\n event.preventDefault();\n const node = inputRef.current;\n const selStart = node?.selectionStart ?? currentValue.length;\n const selEnd = node?.selectionEnd ?? currentValue.length;\n const cleaned = normaliseIban(text);\n const before = currentValue.slice(0, selStart);\n const after = currentValue.slice(selEnd);\n const next = normaliseIban(before + cleaned + after);\n pendingCaretRef.current = Math.min(\n (before + cleaned).length,\n next.length,\n );\n commit(next);\n };\n\n const handleBlur = () => {\n if (validateOn === 'blur') setBlurred(true);\n };\n\n const agentHandle = useMemo<IbanInputHandle>(\n () => ({\n getValue: () => currentValue,\n setValue: (next) => {\n const normalised = normaliseIban(next);\n if (!isControlled) setInternalValue(normalised);\n emit(normalised);\n inputRef.current?.focus();\n },\n clear: () => {\n if (!isControlled) setInternalValue('');\n emit('');\n inputRef.current?.focus();\n },\n focus: () => inputRef.current?.focus(),\n isValid: () => classifyIban(currentValue) === 'valid',\n }),\n [currentValue, isControlled, emit],\n );\n useAgentRegistration(ibanInputAgent, agentHandle, id);\n\n const resolvedPlaceholder = placeholder ?? t('inputs.iban.placeholder');\n\n const statusMessage =\n readOnly || inFormField\n ? ''\n : isValid\n ? t('inputs.iban.valid')\n : currentValue.length > 0 && !isComplete\n ? t('inputs.iban.charactersEntered', { count: currentValue.length })\n : '';\n\n const errorText = showOwnError ? ownErrorText : '';\n\n const showEndIcon =\n !readOnly && (showOwnError || (isValid && !inFormField));\n\n return (\n <div\n className=\"ds:flex ds:flex-col\"\n data-component=\"iban-input\"\n data-component-id={id}\n >\n <div\n data-slot=\"iban-input\"\n className={wrapperVariants({ size, tone: effectiveTone, className })}\n >\n <input\n ref={composedRef}\n id={inputId}\n name={name}\n // dir=\"ltr\": the IBAN glyphs render LTR even under an RTL surrounding\n // UI — a value-rendering concern, not a layout-direction violation.\n dir=\"ltr\"\n type=\"text\"\n inputMode=\"text\"\n autoCapitalize=\"characters\"\n autoCorrect=\"off\"\n autoComplete=\"off\"\n spellCheck={false}\n maxLength={MAX_IBAN_LENGTH}\n // Loose structural mirror (2 letters + 2 digits + alphanumerics) as a\n // non-JS fallback. The real per-country length + mod-97 rule lives in\n // classifyIban.\n pattern=\"[A-Za-z]{2}[0-9]{2}[A-Za-z0-9]+\"\n value={currentValue}\n placeholder={resolvedPlaceholder}\n disabled={effectiveDisabled}\n readOnly={readOnly}\n aria-label={ariaLabel}\n aria-describedby={describedBy}\n aria-invalid={effectiveInvalid || undefined}\n aria-required={effectiveRequired || undefined}\n onChange={handleChange}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n onPaste={handlePaste}\n onBlur={handleBlur}\n className={inputVariants({ size, hasEnd: showEndIcon })}\n />\n {showEndIcon ? (\n <span\n aria-hidden=\"true\"\n className={`${adornmentEnd} ${\n showOwnError ? 'ds:text-destructive' : 'ds:text-success'\n }`}\n >\n {showOwnError ? <CircleAlert /> : <CircleCheck />}\n </span>\n ) : null}\n </div>\n\n {wantsHint ? (\n <p\n id={generatedHintId}\n className={`${captionBase} ds:text-muted-foreground`}\n >\n {t('inputs.iban.formatHint')}\n </p>\n ) : null}\n\n {/* Polite live region (role=status): announces the valid affordance and\n the typing-progress count as TEXT, satisfying 1.4.1 (never\n colour-only). Never carries an actionable error — that goes to the\n assertive node below, mirroring the kit's input-error convention. */}\n <p\n id={generatedStatusId}\n role=\"status\"\n aria-live=\"polite\"\n className={`${captionBase} ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] ${\n isValid ? 'ds:text-success' : 'ds:text-muted-foreground'\n } ${statusMessage ? '' : 'ds:sr-only'}`}\n >\n {statusMessage ? (\n <>\n {isValid ? (\n <CircleCheck\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0\"\n />\n ) : null}\n <span>{statusMessage}</span>\n </>\n ) : null}\n </p>\n\n {/* Assertive error region (role=alert): a validation error the user\n must correct is announced assertively. Rendered only when the\n component owns the error — inside a FormField, FormField's\n role=alert wins. */}\n {errorText ? (\n <p\n id={generatedErrorId}\n role=\"alert\"\n className={`${captionBase} ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] ds:text-destructive`}\n >\n <CircleAlert aria-hidden=\"true\" className=\"ds:size-4 ds:shrink-0\" />\n <span>{errorText}</span>\n </p>\n ) : null}\n </div>\n );\n },\n);\n\nIbanInput.displayName = 'IbanInput';\n\nexport { wrapperVariants as ibanWrapperVariants };\n"],"names":["ibanInputAgent","handle","args","IBAN_LENGTHS","MIN_IBAN_LENGTH","MAX_IBAN_LENGTH","ibanMod97","value","rearranged","remainder","i","code","mapped","j","classifyIban","raw","country","expected","isValidIban","wrapperVariants","cva","INPUT_SURFACE_CHROME","INPUT_SURFACE_HEIGHT","INPUT_SURFACE_TONE","inputVariants","INPUT_SURFACE_TEXT","adornmentEnd","captionBase","normaliseIban","input","c","countKeptBefore","str","position","kept","IbanInput","forwardRef","defaultValue","onChange","size","tone","validateOn","showError","errorMessage","disabled","readOnly","required","placeholder","showFormatHint","id","name","className","ariaLabel","ref","t","useTranslation","ctx","useFormField","inFormField","useContext","FormFieldContext","isControlled","internalValue","setInternalValue","useState","currentValue","blurred","setBlurred","composingRef","useRef","pendingCaretRef","inputRef","composedRef","composeRefs","reactId","useId","generatedHintId","generatedStatusId","generatedErrorId","useEffect","reason","useMemo","isComplete","isValid","effectiveDisabled","effectiveRequired","ownFeedbackActive","formFieldHasError","showOwnError","effectiveInvalid","effectiveTone","ownErrorText","wantsHint","standaloneDescribedBy","describedBy","inputId","useFormFieldControlId","emit","useCallback","next","nextReason","commit","useIsomorphicLayoutEffect","pos","node","safePos","handleChange","event","target","caret","keptBefore","handleCompositionStart","handleCompositionEnd","handlePaste","text","selStart","selEnd","cleaned","before","after","handleBlur","agentHandle","normalised","_a","useAgentRegistration","resolvedPlaceholder","statusMessage","errorText","showEndIcon","jsxs","jsx","CircleAlert","CircleCheck","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"iban-input-DuTwKok5.js","sources":["../../src/components/iban-input/iban-input.agent.ts","../../src/components/iban-input/is-valid-iban.ts","../../src/components/iban-input/iban-input.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — IbanInput. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { IbanInputHandle } from './iban-input';\n\nexport const ibanInputAgent: AgentAdapter<IbanInputHandle> = {\n id: 'iban-input',\n capabilities: ['set_value'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.ibanInput.state.value',\n description:\n 'Current IBAN, normalised (uppercased, [A-Z0-9], no spaces, ≤34 characters).',\n read: (handle) => handle.getValue(),\n },\n isValid: {\n type: 'boolean',\n descriptionKey: 'ui.agent.ibanInput.state.isValid',\n description:\n 'Whether the value is a structurally complete IBAN with a passing mod-97-10 checksum.',\n read: (handle) => handle.isValid(),\n },\n },\n actions: {\n set_value: {\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.ibanInput.actions.setValue',\n description:\n 'Replace the IBAN. The value is uppercased and stripped to [A-Z0-9], capped at 34 characters.',\n examples: [\n {\n args: { value: 'DE89370400440532013000' },\n note: 'A complete, checksum-valid German IBAN.',\n },\n ],\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.ibanInput.actions.clear',\n description: 'Empty the input. Loses any typed value.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n focus: {\n safety: 'read',\n descriptionKey: 'ui.agent.ibanInput.actions.focus',\n description: 'Move keyboard focus to the IBAN input.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'iban-input',\n description: 'Marks the IbanInput wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* IBAN validation — ISO 13616 structure + ISO 7064 mod-97-10 checksum. */\n/* */\n/* No third-party dependency: the mod-97 reduction is done in chunks so */\n/* no BigInt is needed, and the per-country length table is the published */\n/* IBAN registry (SEPA + common others). Mirrors the validation-helper */\n/* shape of `is-valid-codice-fiscale.ts`. */\n/* -------------------------------------------------------------------- */\n\n/** Why an IBAN is (in)valid — drives the component's error messaging. */\nexport type IbanReason =\n | 'valid'\n | 'empty'\n | 'incomplete'\n | 'badFormat'\n | 'badChecksum';\n\n/**\n * Published IBAN lengths by ISO-3166 alpha-2 country code (the SEPA zone plus\n * the common non-SEPA registry entries). Used to decide when a typed value is\n * \"complete\" so the component never flags a partially-entered IBAN as invalid.\n */\nexport const IBAN_LENGTHS: Record<string, number> = {\n AD: 24,\n AE: 23,\n AL: 28,\n AT: 20,\n AZ: 28,\n BA: 20,\n BE: 16,\n BG: 22,\n BH: 22,\n BR: 29,\n BY: 28,\n CH: 21,\n CR: 22,\n CY: 28,\n CZ: 24,\n DE: 22,\n DK: 18,\n DO: 28,\n EE: 20,\n EG: 29,\n ES: 24,\n FI: 18,\n FO: 18,\n FR: 27,\n GB: 22,\n GE: 22,\n GI: 23,\n GL: 18,\n GR: 27,\n GT: 28,\n HR: 21,\n HU: 28,\n IE: 22,\n IL: 23,\n IS: 26,\n IT: 27,\n JO: 30,\n KW: 30,\n KZ: 20,\n LB: 28,\n LC: 32,\n LI: 21,\n LT: 20,\n LU: 20,\n LV: 21,\n MC: 27,\n MD: 24,\n ME: 22,\n MK: 19,\n MR: 27,\n MT: 31,\n MU: 30,\n NL: 18,\n NO: 15,\n PK: 24,\n PL: 28,\n PS: 29,\n PT: 25,\n QA: 29,\n RO: 24,\n RS: 22,\n SA: 24,\n SC: 31,\n SE: 24,\n SI: 19,\n SK: 24,\n SM: 27,\n TN: 24,\n TR: 26,\n UA: 29,\n VG: 24,\n XK: 20,\n};\n\n/** The shortest registered IBAN (Norway, 15) — the completeness floor for an\n * unknown country code. */\nexport const MIN_IBAN_LENGTH = 15;\n/** The longest registered IBAN (34) — the hard input cap. */\nexport const MAX_IBAN_LENGTH = 34;\n\n/**\n * ISO 7064 mod-97-10. Moves the leading 4 characters (country + check digits)\n * to the end, maps letters A–Z to 10–35, and reduces the resulting decimal\n * string modulo 97 in chunks (avoids BigInt). A valid IBAN yields `1`.\n *\n * Assumes `value` is already normalised to `[A-Z0-9]` (uppercase, no spaces).\n */\nexport function ibanMod97(value: string): number {\n const rearranged = value.slice(4) + value.slice(0, 4);\n let remainder = 0;\n for (let i = 0; i < rearranged.length; i += 1) {\n const code = rearranged.charCodeAt(i);\n // A–Z (65–90) → \"10\"..\"35\"; 0–9 stay as the single digit character.\n const mapped =\n code >= 65 && code <= 90 ? String(code - 55) : String.fromCharCode(code);\n for (let j = 0; j < mapped.length; j += 1) {\n remainder = (remainder * 10 + (mapped.charCodeAt(j) - 48)) % 97;\n }\n }\n return remainder;\n}\n\n/**\n * Classify a normalised (uppercased, `[A-Z0-9]`, ≤34-char) IBAN string. Returns\n * `'incomplete'` while the value is shorter than its country expects so the\n * caller can stay silent mid-entry, and only `'badFormat'` / `'badChecksum'`\n * once the value is structurally complete.\n */\nexport function classifyIban(raw: string): IbanReason {\n if (raw === '') return 'empty';\n const country = /^[A-Z]{2}/.test(raw) ? raw.slice(0, 2) : undefined;\n const expected = country ? IBAN_LENGTHS[country] : undefined;\n // Over-length for a known country is a definite format error.\n if (expected && raw.length > expected) return 'badFormat';\n const complete = expected\n ? raw.length === expected\n : raw.length >= MIN_IBAN_LENGTH;\n if (!complete) return 'incomplete';\n // Structural shape: 2 letters, 2 check digits, then BBAN alphanumerics.\n if (!/^[A-Z]{2}\\d{2}[A-Z0-9]+$/.test(raw)) return 'badFormat';\n return ibanMod97(raw) === 1 ? 'valid' : 'badChecksum';\n}\n\n/** Convenience boolean wrapper around {@link classifyIban}. */\nexport function isValidIban(raw: string): boolean {\n return classifyIban(raw) === 'valid';\n}\n","import {\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type ClipboardEvent,\n type CompositionEvent,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CircleAlert, CircleCheck } from 'lucide-react';\nimport {\n FormFieldContext,\n useFormField,\n useFormFieldControlId,\n} from '../form-field/form-field-context';\nimport {\n INPUT_SURFACE_CHROME,\n INPUT_SURFACE_HEIGHT,\n INPUT_SURFACE_TEXT,\n INPUT_SURFACE_TONE,\n} from '../_shared/input-surface';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent';\nimport { ibanInputAgent } from './iban-input.agent';\nimport {\n classifyIban,\n MAX_IBAN_LENGTH,\n type IbanReason,\n} from './is-valid-iban';\n\n/** Agent-readiness curated handle for IbanInput. */\nexport interface IbanInputHandle {\n getValue: () => string;\n setValue: (value: string) => void;\n clear: () => void;\n focus: () => void;\n isValid: () => boolean;\n}\n\n/** Structured payload emitted on every keystroke alongside the raw value. */\nexport interface IbanChangeMeta {\n /** Structurally complete AND the mod-97-10 checksum matches. */\n isValid: boolean;\n /** Whether the value has reached its country's expected length. */\n isComplete: boolean;\n /** Why the value is (in)valid — drives consumer messaging. */\n reason: IbanReason;\n}\n\nexport interface IbanInputProps {\n /** Controlled value (raw, uppercased, no spaces). Pair with onChange. */\n value?: string;\n /** Uncontrolled initial value. Normalised on mount. */\n defaultValue?: string;\n /** Fires on every keystroke with the normalised raw string + meta. */\n onChange?: (raw: string, meta: IbanChangeMeta) => void;\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n /** When the invalid tone + error string surface. Never marks partial input invalid. */\n validateOn?: 'change' | 'blur' | 'submit';\n /** Controlled escape hatch to force the invalid state (e.g. bank rejection). */\n showError?: boolean;\n /** Overrides the kit's default i18n error string. */\n errorMessage?: string;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n placeholder?: string;\n /** Render the format caption when NOT inside a FormField. */\n showFormatHint?: boolean;\n id?: string;\n name?: string;\n className?: string;\n 'aria-label'?: string;\n}\n\nconst wrapperVariants = cva(\n ['ds:relative ds:flex ds:items-center ds:w-full', INPUT_SURFACE_CHROME].join(\n ' ',\n ),\n {\n variants: {\n size: {\n sm: INPUT_SURFACE_HEIGHT.sm,\n md: INPUT_SURFACE_HEIGHT.md,\n lg: INPUT_SURFACE_HEIGHT.lg,\n },\n tone: {\n default: INPUT_SURFACE_TONE.default,\n error: `${INPUT_SURFACE_TONE.error} ds:focus-within:outline-destructive`,\n },\n },\n defaultVariants: { size: 'md', tone: 'default' },\n },\n);\n\nconst inputVariants = cva(\n [\n // dir=\"ltr\" + tabular-nums keep the IBAN rendering left-to-right and evenly\n // spaced even under an RTL/CJK surrounding UI — this is a value-RENDERING\n // concern (the IBAN is never mirrored), not a layout-direction violation,\n // so logical-prop rules don't apply to the IBAN glyphs themselves.\n 'ds:w-full ds:min-w-0 ds:bg-transparent ds:text-foreground ds:placeholder:text-muted-foreground',\n 'ds:border-0 ds:outline-none ds:tabular-nums ds:uppercase ds:tracking-wide',\n 'ds:disabled:cursor-not-allowed',\n 'ds:read-only:cursor-default',\n ].join(' '),\n {\n variants: {\n size: {\n sm: `ds:ps-3 ds:pe-3 ${INPUT_SURFACE_TEXT.sm}`,\n md: `ds:ps-3 ds:pe-3 ${INPUT_SURFACE_TEXT.md}`,\n lg: `ds:ps-4 ds:pe-4 ${INPUT_SURFACE_TEXT.lg}`,\n },\n hasEnd: {\n true: 'ds:pe-10',\n false: '',\n },\n },\n defaultVariants: { size: 'md', hasEnd: false },\n },\n);\n\nconst adornmentEnd =\n 'ds:absolute ds:inset-y-0 ds:end-0 ds:pe-3 ds:flex ds:items-center ds:pointer-events-none ds:[&_svg]:size-4';\n\nconst captionBase = 'type-body-sm ds:mt-[var(--spacing-xs)]';\n\n/** Uppercase, strip non-[A-Z0-9], normalise full-width / Eastern-Arabic\n * digits, and cap at 34 characters. */\nfunction normaliseIban(input: string): string {\n return (\n input\n .normalize('NFKC')\n // Eastern-Arabic & Extended-Arabic-Indic digits → ASCII (otp-input precedent).\n .replace(/[٠-٩]/g, (c) => String(c.charCodeAt(0) - 0x0660))\n .replace(/[۰-۹]/g, (c) => String(c.charCodeAt(0) - 0x06f0))\n .toUpperCase()\n .replace(/[^A-Z0-9]/g, '')\n .slice(0, MAX_IBAN_LENGTH)\n );\n}\n\n/** Count [A-Z0-9] characters before `position` in the RAW (pre-normalise)\n * string, so the caret can be restored after re-normalising. */\nfunction countKeptBefore(str: string, position: number): number {\n let kept = 0;\n for (let i = 0; i < position && i < str.length; i += 1) {\n const c = str[i];\n if (\n (c >= '0' && c <= '9') ||\n (c >= 'A' && c <= 'Z') ||\n (c >= 'a' && c <= 'z')\n ) {\n kept += 1;\n }\n }\n return kept;\n}\n\nexport const IbanInput = forwardRef<HTMLInputElement, IbanInputProps>(\n function IbanInput(\n {\n value,\n defaultValue,\n onChange,\n size = 'md',\n tone = 'default',\n validateOn = 'blur',\n showError,\n errorMessage,\n disabled,\n readOnly,\n required,\n placeholder,\n showFormatHint = true,\n id,\n name,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n ) {\n const { t } = useTranslation('ui');\n const ctx = useFormField();\n const inFormField = useContext(FormFieldContext) !== null;\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(() =>\n normaliseIban(defaultValue ?? ''),\n );\n const currentValue = isControlled\n ? normaliseIban(value ?? '')\n : internalValue;\n\n const [blurred, setBlurred] = useState(false);\n const composingRef = useRef(false);\n const pendingCaretRef = useRef<number | null>(null);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const composedRef = composeRefs(ref, inputRef);\n\n const reactId = useId();\n const generatedHintId = `${reactId}-hint`;\n const generatedStatusId = `${reactId}-status`;\n const generatedErrorId = `${reactId}-error`;\n\n // DEV-time guard: a standalone field with no visible label needs an\n // aria-label, mirroring Button's icon-only guard. No-op in production.\n useEffect(() => {\n const isDev =\n typeof import.meta !== 'undefined' &&\n typeof import.meta.env !== 'undefined' &&\n import.meta.env.DEV === true;\n if (isDev && !inFormField && !ariaLabel) {\n console.warn(\n '[IbanInput] No FormField/label and no `aria-label` — the field has no accessible name. Wrap it in a FormField or pass `aria-label`.',\n );\n }\n }, [inFormField, ariaLabel]);\n\n const reason = useMemo(() => classifyIban(currentValue), [currentValue]);\n // \"Complete\" = the value has reached its country's expected length, so the\n // classifier has moved past 'incomplete' to a definitive verdict.\n const isComplete = reason !== 'empty' && reason !== 'incomplete';\n const isValid = reason === 'valid';\n\n const effectiveDisabled =\n (inFormField ? ctx.disabled : false) || Boolean(disabled);\n const effectiveRequired =\n (inFormField ? ctx.required : false) || Boolean(required);\n\n // Whether the component's OWN feedback should surface. `showError` is a\n // controlled escape hatch (e.g. the bank rejected the IBAN); otherwise the\n // client only flags a COMPLETE value that fails its structural/checksum\n // check — never a partially-typed one — and `validateOn` governs the trigger.\n const ownFeedbackActive =\n !readOnly &&\n (Boolean(showError) ||\n (isComplete &&\n !isValid &&\n (validateOn === 'change' || (validateOn === 'blur' && blurred))));\n\n // When inside a FormField with its own error, FormField's role=alert wins\n // and this component stays silent (no double message / duplicate\n // aria-describedby target).\n const formFieldHasError = inFormField && ctx.invalid;\n const showOwnError = ownFeedbackActive && !formFieldHasError;\n\n const effectiveInvalid = formFieldHasError || showOwnError;\n const effectiveTone: 'default' | 'error' =\n effectiveInvalid || tone === 'error' ? 'error' : 'default';\n\n const ownErrorText = useMemo(() => {\n if (errorMessage) return errorMessage;\n if (reason === 'badChecksum') return t('inputs.iban.errorChecksum');\n if (reason === 'badFormat') return t('inputs.iban.errorFormat');\n return t('inputs.iban.errorIncomplete');\n }, [errorMessage, reason, t]);\n\n const wantsHint = !inFormField && showFormatHint && !readOnly;\n const standaloneDescribedBy = inFormField\n ? undefined\n : [\n wantsHint ? generatedHintId : null,\n showOwnError ? generatedErrorId : generatedStatusId,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n const describedBy = inFormField\n ? ctx.describedBy || undefined\n : standaloneDescribedBy;\n\n const inputId = useFormFieldControlId(ctx, id);\n\n const emit = useCallback(\n (next: string) => {\n const nextReason = classifyIban(next);\n onChange?.(next, {\n isValid: nextReason === 'valid',\n isComplete: nextReason !== 'empty' && nextReason !== 'incomplete',\n reason: nextReason,\n });\n },\n [onChange],\n );\n\n const commit = useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n emit(next);\n },\n [isControlled, emit],\n );\n\n // Restore caret after a normalising re-render that may have changed the\n // string length (mid-string edit / paste). Mirrors phone-input's caret\n // discipline.\n useIsomorphicLayoutEffect(() => {\n if (pendingCaretRef.current == null) return;\n const pos = pendingCaretRef.current;\n pendingCaretRef.current = null;\n const node = inputRef.current;\n if (node && document.activeElement === node) {\n const safePos = Math.min(pos, node.value.length);\n node.setSelectionRange(safePos, safePos);\n }\n });\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (readOnly) return;\n if (composingRef.current) return;\n const target = event.target;\n const raw = target.value;\n const caret = target.selectionStart ?? raw.length;\n const keptBefore = countKeptBefore(raw, caret);\n const next = normaliseIban(raw);\n pendingCaretRef.current = Math.min(keptBefore, next.length);\n commit(next);\n };\n\n const handleCompositionStart = () => {\n composingRef.current = true;\n };\n\n const handleCompositionEnd = (\n event: CompositionEvent<HTMLInputElement>,\n ) => {\n composingRef.current = false;\n if (readOnly) return;\n const next = normaliseIban(event.currentTarget.value);\n pendingCaretRef.current = next.length;\n commit(next);\n };\n\n const handlePaste = (event: ClipboardEvent<HTMLInputElement>) => {\n if (readOnly) return;\n const text = event.clipboardData.getData('text');\n event.preventDefault();\n const node = inputRef.current;\n const selStart = node?.selectionStart ?? currentValue.length;\n const selEnd = node?.selectionEnd ?? currentValue.length;\n const cleaned = normaliseIban(text);\n const before = currentValue.slice(0, selStart);\n const after = currentValue.slice(selEnd);\n const next = normaliseIban(before + cleaned + after);\n pendingCaretRef.current = Math.min(\n (before + cleaned).length,\n next.length,\n );\n commit(next);\n };\n\n const handleBlur = () => {\n if (validateOn === 'blur') setBlurred(true);\n };\n\n const agentHandle = useMemo<IbanInputHandle>(\n () => ({\n getValue: () => currentValue,\n setValue: (next) => {\n const normalised = normaliseIban(next);\n if (!isControlled) setInternalValue(normalised);\n emit(normalised);\n inputRef.current?.focus();\n },\n clear: () => {\n if (!isControlled) setInternalValue('');\n emit('');\n inputRef.current?.focus();\n },\n focus: () => inputRef.current?.focus(),\n isValid: () => classifyIban(currentValue) === 'valid',\n }),\n [currentValue, isControlled, emit],\n );\n useAgentRegistration(ibanInputAgent, agentHandle, id);\n\n const resolvedPlaceholder = placeholder ?? t('inputs.iban.placeholder');\n\n const statusMessage =\n readOnly || inFormField\n ? ''\n : isValid\n ? t('inputs.iban.valid')\n : currentValue.length > 0 && !isComplete\n ? t('inputs.iban.charactersEntered', { count: currentValue.length })\n : '';\n\n const errorText = showOwnError ? ownErrorText : '';\n\n const showEndIcon =\n !readOnly && (showOwnError || (isValid && !inFormField));\n\n return (\n <div\n className=\"ds:flex ds:flex-col\"\n data-component=\"iban-input\"\n data-component-id={id}\n >\n <div\n data-slot=\"iban-input\"\n className={wrapperVariants({ size, tone: effectiveTone, className })}\n >\n <input\n ref={composedRef}\n id={inputId}\n name={name}\n // dir=\"ltr\": the IBAN glyphs render LTR even under an RTL surrounding\n // UI — a value-rendering concern, not a layout-direction violation.\n dir=\"ltr\"\n type=\"text\"\n inputMode=\"text\"\n autoCapitalize=\"characters\"\n autoCorrect=\"off\"\n autoComplete=\"off\"\n spellCheck={false}\n maxLength={MAX_IBAN_LENGTH}\n // Loose structural mirror (2 letters + 2 digits + alphanumerics) as a\n // non-JS fallback. The real per-country length + mod-97 rule lives in\n // classifyIban.\n pattern=\"[A-Za-z]{2}[0-9]{2}[A-Za-z0-9]+\"\n value={currentValue}\n placeholder={resolvedPlaceholder}\n disabled={effectiveDisabled}\n readOnly={readOnly}\n aria-label={ariaLabel}\n aria-describedby={describedBy}\n aria-invalid={effectiveInvalid || undefined}\n aria-required={effectiveRequired || undefined}\n onChange={handleChange}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n onPaste={handlePaste}\n onBlur={handleBlur}\n className={inputVariants({ size, hasEnd: showEndIcon })}\n />\n {showEndIcon ? (\n <span\n aria-hidden=\"true\"\n className={`${adornmentEnd} ${\n showOwnError ? 'ds:text-destructive' : 'ds:text-success'\n }`}\n >\n {showOwnError ? <CircleAlert /> : <CircleCheck />}\n </span>\n ) : null}\n </div>\n\n {wantsHint ? (\n <p\n id={generatedHintId}\n className={`${captionBase} ds:text-muted-foreground`}\n >\n {t('inputs.iban.formatHint')}\n </p>\n ) : null}\n\n {/* Polite live region (role=status): announces the valid affordance and\n the typing-progress count as TEXT, satisfying 1.4.1 (never\n colour-only). Never carries an actionable error — that goes to the\n assertive node below, mirroring the kit's input-error convention. */}\n <p\n id={generatedStatusId}\n role=\"status\"\n aria-live=\"polite\"\n className={`${captionBase} ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] ${\n isValid ? 'ds:text-success' : 'ds:text-muted-foreground'\n } ${statusMessage ? '' : 'ds:sr-only'}`}\n >\n {statusMessage ? (\n <>\n {isValid ? (\n <CircleCheck\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0\"\n />\n ) : null}\n <span>{statusMessage}</span>\n </>\n ) : null}\n </p>\n\n {/* Assertive error region (role=alert): a validation error the user\n must correct is announced assertively. Rendered only when the\n component owns the error — inside a FormField, FormField's\n role=alert wins. */}\n {errorText ? (\n <p\n id={generatedErrorId}\n role=\"alert\"\n className={`${captionBase} ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] ds:text-destructive`}\n >\n <CircleAlert aria-hidden=\"true\" className=\"ds:size-4 ds:shrink-0\" />\n <span>{errorText}</span>\n </p>\n ) : null}\n </div>\n );\n },\n);\n\nIbanInput.displayName = 'IbanInput';\n\nexport { wrapperVariants as ibanWrapperVariants };\n"],"names":["ibanInputAgent","handle","args","IBAN_LENGTHS","MIN_IBAN_LENGTH","MAX_IBAN_LENGTH","ibanMod97","value","rearranged","remainder","i","code","mapped","j","classifyIban","raw","country","expected","isValidIban","wrapperVariants","cva","INPUT_SURFACE_CHROME","INPUT_SURFACE_HEIGHT","INPUT_SURFACE_TONE","inputVariants","INPUT_SURFACE_TEXT","adornmentEnd","captionBase","normaliseIban","input","c","countKeptBefore","str","position","kept","IbanInput","forwardRef","defaultValue","onChange","size","tone","validateOn","showError","errorMessage","disabled","readOnly","required","placeholder","showFormatHint","id","name","className","ariaLabel","ref","t","useTranslation","ctx","useFormField","inFormField","useContext","FormFieldContext","isControlled","internalValue","setInternalValue","useState","currentValue","blurred","setBlurred","composingRef","useRef","pendingCaretRef","inputRef","composedRef","composeRefs","reactId","useId","generatedHintId","generatedStatusId","generatedErrorId","useEffect","reason","useMemo","isComplete","isValid","effectiveDisabled","effectiveRequired","ownFeedbackActive","formFieldHasError","showOwnError","effectiveInvalid","effectiveTone","ownErrorText","wantsHint","standaloneDescribedBy","describedBy","inputId","useFormFieldControlId","emit","useCallback","next","nextReason","commit","useIsomorphicLayoutEffect","pos","node","safePos","handleChange","event","target","caret","keptBefore","handleCompositionStart","handleCompositionEnd","handlePaste","text","selStart","selEnd","cleaned","before","after","handleBlur","agentHandle","normalised","_a","useAgentRegistration","resolvedPlaceholder","statusMessage","errorText","showEndIcon","jsxs","jsx","CircleAlert","CircleCheck","Fragment"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { c as M } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as F } from "react-i18next";
5
5
  import { P as k } from "./popover-CN5IsOeS.js";
6
6
  import { B as D } from "./button-DohK_Ak_.js";
7
- import { S as E } from "./state-backed-text-input-Cgh4ms3p.js";
7
+ import { S as E } from "./state-backed-text-input-DVETOhSS.js";
8
8
  import { u as G } from "./registry-DvAUVLHh.js";
9
9
  import { S as J } from "./search-QbWPlY5f.js";
10
10
  const U = {
@@ -269,4 +269,4 @@ export {
269
269
  X as I,
270
270
  U as i
271
271
  };
272
- //# sourceMappingURL=icon-picker-DQMG9L6M.js.map
272
+ //# sourceMappingURL=icon-picker-BmU6gpZT.js.map