@alfadocs/ui-kit-debug 1.132.0 → 1.134.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 (463) hide show
  1. package/dist/_chunks/{agenda-card-B8hV3dZV.js → agenda-card-B9wgX_Ed.js} +2 -2
  2. package/dist/_chunks/{agenda-card-B8hV3dZV.js.map → agenda-card-B9wgX_Ed.js.map} +1 -1
  3. package/dist/_chunks/{agenda-tray-Bu46s3dI.js → agenda-tray-CGcS_qoM.js} +2 -2
  4. package/dist/_chunks/{agenda-tray-Bu46s3dI.js.map → agenda-tray-CGcS_qoM.js.map} +1 -1
  5. package/dist/_chunks/appointment-card-DG3m9yN-.js +504 -0
  6. package/dist/_chunks/appointment-card-DG3m9yN-.js.map +1 -0
  7. package/dist/_chunks/{appointment-peek-DZa6xyUb.js → appointment-peek-BK0tDs4C.js} +2 -2
  8. package/dist/_chunks/{appointment-peek-DZa6xyUb.js.map → appointment-peek-BK0tDs4C.js.map} +1 -1
  9. package/dist/_chunks/{appointment-timeline-DQePqpyH.js → appointment-timeline-BiI2riRZ.js} +2 -2
  10. package/dist/_chunks/{appointment-timeline-DQePqpyH.js.map → appointment-timeline-BiI2riRZ.js.map} +1 -1
  11. package/dist/_chunks/appointment-tray-ClJCtYQj.js +200 -0
  12. package/dist/_chunks/appointment-tray-ClJCtYQj.js.map +1 -0
  13. package/dist/_chunks/{appointment-workflow-status-DMjuIK90.js → appointment-workflow-status-S-lx81Yz.js} +2 -2
  14. package/dist/_chunks/{appointment-workflow-status-DMjuIK90.js.map → appointment-workflow-status-S-lx81Yz.js.map} +1 -1
  15. package/dist/_chunks/ban-CiSCCcOE.js +15 -0
  16. package/dist/_chunks/ban-CiSCCcOE.js.map +1 -0
  17. package/dist/_chunks/{calendar-BIoOeBTT.js → calendar-CyLtLBNP.js} +2 -2
  18. package/dist/_chunks/{calendar-BIoOeBTT.js.map → calendar-CyLtLBNP.js.map} +1 -1
  19. package/dist/_chunks/calendar-appointment-editor-dialog-BSkIYGlW.js +13773 -0
  20. package/dist/_chunks/calendar-appointment-editor-dialog-BSkIYGlW.js.map +1 -0
  21. package/dist/_chunks/{calendar-event-card-BNEzkjm-.js → calendar-event-card-BJifpYZQ.js} +7 -6
  22. package/dist/_chunks/{calendar-event-card-BNEzkjm-.js.map → calendar-event-card-BJifpYZQ.js.map} +1 -1
  23. package/dist/_chunks/{care-plan-card-DKScH9Ss.js → care-plan-card-CjHq6PLo.js} +6 -6
  24. package/dist/_chunks/{care-plan-card-DKScH9Ss.js.map → care-plan-card-CjHq6PLo.js.map} +1 -1
  25. package/dist/_chunks/{care-plan-entry-card-AG1y3nyW.js → care-plan-entry-card-DY1toF6E.js} +2 -2
  26. package/dist/_chunks/{care-plan-entry-card-AG1y3nyW.js.map → care-plan-entry-card-DY1toF6E.js.map} +1 -1
  27. package/dist/_chunks/{care-plan-header-Dx5OMkc9.js → care-plan-header-CeFXUDnL.js} +6 -6
  28. package/dist/_chunks/{care-plan-header-Dx5OMkc9.js.map → care-plan-header-CeFXUDnL.js.map} +1 -1
  29. package/dist/_chunks/check-in-documents-CEVcgcYZ.js +136 -0
  30. package/dist/_chunks/check-in-documents-CEVcgcYZ.js.map +1 -0
  31. package/dist/_chunks/{clinical-note-card-pPaeWWnu.js → clinical-note-card-D--IwbZa.js} +2 -2
  32. package/dist/_chunks/{clinical-note-card-pPaeWWnu.js.map → clinical-note-card-D--IwbZa.js.map} +1 -1
  33. package/dist/_chunks/document-preview-DLVIrOYV.js +385 -0
  34. package/dist/_chunks/document-preview-DLVIrOYV.js.map +1 -0
  35. package/dist/_chunks/{entity-card-fpm-KUKc.js → entity-card-p-LANpYt.js} +18 -17
  36. package/dist/_chunks/{entity-card-fpm-KUKc.js.map → entity-card-p-LANpYt.js.map} +1 -1
  37. package/dist/_chunks/{error-page-B0fGNTRB.js → error-page-WLhmWUTq.js} +100 -115
  38. package/dist/_chunks/error-page-WLhmWUTq.js.map +1 -0
  39. package/dist/_chunks/finished-terminal-unDnXT4j.js +191 -0
  40. package/dist/_chunks/finished-terminal-unDnXT4j.js.map +1 -0
  41. package/dist/_chunks/house-DGCypGTo.js +21 -0
  42. package/dist/_chunks/house-DGCypGTo.js.map +1 -0
  43. package/dist/_chunks/is-safe-url-CEy9CEml.js +8 -0
  44. package/dist/_chunks/is-safe-url-CEy9CEml.js.map +1 -0
  45. package/dist/_chunks/keypad-DBH_keVs.js +152 -0
  46. package/dist/_chunks/keypad-DBH_keVs.js.map +1 -0
  47. package/dist/_chunks/keypad-button-mOaPQRrH.js +114 -0
  48. package/dist/_chunks/keypad-button-mOaPQRrH.js.map +1 -0
  49. package/dist/_chunks/{message-card-BG3_3nN1.js → message-card-Bw_q1qKx.js} +2 -2
  50. package/dist/_chunks/{message-card-BG3_3nN1.js.map → message-card-Bw_q1qKx.js.map} +1 -1
  51. package/dist/_chunks/{message-tray-BjZv0Fsk.js → message-tray-pLGgLmoG.js} +2 -2
  52. package/dist/_chunks/{message-tray-BjZv0Fsk.js.map → message-tray-pLGgLmoG.js.map} +1 -1
  53. package/dist/_chunks/{note-attachment-MNTIqdSz.js → note-attachment-JTIy9iXN.js} +2 -2
  54. package/dist/_chunks/{note-attachment-MNTIqdSz.js.map → note-attachment-JTIy9iXN.js.map} +1 -1
  55. package/dist/_chunks/{note-timeline-BQeW0VZY.js → note-timeline-BbjHMhkL.js} +2 -2
  56. package/dist/_chunks/{note-timeline-BQeW0VZY.js.map → note-timeline-BbjHMhkL.js.map} +1 -1
  57. package/dist/_chunks/{notes-panel-Cm-_pCRJ.js → notes-panel-BAyPOr8N.js} +2 -2
  58. package/dist/_chunks/{notes-panel-Cm-_pCRJ.js.map → notes-panel-BAyPOr8N.js.map} +1 -1
  59. package/dist/_chunks/{operator-hero-CnfWckNQ.js → operator-hero-D4wfVu2l.js} +2 -2
  60. package/dist/_chunks/{operator-hero-CnfWckNQ.js.map → operator-hero-D4wfVu2l.js.map} +1 -1
  61. package/dist/_chunks/otp-input-BNOTlxq3.js +342 -0
  62. package/dist/_chunks/otp-input-BNOTlxq3.js.map +1 -0
  63. package/dist/_chunks/patient-account-settings-BkAtIxJW.js +546 -0
  64. package/dist/_chunks/patient-account-settings-BkAtIxJW.js.map +1 -0
  65. package/dist/_chunks/patient-card-DTh3QTyS.js +125 -0
  66. package/dist/_chunks/patient-card-DTh3QTyS.js.map +1 -0
  67. package/dist/_chunks/patient-check-in-resume-xhqjC6gf.js +742 -0
  68. package/dist/_chunks/patient-check-in-resume-xhqjC6gf.js.map +1 -0
  69. package/dist/_chunks/patient-sign-in-pin-CDBqV254.js +432 -0
  70. package/dist/_chunks/patient-sign-in-pin-CDBqV254.js.map +1 -0
  71. package/dist/_chunks/patient-sign-in-steps-C2JSqlok.js +199 -0
  72. package/dist/_chunks/patient-sign-in-steps-C2JSqlok.js.map +1 -0
  73. package/dist/_chunks/{patient-summary-card-BUcZ-gaL.js → patient-summary-card-Bl2NknPe.js} +2 -2
  74. package/dist/_chunks/{patient-summary-card-BUcZ-gaL.js.map → patient-summary-card-Bl2NknPe.js.map} +1 -1
  75. package/dist/_chunks/{payment-request-card-Dv4WbRBe.js → payment-request-card-CNW00DCx.js} +6 -6
  76. package/dist/_chunks/{payment-request-card-Dv4WbRBe.js.map → payment-request-card-CNW00DCx.js.map} +1 -1
  77. package/dist/_chunks/{pdf-viewer-BnBKdx0y.js → pdf-viewer-TRC5jEm5.js} +472 -425
  78. package/dist/_chunks/pdf-viewer-TRC5jEm5.js.map +1 -0
  79. package/dist/_chunks/pin-entry-BugWQMOS.js +219 -0
  80. package/dist/_chunks/pin-entry-BugWQMOS.js.map +1 -0
  81. package/dist/_chunks/pin-indicator-Cb-n40UI.js +124 -0
  82. package/dist/_chunks/pin-indicator-Cb-n40UI.js.map +1 -0
  83. package/dist/_chunks/portal-details-CTEsm705.js +478 -0
  84. package/dist/_chunks/portal-details-CTEsm705.js.map +1 -0
  85. package/dist/_chunks/portal-documents-D8skew0h.js +902 -0
  86. package/dist/_chunks/portal-documents-D8skew0h.js.map +1 -0
  87. package/dist/_chunks/portal-parts-BdR29P7z.js +285 -0
  88. package/dist/_chunks/portal-parts-BdR29P7z.js.map +1 -0
  89. package/dist/_chunks/{privacy-mask-DJ1gee4c.js → privacy-mask-C19dJFMk.js} +5 -5
  90. package/dist/_chunks/{privacy-mask-DJ1gee4c.js.map → privacy-mask-C19dJFMk.js.map} +1 -1
  91. package/dist/_chunks/{product-hub-panel-a8wdVOUt.js → product-hub-panel-K4QbULG7.js} +2 -2
  92. package/dist/_chunks/{product-hub-panel-a8wdVOUt.js.map → product-hub-panel-K4QbULG7.js.map} +1 -1
  93. package/dist/_chunks/{registration-form-CwbhtKcy.js → registration-form-DS3RuKHu.js} +2 -2
  94. package/dist/_chunks/{registration-form-CwbhtKcy.js.map → registration-form-DS3RuKHu.js.map} +1 -1
  95. package/dist/_chunks/{reserved.agent-W8mR179D.js → reserved.agent-DOzOBUW7.js} +2 -2
  96. package/dist/_chunks/{reserved.agent-W8mR179D.js.map → reserved.agent-DOzOBUW7.js.map} +1 -1
  97. package/dist/_chunks/session-countdown-DOx1IBUB.js +232 -0
  98. package/dist/_chunks/session-countdown-DOx1IBUB.js.map +1 -0
  99. package/dist/_chunks/{sign-document-CQZVzfpk.js → sign-document-DDZbmYHu.js} +2 -2
  100. package/dist/_chunks/{sign-document-CQZVzfpk.js.map → sign-document-DDZbmYHu.js.map} +1 -1
  101. package/dist/_chunks/{signature-field-DjabvRZm.js → signature-field-BjlY_yXH.js} +39 -34
  102. package/dist/_chunks/signature-field-BjlY_yXH.js.map +1 -0
  103. package/dist/_chunks/{signature-request-4pGq3YBe.js → signature-request-CHsM_iWi.js} +2 -2
  104. package/dist/_chunks/{signature-request-4pGq3YBe.js.map → signature-request-CHsM_iWi.js.map} +1 -1
  105. package/dist/_chunks/{signature-status-chip-pIoQjvH8.js → signature-status-chip-DS9hHwIt.js} +66 -69
  106. package/dist/_chunks/signature-status-chip-DS9hHwIt.js.map +1 -0
  107. package/dist/_chunks/signing-end-screen-an9P8DOT.js +1041 -0
  108. package/dist/_chunks/signing-end-screen-an9P8DOT.js.map +1 -0
  109. package/dist/_chunks/sms-code-entry-Dgp4GwlM.js +316 -0
  110. package/dist/_chunks/sms-code-entry-Dgp4GwlM.js.map +1 -0
  111. package/dist/_chunks/step-up-dialog-C2JqJmCA.js +132 -0
  112. package/dist/_chunks/step-up-dialog-C2JqJmCA.js.map +1 -0
  113. package/dist/_chunks/{task-editor-BL2hHxNz.js → task-editor-g1AGfxhr.js} +38 -38
  114. package/dist/_chunks/{task-editor-BL2hHxNz.js.map → task-editor-g1AGfxhr.js.map} +1 -1
  115. package/dist/_chunks/{use-appointment-details-read-_b7FRB1x.js → use-appointment-details-read-Dzc6fEzG.js} +6 -6
  116. package/dist/_chunks/{use-appointment-details-read-_b7FRB1x.js.map → use-appointment-details-read-Dzc6fEzG.js.map} +1 -1
  117. package/dist/_chunks/use-zoom-drilldown-Cr1baU5X.js +221 -0
  118. package/dist/_chunks/use-zoom-drilldown-Cr1baU5X.js.map +1 -0
  119. package/dist/_chunks/{user-x-DYszNtIg.js → user-x-BJZg4kaP.js} +8 -19
  120. package/dist/_chunks/user-x-BJZg4kaP.js.map +1 -0
  121. package/dist/_chunks/{verify-identity-types-CxtrBXsZ.js → verify-identity-types-C6Bam8v6.js} +2 -2
  122. package/dist/_chunks/{verify-identity-types-CxtrBXsZ.js.map → verify-identity-types-C6Bam8v6.js.map} +1 -1
  123. package/dist/agent-catalog.json +723 -364
  124. package/dist/agent-i18n/en.json +75 -18
  125. package/dist/browser-support.js +1 -1
  126. package/dist/components/_shared/is-safe-url.d.ts +3 -1
  127. package/dist/components/_shared/is-safe-url.d.ts.map +1 -1
  128. package/dist/components/agenda-card/index.js +2 -2
  129. package/dist/components/agenda-tray/index.js +1 -1
  130. package/dist/components/appointment-card/appointment-card.d.ts +45 -0
  131. package/dist/components/appointment-card/appointment-card.d.ts.map +1 -1
  132. package/dist/components/appointment-card/appointment-tray.agent.d.ts.map +1 -1
  133. package/dist/components/appointment-card/appointment-tray.d.ts +11 -0
  134. package/dist/components/appointment-card/appointment-tray.d.ts.map +1 -1
  135. package/dist/components/appointment-card/index.js +3 -3
  136. package/dist/components/appointment-details-panel/index.js +1 -1
  137. package/dist/components/appointment-peek/index.js +1 -1
  138. package/dist/components/appointment-timeline/index.js +1 -1
  139. package/dist/components/booking/index.js +1 -1
  140. package/dist/components/calendar/index.js +1 -1
  141. package/dist/components/calendar-event-card/index.js +1 -1
  142. package/dist/components/care-plan-card/index.js +1 -1
  143. package/dist/components/care-plan-entry-card/index.js +1 -1
  144. package/dist/components/care-plan-header/index.js +1 -1
  145. package/dist/components/clinical-note-card/index.js +1 -1
  146. package/dist/components/document-preview/document-preview.agent.d.ts.map +1 -1
  147. package/dist/components/document-preview/document-preview.d.ts +61 -7
  148. package/dist/components/document-preview/document-preview.d.ts.map +1 -1
  149. package/dist/components/document-preview/index.js +1 -1
  150. package/dist/components/finished-terminal/finished-terminal.d.ts +63 -6
  151. package/dist/components/finished-terminal/finished-terminal.d.ts.map +1 -1
  152. package/dist/components/finished-terminal/index.d.ts +1 -1
  153. package/dist/components/finished-terminal/index.d.ts.map +1 -1
  154. package/dist/components/finished-terminal/index.js +1 -1
  155. package/dist/components/index.d.ts +12 -0
  156. package/dist/components/index.d.ts.map +1 -1
  157. package/dist/components/keypad/index.d.ts +3 -0
  158. package/dist/components/keypad/index.d.ts.map +1 -0
  159. package/dist/components/keypad/index.js +6 -0
  160. package/dist/components/keypad/index.js.map +1 -0
  161. package/dist/components/keypad/keypad.d.ts +54 -0
  162. package/dist/components/keypad/keypad.d.ts.map +1 -0
  163. package/dist/components/keypad-button/index.d.ts +3 -0
  164. package/dist/components/keypad-button/index.d.ts.map +1 -0
  165. package/dist/components/keypad-button/index.js +6 -0
  166. package/dist/components/keypad-button/index.js.map +1 -0
  167. package/dist/components/keypad-button/keypad-button.d.ts +33 -0
  168. package/dist/components/keypad-button/keypad-button.d.ts.map +1 -0
  169. package/dist/components/message-card/index.js +2 -2
  170. package/dist/components/message-tray/index.js +1 -1
  171. package/dist/components/note-timeline/index.js +1 -1
  172. package/dist/components/notes-panel/index.js +1 -1
  173. package/dist/components/operator-hero/index.js +1 -1
  174. package/dist/components/otp-input/index.js +1 -1
  175. package/dist/components/otp-input/otp-input.d.ts +11 -0
  176. package/dist/components/otp-input/otp-input.d.ts.map +1 -1
  177. package/dist/components/patient-summary-card/index.js +1 -1
  178. package/dist/components/payment-card/index.js +1 -1
  179. package/dist/components/pdf-viewer/index.js +1 -1
  180. package/dist/components/pdf-viewer/pdf-viewer.agent.d.ts.map +1 -1
  181. package/dist/components/pdf-viewer/pdf-viewer.d.ts +7 -0
  182. package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
  183. package/dist/components/pin-entry/index.d.ts +3 -0
  184. package/dist/components/pin-entry/index.d.ts.map +1 -0
  185. package/dist/components/pin-entry/index.js +5 -0
  186. package/dist/components/pin-entry/index.js.map +1 -0
  187. package/dist/components/pin-entry/pin-entry.agent.d.ts +4 -0
  188. package/dist/components/pin-entry/pin-entry.agent.d.ts.map +1 -0
  189. package/dist/components/pin-entry/pin-entry.d.ts +64 -0
  190. package/dist/components/pin-entry/pin-entry.d.ts.map +1 -0
  191. package/dist/components/pin-indicator/index.d.ts +3 -0
  192. package/dist/components/pin-indicator/index.d.ts.map +1 -0
  193. package/dist/components/pin-indicator/index.js +9 -0
  194. package/dist/components/pin-indicator/index.js.map +1 -0
  195. package/dist/components/pin-indicator/pin-indicator.d.ts +34 -0
  196. package/dist/components/pin-indicator/pin-indicator.d.ts.map +1 -0
  197. package/dist/components/product-hub-tray/index.js +2 -2
  198. package/dist/components/session-countdown/index.js +1 -1
  199. package/dist/components/session-countdown/session-countdown.d.ts +19 -0
  200. package/dist/components/session-countdown/session-countdown.d.ts.map +1 -1
  201. package/dist/components/sign-document/index.js +1 -1
  202. package/dist/components/signature-field/index.js +1 -1
  203. package/dist/components/signature-field/signature-field.d.ts +17 -6
  204. package/dist/components/signature-field/signature-field.d.ts.map +1 -1
  205. package/dist/components/signature-status-chip/index.js +1 -1
  206. package/dist/components/signature-status-chip/signature-status-chip.d.ts +3 -2
  207. package/dist/components/signature-status-chip/signature-status-chip.d.ts.map +1 -1
  208. package/dist/components/sms-code-entry/index.d.ts +3 -0
  209. package/dist/components/sms-code-entry/index.d.ts.map +1 -0
  210. package/dist/components/sms-code-entry/index.js +5 -0
  211. package/dist/components/sms-code-entry/index.js.map +1 -0
  212. package/dist/components/sms-code-entry/sms-code-entry.agent.d.ts +4 -0
  213. package/dist/components/sms-code-entry/sms-code-entry.agent.d.ts.map +1 -0
  214. package/dist/components/sms-code-entry/sms-code-entry.d.ts +156 -0
  215. package/dist/components/sms-code-entry/sms-code-entry.d.ts.map +1 -0
  216. package/dist/components/step-up-dialog/index.d.ts +3 -0
  217. package/dist/components/step-up-dialog/index.d.ts.map +1 -0
  218. package/dist/components/step-up-dialog/index.js +5 -0
  219. package/dist/components/step-up-dialog/index.js.map +1 -0
  220. package/dist/components/step-up-dialog/step-up-dialog.d.ts +108 -0
  221. package/dist/components/step-up-dialog/step-up-dialog.d.ts.map +1 -0
  222. package/dist/components/task-editor/index.js +1 -1
  223. package/dist/components/workflow-status/index.js +1 -1
  224. package/dist/core.css +1 -1
  225. package/dist/hooks/index.js +1 -1
  226. package/dist/hooks/use-signing-session.d.ts +7 -2
  227. package/dist/hooks/use-signing-session.d.ts.map +1 -1
  228. package/dist/host-compat.css +10 -1
  229. package/dist/i18n/locales/ar.d.ts +514 -1
  230. package/dist/i18n/locales/ar.d.ts.map +1 -1
  231. package/dist/i18n/locales/ar.js +512 -4
  232. package/dist/i18n/locales/ar.js.map +1 -1
  233. package/dist/i18n/locales/de.d.ts +514 -1
  234. package/dist/i18n/locales/de.d.ts.map +1 -1
  235. package/dist/i18n/locales/de.js +520 -5
  236. package/dist/i18n/locales/de.js.map +1 -1
  237. package/dist/i18n/locales/el.d.ts +514 -1
  238. package/dist/i18n/locales/el.d.ts.map +1 -1
  239. package/dist/i18n/locales/el.js +515 -5
  240. package/dist/i18n/locales/el.js.map +1 -1
  241. package/dist/i18n/locales/en.d.ts +516 -1
  242. package/dist/i18n/locales/en.d.ts.map +1 -1
  243. package/dist/i18n/locales/en.js +522 -4
  244. package/dist/i18n/locales/en.js.map +1 -1
  245. package/dist/i18n/locales/es.d.ts +514 -1
  246. package/dist/i18n/locales/es.d.ts.map +1 -1
  247. package/dist/i18n/locales/es.js +513 -5
  248. package/dist/i18n/locales/es.js.map +1 -1
  249. package/dist/i18n/locales/fr.d.ts +514 -1
  250. package/dist/i18n/locales/fr.d.ts.map +1 -1
  251. package/dist/i18n/locales/fr.js +513 -5
  252. package/dist/i18n/locales/fr.js.map +1 -1
  253. package/dist/i18n/locales/hi.d.ts +514 -1
  254. package/dist/i18n/locales/hi.d.ts.map +1 -1
  255. package/dist/i18n/locales/hi.js +513 -5
  256. package/dist/i18n/locales/hi.js.map +1 -1
  257. package/dist/i18n/locales/it.d.ts +514 -1
  258. package/dist/i18n/locales/it.d.ts.map +1 -1
  259. package/dist/i18n/locales/it.js +520 -5
  260. package/dist/i18n/locales/it.js.map +1 -1
  261. package/dist/i18n/locales/ja.d.ts +514 -1
  262. package/dist/i18n/locales/ja.d.ts.map +1 -1
  263. package/dist/i18n/locales/ja.js +513 -5
  264. package/dist/i18n/locales/ja.js.map +1 -1
  265. package/dist/i18n/locales/nl.d.ts +514 -1
  266. package/dist/i18n/locales/nl.d.ts.map +1 -1
  267. package/dist/i18n/locales/nl.js +520 -5
  268. package/dist/i18n/locales/nl.js.map +1 -1
  269. package/dist/i18n/locales/pl.d.ts +514 -1
  270. package/dist/i18n/locales/pl.d.ts.map +1 -1
  271. package/dist/i18n/locales/pl.js +520 -5
  272. package/dist/i18n/locales/pl.js.map +1 -1
  273. package/dist/i18n/locales/pt.d.ts +514 -1
  274. package/dist/i18n/locales/pt.d.ts.map +1 -1
  275. package/dist/i18n/locales/pt.js +520 -5
  276. package/dist/i18n/locales/pt.js.map +1 -1
  277. package/dist/i18n/locales/ro.d.ts +514 -1
  278. package/dist/i18n/locales/ro.d.ts.map +1 -1
  279. package/dist/i18n/locales/ro.js +520 -5
  280. package/dist/i18n/locales/ro.js.map +1 -1
  281. package/dist/i18n/locales/ru.d.ts +514 -1
  282. package/dist/i18n/locales/ru.d.ts.map +1 -1
  283. package/dist/i18n/locales/ru.js +512 -4
  284. package/dist/i18n/locales/ru.js.map +1 -1
  285. package/dist/i18n/locales/sq.d.ts +514 -1
  286. package/dist/i18n/locales/sq.d.ts.map +1 -1
  287. package/dist/i18n/locales/sq.js +513 -5
  288. package/dist/i18n/locales/sq.js.map +1 -1
  289. package/dist/i18n/locales/sv.d.ts +514 -1
  290. package/dist/i18n/locales/sv.d.ts.map +1 -1
  291. package/dist/i18n/locales/sv.js +513 -5
  292. package/dist/i18n/locales/sv.js.map +1 -1
  293. package/dist/i18n/locales/tr.d.ts +514 -1
  294. package/dist/i18n/locales/tr.d.ts.map +1 -1
  295. package/dist/i18n/locales/tr.js +515 -5
  296. package/dist/i18n/locales/tr.js.map +1 -1
  297. package/dist/i18n/locales/zh.d.ts +514 -1
  298. package/dist/i18n/locales/zh.d.ts.map +1 -1
  299. package/dist/i18n/locales/zh.js +513 -5
  300. package/dist/i18n/locales/zh.js.map +1 -1
  301. package/dist/index.js +1271 -1204
  302. package/dist/index.js.map +1 -1
  303. package/dist/locales/ar.json +516 -3
  304. package/dist/locales/de.json +517 -4
  305. package/dist/locales/el.json +517 -4
  306. package/dist/locales/en.json +516 -3
  307. package/dist/locales/es.json +517 -4
  308. package/dist/locales/fr.json +517 -4
  309. package/dist/locales/hi.json +517 -4
  310. package/dist/locales/it.json +517 -4
  311. package/dist/locales/ja.json +517 -4
  312. package/dist/locales/nl.json +517 -4
  313. package/dist/locales/pl.json +517 -4
  314. package/dist/locales/pt.json +517 -4
  315. package/dist/locales/ro.json +517 -4
  316. package/dist/locales/ru.json +516 -3
  317. package/dist/locales/sq.json +517 -4
  318. package/dist/locales/sv.json +517 -4
  319. package/dist/locales/tr.json +517 -4
  320. package/dist/locales/zh.json +517 -4
  321. package/dist/patterns/calendar/calendar-workspace.d.ts.map +1 -1
  322. package/dist/patterns/calendar/calendar-workspace.model.d.ts.map +1 -1
  323. package/dist/patterns/calendar/calendar.journey.d.ts +4 -0
  324. package/dist/patterns/calendar/calendar.journey.d.ts.map +1 -1
  325. package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -1
  326. package/dist/patterns/calendar/calendar.surface.d.ts +15 -1
  327. package/dist/patterns/calendar/calendar.surface.d.ts.map +1 -1
  328. package/dist/patterns/calendar/calendar.types.d.ts +4 -0
  329. package/dist/patterns/calendar/calendar.types.d.ts.map +1 -1
  330. package/dist/patterns/calendar/index.js +1 -1
  331. package/dist/patterns/check-in-documents/check-in-documents.d.ts +61 -0
  332. package/dist/patterns/check-in-documents/check-in-documents.d.ts.map +1 -0
  333. package/dist/patterns/check-in-documents/check-in-signable-document.d.ts +32 -0
  334. package/dist/patterns/check-in-documents/check-in-signable-document.d.ts.map +1 -0
  335. package/dist/patterns/check-in-documents/index.d.ts +4 -0
  336. package/dist/patterns/check-in-documents/index.d.ts.map +1 -0
  337. package/dist/patterns/check-in-documents/index.js +5 -0
  338. package/dist/patterns/check-in-documents/index.js.map +1 -0
  339. package/dist/patterns/error-page/index.js +1 -1
  340. package/dist/patterns/patient-account-settings/index.d.ts +4 -0
  341. package/dist/patterns/patient-account-settings/index.d.ts.map +1 -0
  342. package/dist/patterns/patient-account-settings/index.js +5 -0
  343. package/dist/patterns/patient-account-settings/index.js.map +1 -0
  344. package/dist/patterns/patient-account-settings/patient-account-settings-panels.d.ts +36 -0
  345. package/dist/patterns/patient-account-settings/patient-account-settings-panels.d.ts.map +1 -0
  346. package/dist/patterns/patient-account-settings/patient-account-settings.d.ts +94 -0
  347. package/dist/patterns/patient-account-settings/patient-account-settings.d.ts.map +1 -0
  348. package/dist/patterns/patient-account-settings/patient-account-settings.types.d.ts +91 -0
  349. package/dist/patterns/patient-account-settings/patient-account-settings.types.d.ts.map +1 -0
  350. package/dist/patterns/patient-check-in/index.d.ts +20 -0
  351. package/dist/patterns/patient-check-in/index.d.ts.map +1 -0
  352. package/dist/patterns/patient-check-in/index.js +13 -0
  353. package/dist/patterns/patient-check-in/index.js.map +1 -0
  354. package/dist/patterns/patient-check-in/patient-check-in-changed.d.ts +33 -0
  355. package/dist/patterns/patient-check-in/patient-check-in-changed.d.ts.map +1 -0
  356. package/dist/patterns/patient-check-in/patient-check-in-connection-notice.d.ts +29 -0
  357. package/dist/patterns/patient-check-in/patient-check-in-connection-notice.d.ts.map +1 -0
  358. package/dist/patterns/patient-check-in/patient-check-in-done.d.ts +25 -0
  359. package/dist/patterns/patient-check-in/patient-check-in-done.d.ts.map +1 -0
  360. package/dist/patterns/patient-check-in/patient-check-in-entry.d.ts +29 -0
  361. package/dist/patterns/patient-check-in/patient-check-in-entry.d.ts.map +1 -0
  362. package/dist/patterns/patient-check-in/patient-check-in-hub-empty.d.ts +23 -0
  363. package/dist/patterns/patient-check-in/patient-check-in-hub-empty.d.ts.map +1 -0
  364. package/dist/patterns/patient-check-in/patient-check-in-hub.d.ts +61 -0
  365. package/dist/patterns/patient-check-in/patient-check-in-hub.d.ts.map +1 -0
  366. package/dist/patterns/patient-check-in/patient-check-in-personal-data.d.ts +73 -0
  367. package/dist/patterns/patient-check-in/patient-check-in-personal-data.d.ts.map +1 -0
  368. package/dist/patterns/patient-check-in/patient-check-in-privacy.d.ts +9 -0
  369. package/dist/patterns/patient-check-in/patient-check-in-privacy.d.ts.map +1 -0
  370. package/dist/patterns/patient-check-in/patient-check-in-resume.d.ts +29 -0
  371. package/dist/patterns/patient-check-in/patient-check-in-resume.d.ts.map +1 -0
  372. package/dist/patterns/patient-check-in/patient-check-in-shell.d.ts +60 -0
  373. package/dist/patterns/patient-check-in/patient-check-in-shell.d.ts.map +1 -0
  374. package/dist/patterns/patient-check-in/patient-check-in-types.d.ts +92 -0
  375. package/dist/patterns/patient-check-in/patient-check-in-types.d.ts.map +1 -0
  376. package/dist/patterns/patient-portal/index.d.ts +12 -0
  377. package/dist/patterns/patient-portal/index.d.ts.map +1 -0
  378. package/dist/patterns/patient-portal/index.js +13 -0
  379. package/dist/patterns/patient-portal/index.js.map +1 -0
  380. package/dist/patterns/patient-portal/portal-appointments.d.ts +70 -0
  381. package/dist/patterns/patient-portal/portal-appointments.d.ts.map +1 -0
  382. package/dist/patterns/patient-portal/portal-details.d.ts +148 -0
  383. package/dist/patterns/patient-portal/portal-details.d.ts.map +1 -0
  384. package/dist/patterns/patient-portal/portal-documents.d.ts +74 -0
  385. package/dist/patterns/patient-portal/portal-documents.d.ts.map +1 -0
  386. package/dist/patterns/patient-portal/portal-format.d.ts +14 -0
  387. package/dist/patterns/patient-portal/portal-format.d.ts.map +1 -0
  388. package/dist/patterns/patient-portal/portal-home.d.ts +71 -0
  389. package/dist/patterns/patient-portal/portal-home.d.ts.map +1 -0
  390. package/dist/patterns/patient-portal/portal-parts.d.ts +107 -0
  391. package/dist/patterns/patient-portal/portal-parts.d.ts.map +1 -0
  392. package/dist/patterns/patient-portal/portal-shell.d.ts +84 -0
  393. package/dist/patterns/patient-portal/portal-shell.d.ts.map +1 -0
  394. package/dist/patterns/patient-portal/portal-types.d.ts +157 -0
  395. package/dist/patterns/patient-portal/portal-types.d.ts.map +1 -0
  396. package/dist/patterns/patient-sign-in/index.d.ts +7 -0
  397. package/dist/patterns/patient-sign-in/index.d.ts.map +1 -0
  398. package/dist/patterns/patient-sign-in/index.js +15 -0
  399. package/dist/patterns/patient-sign-in/index.js.map +1 -0
  400. package/dist/patterns/patient-sign-in/patient-card.d.ts +74 -0
  401. package/dist/patterns/patient-sign-in/patient-card.d.ts.map +1 -0
  402. package/dist/patterns/patient-sign-in/patient-sign-in-email.d.ts +109 -0
  403. package/dist/patterns/patient-sign-in/patient-sign-in-email.d.ts.map +1 -0
  404. package/dist/patterns/patient-sign-in/patient-sign-in-pin.d.ts +157 -0
  405. package/dist/patterns/patient-sign-in/patient-sign-in-pin.d.ts.map +1 -0
  406. package/dist/patterns/patient-sign-in/patient-sign-in-steps.d.ts +143 -0
  407. package/dist/patterns/patient-sign-in/patient-sign-in-steps.d.ts.map +1 -0
  408. package/dist/patterns/registration-form/index.js +1 -1
  409. package/dist/patterns/signature-request/index.js +1 -1
  410. package/dist/patterns/signing/index.d.ts +25 -0
  411. package/dist/patterns/signing/index.d.ts.map +1 -0
  412. package/dist/patterns/signing/index.js +16 -0
  413. package/dist/patterns/signing/index.js.map +1 -0
  414. package/dist/patterns/signing/multi-field-signer.d.ts +117 -0
  415. package/dist/patterns/signing/multi-field-signer.d.ts.map +1 -0
  416. package/dist/patterns/signing/signing-awaiting-screen.d.ts +25 -0
  417. package/dist/patterns/signing/signing-awaiting-screen.d.ts.map +1 -0
  418. package/dist/patterns/signing/signing-chrome.d.ts +30 -0
  419. package/dist/patterns/signing/signing-chrome.d.ts.map +1 -0
  420. package/dist/patterns/signing/signing-document-screen.d.ts +87 -0
  421. package/dist/patterns/signing/signing-document-screen.d.ts.map +1 -0
  422. package/dist/patterns/signing/signing-end-screen.d.ts +27 -0
  423. package/dist/patterns/signing/signing-end-screen.d.ts.map +1 -0
  424. package/dist/patterns/signing/signing-finished-screen.d.ts +34 -0
  425. package/dist/patterns/signing/signing-finished-screen.d.ts.map +1 -0
  426. package/dist/patterns/signing/signing-footer.d.ts +56 -0
  427. package/dist/patterns/signing/signing-footer.d.ts.map +1 -0
  428. package/dist/patterns/signing/signing-handoff-screen.d.ts +37 -0
  429. package/dist/patterns/signing/signing-handoff-screen.d.ts.map +1 -0
  430. package/dist/patterns/signing/signing-message-dialog.d.ts +29 -0
  431. package/dist/patterns/signing/signing-message-dialog.d.ts.map +1 -0
  432. package/dist/patterns/signing/signing-progress-chip.d.ts +27 -0
  433. package/dist/patterns/signing/signing-progress-chip.d.ts.map +1 -0
  434. package/dist/patterns/signing/signing-roster.d.ts +44 -0
  435. package/dist/patterns/signing/signing-roster.d.ts.map +1 -0
  436. package/dist/patterns/signing/signing-staff-id-confirmation.d.ts +49 -0
  437. package/dist/patterns/signing/signing-staff-id-confirmation.d.ts.map +1 -0
  438. package/dist/patterns/verify-identity/index.js +1 -1
  439. package/dist/tokens.css +1 -1
  440. package/package.json +49 -1
  441. package/dist/_chunks/appointment-card-OAOur8lH.js +0 -434
  442. package/dist/_chunks/appointment-card-OAOur8lH.js.map +0 -1
  443. package/dist/_chunks/appointment-tray-DSFqO5Rm.js +0 -193
  444. package/dist/_chunks/appointment-tray-DSFqO5Rm.js.map +0 -1
  445. package/dist/_chunks/calendar-appointment-editor-dialog-WW6V1SGh.js +0 -13663
  446. package/dist/_chunks/calendar-appointment-editor-dialog-WW6V1SGh.js.map +0 -1
  447. package/dist/_chunks/document-preview-_kQ9QvZV.js +0 -291
  448. package/dist/_chunks/document-preview-_kQ9QvZV.js.map +0 -1
  449. package/dist/_chunks/error-page-B0fGNTRB.js.map +0 -1
  450. package/dist/_chunks/finished-terminal-FR8uc_Ws.js +0 -122
  451. package/dist/_chunks/finished-terminal-FR8uc_Ws.js.map +0 -1
  452. package/dist/_chunks/is-safe-url-DkETxeHz.js +0 -7
  453. package/dist/_chunks/is-safe-url-DkETxeHz.js.map +0 -1
  454. package/dist/_chunks/otp-input-gV1446Dw.js +0 -301
  455. package/dist/_chunks/otp-input-gV1446Dw.js.map +0 -1
  456. package/dist/_chunks/pdf-viewer-BnBKdx0y.js.map +0 -1
  457. package/dist/_chunks/session-countdown-C4tzbJVc.js +0 -223
  458. package/dist/_chunks/session-countdown-C4tzbJVc.js.map +0 -1
  459. package/dist/_chunks/signature-field-DjabvRZm.js.map +0 -1
  460. package/dist/_chunks/signature-status-chip-pIoQjvH8.js.map +0 -1
  461. package/dist/_chunks/use-zoom-drilldown-qCX34w9I.js +0 -210
  462. package/dist/_chunks/use-zoom-drilldown-qCX34w9I.js.map +0 -1
  463. package/dist/_chunks/user-x-DYszNtIg.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"verify-identity-types-CxtrBXsZ.js","sources":["../../src/patterns/verify-identity/use-countdown.ts","../../src/patterns/verify-identity/verify-identity-steps.tsx","../../src/patterns/verify-identity/verify-identity.tsx","../../src/patterns/verify-identity/change-email-dialog.tsx","../../src/patterns/verify-identity/verify-identity-types.ts"],"sourcesContent":["/* A whole-second countdown that follows the clock, not the ticks, so a */\n/* throttled background tab does not run slow. */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface Countdown {\n /** Whole seconds left. 0 when idle or finished. */\n remaining: number;\n /** True once a countdown has run to zero since the last `start`. */\n finished: boolean;\n start: (seconds: number) => void;\n stop: () => void;\n}\n\nexport function useCountdown(): Countdown {\n const [deadline, setDeadline] = useState<number | null>(null);\n const [remaining, setRemaining] = useState(0);\n const [finished, setFinished] = useState(false);\n const timer = useRef<number | undefined>(undefined);\n\n useEffect(() => {\n if (deadline === null) return;\n const tick = () => {\n const left = Math.max(0, Math.ceil((deadline - Date.now()) / 1000));\n setRemaining(left);\n if (left === 0) {\n setDeadline(null);\n setFinished(true);\n }\n };\n tick();\n timer.current = window.setInterval(tick, 1000);\n return () => window.clearInterval(timer.current);\n }, [deadline]);\n\n const start = useCallback((seconds: number) => {\n const whole = Math.max(0, Math.ceil(seconds));\n setFinished(false);\n if (whole === 0) {\n setDeadline(null);\n setRemaining(0);\n return;\n }\n setRemaining(whole);\n setDeadline(Date.now() + whole * 1000);\n }, []);\n\n const stop = useCallback(() => {\n setDeadline(null);\n setRemaining(0);\n setFinished(false);\n }, []);\n\n return { remaining, finished, start, stop };\n}\n\n/** 272 -> \"4:32\". */\nexport function formatClock(seconds: number): string {\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${m}:${String(s).padStart(2, '0')}`;\n}\n","/* -------------------------------------------------------------------- */\n/* The three kinds of step inside VerifyIdentity: a password, a code */\n/* from the authenticator app, and a code the host sends by SMS or */\n/* email. Each asks the host through a callback and shows its answer. */\n/* */\n/* Nothing here logs, stores or puts a password, a code, a number or an */\n/* address in a `data-*` attribute. Shipped with VerifyIdentity; not an */\n/* export of its own. */\n/* -------------------------------------------------------------------- */\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type FormEvent,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Alert } from '../../components/alert';\nimport { Button } from '../../components/button';\nimport { FormField } from '../../components/form-field';\nimport { OTPInput } from '../../components/otp-input';\nimport { PasswordInput } from '../../components/password-input';\nimport { formatClock, useCountdown } from './use-countdown';\nimport type { SendCodeResult, VerifyResult } from './verify-identity-types';\n\n/* -------------------------------------------------------------------- */\n/* Shared */\n/* -------------------------------------------------------------------- */\n\ntype FailureKind = 'invalid' | 'expired' | 'rate-limited' | 'error';\n\ninterface Failure {\n kind: FailureKind;\n /** The host's own line, already translated. */\n message?: string;\n}\n\nconst failureFrom = (result: Exclude<VerifyResult, { status: 'ok' }>) =>\n result.status === 'error'\n ? ({ kind: 'error', message: result.message } as const)\n : ({ kind: result.status } as const);\n\n/** Calls the host. A throw or a rejection is an error: it is never\n * logged, because it may carry what the user typed. */\nasync function ask<T>(\n call: (() => Promise<T>) | undefined,\n fallback: T,\n): Promise<T> {\n if (!call) return fallback;\n try {\n return await call();\n } catch {\n return fallback;\n }\n}\n\nconst ERROR_RESULT = { status: 'error' } as const;\n\nfunction useMounted() {\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n return mounted;\n}\n\nfunction useFailureText(passwordStep = false) {\n const { t } = useTranslation('ui');\n return (failure: Failure | null, waitSeconds: number): string | undefined => {\n if (!failure) return undefined;\n if (failure.message) return failure.message;\n switch (failure.kind) {\n case 'invalid':\n return passwordStep\n ? t('verifyIdentity.password.invalid')\n : t('verifyIdentity.invalidCode');\n case 'expired':\n return t('verifyIdentity.expiredCode');\n case 'rate-limited':\n return t('verifyIdentity.verifyRateLimited', { seconds: waitSeconds });\n default:\n return t('verifyIdentity.genericError');\n }\n };\n}\n\ninterface StepProps {\n /** Called once the host says the proof is good. */\n onDone: () => void;\n /** Reports whether a call to the host is out, for `data-submitting`. */\n onBusyChange: (busy: boolean) => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* Password */\n/* -------------------------------------------------------------------- */\n\ninterface PasswordStepProps extends StepProps {\n verify?: (password: string) => Promise<VerifyResult>;\n}\n\nexport function PasswordStep({\n verify,\n onDone,\n onBusyChange,\n}: PasswordStepProps) {\n const { t } = useTranslation('ui');\n const mounted = useMounted();\n const input = useRef<HTMLInputElement>(null);\n const [busy, setBusy] = useState(false);\n const [failure, setFailure] = useState<Failure | null>(null);\n const wait = useCountdown();\n const text = useFailureText(true);\n\n const locked = failure?.kind === 'rate-limited' && wait.remaining > 0;\n useEffect(() => {\n if (wait.finished) setFailure(null);\n }, [wait.finished]);\n\n const submit = async (event: FormEvent) => {\n event.preventDefault();\n // Read from the input, not state: the value stays out of the DOM\n // and out of React.\n const password = input.current?.value ?? '';\n if (busy || locked) return;\n if (password === '') {\n setFailure({\n kind: 'invalid',\n message: t('verifyIdentity.password.required'),\n });\n input.current?.focus();\n return;\n }\n setBusy(true);\n onBusyChange(true);\n setFailure(null);\n const result = await ask(() => verify!(password), ERROR_RESULT);\n if (!mounted.current) return;\n setBusy(false);\n onBusyChange(false);\n if (result.status === 'ok') {\n onDone();\n return;\n }\n if (input.current) input.current.value = '';\n if (result.status === 'rate-limited') wait.start(result.waitSeconds);\n setFailure(failureFrom(result));\n input.current?.focus();\n };\n\n return (\n <form\n noValidate\n onSubmit={submit}\n aria-busy={busy || undefined}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <FormField\n label={t('verifyIdentity.password.label')}\n required\n error={text(failure, wait.remaining)}\n >\n <PasswordInput\n ref={input}\n name=\"password\"\n autoComplete=\"current-password\"\n disabled={busy}\n />\n </FormField>\n <Button\n type=\"submit\"\n intent=\"primary\"\n size=\"lg\"\n loading={busy}\n aria-disabled={locked || undefined}\n data-action=\"verify\"\n className=\"ds:self-start\"\n >\n {t('verifyIdentity.continue')}\n </Button>\n </form>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* A code: from the authenticator app, or sent by SMS or email */\n/* -------------------------------------------------------------------- */\n\ntype SendPhase = 'sending' | 'ready' | 'failed' | 'limited';\n\ninterface CodeStepProps extends StepProps {\n kind: 'authenticator' | 'sms' | 'email';\n codeLength: number;\n /** Absent for the authenticator: the app makes its own codes. */\n send?: () => Promise<SendCodeResult>;\n verify?: (code: string) => Promise<VerifyResult>;\n}\n\nconst DEFAULT_RESEND_SECONDS = 30;\n\nexport function CodeStep({\n kind,\n codeLength,\n send,\n verify,\n onDone,\n onBusyChange,\n}: CodeStepProps) {\n const { t } = useTranslation('ui');\n const mounted = useMounted();\n const panel = useRef<HTMLDivElement>(null);\n const sends = kind !== 'authenticator';\n\n const [phase, setPhase] = useState<SendPhase>(sends ? 'sending' : 'ready');\n const [sendMessage, setSendMessage] = useState<string | undefined>();\n const [hasCode, setHasCode] = useState(!sends);\n const [code, setCode] = useState('');\n const [verifying, setVerifying] = useState(false);\n const [failure, setFailure] = useState<Failure | null>(null);\n const resend = useCountdown();\n const expiry = useCountdown();\n const wait = useCountdown();\n const text = useFailureText();\n\n const focusFirstBox = useCallback(() => {\n panel.current?.querySelector<HTMLInputElement>('input')?.focus();\n }, []);\n\n const sendCount = useRef(0);\n const sendCode = useCallback(async () => {\n sendCount.current += 1;\n setPhase('sending');\n setFailure(null);\n setCode('');\n onBusyChange(true);\n const result = await ask(send, ERROR_RESULT);\n if (!mounted.current) return;\n onBusyChange(false);\n if (result.status === 'sent') {\n setPhase('ready');\n setHasCode(true);\n resend.start(result.resendAfterSeconds ?? DEFAULT_RESEND_SECONDS);\n if (result.expiresInSeconds) expiry.start(result.expiresInSeconds);\n else expiry.stop();\n return;\n }\n if (result.status === 'rate-limited') {\n setPhase('limited');\n resend.start(result.waitSeconds);\n return;\n }\n setSendMessage(result.message);\n setPhase('failed');\n // eslint-disable-next-line react-hooks/exhaustive-deps -- the countdown objects are stable enough, and `send` is read fresh\n }, [send, onBusyChange]);\n\n // The code goes out when the step opens. The ref keeps a development\n // double mount from sending two.\n const started = useRef(false);\n useEffect(() => {\n if (!sends || started.current) return;\n started.current = true;\n void sendCode();\n }, [sends, sendCode]);\n\n // Focus follows the box when a new code arrives.\n const lastPhase = useRef(phase);\n useEffect(() => {\n // The first code leaves focus on the step heading; a new one moves\n // it to the box.\n if (\n phase === 'ready' &&\n lastPhase.current === 'sending' &&\n hasCode &&\n sendCount.current > 1\n ) {\n focusFirstBox();\n }\n lastPhase.current = phase;\n }, [phase, hasCode, focusFirstBox]);\n\n const locked = failure?.kind === 'rate-limited' && wait.remaining > 0;\n useEffect(() => {\n if (wait.finished) setFailure(null);\n }, [wait.finished]);\n\n // The code timed out in the browser: say so, the server still decides.\n const expiredHere = expiry.finished && !failure;\n const shown: Failure | null =\n failure ?? (expiredHere ? { kind: 'expired' } : null);\n\n const verifyCode = async (value: string) => {\n if (verifying || locked || value.length !== codeLength) return;\n setVerifying(true);\n onBusyChange(true);\n setFailure(null);\n const result = await ask(() => verify!(value), ERROR_RESULT);\n if (!mounted.current) return;\n setVerifying(false);\n onBusyChange(false);\n if (result.status === 'ok') {\n onDone();\n return;\n }\n if (result.status === 'rate-limited') wait.start(result.waitSeconds);\n setFailure(failureFrom(result));\n setCode('');\n // After the box is enabled again.\n window.setTimeout(focusFirstBox, 0);\n };\n\n const waiting = resend.remaining > 0;\n const showBox = hasCode;\n const canResend = sends && phase !== 'sending';\n\n return (\n <div\n ref={panel}\n data-slot=\"code-step\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n {/* Always mounted: a live region announces a change, not its first\n content. */}\n <div\n role=\"status\"\n className=\"type-body-sm ds:text-[var(--muted-foreground)]\"\n >\n {phase === 'sending' ? t('verifyIdentity.sending') : null}\n </div>\n\n {phase === 'failed' && (\n <Alert variant=\"error\" data-slot=\"send-failed\">\n <Alert.Description>\n {sendMessage ?? t('verifyIdentity.sendFailed')}\n </Alert.Description>\n </Alert>\n )}\n {phase === 'limited' && (\n <Alert variant=\"warning\" data-slot=\"send-limited\">\n <Alert.Description>\n {resend.remaining > 0\n ? t('verifyIdentity.sendRateLimited', {\n seconds: resend.remaining,\n })\n : t('verifyIdentity.sendRateLimitedOver')}\n </Alert.Description>\n </Alert>\n )}\n\n {showBox && (\n <FormField\n label={t('verifyIdentity.codeLabel')}\n error={text(shown, wait.remaining)}\n >\n <OTPInput\n length={codeLength}\n mode=\"numeric\"\n // SMS autofill where the browser offers it; the first box\n // always carries `autocomplete=\"one-time-code\"`.\n webOtp={kind === 'sms'}\n value={code}\n onChange={setCode}\n onComplete={(value) => void verifyCode(value)}\n disabled={verifying}\n />\n </FormField>\n )}\n\n {showBox && expiry.remaining > 0 && (\n <p\n className=\"type-body-sm ds:text-[var(--muted-foreground)]\"\n data-slot=\"expiry\"\n >\n {t('verifyIdentity.expiresIn', {\n time: formatClock(expiry.remaining),\n })}\n </p>\n )}\n\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n {showBox && (\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"lg\"\n loading={verifying}\n aria-disabled={code.length !== codeLength || locked || undefined}\n data-action=\"verify\"\n onClick={() => void verifyCode(code)}\n >\n {t('verifyIdentity.verify')}\n </Button>\n )}\n {canResend && (\n <Button\n type=\"button\"\n intent={showBox ? 'outline' : 'primary'}\n size=\"lg\"\n disabled={verifying}\n // Not native `disabled` for the wait: focus stays on the button.\n aria-disabled={waiting || undefined}\n data-action={phase === 'failed' ? 'retry-send' : 'resend-code'}\n onClick={() => {\n if (!waiting) void sendCode();\n }}\n >\n {waiting\n ? t('verifyIdentity.resendIn', { seconds: resend.remaining })\n : phase === 'failed'\n ? t('verifyIdentity.tryAgain')\n : t('verifyIdentity.resend')}\n </Button>\n )}\n </div>\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* VerifyIdentity: the \"Verify it's you\" step-up flow. */\n/* */\n/* The host passes an ordered list of steps. The server decides which */\n/* steps a user needs and in which order; the UI only renders them one */\n/* after another, and calls `onVerified` after the last. Every check is */\n/* a callback the host owns: the kit makes no request and never builds */\n/* or reveals a full phone number or address, it shows the masked text */\n/* it is given. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CircleCheck } from 'lucide-react';\nimport { cva } from 'class-variance-authority';\nimport { Alert } from '../../components/alert';\nimport { Button } from '../../components/button';\nimport { Dialog } from '../../components/dialog';\nimport { isSafeHref } from '../../components/_shared/safe-href';\nimport { CodeStep, PasswordStep } from './verify-identity-steps';\nimport type {\n VerifyIdentityCallbacks,\n VerifyIdentityStep,\n} from './verify-identity-types';\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\nexport interface VerifyIdentityProps\n extends\n VerifyIdentityCallbacks,\n Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /**\n * The proofs to ask for, in order. The server decides both; the UI\n * renders them as given.\n */\n steps: readonly VerifyIdentityStep[];\n /** What the user is about to do, such as \"Change login email\". Pass it\n * translated. Default \"Verify it's you\". */\n title?: string;\n /** The line under the title, such as \"Confirm it is you before you change\n * your login email.\" Pass it translated. */\n description?: string;\n /** Level of the title. Default 2; each step heading is one deeper. */\n headingLevel?: 2 | 3;\n /** The phone the SMS goes to, already masked: \"+39 ••• ••• 4567\". The kit\n * never builds a masked number itself. */\n maskedPhone?: string;\n /** The current login email, already masked: \"m••••@example.com\". */\n maskedEmail?: string;\n /** Digits in a code. Default 6. */\n codeLength?: number;\n /**\n * True when the user has no confirmed mobile. The steps do not run:\n * the card explains why one is needed and offers to set it up.\n */\n missingMobile?: boolean;\n /** Called by the set-up button of the missing-mobile card. */\n onSetUpMobile?: () => void;\n /** Where the set-up button leads instead. A path on the same site, or an\n * address written in full. */\n setUpMobileHref?: string;\n /** Called after the last step is right. */\n onVerified: () => void;\n /** Adds a Cancel button. */\n onCancel?: () => void;\n /** Hides the title and description, for a host that draws its own, such as\n * a dialog. */\n hideHeader?: boolean;\n}\n\n/* -------------------------------------------------------------------- */\n/* Styles */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:text-start ds:text-[var(--foreground)]',\n);\n\nconst headingVariants = cva(\n 'type-h4 ds:m-0 ds:focus-visible:outline-solid ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)] ds:forced-colors:focus-visible:outline-[CanvasText]',\n);\n\nconst HEADINGS = { 2: 'h2', 3: 'h3', 4: 'h4' } as const;\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\ntype Position = number | 'verified';\n\nfunction VerifyIdentityInner({\n steps,\n title,\n description,\n headingLevel = 2,\n maskedPhone,\n maskedEmail,\n codeLength = 6,\n missingMobile = false,\n onSetUpMobile,\n setUpMobileHref,\n onVerified,\n onCancel,\n hideHeader = false,\n onVerifyPassword,\n onVerifyAuthenticator,\n onSendSmsCode,\n onVerifySmsCode,\n onSendEmailCode,\n onVerifyEmailCode,\n className,\n forwardedRef,\n ...rest\n}: VerifyIdentityProps & { forwardedRef: React.Ref<HTMLDivElement> }) {\n const { t } = useTranslation('ui');\n const titleId = useId();\n const stepTitleId = useId();\n const [position, setPosition] = useState<Position>(0);\n const [busy, setBusy] = useState(false);\n const stepHeading = useRef<HTMLHeadingElement>(null);\n\n const index = typeof position === 'number' ? position : steps.length - 1;\n const step = steps[index];\n const state = missingMobile\n ? 'missing-factor'\n : position === 'verified'\n ? 'verified'\n : (step ?? 'empty');\n\n // Focus goes to the new step's heading when the step changes, not when\n // the flow first opens: a dialog places focus itself.\n const first = useRef(true);\n useEffect(() => {\n if (first.current) {\n first.current = false;\n return;\n }\n stepHeading.current?.focus();\n }, [position]);\n\n const onBusyChange = useCallback((value: boolean) => setBusy(value), []);\n\n const next = useCallback(() => {\n setBusy(false);\n if (index + 1 < steps.length) {\n setPosition(index + 1);\n } else {\n setPosition('verified');\n onVerified();\n }\n }, [index, steps.length, onVerified]);\n\n const phone = maskedPhone;\n const email = maskedEmail;\n const stepText = useMemo(\n () => ({\n password: {\n title: t('verifyIdentity.password.title'),\n description: t('verifyIdentity.password.description'),\n },\n authenticator: {\n title: t('verifyIdentity.authenticator.title'),\n description: t('verifyIdentity.authenticator.description'),\n },\n sms: {\n title: t('verifyIdentity.sms.title'),\n description: phone\n ? t('verifyIdentity.sms.description', { phone })\n : t('verifyIdentity.sms.descriptionNoPhone'),\n },\n email: {\n title: t('verifyIdentity.email.title'),\n description: email\n ? t('verifyIdentity.email.description', { email })\n : t('verifyIdentity.email.descriptionNoEmail'),\n },\n }),\n [t, phone, email],\n );\n\n const Title = HEADINGS[headingLevel];\n const StepTitle = HEADINGS[(headingLevel + 1) as 3 | 4];\n const setUpLink =\n setUpMobileHref && isSafeHref(setUpMobileHref)\n ? setUpMobileHref\n : undefined;\n\n let body: React.ReactNode = null;\n let heading: string | undefined;\n let lead: string | undefined;\n\n if (missingMobile) {\n heading = t('verifyIdentity.missingMobile.title');\n lead = t('verifyIdentity.missingMobile.description');\n body = (\n <div\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n data-slot=\"missing-factor\"\n >\n <Alert variant=\"warning\" announce=\"off\">\n <Alert.Description>\n {t('verifyIdentity.missingMobile.reason')}\n </Alert.Description>\n </Alert>\n {(onSetUpMobile || setUpLink) &&\n (setUpLink ? (\n <Button\n asChild\n intent=\"primary\"\n size=\"lg\"\n className=\"ds:self-start\"\n >\n <a href={setUpLink} data-action=\"set-up-mobile\">\n {t('verifyIdentity.missingMobile.action')}\n </a>\n </Button>\n ) : (\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"lg\"\n data-action=\"set-up-mobile\"\n className=\"ds:self-start\"\n onClick={onSetUpMobile}\n >\n {t('verifyIdentity.missingMobile.action')}\n </Button>\n ))}\n </div>\n );\n } else if (position === 'verified') {\n heading = t('verifyIdentity.verified');\n body = (\n <p className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-success ds:m-0\">\n <CircleCheck aria-hidden=\"true\" className=\"ds:size-4 ds:shrink-0\" />\n <span>{t('verifyIdentity.verifiedDescription')}</span>\n </p>\n );\n } else if (step) {\n heading = stepText[step].title;\n lead = stepText[step].description;\n body = (\n <div key={`${step}-${index}`} data-step={step}>\n {step === 'password' ? (\n <PasswordStep\n verify={onVerifyPassword}\n onDone={next}\n onBusyChange={onBusyChange}\n />\n ) : step === 'authenticator' ? (\n <CodeStep\n kind=\"authenticator\"\n codeLength={codeLength}\n verify={onVerifyAuthenticator}\n onDone={next}\n onBusyChange={onBusyChange}\n />\n ) : step === 'sms' ? (\n <CodeStep\n kind=\"sms\"\n codeLength={codeLength}\n send={onSendSmsCode}\n verify={onVerifySmsCode}\n onDone={next}\n onBusyChange={onBusyChange}\n />\n ) : (\n <CodeStep\n kind=\"email\"\n codeLength={codeLength}\n send={onSendEmailCode}\n verify={onVerifyEmailCode}\n onDone={next}\n onBusyChange={onBusyChange}\n />\n )}\n </div>\n );\n }\n\n return (\n <div\n ref={forwardedRef}\n {...rest}\n data-component=\"verify-identity\"\n data-state={state}\n data-step-index={missingMobile ? undefined : index}\n data-step-count={steps.length}\n data-submitting={busy ? 'true' : 'false'}\n className={rootVariants({ className })}\n >\n {!hideHeader && (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <Title id={titleId} className=\"type-h3 ds:m-0\">\n {title ?? t('verifyIdentity.title')}\n </Title>\n <p className=\"type-body-sm ds:m-0 ds:text-[var(--muted-foreground)]\">\n {description ?? t('verifyIdentity.description')}\n </p>\n </div>\n )}\n\n <div\n role=\"group\"\n aria-labelledby={stepTitleId}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n {steps.length > 1 && !missingMobile && position !== 'verified' && (\n <p\n className=\"type-body-sm ds:m-0 ds:text-[var(--muted-foreground)]\"\n data-slot=\"progress\"\n >\n {t('verifyIdentity.progress', {\n current: index + 1,\n total: steps.length,\n })}\n </p>\n )}\n <StepTitle\n ref={stepHeading}\n id={stepTitleId}\n tabIndex={-1}\n className={headingVariants()}\n >\n {heading}\n </StepTitle>\n {lead && (\n <p className=\"type-body-sm ds:m-0 ds:text-[var(--muted-foreground)]\">\n {lead}\n </p>\n )}\n </div>\n {body}\n </div>\n\n {onCancel && position !== 'verified' && (\n <Button\n type=\"button\"\n intent=\"ghost\"\n data-action=\"cancel\"\n className=\"ds:self-start\"\n onClick={onCancel}\n >\n {t('verifyIdentity.cancel')}\n </Button>\n )}\n </div>\n );\n}\n\n/**\n * The \"Verify it's you\" step-up flow, inline. Use `VerifyIdentityDialog`\n * for a dialog. The server decides the steps and checks every answer: this\n * only renders them.\n */\nexport const VerifyIdentity = forwardRef<HTMLDivElement, VerifyIdentityProps>(\n (props, ref) => (\n // A new list of steps starts the flow again.\n <VerifyIdentityInner\n key={`${props.steps.join(',')}|${props.missingMobile ? 'm' : ''}`}\n {...props}\n forwardedRef={ref}\n />\n ),\n);\nVerifyIdentity.displayName = 'VerifyIdentity';\n\n/* -------------------------------------------------------------------- */\n/* Dialog */\n/* -------------------------------------------------------------------- */\n\nexport interface VerifyIdentityDialogProps extends Omit<\n VerifyIdentityProps,\n 'hideHeader' | 'headingLevel' | 'onCancel'\n> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\n/** `VerifyIdentity` in a dialog. Closing it starts the flow again next time. */\nexport function VerifyIdentityDialog({\n open,\n onOpenChange,\n title,\n description,\n ...flow\n}: VerifyIdentityDialogProps) {\n const { t } = useTranslation('ui');\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Content size=\"md\">\n <Dialog.Header>\n <Dialog.Title>{title ?? t('verifyIdentity.title')}</Dialog.Title>\n <Dialog.Description>\n {description ?? t('verifyIdentity.description')}\n </Dialog.Description>\n </Dialog.Header>\n <Dialog.Body>\n <VerifyIdentity\n {...flow}\n hideHeader\n onCancel={() => onOpenChange(false)}\n />\n </Dialog.Body>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* ChangeEmailDialog: verify it is you, then ask for the new login email */\n/* twice, then say what happens next. */\n/* */\n/* The host owns the rules. `onSubmitNewEmail` answers with a typed */\n/* result; the dialog shows it. The final message never repeats the new */\n/* address. */\n/* -------------------------------------------------------------------- */\n\nimport { useEffect, useId, useRef, useState, type FormEvent } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport isEmail from 'validator/lib/isEmail';\nimport { Alert } from '../../components/alert';\nimport { Button } from '../../components/button';\nimport { Dialog } from '../../components/dialog';\nimport { FormField } from '../../components/form-field';\nimport { TextInput } from '../../components/text-input';\nimport { VerifyIdentity, type VerifyIdentityProps } from './verify-identity';\n\n/** What the host answers once it has tried to change the email. */\nexport type ChangeEmailResult =\n | { status: 'ok' }\n | { status: 'already-in-use' }\n | { status: 'invalid' }\n | {\n status: 'error';\n /** Already translated. Shown in place of the kit's own line. */\n message?: string;\n };\n\nexport interface ChangeEmailDialogProps extends Omit<\n VerifyIdentityProps,\n 'hideHeader' | 'headingLevel' | 'onCancel' | 'onVerified'\n> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Called with the new address once both entries match and look like an\n * email. The host checks it for real. */\n onSubmitNewEmail: (email: string) => Promise<ChangeEmailResult>;\n}\n\ntype Phase = 'verify' | 'new-email' | 'done';\n\nconst headingClass =\n 'type-h4 ds:m-0 ds:focus-visible:outline-solid ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)] ds:forced-colors:focus-visible:outline-[CanvasText]';\n\nfunction ChangeEmailBody({\n onOpenChange,\n onSubmitNewEmail,\n ...flow\n}: Omit<ChangeEmailDialogProps, 'open' | 'title' | 'description'>) {\n const { t } = useTranslation('ui');\n const [phase, setPhase] = useState<Phase>('verify');\n const [email, setEmail] = useState('');\n const [again, setAgain] = useState('');\n const [errors, setErrors] = useState<{ email?: string; again?: string }>({});\n const [formError, setFormError] = useState<string | undefined>();\n const [submitting, setSubmitting] = useState(false);\n const heading = useRef<HTMLHeadingElement>(null);\n const doneBox = useRef<HTMLDivElement>(null);\n const emailInput = useRef<HTMLInputElement>(null);\n const againInput = useRef<HTMLInputElement>(null);\n const headingId = useId();\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n // Focus goes to the heading of the new phase.\n useEffect(() => {\n if (phase === 'new-email') heading.current?.focus();\n if (phase === 'done') doneBox.current?.focus();\n }, [phase]);\n\n if (phase === 'verify') {\n return (\n <VerifyIdentity\n {...flow}\n hideHeader\n onCancel={() => onOpenChange(false)}\n onVerified={() => setPhase('new-email')}\n />\n );\n }\n\n if (phase === 'done') {\n return (\n <div\n data-component=\"change-email-dialog\"\n data-state=\"done\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <Alert\n ref={doneBox}\n variant=\"success\"\n tabIndex={-1}\n aria-labelledby={headingId}\n >\n <Alert.Title as=\"h3\" id={headingId}>\n {t('verifyIdentity.changeEmail.doneTitle')}\n </Alert.Title>\n <Alert.Description>\n {t('verifyIdentity.changeEmail.doneDescription')}\n </Alert.Description>\n </Alert>\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"lg\"\n data-action=\"close\"\n className=\"ds:self-start\"\n onClick={() => onOpenChange(false)}\n >\n {t('verifyIdentity.changeEmail.close')}\n </Button>\n </div>\n );\n }\n\n const submit = async (event: FormEvent) => {\n event.preventDefault();\n if (submitting) return;\n const next: { email?: string; again?: string } = {};\n const value = email.trim();\n if (value === '') next.email = t('verifyIdentity.changeEmail.required');\n else if (!isEmail(value)) next.email = t('inputs.email.invalid');\n else if (again.trim() !== value) {\n next.again = t('verifyIdentity.changeEmail.mismatch');\n }\n setErrors(next);\n setFormError(undefined);\n if (next.email || next.again) {\n (next.email ? emailInput : againInput).current?.focus();\n return;\n }\n setSubmitting(true);\n let result: ChangeEmailResult;\n try {\n result = await onSubmitNewEmail(value);\n } catch {\n result = { status: 'error' };\n }\n if (!mounted.current) return;\n setSubmitting(false);\n if (result.status === 'ok') {\n setPhase('done');\n return;\n }\n if (result.status === 'already-in-use') {\n setErrors({ email: t('verifyIdentity.changeEmail.alreadyInUse') });\n emailInput.current?.focus();\n } else if (result.status === 'invalid') {\n setErrors({ email: t('verifyIdentity.changeEmail.invalid') });\n emailInput.current?.focus();\n } else {\n setFormError(result.message ?? t('verifyIdentity.genericError'));\n }\n };\n\n return (\n <form\n noValidate\n onSubmit={submit}\n aria-busy={submitting || undefined}\n data-component=\"change-email-dialog\"\n data-state=\"new-email\"\n data-submitting={submitting ? 'true' : 'false'}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <h3 ref={heading} tabIndex={-1} className={headingClass}>\n {t('verifyIdentity.changeEmail.newTitle')}\n </h3>\n <p className=\"type-body-sm ds:m-0 ds:text-[var(--muted-foreground)]\">\n {t('verifyIdentity.changeEmail.newDescription')}\n </p>\n </div>\n {formError && (\n <Alert variant=\"error\">\n <Alert.Description>{formError}</Alert.Description>\n </Alert>\n )}\n <FormField\n label={t('verifyIdentity.changeEmail.newLabel')}\n required\n error={errors.email}\n >\n <TextInput\n ref={emailInput}\n type=\"email\"\n inputMode=\"email\"\n name=\"newEmail\"\n autoComplete=\"off\"\n value={email}\n disabled={submitting}\n onChange={(event) => {\n setEmail(event.target.value);\n setErrors((previous) => ({ ...previous, email: undefined }));\n }}\n />\n </FormField>\n <FormField\n label={t('verifyIdentity.changeEmail.confirmLabel')}\n required\n error={errors.again}\n >\n <TextInput\n ref={againInput}\n type=\"email\"\n inputMode=\"email\"\n name=\"newEmailConfirm\"\n autoComplete=\"off\"\n value={again}\n disabled={submitting}\n onChange={(event) => {\n setAgain(event.target.value);\n setErrors((previous) => ({ ...previous, again: undefined }));\n }}\n />\n </FormField>\n <div className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-sm)]\">\n <Button\n type=\"submit\"\n intent=\"primary\"\n size=\"lg\"\n loading={submitting}\n data-action=\"submit\"\n >\n {t('verifyIdentity.changeEmail.submit')}\n </Button>\n <Button\n type=\"button\"\n intent=\"ghost\"\n size=\"lg\"\n disabled={submitting}\n data-action=\"cancel\"\n onClick={() => onOpenChange(false)}\n >\n {t('verifyIdentity.cancel')}\n </Button>\n </div>\n </form>\n );\n}\n\n/**\n * Change the login email: the \"Verify it's you\" steps, then the new\n * address twice, then a confirmation. Closing the dialog starts again.\n */\nexport function ChangeEmailDialog({\n open,\n onOpenChange,\n title,\n description,\n ...body\n}: ChangeEmailDialogProps) {\n const { t } = useTranslation('ui');\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Content size=\"md\">\n <Dialog.Header>\n <Dialog.Title>\n {title ?? t('verifyIdentity.changeEmail.title')}\n </Dialog.Title>\n <Dialog.Description>\n {description ?? t('verifyIdentity.changeEmail.description')}\n </Dialog.Description>\n </Dialog.Header>\n <Dialog.Body>\n <ChangeEmailBody onOpenChange={onOpenChange} {...body} />\n </Dialog.Body>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* The contract between VerifyIdentity and its host. */\n/* */\n/* The host owns every rule: which steps a user needs, in which order, */\n/* whether a code is right, how often one may be sent. The UI renders */\n/* the answers. Results are a discriminated union on `status`, so a host */\n/* cannot forget a case. */\n/* -------------------------------------------------------------------- */\n\n/** One proof the user gives. The server decides the order. */\nexport const VERIFY_IDENTITY_STEPS = [\n 'password',\n 'authenticator',\n 'sms',\n 'email',\n] as const;\n\nexport type VerifyIdentityStep = (typeof VERIFY_IDENTITY_STEPS)[number];\n\n/** What a check of a password or a code answers. */\nexport type VerifyResult =\n | { status: 'ok' }\n | { status: 'invalid' }\n | { status: 'expired' }\n | { status: 'rate-limited'; waitSeconds: number }\n | {\n status: 'error';\n /** Already translated. Shown in place of the kit's own line. */\n message?: string;\n };\n\n/** What sending an SMS or email code answers. */\nexport type SendCodeResult =\n | {\n status: 'sent';\n /** How long the code lives. Shown as a countdown when given. */\n expiresInSeconds?: number;\n /** How long until the user may ask for another. Default 30. */\n resendAfterSeconds?: number;\n }\n | { status: 'rate-limited'; waitSeconds: number }\n | {\n status: 'error';\n /** Already translated. Shown in place of the kit's own line. */\n message?: string;\n };\n\n/** The host's checks. Each one is called by the UI, never by the kit\n * itself: the kit makes no request. The password and the codes are\n * passed to these and nowhere else; the kit never logs or stores them. */\nexport interface VerifyIdentityCallbacks {\n onVerifyPassword?: (password: string) => Promise<VerifyResult>;\n onVerifyAuthenticator?: (code: string) => Promise<VerifyResult>;\n /** Called once when the SMS step opens, and again on resend. */\n onSendSmsCode?: () => Promise<SendCodeResult>;\n onVerifySmsCode?: (code: string) => Promise<VerifyResult>;\n /** Called once when the email step opens, and again on resend. */\n onSendEmailCode?: () => Promise<SendCodeResult>;\n onVerifyEmailCode?: (code: string) => Promise<VerifyResult>;\n}\n"],"names":["useCountdown","deadline","setDeadline","useState","remaining","setRemaining","finished","setFinished","timer","useRef","useEffect","tick","left","start","useCallback","seconds","whole","stop","formatClock","m","s","failureFrom","result","ask","call","fallback","ERROR_RESULT","useMounted","mounted","useFailureText","passwordStep","t","useTranslation","failure","waitSeconds","PasswordStep","verify","onDone","onBusyChange","input","busy","setBusy","setFailure","wait","text","locked","jsxs","event","password","_a","_b","_c","jsx","FormField","PasswordInput","Button","DEFAULT_RESEND_SECONDS","CodeStep","kind","codeLength","send","panel","sends","phase","setPhase","sendMessage","setSendMessage","hasCode","setHasCode","code","setCode","verifying","setVerifying","resend","expiry","focusFirstBox","sendCount","sendCode","started","lastPhase","expiredHere","shown","verifyCode","value","waiting","showBox","canResend","Alert","OTPInput","rootVariants","cva","headingVariants","HEADINGS","VerifyIdentityInner","steps","title","description","headingLevel","maskedPhone","maskedEmail","missingMobile","onSetUpMobile","setUpMobileHref","onVerified","onCancel","hideHeader","onVerifyPassword","onVerifyAuthenticator","onSendSmsCode","onVerifySmsCode","onSendEmailCode","onVerifyEmailCode","className","forwardedRef","rest","titleId","useId","stepTitleId","position","setPosition","stepHeading","index","step","state","first","next","phone","email","stepText","useMemo","Title","StepTitle","setUpLink","isSafeHref","body","heading","lead","CircleCheck","VerifyIdentity","forwardRef","props","ref","VerifyIdentityDialog","open","onOpenChange","flow","Dialog","headingClass","ChangeEmailBody","onSubmitNewEmail","setEmail","again","setAgain","errors","setErrors","formError","setFormError","submitting","setSubmitting","doneBox","emailInput","againInput","headingId","isEmail","TextInput","previous","ChangeEmailDialog","VERIFY_IDENTITY_STEPS"],"mappings":"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"}
