@tinyrack/issuary-server 0.26.0 → 0.27.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/entities/terms-content.entity.d.ts +9 -0
- package/dist/entities/terms-content.entity.d.ts.map +1 -1
- package/dist/entities/terms.entity.d.ts +9 -0
- package/dist/entities/terms.entity.d.ts.map +1 -1
- package/dist/entities/terms.entity.js +4 -0
- package/dist/entities/terms.entity.js.map +1 -1
- package/dist/entities/user-terms-consent.entity.d.ts +9 -0
- package/dist/entities/user-terms-consent.entity.d.ts.map +1 -1
- package/dist/entrypoints/app.d.ts +598 -3
- package/dist/entrypoints/app.d.ts.map +1 -1
- package/dist/entrypoints/database/postgres/compiled-functions.d.ts +19 -16
- package/dist/entrypoints/database/postgres/compiled-functions.d.ts.map +1 -1
- package/dist/entrypoints/database/postgres/compiled-functions.js +133 -76
- package/dist/entrypoints/database/postgres/compiled-functions.js.map +1 -1
- package/dist/entrypoints/database/sqlite/compiled-functions.d.ts +19 -16
- package/dist/entrypoints/database/sqlite/compiled-functions.d.ts.map +1 -1
- package/dist/entrypoints/database/sqlite/compiled-functions.js +133 -76
- package/dist/entrypoints/database/sqlite/compiled-functions.js.map +1 -1
- package/dist/lib/config/branding.d.ts +5 -0
- package/dist/lib/config/branding.d.ts.map +1 -1
- package/dist/lib/config/branding.js +23 -1
- package/dist/lib/config/branding.js.map +1 -1
- package/dist/lib/config/resolved.d.ts +3 -0
- package/dist/lib/config/resolved.d.ts.map +1 -1
- package/dist/lib/interpolate-html.d.ts +3 -3
- package/dist/lib/interpolate-html.js +3 -3
- package/dist/lib/interpolate-html.js.map +1 -1
- package/dist/migrations/postgres/Migration20260827090000_archive_terms.d.ts +6 -0
- package/dist/migrations/postgres/Migration20260827090000_archive_terms.d.ts.map +1 -0
- package/dist/migrations/postgres/Migration20260827090000_archive_terms.js +12 -0
- package/dist/migrations/postgres/Migration20260827090000_archive_terms.js.map +1 -0
- package/dist/migrations/postgres/index.d.ts.map +1 -1
- package/dist/migrations/postgres/index.js +2 -0
- package/dist/migrations/postgres/index.js.map +1 -1
- package/dist/migrations/sqlite/Migration20260827090000_archive_terms.d.ts +6 -0
- package/dist/migrations/sqlite/Migration20260827090000_archive_terms.d.ts.map +1 -0
- package/dist/migrations/sqlite/Migration20260827090000_archive_terms.js +12 -0
- package/dist/migrations/sqlite/Migration20260827090000_archive_terms.js.map +1 -0
- package/dist/migrations/sqlite/index.d.ts.map +1 -1
- package/dist/migrations/sqlite/index.js +2 -0
- package/dist/migrations/sqlite/index.js.map +1 -1
- package/dist/repositories/terms.repository.d.ts.map +1 -1
- package/dist/repositories/terms.repository.js +1 -1
- package/dist/repositories/terms.repository.js.map +1 -1
- package/dist/routes/api/admin/console/index.d.ts +523 -0
- package/dist/routes/api/admin/console/index.d.ts.map +1 -0
- package/dist/routes/api/admin/console/index.js +212 -0
- package/dist/routes/api/admin/console/index.js.map +1 -0
- package/dist/routes/api/admin/index.d.ts +584 -0
- package/dist/routes/api/admin/index.d.ts.map +1 -1
- package/dist/routes/api/admin/index.js +3 -1
- package/dist/routes/api/admin/index.js.map +1 -1
- package/dist/routes/api/admin/users/index.d.ts +64 -0
- package/dist/routes/api/admin/users/index.d.ts.map +1 -1
- package/dist/routes/api/admin/users/index.js +47 -0
- package/dist/routes/api/admin/users/index.js.map +1 -1
- package/dist/routes/api/config/get.d.ts +10 -3
- package/dist/routes/api/config/get.d.ts.map +1 -1
- package/dist/routes/api/config/get.js +3 -0
- package/dist/routes/api/config/get.js.map +1 -1
- package/dist/routes/api/config/index.d.ts +10 -3
- package/dist/routes/api/config/index.d.ts.map +1 -1
- package/dist/routes/api/index.d.ts +594 -3
- package/dist/routes/api/index.d.ts.map +1 -1
- package/dist/routes/index.d.ts +594 -3
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/schemas/response.d.ts +4 -1
- package/dist/schemas/response.d.ts.map +1 -1
- package/dist/schemas/response.js +11 -2
- package/dist/schemas/response.js.map +1 -1
- package/dist/services/admin-console.service.d.ts +407 -0
- package/dist/services/admin-console.service.d.ts.map +1 -0
- package/dist/services/admin-console.service.js +377 -0
- package/dist/services/admin-console.service.js.map +1 -0
- package/dist/services/container.d.ts +5 -0
- package/dist/services/container.d.ts.map +1 -1
- package/dist/services/container.js +3 -0
- package/dist/services/container.js.map +1 -1
- package/dist/services/user.service.d.ts +21 -0
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +65 -1
- package/dist/services/user.service.js.map +1 -1
- package/package.json +1 -1
- package/public/assets/2fa-BowFczF7.js +2 -0
- package/public/assets/2fa-BowFczF7.js.map +1 -0
- package/public/assets/2fa-C_pA-n2i.js +2 -0
- package/public/assets/{2fa-DFTcWEMb.js.map → 2fa-C_pA-n2i.js.map} +1 -1
- package/public/assets/2fa-Cpfhakvn.js +2 -0
- package/public/assets/{2fa-huNZDYU9.js.map → 2fa-Cpfhakvn.js.map} +1 -1
- package/public/assets/2fa-o1a13VHx.js +2 -0
- package/public/assets/2fa-o1a13VHx.js.map +1 -0
- package/public/assets/FieldControl-ShLuCjvG.js +2 -0
- package/public/assets/FieldControl-ShLuCjvG.js.map +1 -0
- package/public/assets/Separator-C6MmGAmP.js +2 -0
- package/public/assets/Separator-C6MmGAmP.js.map +1 -0
- package/public/assets/admin-_jFLs8Ve.js +2 -0
- package/public/assets/admin-_jFLs8Ve.js.map +1 -0
- package/public/assets/admin-shell-B91U4-Ro.js +2 -0
- package/public/assets/admin-shell-B91U4-Ro.js.map +1 -0
- package/public/assets/alert-D3aaK-_3.js +2 -0
- package/public/assets/alert-D3aaK-_3.js.map +1 -0
- package/public/assets/alert-kRxM1xsM.js +2 -0
- package/public/assets/alert-kRxM1xsM.js.map +1 -0
- package/public/assets/auth-choice-row-h4heOMHs.js +2 -0
- package/public/assets/auth-choice-row-h4heOMHs.js.map +1 -0
- package/public/assets/auth-field-BpJ4AHtU.js +2 -0
- package/public/assets/{auth-field-CWyXGKoC.js.map → auth-field-BpJ4AHtU.js.map} +1 -1
- package/public/assets/auth-footer-Du6S-oDG.js +2 -0
- package/public/assets/auth-footer-Du6S-oDG.js.map +1 -0
- package/public/assets/auth-layout-BdRRr0vT.js +2 -0
- package/public/assets/auth-layout-BdRRr0vT.js.map +1 -0
- package/public/assets/auth-page-header-ChaCNNrn.js +2 -0
- package/public/assets/{auth-page-header-DgGAaIiP.js.map → auth-page-header-ChaCNNrn.js.map} +1 -1
- package/public/assets/authorization-context-banner-zVxGX5e8.js +2 -0
- package/public/assets/{authorization-context-banner-DznMDPOX.js.map → authorization-context-banner-zVxGX5e8.js.map} +1 -1
- package/public/assets/avatar-BxTPQIDp.js +2 -0
- package/public/assets/{avatar-D-FRGa1m.js.map → avatar-BxTPQIDp.js.map} +1 -1
- package/public/assets/badge-B8D0Q2qq.js +2 -0
- package/public/assets/{badge-CsOfUji0.js.map → badge-B8D0Q2qq.js.map} +1 -1
- package/public/assets/checkbox-DTPGfvmq.js +2 -0
- package/public/assets/{checkbox-C90dDDza.js.map → checkbox-DTPGfvmq.js.map} +1 -1
- package/public/assets/{circle-check-6QTLhwM_.js → circle-check-Cnzuu7xR.js} +2 -2
- package/public/assets/{circle-check-6QTLhwM_.js.map → circle-check-Cnzuu7xR.js.map} +1 -1
- package/public/assets/clients-DLqy7K3N.js +5 -0
- package/public/assets/clients-DLqy7K3N.js.map +1 -0
- package/public/assets/config-C18-l7z7.js +2 -0
- package/public/assets/config-C18-l7z7.js.map +1 -0
- package/public/assets/{consent-RtCi_85E.js → consent-BWniDzI3.js} +2 -2
- package/public/assets/{consent-RtCi_85E.js.map → consent-BWniDzI3.js.map} +1 -1
- package/public/assets/consent-r_tX8DTb.js +2 -0
- package/public/assets/{consent-B9sQEyO8.js.map → consent-r_tX8DTb.js.map} +1 -1
- package/public/assets/{createLucideIcon-BPpAIXR_.js → createLucideIcon-D-yizrWN.js} +2 -2
- package/public/assets/{createLucideIcon-BPpAIXR_.js.map → createLucideIcon-D-yizrWN.js.map} +1 -1
- package/public/assets/design-system-rich-text-B3NzIRoJ.js +2 -0
- package/public/assets/design-system-rich-text-B3NzIRoJ.js.map +1 -0
- package/public/assets/email-Bx9JlWp3.js +2 -0
- package/public/assets/email-Bx9JlWp3.js.map +1 -0
- package/public/assets/email-Cpfhakvn.js +2 -0
- package/public/assets/email-Cpfhakvn.js.map +1 -0
- package/public/assets/error-DDY8m_Px.js +2 -0
- package/public/assets/error-DDY8m_Px.js.map +1 -0
- package/public/assets/field-CsrUbl__.js +3 -0
- package/public/assets/field-CsrUbl__.js.map +1 -0
- package/public/assets/{fingerprint-pattern-DP62Vk8x.js → fingerprint-pattern-BwUoN1_w.js} +2 -2
- package/public/assets/{fingerprint-pattern-DP62Vk8x.js.map → fingerprint-pattern-BwUoN1_w.js.map} +1 -1
- package/public/assets/forgot-Cpfhakvn.js +2 -0
- package/public/assets/forgot-Cpfhakvn.js.map +1 -0
- package/public/assets/forgot-u52JMu6e.js +2 -0
- package/public/assets/forgot-u52JMu6e.js.map +1 -0
- package/public/assets/form-sJw-V9wb.js +2 -0
- package/public/assets/form-sJw-V9wb.js.map +1 -0
- package/public/assets/index-8mX6CKcW.css +2 -0
- package/public/assets/index-lTEyHSus.js +11 -0
- package/public/assets/index-lTEyHSus.js.map +1 -0
- package/public/assets/initial-avatar-WMjxW3Zz.js +2 -0
- package/public/assets/initial-avatar-WMjxW3Zz.js.map +1 -0
- package/public/assets/input-QvBxPgy5.js +2 -0
- package/public/assets/{input-CxVeC8Pn.js.map → input-QvBxPgy5.js.map} +1 -1
- package/public/assets/{key-round-CdvHb8vT.js → key-round-BxWppK6h.js} +2 -2
- package/public/assets/{key-round-CdvHb8vT.js.map → key-round-BxWppK6h.js.map} +1 -1
- package/public/assets/labeled-separator-DdkyYDWH.js +2 -0
- package/public/assets/labeled-separator-DdkyYDWH.js.map +1 -0
- package/public/assets/link-BHmn75Zo.js +2 -0
- package/public/assets/{link-C-WdTj3F.js.map → link-BHmn75Zo.js.map} +1 -1
- package/public/assets/{lock-7NRyvXBS.js → lock-8wpR2C78.js} +2 -2
- package/public/assets/{lock-7NRyvXBS.js.map → lock-8wpR2C78.js.map} +1 -1
- package/public/assets/login-Cpfhakvn.js +2 -0
- package/public/assets/login-Cpfhakvn.js.map +1 -0
- package/public/assets/login-DRcHjJ2-.js +2 -0
- package/public/assets/login-DRcHjJ2-.js.map +1 -0
- package/public/assets/logout-Dphj1d_0.js +2 -0
- package/public/assets/logout-Dphj1d_0.js.map +1 -0
- package/public/assets/{mail-D0B_1Dzd.js → mail-DVP_XMUi.js} +2 -2
- package/public/assets/{mail-D0B_1Dzd.js.map → mail-DVP_XMUi.js.map} +1 -1
- package/public/assets/modal-JuaLVSyx.js +2 -0
- package/public/assets/modal-JuaLVSyx.js.map +1 -0
- package/public/assets/mutationOptions-Cv_vJkJn.js +2 -0
- package/public/assets/{mutationOptions-DyYFUbyn.js.map → mutationOptions-Cv_vJkJn.js.map} +1 -1
- package/public/assets/passkey-CObBlfKK.js +2 -0
- package/public/assets/passkey-CObBlfKK.js.map +1 -0
- package/public/assets/{passkey-J1qnYp9A.js → passkey-CWTjw19S.js} +2 -2
- package/public/assets/{passkey-J1qnYp9A.js.map → passkey-CWTjw19S.js.map} +1 -1
- package/public/assets/passkey-CavITajY.js +2 -0
- package/public/assets/passkey-CavITajY.js.map +1 -0
- package/public/assets/passkey-Cpfhakvn.js +2 -0
- package/public/assets/passkey-Cpfhakvn.js.map +1 -0
- package/public/assets/{passkey-error-ZqqPQUta.js → passkey-error-CZ26Ss-I.js} +2 -2
- package/public/assets/{passkey-error-ZqqPQUta.js.map → passkey-error-CZ26Ss-I.js.map} +1 -1
- package/public/assets/password-Cpfhakvn.js +2 -0
- package/public/assets/password-Cpfhakvn.js.map +1 -0
- package/public/assets/password-Dk8PwtZN.js +2 -0
- package/public/assets/password-Dk8PwtZN.js.map +1 -0
- package/public/assets/password-reset-BcFpGOop.js +2 -0
- package/public/assets/{password-reset-sU5KkBKi.js.map → password-reset-BcFpGOop.js.map} +1 -1
- package/public/assets/password-strength-Bgvy7kz6.js +2 -0
- package/public/assets/{password-strength-BIPcWiM_.js.map → password-strength-Bgvy7kz6.js.map} +1 -1
- package/public/assets/pin-input-DhsRO4Ei.js +2 -0
- package/public/assets/{pin-input-CITrr-Yc.js.map → pin-input-DhsRO4Ei.js.map} +1 -1
- package/public/assets/profile-PjXEnzA-.js +2 -0
- package/public/assets/profile-PjXEnzA-.js.map +1 -0
- package/public/assets/profile-k66ruDWl.js +2 -0
- package/public/assets/{profile-BHPL9Px_.js.map → profile-k66ruDWl.js.map} +1 -1
- package/public/assets/provider-mark-CeYazOfu.js +2 -0
- package/public/assets/provider-mark-CeYazOfu.js.map +1 -0
- package/public/assets/recovery-hdRyezmb.js +2 -0
- package/public/assets/recovery-hdRyezmb.js.map +1 -0
- package/public/assets/register-Cpfhakvn.js +2 -0
- package/public/assets/register-Cpfhakvn.js.map +1 -0
- package/public/assets/register-DMgKT_fm.js +2 -0
- package/public/assets/register-DMgKT_fm.js.map +1 -0
- package/public/assets/reset-Cpfhakvn.js +2 -0
- package/public/assets/reset-Cpfhakvn.js.map +1 -0
- package/public/assets/reset-DBu3wYpE.js +2 -0
- package/public/assets/reset-DBu3wYpE.js.map +1 -0
- package/public/assets/select-5LheSsRl.js +2 -0
- package/public/assets/select-5LheSsRl.js.map +1 -0
- package/public/assets/select-Cpfhakvn.js +2 -0
- package/public/assets/{select-huNZDYU9.js.map → select-Cpfhakvn.js.map} +1 -1
- package/public/assets/separator-CMGc2Y1q.js +2 -0
- package/public/assets/separator-CMGc2Y1q.js.map +1 -0
- package/public/assets/settings-BVe4k3kJ.js +2 -0
- package/public/assets/settings-BVe4k3kJ.js.map +1 -0
- package/public/assets/shell-header-bar-CdOEWmCT.js +2 -0
- package/public/assets/shell-header-bar-CdOEWmCT.js.map +1 -0
- package/public/assets/{shield-check-D_p8H0ni.js → shield-check-DpYF8yeI.js} +2 -2
- package/public/assets/{shield-check-D_p8H0ni.js.map → shield-check-DpYF8yeI.js.map} +1 -1
- package/public/assets/standard-schema-C50nwAaQ.js +2 -0
- package/public/assets/{standard-schema-e8gtSzGE.js.map → standard-schema-C50nwAaQ.js.map} +1 -1
- package/public/assets/system-BoUqxc5h.js +2 -0
- package/public/assets/system-BoUqxc5h.js.map +1 -0
- package/public/assets/table-Dl89o43x.js +2 -0
- package/public/assets/table-Dl89o43x.js.map +1 -0
- package/public/assets/terms-B2wWfx1d.js +2 -0
- package/public/assets/terms-B2wWfx1d.js.map +1 -0
- package/public/assets/terms-COr3cDw5.js +2 -0
- package/public/assets/terms-COr3cDw5.js.map +1 -0
- package/public/assets/terms-checkbox-list-C9TkDC8Y.js +2 -0
- package/public/assets/terms-checkbox-list-C9TkDC8Y.js.map +1 -0
- package/public/assets/terms-k66ruDWl.js +2 -0
- package/public/assets/terms-k66ruDWl.js.map +1 -0
- package/public/assets/totp-BJycMMTC.js +2 -0
- package/public/assets/totp-BJycMMTC.js.map +1 -0
- package/public/assets/{totp-BNZ904Zm.js → totp-BhElob6P.js} +2 -2
- package/public/assets/{totp-BNZ904Zm.js.map → totp-BhElob6P.js.map} +1 -1
- package/public/assets/totp-C1ba10Is.js +2 -0
- package/public/assets/totp-C1ba10Is.js.map +1 -0
- package/public/assets/{trash-2-DZdKBLvC.js → trash-2-B3NVE8pR.js} +2 -2
- package/public/assets/{trash-2-DZdKBLvC.js.map → trash-2-B3NVE8pR.js.map} +1 -1
- package/public/assets/{triangle-alert-CqNn0kPs.js → triangle-alert-DATO9o3k.js} +2 -2
- package/public/assets/{triangle-alert-CqNn0kPs.js.map → triangle-alert-DATO9o3k.js.map} +1 -1
- package/public/assets/use-admin-selection-D2b7jnym.js +2 -0
- package/public/assets/use-admin-selection-D2b7jnym.js.map +1 -0
- package/public/assets/use-totp-setup-KOVNS2DC.js +3 -0
- package/public/assets/use-totp-setup-KOVNS2DC.js.map +1 -0
- package/public/assets/useAriaLabelledBy-CF3crxLc.js +2 -0
- package/public/assets/{useAriaLabelledBy-IIwdHUss.js.map → useAriaLabelledBy-CF3crxLc.js.map} +1 -1
- package/public/assets/useMutation-DqIIIiBW.js +2 -0
- package/public/assets/{useMutation-BWZ0G4Td.js.map → useMutation-DqIIIiBW.js.map} +1 -1
- package/public/assets/useQuery-CLr9TaKA.js +2 -0
- package/public/assets/{useQuery-Ccv_nzQl.js.map → useQuery-CLr9TaKA.js.map} +1 -1
- package/public/assets/users-BQQQm353.js +2 -0
- package/public/assets/users-BQQQm353.js.map +1 -0
- package/public/assets/{zod-C87S6Tec.js → zod-Dszyrytb.js} +2 -2
- package/public/assets/{zod-C87S6Tec.js.map → zod-Dszyrytb.js.map} +1 -1
- package/public/index.html +6 -6
- package/public/issuary-app-icon-512.png +0 -0
- package/public/issuary-app-icon.svg +8 -0
- package/public/assets/2fa-C9wUlSBS.js +0 -2
- package/public/assets/2fa-C9wUlSBS.js.map +0 -1
- package/public/assets/2fa-DFTcWEMb.js +0 -2
- package/public/assets/2fa-TtshNxXv.js +0 -2
- package/public/assets/2fa-TtshNxXv.js.map +0 -1
- package/public/assets/2fa-huNZDYU9.js +0 -2
- package/public/assets/DialogHandle-DICBMcjK.js +0 -2
- package/public/assets/DialogHandle-DICBMcjK.js.map +0 -1
- package/public/assets/FieldItemContext-BeNfhOsU.js +0 -2
- package/public/assets/FieldItemContext-BeNfhOsU.js.map +0 -1
- package/public/assets/admin-CFZaO1bM.js +0 -2
- package/public/assets/admin-CFZaO1bM.js.map +0 -1
- package/public/assets/admin-users-BK_BN8jm.js +0 -2
- package/public/assets/admin-users-BK_BN8jm.js.map +0 -1
- package/public/assets/alert-leqyvHOp.js +0 -2
- package/public/assets/alert-leqyvHOp.js.map +0 -1
- package/public/assets/auth-choice-row-CXuyJgkR.js +0 -2
- package/public/assets/auth-choice-row-CXuyJgkR.js.map +0 -1
- package/public/assets/auth-field-CWyXGKoC.js +0 -2
- package/public/assets/auth-footer-Cz5ivsDc.js +0 -2
- package/public/assets/auth-footer-Cz5ivsDc.js.map +0 -1
- package/public/assets/auth-layout-CiNn2-Nb.js +0 -2
- package/public/assets/auth-layout-CiNn2-Nb.js.map +0 -1
- package/public/assets/auth-page-header-DgGAaIiP.js +0 -2
- package/public/assets/authorization-context-banner-DznMDPOX.js +0 -2
- package/public/assets/avatar-D-FRGa1m.js +0 -2
- package/public/assets/badge-CsOfUji0.js +0 -2
- package/public/assets/checkbox-C90dDDza.js +0 -2
- package/public/assets/chevron-right-CN0jUyV0.js +0 -2
- package/public/assets/chevron-right-CN0jUyV0.js.map +0 -1
- package/public/assets/config-DTQCUlfZ.js +0 -2
- package/public/assets/config-DTQCUlfZ.js.map +0 -1
- package/public/assets/consent-B9sQEyO8.js +0 -2
- package/public/assets/email-8RKQzeig.js +0 -2
- package/public/assets/email-8RKQzeig.js.map +0 -1
- package/public/assets/email-huNZDYU9.js +0 -2
- package/public/assets/email-huNZDYU9.js.map +0 -1
- package/public/assets/error-BYe3gUMO.js +0 -2
- package/public/assets/error-BYe3gUMO.js.map +0 -1
- package/public/assets/field-BMT214_m.js +0 -3
- package/public/assets/field-BMT214_m.js.map +0 -1
- package/public/assets/forgot-BenoOUxC.js +0 -2
- package/public/assets/forgot-BenoOUxC.js.map +0 -1
- package/public/assets/forgot-huNZDYU9.js +0 -2
- package/public/assets/forgot-huNZDYU9.js.map +0 -1
- package/public/assets/index-CKpnrw9M.js +0 -11
- package/public/assets/index-CKpnrw9M.js.map +0 -1
- package/public/assets/index-Ct9o0oCZ.css +0 -2
- package/public/assets/initial-avatar-E5DK9Igm.js +0 -2
- package/public/assets/initial-avatar-E5DK9Igm.js.map +0 -1
- package/public/assets/input-CxVeC8Pn.js +0 -2
- package/public/assets/labeled-separator-CV7nb0XW.js +0 -2
- package/public/assets/labeled-separator-CV7nb0XW.js.map +0 -1
- package/public/assets/link-C-WdTj3F.js +0 -2
- package/public/assets/login-1YuiZD30.js +0 -2
- package/public/assets/login-1YuiZD30.js.map +0 -1
- package/public/assets/login-huNZDYU9.js +0 -2
- package/public/assets/login-huNZDYU9.js.map +0 -1
- package/public/assets/logout-B5T52P8u.js +0 -2
- package/public/assets/logout-B5T52P8u.js.map +0 -1
- package/public/assets/modal-tByFpy18.js +0 -2
- package/public/assets/modal-tByFpy18.js.map +0 -1
- package/public/assets/mutationOptions-DyYFUbyn.js +0 -2
- package/public/assets/passkey-CgAHaQ1p.js +0 -2
- package/public/assets/passkey-CgAHaQ1p.js.map +0 -1
- package/public/assets/passkey-huNZDYU9.js +0 -2
- package/public/assets/passkey-huNZDYU9.js.map +0 -1
- package/public/assets/passkey-v9Pzv-4A.js +0 -2
- package/public/assets/passkey-v9Pzv-4A.js.map +0 -1
- package/public/assets/password-Cuh9Hnjp.js +0 -2
- package/public/assets/password-Cuh9Hnjp.js.map +0 -1
- package/public/assets/password-huNZDYU9.js +0 -2
- package/public/assets/password-huNZDYU9.js.map +0 -1
- package/public/assets/password-reset-sU5KkBKi.js +0 -2
- package/public/assets/password-strength-BIPcWiM_.js +0 -2
- package/public/assets/pin-input-CITrr-Yc.js +0 -2
- package/public/assets/plus-DSBBSrgj.js +0 -2
- package/public/assets/plus-DSBBSrgj.js.map +0 -1
- package/public/assets/profile-BHPL9Px_.js +0 -2
- package/public/assets/profile-C8KaELVe.js +0 -2
- package/public/assets/profile-C8KaELVe.js.map +0 -1
- package/public/assets/provider-logos-u1YURWQr.js +0 -2
- package/public/assets/provider-logos-u1YURWQr.js.map +0 -1
- package/public/assets/recovery-CVROV9nj.js +0 -2
- package/public/assets/recovery-CVROV9nj.js.map +0 -1
- package/public/assets/register-cpxjX3qr.js +0 -2
- package/public/assets/register-cpxjX3qr.js.map +0 -1
- package/public/assets/register-huNZDYU9.js +0 -2
- package/public/assets/register-huNZDYU9.js.map +0 -1
- package/public/assets/reset-huNZDYU9.js +0 -2
- package/public/assets/reset-huNZDYU9.js.map +0 -1
- package/public/assets/reset-iNqYdsoa.js +0 -2
- package/public/assets/reset-iNqYdsoa.js.map +0 -1
- package/public/assets/select-DdjQtcLJ.js +0 -2
- package/public/assets/select-DdjQtcLJ.js.map +0 -1
- package/public/assets/select-huNZDYU9.js +0 -2
- package/public/assets/separator-B0Bvh1he.js +0 -2
- package/public/assets/separator-B0Bvh1he.js.map +0 -1
- package/public/assets/shell-header-bar-JcFhS7mb.js +0 -2
- package/public/assets/shell-header-bar-JcFhS7mb.js.map +0 -1
- package/public/assets/standard-schema-e8gtSzGE.js +0 -2
- package/public/assets/terms-BHPL9Px_.js +0 -2
- package/public/assets/terms-BHPL9Px_.js.map +0 -1
- package/public/assets/terms-BjwMWDFp.js +0 -2
- package/public/assets/terms-BjwMWDFp.js.map +0 -1
- package/public/assets/terms-checkbox-list-DNOq4Pb2.js +0 -2
- package/public/assets/terms-checkbox-list-DNOq4Pb2.js.map +0 -1
- package/public/assets/totp-D_EWG1h8.js +0 -2
- package/public/assets/totp-D_EWG1h8.js.map +0 -1
- package/public/assets/totp-DetFwOkk.js +0 -2
- package/public/assets/totp-DetFwOkk.js.map +0 -1
- package/public/assets/use-totp-setup-DtlgPUPJ.js +0 -3
- package/public/assets/use-totp-setup-DtlgPUPJ.js.map +0 -1
- package/public/assets/useAriaLabelledBy-IIwdHUss.js +0 -2
- package/public/assets/useMutation-BWZ0G4Td.js +0 -2
- package/public/assets/useQuery-Ccv_nzQl.js +0 -2
- package/public/assets/users-B1gvPM_x.js +0 -2
- package/public/assets/users-B1gvPM_x.js.map +0 -1
- package/public/vite.svg +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e,n as t,q as n,s as r}from"./createLucideIcon-BPpAIXR_.js";import{t as i}from"./useMutation-BWZ0G4Td.js";import{P as a,nt as o}from"./shell-header-bar-JcFhS7mb.js";import{t as s}from"./shield-check-D_p8H0ni.js";import{B as c,_ as l,v as u,y as d}from"./index-CKpnrw9M.js";import{t as f}from"./auth-page-header-DgGAaIiP.js";import{t as p}from"./initial-avatar-E5DK9Igm.js";import{t as m}from"./auth-layout-CiNn2-Nb.js";var h=n();function g(){let{t:n}=e(),g=l.useSearch(),_=o(d({client_id:g.client_id,scope:g.scope})),v=i({...u,onSuccess:e=>{window.location.href=e.redirect_url}}),y=()=>{v.mutate({client_id:g.client_id,redirect_uri:g.redirect_uri,response_type:g.response_type,scope:g.scope,state:g.state,nonce:g.nonce,code_challenge:g.code_challenge,code_challenge_method:g.code_challenge_method,prompt:g.prompt,max_age:g.max_age,reauthenticated:g.reauthenticated,display:g.display,response_mode:g.response_mode,login_hint:g.login_hint,ui_locales:g.ui_locales,id_token_hint:g.id_token_hint,acr_values:g.acr_values,account_selected:g.account_selected,account_selection_state:g.account_selection_state,decision:`allow`})},b=()=>{v.mutate({client_id:g.client_id,redirect_uri:g.redirect_uri,response_type:g.response_type,scope:g.scope,state:g.state,nonce:g.nonce,code_challenge:g.code_challenge,code_challenge_method:g.code_challenge_method,prompt:g.prompt,max_age:g.max_age,reauthenticated:g.reauthenticated,display:g.display,response_mode:g.response_mode,login_hint:g.login_hint,ui_locales:g.ui_locales,id_token_hint:g.id_token_hint,acr_values:g.acr_values,account_selected:g.account_selected,account_selection_state:g.account_selection_state,decision:`deny`})},{client:x,scopes:S,user:C}=_.data;return(0,h.jsxs)(m,{width:`wide`,children:[(0,h.jsx)(f,{subtitle:n(`consent.subtitle`,{app:x.name}),title:n(`consent.title`)}),(0,h.jsx)(c.Root,{padding:`lg`,variant:`outlined`,children:(0,h.jsxs)(c.Content,{className:`flex items-center gap-tinyrack-md`,children:[(0,h.jsx)(p,{email:C.email,size:`sm`}),(0,h.jsxs)(`span`,{className:`flex min-w-0 flex-col`,children:[(0,h.jsx)(t,{color:`muted`,variant:`caption`,children:n(`consent.loggedInAs`)}),(0,h.jsx)(t,{"data-testid":`consent-user-email`,truncate:!0,variant:`body`,weight:`medium`,children:C.email})]})]})}),(0,h.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-sm`,children:[(0,h.jsx)(t,{as:`h3`,variant:`label`,children:n(`consent.permissions.title`)}),(0,h.jsx)(`ul`,{className:`flex flex-col gap-tinyrack-xs`,"data-testid":`consent-scope-list`,children:S.map(e=>(0,h.jsxs)(`li`,{className:`flex items-center gap-tinyrack-sm rounded-tinyrack-md bg-tinyrack-surface-muted px-tinyrack-md py-tinyrack-sm`,children:[(0,h.jsx)(s,{"aria-hidden":!0,className:`size-tinyrack-lg shrink-0 text-tinyrack-info-foreground`}),(0,h.jsx)(t,{variant:`body`,children:n(`consent.scope.${e.name}`,{defaultValue:e.description})})]},e.name))})]}),(0,h.jsxs)(`div`,{className:`sticky bottom-0 flex gap-tinyrack-sm border-tinyrack-border border-t-tinyrack-default bg-tinyrack-surface/80 py-tinyrack-md backdrop-blur-sm`,children:[(0,h.jsxs)(r,{appearance:`outline`,className:`flex-1`,"data-testid":`consent-deny`,intent:`neutral`,loading:v.isPending,loadingLabel:n(`consent.deny`),onClick:b,type:`button`,uiSize:`lg`,children:[(0,h.jsx)(a,{"aria-hidden":!0,className:`size-tinyrack-lg`}),n(`consent.deny`)]}),(0,h.jsxs)(r,{className:`flex-1`,"data-testid":`consent-allow`,intent:`primary`,loading:v.isPending,loadingLabel:n(`consent.allow`),onClick:y,type:`button`,uiSize:`lg`,children:[(0,h.jsx)(s,{"aria-hidden":!0,className:`size-tinyrack-lg`}),n(`consent.allow`)]})]})]})}export{g as component};
|
|
2
|
-
//# sourceMappingURL=consent-B9sQEyO8.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{J as e,U as t,Z as n,i as r,n as i,q as a,s as o}from"./createLucideIcon-BPpAIXR_.js";import{Sr as s,f as c,i as l,r as u,t as d}from"./config-DTQCUlfZ.js";import{t as f}from"./mutationOptions-DyYFUbyn.js";import{t as p}from"./useMutation-BWZ0G4Td.js";import{nt as m}from"./shell-header-bar-JcFhS7mb.js";import{t as h}from"./circle-check-6QTLhwM_.js";import{t as g}from"./auth-field-CWyXGKoC.js";import{t as _}from"./key-round-CdvHb8vT.js";import{t as v}from"./mail-D0B_1Dzd.js";import{c as y,o as b}from"./zod-C87S6Tec.js";import{F as x,L as S,N as C,S as w,V as T,j as E,p as D}from"./index-CKpnrw9M.js";import{t as O}from"./auth-page-header-DgGAaIiP.js";import{t as k}from"./alert-leqyvHOp.js";import{t as A}from"./auth-layout-CiNn2-Nb.js";import{t as j}from"./promise-OpBtq8tG.js";import{r as M,t as N}from"./standard-schema-e8gtSzGE.js";import{t as P}from"./labeled-separator-CV7nb0XW.js";var F=n(e()),I=f({mutationFn:async e=>l(await u.api.auth.email.verify.$post({json:e}))}),L=f({mutationFn:async e=>l(await u.api.auth.email.resend.$post({json:e,header:{}}))}),R=a();function z(){let{t:e}=r(),n=T(),a=s(),l=D.useSearch(),{token:u,email:f}=l,[z,B]=(0,F.useState)(!1),[V,H]=(0,F.useState)(!1),U=c.useToastManager(),{data:W}=m(d),G=(0,F.useMemo)(()=>b({token:y().min(1,e(`validation.token.required`))}),[e]),K=p({...I,onSuccess:async e=>{let t=e.user;if(a.setQueryData(w.queryKey,{user:t}),await j(),t.second_factor_required){let e=[];return W.auth.password.totp.enabled&&e.push(`totp`),W.auth.passkey.enabled&&e.push(`passkey`),e.length===1?e[0]===`totp`?n({to:`/setup/totp`,search:C(l)}):n({to:`/setup/passkey`,search:C(l)}):n({to:`/setup/2fa`,search:C(l)})}x(l)?window.location.href=E(l):B(!0)},onSettled:()=>{a.invalidateQueries({queryKey:w.queryKey})}}),q=p({...L,onSuccess:()=>{U.add({title:e(`verifyEmail.resendSuccess`),type:`success`}),H(!0),setTimeout(()=>H(!1),5e3)}}),{register:J,setError:Y,handleSubmit:X,formState:{errors:Z}}=M({defaultValues:{token:u||``},resolver:N(G)}),Q=async t=>{try{await K.mutateAsync(t)}catch{Y(`token`,{type:`manual`,message:e(`verifyEmail.error.invalidToken`)})}},$=async()=>{if(f)try{await q.mutateAsync({email:f})}catch{}};return z?(0,R.jsx)(A,{children:(0,R.jsx)(`div`,{"data-testid":`alert-success`,children:(0,R.jsx)(S,{description:(0,R.jsxs)(R.Fragment,{children:[e(`verifyEmail.success.subtitle`),(0,R.jsx)(`br`,{}),e(`verifyEmail.success.description`)]}),icon:h,title:e(`verifyEmail.success.title`),tone:`success`,children:(0,R.jsx)(o,{className:`w-full`,"data-testid":`email-verify-go-profile`,intent:`primary`,onClick:()=>n({to:`/profile`}),type:`button`,uiSize:`lg`,children:e(`verifyEmail.success.goToProfile`)})})})}):(0,R.jsxs)(A,{children:[(0,R.jsx)(O,{subtitle:e(`verifyEmail.subtitle`),title:e(`verifyEmail.title`)}),f&&(0,R.jsx)(k,{icon:v,type:`info`,children:(0,R.jsxs)(`span`,{className:`flex flex-col gap-tinyrack-3xs text-left`,children:[(0,R.jsx)(i,{variant:`body`,weight:`strong`,children:e(`register.success.subtitle`)}),(0,R.jsx)(i,{color:`muted`,variant:`caption`,children:e(`register.success.description`,{email:f})})]})}),(0,R.jsxs)(`form`,{className:`flex flex-col gap-tinyrack-lg`,onSubmit:X(Q),children:[(0,R.jsx)(g,{error:Z.token,icon:_,label:e(`verifyEmail.token.label`),placeholder:e(`verifyEmail.token.placeholder`),...J(`token`),type:`text`}),(0,R.jsx)(o,{className:`w-full`,intent:`primary`,loading:K.isPending,loadingLabel:e(`verifyEmail.submitting`),type:`submit`,uiSize:`lg`,children:e(`verifyEmail.submit`)})]}),f&&(0,R.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-md`,children:[(0,R.jsx)(P,{}),(0,R.jsx)(o,{appearance:`ghost`,className:`w-full`,"data-testid":`email-verify-resend`,disabled:q.isPending||V,intent:`neutral`,onClick:$,type:`button`,uiSize:`lg`,children:q.isPending?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(t,{uiSize:`sm`}),e(`verifyEmail.resending`)]}):e(`verifyEmail.resend`)})]})]})}export{z as component};
|
|
2
|
-
//# sourceMappingURL=email-8RKQzeig.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"email-8RKQzeig.js","names":["standardSchemaResolver","useMutation","useQueryClient","useSuspenseQuery","useNavigate","TRButton","TRSpinner","TRText","TRToast","CircleCheckIcon","KeyRoundIcon","MailIcon","useMemo","useState","useForm","useTranslation","z","AuthField","AuthOutcome","AuthPageHeader","Alert","LabeledSeparator","AuthLayout","buildAuthenticatedAuthorizeUrl","extractOAuthParams","isOAuthFlow","tick","appConfigQueryOptions","getSessionQueryOptions","resendVerificationMutationOptions","verifyEmailMutationOptions","Route","VerifyEmailFormValues","token","VerifyEmail","t","navigate","queryClient","search","useSearch","queryToken","email","verified","setVerified","resendCooldown","setResendCooldown","toast","useToastManager","data","appConfig","verifyEmailSchema","object","string","min","verifyEmailMutation","onSuccess","user","setQueryData","queryKey","second_factor_required","available_2fa_methods","SecondFactorMethod","auth","password","totp","enabled","push","passkey","length","method","to","window","location","href","onSettled","invalidateQueries","resendVerificationMutation","add","title","type","setTimeout","register","setError","handleSubmit","formState","errors","defaultValues","resolver","onSubmit","values","mutateAsync","_error","message","handleResend","isPending","component"],"sources":["../../../frontend/src/queries/verify-email.ts","../../../frontend/src/routes/verify/email/index.tsx?tsr-split=component"],"sourcesContent":["import { mutationOptions } from '@tanstack/react-query';\nimport type { InferRequestType, InferResponseType } from 'hono/client';\nimport { client, jsonOk } from '#frontend/libs/api.ts';\n\nexport type VerifyEmailParams = InferRequestType<\n (typeof client.api.auth.email.verify)['$post']\n>['json'];\n\nexport type VerifyEmailResponse = InferResponseType<\n (typeof client.api.auth.email.verify)['$post'],\n 200\n>;\n\nexport const verifyEmailMutationOptions = mutationOptions({\n mutationFn: async (values: VerifyEmailParams) => {\n const res = await client.api.auth.email.verify.$post({\n json: values,\n });\n return jsonOk(res);\n },\n});\n\nexport type ResendVerificationParams = InferRequestType<\n (typeof client.api.auth.email.resend)['$post']\n>['json'];\n\nexport type ResendVerificationResponse = InferResponseType<\n (typeof client.api.auth.email.resend)['$post'],\n 200\n>;\n\nexport const resendVerificationMutationOptions = mutationOptions({\n mutationFn: async (values: ResendVerificationParams) => {\n const res = await client.api.auth.email.resend.$post({\n json: values,\n header: {},\n });\n return jsonOk(res);\n },\n});\n","import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, redirect, useNavigate } from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRSpinner } from '@tinyrack/ui/components/spinner';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { TRToast } from '@tinyrack/ui/components/toast';\nimport { CircleCheckIcon, KeyRoundIcon, MailIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthField } from '#frontend/components/auth/auth-field.tsx';\nimport { AuthOutcome } from '#frontend/components/auth/auth-outcome.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { LabeledSeparator } from '#frontend/components/ui/labeled-separator.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\n\nimport {\n buildAuthenticatedAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n type SecondFactorMethod,\n} from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport {\n resendVerificationMutationOptions,\n verifyEmailMutationOptions,\n} from '#frontend/queries/verify-email.ts';\n\nconst SearchSchema = z.object({\n ...OAuthSearchSchema.shape,\n token: z.string().default(''),\n email: z.string().default(''),\n});\n\nexport const Route = createFileRoute('/verify/email/')({\n component: VerifyEmail,\n errorComponent: RouteErrorFallback,\n validateSearch: SearchSchema,\n beforeLoad: async ({ context }) => {\n const config = await context.queryClient.ensureQueryData(\n appConfigQueryOptions,\n );\n const isPasswordAuthEnabled = config.auth.password.enabled;\n if (!isPasswordAuthEnabled) {\n throw redirect({ to: '/login' });\n }\n },\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\ntype VerifyEmailFormValues = {\n token: string;\n};\n\nfunction VerifyEmail() {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n const { token: queryToken, email } = search;\n const [verified, setVerified] = useState(false);\n const [resendCooldown, setResendCooldown] = useState(false);\n const toast = TRToast.useToastManager();\n const { data: appConfig } = useSuspenseQuery(appConfigQueryOptions);\n\n const verifyEmailSchema = useMemo(\n () =>\n z.object({\n token: z.string().min(1, t('validation.token.required')),\n }),\n [t],\n );\n\n const verifyEmailMutation = useMutation({\n ...verifyEmailMutationOptions,\n onSuccess: async (data) => {\n const user = data.user;\n\n queryClient.setQueryData(getSessionQueryOptions.queryKey, {\n user: user,\n });\n await tick();\n\n if (user.second_factor_required) {\n const available_2fa_methods: SecondFactorMethod[] = [];\n if (appConfig.auth.password.totp.enabled) {\n available_2fa_methods.push('totp');\n }\n if (appConfig.auth.passkey.enabled) {\n available_2fa_methods.push('passkey');\n }\n\n if (available_2fa_methods.length === 1) {\n const method = available_2fa_methods[0];\n if (method === 'totp') {\n return navigate({\n to: '/setup/totp',\n search: extractOAuthParams(search),\n });\n } else {\n return navigate({\n to: '/setup/passkey',\n search: extractOAuthParams(search),\n });\n }\n } else {\n return navigate({\n to: '/setup/2fa',\n search: extractOAuthParams(search),\n });\n }\n }\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthenticatedAuthorizeUrl(search);\n } else {\n setVerified(true);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n const resendVerificationMutation = useMutation({\n ...resendVerificationMutationOptions,\n onSuccess: () => {\n toast.add({ title: t('verifyEmail.resendSuccess'), type: 'success' });\n // Separate from the message: a short cooldown so the button cannot be\n // used to spam the address with mail.\n setResendCooldown(true);\n setTimeout(() => setResendCooldown(false), 5000);\n },\n });\n\n const {\n register,\n setError,\n handleSubmit,\n formState: { errors },\n } = useForm<VerifyEmailFormValues>({\n defaultValues: {\n token: queryToken || '',\n },\n resolver: standardSchemaResolver(verifyEmailSchema),\n });\n\n const onSubmit = async (values: VerifyEmailFormValues) => {\n try {\n await verifyEmailMutation.mutateAsync(values);\n } catch (_error) {\n setError('token', {\n type: 'manual',\n message: t('verifyEmail.error.invalidToken'),\n });\n }\n };\n\n const handleResend = async () => {\n if (!email) {\n return;\n }\n try {\n await resendVerificationMutation.mutateAsync({ email });\n } catch (_error) {}\n };\n\n if (verified) {\n return (\n <AuthLayout>\n {/*\n The testid stays on a wrapper: e2e treats \"the success alert\" as the\n whole terminal state, which is now the outcome block rather than a\n banner stacked above a header.\n */}\n <div data-testid=\"alert-success\">\n <AuthOutcome\n description={\n <>\n {t('verifyEmail.success.subtitle')}\n <br />\n {t('verifyEmail.success.description')}\n </>\n }\n icon={CircleCheckIcon}\n title={t('verifyEmail.success.title')}\n tone=\"success\"\n >\n <TRButton\n className=\"w-full\"\n data-testid=\"email-verify-go-profile\"\n intent=\"primary\"\n onClick={() => navigate({ to: '/profile' })}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('verifyEmail.success.goToProfile')}\n </TRButton>\n </AuthOutcome>\n </div>\n </AuthLayout>\n );\n }\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('verifyEmail.subtitle')}\n title={t('verifyEmail.title')}\n />\n\n {email && (\n <Alert icon={MailIcon} type=\"info\">\n <span className=\"flex flex-col gap-tinyrack-3xs text-left\">\n <TRText variant=\"body\" weight=\"strong\">\n {t('register.success.subtitle')}\n </TRText>\n <TRText color=\"muted\" variant=\"caption\">\n {t('register.success.description', { email })}\n </TRText>\n </span>\n </Alert>\n )}\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <AuthField\n error={errors.token}\n icon={KeyRoundIcon}\n label={t('verifyEmail.token.label')}\n placeholder={t('verifyEmail.token.placeholder')}\n {...register('token')}\n type=\"text\"\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={verifyEmailMutation.isPending}\n loadingLabel={t('verifyEmail.submitting')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('verifyEmail.submit')}\n </TRButton>\n </form>\n\n {email && (\n <div className=\"flex flex-col gap-tinyrack-md\">\n <LabeledSeparator />\n\n <TRButton\n appearance=\"ghost\"\n className=\"w-full\"\n data-testid=\"email-verify-resend\"\n disabled={resendVerificationMutation.isPending || resendCooldown}\n intent=\"neutral\"\n onClick={handleResend}\n type=\"button\"\n uiSize=\"lg\"\n >\n {resendVerificationMutation.isPending ? (\n <>\n <TRSpinner uiSize=\"sm\" />\n {t('verifyEmail.resending')}\n </>\n ) : (\n t('verifyEmail.resend')\n )}\n </TRButton>\n </div>\n )}\n </AuthLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"email-huNZDYU9.js","names":["RouteErrorFallback","VerifyEmailFormValues","token","SplitErrorComponent","errorComponent"],"sources":["../../../frontend/src/routes/verify/email/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, redirect, useNavigate } from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRSpinner } from '@tinyrack/ui/components/spinner';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { TRToast } from '@tinyrack/ui/components/toast';\nimport { CircleCheckIcon, KeyRoundIcon, MailIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthField } from '#frontend/components/auth/auth-field.tsx';\nimport { AuthOutcome } from '#frontend/components/auth/auth-outcome.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { LabeledSeparator } from '#frontend/components/ui/labeled-separator.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\n\nimport {\n buildAuthenticatedAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n type SecondFactorMethod,\n} from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport {\n resendVerificationMutationOptions,\n verifyEmailMutationOptions,\n} from '#frontend/queries/verify-email.ts';\n\nconst SearchSchema = z.object({\n ...OAuthSearchSchema.shape,\n token: z.string().default(''),\n email: z.string().default(''),\n});\n\nexport const Route = createFileRoute('/verify/email/')({\n component: VerifyEmail,\n errorComponent: RouteErrorFallback,\n validateSearch: SearchSchema,\n beforeLoad: async ({ context }) => {\n const config = await context.queryClient.ensureQueryData(\n appConfigQueryOptions,\n );\n const isPasswordAuthEnabled = config.auth.password.enabled;\n if (!isPasswordAuthEnabled) {\n throw redirect({ to: '/login' });\n }\n },\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\ntype VerifyEmailFormValues = {\n token: string;\n};\n\nfunction VerifyEmail() {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n const { token: queryToken, email } = search;\n const [verified, setVerified] = useState(false);\n const [resendCooldown, setResendCooldown] = useState(false);\n const toast = TRToast.useToastManager();\n const { data: appConfig } = useSuspenseQuery(appConfigQueryOptions);\n\n const verifyEmailSchema = useMemo(\n () =>\n z.object({\n token: z.string().min(1, t('validation.token.required')),\n }),\n [t],\n );\n\n const verifyEmailMutation = useMutation({\n ...verifyEmailMutationOptions,\n onSuccess: async (data) => {\n const user = data.user;\n\n queryClient.setQueryData(getSessionQueryOptions.queryKey, {\n user: user,\n });\n await tick();\n\n if (user.second_factor_required) {\n const available_2fa_methods: SecondFactorMethod[] = [];\n if (appConfig.auth.password.totp.enabled) {\n available_2fa_methods.push('totp');\n }\n if (appConfig.auth.passkey.enabled) {\n available_2fa_methods.push('passkey');\n }\n\n if (available_2fa_methods.length === 1) {\n const method = available_2fa_methods[0];\n if (method === 'totp') {\n return navigate({\n to: '/setup/totp',\n search: extractOAuthParams(search),\n });\n } else {\n return navigate({\n to: '/setup/passkey',\n search: extractOAuthParams(search),\n });\n }\n } else {\n return navigate({\n to: '/setup/2fa',\n search: extractOAuthParams(search),\n });\n }\n }\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthenticatedAuthorizeUrl(search);\n } else {\n setVerified(true);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n const resendVerificationMutation = useMutation({\n ...resendVerificationMutationOptions,\n onSuccess: () => {\n toast.add({ title: t('verifyEmail.resendSuccess'), type: 'success' });\n // Separate from the message: a short cooldown so the button cannot be\n // used to spam the address with mail.\n setResendCooldown(true);\n setTimeout(() => setResendCooldown(false), 5000);\n },\n });\n\n const {\n register,\n setError,\n handleSubmit,\n formState: { errors },\n } = useForm<VerifyEmailFormValues>({\n defaultValues: {\n token: queryToken || '',\n },\n resolver: standardSchemaResolver(verifyEmailSchema),\n });\n\n const onSubmit = async (values: VerifyEmailFormValues) => {\n try {\n await verifyEmailMutation.mutateAsync(values);\n } catch (_error) {\n setError('token', {\n type: 'manual',\n message: t('verifyEmail.error.invalidToken'),\n });\n }\n };\n\n const handleResend = async () => {\n if (!email) {\n return;\n }\n try {\n await resendVerificationMutation.mutateAsync({ email });\n } catch (_error) {}\n };\n\n if (verified) {\n return (\n <AuthLayout>\n {/*\n The testid stays on a wrapper: e2e treats \"the success alert\" as the\n whole terminal state, which is now the outcome block rather than a\n banner stacked above a header.\n */}\n <div data-testid=\"alert-success\">\n <AuthOutcome\n description={\n <>\n {t('verifyEmail.success.subtitle')}\n <br />\n {t('verifyEmail.success.description')}\n </>\n }\n icon={CircleCheckIcon}\n title={t('verifyEmail.success.title')}\n tone=\"success\"\n >\n <TRButton\n className=\"w-full\"\n data-testid=\"email-verify-go-profile\"\n intent=\"primary\"\n onClick={() => navigate({ to: '/profile' })}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('verifyEmail.success.goToProfile')}\n </TRButton>\n </AuthOutcome>\n </div>\n </AuthLayout>\n );\n }\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('verifyEmail.subtitle')}\n title={t('verifyEmail.title')}\n />\n\n {email && (\n <Alert icon={MailIcon} type=\"info\">\n <span className=\"flex flex-col gap-tinyrack-3xs text-left\">\n <TRText variant=\"body\" weight=\"strong\">\n {t('register.success.subtitle')}\n </TRText>\n <TRText color=\"muted\" variant=\"caption\">\n {t('register.success.description', { email })}\n </TRText>\n </span>\n </Alert>\n )}\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <AuthField\n error={errors.token}\n icon={KeyRoundIcon}\n label={t('verifyEmail.token.label')}\n placeholder={t('verifyEmail.token.placeholder')}\n {...register('token')}\n type=\"text\"\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={verifyEmailMutation.isPending}\n loadingLabel={t('verifyEmail.submitting')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('verifyEmail.submit')}\n </TRButton>\n </form>\n\n {email && (\n <div className=\"flex flex-col gap-tinyrack-md\">\n <LabeledSeparator />\n\n <TRButton\n appearance=\"ghost\"\n className=\"w-full\"\n data-testid=\"email-verify-resend\"\n disabled={resendVerificationMutation.isPending || resendCooldown}\n intent=\"neutral\"\n onClick={handleResend}\n type=\"button\"\n uiSize=\"lg\"\n >\n {resendVerificationMutation.isPending ? (\n <>\n <TRSpinner uiSize=\"sm\" />\n {t('verifyEmail.resending')}\n </>\n ) : (\n t('verifyEmail.resend')\n )}\n </TRButton>\n </div>\n )}\n </AuthLayout>\n );\n}\n"],"mappings":"wCAiEE,IAAAG,EA5COH"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e,n as t,q as n,s as r}from"./createLucideIcon-BPpAIXR_.js";import{Sn as i,wn as a}from"./config-DTQCUlfZ.js";import{L as o,R as s,z as c}from"./index-CKpnrw9M.js";import{t as l}from"./auth-layout-CiNn2-Nb.js";import{n as u,t as d}from"./auth-footer-Cz5ivsDc.js";var f=n();function p(){let{t:n}=e(),p=a({from:`/error/`}),m=p.code||`UNKNOWN_ERROR`;return(0,f.jsxs)(l,{children:[(0,f.jsxs)(o,{description:p.message||n(`error.defaultMessage`),icon:s,title:n(`error.subtitle`),tone:`danger`,children:[(0,f.jsxs)(t,{color:`muted`,variant:`caption`,children:[n(`error.codeLabel`),` `,(0,f.jsx)(`span`,{className:`font-tinyrack-mono`,"data-testid":`error-code`,children:m})]}),(0,f.jsx)(c,{className:`w-full`,intent:`primary`,render:(0,f.jsx)(i,{to:`/login`}),uiSize:`lg`,children:n(`error.goToLogin`)}),(0,f.jsx)(r,{appearance:`ghost`,className:`w-full`,intent:`neutral`,onClick:()=>window.history.back(),type:`button`,uiSize:`lg`,children:n(`error.goBack`)})]}),(0,f.jsx)(d,{children:(0,f.jsx)(u,{link:(0,f.jsx)(`a`,{href:`mailto:support@example.com`,children:n(`error.footer.contactSupport`)}),text:n(`error.footer.needHelp`)})})]})}export{p as component};
|
|
2
|
-
//# sourceMappingURL=error-BYe3gUMO.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error-BYe3gUMO.js","names":["Link","useSearch","TRButton","TRLinkButton","TRText","CircleAlertIcon","useTranslation","AuthFooter","AuthFooterLink","AuthOutcome","AuthLayout","ErrorPage","t","search","from","errorCode","code","errorMessage","message","window","history","back","component"],"sources":["../../../frontend/src/routes/error/index.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, Link, useSearch } from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRLinkButton } from '@tinyrack/ui/components/link-button';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { CircleAlertIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthOutcome } from '#frontend/components/auth/auth-outcome.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\n\nconst errorSearchSchema = z.object({\n code: z.string().optional(),\n message: z.string().optional(),\n});\n\nexport const Route = createFileRoute('/error/')({\n component: ErrorPage,\n validateSearch: errorSearchSchema,\n});\n\nfunction ErrorPage() {\n const { t } = useTranslation();\n const search = useSearch({ from: '/error/' });\n\n const errorCode = search.code || 'UNKNOWN_ERROR';\n const errorMessage = search.message || t('error.defaultMessage');\n\n return (\n <AuthLayout>\n {/*\n Nothing to do here but report what happened, so this is the shared\n terminal-state composition rather than an alert stacked on a header.\n */}\n <AuthOutcome\n description={errorMessage}\n icon={CircleAlertIcon}\n title={t('error.subtitle')}\n tone=\"danger\"\n >\n {/*\n Mono on the code itself, not the label: a font utility on `TRText`\n loses to the component's own per-variant `font-family` rule, and only\n the identifier needs fixed-width anyway.\n */}\n <TRText color=\"muted\" variant=\"caption\">\n {t('error.codeLabel')}{' '}\n <span className=\"font-tinyrack-mono\" data-testid=\"error-code\">\n {errorCode}\n </span>\n </TRText>\n\n <TRLinkButton\n className=\"w-full\"\n intent=\"primary\"\n render={<Link to=\"/login\" />}\n uiSize=\"lg\"\n >\n {t('error.goToLogin')}\n </TRLinkButton>\n <TRButton\n appearance=\"ghost\"\n className=\"w-full\"\n intent=\"neutral\"\n onClick={() => window.history.back()}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('error.goBack')}\n </TRButton>\n </AuthOutcome>\n\n <AuthFooter>\n <AuthFooterLink\n link={\n <a href=\"mailto:support@example.com\">\n {t('error.footer.contactSupport')}\n </a>\n }\n text={t('error.footer.needHelp')}\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"mappings":"6RAwBA,SAASW,GAAY,CACnB,GAAM,CAAEC,KAAMN,EAAe,EACvBO,EAASZ,EAAU,CAAEa,KAAM,SAAU,CAAC,EAEtCC,EAAYF,EAAOG,MAAQ,gBAGjC,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAA,SAAA,EAKE,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,YATeH,EAAOK,SAAWN,EAAE,sBAAsB,EAUzD,KAAMP,EACN,MAAOO,EAAE,gBAAgB,EACzB,KAAK,kBAJP,EAWE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAQ,MAAM,QAAQ,QAAQ,mBAA9B,CACGA,EAAE,iBAAiB,EAAG,KACvB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,qBAAqB,cAAY,sBAC9CG,CACG,CAAA,CACA,KAER,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,UAAU,SACV,OAAO,UACP,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,QAAQ,CAAA,EACzB,OAAO,cAENH,EAAE,iBAAiB,CACR,CAAA,GACd,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,WAAW,QACX,UAAU,SACV,OAAO,UACP,YAAeO,OAAOC,QAAQC,KAAK,EACnC,KAAK,SACL,OAAO,cAENT,EAAE,cAAc,CACT,CAAA,CACC,KAEb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,KAAK,sCACLA,EAAE,6BAA6B,CAC/B,CAAA,EAEL,KAAMA,EAAE,uBAAuB,CAAE,CAAA,CAEzB,CAAA,CACF,CAAA,CAAA,CAEhB"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{G as e,J as t,S as n,Z as r,_ as i,b as a,c as o,d as s,q as c,v as l,x as u,y as d}from"./createLucideIcon-BPpAIXR_.js";import{P as f,Xt as p,Y as m,_t as h,bn as g,pt as _,un as v,xn as y}from"./config-DTQCUlfZ.js";import{A as b,C as x,D as S,E as C,O as w,S as T,T as E,Z as D,b as O,h as k,k as A,w as j,x as M}from"./shell-header-bar-JcFhS7mb.js";import{n as N,t as P}from"./FieldItemContext-BeNfhOsU.js";var F=c(),I=r(t(),1),L=I.createContext(void 0);function R(e=!1){let t=I.useContext(L);if(!t&&!e)throw Error(l(86));return t}var z=function(e){let t=j(),r=e.controlId===void 0?t:e.controlId,[i,a]=I.useState(r),[o,s]=I.useState(e.labelId),[c,l]=I.useState([]),d=n(()=>new Map),{messageIds:f}=x(),p=u((e,t)=>{let n=d.current;if(t===void 0){n.delete(e);return}n.set(e,t),a(e=>{if(n.size===0)return;let t;for(let r of n.values()){if(e!==void 0&&r===e)return e;t===void 0&&(t=r)}return t})}),m=I.useCallback(e=>{let t=e[`aria-describedby`]?e[`aria-describedby`].split(` `):[];return t.push(...f,...c),{...e,"aria-describedby":Array.from(new Set(t)).join(` `)||void 0}},[f,c]),h=I.useMemo(()=>({controlId:i,registerControlId:p,labelId:o,setLabelId:s,messageIds:c,setMessageIds:l,getDescriptionProps:m}),[i,p,o,s,c,l,m]);return(0,F.jsx)(T.Provider,{value:h,children:e.children})};function B(e,t){return{...e,state:{...e.state,valid:!t&&e.state.valid}}}var V=Object.keys(w);function H(e,t){return e.matches(`:disabled`)?!1:!t||e.form===t?!0:e.form===null&&!e.hasAttribute(`form`)}function U(e,t){let n=null;for(let r of e.keys())if(H(r,t)){if(!r.validity.valid)return r;n??=r}return n}function W(e,t){for(let e of t.keys())e.setCustomValidity(``);e?.setCustomValidity(``)}function ee(e){let{elementRef:t,formRef:r}=O(),{setValidityData:i,validate:a,validityData:o,validationDebounceTime:c,invalid:l,markedDirtyRef:f,state:p,shouldValidateOnChange:m,registeredFieldIdRef:h}=e,{controlId:g,getDescriptionProps:_}=x(),y=v(),b=I.useRef(null),S=n(()=>new Map).current,C=I.useRef(0),T=I.useCallback((e,t)=>(S.set(e,t),()=>{S.delete(e)}),[S]),E=u(()=>{let e=U(S,t.current);return e&&S.get(e)?.controlRef.current||null}),D=u(async(e,n=!1)=>{C.current+=1;let s=C.current;function c(e,t=l){let n=h.current??g;if(n==null)return;let i=r.current.fields.get(n);if(!i)return;let a=B(e,t);r.current.fields.set(n,{...i,validityData:a})}function u(t,n){let r={value:e,state:{...w,valid:!0},error:``,errors:[],initialValue:o.initialValue};W(t,S),c(r,n),i(r)}let d=S.size>0?U(S,t.current):b.current;if(n){if(p.valid!==!1||!d)return;let e=d.validity;if(!e.valueMissing){u(d,!1);return}for(let t of V)if(t!==`valid`&&t!==`valueMissing`&&t!==`customError`&&e[t])return}function _(e){let t=V.reduce((t,n)=>(t[n]=e.validity[n],t),{}),n=!1;for(let e of V)if(e!==`valid`){if(e===`valueMissing`&&t[e])n=!0;else if(t[e])return t}return n&&!f.current&&(t.valid=!0,t.valueMissing=!1),t}y.clear();let v=null,x=[],T=d?_(d):{...w,valid:!0},E,D=m();if(d&&d.validationMessage&&!D)E=d.validationMessage,x=[d.validationMessage];else{let t=Array.from(r.current.fields.values()).reduce((e,t)=>(t.name&&(e[t.name]=t.getValue()),e),{}),n=a(e,t);if(typeof n==`object`&&n&&`then`in n){if(v=await n,s!==C.current)return}else v=n;v===null?D&&(W(d,S),T.customError=!1,d&&d.validationMessage?(E=d.validationMessage,x=[d.validationMessage]):(!d||d.validity.valid)&&!T.valid&&(T.valid=!0)):(T.valid=!1,T.customError=!0,Array.isArray(v)?(x=v,d?.setCustomValidity(v.join(`
|
|
2
|
-
`))):v&&(x=[v],d?.setCustomValidity(v)))}let O={value:e,state:T,error:E??(Array.isArray(v)?v[0]:v??``),errors:x,initialValue:o.initialValue};c(O),i(O)}),k=u(e=>{y.clear();let t=m();t&&e!==``&&c?(C.current+=1,y.start(c,()=>{D(e)})):D(e,!t)}),A=I.useCallback((e,t={})=>d(_(t),p.valid===!1&&!p.disabled&&!e?{"aria-invalid":!0}:s),[_,p.disabled,p.valid]);return I.useMemo(()=>({getValidationProps:A,inputRef:b,registeredInputs:S,registerInput:T,getInputControl:E,commit:D,change:k}),[A,S,T,E,D,k])}function te(e){let{commit:t,invalid:n,markedDirtyRef:r,name:i,setRegisteredFieldName:o,registeredFieldIdRef:s,setValidityData:c,validityData:l}=e,{formRef:d}=O(),f=I.useRef(null),p=I.useRef(null),m=I.useRef(!1),h=u(()=>{let e=p.current;if(e)return e.getValue?e.getValue():e.value});function g(e){return e.value===void 0?h():e.value}let _=u(()=>{let e=p.current;if(r.current=!0,!e){t(l.value);return}t(g(e))});function v(){let e=p.current;!e||!e.id||d.current.fields.set(e.id,{getValue:h,name:i??e.name,controlRef:e.controlRef,validityData:B(l,n),validate:_})}function y(e=p.current?.id){e&&d.current.fields.delete(e)}function b(e){if(m.current)return;m.current=!0;let t=g(e);c(e=>e.initialValue===t?e:{...e,initialValue:t})}return a(()=>{let e=p.current;!e||!e.id||(o(i?void 0:e.name),d.current.fields.set(e.id,{getValue:h,name:i??e.name,controlRef:e.controlRef,validityData:B(l,n),validate:_}))},[d,h,n,i,o,_,l]),a(()=>{let e=d.current.fields;return()=>{let t=p.current?.id;t&&e.delete(t)}},[d]),[_,u((e,t)=>{if(!t){f.current===e&&(f.current=null,y(),p.current=null,o(void 0),s.current=void 0);return}let n=p.current?.id;f.current=e,p.current=t,i||o(t.name),s.current=t.id,n&&n!==t.id&&y(n),b(t),v()})]}var G=I.forwardRef(function(e,t){let{errors:n,validationMode:r,submitAttemptedRef:i}=O(),{render:s,className:c,validate:l,validationDebounceTime:d=0,validationMode:f=r,name:p,disabled:m=!1,invalid:h,dirty:g,touched:_,actionsRef:v,style:y,...b}=e,x=R(!0)?.disabled,S=u(l||(()=>null)),T=x||m,[E,D]=I.useState(!1),[k,j]=I.useState(!1),[M,N]=I.useState(!1),[P,L]=I.useState(!1),z=g??k,B=_??E,V=I.useRef(z),H=I.useRef(void 0),[U,W]=I.useState(),G=p??U;a(()=>{g!==void 0&&(V.current=g)},[g]);let K=u(e=>{g===void 0&&(e&&(V.current=!0),j(e))}),ne=u(e=>{_===void 0&&D(e)}),q=u(()=>f===`onChange`||f===`onSubmit`&&i.current),J=G&&Object.hasOwn(n,G)?n[G]:null,re=!!(Array.isArray(J)?J.length:J),Y=h===!0||re,[X,Z]=I.useState({state:w,error:``,errors:[],value:null,initialValue:null}),ie=!Y&&(T?null:X.state.valid),Q=I.useMemo(()=>({disabled:T,touched:B,dirty:z,valid:ie,filled:M,focused:P}),[T,B,z,ie,M,P]),$=ee({setValidityData:Z,validate:S,validityData:X,validationDebounceTime:d,invalid:Y,markedDirtyRef:V,state:Q,shouldValidateOnChange:q,registeredFieldIdRef:H}),[ae,oe]=te({commit:$.commit,invalid:Y,markedDirtyRef:V,name:p,setRegisteredFieldName:W,registeredFieldIdRef:H,setValidityData:Z,validityData:X});I.useImperativeHandle(v,()=>({validate:ae}),[ae]);let se=I.useMemo(()=>({invalid:Y,name:G,validityData:X,setValidityData:Z,disabled:T,setTouched:ne,setDirty:K,setFilled:N,setFocused:L,validationMode:f,shouldValidateOnChange:q,state:Q,registerFieldControl:oe,validation:$}),[Y,G,X,T,ne,K,N,L,f,q,Q,oe,$]),ce=o(`div`,e,{ref:t,state:Q,props:b,stateAttributesMapping:A});return(0,F.jsx)(C.Provider,{value:se,children:ce})}),K=I.forwardRef(function(e,t){return(0,F.jsx)(z,{children:(0,F.jsx)(G,{...e,ref:t})})}),ne=I.forwardRef(function(e,t){let{render:n,className:r,style:i,id:a,nativeLabel:s=!0,...c}=e,l=S(!1),u=N(),{labelId:d}=x(),f={...l.state,disabled:l.disabled||u.disabled},p=I.useRef(null),m=k({id:d??a,native:s});return o(`label`,e,{ref:[t,p],state:f,props:[m,c],stateAttributesMapping:A})}),q={...A,...h},J=I.forwardRef(function(e,t){let{render:n,id:r,className:i,match:s,style:c,...l}=e,u=j(r),{validityData:d,state:f,name:p}=S(!1),{setMessageIds:m}=x(),{errors:h}=O(),g=p&&Object.hasOwn(h,p)?h[p]:null,v=!!(Array.isArray(g)?g.length:g),y=typeof s==`string`,b=!1;b=s===!0?!0:f.disabled?!1:y?!!d.state[s]:v||d.state.valid===!1;let{mounted:C,transitionStatus:w,setMounted:T}=D(b);a(()=>{if(!(!b||!u))return m(e=>e.concat(u)),()=>{m(e=>e.filter(e=>e!==u))}},[b,u,m]);let E=I.useRef(null),[k,A]=I.useState(null),[M,N]=I.useState(null),P=d.error;!y&&v?P=g:d.errors.length>1&&(P=d.errors);let L=P;Array.isArray(P)&&(L=P.length>1?(0,F.jsx)(`ul`,{children:P.map(e=>(0,F.jsx)(`li`,{children:e},e))}):P[0]);let R=Array.isArray(P)?JSON.stringify(P):P;b&&R!==M&&(N(R),A(L)),_({open:b,ref:E,onComplete(){b||T(!1)}});let z={...f,transitionStatus:w},B=o(`div`,e,{ref:[t,E],state:z,props:[{id:u,children:b?L:k},l],stateAttributesMapping:q,enabled:C});return C?B:null}),re=I.forwardRef(function(e,t){let{render:n,id:r,className:i,style:s,...c}=e,l=j(r),u=S(!1),d=N(),{setMessageIds:f}=x(),p={...u.state,disabled:u.disabled||d.disabled};return a(()=>{if(l)return f(e=>e.concat(l)),()=>{f(e=>e.filter(e=>e!==l))}},[l,f]),o(`p`,e,{ref:t,state:p,props:[{id:l},c],stateAttributesMapping:A})}),Y=I.forwardRef(function(e,t){let{render:n,className:r,id:s,name:c,value:l,disabled:d=!1,onValueChange:h,defaultValue:g,autoFocus:_=!1,style:v,...y}=e,{state:C,name:w,disabled:T,setTouched:D,setDirty:k,validityData:j,setFocused:N,setFilled:P,validationMode:F,validation:L}=S(),{clearErrors:R}=O(),z=T||d,B=w??c,V={...C,disabled:z},{labelId:H}=x(),U=M({id:s});a(()=>{let e=l!=null;L.inputRef.current?.value||e&&l!==``?P(!0):e&&l===``&&P(!1)},[L.inputRef,P,l]);let W=I.useRef(null);a(()=>{_&&W.current===p(i(W.current))&&N(!0)},[_,N]);let[ee]=b({controlled:l,default:g,name:`FieldControl`,state:`value`}),te=l!==void 0,G=te?ee:void 0,K=u(()=>L.inputRef.current?.value);return E(L.inputRef,U,G,K,!z,c),o(`input`,e,{ref:[t,W],state:V,props:[{id:U,disabled:z,name:B,ref:L.inputRef,"aria-labelledby":H,autoFocus:_,...te?{value:G}:{defaultValue:g},onChange(e){let t=e.currentTarget.value;h?.(t,f(m,e.nativeEvent)),k(t!==(j.initialValue??``)),P(t!==``),e.nativeEvent.defaultPrevented||(R(B),L.change(t))},onFocus(){N(!0)},onBlur(e){D(!0),N(!1),F===`onBlur`&&L.commit(e.currentTarget.value)},onKeyDown(e){e.currentTarget.tagName===`INPUT`&&e.key===`Enter`&&(D(!0),L.commit(e.currentTarget.value))}},y,e=>L.getValidationProps(z,e)],stateAttributesMapping:A})}),X=function(e){let{children:t}=e,{validityData:n,invalid:r}=S(!1),i=I.useMemo(()=>B(n,r),[n,r]),{transitionStatus:a}=D(i.state.valid===!1),o=I.useMemo(()=>({...i,validity:i.state,transitionStatus:a}),[i,a]);return(0,F.jsx)(I.Fragment,{children:t(o)})},Z=I.forwardRef(function(e,t){let{render:n,className:r,style:i,disabled:a=!1,...s}=e,{state:c,disabled:l}=S(!1),u=l||a,d={...c,disabled:u},f=I.useMemo(()=>({disabled:u}),[u]),p=o(`div`,e,{ref:t,state:d,props:s,stateAttributesMapping:A});return(0,F.jsx)(z,{children:(0,F.jsx)(P.Provider,{value:f,children:p})})});function ie({className:t,uiSize:n=`md`,...r}){return y(),(0,F.jsx)(Y,{...r,className:e(`tr-field-control`,t),"data-ui-size":n})}var Q=g(re,`tr-field-description`),$=g(J,`tr-field-error`),ae=g(Z,`tr-field-item`),oe=g(ne,`tr-label`);function se({className:t,...n}){return(0,F.jsx)(K,{...n,className:e(`tr-field`,t)})}var ce={Root:se,Label:oe,Error:$,Description:Q,Control:ie,Validity:g(X,`tr-field-validity`),Item:ae};export{Y as n,ce as t};
|
|
3
|
-
//# sourceMappingURL=field-BMT214_m.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"field-BMT214_m.js","names":["_formatErrorMessage","REASONS.none","Field.Control","Field.Description","Field.Error","Field.Item","Field.Label","Field.Root","Field.Validity"],"sources":["../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/fieldset/root/FieldsetRootContext.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/internals/labelable-provider/LabelableProvider.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/field/utils/getCombinedFieldValidityData.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/field/root/useFieldValidation.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/internals/field-register-control/useFieldControlRegistration.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/field/root/FieldRoot.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/field/label/FieldLabel.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/field/error/FieldError.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/field/description/FieldDescription.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/field/control/FieldControl.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/field/validity/FieldValidity.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/field/item/FieldItem.mjs","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/field-control.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/field-description.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/field-error.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/field-item.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/field-label.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/field-root.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/field-validity.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/index.js"],"sourcesContent":["'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nexport const FieldsetRootContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") FieldsetRootContext.displayName = \"FieldsetRootContext\";\nexport function useFieldsetRootContext(optional = false) {\n const context = React.useContext(FieldsetRootContext);\n if (!context && !optional) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: FieldsetRootContext is missing. Fieldset parts must be placed within <Fieldset.Root>.' : _formatErrorMessage(86));\n }\n return context;\n}","'use client';\n\nimport * as React from 'react';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useRefWithInit } from '@base-ui/utils/useRefWithInit';\nimport { useBaseUiId } from \"../useBaseUiId.mjs\";\nimport { LabelableContext, useLabelableContext } from \"./LabelableContext.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const LabelableProvider = function LabelableProvider(props) {\n const defaultId = useBaseUiId();\n const initialControlId = props.controlId === undefined ? defaultId : props.controlId;\n const [controlId, setControlIdState] = React.useState(initialControlId);\n const [labelId, setLabelId] = React.useState(props.labelId);\n const [messageIds, setMessageIds] = React.useState([]);\n const registrationsRef = useRefWithInit(() => new Map());\n const {\n messageIds: parentMessageIds\n } = useLabelableContext();\n const registerControlId = useStableCallback((source, nextId) => {\n const registrations = registrationsRef.current;\n if (nextId === undefined) {\n registrations.delete(source);\n return;\n }\n registrations.set(source, nextId);\n\n // Only flush when registering, not when unregistering.\n // This prevents loops during rapid unmount/remount cycles (e.g. React Activity).\n // The next registration will pick up the correct state.\n setControlIdState(prev => {\n if (registrations.size === 0) {\n return undefined;\n }\n let nextControlId;\n for (const id of registrations.values()) {\n if (prev !== undefined && id === prev) {\n return prev;\n }\n if (nextControlId === undefined) {\n nextControlId = id;\n }\n }\n return nextControlId;\n });\n });\n const getDescriptionProps = React.useCallback(externalProps => {\n const ids = externalProps['aria-describedby'] ? externalProps['aria-describedby'].split(' ') : [];\n ids.push(...parentMessageIds, ...messageIds);\n return {\n ...externalProps,\n 'aria-describedby': Array.from(new Set(ids)).join(' ') || undefined\n };\n }, [parentMessageIds, messageIds]);\n const contextValue = React.useMemo(() => ({\n controlId,\n registerControlId,\n labelId,\n setLabelId,\n messageIds,\n setMessageIds,\n getDescriptionProps\n }), [controlId, registerControlId, labelId, setLabelId, messageIds, setMessageIds, getDescriptionProps]);\n return /*#__PURE__*/_jsx(LabelableContext.Provider, {\n value: contextValue,\n children: props.children\n });\n};\nif (process.env.NODE_ENV !== \"production\") LabelableProvider.displayName = \"LabelableProvider\";","/**\n * Combines the field's client-side, stateful validity data with the external invalid state to\n * determine the field's true validity.\n */\nexport function getCombinedFieldValidityData(validityData, invalid) {\n return {\n ...validityData,\n state: {\n ...validityData.state,\n valid: !invalid && validityData.state.valid\n }\n };\n}","'use client';\n\nimport * as React from 'react';\nimport { EMPTY_OBJECT } from '@base-ui/utils/empty';\nimport { useTimeout } from '@base-ui/utils/useTimeout';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useRefWithInit } from '@base-ui/utils/useRefWithInit';\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { mergeProps } from \"../../merge-props/index.mjs\";\nimport { DEFAULT_VALIDITY_STATE } from \"../../internals/field-constants/constants.mjs\";\nimport { useFormContext } from \"../../internals/form-context/FormContext.mjs\";\nimport { getCombinedFieldValidityData } from \"../utils/getCombinedFieldValidityData.mjs\";\nconst validityKeys = Object.keys(DEFAULT_VALIDITY_STATE);\n/**\n * Whether an input participates in the surrounding Base UI Form. Inputs that are effectively\n * disabled, or whose `form` attribute explicitly associates them with another form, are excluded.\n * DOM position only matters when it associates the input with a different form. Otherwise, field\n * registration is context-driven, so portaled inputs (for example inside a dialog) still belong to\n * the form for both validation and values projected into `onFormSubmit`.\n */\nexport function isEligibleInput(input, formElement) {\n if (input.matches(':disabled')) {\n return false;\n }\n if (!formElement || input.form === formElement) {\n return true;\n }\n\n // React context crosses portal boundaries. An unassociated portaled input still participates in\n // contextual validation, unless an explicit `form` attribute opts it out of the surrounding Form.\n return input.form === null && !input.hasAttribute('form');\n}\n\n/**\n * Picks the input whose native validity should represent a field that owns several inputs (such as a\n * checkbox or radio group). Prefers the first eligible currently-invalid input, where \"first\" follows\n * registration order (mount order), and otherwise returns the first eligible input.\n */\nfunction findRepresentativeInput(inputs, formElement) {\n let fallback = null;\n for (const input of inputs.keys()) {\n if (!isEligibleInput(input, formElement)) {\n continue;\n }\n if (!input.validity.valid) {\n return input;\n }\n fallback ??= input;\n }\n return fallback;\n}\nfunction clearCustomValidity(element, inputs) {\n for (const input of inputs.keys()) {\n input.setCustomValidity('');\n }\n element?.setCustomValidity('');\n}\nexport function useFieldValidation(params) {\n const {\n elementRef,\n formRef\n } = useFormContext();\n const {\n setValidityData,\n validate,\n validityData,\n validationDebounceTime,\n invalid,\n markedDirtyRef,\n state,\n shouldValidateOnChange,\n registeredFieldIdRef\n } = params;\n const {\n controlId,\n getDescriptionProps\n } = useLabelableContext();\n const timeout = useTimeout();\n const inputRef = React.useRef(null);\n const registeredInputs = useRefWithInit(() => new Map()).current;\n const validationCommitIdRef = React.useRef(0);\n\n // Groups register several inputs against a single field so focus, validation, and form-value\n // projection can use the same live controls. This also ensures a `required` checkbox can't be\n // satisfied by another input in the group, matching native per-checkbox behavior.\n const registerInput = React.useCallback((element, registration) => {\n registeredInputs.set(element, registration);\n return () => {\n registeredInputs.delete(element);\n };\n }, [registeredInputs]);\n const getInputControl = useStableCallback(() => {\n const element = findRepresentativeInput(registeredInputs, elementRef.current);\n return element && registeredInputs.get(element)?.controlRef.current || null;\n });\n const commit = useStableCallback(async (value, revalidate = false) => {\n validationCommitIdRef.current += 1;\n const validationCommitId = validationCommitIdRef.current;\n function updateRegisteredFieldValidity(nextValidityData, externalInvalid = invalid) {\n const fieldId = registeredFieldIdRef.current ?? controlId;\n if (fieldId == null) {\n return;\n }\n const currentFieldData = formRef.current.fields.get(fieldId);\n if (!currentFieldData) {\n return;\n }\n const validityDataWithFormErrors = getCombinedFieldValidityData(nextValidityData, externalInvalid);\n formRef.current.fields.set(fieldId, {\n ...currentFieldData,\n validityData: validityDataWithFormErrors\n });\n }\n function publishAllValid(input, externalInvalid) {\n const nextValidityData = {\n value,\n state: {\n ...DEFAULT_VALIDITY_STATE,\n valid: true\n },\n error: '',\n errors: [],\n initialValue: validityData.initialValue\n };\n clearCustomValidity(input, registeredInputs);\n updateRegisteredFieldValidity(nextValidityData, externalInvalid);\n setValidityData(nextValidityData);\n }\n\n // A field can own several inputs (such as a checkbox or radio group), but only the last-mounted\n // one wins the shared `inputRef`. Validate against the registry instead so every input counts;\n // `inputRef` is the fallback only when no inputs are registered.\n const element = registeredInputs.size > 0 ? findRepresentativeInput(registeredInputs, elementRef.current) : inputRef.current;\n // A field with no eligible input has no native constraint, but its custom validator still\n // applies to the logical value at the configured validation boundary.\n\n if (revalidate) {\n if (state.valid !== false || !element) {\n return;\n }\n const currentNativeValidity = element.validity;\n if (!currentNativeValidity.valueMissing) {\n // The 'valueMissing' (required) condition has been resolved by the user typing.\n // Temporarily mark the field as valid for this onChange event.\n // Other native errors (e.g., typeMismatch) will be caught by full validation on blur or submit.\n // The required value is now present; ignore stale external invalid state for this pass.\n publishAllValid(element, false);\n return;\n }\n\n // A stale custom error can coexist with valueMissing, but defer any other native errors.\n for (const key of validityKeys) {\n if (key !== 'valid' && key !== 'valueMissing' && key !== 'customError' && currentNativeValidity[key]) {\n return;\n }\n }\n\n // Value is still missing: publish the current native state so valueMissing and the changed\n // value are observable immediately. Full custom validation still waits for its boundary.\n }\n function getState(el) {\n const computedState = validityKeys.reduce((acc, key) => {\n acc[key] = el.validity[key];\n return acc;\n }, {});\n let hasOnlyValueMissingError = false;\n for (const key of validityKeys) {\n if (key === 'valid') {\n continue;\n }\n if (key === 'valueMissing' && computedState[key]) {\n hasOnlyValueMissingError = true;\n } else if (computedState[key]) {\n return computedState;\n }\n }\n\n // Only make `valueMissing` mark the field invalid if it's been changed\n // to reduce error noise.\n if (hasOnlyValueMissingError && !markedDirtyRef.current) {\n computedState.valid = true;\n computedState.valueMissing = false;\n }\n return computedState;\n }\n timeout.clear();\n let result = null;\n let validationErrors = [];\n\n // With no representative input the field carries no native constraint, so start from an\n // all-valid native state and let the custom `validate` result below decide the outcome.\n const nextState = element ? getState(element) : {\n ...DEFAULT_VALIDITY_STATE,\n valid: true\n };\n let defaultValidationMessage;\n const isValidatingOnChange = shouldValidateOnChange();\n if (element && element.validationMessage && !isValidatingOnChange) {\n // not validating on change, if there is a `validationMessage` from\n // native validity, set errors and skip calling the custom validate fn\n defaultValidationMessage = element.validationMessage;\n validationErrors = [element.validationMessage];\n } else {\n // call the validate function because either\n // - validating on change, or\n // - native constraint validations passed, custom validity check is next\n const formValues = Array.from(formRef.current.fields.values()).reduce((acc, field) => {\n if (field.name) {\n acc[field.name] = field.getValue();\n }\n return acc;\n }, {});\n const resultOrPromise = validate(value, formValues);\n if (typeof resultOrPromise === 'object' && resultOrPromise !== null && 'then' in resultOrPromise) {\n result = await resultOrPromise;\n if (validationCommitId !== validationCommitIdRef.current) {\n return;\n }\n } else {\n result = resultOrPromise;\n }\n if (result !== null) {\n nextState.valid = false;\n nextState.customError = true;\n if (Array.isArray(result)) {\n validationErrors = result;\n element?.setCustomValidity(result.join('\\n'));\n } else if (result) {\n validationErrors = [result];\n element?.setCustomValidity(result);\n }\n } else if (isValidatingOnChange) {\n // validate function returned no errors, if validating on change\n // we need to clear the custom validity state\n clearCustomValidity(element, registeredInputs);\n nextState.customError = false;\n if (element && element.validationMessage) {\n defaultValidationMessage = element.validationMessage;\n validationErrors = [element.validationMessage];\n } else if ((!element || element.validity.valid) && !nextState.valid) {\n nextState.valid = true;\n }\n }\n }\n const nextValidityData = {\n value,\n state: nextState,\n error: defaultValidationMessage ?? (Array.isArray(result) ? result[0] : result ?? ''),\n errors: validationErrors,\n initialValue: validityData.initialValue\n };\n\n // Keep Form-level errors part of overall field validity for submit blocking/focus logic.\n updateRegisteredFieldValidity(nextValidityData);\n setValidityData(nextValidityData);\n });\n const change = useStableCallback(value => {\n timeout.clear();\n const validateOnChange = shouldValidateOnChange();\n if (validateOnChange && value !== '' && validationDebounceTime) {\n validationCommitIdRef.current += 1;\n timeout.start(validationDebounceTime, () => {\n commit(value);\n });\n } else {\n commit(value, !validateOnChange);\n }\n });\n const getValidationProps = React.useCallback((disabled, externalProps = {}) => mergeProps(getDescriptionProps(externalProps), state.valid === false && !state.disabled && !disabled ? {\n 'aria-invalid': true\n } : EMPTY_OBJECT), [getDescriptionProps, state.disabled, state.valid]);\n return React.useMemo(() => ({\n getValidationProps,\n inputRef,\n registeredInputs,\n registerInput,\n getInputControl,\n commit,\n change\n }), [getValidationProps, registeredInputs, registerInput, getInputControl, commit, change]);\n}","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { getCombinedFieldValidityData } from \"../../field/utils/getCombinedFieldValidityData.mjs\";\nimport { useFormContext } from \"../form-context/FormContext.mjs\";\nexport function useFieldControlRegistration(params) {\n const {\n commit,\n invalid,\n markedDirtyRef,\n name,\n setRegisteredFieldName,\n registeredFieldIdRef,\n setValidityData,\n validityData\n } = params;\n const {\n formRef\n } = useFormContext();\n const activeFieldControlSourceRef = React.useRef(null);\n const registrationRef = React.useRef(null);\n const initialValueCapturedRef = React.useRef(false);\n const getValueForForm = useStableCallback(() => {\n const registration = registrationRef.current;\n if (!registration) {\n return undefined;\n }\n if (registration.getValue) {\n return registration.getValue();\n }\n return registration.value;\n });\n function getRegistrationValue(registration) {\n return registration.value === undefined ? getValueForForm() : registration.value;\n }\n const validate = useStableCallback(() => {\n const registration = registrationRef.current;\n markedDirtyRef.current = true;\n if (!registration) {\n commit(validityData.value);\n return;\n }\n commit(getRegistrationValue(registration));\n });\n function refreshRegistration() {\n const registration = registrationRef.current;\n if (!registration || !registration.id) {\n return;\n }\n formRef.current.fields.set(registration.id, {\n getValue: getValueForForm,\n name: name ?? registration.name,\n controlRef: registration.controlRef,\n validityData: getCombinedFieldValidityData(validityData, invalid),\n validate\n });\n }\n function deleteRegistration(id = registrationRef.current?.id) {\n if (id) {\n formRef.current.fields.delete(id);\n }\n }\n\n // The baseline belongs to the field, not to a control instance: registration re-runs on every\n // value change, and a control that unmounts and remounts (or is swapped for another one) comes\n // back as a brand new registration. Capturing more than once would turn whichever value the\n // control happens to hold at that point into the initial value, so a modified field would read\n // pristine and its real initial value would read dirty. Consumers that want a fresh baseline\n // remount or key `<Field.Root>` itself.\n function captureInitialValue(registration) {\n if (initialValueCapturedRef.current) {\n return;\n }\n initialValueCapturedRef.current = true;\n const initialValue = getRegistrationValue(registration);\n setValidityData(prev => prev.initialValue === initialValue ? prev : {\n ...prev,\n initialValue\n });\n }\n useIsoLayoutEffect(() => {\n const registration = registrationRef.current;\n if (!registration || !registration.id) {\n return;\n }\n setRegisteredFieldName(name ? undefined : registration.name);\n formRef.current.fields.set(registration.id, {\n getValue: getValueForForm,\n name: name ?? registration.name,\n controlRef: registration.controlRef,\n validityData: getCombinedFieldValidityData(validityData, invalid),\n validate\n });\n }, [formRef, getValueForForm, invalid, name, setRegisteredFieldName, validate, validityData]);\n useIsoLayoutEffect(() => {\n const fields = formRef.current.fields;\n return () => {\n const id = registrationRef.current?.id;\n if (id) {\n fields.delete(id);\n }\n };\n }, [formRef]);\n const register = useStableCallback((source, registration) => {\n if (!registration) {\n if (activeFieldControlSourceRef.current === source) {\n activeFieldControlSourceRef.current = null;\n deleteRegistration();\n registrationRef.current = null;\n setRegisteredFieldName(undefined);\n registeredFieldIdRef.current = undefined;\n }\n return;\n }\n const previousId = registrationRef.current?.id;\n activeFieldControlSourceRef.current = source;\n registrationRef.current = registration;\n if (!name) {\n setRegisteredFieldName(registration.name);\n }\n registeredFieldIdRef.current = registration.id;\n if (previousId && previousId !== registration.id) {\n deleteRegistration(previousId);\n }\n captureInitialValue(registration);\n refreshRegistration();\n });\n return [validate, register];\n}","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { FieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { DEFAULT_VALIDITY_STATE, fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useFieldsetRootContext } from \"../../fieldset/root/FieldsetRootContext.mjs\";\nimport { useFormContext } from \"../../internals/form-context/FormContext.mjs\";\nimport { LabelableProvider } from \"../../internals/labelable-provider/index.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useFieldValidation } from \"./useFieldValidation.mjs\";\nimport { useFieldControlRegistration } from \"../../internals/field-register-control/useFieldControlRegistration.mjs\";\n\n/**\n * @internal\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst FieldRootInner = /*#__PURE__*/React.forwardRef(function FieldRootInner(componentProps, forwardedRef) {\n const {\n errors,\n validationMode: formValidationMode,\n submitAttemptedRef\n } = useFormContext();\n const {\n render,\n className,\n validate: validateProp,\n validationDebounceTime = 0,\n validationMode = formValidationMode,\n name,\n disabled: disabledProp = false,\n invalid: invalidProp,\n dirty: dirtyProp,\n touched: touchedProp,\n actionsRef,\n style,\n ...elementProps\n } = componentProps;\n const disabledFieldset = useFieldsetRootContext(true)?.disabled;\n const validate = useStableCallback(validateProp || (() => null));\n const disabled = disabledFieldset || disabledProp;\n const [touchedState, setTouchedUnwrapped] = React.useState(false);\n const [dirtyState, setDirtyUnwrapped] = React.useState(false);\n const [filled, setFilled] = React.useState(false);\n const [focused, setFocused] = React.useState(false);\n const dirty = dirtyProp ?? dirtyState;\n const touched = touchedProp ?? touchedState;\n const markedDirtyRef = React.useRef(dirty);\n const registeredFieldIdRef = React.useRef(undefined);\n const [registeredFieldName, setRegisteredFieldName] = React.useState();\n const effectiveName = name ?? registeredFieldName;\n useIsoLayoutEffect(() => {\n if (dirtyProp !== undefined) {\n markedDirtyRef.current = dirtyProp;\n }\n }, [dirtyProp]);\n const setDirty = useStableCallback(value => {\n if (dirtyProp !== undefined) {\n return;\n }\n if (value) {\n markedDirtyRef.current = true;\n }\n setDirtyUnwrapped(value);\n });\n const setTouched = useStableCallback(value => {\n if (touchedProp !== undefined) {\n return;\n }\n setTouchedUnwrapped(value);\n });\n const shouldValidateOnChange = useStableCallback(() => validationMode === 'onChange' || validationMode === 'onSubmit' && submitAttemptedRef.current);\n const formError = effectiveName && Object.hasOwn(errors, effectiveName) ? errors[effectiveName] : null;\n const hasFormError = !!(Array.isArray(formError) ? formError.length : formError);\n const invalid = invalidProp === true || hasFormError;\n const [validityData, setValidityData] = React.useState({\n state: DEFAULT_VALIDITY_STATE,\n error: '',\n errors: [],\n value: null,\n initialValue: null\n });\n\n // App-controlled invalidity (the `invalid` prop and `<Form>` errors) keeps the field marked\n // invalid even while disabled. Only computed validity (native constraints and `validate`)\n // is suppressed when disabled, matching `:disabled` not participating in constraint validation.\n const valid = !invalid && (disabled ? null : validityData.state.valid);\n const state = React.useMemo(() => ({\n disabled,\n touched,\n dirty,\n valid,\n filled,\n focused\n }), [disabled, touched, dirty, valid, filled, focused]);\n const validation = useFieldValidation({\n setValidityData,\n validate,\n validityData,\n validationDebounceTime,\n invalid,\n markedDirtyRef,\n state,\n shouldValidateOnChange,\n registeredFieldIdRef\n });\n const [validateFieldControl, registerFieldControl] = useFieldControlRegistration({\n commit: validation.commit,\n invalid,\n markedDirtyRef,\n name,\n setRegisteredFieldName,\n registeredFieldIdRef,\n setValidityData,\n validityData\n });\n React.useImperativeHandle(actionsRef, () => ({\n validate: validateFieldControl\n }), [validateFieldControl]);\n const contextValue = React.useMemo(() => ({\n invalid,\n name: effectiveName,\n validityData,\n setValidityData,\n disabled,\n setTouched,\n setDirty,\n setFilled,\n setFocused,\n validationMode,\n shouldValidateOnChange,\n state,\n registerFieldControl,\n validation\n }), [invalid, effectiveName, validityData, disabled, setTouched, setDirty, setFilled, setFocused, validationMode, shouldValidateOnChange, state, registerFieldControl, validation]);\n const element = useRenderElement('div', componentProps, {\n ref: forwardedRef,\n state,\n props: elementProps,\n stateAttributesMapping: fieldValidityMapping\n });\n return /*#__PURE__*/_jsx(FieldRootContext.Provider, {\n value: contextValue,\n children: element\n });\n});\n\n/**\n * Groups all parts of the field.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nif (process.env.NODE_ENV !== \"production\") FieldRootInner.displayName = \"FieldRootInner\";\nexport const FieldRoot = /*#__PURE__*/React.forwardRef(function FieldRoot(componentProps, forwardedRef) {\n return /*#__PURE__*/_jsx(LabelableProvider, {\n children: /*#__PURE__*/_jsx(FieldRootInner, {\n ...componentProps,\n ref: forwardedRef\n })\n });\n});\nif (process.env.NODE_ENV !== \"production\") FieldRoot.displayName = \"FieldRoot\";","'use client';\n\nimport * as React from 'react';\nimport { error } from '@base-ui/utils/error';\nimport { SafeReact } from '@base-ui/utils/safeReact';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { useLabel } from \"../../internals/labelable-provider/useLabel.mjs\";\nimport { useFieldItemContext } from \"../item/FieldItemContext.mjs\";\n\n/**\n * An accessible label that is automatically associated with the field control.\n * Renders a `<label>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nexport const FieldLabel = /*#__PURE__*/React.forwardRef(function FieldLabel(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n id: idProp,\n nativeLabel = true,\n ...elementProps\n } = componentProps;\n const fieldRootContext = useFieldRootContext(false);\n const fieldItemContext = useFieldItemContext();\n const {\n labelId\n } = useLabelableContext();\n const state = {\n ...fieldRootContext.state,\n disabled: fieldRootContext.disabled || fieldItemContext.disabled\n };\n const labelRef = React.useRef(null);\n const labelProps = useLabel({\n id: labelId ?? idProp,\n native: nativeLabel\n });\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useEffect(() => {\n if (!labelRef.current) {\n return;\n }\n const isLabelTag = labelRef.current.tagName === 'LABEL';\n if (nativeLabel) {\n if (!isLabelTag) {\n const ownerStackMessage = SafeReact.captureOwnerStack?.() || '';\n const message = '<Field.Label> expected a <label> element because the `nativeLabel` prop is true. ' + 'Rendering a non-<label> disables native label association, so `htmlFor` will not ' + 'work. Use a real <label> in the `render` prop, or set `nativeLabel` to `false`.';\n error(`${message}${ownerStackMessage}`);\n }\n } else if (isLabelTag) {\n const ownerStackMessage = SafeReact.captureOwnerStack?.() || '';\n const message = '<Field.Label> expected a non-<label> element because the `nativeLabel` prop is false. ' + 'Rendering a <label> assumes native label behavior while Base UI treats it as ' + 'non-native, which can cause unexpected pointer behavior. Use a non-<label> in the ' + '`render` prop, or set `nativeLabel` to `true`.';\n error(`${message}${ownerStackMessage}`);\n }\n }, [nativeLabel]);\n }\n const element = useRenderElement('label', componentProps, {\n ref: [forwardedRef, labelRef],\n state,\n props: [labelProps, elementProps],\n stateAttributesMapping: fieldValidityMapping\n });\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") FieldLabel.displayName = \"FieldLabel\";","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useFormContext } from \"../../internals/form-context/FormContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\nimport { useOpenChangeComplete } from \"../../internals/useOpenChangeComplete.mjs\";\nimport { transitionStatusMapping } from \"../../internals/stateAttributesMapping.mjs\";\nimport { useTransitionStatus } from \"../../internals/useTransitionStatus.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst stateAttributesMapping = {\n ...fieldValidityMapping,\n ...transitionStatusMapping\n};\n\n/**\n * An error message displayed if the field control fails validation.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nexport const FieldError = /*#__PURE__*/React.forwardRef(function FieldError(componentProps, forwardedRef) {\n const {\n render,\n id: idProp,\n className,\n match,\n style,\n ...elementProps\n } = componentProps;\n const id = useBaseUiId(idProp);\n const {\n validityData,\n state: fieldState,\n name\n } = useFieldRootContext(false);\n const {\n setMessageIds\n } = useLabelableContext();\n const {\n errors\n } = useFormContext();\n const formError = name && Object.hasOwn(errors, name) ? errors[name] : null;\n const hasFormError = !!(Array.isArray(formError) ? formError.length : formError);\n const hasSpecificMatch = typeof match === 'string';\n let rendered = false;\n if (match === true) {\n rendered = true;\n } else if (fieldState.disabled) {\n rendered = false;\n } else if (hasSpecificMatch) {\n rendered = Boolean(validityData.state[match]);\n } else {\n rendered = hasFormError || validityData.state.valid === false;\n }\n const {\n mounted,\n transitionStatus,\n setMounted\n } = useTransitionStatus(rendered);\n useIsoLayoutEffect(() => {\n if (!rendered || !id) {\n return undefined;\n }\n setMessageIds(v => v.concat(id));\n return () => {\n setMessageIds(v => v.filter(item => item !== id));\n };\n }, [rendered, id, setMessageIds]);\n const errorRef = React.useRef(null);\n const [lastRenderedMessage, setLastRenderedMessage] = React.useState(null);\n const [lastRenderedMessageKey, setLastRenderedMessageKey] = React.useState(null);\n let error = validityData.error;\n if (!hasSpecificMatch && hasFormError) {\n error = formError;\n } else if (validityData.errors.length > 1) {\n error = validityData.errors;\n }\n let errorMessage = error;\n if (Array.isArray(error)) {\n errorMessage = error.length > 1 ? /*#__PURE__*/_jsx(\"ul\", {\n children: error.map(message => /*#__PURE__*/_jsx(\"li\", {\n children: message\n }, message))\n }) : error[0];\n }\n const errorKey = Array.isArray(error) ? JSON.stringify(error) : error;\n if (rendered && errorKey !== lastRenderedMessageKey) {\n setLastRenderedMessageKey(errorKey);\n setLastRenderedMessage(errorMessage);\n }\n useOpenChangeComplete({\n open: rendered,\n ref: errorRef,\n onComplete() {\n if (!rendered) {\n setMounted(false);\n }\n }\n });\n const state = {\n ...fieldState,\n transitionStatus\n };\n const element = useRenderElement('div', componentProps, {\n ref: [forwardedRef, errorRef],\n state,\n props: [{\n id,\n children: rendered ? errorMessage : lastRenderedMessage\n }, elementProps],\n stateAttributesMapping,\n enabled: mounted\n });\n if (!mounted) {\n return null;\n }\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") FieldError.displayName = \"FieldError\";","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useFieldItemContext } from \"../item/FieldItemContext.mjs\";\n\n/**\n * A paragraph with additional information about the field.\n * Renders a `<p>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nexport const FieldDescription = /*#__PURE__*/React.forwardRef(function FieldDescription(componentProps, forwardedRef) {\n const {\n render,\n id: idProp,\n className,\n style,\n ...elementProps\n } = componentProps;\n const id = useBaseUiId(idProp);\n const fieldRootContext = useFieldRootContext(false);\n const fieldItemContext = useFieldItemContext();\n const {\n setMessageIds\n } = useLabelableContext();\n const state = {\n ...fieldRootContext.state,\n disabled: fieldRootContext.disabled || fieldItemContext.disabled\n };\n useIsoLayoutEffect(() => {\n if (!id) {\n return undefined;\n }\n setMessageIds(v => v.concat(id));\n return () => {\n setMessageIds(v => v.filter(item => item !== id));\n };\n }, [id, setMessageIds]);\n const element = useRenderElement('p', componentProps, {\n ref: forwardedRef,\n state,\n props: [{\n id\n }, elementProps],\n stateAttributesMapping: fieldValidityMapping\n });\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") FieldDescription.displayName = \"FieldDescription\";","'use client';\n\nimport * as React from 'react';\nimport { useControlled } from '@base-ui/utils/useControlled';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { ownerDocument } from '@base-ui/utils/owner';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { useRegisterFieldControl } from \"../../internals/field-register-control/useRegisterFieldControl.mjs\";\nimport { useFormContext } from \"../../internals/form-context/FormContext.mjs\";\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { useLabelableId } from \"../../internals/labelable-provider/useLabelableId.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { activeElement } from \"../../floating-ui-react/utils.mjs\";\n\n/**\n * The form control to label and validate.\n * Renders an `<input>` element.\n *\n * You can omit this part and use any Base UI input component instead. For example,\n * [Input](https://base-ui.com/react/components/input), [Checkbox](https://base-ui.com/react/components/checkbox),\n * or [Select](https://base-ui.com/react/components/select), among others, will work with Field out of the box.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nexport const FieldControl = /*#__PURE__*/React.forwardRef(function FieldControl(componentProps, forwardedRef) {\n const {\n render,\n className,\n id: idProp,\n name: nameProp,\n value: valueProp,\n disabled: disabledProp = false,\n onValueChange,\n defaultValue,\n autoFocus = false,\n style,\n ...elementProps\n } = componentProps;\n const {\n state: fieldState,\n name: fieldName,\n disabled: fieldDisabled,\n setTouched,\n setDirty,\n validityData,\n setFocused,\n setFilled,\n validationMode,\n validation\n } = useFieldRootContext();\n const {\n clearErrors\n } = useFormContext();\n const disabled = fieldDisabled || disabledProp;\n const name = fieldName ?? nameProp;\n const state = {\n ...fieldState,\n disabled\n };\n const {\n labelId\n } = useLabelableContext();\n const id = useLabelableId({\n id: idProp\n });\n useIsoLayoutEffect(() => {\n const hasExternalValue = valueProp != null;\n if (validation.inputRef.current?.value || hasExternalValue && valueProp !== '') {\n setFilled(true);\n } else if (hasExternalValue && valueProp === '') {\n setFilled(false);\n }\n }, [validation.inputRef, setFilled, valueProp]);\n const inputRef = React.useRef(null);\n useIsoLayoutEffect(() => {\n if (autoFocus && inputRef.current === activeElement(ownerDocument(inputRef.current))) {\n setFocused(true);\n }\n }, [autoFocus, setFocused]);\n const [valueUnwrapped] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: 'FieldControl',\n state: 'value'\n });\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueUnwrapped : undefined;\n const getValueFromInput = useStableCallback(() => validation.inputRef.current?.value);\n useRegisterFieldControl(validation.inputRef, id, value, getValueFromInput, !disabled, nameProp);\n const element = useRenderElement('input', componentProps, {\n ref: [forwardedRef, inputRef],\n state,\n props: [{\n id,\n disabled,\n name,\n ref: validation.inputRef,\n 'aria-labelledby': labelId,\n autoFocus,\n ...(isControlled ? {\n value\n } : {\n defaultValue\n }),\n onChange(event) {\n const inputValue = event.currentTarget.value;\n onValueChange?.(inputValue, createChangeEventDetails(REASONS.none, event.nativeEvent));\n // `validation.change` reads `markedDirtyRef`, so update dirty before validating.\n setDirty(inputValue !== (validityData.initialValue ?? ''));\n setFilled(inputValue !== '');\n\n // Workaround for https://github.com/react/react/issues/9023\n if (!event.nativeEvent.defaultPrevented) {\n clearErrors(name);\n validation.change(inputValue);\n }\n },\n onFocus() {\n setFocused(true);\n },\n onBlur(event) {\n setTouched(true);\n setFocused(false);\n if (validationMode === 'onBlur') {\n validation.commit(event.currentTarget.value);\n }\n },\n onKeyDown(event) {\n if (event.currentTarget.tagName === 'INPUT' && event.key === 'Enter') {\n setTouched(true);\n validation.commit(event.currentTarget.value);\n }\n }\n }, elementProps, props => validation.getValidationProps(disabled, props)],\n stateAttributesMapping: fieldValidityMapping\n });\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") FieldControl.displayName = \"FieldControl\";","'use client';\n\nimport * as React from 'react';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { getCombinedFieldValidityData } from \"../utils/getCombinedFieldValidityData.mjs\";\nimport { useTransitionStatus } from \"../../internals/useTransitionStatus.mjs\";\n\n/**\n * Used to display a custom message based on the field's validity.\n * Requires `children` to be a function that accepts field validity state as an argument.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const FieldValidity = function FieldValidity(props) {\n const {\n children\n } = props;\n const {\n validityData,\n invalid\n } = useFieldRootContext(false);\n const combinedFieldValidityData = React.useMemo(() => getCombinedFieldValidityData(validityData, invalid), [validityData, invalid]);\n const isInvalid = combinedFieldValidityData.state.valid === false;\n const {\n transitionStatus\n } = useTransitionStatus(isInvalid);\n\n // `fieldValidityState` is handed straight to a public render prop, so its identity is observable:\n // consumers can pass it to a memoized child. Keep it stable across unrelated field-state changes\n // (focus, dirty, filled) so those children don't rerender when the validity itself is unchanged.\n const fieldValidityState = React.useMemo(() => {\n return {\n ...combinedFieldValidityData,\n validity: combinedFieldValidityData.state,\n transitionStatus\n };\n }, [combinedFieldValidityData, transitionStatus]);\n return /*#__PURE__*/_jsx(React.Fragment, {\n children: children(fieldValidityState)\n });\n};\nif (process.env.NODE_ENV !== \"production\") FieldValidity.displayName = \"FieldValidity\";","'use client';\n\nimport * as React from 'react';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { FieldItemContext } from \"./FieldItemContext.mjs\";\nimport { LabelableProvider } from \"../../internals/labelable-provider/index.mjs\";\n\n/**\n * Groups individual items in a checkbox group or radio group with a label and description.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const FieldItem = /*#__PURE__*/React.forwardRef(function FieldItem(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n disabled: disabledProp = false,\n ...elementProps\n } = componentProps;\n const {\n state: fieldState,\n disabled: rootDisabled\n } = useFieldRootContext(false);\n const disabled = rootDisabled || disabledProp;\n const state = {\n ...fieldState,\n disabled\n };\n const fieldItemContext = React.useMemo(() => ({\n disabled\n }), [disabled]);\n const element = useRenderElement('div', componentProps, {\n ref: forwardedRef,\n state,\n props: elementProps,\n stateAttributesMapping: fieldValidityMapping\n });\n return /*#__PURE__*/_jsx(LabelableProvider, {\n children: /*#__PURE__*/_jsx(FieldItemContext.Provider, {\n value: fieldItemContext,\n children: element\n })\n });\n});\nif (process.env.NODE_ENV !== \"production\") FieldItem.displayName = \"FieldItem\";","\"use client\";\nimport { useTinyrackFocusModality } from \"../../providers/focus-modality/focus-modality-provider.js\";\nimport { mergeComponentClassName } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-control.tsx\nfunction TRFieldControl({ className, uiSize = \"md\", ...props }) {\n\tuseTinyrackFocusModality();\n\treturn /* @__PURE__ */ jsx(Field.Control, {\n\t\t...props,\n\t\tclassName: mergeComponentClassName(\"tr-field-control\", className),\n\t\t\"data-ui-size\": uiSize\n\t});\n}\n//#endregion\nexport { TRFieldControl };\n\n//# sourceMappingURL=field-control.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-description.tsx\nconst TRFieldDescription = createComponentPart(Field.Description, \"tr-field-description\");\n//#endregion\nexport { TRFieldDescription };\n\n//# sourceMappingURL=field-description.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-error.tsx\nconst TRFieldError = createComponentPart(Field.Error, \"tr-field-error\");\n//#endregion\nexport { TRFieldError };\n\n//# sourceMappingURL=field-error.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-item.tsx\nconst TRFieldItem = createComponentPart(Field.Item, \"tr-field-item\");\n//#endregion\nexport { TRFieldItem };\n\n//# sourceMappingURL=field-item.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-label.tsx\nconst TRFieldLabel = createComponentPart(Field.Label, \"tr-label\");\n//#endregion\nexport { TRFieldLabel };\n\n//# sourceMappingURL=field-label.js.map","\"use client\";\nimport { mergeComponentClassName } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-root.tsx\nfunction TRFieldRoot({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(Field.Root, {\n\t\t...props,\n\t\tclassName: mergeComponentClassName(\"tr-field\", className)\n\t});\n}\n//#endregion\nexport { TRFieldRoot };\n\n//# sourceMappingURL=field-root.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-validity.tsx\nconst TRFieldValidity = createComponentPart(Field.Validity, \"tr-field-validity\");\n//#endregion\nexport { TRFieldValidity };\n\n//# sourceMappingURL=field-validity.js.map","import { TRFieldControl } from \"./field-control.js\";\nimport { TRFieldDescription } from \"./field-description.js\";\nimport { TRFieldError } from \"./field-error.js\";\nimport { TRFieldItem } from \"./field-item.js\";\nimport { TRFieldLabel } from \"./field-label.js\";\nimport { TRFieldRoot } from \"./field-root.js\";\nimport { TRFieldValidity } from \"./field-validity.js\";\n//#region src/components/field/index.tsx\nconst TRField = {\n\tRoot: TRFieldRoot,\n\tLabel: TRFieldLabel,\n\tError: TRFieldError,\n\tDescription: TRFieldDescription,\n\tControl: TRFieldControl,\n\tValidity: TRFieldValidity,\n\tItem: TRFieldItem\n};\n//#endregion\nexport { TRField, TRFieldControl, TRFieldDescription, TRFieldError, TRFieldItem, TRFieldLabel, TRFieldRoot, TRFieldValidity };\n\n//# sourceMappingURL=index.js.map"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{J as e,Z as t,i as n,n as r,q as i,s as a,t as o}from"./createLucideIcon-BPpAIXR_.js";import{Sn as s}from"./config-DTQCUlfZ.js";import{t as c}from"./useMutation-BWZ0G4Td.js";import{t as l}from"./auth-field-CWyXGKoC.js";import{t as u}from"./mail-D0B_1Dzd.js";import{c as d,i as f,o as p}from"./zod-C87S6Tec.js";import{L as m,V as h}from"./index-CKpnrw9M.js";import{t as g}from"./auth-page-header-DgGAaIiP.js";import{t as _}from"./auth-layout-CiNn2-Nb.js";import{n as v,t as y}from"./auth-footer-Cz5ivsDc.js";import{r as b,t as x}from"./standard-schema-e8gtSzGE.js";import{t as S}from"./password-reset-sU5KkBKi.js";var C=o(`mail-check`,[[`path`,{d:`M22 13V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v12c0 1.1.9 2 2 2h8`,key:`12jkf8`}],[`path`,{d:`m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7`,key:`1ocrg3`}],[`path`,{d:`m16 19 2 2 4-4`,key:`1b14m6`}]]),w=t(e()),T=i();function E(){let{t:e}=n(),t=h(),[i,o]=(0,w.useState)(!1),[E,D]=(0,w.useState)(``),O=(0,w.useMemo)(()=>p({email:d().min(1,e(`validation.email.required`)).pipe(f(e(`validation.email.invalid`)))}),[e]),k=c({...S,onSuccess:()=>{o(!0)}}),{register:A,setError:j,handleSubmit:M,formState:{errors:N}}=b({defaultValues:{email:``},resolver:x(O)});return i?(0,T.jsx)(_,{children:(0,T.jsx)(`div`,{"data-testid":`alert-success`,children:(0,T.jsxs)(m,{description:(0,T.jsxs)(T.Fragment,{children:[e(`forgotPassword.success.subtitle`),(0,T.jsx)(`br`,{}),e(`forgotPassword.success.description`,{email:E})]}),icon:C,title:e(`forgotPassword.success.title`),tone:`success`,children:[(0,T.jsx)(a,{className:`w-full`,intent:`primary`,onClick:()=>t({to:`/login`}),type:`button`,uiSize:`lg`,children:e(`forgotPassword.backToLogin`)}),(0,T.jsx)(r,{align:`center`,color:`muted`,variant:`caption`,children:e(`forgotPassword.success.checkSpam`)})]})})}):(0,T.jsxs)(_,{children:[(0,T.jsx)(g,{subtitle:e(`forgotPassword.subtitle`),title:e(`forgotPassword.title`)}),(0,T.jsxs)(`form`,{className:`flex flex-col gap-tinyrack-lg`,onSubmit:M(async t=>{try{D(t.email),await k.mutateAsync(t)}catch(t){t&&typeof t==`object`&&`code`in t&&t.code===`USER_NOT_EDITABLE`?j(`email`,{type:`manual`,message:e(`forgotPassword.error.notEditable`)}):o(!0)}}),children:[(0,T.jsx)(l,{autoComplete:`email`,error:N.email,icon:u,label:e(`forgotPassword.email.label`),placeholder:e(`forgotPassword.email.placeholder`),...A(`email`),type:`email`}),(0,T.jsx)(a,{className:`w-full`,intent:`primary`,loading:k.isPending,loadingLabel:e(`forgotPassword.submitting`),type:`submit`,uiSize:`lg`,children:e(`forgotPassword.submit`)})]}),(0,T.jsx)(y,{children:(0,T.jsx)(v,{link:(0,T.jsx)(s,{to:`/login`,children:e(`register.link.login`)}),text:e(`forgotPassword.footer.rememberedPassword`)})})]})}export{E as component};
|
|
2
|
-
//# sourceMappingURL=forgot-BenoOUxC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forgot-BenoOUxC.js","names":["standardSchemaResolver","useMutation","Link","useNavigate","TRButton","TRText","MailCheckIcon","MailIcon","useMemo","useState","useForm","useTranslation","z","AuthField","AuthFooter","AuthFooterLink","AuthOutcome","AuthPageHeader","AuthLayout","forgotPasswordMutationOptions","ForgotPasswordFormValues","email","ForgotPassword","t","navigate","emailSent","setEmailSent","submittedEmail","setSubmittedEmail","forgotPasswordSchema","object","string","min","pipe","forgotPasswordMutation","onSuccess","register","setError","handleSubmit","formState","errors","defaultValues","resolver","onSubmit","values","mutateAsync","error","code","type","message","to","isPending","component"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/mail-check.mjs","../../../frontend/src/routes/password/forgot/index.tsx?tsr-split=component"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M22 13V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v12c0 1.1.9 2 2 2h8\", key: \"12jkf8\" }],\n [\"path\", { d: \"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\", key: \"1ocrg3\" }],\n [\"path\", { d: \"m16 19 2 2 4-4\", key: \"1b14m6\" }]\n];\nconst MailCheck = createLucideIcon(\"mail-check\", __iconNode);\n\nexport { __iconNode, MailCheck as default };\n//# sourceMappingURL=mail-check.mjs.map\n","import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport { useMutation } from '@tanstack/react-query';\nimport {\n createFileRoute,\n Link,\n redirect,\n useNavigate,\n} from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { MailCheckIcon, MailIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthField } from '#frontend/components/auth/auth-field.tsx';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthOutcome } from '#frontend/components/auth/auth-outcome.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { forgotPasswordMutationOptions } from '#frontend/queries/password-reset.ts';\n\nexport const Route = createFileRoute('/password/forgot/')({\n component: ForgotPassword,\n errorComponent: RouteErrorFallback,\n beforeLoad: async ({ context }) => {\n const config = await context.queryClient.ensureQueryData(\n appConfigQueryOptions,\n );\n const isPasswordAuthEnabled = config?.auth.password.enabled;\n if (!isPasswordAuthEnabled) {\n throw redirect({ to: '/login' });\n }\n },\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\ntype ForgotPasswordFormValues = {\n email: string;\n};\n\nfunction ForgotPassword() {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const [emailSent, setEmailSent] = useState(false);\n const [submittedEmail, setSubmittedEmail] = useState('');\n\n const forgotPasswordSchema = useMemo(\n () =>\n z.object({\n email: z\n .string()\n .min(1, t('validation.email.required'))\n .pipe(z.email(t('validation.email.invalid'))),\n }),\n [t],\n );\n\n const forgotPasswordMutation = useMutation({\n ...forgotPasswordMutationOptions,\n onSuccess: () => {\n setEmailSent(true);\n },\n });\n\n const {\n register,\n setError,\n handleSubmit,\n formState: { errors },\n } = useForm<ForgotPasswordFormValues>({\n defaultValues: {\n email: '',\n },\n resolver: standardSchemaResolver(forgotPasswordSchema),\n });\n\n const onSubmit = async (values: ForgotPasswordFormValues) => {\n try {\n setSubmittedEmail(values.email);\n await forgotPasswordMutation.mutateAsync(values);\n } catch (error) {\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === 'USER_NOT_EDITABLE'\n ) {\n setError('email', {\n type: 'manual',\n message: t('forgotPassword.error.notEditable'),\n });\n } else {\n setEmailSent(true);\n }\n }\n };\n\n if (emailSent) {\n return (\n <AuthLayout>\n {/*\n The testid stays on a wrapper: e2e treats \"the success alert\" as the\n whole terminal state, which is now the outcome block rather than a\n banner stacked above a header.\n */}\n <div data-testid=\"alert-success\">\n <AuthOutcome\n description={\n <>\n {t('forgotPassword.success.subtitle')}\n <br />\n {t('forgotPassword.success.description', {\n email: submittedEmail,\n })}\n </>\n }\n icon={MailCheckIcon}\n title={t('forgotPassword.success.title')}\n tone=\"success\"\n >\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n onClick={() => navigate({ to: '/login' })}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('forgotPassword.backToLogin')}\n </TRButton>\n <TRText align=\"center\" color=\"muted\" variant=\"caption\">\n {t('forgotPassword.success.checkSpam')}\n </TRText>\n </AuthOutcome>\n </div>\n </AuthLayout>\n );\n }\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('forgotPassword.subtitle')}\n title={t('forgotPassword.title')}\n />\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <AuthField\n autoComplete=\"email\"\n error={errors.email}\n icon={MailIcon}\n label={t('forgotPassword.email.label')}\n placeholder={t('forgotPassword.email.placeholder')}\n {...register('email')}\n type=\"email\"\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={forgotPasswordMutation.isPending}\n loadingLabel={t('forgotPassword.submitting')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('forgotPassword.submit')}\n </TRButton>\n </form>\n\n <AuthFooter>\n <AuthFooterLink\n link={<Link to=\"/login\">{t('register.link.login')}</Link>}\n text={t('forgotPassword.footer.rememberedPassword')}\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forgot-huNZDYU9.js","names":["RouteErrorFallback","ForgotPasswordFormValues","email","SplitErrorComponent","errorComponent"],"sources":["../../../frontend/src/routes/password/forgot/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport { useMutation } from '@tanstack/react-query';\nimport {\n createFileRoute,\n Link,\n redirect,\n useNavigate,\n} from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { MailCheckIcon, MailIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthField } from '#frontend/components/auth/auth-field.tsx';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthOutcome } from '#frontend/components/auth/auth-outcome.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { forgotPasswordMutationOptions } from '#frontend/queries/password-reset.ts';\n\nexport const Route = createFileRoute('/password/forgot/')({\n component: ForgotPassword,\n errorComponent: RouteErrorFallback,\n beforeLoad: async ({ context }) => {\n const config = await context.queryClient.ensureQueryData(\n appConfigQueryOptions,\n );\n const isPasswordAuthEnabled = config?.auth.password.enabled;\n if (!isPasswordAuthEnabled) {\n throw redirect({ to: '/login' });\n }\n },\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\ntype ForgotPasswordFormValues = {\n email: string;\n};\n\nfunction ForgotPassword() {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const [emailSent, setEmailSent] = useState(false);\n const [submittedEmail, setSubmittedEmail] = useState('');\n\n const forgotPasswordSchema = useMemo(\n () =>\n z.object({\n email: z\n .string()\n .min(1, t('validation.email.required'))\n .pipe(z.email(t('validation.email.invalid'))),\n }),\n [t],\n );\n\n const forgotPasswordMutation = useMutation({\n ...forgotPasswordMutationOptions,\n onSuccess: () => {\n setEmailSent(true);\n },\n });\n\n const {\n register,\n setError,\n handleSubmit,\n formState: { errors },\n } = useForm<ForgotPasswordFormValues>({\n defaultValues: {\n email: '',\n },\n resolver: standardSchemaResolver(forgotPasswordSchema),\n });\n\n const onSubmit = async (values: ForgotPasswordFormValues) => {\n try {\n setSubmittedEmail(values.email);\n await forgotPasswordMutation.mutateAsync(values);\n } catch (error) {\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === 'USER_NOT_EDITABLE'\n ) {\n setError('email', {\n type: 'manual',\n message: t('forgotPassword.error.notEditable'),\n });\n } else {\n setEmailSent(true);\n }\n }\n };\n\n if (emailSent) {\n return (\n <AuthLayout>\n {/*\n The testid stays on a wrapper: e2e treats \"the success alert\" as the\n whole terminal state, which is now the outcome block rather than a\n banner stacked above a header.\n */}\n <div data-testid=\"alert-success\">\n <AuthOutcome\n description={\n <>\n {t('forgotPassword.success.subtitle')}\n <br />\n {t('forgotPassword.success.description', {\n email: submittedEmail,\n })}\n </>\n }\n icon={MailCheckIcon}\n title={t('forgotPassword.success.title')}\n tone=\"success\"\n >\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n onClick={() => navigate({ to: '/login' })}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('forgotPassword.backToLogin')}\n </TRButton>\n <TRText align=\"center\" color=\"muted\" variant=\"caption\">\n {t('forgotPassword.success.checkSpam')}\n </TRText>\n </AuthOutcome>\n </div>\n </AuthLayout>\n );\n }\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('forgotPassword.subtitle')}\n title={t('forgotPassword.title')}\n />\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <AuthField\n autoComplete=\"email\"\n error={errors.email}\n icon={MailIcon}\n label={t('forgotPassword.email.label')}\n placeholder={t('forgotPassword.email.placeholder')}\n {...register('email')}\n type=\"email\"\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={forgotPasswordMutation.isPending}\n loadingLabel={t('forgotPassword.submitting')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('forgotPassword.submit')}\n </TRButton>\n </form>\n\n <AuthFooter>\n <AuthFooterLink\n link={<Link to=\"/login\">{t('register.link.login')}</Link>}\n text={t('forgotPassword.footer.rememberedPassword')}\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"mappings":"wCA8CE,IAAAG,EAxBOH"}
|