@alfadocs/ui-kit-debug 1.133.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.
- package/dist/_chunks/{agenda-card-B8hV3dZV.js → agenda-card-B9wgX_Ed.js} +2 -2
- package/dist/_chunks/{agenda-card-B8hV3dZV.js.map → agenda-card-B9wgX_Ed.js.map} +1 -1
- package/dist/_chunks/{agenda-tray-Bu46s3dI.js → agenda-tray-CGcS_qoM.js} +2 -2
- package/dist/_chunks/{agenda-tray-Bu46s3dI.js.map → agenda-tray-CGcS_qoM.js.map} +1 -1
- package/dist/_chunks/appointment-card-DG3m9yN-.js +504 -0
- package/dist/_chunks/appointment-card-DG3m9yN-.js.map +1 -0
- package/dist/_chunks/{appointment-peek-DZa6xyUb.js → appointment-peek-BK0tDs4C.js} +2 -2
- package/dist/_chunks/{appointment-peek-DZa6xyUb.js.map → appointment-peek-BK0tDs4C.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-DQePqpyH.js → appointment-timeline-BiI2riRZ.js} +2 -2
- package/dist/_chunks/{appointment-timeline-DQePqpyH.js.map → appointment-timeline-BiI2riRZ.js.map} +1 -1
- package/dist/_chunks/appointment-tray-ClJCtYQj.js +200 -0
- package/dist/_chunks/appointment-tray-ClJCtYQj.js.map +1 -0
- package/dist/_chunks/{appointment-workflow-status-DMjuIK90.js → appointment-workflow-status-S-lx81Yz.js} +2 -2
- package/dist/_chunks/{appointment-workflow-status-DMjuIK90.js.map → appointment-workflow-status-S-lx81Yz.js.map} +1 -1
- package/dist/_chunks/ban-CiSCCcOE.js +15 -0
- package/dist/_chunks/ban-CiSCCcOE.js.map +1 -0
- package/dist/_chunks/{calendar-BIoOeBTT.js → calendar-CyLtLBNP.js} +2 -2
- package/dist/_chunks/{calendar-BIoOeBTT.js.map → calendar-CyLtLBNP.js.map} +1 -1
- package/dist/_chunks/{calendar-appointment-editor-dialog-BHx6kUhX.js → calendar-appointment-editor-dialog-BSkIYGlW.js} +13 -13
- package/dist/_chunks/{calendar-appointment-editor-dialog-BHx6kUhX.js.map → calendar-appointment-editor-dialog-BSkIYGlW.js.map} +1 -1
- package/dist/_chunks/{calendar-event-card-BNEzkjm-.js → calendar-event-card-BJifpYZQ.js} +7 -6
- package/dist/_chunks/{calendar-event-card-BNEzkjm-.js.map → calendar-event-card-BJifpYZQ.js.map} +1 -1
- package/dist/_chunks/{care-plan-card-DKScH9Ss.js → care-plan-card-CjHq6PLo.js} +6 -6
- package/dist/_chunks/{care-plan-card-DKScH9Ss.js.map → care-plan-card-CjHq6PLo.js.map} +1 -1
- package/dist/_chunks/{care-plan-entry-card-AG1y3nyW.js → care-plan-entry-card-DY1toF6E.js} +2 -2
- package/dist/_chunks/{care-plan-entry-card-AG1y3nyW.js.map → care-plan-entry-card-DY1toF6E.js.map} +1 -1
- package/dist/_chunks/{care-plan-header-Dx5OMkc9.js → care-plan-header-CeFXUDnL.js} +6 -6
- package/dist/_chunks/{care-plan-header-Dx5OMkc9.js.map → care-plan-header-CeFXUDnL.js.map} +1 -1
- package/dist/_chunks/check-in-documents-CEVcgcYZ.js +136 -0
- package/dist/_chunks/check-in-documents-CEVcgcYZ.js.map +1 -0
- package/dist/_chunks/{clinical-note-card-pPaeWWnu.js → clinical-note-card-D--IwbZa.js} +2 -2
- package/dist/_chunks/{clinical-note-card-pPaeWWnu.js.map → clinical-note-card-D--IwbZa.js.map} +1 -1
- package/dist/_chunks/document-preview-DLVIrOYV.js +385 -0
- package/dist/_chunks/document-preview-DLVIrOYV.js.map +1 -0
- package/dist/_chunks/{entity-card-fpm-KUKc.js → entity-card-p-LANpYt.js} +18 -17
- package/dist/_chunks/{entity-card-fpm-KUKc.js.map → entity-card-p-LANpYt.js.map} +1 -1
- package/dist/_chunks/{error-page-B0fGNTRB.js → error-page-WLhmWUTq.js} +100 -115
- package/dist/_chunks/error-page-WLhmWUTq.js.map +1 -0
- package/dist/_chunks/finished-terminal-unDnXT4j.js +191 -0
- package/dist/_chunks/finished-terminal-unDnXT4j.js.map +1 -0
- package/dist/_chunks/house-DGCypGTo.js +21 -0
- package/dist/_chunks/house-DGCypGTo.js.map +1 -0
- package/dist/_chunks/is-safe-url-CEy9CEml.js +8 -0
- package/dist/_chunks/is-safe-url-CEy9CEml.js.map +1 -0
- package/dist/_chunks/keypad-DBH_keVs.js +152 -0
- package/dist/_chunks/keypad-DBH_keVs.js.map +1 -0
- package/dist/_chunks/keypad-button-mOaPQRrH.js +114 -0
- package/dist/_chunks/keypad-button-mOaPQRrH.js.map +1 -0
- package/dist/_chunks/{message-card-BG3_3nN1.js → message-card-Bw_q1qKx.js} +2 -2
- package/dist/_chunks/{message-card-BG3_3nN1.js.map → message-card-Bw_q1qKx.js.map} +1 -1
- package/dist/_chunks/{message-tray-BjZv0Fsk.js → message-tray-pLGgLmoG.js} +2 -2
- package/dist/_chunks/{message-tray-BjZv0Fsk.js.map → message-tray-pLGgLmoG.js.map} +1 -1
- package/dist/_chunks/{note-attachment-MNTIqdSz.js → note-attachment-JTIy9iXN.js} +2 -2
- package/dist/_chunks/{note-attachment-MNTIqdSz.js.map → note-attachment-JTIy9iXN.js.map} +1 -1
- package/dist/_chunks/{note-timeline-BQeW0VZY.js → note-timeline-BbjHMhkL.js} +2 -2
- package/dist/_chunks/{note-timeline-BQeW0VZY.js.map → note-timeline-BbjHMhkL.js.map} +1 -1
- package/dist/_chunks/{notes-panel-Cm-_pCRJ.js → notes-panel-BAyPOr8N.js} +2 -2
- package/dist/_chunks/{notes-panel-Cm-_pCRJ.js.map → notes-panel-BAyPOr8N.js.map} +1 -1
- package/dist/_chunks/{operator-hero-CnfWckNQ.js → operator-hero-D4wfVu2l.js} +2 -2
- package/dist/_chunks/{operator-hero-CnfWckNQ.js.map → operator-hero-D4wfVu2l.js.map} +1 -1
- package/dist/_chunks/otp-input-BNOTlxq3.js +342 -0
- package/dist/_chunks/otp-input-BNOTlxq3.js.map +1 -0
- package/dist/_chunks/patient-account-settings-BkAtIxJW.js +546 -0
- package/dist/_chunks/patient-account-settings-BkAtIxJW.js.map +1 -0
- package/dist/_chunks/patient-card-DTh3QTyS.js +125 -0
- package/dist/_chunks/patient-card-DTh3QTyS.js.map +1 -0
- package/dist/_chunks/patient-check-in-resume-xhqjC6gf.js +742 -0
- package/dist/_chunks/patient-check-in-resume-xhqjC6gf.js.map +1 -0
- package/dist/_chunks/patient-sign-in-pin-CDBqV254.js +432 -0
- package/dist/_chunks/patient-sign-in-pin-CDBqV254.js.map +1 -0
- package/dist/_chunks/patient-sign-in-steps-C2JSqlok.js +199 -0
- package/dist/_chunks/patient-sign-in-steps-C2JSqlok.js.map +1 -0
- package/dist/_chunks/{patient-summary-card-BUcZ-gaL.js → patient-summary-card-Bl2NknPe.js} +2 -2
- package/dist/_chunks/{patient-summary-card-BUcZ-gaL.js.map → patient-summary-card-Bl2NknPe.js.map} +1 -1
- package/dist/_chunks/{payment-request-card-Dv4WbRBe.js → payment-request-card-CNW00DCx.js} +6 -6
- package/dist/_chunks/{payment-request-card-Dv4WbRBe.js.map → payment-request-card-CNW00DCx.js.map} +1 -1
- package/dist/_chunks/{pdf-viewer-BnBKdx0y.js → pdf-viewer-TRC5jEm5.js} +472 -425
- package/dist/_chunks/pdf-viewer-TRC5jEm5.js.map +1 -0
- package/dist/_chunks/pin-entry-BugWQMOS.js +219 -0
- package/dist/_chunks/pin-entry-BugWQMOS.js.map +1 -0
- package/dist/_chunks/pin-indicator-Cb-n40UI.js +124 -0
- package/dist/_chunks/pin-indicator-Cb-n40UI.js.map +1 -0
- package/dist/_chunks/portal-details-CTEsm705.js +478 -0
- package/dist/_chunks/portal-details-CTEsm705.js.map +1 -0
- package/dist/_chunks/portal-documents-D8skew0h.js +902 -0
- package/dist/_chunks/portal-documents-D8skew0h.js.map +1 -0
- package/dist/_chunks/portal-parts-BdR29P7z.js +285 -0
- package/dist/_chunks/portal-parts-BdR29P7z.js.map +1 -0
- package/dist/_chunks/{privacy-mask-DJ1gee4c.js → privacy-mask-C19dJFMk.js} +5 -5
- package/dist/_chunks/{privacy-mask-DJ1gee4c.js.map → privacy-mask-C19dJFMk.js.map} +1 -1
- package/dist/_chunks/{product-hub-panel-a8wdVOUt.js → product-hub-panel-K4QbULG7.js} +2 -2
- package/dist/_chunks/{product-hub-panel-a8wdVOUt.js.map → product-hub-panel-K4QbULG7.js.map} +1 -1
- package/dist/_chunks/{registration-form-CwbhtKcy.js → registration-form-DS3RuKHu.js} +2 -2
- package/dist/_chunks/{registration-form-CwbhtKcy.js.map → registration-form-DS3RuKHu.js.map} +1 -1
- package/dist/_chunks/{reserved.agent-W8mR179D.js → reserved.agent-DOzOBUW7.js} +2 -2
- package/dist/_chunks/{reserved.agent-W8mR179D.js.map → reserved.agent-DOzOBUW7.js.map} +1 -1
- package/dist/_chunks/session-countdown-DOx1IBUB.js +232 -0
- package/dist/_chunks/session-countdown-DOx1IBUB.js.map +1 -0
- package/dist/_chunks/{sign-document-CQZVzfpk.js → sign-document-DDZbmYHu.js} +2 -2
- package/dist/_chunks/{sign-document-CQZVzfpk.js.map → sign-document-DDZbmYHu.js.map} +1 -1
- package/dist/_chunks/{signature-field-DjabvRZm.js → signature-field-BjlY_yXH.js} +39 -34
- package/dist/_chunks/signature-field-BjlY_yXH.js.map +1 -0
- package/dist/_chunks/{signature-request-4pGq3YBe.js → signature-request-CHsM_iWi.js} +2 -2
- package/dist/_chunks/{signature-request-4pGq3YBe.js.map → signature-request-CHsM_iWi.js.map} +1 -1
- package/dist/_chunks/{signature-status-chip-pIoQjvH8.js → signature-status-chip-DS9hHwIt.js} +66 -69
- package/dist/_chunks/signature-status-chip-DS9hHwIt.js.map +1 -0
- package/dist/_chunks/signing-end-screen-an9P8DOT.js +1041 -0
- package/dist/_chunks/signing-end-screen-an9P8DOT.js.map +1 -0
- package/dist/_chunks/sms-code-entry-Dgp4GwlM.js +316 -0
- package/dist/_chunks/sms-code-entry-Dgp4GwlM.js.map +1 -0
- package/dist/_chunks/step-up-dialog-C2JqJmCA.js +132 -0
- package/dist/_chunks/step-up-dialog-C2JqJmCA.js.map +1 -0
- package/dist/_chunks/{task-editor-BL2hHxNz.js → task-editor-g1AGfxhr.js} +38 -38
- package/dist/_chunks/{task-editor-BL2hHxNz.js.map → task-editor-g1AGfxhr.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-_b7FRB1x.js → use-appointment-details-read-Dzc6fEzG.js} +6 -6
- package/dist/_chunks/{use-appointment-details-read-_b7FRB1x.js.map → use-appointment-details-read-Dzc6fEzG.js.map} +1 -1
- package/dist/_chunks/use-zoom-drilldown-Cr1baU5X.js +221 -0
- package/dist/_chunks/use-zoom-drilldown-Cr1baU5X.js.map +1 -0
- package/dist/_chunks/{user-x-DYszNtIg.js → user-x-BJZg4kaP.js} +8 -19
- package/dist/_chunks/user-x-BJZg4kaP.js.map +1 -0
- package/dist/_chunks/{verify-identity-types-CxtrBXsZ.js → verify-identity-types-C6Bam8v6.js} +2 -2
- package/dist/_chunks/{verify-identity-types-CxtrBXsZ.js.map → verify-identity-types-C6Bam8v6.js.map} +1 -1
- package/dist/agent-catalog.json +723 -364
- package/dist/agent-i18n/en.json +75 -18
- package/dist/browser-support.js +1 -1
- package/dist/components/_shared/is-safe-url.d.ts +3 -1
- package/dist/components/_shared/is-safe-url.d.ts.map +1 -1
- package/dist/components/agenda-card/index.js +2 -2
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/appointment-card/appointment-card.d.ts +45 -0
- package/dist/components/appointment-card/appointment-card.d.ts.map +1 -1
- package/dist/components/appointment-card/appointment-tray.agent.d.ts.map +1 -1
- package/dist/components/appointment-card/appointment-tray.d.ts +11 -0
- package/dist/components/appointment-card/appointment-tray.d.ts.map +1 -1
- package/dist/components/appointment-card/index.js +3 -3
- package/dist/components/appointment-details-panel/index.js +1 -1
- package/dist/components/appointment-peek/index.js +1 -1
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/calendar-event-card/index.js +1 -1
- package/dist/components/care-plan-card/index.js +1 -1
- package/dist/components/care-plan-entry-card/index.js +1 -1
- package/dist/components/care-plan-header/index.js +1 -1
- package/dist/components/clinical-note-card/index.js +1 -1
- package/dist/components/document-preview/document-preview.agent.d.ts.map +1 -1
- package/dist/components/document-preview/document-preview.d.ts +61 -7
- package/dist/components/document-preview/document-preview.d.ts.map +1 -1
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/finished-terminal/finished-terminal.d.ts +63 -6
- package/dist/components/finished-terminal/finished-terminal.d.ts.map +1 -1
- package/dist/components/finished-terminal/index.d.ts +1 -1
- package/dist/components/finished-terminal/index.d.ts.map +1 -1
- package/dist/components/finished-terminal/index.js +1 -1
- package/dist/components/index.d.ts +12 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/keypad/index.d.ts +3 -0
- package/dist/components/keypad/index.d.ts.map +1 -0
- package/dist/components/keypad/index.js +6 -0
- package/dist/components/keypad/index.js.map +1 -0
- package/dist/components/keypad/keypad.d.ts +54 -0
- package/dist/components/keypad/keypad.d.ts.map +1 -0
- package/dist/components/keypad-button/index.d.ts +3 -0
- package/dist/components/keypad-button/index.d.ts.map +1 -0
- package/dist/components/keypad-button/index.js +6 -0
- package/dist/components/keypad-button/index.js.map +1 -0
- package/dist/components/keypad-button/keypad-button.d.ts +33 -0
- package/dist/components/keypad-button/keypad-button.d.ts.map +1 -0
- package/dist/components/message-card/index.js +2 -2
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/note-timeline/index.js +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/operator-hero/index.js +1 -1
- package/dist/components/otp-input/index.js +1 -1
- package/dist/components/otp-input/otp-input.d.ts +11 -0
- package/dist/components/otp-input/otp-input.d.ts.map +1 -1
- package/dist/components/patient-summary-card/index.js +1 -1
- package/dist/components/payment-card/index.js +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/pdf-viewer/pdf-viewer.agent.d.ts.map +1 -1
- package/dist/components/pdf-viewer/pdf-viewer.d.ts +7 -0
- package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
- package/dist/components/pin-entry/index.d.ts +3 -0
- package/dist/components/pin-entry/index.d.ts.map +1 -0
- package/dist/components/pin-entry/index.js +5 -0
- package/dist/components/pin-entry/index.js.map +1 -0
- package/dist/components/pin-entry/pin-entry.agent.d.ts +4 -0
- package/dist/components/pin-entry/pin-entry.agent.d.ts.map +1 -0
- package/dist/components/pin-entry/pin-entry.d.ts +64 -0
- package/dist/components/pin-entry/pin-entry.d.ts.map +1 -0
- package/dist/components/pin-indicator/index.d.ts +3 -0
- package/dist/components/pin-indicator/index.d.ts.map +1 -0
- package/dist/components/pin-indicator/index.js +9 -0
- package/dist/components/pin-indicator/index.js.map +1 -0
- package/dist/components/pin-indicator/pin-indicator.d.ts +34 -0
- package/dist/components/pin-indicator/pin-indicator.d.ts.map +1 -0
- package/dist/components/product-hub-tray/index.js +2 -2
- package/dist/components/session-countdown/index.js +1 -1
- package/dist/components/session-countdown/session-countdown.d.ts +19 -0
- package/dist/components/session-countdown/session-countdown.d.ts.map +1 -1
- package/dist/components/sign-document/index.js +1 -1
- package/dist/components/signature-field/index.js +1 -1
- package/dist/components/signature-field/signature-field.d.ts +17 -6
- package/dist/components/signature-field/signature-field.d.ts.map +1 -1
- package/dist/components/signature-status-chip/index.js +1 -1
- package/dist/components/signature-status-chip/signature-status-chip.d.ts +3 -2
- package/dist/components/signature-status-chip/signature-status-chip.d.ts.map +1 -1
- package/dist/components/sms-code-entry/index.d.ts +3 -0
- package/dist/components/sms-code-entry/index.d.ts.map +1 -0
- package/dist/components/sms-code-entry/index.js +5 -0
- package/dist/components/sms-code-entry/index.js.map +1 -0
- package/dist/components/sms-code-entry/sms-code-entry.agent.d.ts +4 -0
- package/dist/components/sms-code-entry/sms-code-entry.agent.d.ts.map +1 -0
- package/dist/components/sms-code-entry/sms-code-entry.d.ts +156 -0
- package/dist/components/sms-code-entry/sms-code-entry.d.ts.map +1 -0
- package/dist/components/step-up-dialog/index.d.ts +3 -0
- package/dist/components/step-up-dialog/index.d.ts.map +1 -0
- package/dist/components/step-up-dialog/index.js +5 -0
- package/dist/components/step-up-dialog/index.js.map +1 -0
- package/dist/components/step-up-dialog/step-up-dialog.d.ts +108 -0
- package/dist/components/step-up-dialog/step-up-dialog.d.ts.map +1 -0
- package/dist/components/task-editor/index.js +1 -1
- package/dist/components/workflow-status/index.js +1 -1
- package/dist/core.css +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/use-signing-session.d.ts +7 -2
- package/dist/hooks/use-signing-session.d.ts.map +1 -1
- package/dist/host-compat.css +10 -1
- package/dist/i18n/locales/ar.d.ts +512 -1
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +509 -3
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +512 -1
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +517 -4
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +512 -1
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +512 -4
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +514 -1
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +520 -4
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +512 -1
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +510 -4
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +512 -1
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +510 -4
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +512 -1
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +510 -4
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +512 -1
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +517 -4
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +512 -1
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +510 -4
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +512 -1
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +517 -4
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +512 -1
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +517 -4
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +512 -1
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +517 -4
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +512 -1
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +517 -4
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +512 -1
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +509 -3
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +512 -1
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +510 -4
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +512 -1
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +510 -4
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +512 -1
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +512 -4
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +512 -1
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +510 -4
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +1271 -1204
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.json +513 -2
- package/dist/locales/de.json +514 -3
- package/dist/locales/el.json +514 -3
- package/dist/locales/en.json +514 -3
- package/dist/locales/es.json +514 -3
- package/dist/locales/fr.json +514 -3
- package/dist/locales/hi.json +514 -3
- package/dist/locales/it.json +514 -3
- package/dist/locales/ja.json +514 -3
- package/dist/locales/nl.json +514 -3
- package/dist/locales/pl.json +514 -3
- package/dist/locales/pt.json +514 -3
- package/dist/locales/ro.json +514 -3
- package/dist/locales/ru.json +513 -2
- package/dist/locales/sq.json +514 -3
- package/dist/locales/sv.json +514 -3
- package/dist/locales/tr.json +514 -3
- package/dist/locales/zh.json +514 -3
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/check-in-documents/check-in-documents.d.ts +61 -0
- package/dist/patterns/check-in-documents/check-in-documents.d.ts.map +1 -0
- package/dist/patterns/check-in-documents/check-in-signable-document.d.ts +32 -0
- package/dist/patterns/check-in-documents/check-in-signable-document.d.ts.map +1 -0
- package/dist/patterns/check-in-documents/index.d.ts +4 -0
- package/dist/patterns/check-in-documents/index.d.ts.map +1 -0
- package/dist/patterns/check-in-documents/index.js +5 -0
- package/dist/patterns/check-in-documents/index.js.map +1 -0
- package/dist/patterns/error-page/index.js +1 -1
- package/dist/patterns/patient-account-settings/index.d.ts +4 -0
- package/dist/patterns/patient-account-settings/index.d.ts.map +1 -0
- package/dist/patterns/patient-account-settings/index.js +5 -0
- package/dist/patterns/patient-account-settings/index.js.map +1 -0
- package/dist/patterns/patient-account-settings/patient-account-settings-panels.d.ts +36 -0
- package/dist/patterns/patient-account-settings/patient-account-settings-panels.d.ts.map +1 -0
- package/dist/patterns/patient-account-settings/patient-account-settings.d.ts +94 -0
- package/dist/patterns/patient-account-settings/patient-account-settings.d.ts.map +1 -0
- package/dist/patterns/patient-account-settings/patient-account-settings.types.d.ts +91 -0
- package/dist/patterns/patient-account-settings/patient-account-settings.types.d.ts.map +1 -0
- package/dist/patterns/patient-check-in/index.d.ts +20 -0
- package/dist/patterns/patient-check-in/index.d.ts.map +1 -0
- package/dist/patterns/patient-check-in/index.js +13 -0
- package/dist/patterns/patient-check-in/index.js.map +1 -0
- package/dist/patterns/patient-check-in/patient-check-in-changed.d.ts +33 -0
- package/dist/patterns/patient-check-in/patient-check-in-changed.d.ts.map +1 -0
- package/dist/patterns/patient-check-in/patient-check-in-connection-notice.d.ts +29 -0
- package/dist/patterns/patient-check-in/patient-check-in-connection-notice.d.ts.map +1 -0
- package/dist/patterns/patient-check-in/patient-check-in-done.d.ts +25 -0
- package/dist/patterns/patient-check-in/patient-check-in-done.d.ts.map +1 -0
- package/dist/patterns/patient-check-in/patient-check-in-entry.d.ts +29 -0
- package/dist/patterns/patient-check-in/patient-check-in-entry.d.ts.map +1 -0
- package/dist/patterns/patient-check-in/patient-check-in-hub-empty.d.ts +23 -0
- package/dist/patterns/patient-check-in/patient-check-in-hub-empty.d.ts.map +1 -0
- package/dist/patterns/patient-check-in/patient-check-in-hub.d.ts +61 -0
- package/dist/patterns/patient-check-in/patient-check-in-hub.d.ts.map +1 -0
- package/dist/patterns/patient-check-in/patient-check-in-personal-data.d.ts +73 -0
- package/dist/patterns/patient-check-in/patient-check-in-personal-data.d.ts.map +1 -0
- package/dist/patterns/patient-check-in/patient-check-in-privacy.d.ts +9 -0
- package/dist/patterns/patient-check-in/patient-check-in-privacy.d.ts.map +1 -0
- package/dist/patterns/patient-check-in/patient-check-in-resume.d.ts +29 -0
- package/dist/patterns/patient-check-in/patient-check-in-resume.d.ts.map +1 -0
- package/dist/patterns/patient-check-in/patient-check-in-shell.d.ts +60 -0
- package/dist/patterns/patient-check-in/patient-check-in-shell.d.ts.map +1 -0
- package/dist/patterns/patient-check-in/patient-check-in-types.d.ts +92 -0
- package/dist/patterns/patient-check-in/patient-check-in-types.d.ts.map +1 -0
- package/dist/patterns/patient-portal/index.d.ts +12 -0
- package/dist/patterns/patient-portal/index.d.ts.map +1 -0
- package/dist/patterns/patient-portal/index.js +13 -0
- package/dist/patterns/patient-portal/index.js.map +1 -0
- package/dist/patterns/patient-portal/portal-appointments.d.ts +70 -0
- package/dist/patterns/patient-portal/portal-appointments.d.ts.map +1 -0
- package/dist/patterns/patient-portal/portal-details.d.ts +148 -0
- package/dist/patterns/patient-portal/portal-details.d.ts.map +1 -0
- package/dist/patterns/patient-portal/portal-documents.d.ts +74 -0
- package/dist/patterns/patient-portal/portal-documents.d.ts.map +1 -0
- package/dist/patterns/patient-portal/portal-format.d.ts +14 -0
- package/dist/patterns/patient-portal/portal-format.d.ts.map +1 -0
- package/dist/patterns/patient-portal/portal-home.d.ts +71 -0
- package/dist/patterns/patient-portal/portal-home.d.ts.map +1 -0
- package/dist/patterns/patient-portal/portal-parts.d.ts +107 -0
- package/dist/patterns/patient-portal/portal-parts.d.ts.map +1 -0
- package/dist/patterns/patient-portal/portal-shell.d.ts +84 -0
- package/dist/patterns/patient-portal/portal-shell.d.ts.map +1 -0
- package/dist/patterns/patient-portal/portal-types.d.ts +157 -0
- package/dist/patterns/patient-portal/portal-types.d.ts.map +1 -0
- package/dist/patterns/patient-sign-in/index.d.ts +7 -0
- package/dist/patterns/patient-sign-in/index.d.ts.map +1 -0
- package/dist/patterns/patient-sign-in/index.js +15 -0
- package/dist/patterns/patient-sign-in/index.js.map +1 -0
- package/dist/patterns/patient-sign-in/patient-card.d.ts +74 -0
- package/dist/patterns/patient-sign-in/patient-card.d.ts.map +1 -0
- package/dist/patterns/patient-sign-in/patient-sign-in-email.d.ts +109 -0
- package/dist/patterns/patient-sign-in/patient-sign-in-email.d.ts.map +1 -0
- package/dist/patterns/patient-sign-in/patient-sign-in-pin.d.ts +157 -0
- package/dist/patterns/patient-sign-in/patient-sign-in-pin.d.ts.map +1 -0
- package/dist/patterns/patient-sign-in/patient-sign-in-steps.d.ts +143 -0
- package/dist/patterns/patient-sign-in/patient-sign-in-steps.d.ts.map +1 -0
- package/dist/patterns/registration-form/index.js +1 -1
- package/dist/patterns/signature-request/index.js +1 -1
- package/dist/patterns/signing/index.d.ts +25 -0
- package/dist/patterns/signing/index.d.ts.map +1 -0
- package/dist/patterns/signing/index.js +16 -0
- package/dist/patterns/signing/index.js.map +1 -0
- package/dist/patterns/signing/multi-field-signer.d.ts +117 -0
- package/dist/patterns/signing/multi-field-signer.d.ts.map +1 -0
- package/dist/patterns/signing/signing-awaiting-screen.d.ts +25 -0
- package/dist/patterns/signing/signing-awaiting-screen.d.ts.map +1 -0
- package/dist/patterns/signing/signing-chrome.d.ts +30 -0
- package/dist/patterns/signing/signing-chrome.d.ts.map +1 -0
- package/dist/patterns/signing/signing-document-screen.d.ts +87 -0
- package/dist/patterns/signing/signing-document-screen.d.ts.map +1 -0
- package/dist/patterns/signing/signing-end-screen.d.ts +27 -0
- package/dist/patterns/signing/signing-end-screen.d.ts.map +1 -0
- package/dist/patterns/signing/signing-finished-screen.d.ts +34 -0
- package/dist/patterns/signing/signing-finished-screen.d.ts.map +1 -0
- package/dist/patterns/signing/signing-footer.d.ts +56 -0
- package/dist/patterns/signing/signing-footer.d.ts.map +1 -0
- package/dist/patterns/signing/signing-handoff-screen.d.ts +37 -0
- package/dist/patterns/signing/signing-handoff-screen.d.ts.map +1 -0
- package/dist/patterns/signing/signing-message-dialog.d.ts +29 -0
- package/dist/patterns/signing/signing-message-dialog.d.ts.map +1 -0
- package/dist/patterns/signing/signing-progress-chip.d.ts +27 -0
- package/dist/patterns/signing/signing-progress-chip.d.ts.map +1 -0
- package/dist/patterns/signing/signing-roster.d.ts +44 -0
- package/dist/patterns/signing/signing-roster.d.ts.map +1 -0
- package/dist/patterns/signing/signing-staff-id-confirmation.d.ts +49 -0
- package/dist/patterns/signing/signing-staff-id-confirmation.d.ts.map +1 -0
- package/dist/patterns/verify-identity/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +49 -1
- package/dist/_chunks/appointment-card-OAOur8lH.js +0 -434
- package/dist/_chunks/appointment-card-OAOur8lH.js.map +0 -1
- package/dist/_chunks/appointment-tray-DSFqO5Rm.js +0 -193
- package/dist/_chunks/appointment-tray-DSFqO5Rm.js.map +0 -1
- package/dist/_chunks/document-preview-_kQ9QvZV.js +0 -291
- package/dist/_chunks/document-preview-_kQ9QvZV.js.map +0 -1
- package/dist/_chunks/error-page-B0fGNTRB.js.map +0 -1
- package/dist/_chunks/finished-terminal-FR8uc_Ws.js +0 -122
- package/dist/_chunks/finished-terminal-FR8uc_Ws.js.map +0 -1
- package/dist/_chunks/is-safe-url-DkETxeHz.js +0 -7
- package/dist/_chunks/is-safe-url-DkETxeHz.js.map +0 -1
- package/dist/_chunks/otp-input-gV1446Dw.js +0 -301
- package/dist/_chunks/otp-input-gV1446Dw.js.map +0 -1
- package/dist/_chunks/pdf-viewer-BnBKdx0y.js.map +0 -1
- package/dist/_chunks/session-countdown-C4tzbJVc.js +0 -223
- package/dist/_chunks/session-countdown-C4tzbJVc.js.map +0 -1
- package/dist/_chunks/signature-field-DjabvRZm.js.map +0 -1
- package/dist/_chunks/signature-status-chip-pIoQjvH8.js.map +0 -1
- package/dist/_chunks/use-zoom-drilldown-qCX34w9I.js +0 -210
- package/dist/_chunks/use-zoom-drilldown-qCX34w9I.js.map +0 -1
- package/dist/_chunks/user-x-DYszNtIg.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signing-end-screen-an9P8DOT.js","sources":["../../src/patterns/signing/multi-field-signer.tsx","../../src/patterns/signing/signing-chrome.tsx","../../src/patterns/signing/signing-progress-chip.tsx","../../src/patterns/signing/signing-footer.tsx","../../src/patterns/signing/signing-roster.tsx","../../src/patterns/signing/signing-document-screen.tsx","../../src/patterns/signing/signing-message-dialog.tsx","../../src/patterns/signing/signing-staff-id-confirmation.tsx","../../src/patterns/signing/signing-handoff-screen.tsx","../../src/patterns/signing/signing-awaiting-screen.tsx","../../src/patterns/signing/signing-finished-screen.tsx","../../src/patterns/signing/signing-end-screen.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* MultiFieldSigner (HTP-6900). */\n/* */\n/* The PDFViewer + per-field SignatureField overlay + capture Dialog */\n/* (draw your signature or type your name) used by the signing screens */\n/* and by the check-in documents round. The host owns the */\n/* `useSigningSession` (counter, completion gate, step advance); this */\n/* component renders only the document surface and the capture dialog. */\n/* */\n/* Moved from `_shared/signing-step.tsx` (Phase 5). Existing props keep */\n/* their behaviour. Added, all optional: `onFieldConfirm`, */\n/* `submittingFieldId`, `captureError`, `onAllSigned`, `className`. */\n/* The component calls no API and runs no timer. */\n/* ------------------------------------------------------------------ */\n\nimport { useEffect, useRef, type ReactNode } from 'react';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport {\n PDFViewer,\n type PDFPageOverlayArgs,\n type PDFViewerHandle,\n type PDFZoomPreset,\n} from '../../components/pdf-viewer';\nimport { SignatureField } from '../../components/signature-field';\nimport {\n SignatureCapture,\n type SignatureConfirmPayload,\n} from '../../components/signature-capture';\nimport { Dialog } from '../../components/dialog';\nimport { Button } from '../../components/button';\nimport { Alert } from '../../components/alert';\nimport type { SigningFieldBase, UseSigningSessionReturn } from '../../hooks';\n\n/** A signature field: id + live signed state (via the session) + page-overlay geometry. */\nexport interface SigningStepField extends SigningFieldBase {\n /** 1-based page the field sits on. */\n page: number;\n /** Which document in the envelope (default 0). */\n docIndex?: number;\n /**\n * Percent offset of the field's logical start edge on the page. The PDF\n * page is always left to right, so in an RTL layout the host converts the\n * template's left offset to this start offset (100 - left - width).\n */\n insetInlineStart: number;\n /** Percent offset of the field's logical top edge on the page. */\n insetBlockStart: number;\n /** Percent of the page's inline size. */\n inlineSize: number;\n /** Percent of the page's block size. */\n blockSize: number;\n /** Already-translated caption / accessible name for the field. */\n label: string;\n /**\n * Render THIS field glyph-only (`SignatureField hideLabel`) while others\n * keep their captions. The label stays the accessible name.\n */\n hideLabel?: boolean;\n}\n\n/** All already-translated strings the capture dialog needs. */\nexport interface SigningStepLabels {\n /** Capture dialog title. */\n dialogTitle: string;\n /** Capture dialog subtitle. */\n dialogSubtitle: string;\n /**\n * Apply label (kept for existing callers). Not rendered: the capture pad's\n * own confirm button submits each field. The armed button that ends the\n * round is the footer's Sign button (`SigningFooter.onSign`, D133).\n */\n apply: string;\n /** Per-document heading for multi-document envelopes, e.g. (1, 2) gives \"Document 1 of 2\". */\n documentHeading?: (current: number, total: number) => string;\n /**\n * With `nextField`, enables Previous/Next controls inside the capture\n * dialog: the signer jumps to the adjacent unsigned field without closing\n * the dialog.\n */\n previousField?: string;\n /** See `previousField`. */\n nextField?: string;\n}\n\n/** One document in a multi-PDF envelope. */\nexport interface SigningStepDocument {\n /** Stable document index: matches each field's `docIndex`. */\n docIndex: number;\n /** PDF source for this document. */\n src: string | ArrayBuffer | Uint8Array;\n /** Already-translated accessible label / heading for this document. */\n title: string;\n}\n\nexport interface MultiFieldSignerProps {\n /** Single-document PDF source. Provide EITHER `src` OR `documents`. */\n src?: string | ArrayBuffer | Uint8Array;\n /** Multi-document envelope: renders every document in one continuous scroll. */\n documents?: SigningStepDocument[];\n /** Session from `useSigningSession(fields)`: owns signed state and the counter. */\n session: UseSigningSessionReturn<SigningStepField, SignatureConfirmPayload>;\n /** Already-translated capture dialog strings. */\n labels: SigningStepLabels;\n /** Single-document field filter (ignored when `documents` is set). */\n docIndex?: number;\n /** Accessible label for the PDF region (the document title). */\n ariaLabel?: string;\n /** Initial PDF zoom. Default `'fit-width'`. */\n initialZoom?: PDFZoomPreset;\n /**\n * Render every field glyph-only (`SignatureField hideLabel`), for surfaces\n * whose field labels are long document titles. Labels still form each\n * field's accessible name.\n */\n hideFieldLabels?: boolean;\n /**\n * Called when the signer confirms the capture dialog. It returns nothing\n * and is never awaited. Absent: the component calls `session.markSigned`\n * itself. Present: the host sends the signature and calls\n * `session.markSigned` after its own success; until then the dialog stays\n * open.\n */\n onFieldConfirm?: (fieldId: string, payload: SignatureConfirmPayload) => void;\n /**\n * The field the host is sending right now. That field shows its `signing`\n * state, and the capture pad and the in-dialog field buttons are disabled.\n */\n submittingFieldId?: string | null;\n /**\n * A message from the host about the last confirm (for example the server\n * refused it). Shown as an alert in the capture dialog, which stays open.\n */\n captureError?: string | null;\n /**\n * Called once when the last field becomes signed during this component's\n * life. It informs only: opening a dialog or moving on is the host's call.\n */\n onAllSigned?: () => void;\n /** Extra classes for the root. */\n className?: string;\n}\n\nfunction CaptureForm({\n labels,\n disabled,\n id,\n onComplete,\n}: {\n labels: SigningStepLabels;\n disabled: boolean;\n id: string;\n onComplete: (payload: SignatureConfirmPayload) => void;\n}) {\n // SignatureCapture is the single capture surface: it offers drawing and a\n // \"Type your name\" toggle, so the signer picks one way in one place.\n return (\n <SignatureCapture\n id={id}\n width=\"100%\"\n allowTypedFallback\n disabled={disabled}\n ariaLabel={labels.dialogTitle}\n onConfirm={(payload) => onComplete(payload)}\n />\n );\n}\n\n/**\n * The document surface of a signing round: PDFs in one scroll, a\n * `SignatureField` overlay on each field, and a capture dialog (draw or type).\n * Session-driven: it never decides what is signed. A signed field cannot be\n * reopened (the session refuses it and the field is not activatable).\n */\nexport function MultiFieldSigner({\n src,\n documents,\n session,\n labels,\n docIndex,\n ariaLabel,\n initialZoom = 'fit-width',\n hideFieldLabels = false,\n onFieldConfirm,\n submittingFieldId = null,\n captureError = null,\n onAllSigned,\n className,\n}: MultiFieldSignerProps): ReactNode {\n // Normalise to a list of documents so the single-`src` and multi-document\n // paths share one render. Single-`src` becomes a one-document envelope.\n const docs: SigningStepDocument[] =\n documents ??\n (src !== undefined\n ? [{ docIndex: docIndex ?? 0, src, title: ariaLabel ?? '' }]\n : []);\n const isMulti = documents !== undefined;\n\n // The field-nav cursor spans the whole envelope when multi-document;\n // otherwise it stays scoped to the single visible document.\n const visible = isMulti\n ? session.fields\n : docIndex === undefined\n ? session.fields\n : session.fields.filter((f) => (f.docIndex ?? 0) === docIndex);\n\n const pdfRefs = useRef<Record<number, PDFViewerHandle | null>>({});\n const fieldRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n const fieldsRef = useRef(session.fields);\n fieldsRef.current = session.fields;\n const navInitialRender = useRef(true);\n // The field that opened the capture dialog. The dialog has no trigger, so\n // Radix cannot hand focus back: this does it on close (WCAG 2.4.3).\n const openerFieldId = useRef<string | null>(null);\n useEffect(() => {\n if (session.activeFieldId !== null && openerFieldId.current === null) {\n openerFieldId.current = session.activeFieldId;\n }\n }, [session.activeFieldId]);\n const returnFocus = (event: Event): void => {\n event.preventDefault();\n const opener = openerFieldId.current;\n openerFieldId.current = null;\n const next = session.fields.find((f) => !f.signed)?.id;\n const target =\n (opener ? fieldRefs.current[opener] : null) ??\n (next ? fieldRefs.current[next] : null);\n target?.focus({ preventScroll: true });\n };\n\n // Tell the host once when the last field turns signed. It never fires for\n // a session that was already complete on mount.\n const wasComplete = useRef(session.isComplete);\n const onAllSignedRef = useRef(onAllSigned);\n onAllSignedRef.current = onAllSigned;\n useEffect(() => {\n if (session.isComplete && !wasComplete.current) {\n onAllSignedRef.current?.();\n }\n wasComplete.current = session.isComplete;\n }, [session.isComplete]);\n\n // When the session's navigation cursor moves, scroll the field's document\n // to that page and best-effort focus the field once its overlay mounts.\n // Skip the initial render so focus is never stolen on mount.\n useEffect(() => {\n if (navInitialRender.current) {\n navInitialRender.current = false;\n return undefined;\n }\n const id = session.cursorFieldId;\n if (!id) return undefined;\n const field = fieldsRef.current.find((f) => f.id === id);\n if (!field) return undefined;\n pdfRefs.current[field.docIndex ?? 0]?.goToPage(field.page);\n let tries = 0;\n let raf = 0;\n const focusWhenReady = (): void => {\n const el = fieldRefs.current[id];\n if (el) {\n el.focus();\n return;\n }\n if (tries < 30) {\n tries += 1;\n raf = requestAnimationFrame(focusWhenReady);\n }\n };\n raf = requestAnimationFrame(focusWhenReady);\n return () => cancelAnimationFrame(raf);\n }, [session.cursorFieldId]);\n\n const submitting =\n submittingFieldId !== null && submittingFieldId === session.activeFieldId;\n\n // In-dialog field nav. A signed field cannot be reopened, so the buttons\n // step to the nearest unsigned field in that direction and are disabled\n // when there is none.\n const activeIndex = session.fields.findIndex(\n (f) => f.id === session.activeFieldId,\n );\n const findAdjacentField = (dir: 1 | -1) => {\n if (activeIndex < 0) return undefined;\n for (\n let i = activeIndex + dir;\n i >= 0 && i < session.fields.length;\n i += dir\n ) {\n if (!session.fields[i].signed) return session.fields[i];\n }\n return undefined;\n };\n const previousTarget = findAdjacentField(-1);\n const nextTarget = findAdjacentField(1);\n const activeLabel = session.fields.find(\n (f) => f.id === session.activeFieldId,\n )?.label;\n const openAdjacentField = (target: typeof previousTarget): void => {\n if (!target || submitting) return;\n if (!session.openField(target.id)) return;\n pdfRefs.current[target.docIndex ?? 0]?.goToPage(target.page);\n };\n\n return (\n <div data-component=\"multi-field-signer\" className={className}>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n {docs.map((doc, docPosition) => (\n <div\n key={doc.docIndex}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n {isMulti && labels.documentHeading ? (\n <h2 dir=\"auto\" className=\"type-title-card ds:m-0\">\n {labels.documentHeading(docPosition + 1, docs.length)}\n </h2>\n ) : null}\n <PDFViewer\n ref={(el) => {\n pdfRefs.current[doc.docIndex] = el;\n }}\n id={`signing-document-${doc.docIndex}`}\n src={doc.src}\n initialZoom={initialZoom}\n // Signing is a read-and-sign surface: the full editor toolbar\n // (page nav, search, print) is noise here.\n toolbarVariant=\"minimal\"\n ariaLabel={doc.title || ariaLabel}\n renderPageOverlay={({ pageNumber }: PDFPageOverlayArgs) => (\n <>\n {visible\n .filter(\n (f) =>\n (f.docIndex ?? 0) === doc.docIndex &&\n f.page === pageNumber,\n )\n .map((f) => (\n <SignatureField\n key={f.id}\n id={f.id}\n ref={(el) => {\n fieldRefs.current[f.id] = el;\n }}\n state={\n f.signed\n ? 'signed'\n : f.id === submittingFieldId\n ? 'signing'\n : 'unsigned'\n }\n active={session.cursorFieldId === f.id}\n signedImageSrc={f.payload?.png}\n label={f.label}\n hideLabel={hideFieldLabels || f.hideLabel}\n insetInlineStart={f.insetInlineStart}\n insetBlockStart={f.insetBlockStart}\n inlineSize={f.inlineSize}\n blockSize={f.blockSize}\n onActivate={() => session.openField(f.id)}\n data-testid={`field-${f.id}`}\n />\n ))}\n </>\n )}\n />\n </div>\n ))}\n </div>\n\n <Dialog.Root\n id=\"signing-capture\"\n open={session.activeFieldId !== null}\n onOpenChange={(open) => {\n if (!open) session.closeField();\n }}\n >\n <Dialog.Content size=\"lg\" onCloseAutoFocus={returnFocus}>\n <Dialog.Header>\n <Dialog.Title>{labels.dialogTitle}</Dialog.Title>\n <Dialog.Description>\n {labels.dialogSubtitle}\n {activeLabel ? (\n <>\n {' '}\n <bdi>{activeLabel}</bdi>\n </>\n ) : null}\n </Dialog.Description>\n </Dialog.Header>\n <Dialog.Body>\n {captureError ? (\n <Alert variant=\"error\" className=\"ds:mb-[var(--spacing-md)]\">\n <Alert.Description>{captureError}</Alert.Description>\n </Alert>\n ) : null}\n {/* Keyed per field so a half-drawn signature never leaks into the\n adjacent field when the in-dialog nav jumps. */}\n <CaptureForm\n key={session.activeFieldId ?? 'none'}\n labels={labels}\n id={`signing-capture-${session.activeFieldId ?? 'none'}`}\n disabled={submitting}\n onComplete={(payload) => {\n const id = session.activeFieldId;\n if (!id) return;\n if (onFieldConfirm) {\n onFieldConfirm(id, payload);\n } else {\n session.markSigned(id, payload);\n }\n }}\n />\n </Dialog.Body>\n {labels.previousField &&\n labels.nextField &&\n session.fields.length > 1 ? (\n <Dialog.Footer className=\"ds:justify-between\">\n <Button\n intent=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"ds:min-h-[var(--min-target-size)]\"\n flipIconInRtl\n startIcon={<ChevronLeft aria-hidden=\"true\" />}\n aria-disabled={!previousTarget || submitting}\n data-action=\"previous-field\"\n onClick={() => openAdjacentField(previousTarget)}\n >\n {labels.previousField}\n </Button>\n <Button\n intent=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"ds:min-h-[var(--min-target-size)]\"\n flipIconInRtl\n endIcon={<ChevronRight aria-hidden=\"true\" />}\n aria-disabled={!nextTarget || submitting}\n data-action=\"next-field\"\n onClick={() => openAdjacentField(nextTarget)}\n >\n {labels.nextField}\n </Button>\n </Dialog.Footer>\n ) : null}\n </Dialog.Content>\n </Dialog.Root>\n </div>\n );\n}\n","/* ------------------------------------------------------------------ */\n/* SigningChrome (HTP-6900): the brand bar of the signing site. */\n/* */\n/* The signing site has no app header, so the pattern brings a brand bar */\n/* (kit `Header`, centred wordmark) over a warm shell. That the pattern */\n/* ships this bar at all is to confirm (PHASE5 1.4); the host may leave */\n/* it out with `withChrome={false}` on the screens. Header pin under */\n/* pinch-zoom: to confirm, not built. */\n/* ------------------------------------------------------------------ */\n\nimport type { ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Header,\n HeaderBrand,\n HeaderEnd,\n HeaderStart,\n} from '../../components/header';\nimport { Logo } from '../../components/logo';\n\nexport interface SigningChromeProps {\n /** The page content under the bar. */\n children: ReactNode;\n /**\n * Replaces the wordmark in the bar (the practice's brand, for example).\n * Default: the Alfadocs logo.\n */\n brand?: ReactNode;\n /**\n * Top-right slot of the bar, usually a `SigningProgressChip`. It sits in the\n * flex row beside the wordmark and may wrap, so the two never overlap. With\n * an action present the wordmark starts at the inline start.\n */\n headerActions?: ReactNode;\n /**\n * Accessible name of the bar, and of the default Alfadocs wordmark.\n * Default: \"Alfadocs\". A custom `brand` is rendered as given and carries its\n * own name (visible text, or an image with alt text).\n */\n brandLabel?: string;\n /** Extra classes for the root. */\n className?: string;\n}\n\n/**\n * The brand bar and warm shell around a signing screen. Placement only: it\n * holds no state and no flow logic.\n */\nexport function SigningChrome({\n children,\n brand,\n headerActions,\n brandLabel,\n className,\n}: SigningChromeProps): ReactNode {\n const { t } = useTranslation('ui');\n const label = brandLabel ?? t('signing.chrome.brandLabel');\n return (\n <div\n data-component=\"signing-chrome\"\n className={`ds:flex ds:flex-col ds:min-h-screen ds:bg-[color:var(--app-shell-background)] ds:text-[var(--foreground)]${className ? ` ${className}` : ''}`}\n >\n <Header aria-label={label}>\n <HeaderStart\n className={\n headerActions\n ? 'ds:min-w-0 ds:justify-start'\n : 'ds:flex-1 ds:justify-center'\n }\n >\n {/* A plain mark, not a link: the signing site has no home to go to. */}\n <HeaderBrand asChild>\n {brand !== undefined && brand !== null ? (\n <span>{brand}</span>\n ) : (\n <span role=\"img\" aria-label={label}>\n <Logo\n variant=\"monochrome\"\n tone=\"inherit\"\n decorative\n size=\"md\"\n />\n </span>\n )}\n </HeaderBrand>\n </HeaderStart>\n {headerActions ? (\n <HeaderEnd className=\"ds:min-w-0 ds:flex-1 ds:justify-end ds:text-end\">\n {headerActions}\n </HeaderEnd>\n ) : null}\n </Header>\n <main className=\"ds:flex ds:flex-1 ds:flex-col\">{children}</main>\n </div>\n );\n}\n","/* ------------------------------------------------------------------ */\n/* SigningProgressChip (HTP-6900): \"X of Y signed\". */\n/* Sits in the brand bar. A polite status region announces each count. */\n/* ------------------------------------------------------------------ */\n\nimport type { ReactNode } from 'react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\n\nconst chip = cva(\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] ds:[min-block-size:var(--min-target-size)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-sm)] ds:font-semibold',\n {\n variants: {\n placement: {\n header: 'ds:text-[color:var(--header-foreground)]',\n page: 'ds:text-[color:var(--foreground)]',\n },\n },\n defaultVariants: { placement: 'header' },\n },\n);\n\nexport interface SigningProgressChipProps {\n /** How many fields are signed. */\n signed: number;\n /** How many fields there are. */\n total: number;\n /**\n * The signer's first name, for the named copy after a hand-off\n * (\"Marco: 1 of 2 signed\"). Absent: the plain copy.\n */\n name?: string;\n /** Privacy mode: the name is dropped and the plain copy shows. */\n privacy?: boolean;\n /**\n * Where the chip sits. `header` (default): in the brand bar, header ink.\n * `page`: in the page body (no brand bar), page ink.\n */\n placement?: 'header' | 'page';\n /** Extra classes for the chip. */\n className?: string;\n}\n\n/**\n * The signed-field counter shown in the brand bar. The host passes the\n * counts (from `useSigningSession`); the chip counts nothing.\n */\nexport function SigningProgressChip({\n signed,\n total,\n name,\n privacy = false,\n placement = 'header',\n className,\n}: SigningProgressChipProps): ReactNode {\n const { t } = useTranslation('ui');\n const named = !privacy && name !== undefined && name.trim() !== '';\n return (\n <span\n role=\"status\"\n aria-live=\"polite\"\n data-component=\"signing-progress-chip\"\n data-complete={total > 0 && signed >= total ? 'true' : undefined}\n className={`${chip({ placement })}${className ? ` ${className}` : ''}`}\n >\n {named ? (\n <Trans\n t={t}\n ns=\"ui\"\n i18nKey=\"signing.progressNamed\"\n values={{ name, signed, total }}\n components={{ name: <bdi /> }}\n />\n ) : (\n t('signing.progress', { signed, total })\n )}\n </span>\n );\n}\n","/* ------------------------------------------------------------------ */\n/* SigningFooter (HTP-6900): sticky Previous / Next bar and the Sign */\n/* button that ends the round (D133). */\n/* Emits events only. Skipping signed fields is the session's job, and */\n/* the host does the signing: Sign only calls `onSign`. While */\n/* `completing`, \"Completing your document…\" replaces Previous and Next, */\n/* and an always-mounted polite status announces it. */\n/* ------------------------------------------------------------------ */\n\nimport { useEffect, useId, useState, type ReactNode } from 'react';\nimport { ArrowLeft, ArrowRight } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Alert } from '../../components/alert';\nimport { Button } from '../../components/button';\nimport { Spinner } from '../../components/spinner';\nimport { useVisualViewportPin } from '../../hooks/use-visual-viewport-pin';\n\n// The armed Sign button is the one action the signer must not miss, so it\n// takes the accent (SIGN-03 step 8). `Button` has no accent intent: these\n// token classes override the primary fill. The solid accent label pair\n// passes AA in all four themes (05-accessibility).\nconst ARMED_CLASSES =\n 'ds:!bg-[var(--accent)] ds:!text-[color:var(--accent-foreground)] ds:hover:!bg-[var(--accent-hover)]';\n\nexport interface SigningFooterProps {\n /**\n * How many fields there are. Under 2 the bar shows no Previous and Next,\n * and is hidden unless `onSign` is given or `completing` is set.\n */\n total: number;\n /** Called when Previous is pressed. Absent: no Previous button. */\n onPrevious?: () => void;\n /** Called when Next is pressed. Absent: no Next button. */\n onNext?: () => void;\n /** Disables Previous. */\n previousDisabled?: boolean;\n /** Disables Next. */\n nextDisabled?: boolean;\n /**\n * Called when the armed Sign button is pressed: the last step of the round\n * (D133). The host signs the envelope and sets `completing` in the same\n * handler as the press (the footer also ignores presses while it is\n * `completing`, as a double-press guard). Absent: no\n * Sign button. There is no code step at the end: the check came before the\n * document opened.\n */\n onSign?: () => void;\n /**\n * Arms the Sign button: every field is signed. Unarmed, the button is\n * neutral, `aria-disabled` and ignores presses; armed, it takes the\n * accent. The host decides; the footer has no arming rule of its own.\n */\n signArmed?: boolean;\n /**\n * The host's message about the last Sign press, for example the server\n * refused it. Shown above the buttons as an alert; the Sign button stays\n * armed for another try. The host sets `completing` in the same handler as\n * the press and keeps or clears this as it likes: the kit hides the alert\n * while `completing`, and shows it again if it is still set when\n * `completing` ends. Host text, shown as given, also under privacy.\n */\n signError?: string | null;\n /**\n * The host is completing the document: \"Completing your document…\"\n * replaces Previous and Next, in a polite status region. The Sign button,\n * when there is one, stays in place and shows that it is busy, so focus\n * is not lost.\n */\n completing?: boolean;\n /** Extra classes for the bar. */\n className?: string;\n}\n\n/**\n * The sticky footer of the document step: Previous and Next signature, the\n * Sign button that ends the round, or the completing state. Presentational:\n * it moves nothing and signs nothing itself.\n */\nexport function SigningFooter({\n total,\n onPrevious,\n onNext,\n previousDisabled = false,\n nextDisabled = false,\n onSign,\n signArmed = false,\n signError = null,\n completing = false,\n className,\n}: SigningFooterProps): ReactNode {\n const { t } = useTranslation('ui');\n // Keeps the bar glued to the visual viewport while a signer pinch-zooms.\n const barRef = useVisualViewportPin<HTMLDivElement>({ edge: 'bottom' });\n\n // The status region stays mounted and starts empty, so the text is heard\n // as a change (the kit's LoadStatus pattern). A region inserted already\n // filled is often not announced.\n const [status, setStatus] = useState('');\n const completingText = t('signing.completing');\n useEffect(() => {\n setStatus(completing ? completingText : '');\n }, [completing, completingText]);\n\n const live = (\n <span role=\"status\" data-live=\"signing-footer\" className=\"ds:sr-only\">\n {status}\n </span>\n );\n\n const errorId = useId();\n const hintId = useId();\n // A stale error never sits beside \"Completing your document…\", and a\n // repeat failure re-inserts the alert so it is announced again.\n const showError = Boolean(signError) && !completing;\n\n const withNav = total >= 2;\n if (!completing && !withNav && !onSign) return live;\n\n // The error wins while it shows; unarmed, a hidden hint says why; armed\n // with no error, nothing.\n const describedBy = showError ? errorId : signArmed ? undefined : hintId;\n\n const signButton = onSign ? (\n <>\n {describedBy !== hintId ? null : (\n <span id={hintId} className=\"ds:sr-only\">\n {t('signing.signHint')}\n </span>\n )}\n <Button\n // Unarmed: neutral. Armed: the accent, over the primary fill.\n intent={signArmed ? 'primary' : 'outline'}\n size=\"md\"\n type=\"button\"\n className={`ds:ms-auto ds:min-h-[var(--min-target-size)]${signArmed ? ` ${ARMED_CLASSES}` : ''}`}\n // Unarmed, it stays focusable so a screen reader finds it, and says\n // it is not available yet.\n aria-disabled={signArmed ? undefined : true}\n // The error alert while one shows; else, unarmed, why it is unavailable.\n aria-describedby={describedBy}\n loading={completing}\n data-action=\"sign\"\n data-armed={signArmed ? 'true' : 'false'}\n onClick={() => {\n if (signArmed && !completing) onSign();\n }}\n >\n {t('signing.sign')}\n </Button>\n </>\n ) : null;\n\n const completingRow = (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n {/* The busy Sign button carries its own spinner. */}\n {onSign ? null : (\n <span aria-hidden=\"true\" className=\"ds:inline-flex\">\n <Spinner size=\"sm\" />\n </span>\n )}\n {/* The sr-only status above announces it; this copy is for the eye. */}\n <span aria-hidden=\"true\" className=\"type-body\">\n {completingText}\n </span>\n </div>\n );\n\n // Short visible labels keep the row on one line at phone widths; the\n // aria-labels carry the full names. WCAG 2.5.3 needs the visible text\n // inside the name: each language's long label must contain its short\n // label (signing-footer-labels.test.ts lists the languages that do not\n // yet).\n const nav = withNav ? (\n <>\n {onPrevious ? (\n <Button\n intent=\"ghost\"\n size=\"md\"\n type=\"button\"\n className=\"ds:min-h-[var(--min-target-size)]\"\n flipIconInRtl\n startIcon={<ArrowLeft aria-hidden=\"true\" />}\n aria-label={t('signing.previousField')}\n disabled={previousDisabled}\n data-action=\"previous-field\"\n onClick={onPrevious}\n >\n {t('signing.previousShort')}\n </Button>\n ) : null}\n {onNext ? (\n <Button\n // Once Sign is armed, it is the one strong action in the bar.\n intent={signButton && signArmed ? 'ghost' : 'primary'}\n size=\"md\"\n type=\"button\"\n className=\"ds:min-h-[var(--min-target-size)]\"\n flipIconInRtl\n endIcon={<ArrowRight aria-hidden=\"true\" />}\n aria-label={t('signing.nextField')}\n disabled={nextDisabled}\n data-action=\"next-field\"\n onClick={onNext}\n >\n {t('signing.nextShort')}\n </Button>\n ) : null}\n </>\n ) : null;\n\n return (\n <>\n {live}\n <div\n ref={barRef}\n data-component=\"signing-footer\"\n className={`ds:sticky ds:bottom-0 ds:p-[var(--spacing-md)] ds:bg-[var(--card)] ds:text-[var(--foreground)] ds:border-t ds:border-[color:var(--border)] ds:shadow-[var(--shadow-lg)]${className ? ` ${className}` : ''}`}\n >\n <div className=\"ds:mx-auto ds:flex ds:w-full ds:max-w-[56rem] ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {showError ? (\n <Alert variant=\"error\" data-error=\"sign\" id={errorId}>\n <Alert.Description>{signError}</Alert.Description>\n </Alert>\n ) : null}\n <div className=\"ds:flex ds:w-full ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n {signButton ? (\n <>\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n {completing ? completingRow : nav}\n </div>\n {signButton}\n </>\n ) : completing ? (\n completingRow\n ) : (\n nav\n )}\n </div>\n </div>\n </div>\n </>\n );\n}\n","/* ------------------------------------------------------------------ */\n/* SigningRoster (HTP-6900, D135): the two-signee list. */\n/* */\n/* A fixed primary and secondary slot, never an open-ended list. The */\n/* secondary renders as a pending row when nobody is assigned. Status is */\n/* carried by text (a Badge whose label states it), so colour is never */\n/* the only signal. `verifying` stays a status (owner answer). No */\n/* guardian or child wording: the relationship line is host text. */\n/* Presentational: the host sets every status. */\n/* ------------------------------------------------------------------ */\n\nimport { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Avatar } from '../../components/avatar';\nimport { Badge } from '../../components/badge';\nimport { privacyMask } from '../../components/_shared/privacy-mask';\n\n/** Where a signer is up to. */\nexport type SigningRosterStatus =\n | 'awaiting'\n | 'verifying'\n | 'signing'\n | 'signed';\n\n/** One signer row. */\nexport interface RosterSigner {\n /** Stable id for the row key. */\n id: string;\n /** Display name, as the host gives it (drives the Avatar initials). */\n name: string;\n /** Where this signer is up to. The host sets it; the roster never moves it. */\n status: SigningRosterStatus;\n /** Status text. Default: the translated label for `status`. */\n statusLabel?: string;\n /** Host text under the name, for example \"Patient\" or \"Co-signer\". Shown as given, also under `privacy`: keep personal data out of it. */\n relationship?: string;\n /** Marks the signer holding the device or link right now (\"(you)\"). */\n isCurrent?: boolean;\n /** Replaces the name under `privacy`. Default: the shared mask. Only the roster uses it: the hand-off, awaiting and staff screens always show the shared mask. */\n maskedName?: string;\n}\n\nexport interface SigningRosterProps {\n /** Group label naming the list for assistive technology. Default: \"Signers\". */\n title?: string;\n /** The first signer: always present. */\n primary: RosterSigner;\n /** The second signer, or `null` when nobody is assigned yet (pending row). */\n secondary?: RosterSigner | null;\n /** The \"(you)\" suffix for the current signer. Default: \"(you)\". */\n youLabel?: string;\n /** Row title of the unassigned second slot. Default: \"Second signer\". */\n secondaryPendingLabel?: string;\n /** Meta line of the unassigned second slot. Default: \"Not yet assigned\". */\n secondaryPendingHint?: string;\n /** Privacy mode: names show as the mask and the avatars drop the initials. */\n privacy?: boolean;\n /** Extra classes for the root. */\n className?: string;\n}\n\n// Colour is redundant to the status text: `awaiting` is neutral, in progress\n// is `info`, a finished signature is `success`.\nconst STATUS_VARIANT: Record<\n SigningRosterStatus,\n 'neutral' | 'info' | 'success'\n> = {\n awaiting: 'neutral',\n verifying: 'info',\n signing: 'info',\n signed: 'success',\n};\n\ntype Translate = (key: string) => string;\n\nfunction rosterStatusLabel(signer: RosterSigner, t: Translate): string {\n if (signer.statusLabel !== undefined) return signer.statusLabel;\n switch (signer.status) {\n case 'awaiting':\n return t('signing.roster.status.awaiting');\n case 'verifying':\n return t('signing.roster.status.verifying');\n case 'signing':\n return t('signing.roster.status.signing');\n default:\n return t('signing.roster.status.signed');\n }\n}\n\nfunction SigneeRow({\n signer,\n youLabel,\n privacy,\n}: {\n signer: RosterSigner;\n youLabel: string;\n privacy: boolean;\n}): ReactNode {\n const { t } = useTranslation('ui');\n const shownName = privacy ? privacyMask(signer.maskedName) : signer.name;\n return (\n <li\n // The device holder's row is a state, not only the visible \"(you)\".\n aria-current={signer.isCurrent ? 'step' : undefined}\n data-status={signer.status}\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\"\n >\n <Avatar name={privacy ? undefined : signer.name} size=\"sm\" />\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col\">\n <span className=\"type-label ds:break-words\">\n <bdi>{shownName}</bdi>\n {signer.isCurrent ? (\n <span className=\"ds:ms-[var(--spacing-2xs)] ds:font-normal ds:text-[var(--muted-foreground)]\">\n {youLabel}\n </span>\n ) : null}\n </span>\n {signer.relationship ? (\n <span\n dir=\"auto\"\n className=\"type-meta ds:break-words ds:text-[var(--muted-foreground)]\"\n >\n {signer.relationship}\n </span>\n ) : null}\n </div>\n <Badge variant={STATUS_VARIANT[signer.status]} withDot>\n {rosterStatusLabel(signer, t)}\n </Badge>\n </li>\n );\n}\n\n/**\n * The two-row signer list of a two-signee envelope: who signs and where each\n * one is up to. Names mask under `privacy`.\n */\nexport function SigningRoster({\n title,\n primary,\n secondary,\n youLabel,\n secondaryPendingLabel,\n secondaryPendingHint,\n privacy = false,\n className,\n}: SigningRosterProps): ReactNode {\n const { t } = useTranslation('ui');\n const groupTitle = title ?? t('signing.roster.title');\n const rows = [primary, secondary ?? null].filter(\n (row): row is RosterSigner => row !== null,\n );\n const shown = rows.map((row) => ({\n id: row.id,\n name: privacy ? privacyMask(row.maskedName) : row.name,\n status: row.status,\n label: rosterStatusLabel(row, t),\n }));\n // Mounted from the start so a screen reader hears a later change. The first\n // render announces nothing: only a status that moves does.\n const seen = useRef(new Map(shown.map((row) => [row.id, row.status])));\n // Only the row id is kept: the name is read at render, so a switch to\n // privacy never leaves the old name in the live region.\n const [announcedId, setAnnouncedId] = useState<string | null>(null);\n const announcedRow = shown.find((row) => row.id === announcedId);\n const signature = shown.map((row) => `${row.id}:${row.status}`).join('|');\n useEffect(() => {\n let change: string | null = null;\n for (const row of shown) {\n const before = seen.current.get(row.id);\n if (before !== undefined && before !== row.status) {\n change = row.id;\n }\n seen.current.set(row.id, row.status);\n }\n if (change !== null) setAnnouncedId(change);\n // `shown` derives from `signature` and the labels; the signature is the trigger.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [signature]);\n const you = youLabel ?? t('signing.roster.you');\n return (\n // A labelled section exposes the roster as a region without adding a\n // heading that would skip the page's level order.\n <section\n aria-label={groupTitle}\n data-component=\"signing-roster\"\n data-privacy={privacy ? 'masked' : undefined}\n className={`ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]${className ? ` ${className}` : ''}`}\n >\n {/* The visible title is decorative: the section's aria-label names it. */}\n <p\n aria-hidden=\"true\"\n className=\"type-eyebrow ds:m-0 ds:text-[var(--muted-foreground)]\"\n >\n {groupTitle}\n </p>\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {announcedRow ? (\n <>\n <bdi>{announcedRow.name}</bdi>\n {': '}\n {announcedRow.label}\n </>\n ) : null}\n </span>\n {/* An ordered list with an explicit role: WebKit strips list semantics\n from lists with list-style none. */}\n {/* eslint-disable-next-line jsx-a11y/no-redundant-roles -- role=\"list\" is not redundant here */}\n <ol\n role=\"list\"\n className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-0\"\n >\n <SigneeRow signer={primary} youLabel={you} privacy={privacy} />\n {secondary ? (\n <SigneeRow signer={secondary} youLabel={you} privacy={privacy} />\n ) : (\n <li\n data-status=\"pending\"\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\"\n >\n <Avatar size=\"sm\" />\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col\">\n <span className=\"type-label ds:truncate ds:text-[var(--muted-foreground)]\">\n {secondaryPendingLabel ?? t('signing.roster.pendingTitle')}\n </span>\n <span className=\"type-meta ds:truncate ds:text-[var(--muted-foreground)]\">\n {secondaryPendingHint ?? t('signing.roster.pendingHint')}\n </span>\n </div>\n </li>\n )}\n </ol>\n </section>\n );\n}\n","/* ------------------------------------------------------------------ */\n/* SigningDocumentScreen (HTP-6900): the document step. */\n/* */\n/* Instruction alert, heading, roster, progress, the document surface */\n/* (`MultiFieldSigner`) and the footer, which ends the round with a Sign */\n/* button (D133). There is no Finish button, no identity gate, no tick */\n/* box, no surname check and no completion code: the one check comes */\n/* before the document opens, and it is the app's (HTP-6902). Once every */\n/* field is signed the Sign button arms; pressing it calls `onSign`. */\n/* Signing, sending and completing are the host's. */\n/* ------------------------------------------------------------------ */\n\nimport { useEffect, useRef, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Alert } from '../../components/alert';\nimport type { SignatureConfirmPayload } from '../../components/signature-capture';\nimport type { UseSigningSessionReturn } from '../../hooks';\nimport {\n MultiFieldSigner,\n type SigningStepDocument,\n type SigningStepField,\n type SigningStepLabels,\n} from './multi-field-signer';\nimport { SigningChrome } from './signing-chrome';\nimport { SigningFooter } from './signing-footer';\nimport { SigningProgressChip } from './signing-progress-chip';\nimport { SigningRoster, type SigningRosterProps } from './signing-roster';\n\nexport interface SigningDocumentScreenProps {\n /** The signing session for this signee, from `useSigningSession`. Required. */\n session: UseSigningSessionReturn<SigningStepField, SignatureConfirmPayload>;\n /** Single-document PDF source. Provide EITHER `src` OR `documents`. */\n src?: string | ArrayBuffer | Uint8Array;\n /** Multi-document envelope. */\n documents?: SigningStepDocument[];\n /** Headline of the step. Host text (the document's name). Also names the PDF region. Shown as given, also under `privacy`: keep personal data out of it there. */\n title?: string;\n /** Line under the headline, for example the practice or the date. Host content. Shown as given, also under `privacy`. */\n meta?: ReactNode;\n /** Level of the headline. Default 1. */\n headingLevel?: 1 | 2;\n /** Instruction shown in an alert above the document. Plain text only, never HTML. Shown as given, also under `privacy`. */\n instruction?: string;\n /** The two-row roster, when the envelope has two signees. Its `privacy` follows this screen's. */\n roster?: Omit<SigningRosterProps, 'privacy'>;\n /** Signers complete so far, for \"N of M signers complete\". Absent: no line. */\n envelopeProgress?: { done: number; total: number };\n /** First name of the signee, for the named progress chip after a hand-off. */\n progressName?: string;\n /** The host is completing the document: the footer shows \"Completing your document…\". */\n completing?: boolean;\n /**\n * Called when the signer presses Sign, the last step of the round (D133).\n * The button arms once every field of `session` is signed\n * (`session.isComplete`); unarmed, it ignores presses. The host signs the\n * envelope and sets `completing` in the same handler as the press (a press\n * while `completing` is ignored). No code is asked at the end: the check\n * came before the document opened. Absent: no Sign button.\n */\n onSign?: () => void;\n /**\n * The host's message about the last Sign press, for example the server\n * refused it. Shown above the Sign button, which stays armed for another\n * try. The host sets `completing` in the same handler as the press and\n * keeps or clears this as it likes: the kit hides it while `completing`.\n * Host text, shown as given, also under `privacy`.\n */\n signError?: string | null;\n /** Called when the signer confirms a signature. See `MultiFieldSigner.onFieldConfirm`. */\n onFieldConfirm?: (fieldId: string, payload: SignatureConfirmPayload) => void;\n /** The field the host is sending now. */\n submittingFieldId?: string | null;\n /** The host's message about the last confirm; shown in the capture dialog. */\n captureError?: string | null;\n /** Extra dialogs, for example a `SigningMessageDialog`. The host owns them. */\n dialogs?: ReactNode;\n /** Render every field glyph-only. Labels stay the accessible names. */\n hideFieldLabels?: boolean;\n /** Wrap the screen in the signing brand bar. Default true. */\n withChrome?: boolean;\n /** Replaces the wordmark in the brand bar. */\n brand?: ReactNode;\n /** Accessible name of the brand bar. See `SigningChrome.brandLabel`. */\n brandLabel?: string;\n /**\n * Move focus to the heading on arrival. Turn it on whenever the round\n * replaces another view in place (after a code gate, a list or a hand-off),\n * check-in included. Needs `title`. Default false.\n */\n focusOnMount?: boolean;\n /**\n * Privacy mode for the roster and the progress chip. It does not cover\n * the PDF, the signature images, the field labels or the host text\n * (`title`, `meta`, `instruction`, `signError`, `dialogs`): keep personal\n * data out of those there (to confirm).\n */\n privacy?: boolean;\n /** Extra classes for the root. */\n className?: string;\n}\n\n/**\n * The document step of a signing round. Session-driven and callback-driven:\n * it shows the document, the progress and the Sign button, and tells the\n * host what happened.\n */\nexport function SigningDocumentScreen({\n session,\n src,\n documents,\n title,\n meta,\n headingLevel = 1,\n instruction,\n roster,\n envelopeProgress,\n progressName,\n completing = false,\n onSign,\n signError = null,\n onFieldConfirm,\n submittingFieldId,\n captureError,\n dialogs,\n hideFieldLabels,\n withChrome = true,\n brand,\n brandLabel,\n focusOnMount = false,\n privacy = false,\n className,\n}: SigningDocumentScreenProps): ReactNode {\n const { t } = useTranslation('ui');\n const headingRef = useRef<HTMLHeadingElement>(null);\n useEffect(() => {\n if (focusOnMount) headingRef.current?.focus({ preventScroll: true });\n }, [focusOnMount]);\n const Heading = headingLevel === 2 ? 'h2' : 'h1';\n\n const labels: SigningStepLabels = {\n dialogTitle: t('signing.capture.title'),\n dialogSubtitle: t('signing.capture.subtitle'),\n apply: t('signing.complete'),\n previousField: t('signing.previousField'),\n nextField: t('signing.nextField'),\n documentHeading:\n documents !== undefined\n ? (current, total) => t('signing.documentHeading', { current, total })\n : undefined,\n };\n\n const chip = (\n <SigningProgressChip\n signed={session.signedCount}\n total={session.total}\n name={progressName}\n privacy={privacy}\n placement={withChrome ? 'header' : 'page'}\n />\n );\n\n const body = (\n // The chrome owns the page's `main`; embedded, the host's shell does.\n <div\n data-component=\"signing-document-screen\"\n data-privacy={privacy ? 'masked' : undefined}\n className={`ds:flex ds:flex-1 ds:justify-center ds:p-[var(--spacing-lg)]${className ? ` ${className}` : ''}`}\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:min-w-0 ds:[inline-size:100%] ds:max-w-[56rem]\">\n {/* Static text that is there on arrival: not announced. Line breaks kept. */}\n {instruction ? (\n <Alert variant=\"info\" announce=\"off\">\n <Alert.Description dir=\"auto\" className=\"ds:whitespace-pre-line\">\n {instruction}\n </Alert.Description>\n </Alert>\n ) : null}\n\n {title ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <Heading\n ref={headingRef}\n tabIndex={-1}\n dir=\"auto\"\n className=\"type-title-page ds:m-0 ds:outline-none\"\n >\n {title}\n </Heading>\n {meta ? (\n <div\n dir=\"auto\"\n className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\"\n >\n {meta}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {roster ? <SigningRoster {...roster} privacy={privacy} /> : null}\n\n {/* Without the brand bar there is no place for the chip: it sits here. */}\n {withChrome ? null : chip}\n\n {envelopeProgress ? (\n <p\n role=\"status\"\n aria-live=\"polite\"\n className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\"\n >\n {t('signing.envelopeProgress', {\n done: envelopeProgress.done,\n total: envelopeProgress.total,\n })}\n </p>\n ) : null}\n\n <MultiFieldSigner\n src={src}\n documents={documents}\n session={session}\n labels={labels}\n ariaLabel={title}\n hideFieldLabels={hideFieldLabels}\n onFieldConfirm={onFieldConfirm}\n submittingFieldId={submittingFieldId}\n captureError={captureError}\n />\n </div>\n </div>\n );\n\n const footer = (\n <SigningFooter\n total={session.total}\n completing={completing}\n onPrevious={session.goToPreviousField}\n onNext={session.goToNextField}\n onSign={onSign}\n signArmed={session.isComplete}\n signError={signError}\n />\n );\n\n if (!withChrome) {\n return (\n <>\n {body}\n {footer}\n {dialogs}\n </>\n );\n }\n return (\n <SigningChrome brand={brand} brandLabel={brandLabel} headerActions={chip}>\n {body}\n {footer}\n {dialogs}\n </SigningChrome>\n );\n}\n","/* ------------------------------------------------------------------ */\n/* SigningMessageDialog (HTP-6900): a message before or after signing. */\n/* Host text only (plain text, never HTML). The host decides when it */\n/* opens and what dismissing it means. */\n/* ------------------------------------------------------------------ */\n\nimport type { ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '../../components/button';\nimport { Dialog } from '../../components/dialog';\n\nexport interface SigningMessageDialogProps {\n /** Whether the dialog is open. The host owns it. */\n open: boolean;\n /** The message title. Host text. */\n title: string;\n /** The message body. Host text, shown as plain text. */\n body: string;\n /** Called when the signer dismisses the message (button, Escape or scrim). */\n onDismiss: () => void;\n /** Text of the dismiss button. Default: \"Close\". */\n dismissLabel?: string;\n /**\n * Called when focus returns after the dialog closes. There is no trigger:\n * the host calls `event.preventDefault()` and focuses the control that\n * opened it.\n */\n onCloseAutoFocus?: (event: Event) => void;\n /** Instance id for agent addressing. Default `signing-message`. */\n id?: string;\n /** Extra classes for the dialog surface. */\n className?: string;\n}\n\n/**\n * The practice's message shown before or after signing, in a dialog with one\n * way out.\n */\nexport function SigningMessageDialog({\n open,\n title,\n body,\n onDismiss,\n dismissLabel,\n onCloseAutoFocus,\n id = 'signing-message',\n className,\n}: SigningMessageDialogProps): ReactNode {\n const { t } = useTranslation('ui');\n return (\n <Dialog.Root\n id={id}\n open={open}\n onOpenChange={(next) => {\n if (!next) onDismiss();\n }}\n >\n <Dialog.Content\n size=\"sm\"\n hideCloseButton\n onCloseAutoFocus={onCloseAutoFocus}\n className={className}\n data-component=\"signing-message-dialog\"\n >\n <Dialog.Header>\n <Dialog.Title dir=\"auto\">{title}</Dialog.Title>\n <Dialog.Description\n dir=\"auto\"\n className=\"ds:whitespace-pre-line ds:break-words\"\n >\n {body}\n </Dialog.Description>\n </Dialog.Header>\n <Dialog.Footer>\n <Button\n intent=\"primary\"\n type=\"button\"\n className=\"ds:min-h-[var(--min-target-size)]\"\n data-action=\"dismiss-message\"\n onClick={onDismiss}\n >\n {dismissLabel ?? t('signing.message.close')}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n","/* ------------------------------------------------------------------ */\n/* SigningStaffIdConfirmation (HTP-6900, D134). */\n/* */\n/* The practice-device dialog: staff confirm that they have seen the */\n/* patient's ID. No tick box. It names the acting staff member (read */\n/* only) and says what is recorded. The owner answer is that HTP-6900 */\n/* wins over SIGN-17: the kit builds it. The form and the wording are */\n/* still to confirm (`has-mobile` is not built: PHASE5 section 3). The */\n/* host records the confirmation; the dialog sends nothing. */\n/* ------------------------------------------------------------------ */\n\nimport type { ReactNode } from 'react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { Alert } from '../../components/alert';\nimport { Button } from '../../components/button';\nimport { Dialog } from '../../components/dialog';\nimport { privacyMask } from '../../components/_shared/privacy-mask';\n\n/** What the host reports about the confirmation. */\nexport type SigningStaffIdError = 'failed';\n\nexport interface SigningStaffIdConfirmationProps {\n /** Whether the dialog is open. The host owns it. */\n open: boolean;\n /** Called when the dialog asks to open or close (Cancel, Escape, the scrim). */\n onOpenChange: (open: boolean) => void;\n /**\n * The logged-in staff member who confirms (the platform's operator, SIGN-17:97).\n * Read only: it is shown, never edited. Required.\n */\n staffName: string;\n /** The patient whose ID was seen. Absent: the text does not name them. Masks under `privacy`. */\n patientName?: string;\n /** The document being signed, shown under the text. Host text, shown as given also under `privacy`: keep personal data out of it there. */\n documentTitle?: string;\n /** Called when \"I have seen the ID\" is pressed. The host records it. */\n onConfirm: () => void;\n /** Called whenever the dialog is left without confirming. Runs after `onOpenChange(false)`. */\n onCancel?: () => void;\n /** The host is recording the confirmation: the button shows a spinner and ignores presses. */\n submitting?: boolean;\n /**\n * What went wrong, if anything. `failed`: the host could not record it.\n * The dialog stays open and the confirm button stays available.\n */\n error?: SigningStaffIdError | null;\n /** Host text that replaces the default message for `error`. */\n errorText?: string;\n /** Privacy mode: the patient's name shows as the mask. The staff name is the user's own and stays. */\n privacy?: boolean;\n /**\n * Called when focus returns after the dialog closes (Cancel, Escape, the\n * scrim). The dialog has no trigger of its own, so the host moves focus to\n * the control that opened it: call `event.preventDefault()` and focus it.\n */\n onCloseAutoFocus?: (event: Event) => void;\n /** Instance id for agent addressing. Default `signing-staff-id`. */\n id?: string;\n /** Extra classes for the dialog surface. */\n className?: string;\n}\n\n/**\n * The practice-device ID confirmation: staff say they have seen the patient's\n * ID, against their own name. A button, not a tick box.\n */\nexport function SigningStaffIdConfirmation({\n open,\n onOpenChange,\n staffName,\n patientName,\n documentTitle,\n onConfirm,\n onCancel,\n submitting = false,\n error = null,\n errorText,\n privacy = false,\n onCloseAutoFocus,\n id = 'signing-staff-id',\n className,\n}: SigningStaffIdConfirmationProps): ReactNode {\n const { t } = useTranslation('ui');\n const hasPatient = patientName !== undefined && patientName.trim() !== '';\n const shownPatient = privacy ? privacyMask() : patientName;\n const message =\n error === null ? null : (errorText ?? t('signing.staffId.errorFailed'));\n\n return (\n <Dialog.Root\n id={id}\n open={open}\n onOpenChange={(next) => {\n onOpenChange(next);\n if (!next) onCancel?.();\n }}\n >\n <Dialog.Content\n size=\"sm\"\n hideCloseButton\n onCloseAutoFocus={onCloseAutoFocus}\n className={className}\n data-component=\"signing-staff-id-confirmation\"\n data-privacy={privacy ? 'masked' : undefined}\n >\n <Dialog.Header>\n <Dialog.Title>{t('signing.staffId.title')}</Dialog.Title>\n <Dialog.Description className=\"ds:break-words\">\n <Trans\n t={t}\n ns=\"ui\"\n i18nKey={\n hasPatient\n ? 'signing.staffId.body'\n : 'signing.staffId.bodyNoPatient'\n }\n values={{ staff: staffName, patient: shownPatient }}\n components={{ staff: <bdi />, patient: <bdi /> }}\n />\n </Dialog.Description>\n </Dialog.Header>\n <Dialog.Body>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {documentTitle ? (\n <p\n dir=\"auto\"\n className=\"type-body ds:m-0 ds:font-medium ds:break-words\"\n >\n {documentTitle}\n </p>\n ) : null}\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('signing.staffId.record')}\n </p>\n {message ? (\n <Alert variant=\"error\" data-error={error ?? undefined}>\n <Alert.Description>{message}</Alert.Description>\n </Alert>\n ) : null}\n </div>\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Close asChild>\n <Button\n intent=\"outline\"\n type=\"button\"\n className=\"ds:min-h-[var(--min-target-size)]\"\n data-action=\"cancel\"\n >\n {t('common.cancel')}\n </Button>\n </Dialog.Close>\n <Button\n intent=\"primary\"\n type=\"button\"\n className=\"ds:min-h-[var(--min-target-size)]\"\n loading={submitting}\n data-action=\"confirm-staff-id\"\n onClick={onConfirm}\n >\n {t('signing.staffId.confirm')}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n","/* ------------------------------------------------------------------ */\n/* SigningHandoffScreen (HTP-6900, HTP-6918): same-device hand-off. */\n/* */\n/* The first signee is done; the device passes to the second. The screen */\n/* shows no document and no signature image, and makes no claim about */\n/* how the second signee is checked (the one check is the app's: */\n/* HTP-6902). While the host prepares the second round, the roster shows */\n/* the second signee as \"Verifying\" and Continue shows a spinner. Not */\n/* built: \"Continue on another device\" (held, to confirm). */\n/* ------------------------------------------------------------------ */\n\nimport { useEffect, useRef, type ReactNode } from 'react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { Button } from '../../components/button';\nimport { Card } from '../../components/card';\nimport { privacyMask } from '../../components/_shared/privacy-mask';\nimport { SigningChrome } from './signing-chrome';\nimport { SigningRoster, type SigningRosterProps } from './signing-roster';\n\nexport interface SigningHandoffScreenProps {\n /** The signee who has just finished. Host data. */\n signerName: string;\n /** The signee who takes the device next. Host data. */\n nextName: string;\n /** The two-row roster to show under the text. Absent: no roster. Its `privacy` follows this screen's. */\n roster?: Omit<SigningRosterProps, 'privacy'>;\n /** Called when \"Continue as {next}\" is pressed. The host starts the second round. */\n onContinue: () => void;\n /**\n * Replaces the button text. Default: \"Continue as {next}\". Ignored under\n * `privacy`, where the masked default shows (a host label may carry the name).\n */\n continueLabel?: string;\n /** The host is preparing the second round: Continue shows a spinner and ignores presses. */\n submitting?: boolean;\n /** Move focus to the heading on arrival. Default true: the screen replaces the document without a page change. */\n focusOnMount?: boolean;\n /** Wrap the screen in the signing brand bar. Default true. */\n withChrome?: boolean;\n /** Replaces the wordmark in the brand bar. */\n brand?: ReactNode;\n /** Accessible name of the brand bar. See `SigningChrome.brandLabel`. */\n brandLabel?: string;\n /** Privacy mode: both names show as the mask. */\n privacy?: boolean;\n /** Extra classes for the root. */\n className?: string;\n}\n\n/**\n * \"Pass this device to {next}\": the same-device hand-off between two signees.\n * It holds no document and no signature image.\n */\nexport function SigningHandoffScreen({\n signerName,\n nextName,\n roster,\n onContinue,\n continueLabel,\n submitting = false,\n focusOnMount = true,\n withChrome = true,\n brand,\n brandLabel,\n privacy = false,\n className,\n}: SigningHandoffScreenProps): ReactNode {\n const { t } = useTranslation('ui');\n const headingRef = useRef<HTMLHeadingElement>(null);\n useEffect(() => {\n if (focusOnMount) headingRef.current?.focus({ preventScroll: true });\n }, [focusOnMount]);\n\n const name = privacy ? privacyMask() : signerName;\n const next = privacy ? privacyMask() : nextName;\n\n const screen = (\n <div\n data-component=\"signing-handoff-screen\"\n data-privacy={privacy ? 'masked' : undefined}\n className={`ds:flex ds:flex-1 ds:flex-col ds:items-center ds:overflow-y-auto ds:p-[var(--spacing-lg)]${className ? ` ${className}` : ''}`}\n >\n <Card\n variant=\"elevated\"\n className=\"ds:my-auto ds:min-w-0 ds:[inline-size:100%] ds:max-w-[28rem]\"\n >\n <Card.Header>\n <h1\n ref={headingRef}\n tabIndex={-1}\n className=\"type-title-card ds:m-0 ds:outline-none\"\n >\n <Trans\n t={t}\n ns=\"ui\"\n i18nKey=\"signing.handoff.title\"\n values={{ name }}\n components={{ name: <bdi /> }}\n />\n </h1>\n </Card.Header>\n <Card.Body>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <p className=\"type-body ds:m-0 ds:text-[var(--muted-foreground)]\">\n <Trans\n t={t}\n ns=\"ui\"\n i18nKey=\"signing.handoff.body\"\n values={{ next }}\n components={{ next: <bdi /> }}\n />\n </p>\n {/* Mounted from the start so a screen reader hears the change. */}\n <span role=\"status\" className=\"ds:sr-only\">\n {submitting ? t('signing.roster.status.verifying') : ''}\n </span>\n {roster ? <SigningRoster {...roster} privacy={privacy} /> : null}\n <Button\n intent=\"primary\"\n size=\"lg\"\n type=\"button\"\n loading={submitting}\n data-action=\"continue\"\n onClick={onContinue}\n >\n {!privacy && continueLabel !== undefined ? (\n continueLabel\n ) : (\n <Trans\n t={t}\n ns=\"ui\"\n i18nKey=\"signing.handoff.continue\"\n values={{ next }}\n components={{ next: <bdi /> }}\n />\n )}\n </Button>\n </div>\n </Card.Body>\n </Card>\n </div>\n );\n return withChrome ? (\n <SigningChrome brand={brand} brandLabel={brandLabel}>\n {screen}\n </SigningChrome>\n ) : (\n screen\n );\n}\n","/* ------------------------------------------------------------------ */\n/* SigningAwaitingScreen (HTP-6900, HTP-6918): the first signee's end */\n/* screen when the second signs on their own link, or nobody is assigned */\n/* yet. The kit's `FinishedTerminal` with no button and no countdown. */\n/* There is no stalled or timed-out state: no source names one (SIGN-N32, */\n/* to confirm), so the screen says the same thing however long the */\n/* second signee takes. */\n/* ------------------------------------------------------------------ */\n\nimport type { ReactNode } from 'react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { FinishedTerminal } from '../../components/finished-terminal';\nimport { privacyMask } from '../../components/_shared/privacy-mask';\nimport { SigningChrome } from './signing-chrome';\n\nexport interface SigningAwaitingScreenProps {\n /** The signee who has just finished. Host data. */\n signerName: string;\n /** The signee who signs next. Required unless `secondaryPending`. Host data. */\n nextName?: string;\n /** Nobody is assigned as the second signee yet: the \"not assigned\" copy shows and `nextName` is ignored. */\n secondaryPending?: boolean;\n /** Wrap the screen in the signing brand bar. Default true. */\n withChrome?: boolean;\n /** Replaces the wordmark in the brand bar. */\n brand?: ReactNode;\n /** Accessible name of the brand bar. See `SigningChrome.brandLabel`. */\n brandLabel?: string;\n /** Privacy mode: both names show as the mask. */\n privacy?: boolean;\n /** Extra classes for the root. */\n className?: string;\n}\n\n/**\n * \"Your part is done\": the first signee is finished and has nothing more to\n * do. No button and no countdown.\n */\nexport function SigningAwaitingScreen({\n signerName,\n nextName,\n secondaryPending = false,\n withChrome = true,\n brand,\n brandLabel,\n privacy = false,\n className,\n}: SigningAwaitingScreenProps): ReactNode {\n const { t } = useTranslation('ui');\n const name = privacy ? privacyMask() : signerName;\n // Decide on the raw value: under privacy the mask is never an empty string.\n const pending = secondaryPending || !nextName || nextName.trim() === '';\n const next = privacy ? privacyMask() : (nextName ?? '');\n const screen = (\n <div\n data-component=\"signing-awaiting-screen\"\n data-privacy={privacy ? 'masked' : undefined}\n className={`ds:flex ds:flex-1 ds:flex-col${className ? ` ${className}` : ''}`}\n >\n <FinishedTerminal\n title={t('signing.awaiting.title')}\n body={\n <Trans\n t={t}\n ns=\"ui\"\n i18nKey={\n pending ? 'signing.awaiting.pendingBody' : 'signing.awaiting.body'\n }\n values={{ name, next }}\n components={{ name: <bdi />, next: <bdi /> }}\n />\n }\n autoCloseSeconds={0}\n />\n </div>\n );\n return withChrome ? (\n <SigningChrome brand={brand} brandLabel={brandLabel}>\n {screen}\n </SigningChrome>\n ) : (\n screen\n );\n}\n","/* ------------------------------------------------------------------ */\n/* SigningFinishedScreen (HTP-6900): \"Document signed\" / \"All signatures */\n/* complete\". One button, no countdown, no redirect of its own: the */\n/* kit's button-only `FinishedTerminal`. The label and the target of the */\n/* button are the host's (SIGN-N04); a redirect carrying the envelope */\n/* key is the host's too (SIGN-02:106). */\n/* ------------------------------------------------------------------ */\n\nimport type { ReactNode } from 'react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport {\n FinishedTerminal,\n type FinishedTerminalAction,\n} from '../../components/finished-terminal';\nimport { SigningChrome } from './signing-chrome';\n\n/** Which finished screen to show. */\nexport type SigningFinishedReason = 'signed' | 'all-signed';\n\nexport interface SigningFinishedScreenProps {\n /** `signed`: one signer is done. `all-signed`: every signature is recorded. Default `signed`. */\n reason?: SigningFinishedReason;\n /** The practice's name, for \"{practice} has your signed document.\" Host data. Absent: \"Your practice\". */\n practiceName?: string;\n /** Replaces the default headline. Host text. */\n title?: string;\n /** Replaces the default sentence. Host text. */\n body?: string;\n /**\n * The one button: host label and target. Required, so the screen never\n * ends in a dead end. With neither `onClick` nor a usable `href`, no\n * button shows (the `FinishedTerminal` rule). Label default: \"Continue\".\n */\n action: Partial<FinishedTerminalAction>;\n /** Wrap the screen in the signing brand bar. Default true. */\n withChrome?: boolean;\n /** Replaces the wordmark in the brand bar. */\n brand?: ReactNode;\n /** Accessible name of the brand bar. See `SigningChrome.brandLabel`. */\n brandLabel?: string;\n /** Extra classes for the root. */\n className?: string;\n}\n\n/**\n * The end of a signing round. One button and no countdown: nobody is moved\n * on against their will.\n */\nexport function SigningFinishedScreen({\n reason = 'signed',\n practiceName,\n title,\n body,\n action,\n withChrome = true,\n brand,\n brandLabel,\n className,\n}: SigningFinishedScreenProps): ReactNode {\n const { t } = useTranslation('ui');\n const hasPractice = practiceName !== undefined && practiceName.trim() !== '';\n const defaultTitle =\n reason === 'all-signed'\n ? t('signing.finished.allSigned.title')\n : t('signing.finished.signed.title');\n const defaultBody =\n reason === 'all-signed' ? (\n t('signing.finished.allSigned.body')\n ) : hasPractice ? (\n <Trans\n t={t}\n ns=\"ui\"\n i18nKey=\"signing.finished.signed.body\"\n values={{ practice: practiceName }}\n components={{ practice: <bdi /> }}\n />\n ) : (\n t('signing.finished.signed.bodyNoPractice')\n );\n const hasButton = action.onClick !== undefined || action.href !== undefined;\n\n const screen = (\n <div\n data-component=\"signing-finished-screen\"\n data-reason={reason}\n className={`ds:flex ds:flex-1 ds:flex-col${className ? ` ${className}` : ''}`}\n >\n <FinishedTerminal\n title={title ?? defaultTitle}\n body={body ?? defaultBody}\n action={\n hasButton\n ? {\n ...action,\n label: action.label ?? t('signing.finished.action'),\n }\n : undefined\n }\n autoCloseSeconds={hasButton ? undefined : 0}\n />\n </div>\n );\n return withChrome ? (\n <SigningChrome brand={brand} brandLabel={brandLabel}>\n {screen}\n </SigningChrome>\n ) : (\n screen\n );\n}\n","/* ------------------------------------------------------------------ */\n/* SigningEndScreen (HTP-6900): expired, already completed, cancelled. */\n/* Nothing to press and no countdown: the link is over, or the document */\n/* is done. Which one applies is the host's call (\"already completed\" */\n/* wins when both are set: SIGN-02:100, host side). */\n/* ------------------------------------------------------------------ */\n\nimport type { ReactNode } from 'react';\nimport { Ban, Clock } from 'lucide-react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { FinishedTerminal } from '../../components/finished-terminal';\nimport { SigningChrome } from './signing-chrome';\n\n/** Why the signing link ends here. */\nexport type SigningEndReason = 'expired' | 'already-completed' | 'cancelled';\n\nexport interface SigningEndScreenProps {\n /** Why the link ends here. Required. */\n reason: SigningEndReason;\n /** The practice's name, for \"Contact {practice}…\". Host data. Absent: \"the practice\". */\n practiceName?: string;\n /** Replaces the default headline. Host text. */\n title?: string;\n /** Replaces the default sentence. Host text. */\n body?: string;\n /** Wrap the screen in the signing brand bar. Default true. */\n withChrome?: boolean;\n /** Replaces the wordmark in the brand bar. */\n brand?: ReactNode;\n /** Accessible name of the brand bar. See `SigningChrome.brandLabel`. */\n brandLabel?: string;\n /** Extra classes for the root. */\n className?: string;\n}\n\n/**\n * The end screen of a signing link that cannot be used: expired, already\n * signed, or cancelled by the practice. No button.\n */\nexport function SigningEndScreen({\n reason,\n practiceName,\n title,\n body,\n withChrome = true,\n brand,\n brandLabel,\n className,\n}: SigningEndScreenProps): ReactNode {\n const { t } = useTranslation('ui');\n const hasPractice = practiceName !== undefined && practiceName.trim() !== '';\n\n const practiceBody = (key: string): ReactNode => (\n <Trans\n t={t}\n ns=\"ui\"\n i18nKey={key}\n values={{ practice: practiceName }}\n components={{ practice: <bdi /> }}\n />\n );\n\n let defaultTitle: string;\n let defaultBody: ReactNode;\n if (reason === 'expired') {\n defaultTitle = t('signing.end.expired.title');\n defaultBody = hasPractice\n ? practiceBody('signing.end.expired.body')\n : t('signing.end.expired.bodyNoPractice');\n } else if (reason === 'already-completed') {\n defaultTitle = t('signing.end.alreadyCompleted.title');\n defaultBody = hasPractice\n ? practiceBody('signing.end.alreadyCompleted.body')\n : t('signing.end.alreadyCompleted.bodyNoPractice');\n } else {\n defaultTitle = t('signing.end.cancelled.title');\n defaultBody = hasPractice\n ? practiceBody('signing.end.cancelled.body')\n : t('signing.end.cancelled.bodyNoPractice');\n }\n\n const screen = (\n <div\n data-component=\"signing-end-screen\"\n data-reason={reason}\n className={`ds:flex ds:flex-1 ds:flex-col${className ? ` ${className}` : ''}`}\n >\n <FinishedTerminal\n title={title ?? defaultTitle}\n body={body ?? defaultBody}\n // Already completed is a success; the other two are not.\n icon={\n reason === 'expired' ? (\n <Clock />\n ) : reason === 'cancelled' ? (\n <Ban />\n ) : undefined\n }\n autoCloseSeconds={0}\n />\n </div>\n );\n return withChrome ? (\n <SigningChrome brand={brand} brandLabel={brandLabel}>\n {screen}\n </SigningChrome>\n ) : (\n screen\n );\n}\n"],"names":["CaptureForm","labels","disabled","id","onComplete","jsx","SignatureCapture","payload","MultiFieldSigner","src","documents","session","docIndex","ariaLabel","initialZoom","hideFieldLabels","onFieldConfirm","submittingFieldId","captureError","onAllSigned","className","docs","isMulti","visible","f","pdfRefs","useRef","fieldRefs","fieldsRef","navInitialRender","openerFieldId","useEffect","returnFocus","event","opener","next","_a","target","wasComplete","onAllSignedRef","field","tries","raf","focusWhenReady","el","submitting","activeIndex","findAdjacentField","dir","i","previousTarget","nextTarget","activeLabel","openAdjacentField","jsxs","doc","docPosition","PDFViewer","pageNumber","SignatureField","Dialog","open","Fragment","Alert","Button","ChevronLeft","ChevronRight","SigningChrome","children","brand","headerActions","brandLabel","t","useTranslation","label","Header","HeaderStart","HeaderBrand","Logo","HeaderEnd","chip","cva","SigningProgressChip","signed","total","name","privacy","placement","named","Trans","ARMED_CLASSES","SigningFooter","onPrevious","onNext","previousDisabled","nextDisabled","onSign","signArmed","signError","completing","barRef","useVisualViewportPin","status","setStatus","useState","completingText","live","errorId","useId","hintId","showError","withNav","describedBy","signButton","completingRow","Spinner","nav","ArrowLeft","ArrowRight","STATUS_VARIANT","rosterStatusLabel","signer","SigneeRow","youLabel","shownName","privacyMask","Avatar","Badge","SigningRoster","title","primary","secondary","secondaryPendingLabel","secondaryPendingHint","groupTitle","shown","row","seen","announcedId","setAnnouncedId","announcedRow","signature","change","before","you","SigningDocumentScreen","meta","headingLevel","instruction","roster","envelopeProgress","progressName","dialogs","withChrome","focusOnMount","headingRef","Heading","current","body","footer","SigningMessageDialog","onDismiss","dismissLabel","onCloseAutoFocus","SigningStaffIdConfirmation","onOpenChange","staffName","patientName","documentTitle","onConfirm","onCancel","error","errorText","hasPatient","shownPatient","message","SigningHandoffScreen","signerName","nextName","onContinue","continueLabel","screen","Card","SigningAwaitingScreen","secondaryPending","pending","FinishedTerminal","SigningFinishedScreen","reason","practiceName","action","hasPractice","defaultTitle","defaultBody","hasButton","SigningEndScreen","practiceBody","key","Clock","Ban"],"mappings":"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"}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { jsxs as h, jsx as n } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as $e, useId as De, useRef as a, useState as pe, useEffect as w, useMemo as He } from "react";
|
|
3
|
+
import { c as J } from "./index-D2ZczOXr.js";
|
|
4
|
+
import { useTranslation as We, Trans as Ve } from "react-i18next";
|
|
5
|
+
import { u as ze } from "./registry-DvAUVLHh.js";
|
|
6
|
+
import { u as Le } from "./use-controllable-state-BiY4xTzM.js";
|
|
7
|
+
import { a as q } from "./format-number-DdzqwMs1.js";
|
|
8
|
+
import { A as y } from "./alert-C4WKViaS.js";
|
|
9
|
+
import { B as fe } from "./button-DohK_Ak_.js";
|
|
10
|
+
import { O as Oe } from "./otp-input-BNOTlxq3.js";
|
|
11
|
+
import { C as Pe } from "./circle-alert-rGDZ73Wh.js";
|
|
12
|
+
const je = {
|
|
13
|
+
id: "sms-code-entry",
|
|
14
|
+
capabilities: [],
|
|
15
|
+
state: {
|
|
16
|
+
filledCount: {
|
|
17
|
+
type: "number",
|
|
18
|
+
descriptionKey: "ui.agent.smsCodeEntry.state.filledCount",
|
|
19
|
+
description: "How many digits are typed. Never the digits themselves.",
|
|
20
|
+
read: (t) => t.getFilledCount()
|
|
21
|
+
},
|
|
22
|
+
length: {
|
|
23
|
+
type: "number",
|
|
24
|
+
descriptionKey: "ui.agent.smsCodeEntry.state.length",
|
|
25
|
+
description: "How many digits the code has.",
|
|
26
|
+
read: (t) => t.getLength()
|
|
27
|
+
},
|
|
28
|
+
isComplete: {
|
|
29
|
+
type: "boolean",
|
|
30
|
+
descriptionKey: "ui.agent.smsCodeEntry.state.isComplete",
|
|
31
|
+
description: "Whether every box is filled, so the person can press the submit button.",
|
|
32
|
+
read: (t) => t.isComplete()
|
|
33
|
+
},
|
|
34
|
+
error: {
|
|
35
|
+
type: "'wrong' | 'expired' | 'locked' | 'send-failed' | 'resend-limit' | null",
|
|
36
|
+
descriptionKey: "ui.agent.smsCodeEntry.state.error",
|
|
37
|
+
description: "What the host reported about the code: wrong, expired, locked, send-failed or resend-limit, or null when it reported nothing.",
|
|
38
|
+
read: (t) => t.getError()
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
actions: {
|
|
42
|
+
clear: {
|
|
43
|
+
safety: "destructive",
|
|
44
|
+
idempotent: !0,
|
|
45
|
+
descriptionKey: "ui.agent.smsCodeEntry.actions.clear",
|
|
46
|
+
description: "Empty the boxes. Loses the digits typed so far.",
|
|
47
|
+
invoke: (t) => {
|
|
48
|
+
t.clear();
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
focus: {
|
|
52
|
+
safety: "read",
|
|
53
|
+
idempotent: !0,
|
|
54
|
+
descriptionKey: "ui.agent.smsCodeEntry.actions.focus",
|
|
55
|
+
description: "Move keyboard focus to the code boxes, so the person can type or paste the code. Does nothing while the boxes are disabled.",
|
|
56
|
+
invoke: (t) => {
|
|
57
|
+
t.focus();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
domHooks: {
|
|
62
|
+
root: {
|
|
63
|
+
attr: "data-component",
|
|
64
|
+
value: "sms-code-entry",
|
|
65
|
+
description: 'Marks the SMS code step: the sentence naming the masked mobile, the code boxes (an OTPInput), the notes, "Send a new code" and the submit button.'
|
|
66
|
+
},
|
|
67
|
+
instanceId: {
|
|
68
|
+
attr: "data-component-id",
|
|
69
|
+
sourceProp: "id",
|
|
70
|
+
description: "Sourced from the id prop."
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}, Ge = J(
|
|
74
|
+
"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:break-words"
|
|
75
|
+
), Ue = J(
|
|
76
|
+
"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]"
|
|
77
|
+
), Ye = J("", {
|
|
78
|
+
variants: { empty: { true: "ds:sr-only", false: "" } },
|
|
79
|
+
defaultVariants: { empty: !0 }
|
|
80
|
+
}), he = 6;
|
|
81
|
+
function _e(t) {
|
|
82
|
+
const i = Number.isFinite(t) ? Math.floor(t) : he;
|
|
83
|
+
return Math.min(10, Math.max(3, i));
|
|
84
|
+
}
|
|
85
|
+
function qe(t, i) {
|
|
86
|
+
return t.replace(/[٠-٩]/g, (g) => String(g.charCodeAt(0) - 1632)).replace(/[۰-۹]/g, (g) => String(g.charCodeAt(0) - 1776)).replace(/\D/g, "").slice(0, i);
|
|
87
|
+
}
|
|
88
|
+
function Je(t) {
|
|
89
|
+
return typeof t == "number" && Number.isFinite(t) ? Math.max(0, Math.ceil(t)) : 0;
|
|
90
|
+
}
|
|
91
|
+
function Qe(t) {
|
|
92
|
+
return typeof t == "number" && Number.isFinite(t) && t > 0 ? t : void 0;
|
|
93
|
+
}
|
|
94
|
+
const Xe = $e(
|
|
95
|
+
({
|
|
96
|
+
destination: t,
|
|
97
|
+
body: i,
|
|
98
|
+
length: g = he,
|
|
99
|
+
value: ye,
|
|
100
|
+
defaultValue: ge,
|
|
101
|
+
onValueChange: Ce,
|
|
102
|
+
onSubmit: $,
|
|
103
|
+
submitLabel: k,
|
|
104
|
+
submitting: l = !1,
|
|
105
|
+
error: o = null,
|
|
106
|
+
errorText: M,
|
|
107
|
+
remainingSeconds: ve,
|
|
108
|
+
onResend: B,
|
|
109
|
+
resent: Ee = !1,
|
|
110
|
+
validityMinutes: xe,
|
|
111
|
+
note: D,
|
|
112
|
+
autofillHint: H = !0,
|
|
113
|
+
contactPracticeHint: be = !1,
|
|
114
|
+
disabled: F = !1,
|
|
115
|
+
autoFocus: Q = !1,
|
|
116
|
+
name: Ne,
|
|
117
|
+
id: W,
|
|
118
|
+
className: we,
|
|
119
|
+
privacy: X = !1,
|
|
120
|
+
...d
|
|
121
|
+
}, S) => {
|
|
122
|
+
const { t: s, i18n: V } = We("ui"), z = De(), I = `${z}-body`, Z = `${z}-notes`, ee = `${z}-error`, C = a(null), c = _e(g), te = q(c, V.language), [ke, v] = Le({
|
|
123
|
+
value: ye,
|
|
124
|
+
defaultValue: ge ?? "",
|
|
125
|
+
onChange: Ce
|
|
126
|
+
}), E = qe(ke ?? "", c), ne = E.length === c, [L, O] = pe(0), P = a(!1), se = a(null), oe = a(null), j = a(!1), A = a(!1), u = o === "locked" || o === "send-failed", G = o === "resend-limit", re = o === "wrong" || o === "expired", m = F || l || u, x = M != null && M.trim() ? M : void 0, T = l ? void 0 : o === "wrong" ? x ?? s("smsCodeEntry.wrong") : o === "expired" ? x ?? s("smsCodeEntry.expired") : void 0, ce = o === "locked" ? x ?? s("smsCodeEntry.locked") : o === "send-failed" ? x ?? s("smsCodeEntry.sendFailed") : void 0, ae = Ee && !o, U = Je(ve), Y = U > 0, ie = !!B && !u && !G, p = ie && Y, K = ie && !Y, de = be && (u || !Y), _ = s("smsCodeEntry.resendIn", {
|
|
127
|
+
count: U,
|
|
128
|
+
seconds: q(U, V.language)
|
|
129
|
+
}), R = Qe(xe), le = H || R !== void 0 || !!D, ue = le ? `${I} ${Z}` : I, Me = !X && !!(t != null && t.trim()), Be = !l && (u || !ne), Fe = k != null && k.trim() ? k : s("smsCodeEntry.submit"), b = Ue(), [Se, Ie] = pe(""), me = a(!1);
|
|
130
|
+
w(() => {
|
|
131
|
+
if (p === me.current) return;
|
|
132
|
+
me.current = p;
|
|
133
|
+
const e = p ? _ : K ? s("smsCodeEntry.resendReady") : "";
|
|
134
|
+
Ie(e);
|
|
135
|
+
}, [p, K, _, s]), w(() => {
|
|
136
|
+
var e;
|
|
137
|
+
!P.current || !re || m || (P.current = !1, (e = C.current) == null || e.focus());
|
|
138
|
+
}, [L, re, m]), w(() => {
|
|
139
|
+
var r;
|
|
140
|
+
if (!u || !j.current) return;
|
|
141
|
+
const e = document.activeElement;
|
|
142
|
+
(e === null || e === document.body) && ((r = oe.current) == null || r.focus());
|
|
143
|
+
}, [u]), w(() => {
|
|
144
|
+
var e;
|
|
145
|
+
!A.current || m || (A.current = !1, (e = C.current) == null || e.focus());
|
|
146
|
+
}, [L, m]), w(() => {
|
|
147
|
+
var e;
|
|
148
|
+
Q && ((e = C.current) == null || e.focus());
|
|
149
|
+
}, [Q]);
|
|
150
|
+
const Ae = () => {
|
|
151
|
+
m || !ne || ($ == null || $(E), v(""), O((e) => e + 1), P.current = !0);
|
|
152
|
+
}, Te = () => {
|
|
153
|
+
F || l || (B == null || B(), v(""), A.current = !0, O((e) => e + 1));
|
|
154
|
+
}, f = a({ code: E, length: c, error: o });
|
|
155
|
+
f.current = { code: E, length: c, error: o };
|
|
156
|
+
const Ke = He(
|
|
157
|
+
() => ({
|
|
158
|
+
clear: () => {
|
|
159
|
+
var N;
|
|
160
|
+
const e = document.activeElement;
|
|
161
|
+
e instanceof HTMLInputElement && !!((N = se.current) != null && N.contains(e)) && (A.current = !0), v(""), O((Re) => Re + 1);
|
|
162
|
+
},
|
|
163
|
+
focus: () => {
|
|
164
|
+
var e;
|
|
165
|
+
(e = C.current) == null || e.focus();
|
|
166
|
+
},
|
|
167
|
+
getFilledCount: () => f.current.code.length,
|
|
168
|
+
getLength: () => f.current.length,
|
|
169
|
+
isComplete: () => f.current.code.length === f.current.length,
|
|
170
|
+
getError: () => f.current.error
|
|
171
|
+
}),
|
|
172
|
+
[v]
|
|
173
|
+
);
|
|
174
|
+
return ze(je, Ke, W), /* @__PURE__ */ h(
|
|
175
|
+
"div",
|
|
176
|
+
{
|
|
177
|
+
...d,
|
|
178
|
+
ref: (e) => {
|
|
179
|
+
se.current = e, typeof S == "function" ? S(e) : S && (S.current = e);
|
|
180
|
+
},
|
|
181
|
+
id: W,
|
|
182
|
+
onFocus: (e) => {
|
|
183
|
+
var r;
|
|
184
|
+
j.current = !0, (r = d.onFocus) == null || r.call(d, e);
|
|
185
|
+
},
|
|
186
|
+
onBlur: (e) => {
|
|
187
|
+
var N;
|
|
188
|
+
const r = e.relatedTarget;
|
|
189
|
+
r instanceof Node && !e.currentTarget.contains(r) && (j.current = !1), (N = d.onBlur) == null || N.call(d, e);
|
|
190
|
+
},
|
|
191
|
+
"data-component": "sms-code-entry",
|
|
192
|
+
"data-component-id": W,
|
|
193
|
+
"data-privacy": X ? "masked" : void 0,
|
|
194
|
+
className: Ge({ className: we }),
|
|
195
|
+
children: [
|
|
196
|
+
i != null ? /* @__PURE__ */ n("div", { id: I, className: "type-body", children: i }) : /* @__PURE__ */ n("p", { id: I, className: "type-body ds:m-0", children: Me ? /* @__PURE__ */ n(
|
|
197
|
+
Ve,
|
|
198
|
+
{
|
|
199
|
+
t: s,
|
|
200
|
+
ns: "ui",
|
|
201
|
+
i18nKey: "smsCodeEntry.body",
|
|
202
|
+
count: c,
|
|
203
|
+
values: { length: te, destination: t },
|
|
204
|
+
components: {
|
|
205
|
+
dest: /* @__PURE__ */ n("bdi", { dir: "ltr", className: "ds:font-semibold" })
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
) : s("smsCodeEntry.bodyYourMobile", {
|
|
209
|
+
count: c,
|
|
210
|
+
length: te
|
|
211
|
+
}) }),
|
|
212
|
+
ce ? /* @__PURE__ */ n(y, { variant: "error", announce: "assertive", children: /* @__PURE__ */ n(y.Description, { children: ce }) }) : null,
|
|
213
|
+
/* @__PURE__ */ h(
|
|
214
|
+
"div",
|
|
215
|
+
{
|
|
216
|
+
role: "status",
|
|
217
|
+
className: Ye({ empty: !G && !ae }),
|
|
218
|
+
children: [
|
|
219
|
+
G ? /* @__PURE__ */ n(y, { variant: "warning", announce: "off", children: /* @__PURE__ */ n(y.Description, { children: x ?? s("smsCodeEntry.resendLimit") }) }) : null,
|
|
220
|
+
ae ? /* @__PURE__ */ n(y, { variant: "success", announce: "off", children: /* @__PURE__ */ n(y.Description, { children: s("smsCodeEntry.resent") }) }) : null
|
|
221
|
+
]
|
|
222
|
+
}
|
|
223
|
+
),
|
|
224
|
+
/* @__PURE__ */ h("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
|
|
225
|
+
/* @__PURE__ */ n(
|
|
226
|
+
Oe,
|
|
227
|
+
{
|
|
228
|
+
label: s("smsCodeEntry.label"),
|
|
229
|
+
ref: C,
|
|
230
|
+
length: c,
|
|
231
|
+
groupSize: 3,
|
|
232
|
+
value: E,
|
|
233
|
+
onChange: v,
|
|
234
|
+
disabled: m,
|
|
235
|
+
webOtp: H,
|
|
236
|
+
name: Ne,
|
|
237
|
+
error: !!T,
|
|
238
|
+
"aria-describedby": T ? `${ee} ${ue}` : ue
|
|
239
|
+
},
|
|
240
|
+
L
|
|
241
|
+
),
|
|
242
|
+
T ? /* @__PURE__ */ h(
|
|
243
|
+
"p",
|
|
244
|
+
{
|
|
245
|
+
id: ee,
|
|
246
|
+
role: "alert",
|
|
247
|
+
"data-slot": "error",
|
|
248
|
+
className: "ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-destructive",
|
|
249
|
+
children: [
|
|
250
|
+
/* @__PURE__ */ n(
|
|
251
|
+
Pe,
|
|
252
|
+
{
|
|
253
|
+
"aria-hidden": "true",
|
|
254
|
+
className: "ds:size-4 ds:shrink-0"
|
|
255
|
+
}
|
|
256
|
+
),
|
|
257
|
+
/* @__PURE__ */ n("span", { children: T })
|
|
258
|
+
]
|
|
259
|
+
}
|
|
260
|
+
) : null
|
|
261
|
+
] }),
|
|
262
|
+
le ? /* @__PURE__ */ h(
|
|
263
|
+
"div",
|
|
264
|
+
{
|
|
265
|
+
id: Z,
|
|
266
|
+
className: "ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]",
|
|
267
|
+
children: [
|
|
268
|
+
H ? /* @__PURE__ */ n("p", { className: b, children: s("smsCodeEntry.autofill") }) : null,
|
|
269
|
+
R !== void 0 ? /* @__PURE__ */ n("p", { className: b, children: s("smsCodeEntry.validity", {
|
|
270
|
+
count: R,
|
|
271
|
+
minutes: q(R, V.language)
|
|
272
|
+
}) }) : null,
|
|
273
|
+
D ? /* @__PURE__ */ n("div", { className: b, children: D }) : null
|
|
274
|
+
]
|
|
275
|
+
}
|
|
276
|
+
) : null,
|
|
277
|
+
p || K || de ? /* @__PURE__ */ h("div", { className: "ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]", children: [
|
|
278
|
+
p ? /* @__PURE__ */ n("p", { className: b, children: _ }) : null,
|
|
279
|
+
K ? /* @__PURE__ */ n(
|
|
280
|
+
fe,
|
|
281
|
+
{
|
|
282
|
+
intent: "ghost",
|
|
283
|
+
className: "ds:min-h-[var(--min-target-size)]",
|
|
284
|
+
"data-action": "resend-code",
|
|
285
|
+
disabled: F || l,
|
|
286
|
+
onClick: Te,
|
|
287
|
+
children: s("smsCodeEntry.resend")
|
|
288
|
+
}
|
|
289
|
+
) : null,
|
|
290
|
+
de ? /* @__PURE__ */ n("p", { className: b, children: s("smsCodeEntry.contactPractice") }) : null
|
|
291
|
+
] }) : null,
|
|
292
|
+
/* @__PURE__ */ n("div", { role: "status", className: "ds:sr-only", children: Se }),
|
|
293
|
+
/* @__PURE__ */ n(
|
|
294
|
+
fe,
|
|
295
|
+
{
|
|
296
|
+
intent: "primary",
|
|
297
|
+
ref: oe,
|
|
298
|
+
className: "ds:w-full ds:min-h-[var(--min-target-size)]",
|
|
299
|
+
"data-action": "submit-code",
|
|
300
|
+
loading: l,
|
|
301
|
+
disabled: F,
|
|
302
|
+
"aria-disabled": Be || void 0,
|
|
303
|
+
onClick: Ae,
|
|
304
|
+
children: Fe
|
|
305
|
+
}
|
|
306
|
+
)
|
|
307
|
+
]
|
|
308
|
+
}
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
);
|
|
312
|
+
Xe.displayName = "SmsCodeEntry";
|
|
313
|
+
export {
|
|
314
|
+
Xe as S
|
|
315
|
+
};
|
|
316
|
+
//# sourceMappingURL=sms-code-entry-Dgp4GwlM.js.map
|