1
+ {"version":3,"file":"verify-identity-types-C6Bam8v6.js","sources":["../../src/patterns/verify-identity/use-countdown.ts","../../src/patterns/verify-identity/verify-identity-steps.tsx","../../src/patterns/verify-identity/verify-identity.tsx","../../src/patterns/verify-identity/change-email-dialog.tsx","../../src/patterns/verify-identity/verify-identity-types.ts"],"sourcesContent":["/* A whole-second countdown that follows the clock, not the ticks, so a */\n/* throttled background tab does not run slow. */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface Countdown {\n /** Whole seconds left. 0 when idle or finished. */\n remaining: number;\n /** True once a countdown has run to zero since the last `start`. */\n finished: boolean;\n start: (seconds: number) => void;\n stop: () => void;\n}\n\nexport function useCountdown(): Countdown {\n const [deadline, setDeadline] = useState<number | null>(null);\n const [remaining, setRemaining] = useState(0);\n const [finished, setFinished] = useState(false);\n const timer = useRef<number | undefined>(undefined);\n\n useEffect(() => {\n if (deadline === null) return;\n const tick = () => {\n const left = Math.max(0, Math.ceil((deadline - Date.now()) / 1000));\n setRemaining(left);\n if (left === 0) {\n setDeadline(null);\n setFinished(true);\n }\n };\n tick();\n timer.current = window.setInterval(tick, 1000);\n return () => window.clearInterval(timer.current);\n }, [deadline]);\n\n const start = useCallback((seconds: number) => {\n const whole = Math.max(0, Math.ceil(seconds));\n setFinished(false);\n if (whole === 0) {\n setDeadline(null);\n setRemaining(0);\n return;\n }\n setRemaining(whole);\n setDeadline(Date.now() + whole * 1000);\n }, []);\n\n const stop = useCallback(() => {\n setDeadline(null);\n setRemaining(0);\n setFinished(false);\n }, []);\n\n return { remaining, finished, start, stop };\n}\n\n/** 272 -> \"4:32\". */\nexport function formatClock(seconds: number): string {\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${m}:${String(s).padStart(2, '0')}`;\n}\n","/* -------------------------------------------------------------------- */\n/* The three kinds of step inside VerifyIdentity: a password, a code */\n/* from the authenticator app, and a code the host sends by SMS or */\n/* email. Each asks the host through a callback and shows its answer. */\n/* */\n/* Nothing here logs, stores or puts a password, a code, a number or an */\n/* address in a `data-*` attribute. Shipped with VerifyIdentity; not an */\n/* export of its own. */\n/* -------------------------------------------------------------------- */\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type FormEvent,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Alert } from '../../components/alert';\nimport { Button } from '../../components/button';\nimport { FormField } from '../../components/form-field';\nimport { OTPInput } from '../../components/otp-input';\nimport { PasswordInput } from '../../components/password-input';\nimport { formatClock, useCountdown } from './use-countdown';\nimport type { SendCodeResult, VerifyResult } from './verify-identity-types';\n\n/* -------------------------------------------------------------------- */\n/* Shared */\n/* -------------------------------------------------------------------- */\n\ntype FailureKind = 'invalid' | 'expired' | 'rate-limited' | 'error';\n\ninterface Failure {\n kind: FailureKind;\n /** The host's own line, already translated. */\n message?: string;\n}\n\nconst failureFrom = (result: Exclude<VerifyResult, { status: 'ok' }>) =>\n result.status === 'error'\n ? ({ kind: 'error', message: result.message } as const)\n : ({ kind: result.status } as const);\n\n/** Calls the host. A throw or a rejection is an error: it is never\n * logged, because it may carry what the user typed. */\nasync function ask<T>(\n call: (() => Promise<T>) | undefined,\n fallback: T,\n): Promise<T> {\n if (!call) return fallback;\n try {\n return await call();\n } catch {\n return fallback;\n }\n}\n\nconst ERROR_RESULT = { status: 'error' } as const;\n\nfunction useMounted() {\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n return mounted;\n}\n\nfunction useFailureText(passwordStep = false) {\n const { t } = useTranslation('ui');\n return (failure: Failure | null, waitSeconds: number): string | undefined => {\n if (!failure) return undefined;\n if (failure.message) return failure.message;\n switch (failure.kind) {\n case 'invalid':\n return passwordStep\n ? t('verifyIdentity.password.invalid')\n : t('verifyIdentity.invalidCode');\n case 'expired':\n return t('verifyIdentity.expiredCode');\n case 'rate-limited':\n return t('verifyIdentity.verifyRateLimited', { seconds: waitSeconds });\n default:\n return t('verifyIdentity.genericError');\n }\n };\n}\n\ninterface StepProps {\n /** Called once the host says the proof is good. */\n onDone: () => void;\n /** Reports whether a call to the host is out, for `data-submitting`. */\n onBusyChange: (busy: boolean) => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* Password */\n/* -------------------------------------------------------------------- */\n\ninterface PasswordStepProps extends StepProps {\n verify?: (password: string) => Promise<VerifyResult>;\n}\n\nexport function PasswordStep({\n verify,\n onDone,\n onBusyChange,\n}: PasswordStepProps) {\n const { t } = useTranslation('ui');\n const mounted = useMounted();\n const input = useRef<HTMLInputElement>(null);\n const [busy, setBusy] = useState(false);\n const [failure, setFailure] = useState<Failure | null>(null);\n const wait = useCountdown();\n const text = useFailureText(true);\n\n const locked = failure?.kind === 'rate-limited' && wait.remaining > 0;\n useEffect(() => {\n if (wait.finished) setFailure(null);\n }, [wait.finished]);\n\n const submit = async (event: FormEvent) => {\n event.preventDefault();\n // Read from the input, not state: the value stays out of the DOM\n // and out of React.\n const password = input.current?.value ?? '';\n if (busy || locked) return;\n if (password === '') {\n setFailure({\n kind: 'invalid',\n message: t('verifyIdentity.password.required'),\n });\n input.current?.focus();\n return;\n }\n setBusy(true);\n onBusyChange(true);\n setFailure(null);\n const result = await ask(() => verify!(password), ERROR_RESULT);\n if (!mounted.current) return;\n setBusy(false);\n onBusyChange(false);\n if (result.status === 'ok') {\n onDone();\n return;\n }\n if (input.current) input.current.value = '';\n if (result.status === 'rate-limited') wait.start(result.waitSeconds);\n setFailure(failureFrom(result));\n input.current?.focus();\n };\n\n return (\n <form\n noValidate\n onSubmit={submit}\n aria-busy={busy || undefined}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <FormField\n label={t('verifyIdentity.password.label')}\n required\n error={text(failure, wait.remaining)}\n >\n <PasswordInput\n ref={input}\n name=\"password\"\n autoComplete=\"current-password\"\n disabled={busy}\n />\n </FormField>\n <Button\n type=\"submit\"\n intent=\"primary\"\n size=\"lg\"\n loading={busy}\n aria-disabled={locked || undefined}\n data-action=\"verify\"\n className=\"ds:self-start\"\n >\n {t('verifyIdentity.continue')}\n </Button>\n </form>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* A code: from the authenticator app, or sent by SMS or email */\n/* -------------------------------------------------------------------- */\n\ntype SendPhase = 'sending' | 'ready' | 'failed' | 'limited';\n\ninterface CodeStepProps extends StepProps {\n kind: 'authenticator' | 'sms' | 'email';\n codeLength: number;\n /** Absent for the authenticator: the app makes its own codes. */\n send?: () => Promise<SendCodeResult>;\n verify?: (code: string) => Promise<VerifyResult>;\n}\n\nconst DEFAULT_RESEND_SECONDS = 30;\n\nexport function CodeStep({\n kind,\n codeLength,\n send,\n verify,\n onDone,\n onBusyChange,\n}: CodeStepProps) {\n const { t } = useTranslation('ui');\n const mounted = useMounted();\n const panel = useRef<HTMLDivElement>(null);\n const sends = kind !== 'authenticator';\n\n const [phase, setPhase] = useState<SendPhase>(sends ? 'sending' : 'ready');\n const [sendMessage, setSendMessage] = useState<string | undefined>();\n const [hasCode, setHasCode] = useState(!sends);\n const [code, setCode] = useState('');\n const [verifying, setVerifying] = useState(false);\n const [failure, setFailure] = useState<Failure | null>(null);\n const resend = useCountdown();\n const expiry = useCountdown();\n const wait = useCountdown();\n const text = useFailureText();\n\n const focusFirstBox = useCallback(() => {\n panel.current?.querySelector<HTMLInputElement>('input')?.focus();\n }, []);\n\n const sendCount = useRef(0);\n const sendCode = useCallback(async () => {\n sendCount.current += 1;\n setPhase('sending');\n setFailure(null);\n setCode('');\n onBusyChange(true);\n const result = await ask(send, ERROR_RESULT);\n if (!mounted.current) return;\n onBusyChange(false);\n if (result.status === 'sent') {\n setPhase('ready');\n setHasCode(true);\n resend.start(result.resendAfterSeconds ?? DEFAULT_RESEND_SECONDS);\n if (result.expiresInSeconds) expiry.start(result.expiresInSeconds);\n else expiry.stop();\n return;\n }\n if (result.status === 'rate-limited') {\n setPhase('limited');\n resend.start(result.waitSeconds);\n return;\n }\n setSendMessage(result.message);\n setPhase('failed');\n // eslint-disable-next-line react-hooks/exhaustive-deps -- the countdown objects are stable enough, and `send` is read fresh\n }, [send, onBusyChange]);\n\n // The code goes out when the step opens. The ref keeps a development\n // double mount from sending two.\n const started = useRef(false);\n useEffect(() => {\n if (!sends || started.current) return;\n started.current = true;\n void sendCode();\n }, [sends, sendCode]);\n\n // Focus follows the box when a new code arrives.\n const lastPhase = useRef(phase);\n useEffect(() => {\n // The first code leaves focus on the step heading; a new one moves\n // it to the box.\n if (\n phase === 'ready' &&\n lastPhase.current === 'sending' &&\n hasCode &&\n sendCount.current > 1\n ) {\n focusFirstBox();\n }\n lastPhase.current = phase;\n }, [phase, hasCode, focusFirstBox]);\n\n const locked = failure?.kind === 'rate-limited' && wait.remaining > 0;\n useEffect(() => {\n if (wait.finished) setFailure(null);\n }, [wait.finished]);\n\n // The code timed out in the browser: say so, the server still decides.\n const expiredHere = expiry.finished && !failure;\n const shown: Failure | null =\n failure ?? (expiredHere ? { kind: 'expired' } : null);\n\n const verifyCode = async (value: string) => {\n if (verifying || locked || value.length !== codeLength) return;\n setVerifying(true);\n onBusyChange(true);\n setFailure(null);\n const result = await ask(() => verify!(value), ERROR_RESULT);\n if (!mounted.current) return;\n setVerifying(false);\n onBusyChange(false);\n if (result.status === 'ok') {\n onDone();\n return;\n }\n if (result.status === 'rate-limited') wait.start(result.waitSeconds);\n setFailure(failureFrom(result));\n setCode('');\n // After the box is enabled again.\n window.setTimeout(focusFirstBox, 0);\n };\n\n const waiting = resend.remaining > 0;\n const showBox = hasCode;\n const canResend = sends && phase !== 'sending';\n\n return (\n <div\n ref={panel}\n data-slot=\"code-step\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n {/* Always mounted: a live region announces a change, not its first\n content. */}\n <div\n role=\"status\"\n className=\"type-body-sm ds:text-[var(--muted-foreground)]\"\n >\n {phase === 'sending' ? t('verifyIdentity.sending') : null}\n </div>\n\n {phase === 'failed' && (\n <Alert variant=\"error\" data-slot=\"send-failed\">\n <Alert.Description>\n {sendMessage ?? t('verifyIdentity.sendFailed')}\n </Alert.Description>\n </Alert>\n )}\n {phase === 'limited' && (\n <Alert variant=\"warning\" data-slot=\"send-limited\">\n <Alert.Description>\n {resend.remaining > 0\n ? t('verifyIdentity.sendRateLimited', {\n seconds: resend.remaining,\n })\n : t('verifyIdentity.sendRateLimitedOver')}\n </Alert.Description>\n </Alert>\n )}\n\n {showBox && (\n <FormField\n label={t('verifyIdentity.codeLabel')}\n error={text(shown, wait.remaining)}\n >\n <OTPInput\n length={codeLength}\n mode=\"numeric\"\n // SMS autofill where the browser offers it; the first box\n // always carries `autocomplete=\"one-time-code\"`.\n webOtp={kind === 'sms'}\n value={code}\n onChange={setCode}\n onComplete={(value) => void verifyCode(value)}\n disabled={verifying}\n />\n </FormField>\n )}\n\n {showBox && expiry.remaining > 0 && (\n <p\n className=\"type-body-sm ds:text-[var(--muted-foreground)]\"\n data-slot=\"expiry\"\n >\n {t('verifyIdentity.expiresIn', {\n time: formatClock(expiry.remaining),\n })}\n </p>\n )}\n\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n {showBox && (\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"lg\"\n loading={verifying}\n aria-disabled={code.length !== codeLength || locked || undefined}\n data-action=\"verify\"\n onClick={() => void verifyCode(code)}\n >\n {t('verifyIdentity.verify')}\n </Button>\n )}\n {canResend && (\n <Button\n type=\"button\"\n intent={showBox ? 'outline' : 'primary'}\n size=\"lg\"\n disabled={verifying}\n // Not native `disabled` for the wait: focus stays on the button.\n aria-disabled={waiting || undefined}\n data-action={phase === 'failed' ? 'retry-send' : 'resend-code'}\n onClick={() => {\n if (!waiting) void sendCode();\n }}\n >\n {waiting\n ? t('verifyIdentity.resendIn', { seconds: resend.remaining })\n : phase === 'failed'\n ? t('verifyIdentity.tryAgain')\n : t('verifyIdentity.resend')}\n </Button>\n )}\n </div>\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* VerifyIdentity: the \"Verify it's you\" step-up flow. */\n/* */\n/* The host passes an ordered list of steps. The server decides which */\n/* steps a user needs and in which order; the UI only renders them one */\n/* after another, and calls `onVerified` after the last. Every check is */\n/* a callback the host owns: the kit makes no request and never builds */\n/* or reveals a full phone number or address, it shows the masked text */\n/* it is given. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CircleCheck } from 'lucide-react';\nimport { cva } from 'class-variance-authority';\nimport { Alert } from '../../components/alert';\nimport { Button } from '../../components/button';\nimport { Dialog } from '../../components/dialog';\nimport { isSafeHref } from '../../components/_shared/safe-href';\nimport { CodeStep, PasswordStep } from './verify-identity-steps';\nimport type {\n VerifyIdentityCallbacks,\n VerifyIdentityStep,\n} from './verify-identity-types';\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\nexport interface VerifyIdentityProps\n extends\n VerifyIdentityCallbacks,\n Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /**\n * The proofs to ask for, in order. The server decides both; the UI\n * renders them as given.\n */\n steps: readonly VerifyIdentityStep[];\n /** What the user is about to do, such as \"Change login email\". Pass it\n * translated. Default \"Verify it's you\". */\n title?: string;\n /** The line under the title, such as \"Confirm it is you before you change\n * your login email.\" Pass it translated. */\n description?: string;\n /** Level of the title. Default 2; each step heading is one deeper. */\n headingLevel?: 2 | 3;\n /** The phone the SMS goes to, already masked: \"+39 ••• ••• 4567\". The kit\n * never builds a masked number itself. */\n maskedPhone?: string;\n /** The current login email, already masked: \"m••••@example.com\". */\n maskedEmail?: string;\n /** Digits in a code. Default 6. */\n codeLength?: number;\n /**\n * True when the user has no confirmed mobile. The steps do not run:\n * the card explains why one is needed and offers to set it up.\n */\n missingMobile?: boolean;\n /** Called by the set-up button of the missing-mobile card. */\n onSetUpMobile?: () => void;\n /** Where the set-up button leads instead. A path on the same site, or an\n * address written in full. */\n setUpMobileHref?: string;\n /** Called after the last step is right. */\n onVerified: () => void;\n /** Adds a Cancel button. */\n onCancel?: () => void;\n /** Hides the title and description, for a host that draws its own, such as\n * a dialog. */\n hideHeader?: boolean;\n}\n\n/* -------------------------------------------------------------------- */\n/* Styles */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:text-start ds:text-[var(--foreground)]',\n);\n\nconst headingVariants = cva(\n 'type-h4 ds:m-0 ds:focus-visible:outline-solid ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)] ds:forced-colors:focus-visible:outline-[CanvasText]',\n);\n\nconst HEADINGS = { 2: 'h2', 3: 'h3', 4: 'h4' } as const;\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\ntype Position = number | 'verified';\n\nfunction VerifyIdentityInner({\n steps,\n title,\n description,\n headingLevel = 2,\n maskedPhone,\n maskedEmail,\n codeLength = 6,\n missingMobile = false,\n onSetUpMobile,\n setUpMobileHref,\n onVerified,\n onCancel,\n hideHeader = false,\n onVerifyPassword,\n onVerifyAuthenticator,\n onSendSmsCode,\n onVerifySmsCode,\n onSendEmailCode,\n onVerifyEmailCode,\n className,\n forwardedRef,\n ...rest\n}: VerifyIdentityProps & { forwardedRef: React.Ref<HTMLDivElement> }) {\n const { t } = useTranslation('ui');\n const titleId = useId();\n const stepTitleId = useId();\n const [position, setPosition] = useState<Position>(0);\n const [busy, setBusy] = useState(false);\n const stepHeading = useRef<HTMLHeadingElement>(null);\n\n const index = typeof position === 'number' ? position : steps.length - 1;\n const step = steps[index];\n const state = missingMobile\n ? 'missing-factor'\n : position === 'verified'\n ? 'verified'\n : (step ?? 'empty');\n\n // Focus goes to the new step's heading when the step changes, not when\n // the flow first opens: a dialog places focus itself.\n const first = useRef(true);\n useEffect(() => {\n if (first.current) {\n first.current = false;\n return;\n }\n stepHeading.current?.focus();\n }, [position]);\n\n const onBusyChange = useCallback((value: boolean) => setBusy(value), []);\n\n const next = useCallback(() => {\n setBusy(false);\n if (index + 1 < steps.length) {\n setPosition(index + 1);\n } else {\n setPosition('verified');\n onVerified();\n }\n }, [index, steps.length, onVerified]);\n\n const phone = maskedPhone;\n const email = maskedEmail;\n const stepText = useMemo(\n () => ({\n password: {\n title: t('verifyIdentity.password.title'),\n description: t('verifyIdentity.password.description'),\n },\n authenticator: {\n title: t('verifyIdentity.authenticator.title'),\n description: t('verifyIdentity.authenticator.description'),\n },\n sms: {\n title: t('verifyIdentity.sms.title'),\n description: phone\n ? t('verifyIdentity.sms.description', { phone })\n : t('verifyIdentity.sms.descriptionNoPhone'),\n },\n email: {\n title: t('verifyIdentity.email.title'),\n description: email\n ? t('verifyIdentity.email.description', { email })\n : t('verifyIdentity.email.descriptionNoEmail'),\n },\n }),\n [t, phone, email],\n );\n\n const Title = HEADINGS[headingLevel];\n const StepTitle = HEADINGS[(headingLevel + 1) as 3 | 4];\n const setUpLink =\n setUpMobileHref && isSafeHref(setUpMobileHref)\n ? setUpMobileHref\n : undefined;\n\n let body: React.ReactNode = null;\n let heading: string | undefined;\n let lead: string | undefined;\n\n if (missingMobile) {\n heading = t('verifyIdentity.missingMobile.title');\n lead = t('verifyIdentity.missingMobile.description');\n body = (\n <div\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n data-slot=\"missing-factor\"\n >\n <Alert variant=\"warning\" announce=\"off\">\n <Alert.Description>\n {t('verifyIdentity.missingMobile.reason')}\n </Alert.Description>\n </Alert>\n {(onSetUpMobile || setUpLink) &&\n (setUpLink ? (\n <Button\n asChild\n intent=\"primary\"\n size=\"lg\"\n className=\"ds:self-start\"\n >\n <a href={setUpLink} data-action=\"set-up-mobile\">\n {t('verifyIdentity.missingMobile.action')}\n </a>\n </Button>\n ) : (\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"lg\"\n data-action=\"set-up-mobile\"\n className=\"ds:self-start\"\n onClick={onSetUpMobile}\n >\n {t('verifyIdentity.missingMobile.action')}\n </Button>\n ))}\n </div>\n );\n } else if (position === 'verified') {\n heading = t('verifyIdentity.verified');\n body = (\n <p className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-success ds:m-0\">\n <CircleCheck aria-hidden=\"true\" className=\"ds:size-4 ds:shrink-0\" />\n <span>{t('verifyIdentity.verifiedDescription')}</span>\n </p>\n );\n } else if (step) {\n heading = stepText[step].title;\n lead = stepText[step].description;\n body = (\n <div key={`${step}-${index}`} data-step={step}>\n {step === 'password' ? (\n <PasswordStep\n verify={onVerifyPassword}\n onDone={next}\n onBusyChange={onBusyChange}\n />\n ) : step === 'authenticator' ? (\n <CodeStep\n kind=\"authenticator\"\n codeLength={codeLength}\n verify={onVerifyAuthenticator}\n onDone={next}\n onBusyChange={onBusyChange}\n />\n ) : step === 'sms' ? (\n <CodeStep\n kind=\"sms\"\n codeLength={codeLength}\n send={onSendSmsCode}\n verify={onVerifySmsCode}\n onDone={next}\n onBusyChange={onBusyChange}\n />\n ) : (\n <CodeStep\n kind=\"email\"\n codeLength={codeLength}\n send={onSendEmailCode}\n verify={onVerifyEmailCode}\n onDone={next}\n onBusyChange={onBusyChange}\n />\n )}\n </div>\n );\n }\n\n return (\n <div\n ref={forwardedRef}\n {...rest}\n data-component=\"verify-identity\"\n data-state={state}\n data-step-index={missingMobile ? undefined : index}\n data-step-count={steps.length}\n data-submitting={busy ? 'true' : 'false'}\n className={rootVariants({ className })}\n >\n {!hideHeader && (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <Title id={titleId} className=\"type-h3 ds:m-0\">\n {title ?? t('verifyIdentity.title')}\n </Title>\n <p className=\"type-body-sm ds:m-0 ds:text-[var(--muted-foreground)]\">\n {description ?? t('verifyIdentity.description')}\n </p>\n </div>\n )}\n\n <div\n role=\"group\"\n aria-labelledby={stepTitleId}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n {steps.length > 1 && !missingMobile && position !== 'verified' && (\n <p\n className=\"type-body-sm ds:m-0 ds:text-[var(--muted-foreground)]\"\n data-slot=\"progress\"\n >\n {t('verifyIdentity.progress', {\n current: index + 1,\n total: steps.length,\n })}\n </p>\n )}\n <StepTitle\n ref={stepHeading}\n id={stepTitleId}\n tabIndex={-1}\n className={headingVariants()}\n >\n {heading}\n </StepTitle>\n {lead && (\n <p className=\"type-body-sm ds:m-0 ds:text-[var(--muted-foreground)]\">\n {lead}\n </p>\n )}\n </div>\n {body}\n </div>\n\n {onCancel && position !== 'verified' && (\n <Button\n type=\"button\"\n intent=\"ghost\"\n data-action=\"cancel\"\n className=\"ds:self-start\"\n onClick={onCancel}\n >\n {t('verifyIdentity.cancel')}\n </Button>\n )}\n </div>\n );\n}\n\n/**\n * The \"Verify it's you\" step-up flow, inline. Use `VerifyIdentityDialog`\n * for a dialog. The server decides the steps and checks every answer: this\n * only renders them.\n */\nexport const VerifyIdentity = forwardRef<HTMLDivElement, VerifyIdentityProps>(\n (props, ref) => (\n // A new list of steps starts the flow again.\n <VerifyIdentityInner\n key={`${props.steps.join(',')}|${props.missingMobile ? 'm' : ''}`}\n {...props}\n forwardedRef={ref}\n />\n ),\n);\nVerifyIdentity.displayName = 'VerifyIdentity';\n\n/* -------------------------------------------------------------------- */\n/* Dialog */\n/* -------------------------------------------------------------------- */\n\nexport interface VerifyIdentityDialogProps extends Omit<\n VerifyIdentityProps,\n 'hideHeader' | 'headingLevel' | 'onCancel'\n> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\n/** `VerifyIdentity` in a dialog. Closing it starts the flow again next time. */\nexport function VerifyIdentityDialog({\n open,\n onOpenChange,\n title,\n description,\n ...flow\n}: VerifyIdentityDialogProps) {\n const { t } = useTranslation('ui');\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Content size=\"md\">\n <Dialog.Header>\n <Dialog.Title>{title ?? t('verifyIdentity.title')}</Dialog.Title>\n <Dialog.Description>\n {description ?? t('verifyIdentity.description')}\n </Dialog.Description>\n </Dialog.Header>\n <Dialog.Body>\n <VerifyIdentity\n {...flow}\n hideHeader\n onCancel={() => onOpenChange(false)}\n />\n </Dialog.Body>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* ChangeEmailDialog: verify it is you, then ask for the new login email */\n/* twice, then say what happens next. */\n/* */\n/* The host owns the rules. `onSubmitNewEmail` answers with a typed */\n/* result; the dialog shows it. The final message never repeats the new */\n/* address. */\n/* -------------------------------------------------------------------- */\n\nimport { useEffect, useId, useRef, useState, type FormEvent } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport isEmail from 'validator/lib/isEmail';\nimport { Alert } from '../../components/alert';\nimport { Button } from '../../components/button';\nimport { Dialog } from '../../components/dialog';\nimport { FormField } from '../../components/form-field';\nimport { TextInput } from '../../components/text-input';\nimport { VerifyIdentity, type VerifyIdentityProps } from './verify-identity';\n\n/** What the host answers once it has tried to change the email. */\nexport type ChangeEmailResult =\n | { status: 'ok' }\n | { status: 'already-in-use' }\n | { status: 'invalid' }\n | {\n status: 'error';\n /** Already translated. Shown in place of the kit's own line. */\n message?: string;\n };\n\nexport interface ChangeEmailDialogProps extends Omit<\n VerifyIdentityProps,\n 'hideHeader' | 'headingLevel' | 'onCancel' | 'onVerified'\n> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Called with the new address once both entries match and look like an\n * email. The host checks it for real. */\n onSubmitNewEmail: (email: string) => Promise<ChangeEmailResult>;\n}\n\ntype Phase = 'verify' | 'new-email' | 'done';\n\nconst headingClass =\n 'type-h4 ds:m-0 ds:focus-visible:outline-solid ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)] ds:forced-colors:focus-visible:outline-[CanvasText]';\n\nfunction ChangeEmailBody({\n onOpenChange,\n onSubmitNewEmail,\n ...flow\n}: Omit<ChangeEmailDialogProps, 'open' | 'title' | 'description'>) {\n const { t } = useTranslation('ui');\n const [phase, setPhase] = useState<Phase>('verify');\n const [email, setEmail] = useState('');\n const [again, setAgain] = useState('');\n const [errors, setErrors] = useState<{ email?: string; again?: string }>({});\n const [formError, setFormError] = useState<string | undefined>();\n const [submitting, setSubmitting] = useState(false);\n const heading = useRef<HTMLHeadingElement>(null);\n const doneBox = useRef<HTMLDivElement>(null);\n const emailInput = useRef<HTMLInputElement>(null);\n const againInput = useRef<HTMLInputElement>(null);\n const headingId = useId();\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n // Focus goes to the heading of the new phase.\n useEffect(() => {\n if (phase === 'new-email') heading.current?.focus();\n if (phase === 'done') doneBox.current?.focus();\n }, [phase]);\n\n if (phase === 'verify') {\n return (\n <VerifyIdentity\n {...flow}\n hideHeader\n onCancel={() => onOpenChange(false)}\n onVerified={() => setPhase('new-email')}\n />\n );\n }\n\n if (phase === 'done') {\n return (\n <div\n data-component=\"change-email-dialog\"\n data-state=\"done\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <Alert\n ref={doneBox}\n variant=\"success\"\n tabIndex={-1}\n aria-labelledby={headingId}\n >\n <Alert.Title as=\"h3\" id={headingId}>\n {t('verifyIdentity.changeEmail.doneTitle')}\n </Alert.Title>\n <Alert.Description>\n {t('verifyIdentity.changeEmail.doneDescription')}\n </Alert.Description>\n </Alert>\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"lg\"\n data-action=\"close\"\n className=\"ds:self-start\"\n onClick={() => onOpenChange(false)}\n >\n {t('verifyIdentity.changeEmail.close')}\n </Button>\n </div>\n );\n }\n\n const submit = async (event: FormEvent) => {\n event.preventDefault();\n if (submitting) return;\n const next: { email?: string; again?: string } = {};\n const value = email.trim();\n if (value === '') next.email = t('verifyIdentity.changeEmail.required');\n else if (!isEmail(value)) next.email = t('inputs.email.invalid');\n else if (again.trim() !== value) {\n next.again = t('verifyIdentity.changeEmail.mismatch');\n }\n setErrors(next);\n setFormError(undefined);\n if (next.email || next.again) {\n (next.email ? emailInput : againInput).current?.focus();\n return;\n }\n setSubmitting(true);\n let result: ChangeEmailResult;\n try {\n result = await onSubmitNewEmail(value);\n } catch {\n result = { status: 'error' };\n }\n if (!mounted.current) return;\n setSubmitting(false);\n if (result.status === 'ok') {\n setPhase('done');\n return;\n }\n if (result.status === 'already-in-use') {\n setErrors({ email: t('verifyIdentity.changeEmail.alreadyInUse') });\n emailInput.current?.focus();\n } else if (result.status === 'invalid') {\n setErrors({ email: t('verifyIdentity.changeEmail.invalid') });\n emailInput.current?.focus();\n } else {\n setFormError(result.message ?? t('verifyIdentity.genericError'));\n }\n };\n\n return (\n <form\n noValidate\n onSubmit={submit}\n aria-busy={submitting || undefined}\n data-component=\"change-email-dialog\"\n data-state=\"new-email\"\n data-submitting={submitting ? 'true' : 'false'}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <h3 ref={heading} tabIndex={-1} className={headingClass}>\n {t('verifyIdentity.changeEmail.newTitle')}\n </h3>\n <p className=\"type-body-sm ds:m-0 ds:text-[var(--muted-foreground)]\">\n {t('verifyIdentity.changeEmail.newDescription')}\n </p>\n </div>\n {formError && (\n <Alert variant=\"error\">\n <Alert.Description>{formError}</Alert.Description>\n </Alert>\n )}\n <FormField\n label={t('verifyIdentity.changeEmail.newLabel')}\n required\n error={errors.email}\n >\n <TextInput\n ref={emailInput}\n type=\"email\"\n inputMode=\"email\"\n name=\"newEmail\"\n autoComplete=\"off\"\n value={email}\n disabled={submitting}\n onChange={(event) => {\n setEmail(event.target.value);\n setErrors((previous) => ({ ...previous, email: undefined }));\n }}\n />\n </FormField>\n <FormField\n label={t('verifyIdentity.changeEmail.confirmLabel')}\n required\n error={errors.again}\n >\n <TextInput\n ref={againInput}\n type=\"email\"\n inputMode=\"email\"\n name=\"newEmailConfirm\"\n autoComplete=\"off\"\n value={again}\n disabled={submitting}\n onChange={(event) => {\n setAgain(event.target.value);\n setErrors((previous) => ({ ...previous, again: undefined }));\n }}\n />\n </FormField>\n <div className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-sm)]\">\n <Button\n type=\"submit\"\n intent=\"primary\"\n size=\"lg\"\n loading={submitting}\n data-action=\"submit\"\n >\n {t('verifyIdentity.changeEmail.submit')}\n </Button>\n <Button\n type=\"button\"\n intent=\"ghost\"\n size=\"lg\"\n disabled={submitting}\n data-action=\"cancel\"\n onClick={() => onOpenChange(false)}\n >\n {t('verifyIdentity.cancel')}\n </Button>\n </div>\n </form>\n );\n}\n\n/**\n * Change the login email: the \"Verify it's you\" steps, then the new\n * address twice, then a confirmation. Closing the dialog starts again.\n */\nexport function ChangeEmailDialog({\n open,\n onOpenChange,\n title,\n description,\n ...body\n}: ChangeEmailDialogProps) {\n const { t } = useTranslation('ui');\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Content size=\"md\">\n <Dialog.Header>\n <Dialog.Title>\n {title ?? t('verifyIdentity.changeEmail.title')}\n </Dialog.Title>\n <Dialog.Description>\n {description ?? t('verifyIdentity.changeEmail.description')}\n </Dialog.Description>\n </Dialog.Header>\n <Dialog.Body>\n <ChangeEmailBody onOpenChange={onOpenChange} {...body} />\n </Dialog.Body>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* The contract between VerifyIdentity and its host. */\n/* */\n/* The host owns every rule: which steps a user needs, in which order, */\n/* whether a code is right, how often one may be sent. The UI renders */\n/* the answers. Results are a discriminated union on `status`, so a host */\n/* cannot forget a case. */\n/* -------------------------------------------------------------------- */\n\n/** One proof the user gives. The server decides the order. */\nexport const VERIFY_IDENTITY_STEPS = [\n 'password',\n 'authenticator',\n 'sms',\n 'email',\n] as const;\n\nexport type VerifyIdentityStep = (typeof VERIFY_IDENTITY_STEPS)[number];\n\n/** What a check of a password or a code answers. */\nexport type VerifyResult =\n | { status: 'ok' }\n | { status: 'invalid' }\n | { status: 'expired' }\n | { status: 'rate-limited'; waitSeconds: number }\n | {\n status: 'error';\n /** Already translated. Shown in place of the kit's own line. */\n message?: string;\n };\n\n/** What sending an SMS or email code answers. */\nexport type SendCodeResult =\n | {\n status: 'sent';\n /** How long the code lives. Shown as a countdown when given. */\n expiresInSeconds?: number;\n /** How long until the user may ask for another. Default 30. */\n resendAfterSeconds?: number;\n }\n | { status: 'rate-limited'; waitSeconds: number }\n | {\n status: 'error';\n /** Already translated. Shown in place of the kit's own line. */\n message?: string;\n };\n\n/** The host's checks. Each one is called by the UI, never by the kit\n * itself: the kit makes no request. The password and the codes are\n * passed to these and nowhere else; the kit never logs or stores them. */\nexport interface VerifyIdentityCallbacks {\n onVerifyPassword?: (password: string) => Promise<VerifyResult>;\n onVerifyAuthenticator?: (code: string) => Promise<VerifyResult>;\n /** Called once when the SMS step opens, and again on resend. */\n onSendSmsCode?: () => Promise<SendCodeResult>;\n onVerifySmsCode?: (code: string) => Promise<VerifyResult>;\n /** Called once when the email step opens, and again on resend. */\n onSendEmailCode?: () => Promise<SendCodeResult>;\n onVerifyEmailCode?: (code: string) => Promise<VerifyResult>;\n}\n"],"names":["useCountdown","deadline","setDeadline","useState","remaining","setRemaining","finished","setFinished","timer","useRef","useEffect","tick","left","start","useCallback","seconds","whole","stop","formatClock","m","s","failureFrom","result","ask","call","fallback","ERROR_RESULT","useMounted","mounted","useFailureText","passwordStep","t","useTranslation","failure","waitSeconds","PasswordStep","verify","onDone","onBusyChange","input","busy","setBusy","setFailure","wait","text","locked","jsxs","event","password","_a","_b","_c","jsx","FormField","PasswordInput","Button","DEFAULT_RESEND_SECONDS","CodeStep","kind","codeLength","send","panel","sends","phase","setPhase","sendMessage","setSendMessage","hasCode","setHasCode","code","setCode","verifying","setVerifying","resend","expiry","focusFirstBox","sendCount","sendCode","started","lastPhase","expiredHere","shown","verifyCode","value","waiting","showBox","canResend","Alert","OTPInput","rootVariants","cva","headingVariants","HEADINGS","VerifyIdentityInner","steps","title","description","headingLevel","maskedPhone","maskedEmail","missingMobile","onSetUpMobile","setUpMobileHref","onVerified","onCancel","hideHeader","onVerifyPassword","onVerifyAuthenticator","onSendSmsCode","onVerifySmsCode","onSendEmailCode","onVerifyEmailCode","className","forwardedRef","rest","titleId","useId","stepTitleId","position","setPosition","stepHeading","index","step","state","first","next","phone","email","stepText","useMemo","Title","StepTitle","setUpLink","isSafeHref","body","heading","lead","CircleCheck","VerifyIdentity","forwardRef","props","ref","VerifyIdentityDialog","open","onOpenChange","flow","Dialog","headingClass","ChangeEmailBody","onSubmitNewEmail","setEmail","again","setAgain","errors","setErrors","formError","setFormError","submitting","setSubmitting","doneBox","emailInput","againInput","headingId","isEmail","TextInput","previous","ChangeEmailDialog","VERIFY_IDENTITY_STEPS"],"mappings":"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"}