@alfadocs/ui-kit-debug 1.112.1 → 1.113.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 (228) hide show
  1. package/dist/_chunks/{ai-prompt-input-CG9BEggs.js → ai-prompt-input-JIPbrTF3.js} +2 -2
  2. package/dist/_chunks/{ai-prompt-input-CG9BEggs.js.map → ai-prompt-input-JIPbrTF3.js.map} +1 -1
  3. package/dist/_chunks/{anamnesis-summary-rows-BrTx7diS.js → anamnesis-summary-rows-DfDulR_c.js} +3 -3
  4. package/dist/_chunks/{anamnesis-summary-rows-BrTx7diS.js.map → anamnesis-summary-rows-DfDulR_c.js.map} +1 -1
  5. package/dist/_chunks/{audio-recorder-BlDozxdU.js → audio-recorder-CsnM_WDy.js} +2 -2
  6. package/dist/_chunks/{audio-recorder-BlDozxdU.js.map → audio-recorder-CsnM_WDy.js.map} +1 -1
  7. package/dist/_chunks/{balance-badge-cell-wJ6cTD_h.js → balance-badge-cell-BAZynD--.js} +4 -4
  8. package/dist/_chunks/{balance-badge-cell-wJ6cTD_h.js.map → balance-badge-cell-BAZynD--.js.map} +1 -1
  9. package/dist/_chunks/{bishop-score-BhMomGcX.js → bishop-score-CnIft4eV.js} +2 -2
  10. package/dist/_chunks/{bishop-score-BhMomGcX.js.map → bishop-score-CnIft4eV.js.map} +1 -1
  11. package/dist/_chunks/{calendar-appointment-editor-dialog-Oc3Df8O3.js → calendar-appointment-editor-dialog-CaZm5wGR.js} +5 -5
  12. package/dist/_chunks/{calendar-appointment-editor-dialog-Oc3Df8O3.js.map → calendar-appointment-editor-dialog-CaZm5wGR.js.map} +1 -1
  13. package/dist/_chunks/{data-table-zXBxFYpJ.js → data-table-C9idMvs0.js} +2 -2
  14. package/dist/_chunks/{data-table-zXBxFYpJ.js.map → data-table-C9idMvs0.js.map} +1 -1
  15. package/dist/_chunks/{document-preview-BalyZqnn.js → document-preview-5xs64jME.js} +2 -2
  16. package/dist/_chunks/{document-preview-BalyZqnn.js.map → document-preview-5xs64jME.js.map} +1 -1
  17. package/dist/_chunks/email-input-DxwbREpx.js +156 -0
  18. package/dist/_chunks/email-input-DxwbREpx.js.map +1 -0
  19. package/dist/_chunks/{file-manager-CVxBE4yy.js → file-manager-LG7B_UHB.js} +2 -2
  20. package/dist/_chunks/{file-manager-CVxBE4yy.js.map → file-manager-LG7B_UHB.js.map} +1 -1
  21. package/dist/_chunks/{forgot-password-form-vfCO2-Tt.js → forgot-password-form-YQVzSskq.js} +8 -7
  22. package/dist/_chunks/{forgot-password-form-vfCO2-Tt.js.map → forgot-password-form-YQVzSskq.js.map} +1 -1
  23. package/dist/_chunks/{gestational-age-calculator-AnaH00nk.js → gestational-age-calculator-Dv3IePb-.js} +2 -2
  24. package/dist/_chunks/{gestational-age-calculator-AnaH00nk.js.map → gestational-age-calculator-Dv3IePb-.js.map} +1 -1
  25. package/dist/_chunks/{heatmap-D4qqpCEj.js → heatmap-BiwC7Gdx.js} +2 -2
  26. package/dist/_chunks/{heatmap-D4qqpCEj.js.map → heatmap-BiwC7Gdx.js.map} +1 -1
  27. package/dist/_chunks/isEmail-BfVspSvV.js +248 -0
  28. package/dist/_chunks/isEmail-BfVspSvV.js.map +1 -0
  29. package/dist/_chunks/{kit-extensions-VaJ-u44J.js → kit-extensions-BOsUgWnE.js} +3 -3
  30. package/dist/_chunks/{kit-extensions-VaJ-u44J.js.map → kit-extensions-BOsUgWnE.js.map} +1 -1
  31. package/dist/_chunks/{link-cell-renderer-C8vfCOEp.js → link-cell-renderer-_Fv3WEmb.js} +2 -2
  32. package/dist/_chunks/{link-cell-renderer-C8vfCOEp.js.map → link-cell-renderer-_Fv3WEmb.js.map} +1 -1
  33. package/dist/_chunks/{login-dev-card-Cz1Clugq.js → login-dev-card-B6-zCFq3.js} +47 -46
  34. package/dist/_chunks/{login-dev-card-Cz1Clugq.js.map → login-dev-card-B6-zCFq3.js.map} +1 -1
  35. package/dist/_chunks/{muscle-scheme-1BZd1-RE.js → muscle-scheme-BkmDUTmk.js} +2 -2
  36. package/dist/_chunks/{muscle-scheme-1BZd1-RE.js.map → muscle-scheme-BkmDUTmk.js.map} +1 -1
  37. package/dist/_chunks/{optical-prescription-BGVeDVSP.js → optical-prescription-CvbN8yD2.js} +2 -2
  38. package/dist/_chunks/{optical-prescription-BGVeDVSP.js.map → optical-prescription-CvbN8yD2.js.map} +1 -1
  39. package/dist/_chunks/{patient-details-wMgTFtpp.js → patient-details-RsT3SaYh.js} +2 -2
  40. package/dist/_chunks/{patient-details-wMgTFtpp.js.map → patient-details-RsT3SaYh.js.map} +1 -1
  41. package/dist/_chunks/{patient-field-row-Bhm2Ig1P.js → patient-field-row-D9rb-QJH.js} +3 -3
  42. package/dist/_chunks/{patient-field-row-Bhm2Ig1P.js.map → patient-field-row-D9rb-QJH.js.map} +1 -1
  43. package/dist/_chunks/{patient-summary-card-DMdPPG3n.js → patient-summary-card-BjZErlbt.js} +2 -2
  44. package/dist/_chunks/{patient-summary-card-DMdPPG3n.js.map → patient-summary-card-BjZErlbt.js.map} +1 -1
  45. package/dist/_chunks/{practice-results-BOpaPaav.js → practice-results-BByRCIuR.js} +620 -566
  46. package/dist/_chunks/practice-results-BByRCIuR.js.map +1 -0
  47. package/dist/_chunks/{pregnancy-dating-D6dLkMpl.js → pregnancy-dating-Cs8xpZA8.js} +2 -2
  48. package/dist/_chunks/{pregnancy-dating-D6dLkMpl.js.map → pregnancy-dating-Cs8xpZA8.js.map} +1 -1
  49. package/dist/_chunks/{registration-form-CEJRUS9G.js → registration-form-Cq5_OSIL.js} +8 -7
  50. package/dist/_chunks/{registration-form-CEJRUS9G.js.map → registration-form-Cq5_OSIL.js.map} +1 -1
  51. package/dist/_chunks/{reserved.agent-C-C9cvO5.js → reserved.agent-BMkapgom.js} +3 -3
  52. package/dist/_chunks/{reserved.agent-C-C9cvO5.js.map → reserved.agent-BMkapgom.js.map} +1 -1
  53. package/dist/_chunks/{reset-password-form-B0acanDD.js → reset-password-form-BVsL2fOJ.js} +2 -2
  54. package/dist/_chunks/{reset-password-form-B0acanDD.js.map → reset-password-form-BVsL2fOJ.js.map} +1 -1
  55. package/dist/_chunks/{select-BBDRYxJl.js → select-uESzXTX6.js} +42 -39
  56. package/dist/_chunks/select-uESzXTX6.js.map +1 -0
  57. package/dist/_chunks/{send-registration-link-form-Nn0jf65G.js → send-registration-link-form-OgPomrZN.js} +8 -7
  58. package/dist/_chunks/{send-registration-link-form-Nn0jf65G.js.map → send-registration-link-form-OgPomrZN.js.map} +1 -1
  59. package/dist/_chunks/{signature-request-DJwdPji_.js → signature-request-BnTihryS.js} +2 -2
  60. package/dist/_chunks/{signature-request-DJwdPji_.js.map → signature-request-BnTihryS.js.map} +1 -1
  61. package/dist/_chunks/{tabs-DYHgRVSJ.js → tabs-CXYjr_8O.js} +2 -2
  62. package/dist/_chunks/{tabs-DYHgRVSJ.js.map → tabs-CXYjr_8O.js.map} +1 -1
  63. package/dist/_chunks/{task-editor-jqRf2JP6.js → task-editor-gqWF1jI6.js} +2 -2
  64. package/dist/_chunks/{task-editor-jqRf2JP6.js.map → task-editor-gqWF1jI6.js.map} +1 -1
  65. package/dist/_chunks/{tasks-panel-CFo5uIHx.js → tasks-panel-OuIaydK5.js} +2 -2
  66. package/dist/_chunks/{tasks-panel-CFo5uIHx.js.map → tasks-panel-OuIaydK5.js.map} +1 -1
  67. package/dist/_chunks/{unit-converter-C95sa5y8.js → unit-converter-D77vmlzN.js} +2 -2
  68. package/dist/_chunks/{unit-converter-C95sa5y8.js.map → unit-converter-D77vmlzN.js.map} +1 -1
  69. package/dist/_chunks/{use-appointment-details-read-VI26Z-pc.js → use-appointment-details-read-DvK7Looa.js} +2 -2
  70. package/dist/_chunks/{use-appointment-details-read-VI26Z-pc.js.map → use-appointment-details-read-DvK7Looa.js.map} +1 -1
  71. package/dist/_chunks/verify-identity-types-C85EXNzy.js +707 -0
  72. package/dist/_chunks/verify-identity-types-C85EXNzy.js.map +1 -0
  73. package/dist/_chunks/{voice-control-panel-B0TUZAiP.js → voice-control-panel-BGiX4sqB.js} +2 -2
  74. package/dist/_chunks/{voice-control-panel-B0TUZAiP.js.map → voice-control-panel-BGiX4sqB.js.map} +1 -1
  75. package/dist/agent-catalog.json +106 -2
  76. package/dist/agent-i18n/en.json +11 -0
  77. package/dist/components/ai-prompt-input/index.js +1 -1
  78. package/dist/components/appointment-details-panel/index.js +1 -1
  79. package/dist/components/audio-recorder/index.js +1 -1
  80. package/dist/components/bishop-score/index.js +1 -1
  81. package/dist/components/booking/index.js +1 -1
  82. package/dist/components/data-table/index.js +2 -2
  83. package/dist/components/document-preview/index.js +1 -1
  84. package/dist/components/email-input/index.js +1 -1
  85. package/dist/components/file-manager/index.js +1 -1
  86. package/dist/components/gestational-age-calculator/index.js +1 -1
  87. package/dist/components/heatmap/index.js +1 -1
  88. package/dist/components/index.d.ts +1 -0
  89. package/dist/components/index.d.ts.map +1 -1
  90. package/dist/components/muscle-scheme/index.js +1 -1
  91. package/dist/components/optical-prescription/index.js +1 -1
  92. package/dist/components/patient-details/index.js +1 -1
  93. package/dist/components/patient-summary-card/index.js +1 -1
  94. package/dist/components/patient-table/index.js +1 -1
  95. package/dist/components/practice-results/index.js +1 -1
  96. package/dist/components/practice-results/practice-results.d.ts +28 -0
  97. package/dist/components/practice-results/practice-results.d.ts.map +1 -1
  98. package/dist/components/pregnancy-dating/index.js +1 -1
  99. package/dist/components/rich-text-editor/index.js +1 -1
  100. package/dist/components/select/index.js +1 -1
  101. package/dist/components/select/select.d.ts.map +1 -1
  102. package/dist/components/skeleton-scheme/index.js +1 -1
  103. package/dist/components/tabs/index.js +1 -1
  104. package/dist/components/task-editor/index.js +1 -1
  105. package/dist/components/tasks-panel/index.js +1 -1
  106. package/dist/components/unit-converter/index.js +1 -1
  107. package/dist/components/voice-control-panel/index.js +1 -1
  108. package/dist/core.css +1 -1
  109. package/dist/i18n/locales/ar.d.ts +67 -0
  110. package/dist/i18n/locales/ar.d.ts.map +1 -1
  111. package/dist/i18n/locales/ar.js +68 -1
  112. package/dist/i18n/locales/ar.js.map +1 -1
  113. package/dist/i18n/locales/de.d.ts +67 -0
  114. package/dist/i18n/locales/de.d.ts.map +1 -1
  115. package/dist/i18n/locales/de.js +68 -1
  116. package/dist/i18n/locales/de.js.map +1 -1
  117. package/dist/i18n/locales/el.d.ts +67 -0
  118. package/dist/i18n/locales/el.d.ts.map +1 -1
  119. package/dist/i18n/locales/el.js +68 -1
  120. package/dist/i18n/locales/el.js.map +1 -1
  121. package/dist/i18n/locales/en.d.ts +67 -0
  122. package/dist/i18n/locales/en.d.ts.map +1 -1
  123. package/dist/i18n/locales/en.js +67 -0
  124. package/dist/i18n/locales/en.js.map +1 -1
  125. package/dist/i18n/locales/es.d.ts +67 -0
  126. package/dist/i18n/locales/es.d.ts.map +1 -1
  127. package/dist/i18n/locales/es.js +68 -1
  128. package/dist/i18n/locales/es.js.map +1 -1
  129. package/dist/i18n/locales/fr.d.ts +67 -0
  130. package/dist/i18n/locales/fr.d.ts.map +1 -1
  131. package/dist/i18n/locales/fr.js +68 -1
  132. package/dist/i18n/locales/fr.js.map +1 -1
  133. package/dist/i18n/locales/hi.d.ts +67 -0
  134. package/dist/i18n/locales/hi.d.ts.map +1 -1
  135. package/dist/i18n/locales/hi.js +68 -1
  136. package/dist/i18n/locales/hi.js.map +1 -1
  137. package/dist/i18n/locales/it.d.ts +67 -0
  138. package/dist/i18n/locales/it.d.ts.map +1 -1
  139. package/dist/i18n/locales/it.js +68 -1
  140. package/dist/i18n/locales/it.js.map +1 -1
  141. package/dist/i18n/locales/ja.d.ts +67 -0
  142. package/dist/i18n/locales/ja.d.ts.map +1 -1
  143. package/dist/i18n/locales/ja.js +68 -1
  144. package/dist/i18n/locales/ja.js.map +1 -1
  145. package/dist/i18n/locales/nl.d.ts +67 -0
  146. package/dist/i18n/locales/nl.d.ts.map +1 -1
  147. package/dist/i18n/locales/nl.js +68 -1
  148. package/dist/i18n/locales/nl.js.map +1 -1
  149. package/dist/i18n/locales/pl.d.ts +67 -0
  150. package/dist/i18n/locales/pl.d.ts.map +1 -1
  151. package/dist/i18n/locales/pl.js +68 -1
  152. package/dist/i18n/locales/pl.js.map +1 -1
  153. package/dist/i18n/locales/pt.d.ts +67 -0
  154. package/dist/i18n/locales/pt.d.ts.map +1 -1
  155. package/dist/i18n/locales/pt.js +68 -1
  156. package/dist/i18n/locales/pt.js.map +1 -1
  157. package/dist/i18n/locales/ro.d.ts +67 -0
  158. package/dist/i18n/locales/ro.d.ts.map +1 -1
  159. package/dist/i18n/locales/ro.js +68 -1
  160. package/dist/i18n/locales/ro.js.map +1 -1
  161. package/dist/i18n/locales/ru.d.ts +67 -0
  162. package/dist/i18n/locales/ru.d.ts.map +1 -1
  163. package/dist/i18n/locales/ru.js +68 -1
  164. package/dist/i18n/locales/ru.js.map +1 -1
  165. package/dist/i18n/locales/sq.d.ts +67 -0
  166. package/dist/i18n/locales/sq.d.ts.map +1 -1
  167. package/dist/i18n/locales/sq.js +68 -1
  168. package/dist/i18n/locales/sq.js.map +1 -1
  169. package/dist/i18n/locales/sv.d.ts +67 -0
  170. package/dist/i18n/locales/sv.d.ts.map +1 -1
  171. package/dist/i18n/locales/sv.js +68 -1
  172. package/dist/i18n/locales/sv.js.map +1 -1
  173. package/dist/i18n/locales/tr.d.ts +67 -0
  174. package/dist/i18n/locales/tr.d.ts.map +1 -1
  175. package/dist/i18n/locales/tr.js +68 -1
  176. package/dist/i18n/locales/tr.js.map +1 -1
  177. package/dist/i18n/locales/zh.d.ts +67 -0
  178. package/dist/i18n/locales/zh.d.ts.map +1 -1
  179. package/dist/i18n/locales/zh.js +68 -1
  180. package/dist/i18n/locales/zh.js.map +1 -1
  181. package/dist/index.js +352 -347
  182. package/dist/index.js.map +1 -1
  183. package/dist/locales/ar.json +68 -1
  184. package/dist/locales/de.json +68 -1
  185. package/dist/locales/el.json +68 -1
  186. package/dist/locales/en.json +67 -0
  187. package/dist/locales/es.json +68 -1
  188. package/dist/locales/fr.json +68 -1
  189. package/dist/locales/hi.json +68 -1
  190. package/dist/locales/it.json +68 -1
  191. package/dist/locales/ja.json +68 -1
  192. package/dist/locales/nl.json +68 -1
  193. package/dist/locales/pl.json +68 -1
  194. package/dist/locales/pt.json +68 -1
  195. package/dist/locales/ro.json +68 -1
  196. package/dist/locales/ru.json +68 -1
  197. package/dist/locales/sq.json +68 -1
  198. package/dist/locales/sv.json +68 -1
  199. package/dist/locales/tr.json +68 -1
  200. package/dist/locales/zh.json +68 -1
  201. package/dist/patterns/anamnesis/index.js +1 -1
  202. package/dist/patterns/calendar/index.js +1 -1
  203. package/dist/patterns/forgot-password-form/index.js +1 -1
  204. package/dist/patterns/login-form/index.js +1 -1
  205. package/dist/patterns/registration-form/index.js +1 -1
  206. package/dist/patterns/reset-password-form/index.js +1 -1
  207. package/dist/patterns/send-registration-link-form/index.js +1 -1
  208. package/dist/patterns/signature-request/index.js +1 -1
  209. package/dist/patterns/verify-identity/change-email-dialog.d.ts +26 -0
  210. package/dist/patterns/verify-identity/change-email-dialog.d.ts.map +1 -0
  211. package/dist/patterns/verify-identity/index.d.ts +7 -0
  212. package/dist/patterns/verify-identity/index.d.ts.map +1 -0
  213. package/dist/patterns/verify-identity/index.js +8 -0
  214. package/dist/patterns/verify-identity/index.js.map +1 -0
  215. package/dist/patterns/verify-identity/use-countdown.d.ts +12 -0
  216. package/dist/patterns/verify-identity/use-countdown.d.ts.map +1 -0
  217. package/dist/patterns/verify-identity/verify-identity-steps.d.ts +21 -0
  218. package/dist/patterns/verify-identity/verify-identity-steps.d.ts.map +1 -0
  219. package/dist/patterns/verify-identity/verify-identity-types.d.ts +47 -0
  220. package/dist/patterns/verify-identity/verify-identity-types.d.ts.map +1 -0
  221. package/dist/patterns/verify-identity/verify-identity.d.ts +54 -0
  222. package/dist/patterns/verify-identity/verify-identity.d.ts.map +1 -0
  223. package/dist/tokens.css +1 -1
  224. package/package.json +5 -1
  225. package/dist/_chunks/email-input-BEO3vonE.js +0 -399
  226. package/dist/_chunks/email-input-BEO3vonE.js.map +0 -1
  227. package/dist/_chunks/practice-results-BOpaPaav.js.map +0 -1
  228. package/dist/_chunks/select-BBDRYxJl.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-identity-types-C85EXNzy.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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"}
@@ -14,7 +14,7 @@ import { F as yn } from "./form-field-CyHfOVKF.js";
14
14
  import { K as bn } from "./kbd-Bx7eQv9f.js";
15
15
  import { L as pe } from "./list-CNnn7DOD.js";
16
16
  import { L as xn } from "./live-region-C41SO3cA.js";
17
- import { S as wn } from "./select-BBDRYxJl.js";
17
+ import { S as wn } from "./select-uESzXTX6.js";
18
18
  import { a as Nn, b as Ct, c as Cn, d as kn } from "./ai-fab-pill-BOu96kCx.js";
19
19
  import { c as An } from "./compose-refs-C0k0tdqF.js";
20
20
  import { g as Rn, a as En } from "./glass-surface-CPok0jEe.js";
@@ -1145,4 +1145,4 @@ export {
1145
1145
  no as V,
1146
1146
  Gn as v
1147
1147
  };
1148
- //# sourceMappingURL=voice-control-panel-B0TUZAiP.js.map
1148
+ //# sourceMappingURL=voice-control-panel-BGiX4sqB.js.map