@tinyrack/issuary-server 0.22.0 → 0.24.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/oauth-client.entity.d.ts +0 -18
- package/dist/entities/oauth-client.entity.d.ts.map +1 -1
- package/dist/entities/oauth-code.entity.d.ts +0 -18
- package/dist/entities/oauth-code.entity.d.ts.map +1 -1
- package/dist/entities/oauth-device-code.entity.d.ts +0 -18
- package/dist/entities/oauth-device-code.entity.d.ts.map +1 -1
- package/dist/entities/revoked-token.entity.d.ts +0 -18
- package/dist/entities/revoked-token.entity.d.ts.map +1 -1
- package/dist/entities/terms-content.entity.d.ts +0 -9
- package/dist/entities/terms-content.entity.d.ts.map +1 -1
- package/dist/entities/terms.entity.d.ts +0 -9
- package/dist/entities/terms.entity.d.ts.map +1 -1
- package/dist/entities/user-consent.entity.d.ts +0 -18
- package/dist/entities/user-consent.entity.d.ts.map +1 -1
- package/dist/entities/user-terms-consent.entity.d.ts +0 -9
- package/dist/entities/user-terms-consent.entity.d.ts.map +1 -1
- package/dist/entities/user-totp-recovery-code.entity.d.ts +0 -9
- package/dist/entities/user-totp-recovery-code.entity.d.ts.map +1 -1
- package/dist/entities/user-totp.entity.d.ts +0 -9
- package/dist/entities/user-totp.entity.d.ts.map +1 -1
- package/dist/entities/user.entity.d.ts +0 -9
- package/dist/entities/user.entity.d.ts.map +1 -1
- package/dist/entities/user.entity.js +0 -4
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/entrypoints/app.d.ts +0 -59
- package/dist/entrypoints/app.d.ts.map +1 -1
- package/dist/entrypoints/database/postgres/compiled-functions.d.ts +20 -23
- package/dist/entrypoints/database/postgres/compiled-functions.d.ts.map +1 -1
- package/dist/entrypoints/database/postgres/compiled-functions.js +104 -134
- package/dist/entrypoints/database/postgres/compiled-functions.js.map +1 -1
- package/dist/entrypoints/database/sqlite/compiled-functions.d.ts +20 -23
- package/dist/entrypoints/database/sqlite/compiled-functions.d.ts.map +1 -1
- package/dist/entrypoints/database/sqlite/compiled-functions.js +104 -134
- package/dist/entrypoints/database/sqlite/compiled-functions.js.map +1 -1
- package/dist/lib/config/branding.d.ts +0 -4
- package/dist/lib/config/branding.d.ts.map +1 -1
- package/dist/lib/config/branding.js +0 -14
- package/dist/lib/config/branding.js.map +1 -1
- package/dist/lib/config/resolved.d.ts +0 -3
- package/dist/lib/config/resolved.d.ts.map +1 -1
- package/dist/lib/config/security.d.ts +0 -2
- package/dist/lib/config/security.d.ts.map +1 -1
- package/dist/lib/config/security.js +0 -5
- package/dist/lib/config/security.js.map +1 -1
- package/dist/middleware/auth.d.ts +0 -8
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +0 -64
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/session.d.ts +0 -9
- package/dist/middleware/session.d.ts.map +1 -1
- package/dist/middleware/session.js +0 -18
- package/dist/middleware/session.js.map +1 -1
- package/dist/migrations/postgres/Migration20260825140000_drop_password_reset_required.d.ts +6 -0
- package/dist/migrations/postgres/Migration20260825140000_drop_password_reset_required.d.ts.map +1 -0
- package/dist/migrations/postgres/Migration20260825140000_drop_password_reset_required.js +19 -0
- package/dist/migrations/postgres/Migration20260825140000_drop_password_reset_required.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/Migration20260825140000_drop_password_reset_required.d.ts +6 -0
- package/dist/migrations/sqlite/Migration20260825140000_drop_password_reset_required.d.ts.map +1 -0
- package/dist/migrations/sqlite/Migration20260825140000_drop_password_reset_required.js +19 -0
- package/dist/migrations/sqlite/Migration20260825140000_drop_password_reset_required.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/oauth-code.repository.d.ts +2 -2
- package/dist/repositories/oauth-code.repository.d.ts.map +1 -1
- package/dist/repositories/oauth-code.repository.js +3 -7
- package/dist/repositories/oauth-code.repository.js.map +1 -1
- package/dist/repositories/oauth-device-code.repository.d.ts +4 -4
- package/dist/repositories/oauth-device-code.repository.d.ts.map +1 -1
- package/dist/repositories/oauth-device-code.repository.js +6 -18
- package/dist/repositories/oauth-device-code.repository.js.map +1 -1
- package/dist/repositories/user-totp-recovery-code.repository.d.ts +1 -7
- package/dist/repositories/user-totp-recovery-code.repository.d.ts.map +1 -1
- package/dist/repositories/user-totp-recovery-code.repository.js +1 -2
- package/dist/repositories/user-totp-recovery-code.repository.js.map +1 -1
- package/dist/repositories/user-totp.repository.d.ts +0 -9
- package/dist/repositories/user-totp.repository.d.ts.map +1 -1
- package/dist/routes/api/auth/index.d.ts +0 -52
- package/dist/routes/api/auth/index.d.ts.map +1 -1
- package/dist/routes/api/auth/index.js +0 -2
- package/dist/routes/api/auth/index.js.map +1 -1
- package/dist/routes/api/auth/passkey/verify/post.d.ts +0 -37
- package/dist/routes/api/auth/passkey/verify/post.d.ts.map +1 -1
- package/dist/routes/api/auth/passkey/verify/post.js +2 -8
- package/dist/routes/api/auth/passkey/verify/post.js.map +1 -1
- package/dist/routes/api/config/get.d.ts +0 -4
- package/dist/routes/api/config/get.d.ts.map +1 -1
- package/dist/routes/api/config/get.js +0 -2
- package/dist/routes/api/config/get.js.map +1 -1
- package/dist/routes/api/config/index.d.ts +0 -4
- package/dist/routes/api/config/index.d.ts.map +1 -1
- package/dist/routes/api/index.d.ts +0 -56
- package/dist/routes/api/index.d.ts.map +1 -1
- package/dist/routes/index.d.ts +0 -56
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/oauth/device/get-post.js +5 -5
- package/dist/routes/oauth/device/get-post.js.map +1 -1
- package/dist/schemas/error.d.ts +0 -25
- package/dist/schemas/error.d.ts.map +1 -1
- package/dist/schemas/error.js +0 -1
- package/dist/schemas/error.js.map +1 -1
- package/dist/schemas/response.d.ts +0 -24
- package/dist/schemas/response.d.ts.map +1 -1
- package/dist/schemas/response.js +0 -13
- package/dist/schemas/response.js.map +1 -1
- package/dist/seeders/config.seeder.js +0 -1
- package/dist/seeders/config.seeder.js.map +1 -1
- package/dist/services/container.d.ts +0 -3
- package/dist/services/container.d.ts.map +1 -1
- package/dist/services/container.js +0 -15
- package/dist/services/container.js.map +1 -1
- package/dist/services/oauth-client.service.d.ts +0 -1
- package/dist/services/oauth-client.service.d.ts.map +1 -1
- package/dist/services/oauth-client.service.js +2 -17
- package/dist/services/oauth-client.service.js.map +1 -1
- package/dist/services/oauth-connect.service.d.ts.map +1 -1
- package/dist/services/oauth-connect.service.js +0 -4
- package/dist/services/oauth-connect.service.js.map +1 -1
- package/dist/services/oauth-token.service.d.ts.map +1 -1
- package/dist/services/oauth-token.service.js +4 -4
- package/dist/services/oauth-token.service.js.map +1 -1
- package/dist/services/password-auth.service.d.ts.map +1 -1
- package/dist/services/password-auth.service.js +3 -12
- package/dist/services/password-auth.service.js.map +1 -1
- package/dist/services/security.service.d.ts +0 -8
- package/dist/services/security.service.d.ts.map +1 -1
- package/dist/services/security.service.js +21 -82
- package/dist/services/security.service.js.map +1 -1
- package/dist/services/totp.service.js +2 -2
- package/dist/services/totp.service.js.map +1 -1
- package/package.json +2 -1
- package/public/assets/2fa-6btYq1AL.js +2 -0
- package/public/assets/{2fa-C37MUkye.js.map → 2fa-6btYq1AL.js.map} +1 -1
- package/public/assets/2fa-D3ieXkuh.js +2 -0
- package/public/assets/{2fa-kiqzGSz2.js.map → 2fa-D3ieXkuh.js.map} +1 -1
- package/public/assets/2fa-Dxh4Kxy-.js +2 -0
- package/public/assets/{2fa-BgveHSB_.js.map → 2fa-Dxh4Kxy-.js.map} +1 -1
- package/public/assets/2fa-UcpXAI9J.js +2 -0
- package/public/assets/{2fa-UL_cNRnQ.js.map → 2fa-UcpXAI9J.js.map} +1 -1
- package/public/assets/{DialogHandle-Zvz8SgS0.js → DialogHandle-tiMUnjZQ.js} +2 -2
- package/public/assets/{DialogHandle-Zvz8SgS0.js.map → DialogHandle-tiMUnjZQ.js.map} +1 -1
- package/public/assets/admin-B8RQbf4_.js +2 -0
- package/public/assets/admin-B8RQbf4_.js.map +1 -0
- package/public/assets/admin-users-Dz1QNdy3.js +2 -0
- package/public/assets/{admin-users-CwTJdiih.js.map → admin-users-Dz1QNdy3.js.map} +1 -1
- package/public/assets/alert-leqyvHOp.js.map +1 -1
- package/public/assets/{auth-choice-row-BlSsUI7d.js → auth-choice-row-DWzfcZQY.js} +2 -2
- package/public/assets/{auth-choice-row-BlSsUI7d.js.map → auth-choice-row-DWzfcZQY.js.map} +1 -1
- package/public/assets/{auth-field-HwxENJnB.js → auth-field-DsLGh1U-.js} +2 -2
- package/public/assets/{auth-field-HwxENJnB.js.map → auth-field-DsLGh1U-.js.map} +1 -1
- package/public/assets/auth-layout-DGTylGtX.js +2 -0
- package/public/assets/auth-layout-DGTylGtX.js.map +1 -0
- package/public/assets/{auth-page-header-CIs08f5Y.js → auth-page-header-COvqWINf.js} +2 -2
- package/public/assets/auth-page-header-COvqWINf.js.map +1 -0
- package/public/assets/authorization-context-banner-DVx1TsPY.js +2 -0
- package/public/assets/authorization-context-banner-DVx1TsPY.js.map +1 -0
- package/public/assets/{avatar-CttWiIv3.js → avatar-BCLugfaZ.js} +2 -2
- package/public/assets/{avatar-CttWiIv3.js.map → avatar-BCLugfaZ.js.map} +1 -1
- package/public/assets/badge-CsOfUji0.js.map +1 -1
- package/public/assets/{checkbox-CJrRV8S1.js → checkbox-CFVDS3zJ.js} +2 -2
- package/public/assets/{checkbox-CJrRV8S1.js.map → checkbox-CFVDS3zJ.js.map} +1 -1
- package/public/assets/config-DTQCUlfZ.js +2 -0
- package/public/assets/config-DTQCUlfZ.js.map +1 -0
- package/public/assets/{consent-BIhxtXHx.js → consent-CKOohdYI.js} +2 -2
- package/public/assets/{consent-BIhxtXHx.js.map → consent-CKOohdYI.js.map} +1 -1
- package/public/assets/{consent-DRmENn26.js → consent-ChiWc7Ql.js} +2 -2
- package/public/assets/{consent-DRmENn26.js.map → consent-ChiWc7Ql.js.map} +1 -1
- package/public/assets/createLucideIcon-BPpAIXR_.js.map +1 -1
- package/public/assets/{email-CVRDeJ78.js → email-Crjg1dcr.js} +2 -2
- package/public/assets/{email-CVRDeJ78.js.map → email-Crjg1dcr.js.map} +1 -1
- package/public/assets/email-UcpXAI9J.js +2 -0
- package/public/assets/{email-UL_cNRnQ.js.map → email-UcpXAI9J.js.map} +1 -1
- package/public/assets/error-VfMv226c.js +2 -0
- package/public/assets/{error-2VPY5w8V.js.map → error-VfMv226c.js.map} +1 -1
- package/public/assets/{field-DDt6F9TZ.js → field-89zKYDVL.js} +2 -2
- package/public/assets/{field-DDt6F9TZ.js.map → field-89zKYDVL.js.map} +1 -1
- package/public/assets/forgot-Dr88fVMq.js +2 -0
- package/public/assets/{forgot-DzDcduho.js.map → forgot-Dr88fVMq.js.map} +1 -1
- package/public/assets/forgot-UcpXAI9J.js +2 -0
- package/public/assets/{forgot-UL_cNRnQ.js.map → forgot-UcpXAI9J.js.map} +1 -1
- package/public/assets/{index-DZyHRhbQ.css → index-CDD8owGK.css} +1 -1
- package/public/assets/index-CZ0rWM7l.js +11 -0
- package/public/assets/index-CZ0rWM7l.js.map +1 -0
- package/public/assets/{initial-avatar-CZzHAPm3.js → initial-avatar-ocwNWL38.js} +2 -2
- package/public/assets/{initial-avatar-CZzHAPm3.js.map → initial-avatar-ocwNWL38.js.map} +1 -1
- package/public/assets/{input-CNRpSR08.js → input-GPigtjgi.js} +2 -2
- package/public/assets/{input-CNRpSR08.js.map → input-GPigtjgi.js.map} +1 -1
- package/public/assets/{labeled-separator-fnKySKv2.js → labeled-separator-CV7nb0XW.js} +2 -2
- package/public/assets/{labeled-separator-fnKySKv2.js.map → labeled-separator-CV7nb0XW.js.map} +1 -1
- package/public/assets/link-C-WdTj3F.js.map +1 -1
- package/public/assets/login-CQeTLmIu.js +2 -0
- package/public/assets/login-CQeTLmIu.js.map +1 -0
- package/public/assets/login-UcpXAI9J.js +2 -0
- package/public/assets/login-UcpXAI9J.js.map +1 -0
- package/public/assets/{logout-CHdmF_16.js → logout-B5T52P8u.js} +2 -2
- package/public/assets/{logout-CHdmF_16.js.map → logout-B5T52P8u.js.map} +1 -1
- package/public/assets/{modal-sCM_zT82.js → modal-BV3gpI-p.js} +2 -2
- package/public/assets/{modal-sCM_zT82.js.map → modal-BV3gpI-p.js.map} +1 -1
- package/public/assets/{mutationOptions-CrswitPs.js → mutationOptions-DyYFUbyn.js} +2 -2
- package/public/assets/{mutationOptions-CrswitPs.js.map → mutationOptions-DyYFUbyn.js.map} +1 -1
- package/public/assets/passkey-Bf7n49Z7.js +2 -0
- package/public/assets/{passkey-CEx1VZ5R.js.map → passkey-Bf7n49Z7.js.map} +1 -1
- package/public/assets/passkey-CT3G7pCL.js +2 -0
- package/public/assets/{passkey-CU8x9J2w.js.map → passkey-CT3G7pCL.js.map} +1 -1
- package/public/assets/passkey-J1qnYp9A.js +2 -0
- package/public/assets/{passkey-B2Blw47e.js.map → passkey-J1qnYp9A.js.map} +1 -1
- package/public/assets/passkey-UcpXAI9J.js +2 -0
- package/public/assets/{passkey-UL_cNRnQ.js.map → passkey-UcpXAI9J.js.map} +1 -1
- package/public/assets/password-BKI5GTRs.js +2 -0
- package/public/assets/password-BKI5GTRs.js.map +1 -0
- package/public/assets/password-UcpXAI9J.js +2 -0
- package/public/assets/password-UcpXAI9J.js.map +1 -0
- package/public/assets/password-reset-sU5KkBKi.js +2 -0
- package/public/assets/{password-reset-CIacHnvA.js.map → password-reset-sU5KkBKi.js.map} +1 -1
- package/public/assets/{password-strength-C0Zkrrct.js → password-strength-DTWF07Px.js} +2 -2
- package/public/assets/{password-strength-C0Zkrrct.js.map → password-strength-DTWF07Px.js.map} +1 -1
- package/public/assets/{pin-input-BlD4tPZJ.js → pin-input-BGOLfkwL.js} +2 -2
- package/public/assets/{pin-input-BlD4tPZJ.js.map → pin-input-BGOLfkwL.js.map} +1 -1
- package/public/assets/{profile-D43Yq-6S.js → profile-DSTMtoUf.js} +2 -2
- package/public/assets/{profile-D43Yq-6S.js.map → profile-DSTMtoUf.js.map} +1 -1
- package/public/assets/profile-RpDmbWNA.js +2 -0
- package/public/assets/profile-RpDmbWNA.js.map +1 -0
- package/public/assets/provider-logos-u1YURWQr.js.map +1 -1
- package/public/assets/recovery-DbgpqG6f.js +2 -0
- package/public/assets/{recovery-CLExnfYX.js.map → recovery-DbgpqG6f.js.map} +1 -1
- package/public/assets/register-B2Lixapy.js +2 -0
- package/public/assets/{register-CZUyWXRO.js.map → register-B2Lixapy.js.map} +1 -1
- package/public/assets/register-UcpXAI9J.js +2 -0
- package/public/assets/{register-UL_cNRnQ.js.map → register-UcpXAI9J.js.map} +1 -1
- package/public/assets/reset-C-Qjl2Qy.js +2 -0
- package/public/assets/reset-C-Qjl2Qy.js.map +1 -0
- package/public/assets/reset-UcpXAI9J.js +2 -0
- package/public/assets/{reset-UL_cNRnQ.js.map → reset-UcpXAI9J.js.map} +1 -1
- package/public/assets/{select-CWdSzsVo.js → select-BKx4bF4A.js} +2 -2
- package/public/assets/{select-CWdSzsVo.js.map → select-BKx4bF4A.js.map} +1 -1
- package/public/assets/select-UcpXAI9J.js +2 -0
- package/public/assets/{select-UL_cNRnQ.js.map → select-UcpXAI9J.js.map} +1 -1
- package/public/assets/{separator-BWGym8uM.js → separator-B0Bvh1he.js} +2 -2
- package/public/assets/{separator-BWGym8uM.js.map → separator-B0Bvh1he.js.map} +1 -1
- package/public/assets/shell-header-bar-CgyNXbPS.js +2 -0
- package/public/assets/shell-header-bar-CgyNXbPS.js.map +1 -0
- package/public/assets/{terms-D43Yq-6S.js → terms-DSTMtoUf.js} +2 -2
- package/public/assets/{terms-D43Yq-6S.js.map → terms-DSTMtoUf.js.map} +1 -1
- package/public/assets/{terms-COVFmzyl.js → terms-Vgpg5IZK.js} +2 -2
- package/public/assets/{terms-COVFmzyl.js.map → terms-Vgpg5IZK.js.map} +1 -1
- package/public/assets/{terms-checkbox-list-Cw0zB-lO.js → terms-checkbox-list-DqbXU4qw.js} +2 -2
- package/public/assets/{terms-checkbox-list-Cw0zB-lO.js.map → terms-checkbox-list-DqbXU4qw.js.map} +1 -1
- package/public/assets/{totp-BfCm6IWl.js → totp-BNZ904Zm.js} +2 -2
- package/public/assets/{totp-BfCm6IWl.js.map → totp-BNZ904Zm.js.map} +1 -1
- package/public/assets/totp-Cjns-PoB.js +2 -0
- package/public/assets/{totp-BFJEXxk0.js.map → totp-Cjns-PoB.js.map} +1 -1
- package/public/assets/totp-g0-s50HZ.js +2 -0
- package/public/assets/{totp-MINhsVxT.js.map → totp-g0-s50HZ.js.map} +1 -1
- package/public/assets/use-totp-setup-CtTaklH-.js +3 -0
- package/public/assets/{use-totp-setup-C7Zk_2IY.js.map → use-totp-setup-CtTaklH-.js.map} +1 -1
- package/public/assets/{useAriaLabelledBy-CiOCg6X5.js → useAriaLabelledBy-7uIPXK-0.js} +2 -2
- package/public/assets/{useAriaLabelledBy-CiOCg6X5.js.map → useAriaLabelledBy-7uIPXK-0.js.map} +1 -1
- package/public/assets/{useMutation-ZLFeJg75.js → useMutation-BWZ0G4Td.js} +2 -2
- package/public/assets/{useMutation-ZLFeJg75.js.map → useMutation-BWZ0G4Td.js.map} +1 -1
- package/public/assets/useQuery-pOdkMV4B.js +2 -0
- package/public/assets/{useQuery-BvMz34BW.js.map → useQuery-pOdkMV4B.js.map} +1 -1
- package/public/assets/users-B1hvVo3B.js +2 -0
- package/public/assets/users-B1hvVo3B.js.map +1 -0
- package/public/index.html +4 -5
- package/dist/routes/api/auth/password/reset-required/post.d.ts +0 -18
- package/dist/routes/api/auth/password/reset-required/post.d.ts.map +0 -1
- package/dist/routes/api/auth/password/reset-required/post.js +0 -39
- package/dist/routes/api/auth/password/reset-required/post.js.map +0 -1
- package/dist/services/legacy-credential-retirement.service.d.ts +0 -20
- package/dist/services/legacy-credential-retirement.service.d.ts.map +0 -1
- package/dist/services/legacy-credential-retirement.service.js +0 -90
- package/dist/services/legacy-credential-retirement.service.js.map +0 -1
- package/public/assets/2fa-BgveHSB_.js +0 -2
- package/public/assets/2fa-C37MUkye.js +0 -2
- package/public/assets/2fa-UL_cNRnQ.js +0 -2
- package/public/assets/2fa-kiqzGSz2.js +0 -2
- package/public/assets/admin-DbDuu6AI.js +0 -2
- package/public/assets/admin-DbDuu6AI.js.map +0 -1
- package/public/assets/admin-users-CwTJdiih.js +0 -2
- package/public/assets/auth-layout-CoeqNhTT.js +0 -2
- package/public/assets/auth-layout-CoeqNhTT.js.map +0 -1
- package/public/assets/auth-page-header-CIs08f5Y.js.map +0 -1
- package/public/assets/authorization-context-banner-BbtQmMYH.js +0 -2
- package/public/assets/authorization-context-banner-BbtQmMYH.js.map +0 -1
- package/public/assets/config-v3-oy_ef.js +0 -2
- package/public/assets/config-v3-oy_ef.js.map +0 -1
- package/public/assets/email-UL_cNRnQ.js +0 -2
- package/public/assets/error-2VPY5w8V.js +0 -2
- package/public/assets/forgot-DzDcduho.js +0 -2
- package/public/assets/forgot-UL_cNRnQ.js +0 -2
- package/public/assets/index-gliHKncz.js +0 -11
- package/public/assets/index-gliHKncz.js.map +0 -1
- package/public/assets/link-BN90emXr.js +0 -2
- package/public/assets/link-BN90emXr.js.map +0 -1
- package/public/assets/lock-keyhole-Cz72xkCn.js +0 -2
- package/public/assets/lock-keyhole-Cz72xkCn.js.map +0 -1
- package/public/assets/login-C6m2qSUt.js +0 -2
- package/public/assets/login-C6m2qSUt.js.map +0 -1
- package/public/assets/login-UL_cNRnQ.js +0 -2
- package/public/assets/login-UL_cNRnQ.js.map +0 -1
- package/public/assets/passkey-B2Blw47e.js +0 -2
- package/public/assets/passkey-CEx1VZ5R.js +0 -2
- package/public/assets/passkey-CU8x9J2w.js +0 -2
- package/public/assets/passkey-UL_cNRnQ.js +0 -2
- package/public/assets/password-BhU_a0cR.js +0 -2
- package/public/assets/password-BhU_a0cR.js.map +0 -1
- package/public/assets/password-UL_cNRnQ.js +0 -2
- package/public/assets/password-UL_cNRnQ.js.map +0 -1
- package/public/assets/password-reset-CIacHnvA.js +0 -2
- package/public/assets/profile-D1cEjfs8.js +0 -2
- package/public/assets/profile-D1cEjfs8.js.map +0 -1
- package/public/assets/recovery-CLExnfYX.js +0 -2
- package/public/assets/register-CZUyWXRO.js +0 -2
- package/public/assets/register-UL_cNRnQ.js +0 -2
- package/public/assets/reset-N3RQTYEB.js +0 -2
- package/public/assets/reset-N3RQTYEB.js.map +0 -1
- package/public/assets/reset-UL_cNRnQ.js +0 -2
- package/public/assets/reset-required-Cv5edDS6.js +0 -2
- package/public/assets/reset-required-Cv5edDS6.js.map +0 -1
- package/public/assets/reset-required-UL_cNRnQ.js +0 -2
- package/public/assets/reset-required-UL_cNRnQ.js.map +0 -1
- package/public/assets/select-UL_cNRnQ.js +0 -2
- package/public/assets/shell-header-bar-C9AB5lT-.js +0 -2
- package/public/assets/shell-header-bar-C9AB5lT-.js.map +0 -1
- package/public/assets/totp-BFJEXxk0.js +0 -2
- package/public/assets/totp-MINhsVxT.js +0 -2
- package/public/assets/use-totp-setup-C7Zk_2IY.js +0 -3
- package/public/assets/useQuery-BvMz34BW.js +0 -2
- package/public/assets/users-COM7u3A-.js +0 -2
- package/public/assets/users-COM7u3A-.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-totp-setup-C7Zk_2IY.js","names":["__iconNode","REASONS.triggerPress","_formatErrorMessage","baseMapping","REASONS.none","ownerWindow","Collapsible.Panel","Collapsible.Root","Collapsible.Trigger"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/copy.mjs","../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/info.mjs","../../../frontend/src/components/totp/recovery-codes-step.tsx","../../../frontend/src/components/totp/verify-step.tsx","../../../../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/collapsible/root/useCollapsibleRoot.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/collapsible/root/CollapsibleRootContext.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/collapsible/panel/CollapsiblePanelDataAttributes.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/collapsible/trigger/CollapsibleTriggerDataAttributes.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/utils/collapsibleOpenStateMapping.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/collapsible/root/stateAttributesMapping.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/collapsible/root/CollapsibleRoot.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/collapsible/trigger/CollapsibleTrigger.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/collapsible/panel/useCollapsiblePanel.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/collapsible/panel/CollapsiblePanelCssVars.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/collapsible/panel/CollapsiblePanel.mjs","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/collapsible/collapsible-panel.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/collapsible/collapsible-root.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/collapsible/collapsible-trigger.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/collapsible/index.js","../../../frontend/src/components/totp/qr-step.tsx","../../../frontend/src/features/totp/use-totp-setup.ts"],"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 [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n];\nconst Copy = createLucideIcon(\"copy\", __iconNode);\n\nexport { __iconNode, Copy as default };\n//# sourceMappingURL=copy.mjs.map\n","/**\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 [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n];\nconst Info = createLucideIcon(\"info\", __iconNode);\n\nexport { __iconNode, Info as default };\n//# sourceMappingURL=info.mjs.map\n","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCheckbox } from '@tinyrack/ui/components/checkbox';\nimport { TRField } from '@tinyrack/ui/components/field';\nimport { TRToast } from '@tinyrack/ui/components/toast';\nimport { CopyIcon, TriangleAlertIcon } from 'lucide-react';\nimport { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\n\nexport interface RecoveryCodesStepProps {\n recoveryCodes: string[];\n onConfirm: () => void;\n isLoading?: boolean;\n className?: string;\n}\n\nexport function RecoveryCodesStep({\n recoveryCodes,\n onConfirm,\n isLoading = false,\n className = '',\n}: RecoveryCodesStepProps) {\n const { t } = useTranslation();\n const toast = TRToast.useToastManager();\n const [confirmed, setConfirmed] = useState(false);\n\n // The toast manager owns the dismissal timer, so this no longer keeps a\n // \"copied\" flag alive with its own setTimeout.\n const handleCopy = useCallback(async () => {\n await navigator.clipboard.writeText(recoveryCodes.join('\\n'));\n toast.add({ title: t('setupTotp.recoveryCodes.copied'), type: 'success' });\n }, [recoveryCodes, toast, t]);\n\n return (\n <div className={`flex flex-col gap-tinyrack-lg ${className}`}>\n <p className=\"text-tinyrack-sm text-tinyrack-text-muted\">\n {t('setupTotp.recoveryCodes.description')}\n </p>\n\n {/*\n Two columns so a full set of codes stays on one screen without\n scrolling — this is the only time the user will ever see them.\n */}\n <div\n className=\"grid grid-cols-2 gap-tinyrack-sm rounded-tinyrack-lg border border-tinyrack-border bg-tinyrack-surface p-tinyrack-lg\"\n data-testid=\"recovery-codes-grid\"\n >\n {recoveryCodes.map((code) => (\n <code\n className=\"rounded-tinyrack-sm bg-tinyrack-surface-muted px-tinyrack-sm py-tinyrack-3xs text-center font-tinyrack-mono text-tinyrack-sm text-tinyrack-text\"\n key={code}\n >\n {code}\n </code>\n ))}\n </div>\n\n <Alert icon={TriangleAlertIcon} type=\"warning\">\n {t('setupTotp.recoveryCodes.warning')}\n </Alert>\n\n <TRButton\n appearance=\"outline\"\n className=\"w-full gap-tinyrack-sm\"\n intent=\"neutral\"\n onClick={handleCopy}\n type=\"button\"\n >\n <CopyIcon aria-hidden className=\"size-tinyrack-lg\" />\n {t('setupTotp.recoveryCodes.copy')}\n </TRButton>\n\n {/*\n `TRField.Root` owns the label/control association, so the checkbox\n keeps its own focus ring instead of being swallowed by a wrapping\n `<label>` that had none.\n */}\n <TRField.Root>\n <div className=\"flex items-center gap-tinyrack-sm\">\n <TRCheckbox.Root\n checked={confirmed}\n data-testid=\"recovery-codes-confirm\"\n disabled={isLoading}\n onCheckedChange={(checked) => setConfirmed(checked === true)}\n uiSize=\"md\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n <TRField.Label className=\"cursor-pointer\">\n {t('setupTotp.recoveryCodes.confirmCheckbox')}\n </TRField.Label>\n </div>\n </TRField.Root>\n\n <TRButton\n className=\"w-full\"\n data-testid=\"recovery-codes-submit\"\n disabled={!confirmed || isLoading}\n intent=\"primary\"\n loading={isLoading}\n onClick={onConfirm}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('setupTotp.recoveryCodes.confirm')}\n </TRButton>\n </div>\n );\n}\n","import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { useCallback, useMemo, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport {\n PinInput,\n type PinInputRef,\n} from '#frontend/components/ui/pin-input.tsx';\n\nexport interface VerifyStepProps {\n onSubmit: (code: string) => Promise<void>;\n onBack?: (() => void) | undefined;\n isPending: boolean;\n invalidMessage?: string | undefined;\n submitLabel?: string | undefined;\n pendingText?: string | undefined;\n backLabel?: string | undefined;\n className?: string;\n}\n\ntype VerifyFormValues = {\n code: string;\n};\n\nexport function VerifyStep({\n onSubmit,\n onBack,\n isPending,\n invalidMessage,\n submitLabel,\n pendingText,\n backLabel,\n className = '',\n}: VerifyStepProps) {\n const { t } = useTranslation();\n const pinInputRef = useRef<PinInputRef>(null);\n\n const verifySchema = useMemo(\n () =>\n z.object({\n code: z\n .string()\n .length(6, t('validation.totp.length'))\n .regex(/^\\d{6}$/, t('validation.totp.digits')),\n }),\n [t],\n );\n\n const {\n setValue,\n setError,\n handleSubmit,\n watch,\n formState: { errors },\n } = useForm<VerifyFormValues>({\n defaultValues: { code: '' },\n resolver: standardSchemaResolver(verifySchema),\n });\n\n const codeValue = watch('code');\n\n const handleFormSubmit = useCallback(\n async (values: VerifyFormValues) => {\n try {\n await onSubmit(values.code);\n } catch {\n setError('code', {\n type: 'manual',\n message: invalidMessage ?? t('setupTotp.error.invalid'),\n });\n setValue('code', '');\n pinInputRef.current?.focus();\n }\n },\n [invalidMessage, onSubmit, setError, setValue, t],\n );\n\n return (\n <div className={`flex flex-col gap-tinyrack-lg ${className}`}>\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(handleFormSubmit)}\n >\n <PinInput\n autoFocus\n error={errors.code}\n length={6}\n onChange={(value) => setValue('code', value)}\n onComplete={() => handleSubmit(handleFormSubmit)()}\n ref={pinInputRef}\n value={codeValue}\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={isPending}\n loadingLabel={pendingText ?? t('setupTotp.verifying')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {submitLabel ?? t('setupTotp.verify')}\n </TRButton>\n </form>\n\n {onBack && (\n <TRButton\n appearance=\"ghost\"\n className=\"w-full\"\n data-testid=\"totp-verify-back\"\n disabled={isPending}\n intent=\"neutral\"\n onClick={onBack}\n type=\"button\"\n >\n {backLabel ?? t('setupTotp.back')}\n </TRButton>\n )}\n </div>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { useControlled } from '@base-ui/utils/useControlled';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { useTransitionStatus } from \"../../internals/useTransitionStatus.mjs\";\nexport function useCollapsibleRoot(parameters) {\n const {\n open: openParam,\n defaultOpen,\n onOpenChange,\n disabled\n } = parameters;\n const [open, setOpen] = useControlled({\n controlled: openParam,\n default: defaultOpen,\n name: 'Collapsible',\n state: 'open'\n });\n const {\n mounted,\n setMounted,\n transitionStatus\n } = useTransitionStatus(open, true, true);\n const defaultPanelId = useBaseUiId();\n // `undefined` uses the initial generated fallback; `null` means the panel unmounted.\n const [registeredPanelId, setPanelIdState] = React.useState();\n const panelId = registeredPanelId === null ? undefined : registeredPanelId ?? defaultPanelId;\n const handleTrigger = useStableCallback(event => {\n const nextOpen = !open;\n const eventDetails = createChangeEventDetails(REASONS.triggerPress, event.nativeEvent);\n onOpenChange(nextOpen, eventDetails);\n if (eventDetails.isCanceled) {\n return;\n }\n setOpen(nextOpen);\n });\n return React.useMemo(() => ({\n defaultPanelId,\n disabled,\n handleTrigger,\n mounted,\n open,\n panelId,\n setMounted,\n setOpen,\n setPanelIdState,\n transitionStatus\n }), [defaultPanelId, disabled, handleTrigger, mounted, open, panelId, setMounted, setOpen, setPanelIdState, transitionStatus]);\n}","'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nexport const CollapsibleRootContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") CollapsibleRootContext.displayName = \"CollapsibleRootContext\";\nexport function useCollapsibleRootContext() {\n const context = React.useContext(CollapsibleRootContext);\n if (context === undefined) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: CollapsibleRootContext is missing. Collapsible parts must be placed within <Collapsible.Root>.' : _formatErrorMessage(15));\n }\n return context;\n}","import { TransitionStatusDataAttributes } from \"../../internals/stateAttributesMapping.mjs\";\nexport let CollapsiblePanelDataAttributes = function (CollapsiblePanelDataAttributes) {\n /**\n * Present when the collapsible panel is open.\n */\n CollapsiblePanelDataAttributes[\"open\"] = \"data-open\";\n /**\n * Present when the collapsible panel is closed.\n */\n CollapsiblePanelDataAttributes[\"closed\"] = \"data-closed\";\n /**\n * Present when the panel begins animating in.\n */\n CollapsiblePanelDataAttributes[CollapsiblePanelDataAttributes[\"startingStyle\"] = TransitionStatusDataAttributes.startingStyle] = \"startingStyle\";\n /**\n * Present when the panel is animating out.\n */\n CollapsiblePanelDataAttributes[CollapsiblePanelDataAttributes[\"endingStyle\"] = TransitionStatusDataAttributes.endingStyle] = \"endingStyle\";\n return CollapsiblePanelDataAttributes;\n}({});","export let CollapsibleTriggerDataAttributes = /*#__PURE__*/function (CollapsibleTriggerDataAttributes) {\n /**\n * Present when the collapsible panel is open.\n */\n CollapsibleTriggerDataAttributes[\"panelOpen\"] = \"data-panel-open\";\n return CollapsibleTriggerDataAttributes;\n}({});","import { CollapsiblePanelDataAttributes } from \"../collapsible/panel/CollapsiblePanelDataAttributes.mjs\";\nimport { CollapsibleTriggerDataAttributes } from \"../collapsible/trigger/CollapsibleTriggerDataAttributes.mjs\";\nconst PANEL_OPEN_HOOK = {\n [CollapsiblePanelDataAttributes.open]: ''\n};\nconst PANEL_CLOSED_HOOK = {\n [CollapsiblePanelDataAttributes.closed]: ''\n};\nexport const triggerOpenStateMapping = {\n open(value) {\n if (value) {\n return {\n [CollapsibleTriggerDataAttributes.panelOpen]: ''\n };\n }\n return null;\n }\n};\nexport const collapsibleOpenStateMapping = {\n open(value) {\n if (value) {\n return PANEL_OPEN_HOOK;\n }\n return PANEL_CLOSED_HOOK;\n }\n};","import { collapsibleOpenStateMapping as baseMapping } from \"../../utils/collapsibleOpenStateMapping.mjs\";\nimport { transitionStatusMapping } from \"../../internals/stateAttributesMapping.mjs\";\nexport const collapsibleStateAttributesMapping = {\n ...baseMapping,\n ...transitionStatusMapping\n};","'use client';\n\nimport * as React from 'react';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useCollapsibleRoot } from \"./useCollapsibleRoot.mjs\";\nimport { CollapsibleRootContext } from \"./CollapsibleRootContext.mjs\";\nimport { collapsibleStateAttributesMapping } from \"./stateAttributesMapping.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\n/**\n * Groups all parts of the collapsible.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Collapsible](https://base-ui.com/react/components/collapsible)\n */\nexport const CollapsibleRoot = /*#__PURE__*/React.forwardRef(function CollapsibleRoot(componentProps, forwardedRef) {\n const {\n render,\n className,\n defaultOpen = false,\n disabled = false,\n onOpenChange: onOpenChangeProp,\n open,\n style,\n ...elementProps\n } = componentProps;\n const onOpenChange = useStableCallback(onOpenChangeProp);\n const collapsible = useCollapsibleRoot({\n open,\n defaultOpen,\n onOpenChange,\n disabled\n });\n const state = React.useMemo(() => ({\n open: collapsible.open,\n disabled: collapsible.disabled,\n transitionStatus: collapsible.transitionStatus\n }), [collapsible.open, collapsible.disabled, collapsible.transitionStatus]);\n const contextValue = React.useMemo(() => ({\n ...collapsible,\n onOpenChange,\n state\n }), [collapsible, onOpenChange, state]);\n const element = useRenderElement('div', componentProps, {\n state,\n ref: forwardedRef,\n props: elementProps,\n stateAttributesMapping: collapsibleStateAttributesMapping\n });\n return /*#__PURE__*/_jsx(CollapsibleRootContext.Provider, {\n value: contextValue,\n children: element\n });\n});\nif (process.env.NODE_ENV !== \"production\") CollapsibleRoot.displayName = \"CollapsibleRoot\";","'use client';\n\nimport * as React from 'react';\nimport { triggerOpenStateMapping } from \"../../utils/collapsibleOpenStateMapping.mjs\";\nimport { transitionStatusMapping } from \"../../internals/stateAttributesMapping.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useButton } from \"../../internals/use-button/index.mjs\";\nimport { useCollapsibleRootContext } from \"../root/CollapsibleRootContext.mjs\";\nconst stateAttributesMapping = {\n ...triggerOpenStateMapping,\n ...transitionStatusMapping\n};\n\n/**\n * A button that opens and closes the collapsible panel.\n * Renders a `<button>` element.\n *\n * Documentation: [Base UI Collapsible](https://base-ui.com/react/components/collapsible)\n */\nexport const CollapsibleTrigger = /*#__PURE__*/React.forwardRef(function CollapsibleTrigger(componentProps, forwardedRef) {\n const {\n panelId,\n open,\n handleTrigger,\n state,\n disabled: contextDisabled\n } = useCollapsibleRootContext();\n const {\n className,\n disabled = contextDisabled,\n render,\n nativeButton = true,\n style,\n ...elementProps\n } = componentProps;\n const {\n getButtonProps,\n buttonRef\n } = useButton({\n disabled,\n focusableWhenDisabled: true,\n native: nativeButton\n });\n const element = useRenderElement('button', componentProps, {\n state,\n ref: [forwardedRef, buttonRef],\n props: [{\n 'aria-controls': open ? panelId : undefined,\n 'aria-expanded': open,\n onClick: handleTrigger\n }, elementProps, getButtonProps],\n stateAttributesMapping\n });\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") CollapsibleTrigger.displayName = \"CollapsibleTrigger\";","'use client';\n\nimport * as React from 'react';\nimport { addEventListener } from '@base-ui/utils/addEventListener';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useMergedRefs } from '@base-ui/utils/useMergedRefs';\nimport { AnimationFrame } from '@base-ui/utils/useAnimationFrame';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useValueAsRef } from '@base-ui/utils/useValueAsRef';\nimport { warn } from '@base-ui/utils/warn';\nimport { ownerWindow } from '@base-ui/utils/owner';\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { useOpenChangeComplete } from \"../../internals/useOpenChangeComplete.mjs\";\nimport { useAnimationsFinished } from \"../../internals/useAnimationsFinished.mjs\";\nimport { CollapsiblePanelDataAttributes } from \"./CollapsiblePanelDataAttributes.mjs\";\nconst EMPTY_DIMENSIONS = {\n height: undefined,\n width: undefined\n};\nexport function useCollapsiblePanel(parameters) {\n const {\n externalRef,\n hiddenUntilFound,\n id: idParam,\n keepMounted,\n mounted,\n onOpenChange,\n open,\n setMounted,\n setOpen,\n transitionStatus\n } = parameters;\n const panelRef = React.useRef(null);\n const animationTypeRef = React.useRef(null);\n const [dimensions, setDimensionsUnwrapped] = React.useState(EMPTY_DIMENSIONS);\n const lastMeasuredDimensionsRef = React.useRef(EMPTY_DIMENSIONS);\n // `beforematch` should reveal the matched content immediately, so the next\n // open cycle skips author-defined motion once and then returns to normal.\n const shouldSkipNextOpenRef = React.useRef(false);\n // Keyframe mount animations on initially open panels cause a visible layout\n // shift during the server-rendered first paint, so suppress that first open\n // lifecycle until the panel has been closed once.\n const shouldPreventMountAnimationRef = React.useRef(open);\n // React.Activity tears down Effects while preserving state, so revealing an\n // already-open panel would otherwise replay its CSS keyframe open animation.\n const shouldPreventActivityResumeAnimationRef = React.useRef(false);\n // Some open paths intentionally bypass motion, but the shared root transition\n // status still advances asynchronously. Override the panel to idle so its data\n // attributes and dimension cleanup reflect the immediate open state.\n const [forcePanelIdle, setForcePanelIdle] = React.useState(false);\n const pendingTemporaryStyleRestoreRef = React.useRef(null);\n const mergedPanelRef = useMergedRefs(externalRef, panelRef);\n const latestOpenRef = useValueAsRef(open);\n // Only used to handle panel close\n const runOnceCloseAnimationsFinish = useAnimationsFinished(panelRef);\n const hidden = !open && !mounted;\n const panelTransitionStatus = forcePanelIdle ? 'idle' : transitionStatus;\n const shouldPreventOpenAnimation = open && (\n // These 2 refs are safe to read in render, they are only written from committed\n // layout/effect paths and gate one-shot motion suppression for the next open\n // lifecycle. They intentionally expose the last committed motion snapshot.\n shouldPreventMountAnimationRef.current || shouldPreventActivityResumeAnimationRef.current);\n const renderedDimensions = !open && mounted &&\n // These 2 refs are also safe to read in render, both hold the last committed\n // animation mode and measurement. This fallback only restores a previously\n // measured pixel size after the live dimensions state has been reset back to `auto`.\n animationTypeRef.current === 'css-animation' && dimensions.height === undefined && dimensions.width === undefined ? lastMeasuredDimensionsRef.current : dimensions;\n const shouldPersistHiddenTransitionStyles = hiddenUntilFound && hidden && animationTypeRef.current !== 'css-animation';\n\n // Most measured dimensions are reused later when CSS keyframe closes need a\n // pixel size after the rendered dimensions have been reset back to `auto`.\n // Passing `false` is only for clearing the current dimensions state.\n const setDimensions = useStableCallback((nextDimensions, shouldCacheMeasurement = true) => {\n if (shouldCacheMeasurement) {\n lastMeasuredDimensionsRef.current = nextDimensions;\n }\n setDimensionsUnwrapped(nextDimensions);\n });\n const restorePendingTemporaryStyle = useStableCallback(() => {\n pendingTemporaryStyleRestoreRef.current?.();\n pendingTemporaryStyleRestoreRef.current = null;\n });\n const setPendingTemporaryStyleRestore = useStableCallback(restore => {\n restorePendingTemporaryStyle();\n pendingTemporaryStyleRestoreRef.current = () => {\n pendingTemporaryStyleRestoreRef.current = null;\n restore();\n };\n });\n\n // React.Activity unmounts Effects while preserving component state. If that\n // teardown happens while an already-open keyframe panel is visible, remember\n // to suppress the replayed open animation on the next committed reveal.\n const markActivityResumeAnimationSuppressed = useStableCallback(() => {\n if (open && mounted && animationTypeRef.current === 'css-animation') {\n shouldPreventActivityResumeAnimationRef.current = true;\n }\n });\n useIsoLayoutEffect(() => {\n // `forcePanelIdle` is only a temporary override for open paths that skip\n // motion. Keep it active while the shared root still reports `starting`,\n // then drop it once the root transition state catches up.\n if (!forcePanelIdle || transitionStatus === 'starting') {\n return;\n }\n setForcePanelIdle(false);\n }, [forcePanelIdle, transitionStatus]);\n React.useEffect(() => {\n return () => {\n markActivityResumeAnimationSuppressed();\n restorePendingTemporaryStyle();\n };\n }, [markActivityResumeAnimationSuppressed, restorePendingTemporaryStyle]);\n useIsoLayoutEffect(() => {\n const panel = panelRef.current;\n if (!panel) {\n return undefined;\n }\n\n // `beforematch` can temporarily force a `0s` motion duration so the matched\n // content reveals immediately. Restore the authored duration before detecting\n // the next close animation type, otherwise that first close is misread as\n // \"no motion\" and the close transition or keyframe gets skipped.\n if (!open && pendingTemporaryStyleRestoreRef.current) {\n restorePendingTemporaryStyle();\n }\n const animationType = getAnimationType(panel, shouldPreventOpenAnimation);\n animationTypeRef.current = animationType;\n\n // Initially open keyframe panels skip their first paint animation to avoid\n // layout shift, but we still need to cache the expanded size so the first\n // close animation can start from pixels instead of `auto`.\n if (open && transitionStatus === 'idle' && shouldPreventMountAnimationRef.current && animationType === 'css-animation') {\n lastMeasuredDimensionsRef.current = getDimensions(panel);\n return undefined;\n }\n\n // Handle the opening pass: measure the expanded size and, when necessary,\n // neutralize author-defined motion so the panel can open immediately.\n if (open && transitionStatus === 'starting') {\n // `beforematch` opens should reveal the panel immediately so find-in-page\n // does not wait for the author-defined transition or animation to finish.\n const skipNextOpen = shouldSkipNextOpenRef.current;\n shouldSkipNextOpenRef.current = false;\n if (animationType === 'none') {\n setDimensions(getDimensions(panel));\n setForcePanelIdle(true);\n return undefined;\n }\n if (animationType === 'css-transition') {\n const restoreLayoutStyles = resetLayoutStyles(panel);\n setDimensions(getDimensions(panel));\n if (!skipNextOpen) {\n return restoreLayoutStyles;\n }\n const restoreTransitionDuration = setTemporaryStyle(panel, 'transition-duration', '0s');\n setPendingTemporaryStyleRestore(restoreTransitionDuration);\n setForcePanelIdle(true);\n return restoreLayoutStyles;\n }\n setDimensions(getDimensions(panel));\n const restoreAnimationName = setTemporaryStyle(panel, 'animation-name', 'none');\n if (!skipNextOpen) {\n restoreAnimationName();\n return undefined;\n }\n const restoreAnimationDuration = setTemporaryStyle(panel, 'animation-duration', '0s');\n restoreAnimationName();\n setPendingTemporaryStyleRestore(restoreAnimationDuration);\n setForcePanelIdle(true);\n return undefined;\n }\n\n // Capture the current size as soon as close is requested, before the\n // deferred ending phase applies closed styles. This keeps close transitions\n // starting from a measured pixel value, including interrupted opens.\n if (!open && mounted && (transitionStatus === 'idle' || transitionStatus === 'starting')) {\n shouldPreventMountAnimationRef.current = false;\n shouldPreventActivityResumeAnimationRef.current = false;\n if (animationType === 'none') {\n setDimensions(EMPTY_DIMENSIONS, false);\n setMounted(false);\n return undefined;\n }\n setDimensions(getDimensions(panel));\n return undefined;\n }\n if (transitionStatus !== 'ending') {\n return undefined;\n }\n\n // Reachable when `transitionStatus` already flipped to `ending` before this effect ran, so\n // the close branch above was skipped. Without motion there is nothing to wait for, so unmount\n // here instead of deferring to the animation-finished path below.\n if (animationType === 'none') {\n setMounted(false);\n return undefined;\n }\n const nextDimensions = getDimensions(panel);\n const hasMeasuredSize = nextDimensions.height > 0 || nextDimensions.width > 0;\n if (!hasMeasuredSize) {\n setMounted(false);\n return undefined;\n }\n setDimensions(nextDimensions);\n if (animationType === 'css-animation') {\n const restoreAnimationName = setTemporaryStyle(panel, 'animation-name', 'none');\n restoreAnimationName();\n }\n return undefined;\n }, [mounted, open, restorePendingTemporaryStyle, setDimensions, setMounted, setPendingTemporaryStyleRestore, shouldPreventOpenAnimation, transitionStatus]);\n useOpenChangeComplete({\n enabled: open && mounted && panelTransitionStatus === 'idle',\n open: true,\n ref: panelRef,\n onComplete() {\n // `useOpenChangeComplete` only aborts from its effect cleanup, which React runs in the\n // post-paint passive flush. An animation's `finished` microtask can resolve after the render\n // that set `open` to `false` but before that cleanup, so re-check the latest value here.\n // Clearing the measured size in that window would make the close transition start from\n // `height: 0` instead of the expanded pixel height.\n if (!open) {\n return;\n }\n setDimensions(EMPTY_DIMENSIONS, false);\n }\n });\n\n // Closing panels need extra sequencing beyond `useOpenChangeComplete`.\n // This passive effect runs after the `ending` render has committed, so\n // `[data-ending-style]` is already present. Chrome can still register the\n // exit transition one frame later when an Accordion closes one item while\n // opening another, so wait one frame before watching animations.\n // See https://github.com/mui/base-ui/issues/3099\n React.useEffect(() => {\n if (open || !mounted || panelTransitionStatus !== 'ending') {\n return undefined;\n }\n const panel = panelRef.current;\n if (!panel) {\n return undefined;\n }\n const abortController = new AbortController();\n let endingStyleFrame = -1;\n function handleComplete() {\n // Same post-paint race as the `useOpenChangeComplete` callback above, except `open` is\n // captured by this effect's closure and always `false` here, so read the latest value from\n // a ref. Unmounting a panel that has already reopened would drop it from the DOM.\n if (latestOpenRef.current) {\n return;\n }\n setMounted(false);\n setDimensions(EMPTY_DIMENSIONS, false);\n }\n endingStyleFrame = AnimationFrame.request(() => {\n runOnceCloseAnimationsFinish(handleComplete, abortController.signal);\n });\n return () => {\n AnimationFrame.cancel(endingStyleFrame);\n abortController.abort();\n };\n }, [latestOpenRef, mounted, open, panelTransitionStatus, runOnceCloseAnimationsFinish, setDimensions, setMounted]);\n useIsoLayoutEffect(() => {\n const panel = panelRef.current;\n if (!panel || !hiddenUntilFound || !hidden) {\n return;\n }\n\n // React only supports a boolean for the `hidden` attribute and forces\n // legit string values to booleans so we have to force it back in the DOM\n // when necessary: https://github.com/react/react/issues/24740\n panel.setAttribute('hidden', 'until-found');\n }, [hidden, hiddenUntilFound]);\n React.useEffect(function registerBeforeMatchListener() {\n const panel = panelRef.current;\n if (!panel) {\n return undefined;\n }\n function handleBeforeMatch(event) {\n const eventDetails = createChangeEventDetails(REASONS.none, event);\n onOpenChange(true, eventDetails);\n if (eventDetails.isCanceled) {\n return;\n }\n shouldSkipNextOpenRef.current = true;\n setOpen(true);\n }\n return addEventListener(panel, 'beforematch', handleBeforeMatch);\n }, [onOpenChange, setOpen]);\n const shouldRender = keepMounted || hiddenUntilFound || mounted || open;\n return {\n height: renderedDimensions.height,\n props: {\n ...(shouldPersistHiddenTransitionStyles ? {\n [CollapsiblePanelDataAttributes.startingStyle]: ''\n } : undefined),\n hidden,\n id: idParam\n },\n ref: mergedPanelRef,\n shouldPreventOpenAnimation,\n shouldRender,\n transitionStatus: panelTransitionStatus,\n width: renderedDimensions.width\n };\n}\nfunction getDimensions(element) {\n return {\n height: element.scrollHeight,\n width: element.scrollWidth\n };\n}\nfunction getAnimationType(element, hasSuppressedMountAnimation) {\n const panelStyles = ownerWindow(element).getComputedStyle(element);\n const hasAnimation = (panelStyles.animationName.split(',').map(name => name.trim()).some(name => name !== '' && name !== 'none') || hasSuppressedMountAnimation) && hasNonZeroDuration(panelStyles.animationDuration);\n const hasTransition = hasNonZeroDuration(panelStyles.transitionDuration);\n if (hasAnimation && hasTransition) {\n /* istanbul ignore else -- `process.env.NODE_ENV` is a build-time constant under test */\n if (process.env.NODE_ENV !== 'production') {\n warn('CSS transitions and CSS animations both detected on Collapsible or Accordion panel.', 'Only one of either animation type should be used.');\n }\n return 'css-transition';\n }\n if (hasTransition) {\n return 'css-transition';\n }\n if (hasAnimation) {\n return 'css-animation';\n }\n return 'none';\n}\nfunction hasNonZeroDuration(value) {\n return value.split(',').map(part => part.trim()).some(part => part !== '' && Number.parseFloat(part) > 0);\n}\n\n/**\n * Temporarily overrides an inline style property and returns a cleanup that\n * restores the previous inline value and priority.\n * @param element - The element whose inline style should be updated.\n * @param property - The CSS property name to override.\n * @param value - The temporary value to assign.\n * @returns A cleanup function that restores the original inline style state.\n */\nfunction setTemporaryStyle(element, property, value) {\n const previousValue = element.style.getPropertyValue(property);\n const previousPriority = element.style.getPropertyPriority(property);\n element.style.setProperty(property, value);\n return () => {\n if (previousValue === '') {\n element.style.removeProperty(property);\n return;\n }\n element.style.setProperty(property, previousValue, previousPriority);\n };\n}\n\n/**\n * Temporarily resets inline alignment styles that can distort scroll-based\n * size measurements, then restores them on the next animation frame.\n * @param element - The panel element being measured.\n * @returns A cleanup function that cancels the scheduled restore and reapplies\n * the original inline layout styles immediately.\n */\nfunction resetLayoutStyles(element) {\n const originalLayoutStyles = {\n 'justify-content': element.style.justifyContent,\n 'align-items': element.style.alignItems,\n 'align-content': element.style.alignContent,\n 'justify-items': element.style.justifyItems\n };\n Object.keys(originalLayoutStyles).forEach(key => {\n element.style.setProperty(key, 'initial', 'important');\n });\n function restoreLayoutStyles() {\n Object.entries(originalLayoutStyles).forEach(([key, value]) => {\n if (value === '') {\n element.style.removeProperty(key);\n return;\n }\n element.style.setProperty(key, value);\n });\n }\n const frame = AnimationFrame.request(restoreLayoutStyles);\n return () => {\n AnimationFrame.cancel(frame);\n restoreLayoutStyles();\n };\n}","export let CollapsiblePanelCssVars = /*#__PURE__*/function (CollapsiblePanelCssVars) {\n /**\n * The collapsible panel's height.\n * @type {number}\n */\n CollapsiblePanelCssVars[\"collapsiblePanelHeight\"] = \"--collapsible-panel-height\";\n /**\n * The collapsible panel's width.\n * @type {number}\n */\n CollapsiblePanelCssVars[\"collapsiblePanelWidth\"] = \"--collapsible-panel-width\";\n return CollapsiblePanelCssVars;\n}({});","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { warn } from '@base-ui/utils/warn';\nimport { resolveStyle } from \"../../utils/resolveStyle.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useCollapsibleRootContext } from \"../root/CollapsibleRootContext.mjs\";\nimport { collapsibleStateAttributesMapping } from \"../root/stateAttributesMapping.mjs\";\nimport { useCollapsiblePanel } from \"./useCollapsiblePanel.mjs\";\nimport { CollapsiblePanelCssVars } from \"./CollapsiblePanelCssVars.mjs\";\n/**\n * A panel with the collapsible contents.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Collapsible](https://base-ui.com/react/components/collapsible)\n */\nexport const CollapsiblePanel = /*#__PURE__*/React.forwardRef(function CollapsiblePanel(componentProps, forwardedRef) {\n const {\n className,\n hiddenUntilFound: hiddenUntilFoundProp,\n keepMounted: keepMountedProp,\n render,\n id: idProp,\n style,\n ...elementProps\n } = componentProps;\n\n /* istanbul ignore else -- `process.env.NODE_ENV` is a build-time constant under test */\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useEffect(() => {\n if (hiddenUntilFoundProp && keepMountedProp === false) {\n warn('The `keepMounted={false}` prop on `Collapsible.Panel` is ignored when `hiddenUntilFound` is enabled, since the panel must remain mounted while closed.');\n }\n }, [hiddenUntilFoundProp, keepMountedProp]);\n }\n const {\n defaultPanelId,\n mounted,\n onOpenChange,\n open,\n setMounted,\n setPanelIdState,\n setOpen,\n state,\n transitionStatus\n } = useCollapsibleRootContext();\n const hiddenUntilFound = hiddenUntilFoundProp ?? false;\n const keepMounted = keepMountedProp ?? false;\n const registeredId = idProp || undefined;\n const id = registeredId ?? defaultPanelId;\n useIsoLayoutEffect(() => {\n setPanelIdState(currentId => registeredId ?? (currentId === null ? undefined : currentId));\n return () => {\n setPanelIdState(currentId => currentId === registeredId ? null : currentId);\n };\n }, [registeredId, setPanelIdState]);\n const {\n height,\n props,\n ref,\n shouldPreventOpenAnimation,\n shouldRender,\n transitionStatus: panelTransitionStatus,\n width\n } = useCollapsiblePanel({\n externalRef: forwardedRef,\n hiddenUntilFound,\n id,\n keepMounted,\n mounted,\n onOpenChange,\n open,\n setMounted,\n setOpen,\n transitionStatus\n });\n const panelState = {\n ...state,\n transitionStatus: panelTransitionStatus\n };\n const resolvedStyle = resolveStyle(style, panelState);\n const element = useRenderElement('div', {\n ...componentProps,\n style: undefined\n }, {\n state: panelState,\n ref,\n props: [props, {\n style: {\n [CollapsiblePanelCssVars.collapsiblePanelHeight]: height === undefined ? 'auto' : `${height}px`,\n [CollapsiblePanelCssVars.collapsiblePanelWidth]: width === undefined ? 'auto' : `${width}px`\n }\n }, elementProps, resolvedStyle ? {\n style: resolvedStyle\n } : undefined,\n // Resolve the public `style` prop so temporary `animationName: 'none'`\n // can still win after user's inline styles have been merged.\n shouldPreventOpenAnimation ? {\n style: {\n animationName: 'none'\n }\n } : undefined],\n stateAttributesMapping: collapsibleStateAttributesMapping\n });\n if (!shouldRender) {\n return null;\n }\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") CollapsiblePanel.displayName = \"CollapsiblePanel\";","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Collapsible } from \"@base-ui/react/collapsible\";\n//#region src/components/collapsible/collapsible-panel.tsx\nconst TRCollapsiblePanel = createComponentPart(Collapsible.Panel, \"tr-collapsible-content\");\n//#endregion\nexport { TRCollapsiblePanel };\n\n//# sourceMappingURL=collapsible-panel.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Collapsible } from \"@base-ui/react/collapsible\";\n//#region src/components/collapsible/collapsible-root.tsx\nconst TRCollapsibleRoot = createComponentPart(Collapsible.Root, \"tr-collapsible\");\n//#endregion\nexport { TRCollapsibleRoot };\n\n//# sourceMappingURL=collapsible-root.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Collapsible } from \"@base-ui/react/collapsible\";\n//#region src/components/collapsible/collapsible-trigger.tsx\nconst TRCollapsibleTrigger = createComponentPart(Collapsible.Trigger, \"tr-collapsible-summary\");\n//#endregion\nexport { TRCollapsibleTrigger };\n\n//# sourceMappingURL=collapsible-trigger.js.map","import { TRCollapsiblePanel } from \"./collapsible-panel.js\";\nimport { TRCollapsibleRoot } from \"./collapsible-root.js\";\nimport { TRCollapsibleTrigger } from \"./collapsible-trigger.js\";\n//#region src/components/collapsible/index.tsx\nconst TRCollapsible = {\n\tRoot: TRCollapsibleRoot,\n\tTrigger: TRCollapsibleTrigger,\n\tPanel: TRCollapsiblePanel\n};\n//#endregion\nexport { TRCollapsible, TRCollapsiblePanel, TRCollapsibleRoot, TRCollapsibleTrigger };\n\n//# sourceMappingURL=index.js.map","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCollapsible } from '@tinyrack/ui/components/collapsible';\nimport type { ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type { TotpSetupData } from '#frontend/features/totp/use-totp-setup.ts';\n\nexport interface QrStepProps {\n setupData: TotpSetupData;\n onNext: () => void;\n additionalActions?: ReactNode;\n className?: string;\n}\n\nexport function QrStep({\n setupData,\n onNext,\n additionalActions,\n className = '',\n}: QrStepProps) {\n const { t } = useTranslation();\n\n return (\n <div className={`flex flex-col gap-tinyrack-lg ${className}`}>\n <p className=\"text-center text-tinyrack-sm text-tinyrack-text-muted\">\n {t('setupTotp.qrDescription')}\n </p>\n\n {/*\n The QR sits on its own light surface with padding for the quiet zone.\n Rendered straight onto the canvas it inherited the dark theme's\n background, and scanners need the margin and the contrast to lock on.\n */}\n <div className=\"flex justify-center\">\n <div className=\"rounded-tinyrack-lg border border-tinyrack-border bg-tinyrack-surface p-tinyrack-lg\">\n <img\n alt=\"TOTP QR Code\"\n className=\"block size-tinyrack-measure-sm\"\n src={setupData.qr_code}\n />\n </div>\n </div>\n\n <TRCollapsible.Root>\n <TRCollapsible.Trigger>\n {t('setupTotp.manualEntry')}\n </TRCollapsible.Trigger>\n <TRCollapsible.Panel>\n <code className=\"mt-tinyrack-xs block break-all rounded-tinyrack-sm bg-tinyrack-surface-muted p-tinyrack-sm text-tinyrack-sm text-tinyrack-text\">\n {setupData.secret}\n </code>\n </TRCollapsible.Panel>\n </TRCollapsible.Root>\n\n <TRButton\n className=\"w-full\"\n data-testid=\"totp-qr-next\"\n intent=\"primary\"\n onClick={onNext}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('setupTotp.next')}\n </TRButton>\n\n {additionalActions}\n </div>\n );\n}\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport {\n confirmTotpSetupMutationOptions,\n startTotpSetupMutationOptions,\n type TotpConfirmResponse,\n type TotpSetupResponse,\n type TotpSetupVerifyResponse,\n verifyTotpMutationOptions,\n} from '#frontend/queries/totp.ts';\n\nexport type TotpSetupStep = 'loading' | 'qr' | 'verify' | 'recovery' | 'error';\n\nexport interface TotpSetupData {\n qr_code: string;\n secret: string;\n}\n\nexport interface UseTotpSetupOptions {\n onSetupSuccess?: (data: TotpSetupResponse) => void;\n onSetupError?: (error: Error) => void;\n onVerifySuccess?: (data: TotpSetupVerifyResponse) => void;\n onVerifyError?: (error: Error) => void;\n onConfirmSuccess?: (data: TotpConfirmResponse) => void;\n onConfirmError?: (error: Error) => void;\n autoStart?: boolean;\n}\n\nexport interface UseTotpSetupReturn {\n step: TotpSetupStep;\n setupData: TotpSetupResponse | null;\n recoveryCodes: string[];\n isSetupPending: boolean;\n isVerifyPending: boolean;\n isConfirmPending: boolean;\n isPending: boolean;\n setupError: Error | null;\n verifyError: Error | null;\n confirmError: Error | null;\n startSetup: () => void;\n verify: (code: string) => Promise<TotpSetupVerifyResponse>;\n goToQr: () => void;\n goToVerify: () => void;\n confirmRecoveryCodes: () => Promise<TotpConfirmResponse>;\n reset: () => void;\n}\n\nexport function useTotpSetup(\n options: UseTotpSetupOptions = {},\n): UseTotpSetupReturn {\n const {\n onSetupSuccess,\n onSetupError,\n onVerifySuccess,\n onVerifyError,\n onConfirmSuccess,\n onConfirmError,\n autoStart = false,\n } = options;\n\n const queryClient = useQueryClient();\n const [step, setStep] = useState<TotpSetupStep>(autoStart ? 'loading' : 'qr');\n const [setupData, setSetupData] = useState<TotpSetupResponse | null>(null);\n const [recoveryCodes, setRecoveryCodes] = useState<string[]>([]);\n const setupInitiatedRef = useRef(false);\n\n const setupMutation = useMutation({\n ...startTotpSetupMutationOptions,\n onSuccess: (data) => {\n setSetupData(data);\n setStep('qr');\n onSetupSuccess?.(data);\n },\n onError: (error) => {\n setStep('error');\n onSetupError?.(error);\n },\n });\n\n const verifyMutation = useMutation({\n ...verifyTotpMutationOptions,\n onSuccess: (data) => {\n // Do NOT invalidate session here - TOTP is not fully enabled yet\n setRecoveryCodes(data.recovery_codes);\n setStep('recovery');\n onVerifySuccess?.(data);\n },\n onError: (error) => {\n onVerifyError?.(error);\n },\n });\n\n const confirmMutation = useMutation({\n ...confirmTotpSetupMutationOptions,\n onSuccess: (data) => {\n // Now TOTP is fully enabled, invalidate session\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n onConfirmSuccess?.(data);\n },\n onError: (error) => {\n onConfirmError?.(error);\n },\n });\n\n const startSetup = useCallback(() => {\n setupInitiatedRef.current = true;\n setStep('loading');\n setupMutation.mutate();\n }, [setupMutation]);\n\n const verify = useCallback(\n async (code: string) => {\n return verifyMutation.mutateAsync({ code });\n },\n [verifyMutation],\n );\n\n const goToQr = useCallback(() => {\n setStep('qr');\n }, []);\n\n const goToVerify = useCallback(() => {\n setStep('verify');\n }, []);\n\n const confirmRecoveryCodes = useCallback(async () => {\n return confirmMutation.mutateAsync();\n }, [confirmMutation]);\n\n const reset = useCallback(() => {\n setStep(autoStart ? 'loading' : 'qr');\n setSetupData(null);\n setRecoveryCodes([]);\n setupInitiatedRef.current = false;\n setupMutation.reset();\n verifyMutation.reset();\n confirmMutation.reset();\n }, [autoStart, setupMutation, verifyMutation, confirmMutation]);\n\n // Auto start setup on mount if enabled\n useEffect(() => {\n if (autoStart && !setupInitiatedRef.current && step === 'loading') {\n setupInitiatedRef.current = true;\n setupMutation.mutate();\n }\n }, [autoStart, step, setupMutation]);\n\n return {\n step,\n setupData,\n recoveryCodes,\n isSetupPending: setupMutation.isPending,\n isVerifyPending: verifyMutation.isPending,\n isConfirmPending: confirmMutation.isPending,\n isPending:\n setupMutation.isPending ||\n verifyMutation.isPending ||\n confirmMutation.isPending,\n setupError: setupMutation.error,\n verifyError: verifyMutation.error,\n confirmError: confirmMutation.error,\n startSetup,\n verify,\n goToQr,\n goToVerify,\n confirmRecoveryCodes,\n reset,\n };\n}\n"],"x_google_ignoreList":[0,1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],"mappings":"yxBAaA,IAAM,EAAO,EAAiB,OAAQA,CAHpC,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,QAAS,CAAC,EACvF,CAAC,OAAQ,CAAE,EAAG,0DAA2D,IAAK,QAAS,CAAC,CAEpDA,CAAU,ECC1C,GAAO,EAAiB,OAAQ,CAJpC,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,QAAS,CAAC,EACzD,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAS,CAAC,EAC1C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAS,CAAC,CAEN,CAAU,mBCEhD,SAAgB,GAAkB,CAChC,gBACA,YACA,YAAY,GACZ,YAAY,IACa,CACzB,GAAM,CAAE,KAAM,EAAe,EACvB,EAAQ,EAAQ,gBAAgB,EAChC,CAAC,EAAW,IAAA,EAAA,EAAA,SAAA,CAAyB,EAAK,EAI1C,GAAA,EAAA,EAAA,YAAA,CAAyB,SAAY,CACzC,MAAM,UAAU,UAAU,UAAU,EAAc,KAAK;CAAI,CAAC,EAC5D,EAAM,IAAI,CAAE,MAAO,EAAE,gCAAgC,EAAG,KAAM,SAAU,CAAC,CAC3E,EAAG,CAAC,EAAe,EAAO,CAAC,CAAC,EAE5B,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,iCAAiC,aAAjD,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,qDACV,EAAE,qCAAqC,CACvC,CAAA,GAMH,EAAA,EAAA,IAAA,CAAC,MAAD,CACE,UAAU,uHACV,cAAY,+BAEX,EAAc,IAAK,IAClB,EAAA,EAAA,IAAA,CAAC,OAAD,CACE,UAAU,2JAGT,CACG,EAHC,CAGD,CACP,CACE,CAAA,GAEL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,KAAM,EAAmB,KAAK,mBAClC,EAAE,iCAAiC,CAC/B,CAAA,GAEP,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,WAAW,UACX,UAAU,yBACV,OAAO,UACP,QAAS,EACT,KAAK,kBALP,EAOE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,cAAA,GAAY,UAAU,kBAAoB,CAAA,EACnD,EAAE,8BAA8B,CACzB,KAOV,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,UACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,6CAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAW,KAAZ,CACE,QAAS,EACT,cAAY,yBACZ,SAAU,EACV,gBAAkB,GAAY,EAAa,IAAY,EAAI,EAC3D,OAAO,eAEP,EAAA,EAAA,IAAA,CAAC,EAAW,UAAZ,CAAuB,CAAA,CACR,CAAA,GACjB,EAAA,EAAA,IAAA,CAAC,EAAQ,MAAT,CAAe,UAAU,0BACtB,EAAE,yCAAyC,CAC/B,CAAA,CACZ,GACO,CAAA,GAEd,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,UAAU,SACV,cAAY,wBACZ,SAAU,CAAC,GAAa,EACxB,OAAO,UACP,QAAS,EACT,QAAS,EACT,KAAK,SACL,OAAO,cAEN,EAAE,iCAAiC,CAC5B,CAAA,CACP,GAET,CClFA,SAAgB,GAAW,CACzB,WACA,SACA,YACA,iBACA,cACA,cACA,YACA,YAAY,IACM,CAClB,GAAM,CAAE,KAAM,EAAe,EACvB,GAAA,EAAA,EAAA,OAAA,CAAkC,IAAI,EAatC,CACJ,WACA,WACA,eACA,QACA,UAAW,CAAE,WACX,EAA0B,CAC5B,cAAe,CAAE,KAAM,EAAG,EAC1B,SAAU,GAAA,EAAA,EAAA,QAAA,KAjBR,EAAS,CACP,KAAM,EACI,CAAC,CACR,OAAO,EAAG,EAAE,wBAAwB,CAAC,CAAC,CACtC,MAAM,UAAW,EAAE,wBAAwB,CAAC,CACjD,CAAC,EACH,CAAC,CAAC,CAW+B,CAAY,CAC/C,CAAC,EAEK,EAAY,EAAM,MAAM,EAExB,GAAA,EAAA,EAAA,YAAA,CACJ,KAAO,IAA6B,CAClC,GAAI,CACF,MAAM,EAAS,EAAO,IAAI,CAC5B,MAAQ,CACN,EAAS,OAAQ,CACf,KAAM,SACN,QAAS,GAAkB,EAAE,yBAAyB,CACxD,CAAC,EACD,EAAS,OAAQ,EAAE,EACnB,EAAY,SAAS,MAAM,CAC7B,CACF,EACA,CAAC,EAAgB,EAAU,EAAU,EAAU,CAAC,CAClD,EAEA,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,iCAAiC,aAAjD,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CACE,UAAU,gCACV,SAAU,EAAa,CAAgB,WAFzC,EAIE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,UAAA,GACA,MAAO,EAAO,KACd,OAAQ,EACR,SAAW,GAAU,EAAS,OAAQ,CAAK,EAC3C,eAAkB,EAAa,CAAgB,CAAC,CAAC,EACjD,IAAK,EACL,MAAO,CACR,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,UAAU,SACV,OAAO,UACP,QAAS,EACT,aAAc,GAAe,EAAE,qBAAqB,EACpD,KAAK,SACL,OAAO,cAEN,GAAe,EAAE,kBAAkB,CAC5B,CAAA,CACN,IAEL,IACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,WAAW,QACX,UAAU,SACV,cAAY,mBACZ,SAAU,EACV,OAAO,UACP,QAAS,EACT,KAAK,kBAEJ,GAAa,EAAE,gBAAgB,CACxB,CAAA,CAET,GAET,CCjHA,SAAgB,GAAmB,EAAY,CAC7C,GAAM,CACJ,KAAM,EACN,cACA,eACA,YACE,EACE,CAAC,EAAM,GAAW,EAAc,CACpC,WAAY,EACZ,QAAS,EACT,KAAM,cACN,MAAO,MACT,CAAC,EACK,CACJ,UACA,aACA,oBACE,EAAoB,EAAM,GAAM,EAAI,EAClC,EAAiB,EAAY,EAE7B,CAAC,EAAmB,GAAA,EAAyB,SAAS,EACtD,EAAU,IAAsB,KAAO,IAAA,GAAY,GAAqB,EACxE,EAAgB,EAAkB,GAAS,CAC/C,IAAM,EAAW,CAAC,EACZ,EAAe,EAAyBC,EAAsB,EAAM,WAAW,EACrF,EAAa,EAAU,CAAY,EAC/B,GAAa,YAGjB,EAAQ,CAAQ,CAClB,CAAC,EACD,OAAA,EAAa,aAAe,CAC1B,iBACA,WACA,gBACA,UACA,OACA,UACA,aACA,UACA,kBACA,kBACF,GAAI,CAAC,EAAgB,EAAU,EAAe,EAAS,EAAM,EAAS,EAAY,EAAS,EAAiB,CAAgB,CAAC,CAC/H,CChDA,IAAa,EAAsC,EAAM,cAAc,IAAA,EAAS,EAEhF,SAAgB,GAA4B,CAC1C,IAAM,EAAA,EAAgB,WAAW,CAAsB,EACvD,GAAI,IAAY,IAAA,GACd,MAAU,MAA0JC,EAAoB,EAAE,CAAC,EAE7L,OAAO,CACT,CCXA,IAAW,EAAiC,SAAU,EAAgC,CAiBpF,MAbA,GAA+B,KAAU,YAIzC,EAA+B,OAAY,cAI3C,EAA+B,EAA+B,cAAmB,EAA+B,eAAiB,gBAIjI,EAA+B,EAA+B,YAAiB,EAA+B,aAAe,cACtH,CACT,EAAE,CAAC,CAAC,ECnBO,GAAgD,SAAU,EAAkC,CAKrG,MADA,GAAiC,UAAe,kBACzC,CACT,EAAE,CAAC,CAAC,ECJE,GAAkB,EACrB,EAA+B,MAAO,EACzC,EACM,GAAoB,EACvB,EAA+B,QAAS,EAC3C,EACa,GAA0B,CACrC,KAAK,EAAO,CAMV,OALI,EACK,EACJ,GAAiC,WAAY,EAChD,EAEK,IACT,CACF,ECfa,GAAoC,CDiB/C,KAAK,EAAO,CAIV,OAHI,EACK,GAEF,EACT,ECpBA,GAAG,CACL,ECUa,GAA+B,EAAM,WAAW,SAAyB,EAAgB,EAAc,CAClH,GAAM,CACJ,SACA,YACA,cAAc,GACd,WAAW,GACX,aAAc,EACd,OACA,QACA,GAAG,GACD,EACE,EAAe,EAAkB,CAAgB,EACjD,EAAc,GAAmB,CACrC,OACA,cACA,eACA,UACF,CAAC,EACK,EAAA,EAAc,aAAe,CACjC,KAAM,EAAY,KAClB,SAAU,EAAY,SACtB,iBAAkB,EAAY,gBAChC,GAAI,CAAC,EAAY,KAAM,EAAY,SAAU,EAAY,gBAAgB,CAAC,EACpE,EAAA,EAAqB,aAAe,CACxC,GAAG,EACH,eACA,OACF,GAAI,CAAC,EAAa,EAAc,CAAK,CAAC,EAChC,EAAU,EAAiB,MAAO,EAAgB,CACtD,QACA,IAAK,EACL,MAAO,EACP,uBAAwB,EAC1B,CAAC,EACD,OAAoB,EAAA,EAAA,IAAA,CAAK,EAAuB,SAAU,CACxD,MAAO,EACP,SAAU,CACZ,CAAC,CACH,CAAC,EC7CK,GAAyB,CAC7B,GAAG,GACH,GAAG,CACL,EAQa,GAAkC,EAAM,WAAW,SAA4B,EAAgB,EAAc,CACxH,GAAM,CACJ,UACA,OACA,gBACA,QACA,SAAU,GACR,EAA0B,EACxB,CACJ,YACA,WAAW,EACX,SACA,eAAe,GACf,QACA,GAAG,GACD,EACE,CACJ,iBACA,aACE,EAAU,CACZ,WACA,sBAAuB,GACvB,OAAQ,CACV,CAAC,EAWD,OAVgB,EAAiB,SAAU,EAAgB,CACzD,QACA,IAAK,CAAC,EAAc,CAAS,EAC7B,MAAO,CAAC,CACN,gBAAiB,EAAO,EAAU,IAAA,GAClC,gBAAiB,EACjB,QAAS,CACX,EAAG,EAAc,CAAc,EAC/B,yBACF,CACa,CACf,CAAC,ECtCK,EAAmB,CACvB,OAAQ,IAAA,GACR,MAAO,IAAA,EACT,EACA,SAAgB,GAAoB,EAAY,CAC9C,GAAM,CACJ,cACA,mBACA,GAAI,EACJ,cACA,UACA,eACA,OACA,aACA,UACA,oBACE,EACE,EAAA,EAAiB,OAAO,IAAI,EAC5B,EAAA,EAAyB,OAAO,IAAI,EACpC,CAAC,EAAY,GAAA,EAAgC,SAAS,CAAgB,EACtE,EAAA,EAAkC,OAAO,CAAgB,EAGzD,EAAA,EAA8B,OAAO,EAAK,EAI1C,EAAA,EAAuC,OAAO,CAAI,EAGlD,EAAA,EAAgD,OAAO,EAAK,EAI5D,CAAC,EAAgB,GAAA,EAA2B,SAAS,EAAK,EAC1D,EAAA,EAAwC,OAAO,IAAI,EACnD,EAAiB,EAAc,EAAa,CAAQ,EACpD,EAAgB,EAAc,CAAI,EAElC,EAA+B,EAAsB,CAAQ,EAC7D,EAAS,CAAC,GAAQ,CAAC,EACnB,EAAwB,EAAiB,OAAS,EAClD,EAA6B,IAInC,EAA+B,SAAW,EAAwC,SAC5E,EAAqB,CAAC,GAAQ,GAIpC,EAAiB,UAAY,iBAAmB,EAAW,SAAW,IAAA,IAAa,EAAW,QAAU,IAAA,GAAY,EAA0B,QAAU,EAClJ,EAAsC,GAAoB,GAAU,EAAiB,UAAY,gBAKjG,EAAgB,GAAmB,EAAgB,EAAyB,KAAS,CACrF,IACF,EAA0B,QAAU,GAEtC,EAAuB,CAAc,CACvC,CAAC,EACK,EAA+B,MAAwB,CAC3D,EAAgC,UAAU,EAC1C,EAAgC,QAAU,IAC5C,CAAC,EACK,EAAkC,EAAkB,GAAW,CACnE,EAA6B,EAC7B,EAAgC,YAAgB,CAC9C,EAAgC,QAAU,KAC1C,EAAQ,CACV,CACF,CAAC,EAKK,EAAwC,MAAwB,CAChE,GAAQ,GAAW,EAAiB,UAAY,kBAClD,EAAwC,QAAU,GAEtD,CAAC,EACD,MAAyB,CAInB,CAAC,GAAkB,IAAqB,YAG5C,EAAkB,EAAK,CACzB,EAAG,CAAC,EAAgB,CAAgB,CAAC,EACrC,EAAM,kBACS,CACX,EAAsC,EACtC,EAA6B,CAC/B,EACC,CAAC,EAAuC,CAA4B,CAAC,EACxE,MAAyB,CACvB,IAAM,EAAQ,EAAS,QACvB,GAAI,CAAC,EACH,OAOE,CAAC,GAAQ,EAAgC,SAC3C,EAA6B,EAE/B,IAAM,EAAgB,GAAiB,EAAO,CAA0B,EAMxE,GALA,EAAiB,QAAU,EAKvB,GAAQ,IAAqB,QAAU,EAA+B,SAAW,IAAkB,gBAAiB,CACtH,EAA0B,QAAU,EAAc,CAAK,EACvD,MACF,CAIA,GAAI,GAAQ,IAAqB,WAAY,CAG3C,IAAM,EAAe,EAAsB,QAE3C,GADA,EAAsB,QAAU,GAC5B,IAAkB,OAAQ,CAC5B,EAAc,EAAc,CAAK,CAAC,EAClC,EAAkB,EAAI,EACtB,MACF,CACA,GAAI,IAAkB,iBAAkB,CACtC,IAAM,EAAsB,GAAkB,CAAK,EAEnD,GADA,EAAc,EAAc,CAAK,CAAC,EAC9B,CAAC,EACH,OAAO,EAET,IAAM,EAA4B,EAAkB,EAAO,sBAAuB,IAAI,EAGtF,OAFA,EAAgC,CAAyB,EACzD,EAAkB,EAAI,EACf,CACT,CACA,EAAc,EAAc,CAAK,CAAC,EAClC,IAAM,EAAuB,EAAkB,EAAO,iBAAkB,MAAM,EAC9E,GAAI,CAAC,EAAc,CACjB,EAAqB,EACrB,MACF,CACA,IAAM,EAA2B,EAAkB,EAAO,qBAAsB,IAAI,EACpF,EAAqB,EACrB,EAAgC,CAAwB,EACxD,EAAkB,EAAI,EACtB,MACF,CAKA,GAAI,CAAC,GAAQ,IAAY,IAAqB,QAAU,IAAqB,YAAa,CAGxF,GAFA,EAA+B,QAAU,GACzC,EAAwC,QAAU,GAC9C,IAAkB,OAAQ,CAC5B,EAAc,EAAkB,EAAK,EACrC,EAAW,EAAK,EAChB,MACF,CACA,EAAc,EAAc,CAAK,CAAC,EAClC,MACF,CACA,GAAI,IAAqB,SACvB,OAMF,GAAI,IAAkB,OAAQ,CAC5B,EAAW,EAAK,EAChB,MACF,CACA,IAAM,EAAiB,EAAc,CAAK,EAE1C,GAAI,EADoB,EAAe,OAAS,GAAK,EAAe,MAAQ,GACtD,CACpB,EAAW,EAAK,EAChB,MACF,CACA,EAAc,CAAc,EACxB,IAAkB,iBAEpB,EAD+C,EAAO,iBAAkB,MACrD,CAAC,CAAC,CAGzB,EAAG,CAAC,EAAS,EAAM,EAA8B,EAAe,EAAY,EAAiC,EAA4B,CAAgB,CAAC,EAC1J,EAAsB,CACpB,QAAS,GAAQ,GAAW,IAA0B,OACtD,KAAM,GACN,IAAK,EACL,YAAa,CAMN,GAGL,EAAc,EAAkB,EAAK,CACvC,CACF,CAAC,EAQD,EAAM,cAAgB,CAKpB,GAJI,GAAQ,CAAC,GAAW,IAA0B,UAI9C,CADU,EAAS,QAErB,OAEF,IAAM,EAAkB,IAAI,gBACxB,EAAmB,GACvB,SAAS,GAAiB,CAIpB,EAAc,UAGlB,EAAW,EAAK,EAChB,EAAc,EAAkB,EAAK,EACvC,CAIA,MAHA,GAAmB,EAAe,YAAc,CAC9C,EAA6B,EAAgB,EAAgB,MAAM,CACrE,CAAC,MACY,CACX,EAAe,OAAO,CAAgB,EACtC,EAAgB,MAAM,CACxB,CACF,EAAG,CAAC,EAAe,EAAS,EAAM,EAAuB,EAA8B,EAAe,CAAU,CAAC,EACjH,MAAyB,CACvB,IAAM,EAAQ,EAAS,QACnB,CAAC,GAAS,CAAC,GAAoB,CAAC,GAOpC,EAAM,aAAa,SAAU,aAAa,CAC5C,EAAG,CAAC,EAAQ,CAAgB,CAAC,EAC7B,EAAM,UAAU,UAAuC,CACrD,IAAM,EAAQ,EAAS,QACvB,GAAI,CAAC,EACH,OAEF,SAAS,EAAkB,EAAO,CAChC,IAAM,EAAe,EAAyBE,EAAc,CAAK,EACjE,EAAa,GAAM,CAAY,EAC3B,GAAa,aAGjB,EAAsB,QAAU,GAChC,EAAQ,EAAI,EACd,CACA,OAAO,EAAiB,EAAO,cAAe,CAAiB,CACjE,EAAG,CAAC,EAAc,CAAO,CAAC,EAC1B,IAAM,EAAe,GAAe,GAAoB,GAAW,EACnE,MAAO,CACL,OAAQ,EAAmB,OAC3B,MAAO,CACL,GAAI,EAAsC,EACvC,EAA+B,eAAgB,EAClD,EAAI,IAAA,GACJ,SACA,GAAI,CACN,EACA,IAAK,EACL,6BACA,eACA,iBAAkB,EAClB,MAAO,EAAmB,KAC5B,CACF,CACA,SAAS,EAAc,EAAS,CAC9B,MAAO,CACL,OAAQ,EAAQ,aAChB,MAAO,EAAQ,WACjB,CACF,CACA,SAAS,GAAiB,EAAS,EAA6B,CAC9D,IAAM,EAAcC,EAAY,CAAO,CAAC,CAAC,iBAAiB,CAAO,EAC3D,GAAgB,EAAY,cAAc,MAAM,GAAG,CAAC,CAAC,IAAI,GAAQ,EAAK,KAAK,CAAC,CAAC,CAAC,KAAK,GAAQ,IAAS,IAAM,IAAS,MAAM,GAAK,IAAgC,GAAmB,EAAY,iBAAiB,EAC9M,EAAgB,GAAmB,EAAY,kBAAkB,EAcvE,OAbI,GAAgB,GAOhB,EACK,iBAEL,EACK,gBAEF,MACT,CACA,SAAS,GAAmB,EAAO,CACjC,OAAO,EAAM,MAAM,GAAG,CAAC,CAAC,IAAI,GAAQ,EAAK,KAAK,CAAC,CAAC,CAAC,KAAK,GAAQ,IAAS,IAAM,OAAO,WAAW,CAAI,EAAI,CAAC,CAC1G,CAUA,SAAS,EAAkB,EAAS,EAAU,EAAO,CACnD,IAAM,EAAgB,EAAQ,MAAM,iBAAiB,CAAQ,EACvD,EAAmB,EAAQ,MAAM,oBAAoB,CAAQ,EAEnE,OADA,EAAQ,MAAM,YAAY,EAAU,CAAK,MAC5B,CACX,GAAI,IAAkB,GAAI,CACxB,EAAQ,MAAM,eAAe,CAAQ,EACrC,MACF,CACA,EAAQ,MAAM,YAAY,EAAU,EAAe,CAAgB,CACrE,CACF,CASA,SAAS,GAAkB,EAAS,CAClC,IAAM,EAAuB,CAC3B,kBAAmB,EAAQ,MAAM,eACjC,cAAe,EAAQ,MAAM,WAC7B,gBAAiB,EAAQ,MAAM,aAC/B,gBAAiB,EAAQ,MAAM,YACjC,EACA,OAAO,KAAK,CAAoB,CAAC,CAAC,QAAQ,GAAO,CAC/C,EAAQ,MAAM,YAAY,EAAK,UAAW,WAAW,CACvD,CAAC,EACD,SAAS,GAAsB,CAC7B,OAAO,QAAQ,CAAoB,CAAC,CAAC,SAAS,CAAC,EAAK,KAAW,CAC7D,GAAI,IAAU,GAAI,CAChB,EAAQ,MAAM,eAAe,CAAG,EAChC,MACF,CACA,EAAQ,MAAM,YAAY,EAAK,CAAK,CACtC,CAAC,CACH,CACA,IAAM,EAAQ,EAAe,QAAQ,CAAmB,EACxD,UAAa,CACX,EAAe,OAAO,CAAK,EAC3B,EAAoB,CACtB,CACF,CCpYA,IAAW,GAAuC,SAAU,EAAyB,CAWnF,MANA,GAAwB,uBAA4B,6BAKpD,EAAwB,sBAA2B,4BAC5C,CACT,EAAE,CAAC,CAAC,EERE,GAAqB,EDakB,EAAM,WAAW,SAA0B,EAAgB,EAAc,CACpH,GAAM,CACJ,YACA,iBAAkB,EAClB,YAAa,EACb,SACA,GAAI,EACJ,QACA,GAAG,GACD,EAWE,CACJ,iBACA,UACA,eACA,OACA,aACA,kBACA,UACA,QACA,oBACE,EAA0B,EACxB,EAAmB,GAAwB,GAC3C,EAAc,GAAmB,GACjC,EAAe,GAAU,IAAA,GACzB,EAAK,GAAgB,EAC3B,OACE,EAAgB,GAAa,IAAiB,IAAc,KAAO,IAAA,GAAY,EAAU,MAC5E,CACX,EAAgB,GAAa,IAAc,EAAe,KAAO,CAAS,CAC5E,GACC,CAAC,EAAc,CAAe,CAAC,EAClC,GAAM,CACJ,SACA,QACA,MACA,6BACA,eACA,iBAAkB,EAClB,SACE,GAAoB,CACtB,YAAa,EACb,mBACA,KACA,cACA,UACA,eACA,OACA,aACA,UACA,kBACF,CAAC,EACK,EAAa,CACjB,GAAG,EACH,iBAAkB,CACpB,EACM,EAAgB,EAAa,EAAO,CAAU,EAC9C,EAAU,EAAiB,MAAO,CACtC,GAAG,EACH,MAAO,IAAA,EACT,EAAG,CACD,MAAO,EACP,MACA,MAAO,CAAC,EAAO,CACb,MAAO,EACJ,GAAwB,wBAAyB,IAAW,IAAA,GAAY,OAAS,GAAG,EAAO,KAC3F,GAAwB,uBAAwB,IAAU,IAAA,GAAY,OAAS,GAAG,EAAM,GAC3F,CACF,EAAG,EAAc,EAAgB,CAC/B,MAAO,CACT,EAAI,IAAA,GAGJ,EAA6B,CAC3B,MAAO,CACL,cAAe,MACjB,CACF,EAAI,IAAA,EAAS,EACb,uBAAwB,EAC1B,CAAC,EAID,OAHK,EAGE,EAFE,IAGX,CC1G+CC,EAAmB,wBAAwB,EGApF,EAAgB,CACrB,KFDyB,EAAoBC,GAAkB,gBECzD,EACN,QDF4B,EAAoBC,GAAqB,wBCE5D,EACT,MAAO,EACR,ECKA,SAAgB,GAAO,CACrB,YACA,SACA,oBACA,YAAY,IACE,CACd,GAAM,CAAE,KAAM,EAAe,EAE7B,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,iCAAiC,aAAjD,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,iEACV,EAAE,yBAAyB,CAC3B,CAAA,GAOH,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,gCACb,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,gGACb,EAAA,EAAA,IAAA,CAAC,MAAD,CACE,IAAI,eACJ,UAAU,iCACV,IAAK,EAAU,OAChB,CAAA,CACE,CAAA,CACF,CAAA,GAEL,EAAA,EAAA,KAAA,CAAC,EAAc,KAAf,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAc,QAAf,CAAA,SACG,EAAE,uBAAuB,CACL,CAAA,GACvB,EAAA,EAAA,IAAA,CAAC,EAAc,MAAf,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,0IACb,EAAU,MACP,CAAA,CACa,CAAA,CACH,CAAA,CAAA,GAEpB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,UAAU,SACV,cAAY,eACZ,OAAO,UACP,QAAS,EACT,KAAK,SACL,OAAO,cAEN,EAAE,gBAAgB,CACX,CAAA,EAET,CACE,GAET,CCnBA,SAAgB,GACd,EAA+B,CAAC,EACZ,CACpB,GAAM,CACJ,iBACA,eACA,kBACA,gBACA,mBACA,iBACA,YAAY,IACV,EAEE,EAAc,EAAe,EAC7B,CAAC,EAAM,IAAA,EAAA,EAAA,SAAA,CAAmC,EAAY,UAAY,IAAI,EACtE,CAAC,EAAW,IAAA,EAAA,EAAA,SAAA,CAAmD,IAAI,EACnE,CAAC,EAAe,IAAA,EAAA,EAAA,SAAA,CAAuC,CAAC,CAAC,EACzD,GAAA,EAAA,EAAA,OAAA,CAA2B,EAAK,EAEhC,EAAgB,EAAY,CAChC,GAAG,EACH,UAAY,GAAS,CACnB,EAAa,CAAI,EACjB,EAAQ,IAAI,EACZ,IAAiB,CAAI,CACvB,EACA,QAAU,GAAU,CAClB,EAAQ,OAAO,EACf,IAAe,CAAK,CACtB,CACF,CAAC,EAEK,EAAiB,EAAY,CACjC,GAAG,EACH,UAAY,GAAS,CAEnB,EAAiB,EAAK,cAAc,EACpC,EAAQ,UAAU,EAClB,IAAkB,CAAI,CACxB,EACA,QAAU,GAAU,CAClB,IAAgB,CAAK,CACvB,CACF,CAAC,EAEK,EAAkB,EAAY,CAClC,GAAG,EACH,UAAY,GAAS,CAEnB,EAAY,kBAAkB,CAC5B,SAAU,EAAuB,QACnC,CAAC,EACD,IAAmB,CAAI,CACzB,EACA,QAAU,GAAU,CAClB,IAAiB,CAAK,CACxB,CACF,CAAC,EAEK,GAAA,EAAA,EAAA,YAAA,KAA+B,CACnC,EAAkB,QAAU,GAC5B,EAAQ,SAAS,EACjB,EAAc,OAAO,CACvB,EAAG,CAAC,CAAa,CAAC,EAEZ,GAAA,EAAA,EAAA,YAAA,CACJ,KAAO,IACE,EAAe,YAAY,CAAE,MAAK,CAAC,EAE5C,CAAC,CAAc,CACjB,EAEM,GAAA,EAAA,EAAA,YAAA,KAA2B,CAC/B,EAAQ,IAAI,CACd,EAAG,CAAC,CAAC,EAEC,GAAA,EAAA,EAAA,YAAA,KAA+B,CACnC,EAAQ,QAAQ,CAClB,EAAG,CAAC,CAAC,EAEC,GAAA,EAAA,EAAA,YAAA,CAAmC,SAChC,EAAgB,YAAY,EAClC,CAAC,CAAe,CAAC,EAEd,GAAA,EAAA,EAAA,YAAA,KAA0B,CAC9B,EAAQ,EAAY,UAAY,IAAI,EACpC,EAAa,IAAI,EACjB,EAAiB,CAAC,CAAC,EACnB,EAAkB,QAAU,GAC5B,EAAc,MAAM,EACpB,EAAe,MAAM,EACrB,EAAgB,MAAM,CACxB,EAAG,CAAC,EAAW,EAAe,EAAgB,CAAe,CAAC,EAU9D,OAPA,EAAA,EAAA,UAAA,KAAgB,CACV,GAAa,CAAC,EAAkB,SAAW,IAAS,YACtD,EAAkB,QAAU,GAC5B,EAAc,OAAO,EAEzB,EAAG,CAAC,EAAW,EAAM,CAAa,CAAC,EAE5B,CACL,OACA,YACA,gBACA,eAAgB,EAAc,UAC9B,gBAAiB,EAAe,UAChC,iBAAkB,EAAgB,UAClC,UACE,EAAc,WACd,EAAe,WACf,EAAgB,UAClB,WAAY,EAAc,MAC1B,YAAa,EAAe,MAC5B,aAAc,EAAgB,MAC9B,aACA,SACA,SACA,aACA,uBACA,OACF,CACF"}
|
|
1
|
+
{"version":3,"file":"use-totp-setup-CtTaklH-.js","names":["__iconNode","REASONS.triggerPress","_formatErrorMessage","baseMapping","REASONS.none","ownerWindow","Collapsible.Panel","Collapsible.Root","Collapsible.Trigger"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/copy.mjs","../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/info.mjs","../../../frontend/src/components/totp/recovery-codes-step.tsx","../../../frontend/src/components/totp/verify-step.tsx","../../../../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/collapsible/root/useCollapsibleRoot.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/collapsible/root/CollapsibleRootContext.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/collapsible/panel/CollapsiblePanelDataAttributes.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/collapsible/trigger/CollapsibleTriggerDataAttributes.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/utils/collapsibleOpenStateMapping.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/collapsible/root/stateAttributesMapping.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/collapsible/root/CollapsibleRoot.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/collapsible/trigger/CollapsibleTrigger.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/collapsible/panel/useCollapsiblePanel.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/collapsible/panel/CollapsiblePanelCssVars.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/collapsible/panel/CollapsiblePanel.mjs","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.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/collapsible/collapsible-panel.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.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/collapsible/collapsible-root.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.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/collapsible/collapsible-trigger.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.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/collapsible/index.js","../../../frontend/src/components/totp/qr-step.tsx","../../../frontend/src/features/totp/use-totp-setup.ts"],"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 [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n];\nconst Copy = createLucideIcon(\"copy\", __iconNode);\n\nexport { __iconNode, Copy as default };\n//# sourceMappingURL=copy.mjs.map\n","/**\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 [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n];\nconst Info = createLucideIcon(\"info\", __iconNode);\n\nexport { __iconNode, Info as default };\n//# sourceMappingURL=info.mjs.map\n","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCheckbox } from '@tinyrack/ui/components/checkbox';\nimport { TRField } from '@tinyrack/ui/components/field';\nimport { TRToast } from '@tinyrack/ui/components/toast';\nimport { CopyIcon, TriangleAlertIcon } from 'lucide-react';\nimport { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\n\nexport interface RecoveryCodesStepProps {\n recoveryCodes: string[];\n onConfirm: () => void;\n isLoading?: boolean;\n className?: string;\n}\n\nexport function RecoveryCodesStep({\n recoveryCodes,\n onConfirm,\n isLoading = false,\n className = '',\n}: RecoveryCodesStepProps) {\n const { t } = useTranslation();\n const toast = TRToast.useToastManager();\n const [confirmed, setConfirmed] = useState(false);\n\n // The toast manager owns the dismissal timer, so this no longer keeps a\n // \"copied\" flag alive with its own setTimeout.\n const handleCopy = useCallback(async () => {\n await navigator.clipboard.writeText(recoveryCodes.join('\\n'));\n toast.add({ title: t('setupTotp.recoveryCodes.copied'), type: 'success' });\n }, [recoveryCodes, toast, t]);\n\n return (\n <div className={`flex flex-col gap-tinyrack-lg ${className}`}>\n <p className=\"text-tinyrack-sm text-tinyrack-text-muted\">\n {t('setupTotp.recoveryCodes.description')}\n </p>\n\n {/*\n Two columns so a full set of codes stays on one screen without\n scrolling — this is the only time the user will ever see them.\n */}\n <div\n className=\"grid grid-cols-2 gap-tinyrack-sm rounded-tinyrack-lg border border-tinyrack-border bg-tinyrack-surface p-tinyrack-lg\"\n data-testid=\"recovery-codes-grid\"\n >\n {recoveryCodes.map((code) => (\n <code\n className=\"rounded-tinyrack-sm bg-tinyrack-surface-muted px-tinyrack-sm py-tinyrack-3xs text-center font-tinyrack-mono text-tinyrack-sm text-tinyrack-text\"\n key={code}\n >\n {code}\n </code>\n ))}\n </div>\n\n <Alert icon={TriangleAlertIcon} type=\"warning\">\n {t('setupTotp.recoveryCodes.warning')}\n </Alert>\n\n <TRButton\n appearance=\"outline\"\n className=\"w-full gap-tinyrack-sm\"\n intent=\"neutral\"\n onClick={handleCopy}\n type=\"button\"\n >\n <CopyIcon aria-hidden className=\"size-tinyrack-lg\" />\n {t('setupTotp.recoveryCodes.copy')}\n </TRButton>\n\n {/*\n `TRField.Root` owns the label/control association, so the checkbox\n keeps its own focus ring instead of being swallowed by a wrapping\n `<label>` that had none.\n */}\n <TRField.Root>\n <div className=\"flex items-center gap-tinyrack-sm\">\n <TRCheckbox.Root\n checked={confirmed}\n data-testid=\"recovery-codes-confirm\"\n disabled={isLoading}\n onCheckedChange={(checked) => setConfirmed(checked === true)}\n uiSize=\"md\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n <TRField.Label className=\"cursor-pointer\">\n {t('setupTotp.recoveryCodes.confirmCheckbox')}\n </TRField.Label>\n </div>\n </TRField.Root>\n\n <TRButton\n className=\"w-full\"\n data-testid=\"recovery-codes-submit\"\n disabled={!confirmed || isLoading}\n intent=\"primary\"\n loading={isLoading}\n onClick={onConfirm}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('setupTotp.recoveryCodes.confirm')}\n </TRButton>\n </div>\n );\n}\n","import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { useCallback, useMemo, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport {\n PinInput,\n type PinInputRef,\n} from '#frontend/components/ui/pin-input.tsx';\n\nexport interface VerifyStepProps {\n onSubmit: (code: string) => Promise<void>;\n onBack?: (() => void) | undefined;\n isPending: boolean;\n invalidMessage?: string | undefined;\n submitLabel?: string | undefined;\n pendingText?: string | undefined;\n backLabel?: string | undefined;\n className?: string;\n}\n\ntype VerifyFormValues = {\n code: string;\n};\n\nexport function VerifyStep({\n onSubmit,\n onBack,\n isPending,\n invalidMessage,\n submitLabel,\n pendingText,\n backLabel,\n className = '',\n}: VerifyStepProps) {\n const { t } = useTranslation();\n const pinInputRef = useRef<PinInputRef>(null);\n\n const verifySchema = useMemo(\n () =>\n z.object({\n code: z\n .string()\n .length(6, t('validation.totp.length'))\n .regex(/^\\d{6}$/, t('validation.totp.digits')),\n }),\n [t],\n );\n\n const {\n setValue,\n setError,\n handleSubmit,\n watch,\n formState: { errors },\n } = useForm<VerifyFormValues>({\n defaultValues: { code: '' },\n resolver: standardSchemaResolver(verifySchema),\n });\n\n const codeValue = watch('code');\n\n const handleFormSubmit = useCallback(\n async (values: VerifyFormValues) => {\n try {\n await onSubmit(values.code);\n } catch {\n setError('code', {\n type: 'manual',\n message: invalidMessage ?? t('setupTotp.error.invalid'),\n });\n setValue('code', '');\n pinInputRef.current?.focus();\n }\n },\n [invalidMessage, onSubmit, setError, setValue, t],\n );\n\n return (\n <div className={`flex flex-col gap-tinyrack-lg ${className}`}>\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(handleFormSubmit)}\n >\n <PinInput\n autoFocus\n error={errors.code}\n length={6}\n onChange={(value) => setValue('code', value)}\n onComplete={() => handleSubmit(handleFormSubmit)()}\n ref={pinInputRef}\n value={codeValue}\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={isPending}\n loadingLabel={pendingText ?? t('setupTotp.verifying')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {submitLabel ?? t('setupTotp.verify')}\n </TRButton>\n </form>\n\n {onBack && (\n <TRButton\n appearance=\"ghost\"\n className=\"w-full\"\n data-testid=\"totp-verify-back\"\n disabled={isPending}\n intent=\"neutral\"\n onClick={onBack}\n type=\"button\"\n >\n {backLabel ?? t('setupTotp.back')}\n </TRButton>\n )}\n </div>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { useControlled } from '@base-ui/utils/useControlled';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { useTransitionStatus } from \"../../internals/useTransitionStatus.mjs\";\nexport function useCollapsibleRoot(parameters) {\n const {\n open: openParam,\n defaultOpen,\n onOpenChange,\n disabled\n } = parameters;\n const [open, setOpen] = useControlled({\n controlled: openParam,\n default: defaultOpen,\n name: 'Collapsible',\n state: 'open'\n });\n const {\n mounted,\n setMounted,\n transitionStatus\n } = useTransitionStatus(open, true, true);\n const defaultPanelId = useBaseUiId();\n // `undefined` uses the initial generated fallback; `null` means the panel unmounted.\n const [registeredPanelId, setPanelIdState] = React.useState();\n const panelId = registeredPanelId === null ? undefined : registeredPanelId ?? defaultPanelId;\n const handleTrigger = useStableCallback(event => {\n const nextOpen = !open;\n const eventDetails = createChangeEventDetails(REASONS.triggerPress, event.nativeEvent);\n onOpenChange(nextOpen, eventDetails);\n if (eventDetails.isCanceled) {\n return;\n }\n setOpen(nextOpen);\n });\n return React.useMemo(() => ({\n defaultPanelId,\n disabled,\n handleTrigger,\n mounted,\n open,\n panelId,\n setMounted,\n setOpen,\n setPanelIdState,\n transitionStatus\n }), [defaultPanelId, disabled, handleTrigger, mounted, open, panelId, setMounted, setOpen, setPanelIdState, transitionStatus]);\n}","'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nexport const CollapsibleRootContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") CollapsibleRootContext.displayName = \"CollapsibleRootContext\";\nexport function useCollapsibleRootContext() {\n const context = React.useContext(CollapsibleRootContext);\n if (context === undefined) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: CollapsibleRootContext is missing. Collapsible parts must be placed within <Collapsible.Root>.' : _formatErrorMessage(15));\n }\n return context;\n}","import { TransitionStatusDataAttributes } from \"../../internals/stateAttributesMapping.mjs\";\nexport let CollapsiblePanelDataAttributes = function (CollapsiblePanelDataAttributes) {\n /**\n * Present when the collapsible panel is open.\n */\n CollapsiblePanelDataAttributes[\"open\"] = \"data-open\";\n /**\n * Present when the collapsible panel is closed.\n */\n CollapsiblePanelDataAttributes[\"closed\"] = \"data-closed\";\n /**\n * Present when the panel begins animating in.\n */\n CollapsiblePanelDataAttributes[CollapsiblePanelDataAttributes[\"startingStyle\"] = TransitionStatusDataAttributes.startingStyle] = \"startingStyle\";\n /**\n * Present when the panel is animating out.\n */\n CollapsiblePanelDataAttributes[CollapsiblePanelDataAttributes[\"endingStyle\"] = TransitionStatusDataAttributes.endingStyle] = \"endingStyle\";\n return CollapsiblePanelDataAttributes;\n}({});","export let CollapsibleTriggerDataAttributes = /*#__PURE__*/function (CollapsibleTriggerDataAttributes) {\n /**\n * Present when the collapsible panel is open.\n */\n CollapsibleTriggerDataAttributes[\"panelOpen\"] = \"data-panel-open\";\n return CollapsibleTriggerDataAttributes;\n}({});","import { CollapsiblePanelDataAttributes } from \"../collapsible/panel/CollapsiblePanelDataAttributes.mjs\";\nimport { CollapsibleTriggerDataAttributes } from \"../collapsible/trigger/CollapsibleTriggerDataAttributes.mjs\";\nconst PANEL_OPEN_HOOK = {\n [CollapsiblePanelDataAttributes.open]: ''\n};\nconst PANEL_CLOSED_HOOK = {\n [CollapsiblePanelDataAttributes.closed]: ''\n};\nexport const triggerOpenStateMapping = {\n open(value) {\n if (value) {\n return {\n [CollapsibleTriggerDataAttributes.panelOpen]: ''\n };\n }\n return null;\n }\n};\nexport const collapsibleOpenStateMapping = {\n open(value) {\n if (value) {\n return PANEL_OPEN_HOOK;\n }\n return PANEL_CLOSED_HOOK;\n }\n};","import { collapsibleOpenStateMapping as baseMapping } from \"../../utils/collapsibleOpenStateMapping.mjs\";\nimport { transitionStatusMapping } from \"../../internals/stateAttributesMapping.mjs\";\nexport const collapsibleStateAttributesMapping = {\n ...baseMapping,\n ...transitionStatusMapping\n};","'use client';\n\nimport * as React from 'react';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useCollapsibleRoot } from \"./useCollapsibleRoot.mjs\";\nimport { CollapsibleRootContext } from \"./CollapsibleRootContext.mjs\";\nimport { collapsibleStateAttributesMapping } from \"./stateAttributesMapping.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\n/**\n * Groups all parts of the collapsible.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Collapsible](https://base-ui.com/react/components/collapsible)\n */\nexport const CollapsibleRoot = /*#__PURE__*/React.forwardRef(function CollapsibleRoot(componentProps, forwardedRef) {\n const {\n render,\n className,\n defaultOpen = false,\n disabled = false,\n onOpenChange: onOpenChangeProp,\n open,\n style,\n ...elementProps\n } = componentProps;\n const onOpenChange = useStableCallback(onOpenChangeProp);\n const collapsible = useCollapsibleRoot({\n open,\n defaultOpen,\n onOpenChange,\n disabled\n });\n const state = React.useMemo(() => ({\n open: collapsible.open,\n disabled: collapsible.disabled,\n transitionStatus: collapsible.transitionStatus\n }), [collapsible.open, collapsible.disabled, collapsible.transitionStatus]);\n const contextValue = React.useMemo(() => ({\n ...collapsible,\n onOpenChange,\n state\n }), [collapsible, onOpenChange, state]);\n const element = useRenderElement('div', componentProps, {\n state,\n ref: forwardedRef,\n props: elementProps,\n stateAttributesMapping: collapsibleStateAttributesMapping\n });\n return /*#__PURE__*/_jsx(CollapsibleRootContext.Provider, {\n value: contextValue,\n children: element\n });\n});\nif (process.env.NODE_ENV !== \"production\") CollapsibleRoot.displayName = \"CollapsibleRoot\";","'use client';\n\nimport * as React from 'react';\nimport { triggerOpenStateMapping } from \"../../utils/collapsibleOpenStateMapping.mjs\";\nimport { transitionStatusMapping } from \"../../internals/stateAttributesMapping.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useButton } from \"../../internals/use-button/index.mjs\";\nimport { useCollapsibleRootContext } from \"../root/CollapsibleRootContext.mjs\";\nconst stateAttributesMapping = {\n ...triggerOpenStateMapping,\n ...transitionStatusMapping\n};\n\n/**\n * A button that opens and closes the collapsible panel.\n * Renders a `<button>` element.\n *\n * Documentation: [Base UI Collapsible](https://base-ui.com/react/components/collapsible)\n */\nexport const CollapsibleTrigger = /*#__PURE__*/React.forwardRef(function CollapsibleTrigger(componentProps, forwardedRef) {\n const {\n panelId,\n open,\n handleTrigger,\n state,\n disabled: contextDisabled\n } = useCollapsibleRootContext();\n const {\n className,\n disabled = contextDisabled,\n render,\n nativeButton = true,\n style,\n ...elementProps\n } = componentProps;\n const {\n getButtonProps,\n buttonRef\n } = useButton({\n disabled,\n focusableWhenDisabled: true,\n native: nativeButton\n });\n const element = useRenderElement('button', componentProps, {\n state,\n ref: [forwardedRef, buttonRef],\n props: [{\n 'aria-controls': open ? panelId : undefined,\n 'aria-expanded': open,\n onClick: handleTrigger\n }, elementProps, getButtonProps],\n stateAttributesMapping\n });\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") CollapsibleTrigger.displayName = \"CollapsibleTrigger\";","'use client';\n\nimport * as React from 'react';\nimport { addEventListener } from '@base-ui/utils/addEventListener';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useMergedRefs } from '@base-ui/utils/useMergedRefs';\nimport { AnimationFrame } from '@base-ui/utils/useAnimationFrame';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useValueAsRef } from '@base-ui/utils/useValueAsRef';\nimport { warn } from '@base-ui/utils/warn';\nimport { ownerWindow } from '@base-ui/utils/owner';\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { useOpenChangeComplete } from \"../../internals/useOpenChangeComplete.mjs\";\nimport { useAnimationsFinished } from \"../../internals/useAnimationsFinished.mjs\";\nimport { CollapsiblePanelDataAttributes } from \"./CollapsiblePanelDataAttributes.mjs\";\nconst EMPTY_DIMENSIONS = {\n height: undefined,\n width: undefined\n};\nexport function useCollapsiblePanel(parameters) {\n const {\n externalRef,\n hiddenUntilFound,\n id: idParam,\n keepMounted,\n mounted,\n onOpenChange,\n open,\n setMounted,\n setOpen,\n transitionStatus\n } = parameters;\n const panelRef = React.useRef(null);\n const animationTypeRef = React.useRef(null);\n const [dimensions, setDimensionsUnwrapped] = React.useState(EMPTY_DIMENSIONS);\n const lastMeasuredDimensionsRef = React.useRef(EMPTY_DIMENSIONS);\n // `beforematch` should reveal the matched content immediately, so the next\n // open cycle skips author-defined motion once and then returns to normal.\n const shouldSkipNextOpenRef = React.useRef(false);\n // Keyframe mount animations on initially open panels cause a visible layout\n // shift during the server-rendered first paint, so suppress that first open\n // lifecycle until the panel has been closed once.\n const shouldPreventMountAnimationRef = React.useRef(open);\n // React.Activity tears down Effects while preserving state, so revealing an\n // already-open panel would otherwise replay its CSS keyframe open animation.\n const shouldPreventActivityResumeAnimationRef = React.useRef(false);\n // Some open paths intentionally bypass motion, but the shared root transition\n // status still advances asynchronously. Override the panel to idle so its data\n // attributes and dimension cleanup reflect the immediate open state.\n const [forcePanelIdle, setForcePanelIdle] = React.useState(false);\n const pendingTemporaryStyleRestoreRef = React.useRef(null);\n const mergedPanelRef = useMergedRefs(externalRef, panelRef);\n const latestOpenRef = useValueAsRef(open);\n // Only used to handle panel close\n const runOnceCloseAnimationsFinish = useAnimationsFinished(panelRef);\n const hidden = !open && !mounted;\n const panelTransitionStatus = forcePanelIdle ? 'idle' : transitionStatus;\n const shouldPreventOpenAnimation = open && (\n // These 2 refs are safe to read in render, they are only written from committed\n // layout/effect paths and gate one-shot motion suppression for the next open\n // lifecycle. They intentionally expose the last committed motion snapshot.\n shouldPreventMountAnimationRef.current || shouldPreventActivityResumeAnimationRef.current);\n const renderedDimensions = !open && mounted &&\n // These 2 refs are also safe to read in render, both hold the last committed\n // animation mode and measurement. This fallback only restores a previously\n // measured pixel size after the live dimensions state has been reset back to `auto`.\n animationTypeRef.current === 'css-animation' && dimensions.height === undefined && dimensions.width === undefined ? lastMeasuredDimensionsRef.current : dimensions;\n const shouldPersistHiddenTransitionStyles = hiddenUntilFound && hidden && animationTypeRef.current !== 'css-animation';\n\n // Most measured dimensions are reused later when CSS keyframe closes need a\n // pixel size after the rendered dimensions have been reset back to `auto`.\n // Passing `false` is only for clearing the current dimensions state.\n const setDimensions = useStableCallback((nextDimensions, shouldCacheMeasurement = true) => {\n if (shouldCacheMeasurement) {\n lastMeasuredDimensionsRef.current = nextDimensions;\n }\n setDimensionsUnwrapped(nextDimensions);\n });\n const restorePendingTemporaryStyle = useStableCallback(() => {\n pendingTemporaryStyleRestoreRef.current?.();\n pendingTemporaryStyleRestoreRef.current = null;\n });\n const setPendingTemporaryStyleRestore = useStableCallback(restore => {\n restorePendingTemporaryStyle();\n pendingTemporaryStyleRestoreRef.current = () => {\n pendingTemporaryStyleRestoreRef.current = null;\n restore();\n };\n });\n\n // React.Activity unmounts Effects while preserving component state. If that\n // teardown happens while an already-open keyframe panel is visible, remember\n // to suppress the replayed open animation on the next committed reveal.\n const markActivityResumeAnimationSuppressed = useStableCallback(() => {\n if (open && mounted && animationTypeRef.current === 'css-animation') {\n shouldPreventActivityResumeAnimationRef.current = true;\n }\n });\n useIsoLayoutEffect(() => {\n // `forcePanelIdle` is only a temporary override for open paths that skip\n // motion. Keep it active while the shared root still reports `starting`,\n // then drop it once the root transition state catches up.\n if (!forcePanelIdle || transitionStatus === 'starting') {\n return;\n }\n setForcePanelIdle(false);\n }, [forcePanelIdle, transitionStatus]);\n React.useEffect(() => {\n return () => {\n markActivityResumeAnimationSuppressed();\n restorePendingTemporaryStyle();\n };\n }, [markActivityResumeAnimationSuppressed, restorePendingTemporaryStyle]);\n useIsoLayoutEffect(() => {\n const panel = panelRef.current;\n if (!panel) {\n return undefined;\n }\n\n // `beforematch` can temporarily force a `0s` motion duration so the matched\n // content reveals immediately. Restore the authored duration before detecting\n // the next close animation type, otherwise that first close is misread as\n // \"no motion\" and the close transition or keyframe gets skipped.\n if (!open && pendingTemporaryStyleRestoreRef.current) {\n restorePendingTemporaryStyle();\n }\n const animationType = getAnimationType(panel, shouldPreventOpenAnimation);\n animationTypeRef.current = animationType;\n\n // Initially open keyframe panels skip their first paint animation to avoid\n // layout shift, but we still need to cache the expanded size so the first\n // close animation can start from pixels instead of `auto`.\n if (open && transitionStatus === 'idle' && shouldPreventMountAnimationRef.current && animationType === 'css-animation') {\n lastMeasuredDimensionsRef.current = getDimensions(panel);\n return undefined;\n }\n\n // Handle the opening pass: measure the expanded size and, when necessary,\n // neutralize author-defined motion so the panel can open immediately.\n if (open && transitionStatus === 'starting') {\n // `beforematch` opens should reveal the panel immediately so find-in-page\n // does not wait for the author-defined transition or animation to finish.\n const skipNextOpen = shouldSkipNextOpenRef.current;\n shouldSkipNextOpenRef.current = false;\n if (animationType === 'none') {\n setDimensions(getDimensions(panel));\n setForcePanelIdle(true);\n return undefined;\n }\n if (animationType === 'css-transition') {\n const restoreLayoutStyles = resetLayoutStyles(panel);\n setDimensions(getDimensions(panel));\n if (!skipNextOpen) {\n return restoreLayoutStyles;\n }\n const restoreTransitionDuration = setTemporaryStyle(panel, 'transition-duration', '0s');\n setPendingTemporaryStyleRestore(restoreTransitionDuration);\n setForcePanelIdle(true);\n return restoreLayoutStyles;\n }\n setDimensions(getDimensions(panel));\n const restoreAnimationName = setTemporaryStyle(panel, 'animation-name', 'none');\n if (!skipNextOpen) {\n restoreAnimationName();\n return undefined;\n }\n const restoreAnimationDuration = setTemporaryStyle(panel, 'animation-duration', '0s');\n restoreAnimationName();\n setPendingTemporaryStyleRestore(restoreAnimationDuration);\n setForcePanelIdle(true);\n return undefined;\n }\n\n // Capture the current size as soon as close is requested, before the\n // deferred ending phase applies closed styles. This keeps close transitions\n // starting from a measured pixel value, including interrupted opens.\n if (!open && mounted && (transitionStatus === 'idle' || transitionStatus === 'starting')) {\n shouldPreventMountAnimationRef.current = false;\n shouldPreventActivityResumeAnimationRef.current = false;\n if (animationType === 'none') {\n setDimensions(EMPTY_DIMENSIONS, false);\n setMounted(false);\n return undefined;\n }\n setDimensions(getDimensions(panel));\n return undefined;\n }\n if (transitionStatus !== 'ending') {\n return undefined;\n }\n\n // Reachable when `transitionStatus` already flipped to `ending` before this effect ran, so\n // the close branch above was skipped. Without motion there is nothing to wait for, so unmount\n // here instead of deferring to the animation-finished path below.\n if (animationType === 'none') {\n setMounted(false);\n return undefined;\n }\n const nextDimensions = getDimensions(panel);\n const hasMeasuredSize = nextDimensions.height > 0 || nextDimensions.width > 0;\n if (!hasMeasuredSize) {\n setMounted(false);\n return undefined;\n }\n setDimensions(nextDimensions);\n if (animationType === 'css-animation') {\n const restoreAnimationName = setTemporaryStyle(panel, 'animation-name', 'none');\n restoreAnimationName();\n }\n return undefined;\n }, [mounted, open, restorePendingTemporaryStyle, setDimensions, setMounted, setPendingTemporaryStyleRestore, shouldPreventOpenAnimation, transitionStatus]);\n useOpenChangeComplete({\n enabled: open && mounted && panelTransitionStatus === 'idle',\n open: true,\n ref: panelRef,\n onComplete() {\n // `useOpenChangeComplete` only aborts from its effect cleanup, which React runs in the\n // post-paint passive flush. An animation's `finished` microtask can resolve after the render\n // that set `open` to `false` but before that cleanup, so re-check the latest value here.\n // Clearing the measured size in that window would make the close transition start from\n // `height: 0` instead of the expanded pixel height.\n if (!open) {\n return;\n }\n setDimensions(EMPTY_DIMENSIONS, false);\n }\n });\n\n // Closing panels need extra sequencing beyond `useOpenChangeComplete`.\n // This passive effect runs after the `ending` render has committed, so\n // `[data-ending-style]` is already present. Chrome can still register the\n // exit transition one frame later when an Accordion closes one item while\n // opening another, so wait one frame before watching animations.\n // See https://github.com/mui/base-ui/issues/3099\n React.useEffect(() => {\n if (open || !mounted || panelTransitionStatus !== 'ending') {\n return undefined;\n }\n const panel = panelRef.current;\n if (!panel) {\n return undefined;\n }\n const abortController = new AbortController();\n let endingStyleFrame = -1;\n function handleComplete() {\n // Same post-paint race as the `useOpenChangeComplete` callback above, except `open` is\n // captured by this effect's closure and always `false` here, so read the latest value from\n // a ref. Unmounting a panel that has already reopened would drop it from the DOM.\n if (latestOpenRef.current) {\n return;\n }\n setMounted(false);\n setDimensions(EMPTY_DIMENSIONS, false);\n }\n endingStyleFrame = AnimationFrame.request(() => {\n runOnceCloseAnimationsFinish(handleComplete, abortController.signal);\n });\n return () => {\n AnimationFrame.cancel(endingStyleFrame);\n abortController.abort();\n };\n }, [latestOpenRef, mounted, open, panelTransitionStatus, runOnceCloseAnimationsFinish, setDimensions, setMounted]);\n useIsoLayoutEffect(() => {\n const panel = panelRef.current;\n if (!panel || !hiddenUntilFound || !hidden) {\n return;\n }\n\n // React only supports a boolean for the `hidden` attribute and forces\n // legit string values to booleans so we have to force it back in the DOM\n // when necessary: https://github.com/react/react/issues/24740\n panel.setAttribute('hidden', 'until-found');\n }, [hidden, hiddenUntilFound]);\n React.useEffect(function registerBeforeMatchListener() {\n const panel = panelRef.current;\n if (!panel) {\n return undefined;\n }\n function handleBeforeMatch(event) {\n const eventDetails = createChangeEventDetails(REASONS.none, event);\n onOpenChange(true, eventDetails);\n if (eventDetails.isCanceled) {\n return;\n }\n shouldSkipNextOpenRef.current = true;\n setOpen(true);\n }\n return addEventListener(panel, 'beforematch', handleBeforeMatch);\n }, [onOpenChange, setOpen]);\n const shouldRender = keepMounted || hiddenUntilFound || mounted || open;\n return {\n height: renderedDimensions.height,\n props: {\n ...(shouldPersistHiddenTransitionStyles ? {\n [CollapsiblePanelDataAttributes.startingStyle]: ''\n } : undefined),\n hidden,\n id: idParam\n },\n ref: mergedPanelRef,\n shouldPreventOpenAnimation,\n shouldRender,\n transitionStatus: panelTransitionStatus,\n width: renderedDimensions.width\n };\n}\nfunction getDimensions(element) {\n return {\n height: element.scrollHeight,\n width: element.scrollWidth\n };\n}\nfunction getAnimationType(element, hasSuppressedMountAnimation) {\n const panelStyles = ownerWindow(element).getComputedStyle(element);\n const hasAnimation = (panelStyles.animationName.split(',').map(name => name.trim()).some(name => name !== '' && name !== 'none') || hasSuppressedMountAnimation) && hasNonZeroDuration(panelStyles.animationDuration);\n const hasTransition = hasNonZeroDuration(panelStyles.transitionDuration);\n if (hasAnimation && hasTransition) {\n /* istanbul ignore else -- `process.env.NODE_ENV` is a build-time constant under test */\n if (process.env.NODE_ENV !== 'production') {\n warn('CSS transitions and CSS animations both detected on Collapsible or Accordion panel.', 'Only one of either animation type should be used.');\n }\n return 'css-transition';\n }\n if (hasTransition) {\n return 'css-transition';\n }\n if (hasAnimation) {\n return 'css-animation';\n }\n return 'none';\n}\nfunction hasNonZeroDuration(value) {\n return value.split(',').map(part => part.trim()).some(part => part !== '' && Number.parseFloat(part) > 0);\n}\n\n/**\n * Temporarily overrides an inline style property and returns a cleanup that\n * restores the previous inline value and priority.\n * @param element - The element whose inline style should be updated.\n * @param property - The CSS property name to override.\n * @param value - The temporary value to assign.\n * @returns A cleanup function that restores the original inline style state.\n */\nfunction setTemporaryStyle(element, property, value) {\n const previousValue = element.style.getPropertyValue(property);\n const previousPriority = element.style.getPropertyPriority(property);\n element.style.setProperty(property, value);\n return () => {\n if (previousValue === '') {\n element.style.removeProperty(property);\n return;\n }\n element.style.setProperty(property, previousValue, previousPriority);\n };\n}\n\n/**\n * Temporarily resets inline alignment styles that can distort scroll-based\n * size measurements, then restores them on the next animation frame.\n * @param element - The panel element being measured.\n * @returns A cleanup function that cancels the scheduled restore and reapplies\n * the original inline layout styles immediately.\n */\nfunction resetLayoutStyles(element) {\n const originalLayoutStyles = {\n 'justify-content': element.style.justifyContent,\n 'align-items': element.style.alignItems,\n 'align-content': element.style.alignContent,\n 'justify-items': element.style.justifyItems\n };\n Object.keys(originalLayoutStyles).forEach(key => {\n element.style.setProperty(key, 'initial', 'important');\n });\n function restoreLayoutStyles() {\n Object.entries(originalLayoutStyles).forEach(([key, value]) => {\n if (value === '') {\n element.style.removeProperty(key);\n return;\n }\n element.style.setProperty(key, value);\n });\n }\n const frame = AnimationFrame.request(restoreLayoutStyles);\n return () => {\n AnimationFrame.cancel(frame);\n restoreLayoutStyles();\n };\n}","export let CollapsiblePanelCssVars = /*#__PURE__*/function (CollapsiblePanelCssVars) {\n /**\n * The collapsible panel's height.\n * @type {number}\n */\n CollapsiblePanelCssVars[\"collapsiblePanelHeight\"] = \"--collapsible-panel-height\";\n /**\n * The collapsible panel's width.\n * @type {number}\n */\n CollapsiblePanelCssVars[\"collapsiblePanelWidth\"] = \"--collapsible-panel-width\";\n return CollapsiblePanelCssVars;\n}({});","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { warn } from '@base-ui/utils/warn';\nimport { resolveStyle } from \"../../utils/resolveStyle.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useCollapsibleRootContext } from \"../root/CollapsibleRootContext.mjs\";\nimport { collapsibleStateAttributesMapping } from \"../root/stateAttributesMapping.mjs\";\nimport { useCollapsiblePanel } from \"./useCollapsiblePanel.mjs\";\nimport { CollapsiblePanelCssVars } from \"./CollapsiblePanelCssVars.mjs\";\n/**\n * A panel with the collapsible contents.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Collapsible](https://base-ui.com/react/components/collapsible)\n */\nexport const CollapsiblePanel = /*#__PURE__*/React.forwardRef(function CollapsiblePanel(componentProps, forwardedRef) {\n const {\n className,\n hiddenUntilFound: hiddenUntilFoundProp,\n keepMounted: keepMountedProp,\n render,\n id: idProp,\n style,\n ...elementProps\n } = componentProps;\n\n /* istanbul ignore else -- `process.env.NODE_ENV` is a build-time constant under test */\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useEffect(() => {\n if (hiddenUntilFoundProp && keepMountedProp === false) {\n warn('The `keepMounted={false}` prop on `Collapsible.Panel` is ignored when `hiddenUntilFound` is enabled, since the panel must remain mounted while closed.');\n }\n }, [hiddenUntilFoundProp, keepMountedProp]);\n }\n const {\n defaultPanelId,\n mounted,\n onOpenChange,\n open,\n setMounted,\n setPanelIdState,\n setOpen,\n state,\n transitionStatus\n } = useCollapsibleRootContext();\n const hiddenUntilFound = hiddenUntilFoundProp ?? false;\n const keepMounted = keepMountedProp ?? false;\n const registeredId = idProp || undefined;\n const id = registeredId ?? defaultPanelId;\n useIsoLayoutEffect(() => {\n setPanelIdState(currentId => registeredId ?? (currentId === null ? undefined : currentId));\n return () => {\n setPanelIdState(currentId => currentId === registeredId ? null : currentId);\n };\n }, [registeredId, setPanelIdState]);\n const {\n height,\n props,\n ref,\n shouldPreventOpenAnimation,\n shouldRender,\n transitionStatus: panelTransitionStatus,\n width\n } = useCollapsiblePanel({\n externalRef: forwardedRef,\n hiddenUntilFound,\n id,\n keepMounted,\n mounted,\n onOpenChange,\n open,\n setMounted,\n setOpen,\n transitionStatus\n });\n const panelState = {\n ...state,\n transitionStatus: panelTransitionStatus\n };\n const resolvedStyle = resolveStyle(style, panelState);\n const element = useRenderElement('div', {\n ...componentProps,\n style: undefined\n }, {\n state: panelState,\n ref,\n props: [props, {\n style: {\n [CollapsiblePanelCssVars.collapsiblePanelHeight]: height === undefined ? 'auto' : `${height}px`,\n [CollapsiblePanelCssVars.collapsiblePanelWidth]: width === undefined ? 'auto' : `${width}px`\n }\n }, elementProps, resolvedStyle ? {\n style: resolvedStyle\n } : undefined,\n // Resolve the public `style` prop so temporary `animationName: 'none'`\n // can still win after user's inline styles have been merged.\n shouldPreventOpenAnimation ? {\n style: {\n animationName: 'none'\n }\n } : undefined],\n stateAttributesMapping: collapsibleStateAttributesMapping\n });\n if (!shouldRender) {\n return null;\n }\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") CollapsiblePanel.displayName = \"CollapsiblePanel\";","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Collapsible } from \"@base-ui/react/collapsible\";\n//#region src/components/collapsible/collapsible-panel.tsx\nconst TRCollapsiblePanel = createComponentPart(Collapsible.Panel, \"tr-collapsible-content\");\n//#endregion\nexport { TRCollapsiblePanel };\n\n//# sourceMappingURL=collapsible-panel.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Collapsible } from \"@base-ui/react/collapsible\";\n//#region src/components/collapsible/collapsible-root.tsx\nconst TRCollapsibleRoot = createComponentPart(Collapsible.Root, \"tr-collapsible\");\n//#endregion\nexport { TRCollapsibleRoot };\n\n//# sourceMappingURL=collapsible-root.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Collapsible } from \"@base-ui/react/collapsible\";\n//#region src/components/collapsible/collapsible-trigger.tsx\nconst TRCollapsibleTrigger = createComponentPart(Collapsible.Trigger, \"tr-collapsible-summary\");\n//#endregion\nexport { TRCollapsibleTrigger };\n\n//# sourceMappingURL=collapsible-trigger.js.map","import { TRCollapsiblePanel } from \"./collapsible-panel.js\";\nimport { TRCollapsibleRoot } from \"./collapsible-root.js\";\nimport { TRCollapsibleTrigger } from \"./collapsible-trigger.js\";\n//#region src/components/collapsible/index.tsx\nconst TRCollapsible = {\n\tRoot: TRCollapsibleRoot,\n\tTrigger: TRCollapsibleTrigger,\n\tPanel: TRCollapsiblePanel\n};\n//#endregion\nexport { TRCollapsible, TRCollapsiblePanel, TRCollapsibleRoot, TRCollapsibleTrigger };\n\n//# sourceMappingURL=index.js.map","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCollapsible } from '@tinyrack/ui/components/collapsible';\nimport type { ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type { TotpSetupData } from '#frontend/features/totp/use-totp-setup.ts';\n\nexport interface QrStepProps {\n setupData: TotpSetupData;\n onNext: () => void;\n additionalActions?: ReactNode;\n className?: string;\n}\n\nexport function QrStep({\n setupData,\n onNext,\n additionalActions,\n className = '',\n}: QrStepProps) {\n const { t } = useTranslation();\n\n return (\n <div className={`flex flex-col gap-tinyrack-lg ${className}`}>\n <p className=\"text-center text-tinyrack-sm text-tinyrack-text-muted\">\n {t('setupTotp.qrDescription')}\n </p>\n\n {/*\n The QR sits on its own light surface with padding for the quiet zone.\n Rendered straight onto the canvas it inherited the dark theme's\n background, and scanners need the margin and the contrast to lock on.\n */}\n <div className=\"flex justify-center\">\n <div className=\"rounded-tinyrack-lg border border-tinyrack-border bg-tinyrack-surface p-tinyrack-lg\">\n <img\n alt=\"TOTP QR Code\"\n className=\"block size-tinyrack-measure-sm\"\n src={setupData.qr_code}\n />\n </div>\n </div>\n\n <TRCollapsible.Root>\n <TRCollapsible.Trigger>\n {t('setupTotp.manualEntry')}\n </TRCollapsible.Trigger>\n <TRCollapsible.Panel>\n <code className=\"mt-tinyrack-xs block break-all rounded-tinyrack-sm bg-tinyrack-surface-muted p-tinyrack-sm text-tinyrack-sm text-tinyrack-text\">\n {setupData.secret}\n </code>\n </TRCollapsible.Panel>\n </TRCollapsible.Root>\n\n <TRButton\n className=\"w-full\"\n data-testid=\"totp-qr-next\"\n intent=\"primary\"\n onClick={onNext}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('setupTotp.next')}\n </TRButton>\n\n {additionalActions}\n </div>\n );\n}\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport {\n confirmTotpSetupMutationOptions,\n startTotpSetupMutationOptions,\n type TotpConfirmResponse,\n type TotpSetupResponse,\n type TotpSetupVerifyResponse,\n verifyTotpMutationOptions,\n} from '#frontend/queries/totp.ts';\n\nexport type TotpSetupStep = 'loading' | 'qr' | 'verify' | 'recovery' | 'error';\n\nexport interface TotpSetupData {\n qr_code: string;\n secret: string;\n}\n\nexport interface UseTotpSetupOptions {\n onSetupSuccess?: (data: TotpSetupResponse) => void;\n onSetupError?: (error: Error) => void;\n onVerifySuccess?: (data: TotpSetupVerifyResponse) => void;\n onVerifyError?: (error: Error) => void;\n onConfirmSuccess?: (data: TotpConfirmResponse) => void;\n onConfirmError?: (error: Error) => void;\n autoStart?: boolean;\n}\n\nexport interface UseTotpSetupReturn {\n step: TotpSetupStep;\n setupData: TotpSetupResponse | null;\n recoveryCodes: string[];\n isSetupPending: boolean;\n isVerifyPending: boolean;\n isConfirmPending: boolean;\n isPending: boolean;\n setupError: Error | null;\n verifyError: Error | null;\n confirmError: Error | null;\n startSetup: () => void;\n verify: (code: string) => Promise<TotpSetupVerifyResponse>;\n goToQr: () => void;\n goToVerify: () => void;\n confirmRecoveryCodes: () => Promise<TotpConfirmResponse>;\n reset: () => void;\n}\n\nexport function useTotpSetup(\n options: UseTotpSetupOptions = {},\n): UseTotpSetupReturn {\n const {\n onSetupSuccess,\n onSetupError,\n onVerifySuccess,\n onVerifyError,\n onConfirmSuccess,\n onConfirmError,\n autoStart = false,\n } = options;\n\n const queryClient = useQueryClient();\n const [step, setStep] = useState<TotpSetupStep>(autoStart ? 'loading' : 'qr');\n const [setupData, setSetupData] = useState<TotpSetupResponse | null>(null);\n const [recoveryCodes, setRecoveryCodes] = useState<string[]>([]);\n const setupInitiatedRef = useRef(false);\n\n const setupMutation = useMutation({\n ...startTotpSetupMutationOptions,\n onSuccess: (data) => {\n setSetupData(data);\n setStep('qr');\n onSetupSuccess?.(data);\n },\n onError: (error) => {\n setStep('error');\n onSetupError?.(error);\n },\n });\n\n const verifyMutation = useMutation({\n ...verifyTotpMutationOptions,\n onSuccess: (data) => {\n // Do NOT invalidate session here - TOTP is not fully enabled yet\n setRecoveryCodes(data.recovery_codes);\n setStep('recovery');\n onVerifySuccess?.(data);\n },\n onError: (error) => {\n onVerifyError?.(error);\n },\n });\n\n const confirmMutation = useMutation({\n ...confirmTotpSetupMutationOptions,\n onSuccess: (data) => {\n // Now TOTP is fully enabled, invalidate session\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n onConfirmSuccess?.(data);\n },\n onError: (error) => {\n onConfirmError?.(error);\n },\n });\n\n const startSetup = useCallback(() => {\n setupInitiatedRef.current = true;\n setStep('loading');\n setupMutation.mutate();\n }, [setupMutation]);\n\n const verify = useCallback(\n async (code: string) => {\n return verifyMutation.mutateAsync({ code });\n },\n [verifyMutation],\n );\n\n const goToQr = useCallback(() => {\n setStep('qr');\n }, []);\n\n const goToVerify = useCallback(() => {\n setStep('verify');\n }, []);\n\n const confirmRecoveryCodes = useCallback(async () => {\n return confirmMutation.mutateAsync();\n }, [confirmMutation]);\n\n const reset = useCallback(() => {\n setStep(autoStart ? 'loading' : 'qr');\n setSetupData(null);\n setRecoveryCodes([]);\n setupInitiatedRef.current = false;\n setupMutation.reset();\n verifyMutation.reset();\n confirmMutation.reset();\n }, [autoStart, setupMutation, verifyMutation, confirmMutation]);\n\n // Auto start setup on mount if enabled\n useEffect(() => {\n if (autoStart && !setupInitiatedRef.current && step === 'loading') {\n setupInitiatedRef.current = true;\n setupMutation.mutate();\n }\n }, [autoStart, step, setupMutation]);\n\n return {\n step,\n setupData,\n recoveryCodes,\n isSetupPending: setupMutation.isPending,\n isVerifyPending: verifyMutation.isPending,\n isConfirmPending: confirmMutation.isPending,\n isPending:\n setupMutation.isPending ||\n verifyMutation.isPending ||\n confirmMutation.isPending,\n setupError: setupMutation.error,\n verifyError: verifyMutation.error,\n confirmError: confirmMutation.error,\n startSetup,\n verify,\n goToQr,\n goToVerify,\n confirmRecoveryCodes,\n reset,\n };\n}\n"],"x_google_ignoreList":[0,1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{J as e,Z as t,b as n}from"./createLucideIcon-BPpAIXR_.js";import{O as r}from"./shell-header-bar-
|
|
2
|
-
//# sourceMappingURL=useAriaLabelledBy-
|
|
1
|
+
import{J as e,Z as t,b as n}from"./createLucideIcon-BPpAIXR_.js";import{O as r}from"./shell-header-bar-CgyNXbPS.js";var i=t(e(),1);function a(e,t,a,s=!0,c){let[l,u]=i.useState(),d=r(c?`${c}-label`:void 0),f=e??t??l;return n(()=>{let n=e||t||!s?void 0:o(a.current,d);l!==n&&u(n)}),f}function o(e,t){let n=s(e);if(n)return!n.id&&t&&(n.id=t),n.id||void 0}function s(e){if(!e)return;let t=e.parentElement;if(t&&t.tagName===`LABEL`)return t;let n=e.id;if(n){let t=e.nextElementSibling;if(t&&t.htmlFor===n)return t}let r=e.labels;return r&&r[0]}export{a as t};
|
|
2
|
+
//# sourceMappingURL=useAriaLabelledBy-7uIPXK-0.js.map
|
package/public/assets/{useAriaLabelledBy-CiOCg6X5.js.map → useAriaLabelledBy-7uIPXK-0.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAriaLabelledBy-
|
|
1
|
+
{"version":3,"file":"useAriaLabelledBy-7uIPXK-0.js","names":[],"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/internals/labelable-provider/useAriaLabelledBy.mjs"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useBaseUiId } from \"../useBaseUiId.mjs\";\nexport function useAriaLabelledBy(explicitAriaLabelledBy, labelId, labelSourceRef, enableFallback = true, labelSourceId) {\n const [fallbackAriaLabelledBy, setFallbackAriaLabelledBy] = React.useState();\n const generatedLabelId = useBaseUiId(labelSourceId ? `${labelSourceId}-label` : undefined);\n const ariaLabelledBy = explicitAriaLabelledBy ?? labelId ?? fallbackAriaLabelledBy;\n\n // Fallback for <span> controls labelled by wrapping/sibling native <label>.\n // Run after every commit so DOM association changes (e.g. label mount/unmount)\n // are reflected even when props/state deps are unchanged.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useIsoLayoutEffect(() => {\n const nextAriaLabelledBy = explicitAriaLabelledBy || labelId || !enableFallback ? undefined : getAriaLabelledBy(labelSourceRef.current, generatedLabelId);\n if (fallbackAriaLabelledBy !== nextAriaLabelledBy) {\n setFallbackAriaLabelledBy(nextAriaLabelledBy);\n }\n });\n return ariaLabelledBy;\n}\nfunction getAriaLabelledBy(labelSource, generatedLabelId) {\n const label = findAssociatedLabel(labelSource);\n if (!label) {\n return undefined;\n }\n if (!label.id && generatedLabelId) {\n label.id = generatedLabelId;\n }\n return label.id || undefined;\n}\nfunction findAssociatedLabel(labelSource) {\n if (!labelSource) {\n return undefined;\n }\n\n // Fast path before the expensive `.labels` read.\n const parent = labelSource.parentElement;\n if (parent && parent.tagName === 'LABEL') {\n return parent;\n }\n const controlId = labelSource.id;\n if (controlId) {\n const nextSibling = labelSource.nextElementSibling;\n if (nextSibling && nextSibling.htmlFor === controlId) {\n return nextSibling;\n }\n }\n const labels = labelSource.labels;\n return labels && labels[0];\n}"],"x_google_ignoreList":[0],"mappings":"mIAKA,SAAgB,EAAkB,EAAwB,EAAS,EAAgB,EAAiB,GAAM,EAAe,CACvH,GAAM,CAAC,EAAwB,GAAA,EAAmC,SAAS,EACrE,EAAmB,EAAY,EAAgB,GAAG,EAAc,QAAU,IAAA,EAAS,EACnF,EAAiB,GAA0B,GAAW,EAY5D,OANA,MAAyB,CACvB,IAAM,EAAqB,GAA0B,GAAW,CAAC,EAAiB,IAAA,GAAY,EAAkB,EAAe,QAAS,CAAgB,EACpJ,IAA2B,GAC7B,EAA0B,CAAkB,CAEhD,CAAC,EACM,CACT,CACA,SAAS,EAAkB,EAAa,EAAkB,CACxD,IAAM,EAAQ,EAAoB,CAAW,EACxC,KAML,MAHI,CAAC,EAAM,IAAM,IACf,EAAM,GAAK,GAEN,EAAM,IAAM,IAAA,EACrB,CACA,SAAS,EAAoB,EAAa,CACxC,GAAI,CAAC,EACH,OAIF,IAAM,EAAS,EAAY,cAC3B,GAAI,GAAU,EAAO,UAAY,QAC/B,OAAO,EAET,IAAM,EAAY,EAAY,GAC9B,GAAI,EAAW,CACb,IAAM,EAAc,EAAY,mBAChC,GAAI,GAAe,EAAY,UAAY,EACzC,OAAO,CAEX,CACA,IAAM,EAAS,EAAY,OAC3B,OAAO,GAAU,EAAO,EAC1B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{J as e,Z as t}from"./createLucideIcon-BPpAIXR_.js";import{
|
|
2
|
-
//# sourceMappingURL=useMutation-
|
|
1
|
+
import{J as e,Z as t}from"./createLucideIcon-BPpAIXR_.js";import{Br as n,Fr as r,Or as i,Sr as a,Ur as o,jr as s,zr as c}from"./config-DTQCUlfZ.js";import{r as l}from"./mutationOptions-DyYFUbyn.js";var u=class extends o{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),c(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&s(t.mutationKey)!==s(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??l();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){i.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}},d=t(e(),1);function f(e,t){let o=a(t),[s]=d.useState(()=>new u(o,e));d.useEffect(()=>{s.setOptions(e)},[s,e]);let c=d.useSyncExternalStore(d.useCallback(e=>s.subscribe(i.batchCalls(e)),[s]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),l=d.useCallback((e,t)=>{s.mutate(e,t).catch(r)},[s]);if(c.error&&n(s.options.throwOnError,[c.error]))throw c.error;return{...c,mutate:l,mutateAsync:c.mutate}}export{f as t};
|
|
2
|
+
//# sourceMappingURL=useMutation-BWZ0G4Td.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMutation-
|
|
1
|
+
{"version":3,"file":"useMutation-BWZ0G4Td.js","names":["#client","#updateResult","#currentMutation","#notify","#currentResult","#mutateOptions"],"sources":["../../../../node_modules/.pnpm/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/mutationObserver.js","../../../../node_modules/.pnpm/@tanstack+react-query@5.101.2_react@19.2.7/node_modules/@tanstack/react-query/build/modern/useMutation.js"],"sourcesContent":["// src/mutationObserver.ts\nimport { getDefaultState } from \"./mutation.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { hashKey, shallowEqualObjects } from \"./utils.js\";\nvar MutationObserver = class extends Subscribable {\n #client;\n #currentResult = void 0;\n #currentMutation;\n #mutateOptions;\n constructor(client, options) {\n super();\n this.#client = client;\n this.setOptions(options);\n this.bindMethods();\n this.#updateResult();\n }\n bindMethods() {\n this.mutate = this.mutate.bind(this);\n this.reset = this.reset.bind(this);\n }\n setOptions(options) {\n const prevOptions = this.options;\n this.options = this.#client.defaultMutationOptions(options);\n if (!shallowEqualObjects(this.options, prevOptions)) {\n this.#client.getMutationCache().notify({\n type: \"observerOptionsUpdated\",\n mutation: this.#currentMutation,\n observer: this\n });\n }\n if (prevOptions?.mutationKey && this.options.mutationKey && hashKey(prevOptions.mutationKey) !== hashKey(this.options.mutationKey)) {\n this.reset();\n } else if (this.#currentMutation?.state.status === \"pending\") {\n this.#currentMutation.setOptions(this.options);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#currentMutation?.removeObserver(this);\n }\n }\n onMutationUpdate(action) {\n this.#updateResult();\n this.#notify(action);\n }\n getCurrentResult() {\n return this.#currentResult;\n }\n reset() {\n this.#currentMutation?.removeObserver(this);\n this.#currentMutation = void 0;\n this.#updateResult();\n this.#notify();\n }\n mutate(variables, options) {\n this.#mutateOptions = options;\n this.#currentMutation?.removeObserver(this);\n this.#currentMutation = this.#client.getMutationCache().build(this.#client, this.options);\n this.#currentMutation.addObserver(this);\n return this.#currentMutation.execute(variables);\n }\n #updateResult() {\n const state = this.#currentMutation?.state ?? getDefaultState();\n this.#currentResult = {\n ...state,\n isPending: state.status === \"pending\",\n isSuccess: state.status === \"success\",\n isError: state.status === \"error\",\n isIdle: state.status === \"idle\",\n mutate: this.mutate,\n reset: this.reset\n };\n }\n #notify(action) {\n notifyManager.batch(() => {\n if (this.#mutateOptions && this.hasListeners()) {\n const variables = this.#currentResult.variables;\n const onMutateResult = this.#currentResult.context;\n const context = {\n client: this.#client,\n meta: this.options.meta,\n mutationKey: this.options.mutationKey\n };\n if (action?.type === \"success\") {\n try {\n this.#mutateOptions.onSuccess?.(\n action.data,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n this.#mutateOptions.onSettled?.(\n action.data,\n null,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n } else if (action?.type === \"error\") {\n try {\n this.#mutateOptions.onError?.(\n action.error,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n this.#mutateOptions.onSettled?.(\n void 0,\n action.error,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n }\n }\n this.listeners.forEach((listener) => {\n listener(this.#currentResult);\n });\n });\n }\n};\nexport {\n MutationObserver\n};\n//# sourceMappingURL=mutationObserver.js.map","\"use client\";\n\n// src/useMutation.ts\nimport * as React from \"react\";\nimport {\n MutationObserver,\n noop,\n notifyManager,\n shouldThrowError\n} from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nfunction useMutation(options, queryClient) {\n const client = useQueryClient(queryClient);\n const [observer] = React.useState(\n () => new MutationObserver(\n client,\n options\n )\n );\n React.useEffect(() => {\n observer.setOptions(options);\n }, [observer, options]);\n const result = React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => observer.subscribe(notifyManager.batchCalls(onStoreChange)),\n [observer]\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult()\n );\n const mutate = React.useCallback(\n (variables, mutateOptions) => {\n observer.mutate(variables, mutateOptions).catch(noop);\n },\n [observer]\n );\n if (result.error && shouldThrowError(observer.options.throwOnError, [result.error])) {\n throw result.error;\n }\n return { ...result, mutate, mutateAsync: result.mutate };\n}\nexport {\n useMutation\n};\n//# sourceMappingURL=useMutation.js.map"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQuery-
|
|
1
|
+
{"version":3,"file":"useQuery-pOdkMV4B.js","names":[],"sources":["../../../../node_modules/.pnpm/@tanstack+react-query@5.101.2_react@19.2.7/node_modules/@tanstack/react-query/build/modern/useQuery.js"],"sourcesContent":["\"use client\";\n\n// src/useQuery.ts\nimport { QueryObserver } from \"@tanstack/query-core\";\nimport { useBaseQuery } from \"./useBaseQuery.js\";\nfunction useQuery(options, queryClient) {\n return useBaseQuery(options, QueryObserver, queryClient);\n}\nexport {\n useQuery\n};\n//# sourceMappingURL=useQuery.js.map"],"x_google_ignoreList":[0],"mappings":"8FAKA,SAAS,EAAS,EAAS,EAAa,CACtC,OAAO,EAAa,EAAS,EAAe,CAAW,CACzD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{J as e,W as t,Z as n,i as r,n as i,q as a,s as o,t as s}from"./createLucideIcon-BPpAIXR_.js";import{Sr as c,t as l}from"./config-DTQCUlfZ.js";import{t as u}from"./useMutation-BWZ0G4Td.js";import{N as d,P as f,r as p,tt as m}from"./shell-header-bar-CgyNXbPS.js";import{a as h,c as g,d as _,i as v,l as y,n as ee,o as b,r as x,s as te,t as S,u as C}from"./admin-users-Dz1QNdy3.js";import{t as w}from"./plus-DSBBSrgj.js";import{t as T}from"./triangle-alert-CqNn0kPs.js";import{B as E,o as D}from"./index-CZ0rWM7l.js";import{t as O}from"./badge-CsOfUji0.js";import{n as k}from"./alert-leqyvHOp.js";import{t as A}from"./checkbox-CFVDS3zJ.js";import{t as j}from"./field-89zKYDVL.js";import{t as M}from"./input-GPigtjgi.js";import{n as N,t as P}from"./modal-BV3gpI-p.js";var F=s(`search`,[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]),I=n(e(),1);function L(e){return e===`admin`?`admin`:`user`}function R(e){return e.role===`admin`?`admins`:e.managedBy===`database`?`database`:e.managedBy===`config`?`config`:`all`}var z=a();function B({modal:e,isMutating:t,onClose:n,onCreate:a,onUpdate:s,onDelete:c}){let{t:l}=r(),u=(0,I.useMemo)(()=>e?.type===`edit`?e.user:null,[e]);if(!e)return null;if(e.type===`delete`)return(0,z.jsxs)(P,{isOpen:!0,onClose:n,title:l(`admin.users.deleteTitle`,{email:e.user.email}),variant:`destructive`,children:[(0,z.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-xs rounded-tinyrack-md border border-tinyrack-danger-border bg-tinyrack-danger-surface p-tinyrack-lg text-tinyrack-danger-foreground`,children:[(0,z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[(0,z.jsx)(T,{"aria-hidden":!0,className:`size-tinyrack-lg`}),(0,z.jsx)(i,{as:`p`,weight:`medium`,children:l(`admin.users.deleteWarning`)})]}),(0,z.jsx)(i,{as:`p`,variant:`bodySm`,children:l(`admin.users.deleteDescription`)})]}),(0,z.jsxs)(N,{children:[(0,z.jsx)(o,{disabled:t,onClick:n,type:`button`,uiSize:`sm`,children:l(`admin.users.cancel`)}),(0,z.jsx)(o,{disabled:t,intent:`danger`,onClick:()=>c(e.user.sub),type:`button`,uiSize:`sm`,children:l(`admin.users.deleteConfirm`)})]})]});let d=e.type===`create`?l(`admin.users.create`):l(`admin.users.editTitle`),m=e.type===`create`?l(`admin.users.createSubmit`):l(`admin.users.save`);return(0,z.jsx)(P,{description:e.type===`create`?l(`admin.users.createHint`):l(`admin.users.editHint`),isOpen:!0,onClose:n,title:d,children:(0,z.jsxs)(`form`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-lg`,onSubmit:t=>{t.preventDefault();let n=new FormData(t.currentTarget),r={email:String(n.get(`email`)??``),role:L(n.get(`role`)),email_verified:n.get(`email_verified`)===`on`};e.type===`create`?a({...r,password:String(n.get(`password`)??``)}):s({sub:e.user.sub,...r})},children:[(0,z.jsxs)(j.Root,{children:[(0,z.jsx)(j.Label,{htmlFor:`admin-user-email`,children:l(`profile.email.label`)}),(0,z.jsx)(M,{defaultValue:u?.email??``,id:`admin-user-email`,name:`email`,required:!0,type:`email`,uiSize:`sm`})]}),e.type===`create`?(0,z.jsxs)(j.Root,{children:[(0,z.jsx)(j.Label,{htmlFor:`admin-user-password`,children:l(`admin.users.password`)}),(0,z.jsx)(M,{id:`admin-user-password`,name:`password`,required:!0,type:`password`,uiSize:`sm`})]}):null,(0,z.jsxs)(j.Root,{children:[(0,z.jsx)(j.Label,{htmlFor:`admin-user-role`,children:l(`admin.users.role`)}),(0,z.jsxs)(p.Root,{defaultValue:u?.role??`user`,name:`role`,children:[(0,z.jsx)(p.Trigger,{id:`admin-user-role`,uiSize:`sm`,children:(0,z.jsx)(p.Value,{})}),(0,z.jsx)(p.Positioner,{children:(0,z.jsx)(p.Popup,{children:(0,z.jsx)(p.List,{children:[`user`,`admin`].map(e=>(0,z.jsxs)(p.Item,{value:e,children:[(0,z.jsx)(p.ItemText,{children:l(`admin.users.role${e===`user`?`User`:`Admin`}`)}),(0,z.jsx)(p.ItemIndicator,{children:(0,z.jsx)(f,{"aria-hidden":!0})})]},e))})})})]})]}),(0,z.jsx)(j.Root,{children:(0,z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-md rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface px-tinyrack-md py-tinyrack-sm`,children:[(0,z.jsx)(A.Root,{"aria-label":l(`admin.users.emailVerified`),defaultChecked:u?.email_verified??!1,name:`email_verified`,uiSize:`md`,value:`on`,children:(0,z.jsx)(A.Indicator,{})}),(0,z.jsx)(j.Label,{className:`cursor-pointer`,children:l(`admin.users.emailVerified`)})]})}),(0,z.jsxs)(N,{children:[(0,z.jsx)(o,{disabled:t,onClick:n,type:`button`,uiSize:`sm`,children:l(`admin.users.cancel`)}),(0,z.jsx)(o,{disabled:t,intent:`primary`,type:`submit`,uiSize:`sm`,children:m})]})]})})}var V=[10,20,50];function H({pageStart:e,pageEnd:t,total:n,query:a,includeDeleted:s,activeQuickFilter:c,hasActiveFilters:l,onClearFilters:u,pageSize:d,onPageSizeChange:m}){let{t:h}=r();return(0,z.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-tinyrack-md px-tinyrack-xl`,children:[(0,z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-tinyrack-sm`,children:[(0,z.jsx)(i,{color:`muted`,variant:`bodySm`,children:h(`admin.users.showingRange`,{from:e,to:t,total:n})}),a?(0,z.jsx)(O,{uiSize:`md`,variant:`neutral`,children:h(`admin.users.queryChip`,{query:a})}):null,s?(0,z.jsx)(O,{uiSize:`md`,variant:`warning`,children:h(`admin.users.includeDeleted`)}):null,c===`all`?null:(0,z.jsx)(O,{uiSize:`md`,children:h(`admin.users.filter.${c}`)}),l?(0,z.jsx)(o,{appearance:`ghost`,onClick:u,type:`button`,uiSize:`sm`,children:h(`admin.users.clearFilters`)}):null]}),(0,z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[(0,z.jsx)(i,{color:`muted`,variant:`bodySm`,children:h(`admin.users.pageSize`)}),(0,z.jsxs)(p.Root,{onValueChange:e=>{typeof e==`number`&&m(e)},value:d,children:[(0,z.jsx)(p.Trigger,{"aria-label":h(`admin.users.pageSize`),uiSize:`sm`,children:(0,z.jsx)(p.Value,{})}),(0,z.jsx)(p.Portal,{children:(0,z.jsx)(p.Positioner,{children:(0,z.jsx)(p.Popup,{children:(0,z.jsx)(p.List,{children:V.map(e=>(0,z.jsxs)(p.Item,{value:e,children:[(0,z.jsx)(p.ItemText,{children:e}),(0,z.jsx)(p.ItemIndicator,{children:(0,z.jsx)(f,{})})]},e))})})})})]})]})]})}function U({notice:e,onDismiss:t}){let{t:n}=r(),i=e.tone===`success`;return(0,z.jsxs)(k.Root,{"aria-live":i?`polite`:`assertive`,role:i?`status`:`alert`,variant:i?`success`:`danger`,children:[i?(0,z.jsx)(f,{"aria-hidden":!0,className:`size-tinyrack-xl`}):(0,z.jsx)(T,{"aria-hidden":!0,className:`size-tinyrack-xl`}),(0,z.jsx)(k.Title,{children:e.message}),(0,z.jsx)(o,{appearance:`ghost`,"aria-label":n(`common.close`),className:`ms-auto`,onClick:t,type:`button`,uiSize:`sm`,children:(0,z.jsx)(d,{"aria-hidden":!0,className:`size-tinyrack-lg`})})]})}function W({active:e,config:t,database:n}){let{t:i}=r(),a=i(`admin.users.currentPage`);return(0,z.jsxs)(`div`,{className:`flex flex-col overflow-hidden rounded-tinyrack-lg border border-tinyrack-border bg-tinyrack-surface shadow-tinyrack-raised lg:flex-row lg:divide-x lg:divide-tinyrack-border`,children:[(0,z.jsx)(b,{hint:a,label:i(`admin.users.activeOnPage`),value:e}),(0,z.jsx)(b,{hint:a,label:i(`admin.users.configOnPage`),value:t}),(0,z.jsx)(b,{hint:a,label:i(`admin.users.databaseOnPage`),value:n})]})}function G({className:e,...n}){return(0,z.jsx)(`tbody`,{...n,className:t(`tr-table-body`,e)})}function K({className:e,...n}){return(0,z.jsx)(`caption`,{...n,className:t(`tr-table-caption`,e)})}function q({className:e,...n}){return(0,z.jsx)(`td`,{...n,className:t(`tr-table-cell`,e)})}function J({className:e,...n}){return(0,z.jsx)(`tfoot`,{...n,className:t(`tr-table-footer`,e)})}function Y({className:e,...n}){return(0,z.jsx)(`th`,{...n,className:t(`tr-table-head`,e)})}function X({className:e,...n}){return(0,z.jsx)(`thead`,{...n,className:t(`tr-table-header`,e)})}function Z({className:e,containerClassName:n,containerProps:r,containerRef:i,density:a=`comfortable`,striped:o=!1,...s}){let{className:c,ref:l,...u}=r??{};return(0,z.jsx)(`div`,{...u,className:t(`tr-table-container`,n,c),ref:i??l,children:(0,z.jsx)(`table`,{...s,className:t(`tr-table`,e),"data-density":a,"data-striped":o?`true`:void 0})})}function Q({className:e,...n}){return(0,z.jsx)(`tr`,{...n,className:t(`tr-table-row`,e)})}var $={Root:Z,Caption:K,Header:X,Body:G,Footer:J,Row:Q,Head:Y,Cell:q};function ne({users:e,onEdit:t,onDelete:n}){let{t:a}=r();return(0,z.jsx)(`div`,{className:`overflow-x-auto pb-tinyrack-sm`,children:(0,z.jsxs)($.Root,{density:`compact`,striped:!0,children:[(0,z.jsx)($.Header,{children:(0,z.jsxs)($.Row,{children:[(0,z.jsx)($.Head,{children:a(`profile.email.label`)}),(0,z.jsx)($.Head,{children:a(`admin.users.role`)}),(0,z.jsx)($.Head,{children:a(`admin.users.source`)}),(0,z.jsx)($.Head,{children:a(`admin.users.emailVerified`)}),(0,z.jsx)($.Head,{children:a(`admin.users.secondFactor`)}),(0,z.jsx)($.Head,{children:a(`admin.users.status`)}),(0,z.jsx)($.Head,{children:a(`admin.users.actions`)})]})}),(0,z.jsxs)($.Body,{children:[e.map(e=>(0,z.jsxs)($.Row,{children:[(0,z.jsx)($.Cell,{children:(0,z.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-3xs`,children:[(0,z.jsx)(i,{as:`div`,variant:`bodySm`,weight:`medium`,children:e.email}),(0,z.jsx)(i,{as:`div`,className:`max-w-tinyrack-measure-lg`,color:`muted`,truncate:!0,variant:`caption`,children:(0,z.jsx)(`span`,{className:`font-tinyrack-mono`,children:e.sub})})]})}),(0,z.jsx)($.Cell,{children:(0,z.jsx)(O,{className:`whitespace-nowrap`,uiSize:`md`,variant:e.role===`admin`?`neutral`:void 0,children:g(a,e.role)})}),(0,z.jsx)($.Cell,{children:(0,z.jsx)(O,{className:`whitespace-nowrap`,uiSize:`md`,variant:e.managed_by===`config`?`warning`:`info`,children:y(a,e.managed_by)})}),(0,z.jsx)($.Cell,{children:e.email_verified?a(`common.yes`):a(`common.no`)}),(0,z.jsx)($.Cell,{children:e.totp_registered?a(`admin.users.secondFactorTotp`):e.passkey_count>0?a(e.passkey_count===1?`admin.users.secondFactorPasskey`:`admin.users.secondFactorPasskeys`,{count:e.passkey_count}):a(`common.none`)}),(0,z.jsx)($.Cell,{children:(0,z.jsx)(O,{className:`whitespace-nowrap`,uiSize:`md`,variant:e.deleted_at?`danger`:`success`,children:e.deleted_at?a(`admin.users.deleted`):a(`admin.users.active`)})}),(0,z.jsx)($.Cell,{children:e.managed_by===`database`&&!e.deleted_at?(0,z.jsxs)(`div`,{className:`inline-flex items-center whitespace-nowrap rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface-muted`,children:[(0,z.jsx)(o,{appearance:`ghost`,"aria-label":a(`admin.users.editUser`,{email:e.email}),onClick:()=>t(e),type:`button`,uiSize:`sm`,children:a(`admin.users.edit`)}),(0,z.jsx)(o,{appearance:`outline`,"aria-label":a(`admin.users.deleteUser`,{email:e.email}),intent:`danger`,onClick:()=>n(e),type:`button`,uiSize:`sm`,children:a(`admin.users.delete`)})]}):(0,z.jsx)(O,{className:`whitespace-nowrap`,uiSize:`md`,children:a(`admin.users.readonly`)})})]},e.sub)),e.length===0?(0,z.jsx)($.Row,{children:(0,z.jsx)($.Cell,{className:`py-tinyrack-3xl text-center text-tinyrack-text-muted`,colSpan:7,children:a(`admin.users.emptyFiltered`)})}):null]})]})})}var re=[`all`,`database`,`config`,`admins`];function ie({total:e,draftQuery:t,onDraftQueryChange:n,draftIncludeDeleted:a,onDraftIncludeDeletedChange:s,onSearch:c,onCreate:l,activeQuickFilter:u,onQuickFilter:d}){let{t:f}=r();return(0,z.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-lg border-tinyrack-border border-b-tinyrack-default bg-tinyrack-surface-muted p-tinyrack-xl xl:flex-row xl:items-end xl:justify-between`,children:[(0,z.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-sm`,children:[(0,z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[(0,z.jsx)(_,{"aria-hidden":!0,className:`size-tinyrack-lg text-tinyrack-success-foreground`}),(0,z.jsx)(i,{color:`muted`,variant:`label`,children:f(`admin.users.directoryEyebrow`)})]}),(0,z.jsx)(E.Title,{children:f(`admin.users.directory`)}),(0,z.jsx)(E.Description,{className:`text-tinyrack-sm`,children:f(`admin.users.total`,{count:e})})]}),(0,z.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-md xl:items-end`,children:[(0,z.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-sm lg:flex-row lg:items-center`,children:[(0,z.jsx)(M,{"aria-label":f(`admin.users.searchPlaceholder`),className:`w-full lg:w-tinyrack-overlay-width-sm`,onChange:e=>n(e.target.value),onKeyDown:e=>{e.key===`Enter`&&c()},placeholder:f(`admin.users.searchPlaceholder`),type:`search`,uiSize:`sm`,value:t}),(0,z.jsx)(j.Root,{children:(0,z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface px-tinyrack-md py-tinyrack-sm`,children:[(0,z.jsx)(A.Root,{"aria-label":f(`admin.users.includeDeleted`),checked:a,onCheckedChange:e=>s(e===!0),uiSize:`md`,children:(0,z.jsx)(A.Indicator,{})}),(0,z.jsx)(j.Label,{className:`cursor-pointer`,children:f(`admin.users.includeDeleted`)})]})}),(0,z.jsxs)(o,{appearance:`outline`,onClick:c,type:`button`,uiSize:`sm`,children:[(0,z.jsx)(F,{"aria-hidden":!0,className:`size-tinyrack-lg`}),f(`admin.users.search`)]}),(0,z.jsxs)(o,{intent:`primary`,onClick:l,type:`button`,uiSize:`sm`,children:[(0,z.jsx)(w,{"aria-hidden":!0,className:`size-tinyrack-lg`}),f(`admin.users.create`)]})]}),(0,z.jsx)(`div`,{className:`inline-flex items-center gap-tinyrack-3xs rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface-muted p-tinyrack-xs`,children:re.map(e=>(0,z.jsx)(o,{appearance:u===e?`solid`:`ghost`,intent:u===e?`primary`:void 0,onClick:()=>d(e),type:`button`,uiSize:`sm`,children:f(`admin.users.filter.${e}`)},e))})]})]})}function ae(){let e=D.useRouteContext({select:e=>e.user});return e?.role===`admin`?(0,z.jsx)(oe,{user:e}):(0,z.jsx)(C,{reason:`access-required`})}function oe({user:e}){let{data:t}=m(l);return t.admin.enabled?(0,z.jsx)(se,{user:e}):(0,z.jsx)(C,{reason:`console-disabled`})}function se({user:e}){let{t}=r(),n=c(),[i,a]=(0,I.useState)(``),[s,l]=(0,I.useState)(!1),[d,f]=(0,I.useState)(()=>v()),[p,g]=(0,I.useState)(null),[_,y]=(0,I.useState)(null),{data:b}=m(S(d)),C=b.users.filter(e=>!e.deleted_at).length,w=b.users.filter(e=>e.managed_by===`config`).length,T=b.users.filter(e=>e.managed_by===`database`).length,D=R(d),k=d.query!==``||d.includeDeleted||d.managedBy!==void 0||d.role!==void 0,A=b.pagination.total===0?0:(b.pagination.page-1)*b.pagination.page_size+1,j=Math.min(b.pagination.page*b.pagination.page_size,b.pagination.total),M=e=>g({tone:`success`,message:e}),N=()=>g({tone:`error`,message:t(`admin.users.operationFailed`)}),P=u({mutationFn:ee,onSuccess:({user:e})=>{n.invalidateQueries({queryKey:[`admin`,`users`]}),M(t(`admin.users.createdNotice`,{email:e.email})),y(null)},onError:N}),F=u({mutationFn:h,onSuccess:({user:e})=>{n.invalidateQueries({queryKey:[`admin`,`users`]}),M(t(`admin.users.updatedNotice`,{email:e.email})),y(null)},onError:N}),L=u({mutationFn:x,onSuccess:({user:e})=>{n.invalidateQueries({queryKey:[`admin`,`users`]}),M(t(`admin.users.deletedNotice`,{email:e.email})),y(null)},onError:N}),V=P.isPending||F.isPending||L.isPending;return(0,z.jsxs)(te,{current:`users`,description:t(`admin.users.description`),title:t(`admin.users.title`),user:e,children:[(0,z.jsx)(W,{active:C,config:w,database:T}),p?(0,z.jsx)(U,{notice:p,onDismiss:()=>g(null)}):null,(0,z.jsx)(E.Root,{className:`overflow-hidden shadow-tinyrack-raised`,"data-testid":`admin-users-directory`,variant:`outlined`,children:(0,z.jsxs)(E.Content,{className:`gap-tinyrack-lg p-0`,children:[(0,z.jsx)(ie,{activeQuickFilter:D,draftIncludeDeleted:s,draftQuery:i,onCreate:()=>y({type:`create`}),onDraftIncludeDeletedChange:l,onDraftQueryChange:a,onQuickFilter:e=>{f(t=>({...t,page:1,managedBy:e===`database`?`database`:e===`config`?`config`:void 0,role:e===`admins`?`admin`:void 0}))},onSearch:()=>{f(e=>({...e,query:i.trim(),includeDeleted:s,page:1}))},total:b.pagination.total}),(0,z.jsx)(H,{activeQuickFilter:D,hasActiveFilters:k,includeDeleted:d.includeDeleted,onClearFilters:()=>{a(``),l(!1),f(v())},onPageSizeChange:e=>f(t=>({...t,page:1,pageSize:e})),pageEnd:j,pageSize:d.pageSize,pageStart:A,query:d.query,total:b.pagination.total}),(0,z.jsx)(ne,{onDelete:e=>y({type:`delete`,user:e}),onEdit:e=>y({type:`edit`,user:e}),users:b.users}),(0,z.jsxs)(`div`,{className:`flex items-center justify-between border-tinyrack-border border-t-tinyrack-default bg-tinyrack-surface-muted p-tinyrack-lg`,children:[(0,z.jsx)(o,{appearance:`outline`,disabled:d.page<=1,onClick:()=>f(e=>({...e,page:e.page-1})),type:`button`,uiSize:`sm`,children:t(`admin.users.previous`)}),(0,z.jsx)(O,{uiSize:`md`,children:t(`admin.users.page`,{page:b.pagination.page})}),(0,z.jsx)(o,{appearance:`outline`,disabled:b.pagination.page*b.pagination.page_size>=b.pagination.total,onClick:()=>f(e=>({...e,page:e.page+1})),type:`button`,uiSize:`sm`,children:t(`admin.users.next`)})]})]})}),(0,z.jsx)(B,{isMutating:V,modal:_,onClose:()=>y(null),onCreate:e=>P.mutate(e),onDelete:e=>L.mutate(e),onUpdate:e=>F.mutate(e)})]})}export{ae as component};
|
|
2
|
+
//# sourceMappingURL=users-B1hvVo3B.js.map
|