@tinyrack/issuary-server 0.21.0 → 0.22.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 +18 -0
- package/dist/entities/oauth-client.entity.d.ts.map +1 -1
- package/dist/entities/oauth-code.entity.d.ts +18 -0
- package/dist/entities/oauth-code.entity.d.ts.map +1 -1
- package/dist/entities/oauth-device-code.entity.d.ts +18 -0
- package/dist/entities/oauth-device-code.entity.d.ts.map +1 -1
- package/dist/entities/revoked-token.entity.d.ts +18 -0
- package/dist/entities/revoked-token.entity.d.ts.map +1 -1
- package/dist/entities/terms-content.entity.d.ts +9 -0
- package/dist/entities/terms-content.entity.d.ts.map +1 -1
- package/dist/entities/terms.entity.d.ts +9 -0
- package/dist/entities/terms.entity.d.ts.map +1 -1
- package/dist/entities/user-consent.entity.d.ts +18 -0
- package/dist/entities/user-consent.entity.d.ts.map +1 -1
- package/dist/entities/user-terms-consent.entity.d.ts +9 -0
- package/dist/entities/user-terms-consent.entity.d.ts.map +1 -1
- package/dist/entities/user-totp-recovery-code.entity.d.ts +9 -0
- package/dist/entities/user-totp-recovery-code.entity.d.ts.map +1 -1
- package/dist/entities/user-totp.entity.d.ts +9 -0
- package/dist/entities/user-totp.entity.d.ts.map +1 -1
- package/dist/entities/user.entity.d.ts +9 -0
- package/dist/entities/user.entity.d.ts.map +1 -1
- package/dist/entities/user.entity.js +4 -0
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/entrypoints/app.d.ts +53 -0
- package/dist/entrypoints/app.d.ts.map +1 -1
- package/dist/entrypoints/database/postgres/compiled-functions.d.ts +23 -20
- package/dist/entrypoints/database/postgres/compiled-functions.d.ts.map +1 -1
- package/dist/entrypoints/database/postgres/compiled-functions.js +134 -104
- package/dist/entrypoints/database/postgres/compiled-functions.js.map +1 -1
- package/dist/entrypoints/database/sqlite/compiled-functions.d.ts +23 -20
- package/dist/entrypoints/database/sqlite/compiled-functions.d.ts.map +1 -1
- package/dist/entrypoints/database/sqlite/compiled-functions.js +134 -104
- package/dist/entrypoints/database/sqlite/compiled-functions.js.map +1 -1
- package/dist/lib/config/resolved.d.ts +1 -0
- package/dist/lib/config/resolved.d.ts.map +1 -1
- package/dist/lib/config/security.d.ts +2 -0
- package/dist/lib/config/security.d.ts.map +1 -1
- package/dist/lib/config/security.js +5 -0
- package/dist/lib/config/security.js.map +1 -1
- package/dist/middleware/auth.d.ts +8 -0
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +64 -0
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/session.d.ts +9 -0
- package/dist/middleware/session.d.ts.map +1 -1
- package/dist/middleware/session.js +18 -0
- package/dist/middleware/session.js.map +1 -1
- package/dist/migrations/postgres/Migration20260825110000_add_password_reset_required.d.ts +6 -0
- package/dist/migrations/postgres/Migration20260825110000_add_password_reset_required.d.ts.map +1 -0
- package/dist/migrations/postgres/Migration20260825110000_add_password_reset_required.js +11 -0
- package/dist/migrations/postgres/Migration20260825110000_add_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/Migration20260825110000_add_password_reset_required.d.ts +6 -0
- package/dist/migrations/sqlite/Migration20260825110000_add_password_reset_required.d.ts.map +1 -0
- package/dist/migrations/sqlite/Migration20260825110000_add_password_reset_required.js +10 -0
- package/dist/migrations/sqlite/Migration20260825110000_add_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 +7 -3
- 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 +18 -6
- package/dist/repositories/oauth-device-code.repository.js.map +1 -1
- package/dist/repositories/user-totp-recovery-code.repository.d.ts +7 -1
- package/dist/repositories/user-totp-recovery-code.repository.d.ts.map +1 -1
- package/dist/repositories/user-totp-recovery-code.repository.js +2 -1
- package/dist/repositories/user-totp-recovery-code.repository.js.map +1 -1
- package/dist/repositories/user-totp.repository.d.ts +9 -0
- package/dist/repositories/user-totp.repository.d.ts.map +1 -1
- package/dist/routes/api/auth/index.d.ts +52 -0
- package/dist/routes/api/auth/index.d.ts.map +1 -1
- package/dist/routes/api/auth/index.js +2 -0
- package/dist/routes/api/auth/index.js.map +1 -1
- package/dist/routes/api/auth/passkey/verify/post.d.ts +37 -0
- package/dist/routes/api/auth/passkey/verify/post.d.ts.map +1 -1
- package/dist/routes/api/auth/passkey/verify/post.js +8 -2
- package/dist/routes/api/auth/passkey/verify/post.js.map +1 -1
- package/dist/routes/api/auth/password/reset-required/post.d.ts +18 -0
- package/dist/routes/api/auth/password/reset-required/post.d.ts.map +1 -0
- package/dist/routes/api/auth/password/reset-required/post.js +39 -0
- package/dist/routes/api/auth/password/reset-required/post.js.map +1 -0
- package/dist/routes/api/index.d.ts +52 -0
- package/dist/routes/api/index.d.ts.map +1 -1
- package/dist/routes/index.d.ts +52 -0
- 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 +25 -0
- package/dist/schemas/error.d.ts.map +1 -1
- package/dist/schemas/error.js +1 -0
- package/dist/schemas/error.js.map +1 -1
- package/dist/schemas/response.d.ts +22 -0
- package/dist/schemas/response.d.ts.map +1 -1
- package/dist/schemas/response.js +8 -0
- package/dist/schemas/response.js.map +1 -1
- package/dist/seeders/config.seeder.js +2 -1
- package/dist/seeders/config.seeder.js.map +1 -1
- package/dist/services/container.d.ts +1 -0
- package/dist/services/container.d.ts.map +1 -1
- package/dist/services/container.js +15 -0
- package/dist/services/container.js.map +1 -1
- package/dist/services/legacy-credential-retirement.service.d.ts +20 -0
- package/dist/services/legacy-credential-retirement.service.d.ts.map +1 -0
- package/dist/services/legacy-credential-retirement.service.js +90 -0
- package/dist/services/legacy-credential-retirement.service.js.map +1 -0
- package/dist/services/oauth-client.service.d.ts +1 -0
- package/dist/services/oauth-client.service.d.ts.map +1 -1
- package/dist/services/oauth-client.service.js +17 -2
- 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 +4 -0
- 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 +12 -3
- package/dist/services/password-auth.service.js.map +1 -1
- package/dist/services/security.service.d.ts +8 -0
- package/dist/services/security.service.d.ts.map +1 -1
- package/dist/services/security.service.js +85 -22
- 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 +1 -1
- package/public/assets/2fa-BgveHSB_.js +2 -0
- package/public/assets/{2fa-B5vLgDXQ.js.map → 2fa-BgveHSB_.js.map} +1 -1
- package/public/assets/2fa-C37MUkye.js +2 -0
- package/public/assets/{2fa-CCOTIHDZ.js.map → 2fa-C37MUkye.js.map} +1 -1
- package/public/assets/2fa-UL_cNRnQ.js +2 -0
- package/public/assets/{2fa-C5vUVgr_.js.map → 2fa-UL_cNRnQ.js.map} +1 -1
- package/public/assets/2fa-kiqzGSz2.js +2 -0
- package/public/assets/{2fa-BqsM_D-X.js.map → 2fa-kiqzGSz2.js.map} +1 -1
- package/public/assets/{DialogHandle-BmtK2pRn.js → DialogHandle-Zvz8SgS0.js} +2 -2
- package/public/assets/{DialogHandle-BmtK2pRn.js.map → DialogHandle-Zvz8SgS0.js.map} +1 -1
- package/public/assets/admin-DbDuu6AI.js +2 -0
- package/public/assets/{admin-BPijkLw-.js.map → admin-DbDuu6AI.js.map} +1 -1
- package/public/assets/admin-users-CwTJdiih.js +2 -0
- package/public/assets/{admin-users-DvPbw1Vq.js.map → admin-users-CwTJdiih.js.map} +1 -1
- package/public/assets/{auth-choice-row-BCGjuedo.js → auth-choice-row-BlSsUI7d.js} +2 -2
- package/public/assets/{auth-choice-row-BCGjuedo.js.map → auth-choice-row-BlSsUI7d.js.map} +1 -1
- package/public/assets/{auth-field-DD8kvl--.js → auth-field-HwxENJnB.js} +2 -2
- package/public/assets/{auth-field-DD8kvl--.js.map → auth-field-HwxENJnB.js.map} +1 -1
- package/public/assets/{auth-layout-VtpryDof.js → auth-layout-CoeqNhTT.js} +2 -2
- package/public/assets/{auth-layout-VtpryDof.js.map → auth-layout-CoeqNhTT.js.map} +1 -1
- package/public/assets/{auth-page-header-CIn2E4zI.js → auth-page-header-CIs08f5Y.js} +2 -2
- package/public/assets/{auth-page-header-CIn2E4zI.js.map → auth-page-header-CIs08f5Y.js.map} +1 -1
- package/public/assets/{authorization-context-banner-SOuBHWIb.js → authorization-context-banner-BbtQmMYH.js} +2 -2
- package/public/assets/{authorization-context-banner-SOuBHWIb.js.map → authorization-context-banner-BbtQmMYH.js.map} +1 -1
- package/public/assets/{avatar-BEQjf2x6.js → avatar-CttWiIv3.js} +2 -2
- package/public/assets/{avatar-BEQjf2x6.js.map → avatar-CttWiIv3.js.map} +1 -1
- package/public/assets/{checkbox-gdHnSFQ-.js → checkbox-CJrRV8S1.js} +2 -2
- package/public/assets/{checkbox-gdHnSFQ-.js.map → checkbox-CJrRV8S1.js.map} +1 -1
- package/public/assets/config-v3-oy_ef.js +2 -0
- package/public/assets/config-v3-oy_ef.js.map +1 -0
- package/public/assets/{consent-BqqFDdsr.js → consent-BIhxtXHx.js} +2 -2
- package/public/assets/{consent-BqqFDdsr.js.map → consent-BIhxtXHx.js.map} +1 -1
- package/public/assets/{consent-CfRbz2R7.js → consent-DRmENn26.js} +2 -2
- package/public/assets/{consent-CfRbz2R7.js.map → consent-DRmENn26.js.map} +1 -1
- package/public/assets/{email-CKKakxPJ.js → email-CVRDeJ78.js} +2 -2
- package/public/assets/{email-CKKakxPJ.js.map → email-CVRDeJ78.js.map} +1 -1
- package/public/assets/email-UL_cNRnQ.js +2 -0
- package/public/assets/{email-C5vUVgr_.js.map → email-UL_cNRnQ.js.map} +1 -1
- package/public/assets/error-2VPY5w8V.js +2 -0
- package/public/assets/{error-BMXxpgfR.js.map → error-2VPY5w8V.js.map} +1 -1
- package/public/assets/{field-Cn4H1CUj.js → field-DDt6F9TZ.js} +2 -2
- package/public/assets/{field-Cn4H1CUj.js.map → field-DDt6F9TZ.js.map} +1 -1
- package/public/assets/forgot-DzDcduho.js +2 -0
- package/public/assets/{forgot-rO9sByfV.js.map → forgot-DzDcduho.js.map} +1 -1
- package/public/assets/forgot-UL_cNRnQ.js +2 -0
- package/public/assets/{forgot-C5vUVgr_.js.map → forgot-UL_cNRnQ.js.map} +1 -1
- package/public/assets/index-gliHKncz.js +11 -0
- package/public/assets/index-gliHKncz.js.map +1 -0
- package/public/assets/{initial-avatar-CtuDUz_W.js → initial-avatar-CZzHAPm3.js} +2 -2
- package/public/assets/{initial-avatar-CtuDUz_W.js.map → initial-avatar-CZzHAPm3.js.map} +1 -1
- package/public/assets/{input-CzQki7k6.js → input-CNRpSR08.js} +2 -2
- package/public/assets/{input-CzQki7k6.js.map → input-CNRpSR08.js.map} +1 -1
- package/public/assets/{labeled-separator-CV7nb0XW.js → labeled-separator-fnKySKv2.js} +2 -2
- package/public/assets/{labeled-separator-CV7nb0XW.js.map → labeled-separator-fnKySKv2.js.map} +1 -1
- package/public/assets/link-BN90emXr.js +2 -0
- package/public/assets/link-BN90emXr.js.map +1 -0
- package/public/assets/lock-keyhole-Cz72xkCn.js +2 -0
- package/public/assets/lock-keyhole-Cz72xkCn.js.map +1 -0
- package/public/assets/login-C6m2qSUt.js +2 -0
- package/public/assets/login-C6m2qSUt.js.map +1 -0
- package/public/assets/login-UL_cNRnQ.js +2 -0
- package/public/assets/login-UL_cNRnQ.js.map +1 -0
- package/public/assets/{logout-B5T52P8u.js → logout-CHdmF_16.js} +2 -2
- package/public/assets/{logout-B5T52P8u.js.map → logout-CHdmF_16.js.map} +1 -1
- package/public/assets/{modal-BDQFucjz.js → modal-sCM_zT82.js} +2 -2
- package/public/assets/{modal-BDQFucjz.js.map → modal-sCM_zT82.js.map} +1 -1
- package/public/assets/{mutationOptions-DyYFUbyn.js → mutationOptions-CrswitPs.js} +2 -2
- package/public/assets/{mutationOptions-DyYFUbyn.js.map → mutationOptions-CrswitPs.js.map} +1 -1
- package/public/assets/passkey-B2Blw47e.js +2 -0
- package/public/assets/{passkey-J1qnYp9A.js.map → passkey-B2Blw47e.js.map} +1 -1
- package/public/assets/passkey-CEx1VZ5R.js +2 -0
- package/public/assets/{passkey-CynCz1Dt.js.map → passkey-CEx1VZ5R.js.map} +1 -1
- package/public/assets/passkey-CU8x9J2w.js +2 -0
- package/public/assets/{passkey-BE9JvJOP.js.map → passkey-CU8x9J2w.js.map} +1 -1
- package/public/assets/passkey-UL_cNRnQ.js +2 -0
- package/public/assets/{passkey-C5vUVgr_.js.map → passkey-UL_cNRnQ.js.map} +1 -1
- package/public/assets/password-BhU_a0cR.js +2 -0
- package/public/assets/password-BhU_a0cR.js.map +1 -0
- package/public/assets/password-UL_cNRnQ.js +2 -0
- package/public/assets/password-UL_cNRnQ.js.map +1 -0
- package/public/assets/password-reset-CIacHnvA.js +2 -0
- package/public/assets/{password-reset-sU5KkBKi.js.map → password-reset-CIacHnvA.js.map} +1 -1
- package/public/assets/{password-strength-BeSOu_Ga.js → password-strength-C0Zkrrct.js} +2 -2
- package/public/assets/{password-strength-BeSOu_Ga.js.map → password-strength-C0Zkrrct.js.map} +1 -1
- package/public/assets/{pin-input-Cc-VkrQ3.js → pin-input-BlD4tPZJ.js} +2 -2
- package/public/assets/{pin-input-Cc-VkrQ3.js.map → pin-input-BlD4tPZJ.js.map} +1 -1
- package/public/assets/{profile-BcjsVYOx.js → profile-D1cEjfs8.js} +2 -2
- package/public/assets/{profile-BcjsVYOx.js.map → profile-D1cEjfs8.js.map} +1 -1
- package/public/assets/{profile-B5NaJfeS.js → profile-D43Yq-6S.js} +2 -2
- package/public/assets/{profile-B5NaJfeS.js.map → profile-D43Yq-6S.js.map} +1 -1
- package/public/assets/recovery-CLExnfYX.js +2 -0
- package/public/assets/{recovery-PnUATiUi.js.map → recovery-CLExnfYX.js.map} +1 -1
- package/public/assets/register-CZUyWXRO.js +2 -0
- package/public/assets/{register-DQXhru0_.js.map → register-CZUyWXRO.js.map} +1 -1
- package/public/assets/register-UL_cNRnQ.js +2 -0
- package/public/assets/{register-C5vUVgr_.js.map → register-UL_cNRnQ.js.map} +1 -1
- package/public/assets/reset-N3RQTYEB.js +2 -0
- package/public/assets/reset-N3RQTYEB.js.map +1 -0
- package/public/assets/reset-UL_cNRnQ.js +2 -0
- package/public/assets/{reset-C5vUVgr_.js.map → reset-UL_cNRnQ.js.map} +1 -1
- package/public/assets/reset-required-Cv5edDS6.js +2 -0
- package/public/assets/reset-required-Cv5edDS6.js.map +1 -0
- package/public/assets/reset-required-UL_cNRnQ.js +2 -0
- package/public/assets/reset-required-UL_cNRnQ.js.map +1 -0
- package/public/assets/{select-DqZynXSt.js → select-CWdSzsVo.js} +2 -2
- package/public/assets/{select-DqZynXSt.js.map → select-CWdSzsVo.js.map} +1 -1
- package/public/assets/select-UL_cNRnQ.js +2 -0
- package/public/assets/{select-C5vUVgr_.js.map → select-UL_cNRnQ.js.map} +1 -1
- package/public/assets/{separator-B0Bvh1he.js → separator-BWGym8uM.js} +2 -2
- package/public/assets/{separator-B0Bvh1he.js.map → separator-BWGym8uM.js.map} +1 -1
- package/public/assets/shell-header-bar-C9AB5lT-.js +2 -0
- package/public/assets/{shell-header-bar-CjG5qvPg.js.map → shell-header-bar-C9AB5lT-.js.map} +1 -1
- package/public/assets/{terms-BHDAgn-H.js → terms-COVFmzyl.js} +2 -2
- package/public/assets/{terms-BHDAgn-H.js.map → terms-COVFmzyl.js.map} +1 -1
- package/public/assets/{terms-B5NaJfeS.js → terms-D43Yq-6S.js} +2 -2
- package/public/assets/{terms-B5NaJfeS.js.map → terms-D43Yq-6S.js.map} +1 -1
- package/public/assets/{terms-checkbox-list-6jteUTIZ.js → terms-checkbox-list-Cw0zB-lO.js} +2 -2
- package/public/assets/{terms-checkbox-list-6jteUTIZ.js.map → terms-checkbox-list-Cw0zB-lO.js.map} +1 -1
- package/public/assets/totp-BFJEXxk0.js +2 -0
- package/public/assets/{totp-CJtfVNEq.js.map → totp-BFJEXxk0.js.map} +1 -1
- package/public/assets/{totp-BNZ904Zm.js → totp-BfCm6IWl.js} +2 -2
- package/public/assets/{totp-BNZ904Zm.js.map → totp-BfCm6IWl.js.map} +1 -1
- package/public/assets/totp-MINhsVxT.js +2 -0
- package/public/assets/{totp-ECvOUcFx.js.map → totp-MINhsVxT.js.map} +1 -1
- package/public/assets/use-totp-setup-C7Zk_2IY.js +3 -0
- package/public/assets/{use-totp-setup-BbS3XcZA.js.map → use-totp-setup-C7Zk_2IY.js.map} +1 -1
- package/public/assets/{useAriaLabelledBy-ByuMi3Ry.js → useAriaLabelledBy-CiOCg6X5.js} +2 -2
- package/public/assets/{useAriaLabelledBy-ByuMi3Ry.js.map → useAriaLabelledBy-CiOCg6X5.js.map} +1 -1
- package/public/assets/{useMutation-BWZ0G4Td.js → useMutation-ZLFeJg75.js} +2 -2
- package/public/assets/{useMutation-BWZ0G4Td.js.map → useMutation-ZLFeJg75.js.map} +1 -1
- package/public/assets/useQuery-BvMz34BW.js +2 -0
- package/public/assets/{useQuery-Ckxjmvtl.js.map → useQuery-BvMz34BW.js.map} +1 -1
- package/public/assets/{users-CmFxrCQT.js → users-COM7u3A-.js} +2 -2
- package/public/assets/{users-CmFxrCQT.js.map → users-COM7u3A-.js.map} +1 -1
- package/public/index.html +4 -3
- package/public/assets/2fa-B5vLgDXQ.js +0 -2
- package/public/assets/2fa-BqsM_D-X.js +0 -2
- package/public/assets/2fa-C5vUVgr_.js +0 -2
- package/public/assets/2fa-CCOTIHDZ.js +0 -2
- package/public/assets/admin-BPijkLw-.js +0 -2
- package/public/assets/admin-users-DvPbw1Vq.js +0 -2
- package/public/assets/config-DTQCUlfZ.js +0 -2
- package/public/assets/config-DTQCUlfZ.js.map +0 -1
- package/public/assets/email-C5vUVgr_.js +0 -2
- package/public/assets/error-BMXxpgfR.js +0 -2
- package/public/assets/forgot-C5vUVgr_.js +0 -2
- package/public/assets/forgot-rO9sByfV.js +0 -2
- package/public/assets/index-CS23Ozt6.js +0 -11
- package/public/assets/index-CS23Ozt6.js.map +0 -1
- package/public/assets/login-C5vUVgr_.js +0 -2
- package/public/assets/login-C5vUVgr_.js.map +0 -1
- package/public/assets/login-nukebli4.js +0 -2
- package/public/assets/login-nukebli4.js.map +0 -1
- package/public/assets/passkey-BE9JvJOP.js +0 -2
- package/public/assets/passkey-C5vUVgr_.js +0 -2
- package/public/assets/passkey-CynCz1Dt.js +0 -2
- package/public/assets/passkey-J1qnYp9A.js +0 -2
- package/public/assets/password-C5vUVgr_.js +0 -2
- package/public/assets/password-C5vUVgr_.js.map +0 -1
- package/public/assets/password-RkUttbhD.js +0 -2
- package/public/assets/password-RkUttbhD.js.map +0 -1
- package/public/assets/password-reset-sU5KkBKi.js +0 -2
- package/public/assets/recovery-PnUATiUi.js +0 -2
- package/public/assets/register-C5vUVgr_.js +0 -2
- package/public/assets/register-DQXhru0_.js +0 -2
- package/public/assets/reset-C5vUVgr_.js +0 -2
- package/public/assets/reset-CQgIa3yf.js +0 -2
- package/public/assets/reset-CQgIa3yf.js.map +0 -1
- package/public/assets/select-C5vUVgr_.js +0 -2
- package/public/assets/shell-header-bar-CjG5qvPg.js +0 -2
- package/public/assets/totp-CJtfVNEq.js +0 -2
- package/public/assets/totp-ECvOUcFx.js +0 -2
- package/public/assets/use-totp-setup-BbS3XcZA.js +0 -3
- package/public/assets/useQuery-Ckxjmvtl.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users-CmFxrCQT.js","names":["useMutation","useQueryClient","useSuspenseQuery","TRBadge","TRButton","TRCard","useState","useTranslation","AdminGateScreen","AdminShell","AdminUserFormModal","AdminUsersFilterBar","getActiveQuickFilter","AdminUsersNotice","AdminUsersSummary","AdminUsersTable","AdminUsersToolbar","adminUsersQueryOptions","createAdminUser","deleteAdminUser","normalizeAdminUsersQuery","updateAdminUser","appConfigQueryOptions","Route","AdminUsersPage","user","useRouteContext","select","context","role","AdminUsersGate","SessionUser","data","config","admin","enabled","AdminUsersContent","t","queryClient","draftQuery","setDraftQuery","draftIncludeDeleted","setDraftIncludeDeleted","filters","setFilters","notice","setNotice","NoticeState","modal","setModal","UserModalState","activeUsers","users","filter","managedUser","deleted_at","length","configUsers","managed_by","databaseUsers","activeQuickFilter","hasActiveFilters","query","includeDeleted","managedBy","undefined","pageStart","pagination","total","page","page_size","pageEnd","Math","min","noticeOn","message","tone","noticeFail","createMutation","mutationFn","onSuccess","nextUser","invalidateQueries","queryKey","email","onError","updateMutation","deleteMutation","isMutating","isPending","applySearch","current","trim","clearFilters","applyQuickFilter","nextFilter","QuickFilter","type","pageSize","values","mutate","sub","component"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/search.mjs","../../../frontend/src/features/admin/users/admin-users-filters.ts","../../../frontend/src/features/admin/users/admin-user-form-modal.tsx","../../../frontend/src/features/admin/users/admin-users-filter-bar.tsx","../../../frontend/src/features/admin/users/admin-users-notice.tsx","../../../frontend/src/features/admin/users/admin-users-summary.tsx","../../../../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/table/table-body.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/table/table-caption.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/table/table-cell.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/table/table-footer.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/table/table-head.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/table/table-header.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/table/table-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/table/table-row.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/table/index.js","../../../frontend/src/features/admin/users/admin-users-table.tsx","../../../frontend/src/features/admin/users/admin-users-toolbar.tsx","../../../frontend/src/routes/admin/users/index.tsx?tsr-split=component"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.mjs.map\n","import type {\n AdminUser,\n normalizeAdminUsersQuery,\n} from '#frontend/queries/admin-users.ts';\n\nexport type QuickFilter = 'all' | 'database' | 'config' | 'admins';\n\nexport type NoticeState = {\n tone: 'success' | 'error';\n message: string;\n} | null;\n\nexport type UserModalState =\n | { type: 'create' }\n | { type: 'edit'; user: AdminUser }\n | { type: 'delete'; user: AdminUser }\n | null;\n\nexport function parseUserRole(\n value: FormDataEntryValue | null,\n): 'user' | 'admin' {\n return value === 'admin' ? 'admin' : 'user';\n}\n\nexport function getActiveQuickFilter(\n filters: ReturnType<typeof normalizeAdminUsersQuery>,\n): QuickFilter {\n if (filters.role === 'admin') return 'admins';\n if (filters.managedBy === 'database') return 'database';\n if (filters.managedBy === 'config') return 'config';\n return 'all';\n}\n","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCheckbox } from '@tinyrack/ui/components/checkbox';\nimport { TRField } from '@tinyrack/ui/components/field';\nimport { TRInput } from '@tinyrack/ui/components/input';\nimport { TRSelect } from '@tinyrack/ui/components/select';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { CheckIcon, TriangleAlertIcon } from 'lucide-react';\nimport type { FormEvent } from 'react';\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Modal, ModalActions } from '#frontend/components/ui/modal.tsx';\nimport {\n parseUserRole,\n type UserModalState,\n} from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUserFormModalProps = {\n modal: UserModalState;\n isMutating: boolean;\n onClose: () => void;\n onCreate: (values: {\n email: string;\n password: string;\n role: 'user' | 'admin';\n email_verified: boolean;\n }) => void;\n onUpdate: (values: {\n sub: string;\n email: string;\n role: 'user' | 'admin';\n email_verified: boolean;\n }) => void;\n onDelete: (sub: string) => void;\n};\n\nexport function AdminUserFormModal({\n modal,\n isMutating,\n onClose,\n onCreate,\n onUpdate,\n onDelete,\n}: AdminUserFormModalProps) {\n const { t } = useTranslation();\n const defaultValues = useMemo(\n () => (modal?.type === 'edit' ? modal.user : null),\n [modal],\n );\n\n if (!modal) return null;\n\n if (modal.type === 'delete') {\n return (\n <Modal\n isOpen\n onClose={onClose}\n title={t('admin.users.deleteTitle', { email: modal.user.email })}\n variant=\"destructive\"\n >\n <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\">\n <div className=\"flex items-center gap-tinyrack-sm\">\n <TriangleAlertIcon aria-hidden className=\"size-tinyrack-lg\" />\n <TRText as=\"p\" weight=\"medium\">\n {t('admin.users.deleteWarning')}\n </TRText>\n </div>\n <TRText as=\"p\" variant=\"bodySm\">\n {t('admin.users.deleteDescription')}\n </TRText>\n </div>\n <ModalActions>\n <TRButton\n disabled={isMutating}\n onClick={onClose}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.cancel')}\n </TRButton>\n <TRButton\n disabled={isMutating}\n intent=\"danger\"\n onClick={() => onDelete(modal.user.sub)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.deleteConfirm')}\n </TRButton>\n </ModalActions>\n </Modal>\n );\n }\n\n const title =\n modal.type === 'create'\n ? t('admin.users.create')\n : t('admin.users.editTitle');\n const submit =\n modal.type === 'create'\n ? t('admin.users.createSubmit')\n : t('admin.users.save');\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n const values = {\n email: String(formData.get('email') ?? ''),\n role: parseUserRole(formData.get('role')),\n email_verified: formData.get('email_verified') === 'on',\n };\n if (modal.type === 'create') {\n onCreate({\n ...values,\n password: String(formData.get('password') ?? ''),\n });\n } else {\n onUpdate({ sub: modal.user.sub, ...values });\n }\n };\n\n return (\n <Modal\n description={\n modal.type === 'create'\n ? t('admin.users.createHint')\n : t('admin.users.editHint')\n }\n isOpen\n onClose={onClose}\n title={title}\n >\n <form\n className=\"mt-tinyrack-lg flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit}\n >\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-email\">\n {t('profile.email.label')}\n </TRField.Label>\n <TRInput\n defaultValue={defaultValues?.email ?? ''}\n id=\"admin-user-email\"\n name=\"email\"\n required\n type=\"email\"\n uiSize=\"sm\"\n />\n </TRField.Root>\n\n {modal.type === 'create' ? (\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-password\">\n {t('admin.users.password')}\n </TRField.Label>\n <TRInput\n id=\"admin-user-password\"\n name=\"password\"\n required\n type=\"password\"\n uiSize=\"sm\"\n />\n </TRField.Root>\n ) : null}\n\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-role\">\n {t('admin.users.role')}\n </TRField.Label>\n <TRSelect.Root\n defaultValue={defaultValues?.role ?? 'user'}\n name=\"role\"\n >\n <TRSelect.Trigger id=\"admin-user-role\" uiSize=\"sm\">\n <TRSelect.Value />\n </TRSelect.Trigger>\n <TRSelect.Positioner>\n <TRSelect.Popup>\n <TRSelect.List>\n {['user', 'admin'].map((role) => (\n <TRSelect.Item key={role} value={role}>\n <TRSelect.ItemText>\n {t(\n `admin.users.role${role === 'user' ? 'User' : 'Admin'}`,\n )}\n </TRSelect.ItemText>\n <TRSelect.ItemIndicator>\n <CheckIcon aria-hidden />\n </TRSelect.ItemIndicator>\n </TRSelect.Item>\n ))}\n </TRSelect.List>\n </TRSelect.Popup>\n </TRSelect.Positioner>\n </TRSelect.Root>\n </TRField.Root>\n\n <TRField.Root>\n <div className=\"flex items-center gap-tinyrack-md rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface px-tinyrack-md py-tinyrack-sm\">\n <TRCheckbox.Root\n aria-label={t('admin.users.emailVerified')}\n defaultChecked={defaultValues?.email_verified ?? false}\n name=\"email_verified\"\n uiSize=\"md\"\n value=\"on\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n <TRField.Label className=\"cursor-pointer\">\n {t('admin.users.emailVerified')}\n </TRField.Label>\n </div>\n </TRField.Root>\n\n <ModalActions>\n <TRButton\n disabled={isMutating}\n onClick={onClose}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.cancel')}\n </TRButton>\n <TRButton\n disabled={isMutating}\n intent=\"primary\"\n type=\"submit\"\n uiSize=\"sm\"\n >\n {submit}\n </TRButton>\n </ModalActions>\n </form>\n </Modal>\n );\n}\n","import { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRSelect } from '@tinyrack/ui/components/select';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { CheckIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport type { QuickFilter } from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUsersFilterBarProps = {\n pageStart: number;\n pageEnd: number;\n total: number;\n query: string;\n includeDeleted: boolean;\n activeQuickFilter: QuickFilter;\n hasActiveFilters: boolean;\n onClearFilters: () => void;\n pageSize: number;\n onPageSizeChange: (pageSize: number) => void;\n};\n\nconst PAGE_SIZES = [10, 20, 50];\n\n/** What the current result set is filtered by, and how much of it is shown. */\nexport function AdminUsersFilterBar({\n pageStart,\n pageEnd,\n total,\n query,\n includeDeleted,\n activeQuickFilter,\n hasActiveFilters,\n onClearFilters,\n pageSize,\n onPageSizeChange,\n}: AdminUsersFilterBarProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-tinyrack-md px-tinyrack-xl\">\n <div className=\"flex flex-wrap items-center gap-tinyrack-sm\">\n <TRText color=\"muted\" variant=\"bodySm\">\n {t('admin.users.showingRange', {\n from: pageStart,\n to: pageEnd,\n total,\n })}\n </TRText>\n {query ? (\n <TRBadge uiSize=\"md\" variant=\"neutral\">\n {t('admin.users.queryChip', { query })}\n </TRBadge>\n ) : null}\n {includeDeleted ? (\n <TRBadge uiSize=\"md\" variant=\"warning\">\n {t('admin.users.includeDeleted')}\n </TRBadge>\n ) : null}\n {activeQuickFilter !== 'all' ? (\n <TRBadge uiSize=\"md\">\n {t(`admin.users.filter.${activeQuickFilter}`)}\n </TRBadge>\n ) : null}\n {hasActiveFilters ? (\n <TRButton\n appearance=\"ghost\"\n onClick={onClearFilters}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.clearFilters')}\n </TRButton>\n ) : null}\n </div>\n\n <div className=\"flex items-center gap-tinyrack-sm\">\n <TRText color=\"muted\" variant=\"bodySm\">\n {t('admin.users.pageSize')}\n </TRText>\n <TRSelect.Root\n onValueChange={(value) => {\n if (typeof value === 'number') onPageSizeChange(value);\n }}\n value={pageSize}\n >\n <TRSelect.Trigger aria-label={t('admin.users.pageSize')} uiSize=\"sm\">\n <TRSelect.Value />\n </TRSelect.Trigger>\n <TRSelect.Portal>\n <TRSelect.Positioner>\n <TRSelect.Popup>\n <TRSelect.List>\n {PAGE_SIZES.map((size) => (\n <TRSelect.Item key={size} value={size}>\n <TRSelect.ItemText>{size}</TRSelect.ItemText>\n <TRSelect.ItemIndicator>\n <CheckIcon />\n </TRSelect.ItemIndicator>\n </TRSelect.Item>\n ))}\n </TRSelect.List>\n </TRSelect.Popup>\n </TRSelect.Positioner>\n </TRSelect.Portal>\n </TRSelect.Root>\n </div>\n </div>\n );\n}\n","import { TRAlert } from '@tinyrack/ui/components/alert';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { CheckIcon, TriangleAlertIcon, XIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport type { NoticeState } from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUsersNoticeProps = {\n notice: NonNullable<NoticeState>;\n onDismiss: () => void;\n};\n\n/**\n * Result of the last create/update/delete.\n *\n * Stays an inline banner rather than becoming a toast now that the shell\n * mounts a viewport: Base UI renders toasts as `dialog`/`alertdialog` inside a\n * `region`, never as a live `status`, so a toast would silently drop the\n * polite announcement this makes.\n */\nexport function AdminUsersNotice({ notice, onDismiss }: AdminUsersNoticeProps) {\n const { t } = useTranslation();\n const isSuccess = notice.tone === 'success';\n\n return (\n <TRAlert.Root\n aria-live={isSuccess ? 'polite' : 'assertive'}\n role={isSuccess ? 'status' : 'alert'}\n variant={isSuccess ? 'success' : 'danger'}\n >\n {isSuccess ? (\n <CheckIcon aria-hidden className=\"size-tinyrack-xl\" />\n ) : (\n <TriangleAlertIcon aria-hidden className=\"size-tinyrack-xl\" />\n )}\n <TRAlert.Title>{notice.message}</TRAlert.Title>\n <TRButton\n appearance=\"ghost\"\n aria-label={t('common.close')}\n className=\"ms-auto\"\n onClick={onDismiss}\n type=\"button\"\n uiSize=\"sm\"\n >\n <XIcon aria-hidden className=\"size-tinyrack-lg\" />\n </TRButton>\n </TRAlert.Root>\n );\n}\n","import { useTranslation } from 'react-i18next';\nimport { AdminStat } from '#frontend/features/admin/admin-stat.tsx';\n\ntype AdminUsersSummaryProps = {\n active: number;\n config: number;\n database: number;\n};\n\n/** Counts for the page currently in view, not the whole directory. */\nexport function AdminUsersSummary({\n active,\n config,\n database,\n}: AdminUsersSummaryProps) {\n const { t } = useTranslation();\n const hint = t('admin.users.currentPage');\n\n return (\n <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\">\n <AdminStat\n hint={hint}\n label={t('admin.users.activeOnPage')}\n value={active}\n />\n <AdminStat\n hint={hint}\n label={t('admin.users.configOnPage')}\n value={config}\n />\n <AdminStat\n hint={hint}\n label={t('admin.users.databaseOnPage')}\n value={database}\n />\n </div>\n );\n}\n","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-body.tsx\nfunction TRTableBody({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"tbody\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-body\", className)\n\t});\n}\n//#endregion\nexport { TRTableBody };\n\n//# sourceMappingURL=table-body.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-caption.tsx\nfunction TRTableCaption({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"caption\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-caption\", className)\n\t});\n}\n//#endregion\nexport { TRTableCaption };\n\n//# sourceMappingURL=table-caption.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-cell.tsx\nfunction TRTableCell({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"td\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-cell\", className)\n\t});\n}\n//#endregion\nexport { TRTableCell };\n\n//# sourceMappingURL=table-cell.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-footer.tsx\nfunction TRTableFooter({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"tfoot\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-footer\", className)\n\t});\n}\n//#endregion\nexport { TRTableFooter };\n\n//# sourceMappingURL=table-footer.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-head.tsx\nfunction TRTableHead({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"th\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-head\", className)\n\t});\n}\n//#endregion\nexport { TRTableHead };\n\n//# sourceMappingURL=table-head.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-header.tsx\nfunction TRTableHeader({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"thead\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-header\", className)\n\t});\n}\n//#endregion\nexport { TRTableHeader };\n\n//# sourceMappingURL=table-header.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-root.tsx\nfunction TRTableRoot({ className, containerClassName, containerProps, containerRef, density = \"comfortable\", striped = false, ...props }) {\n\tconst { className: containerPropsClassName, ref: containerPropsRef, ...restContainerProps } = containerProps ?? {};\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\t...restContainerProps,\n\t\tclassName: mergeClassNames(\"tr-table-container\", containerClassName, containerPropsClassName),\n\t\tref: containerRef ?? containerPropsRef,\n\t\tchildren: /* @__PURE__ */ jsx(\"table\", {\n\t\t\t...props,\n\t\t\tclassName: mergeClassNames(\"tr-table\", className),\n\t\t\t\"data-density\": density,\n\t\t\t\"data-striped\": striped ? \"true\" : void 0\n\t\t})\n\t});\n}\n//#endregion\nexport { TRTableRoot };\n\n//# sourceMappingURL=table-root.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-row.tsx\nfunction TRTableRow({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"tr\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-row\", className)\n\t});\n}\n//#endregion\nexport { TRTableRow };\n\n//# sourceMappingURL=table-row.js.map","import { TRTableBody } from \"./table-body.js\";\nimport { TRTableCaption } from \"./table-caption.js\";\nimport { TRTableCell } from \"./table-cell.js\";\nimport { TRTableFooter } from \"./table-footer.js\";\nimport { TRTableHead } from \"./table-head.js\";\nimport { TRTableHeader } from \"./table-header.js\";\nimport { TRTableRoot } from \"./table-root.js\";\nimport { TRTableRow } from \"./table-row.js\";\n//#region src/components/table/index.tsx\nconst TRTable = {\n\tRoot: TRTableRoot,\n\tCaption: TRTableCaption,\n\tHeader: TRTableHeader,\n\tBody: TRTableBody,\n\tFooter: TRTableFooter,\n\tRow: TRTableRow,\n\tHead: TRTableHead,\n\tCell: TRTableCell\n};\n//#endregion\nexport { TRTable, TRTableBody, TRTableCaption, TRTableCell, TRTableFooter, TRTableHead, TRTableHeader, TRTableRoot, TRTableRow };\n\n//# sourceMappingURL=index.js.map","import { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRTable } from '@tinyrack/ui/components/table';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { useTranslation } from 'react-i18next';\nimport {\n formatAdminRole,\n formatManagedBy,\n} from '#frontend/features/admin/format-admin-user.ts';\nimport type { AdminUser } from '#frontend/queries/admin-users.ts';\n\ntype AdminUsersTableProps = {\n users: AdminUser[];\n onEdit: (user: AdminUser) => void;\n onDelete: (user: AdminUser) => void;\n};\n\nexport function AdminUsersTable({\n users,\n onEdit,\n onDelete,\n}: AdminUsersTableProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"overflow-x-auto pb-tinyrack-sm\">\n <TRTable.Root density=\"compact\" striped>\n <TRTable.Header>\n <TRTable.Row>\n <TRTable.Head>{t('profile.email.label')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.role')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.source')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.emailVerified')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.secondFactor')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.status')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.actions')}</TRTable.Head>\n </TRTable.Row>\n </TRTable.Header>\n <TRTable.Body>\n {users.map((managedUser) => (\n <TRTable.Row key={managedUser.sub}>\n <TRTable.Cell>\n <div className=\"flex flex-col gap-tinyrack-3xs\">\n <TRText as=\"div\" variant=\"bodySm\" weight=\"medium\">\n {managedUser.email}\n </TRText>\n {/*\n Mono on a bare span: a font utility on `TRText` loses to\n the component's own per-variant `font-family` rule.\n */}\n <TRText\n as=\"div\"\n className=\"max-w-tinyrack-measure-lg\"\n color=\"muted\"\n truncate\n variant=\"caption\"\n >\n <span className=\"font-tinyrack-mono\">\n {managedUser.sub}\n </span>\n </TRText>\n </div>\n </TRTable.Cell>\n {/*\n `whitespace-nowrap` on every badge: without it a narrow\n viewport squeezes these columns until the labels break one\n letter per line. Keeping them intact makes the table wider\n than the phone, which is what the horizontal scroller below\n is for.\n */}\n <TRTable.Cell>\n <TRBadge\n className=\"whitespace-nowrap\"\n uiSize=\"md\"\n variant={managedUser.role === 'admin' ? 'neutral' : undefined}\n >\n {formatAdminRole(t, managedUser.role)}\n </TRBadge>\n </TRTable.Cell>\n <TRTable.Cell>\n <TRBadge\n className=\"whitespace-nowrap\"\n uiSize=\"md\"\n variant={\n managedUser.managed_by === 'config' ? 'warning' : 'info'\n }\n >\n {formatManagedBy(t, managedUser.managed_by)}\n </TRBadge>\n </TRTable.Cell>\n <TRTable.Cell>\n {managedUser.email_verified ? t('common.yes') : t('common.no')}\n </TRTable.Cell>\n <TRTable.Cell>\n {managedUser.totp_registered\n ? t('admin.users.secondFactorTotp')\n : managedUser.passkey_count > 0\n ? t(\n managedUser.passkey_count === 1\n ? 'admin.users.secondFactorPasskey'\n : 'admin.users.secondFactorPasskeys',\n { count: managedUser.passkey_count },\n )\n : t('common.none')}\n </TRTable.Cell>\n <TRTable.Cell>\n {/*\n `variant` here is a test contract: the directory test reads\n `[data-variant=\"success\"]` out of the row to assert the\n status. Changing these tones breaks it.\n */}\n <TRBadge\n className=\"whitespace-nowrap\"\n uiSize=\"md\"\n variant={managedUser.deleted_at ? 'danger' : 'success'}\n >\n {managedUser.deleted_at\n ? t('admin.users.deleted')\n : t('admin.users.active')}\n </TRBadge>\n </TRTable.Cell>\n <TRTable.Cell>\n {managedUser.managed_by === 'database' &&\n !managedUser.deleted_at ? (\n <div className=\"inline-flex items-center whitespace-nowrap rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface-muted\">\n <TRButton\n appearance=\"ghost\"\n aria-label={t('admin.users.editUser', {\n email: managedUser.email,\n })}\n onClick={() => onEdit(managedUser)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.edit')}\n </TRButton>\n <TRButton\n appearance=\"outline\"\n aria-label={t('admin.users.deleteUser', {\n email: managedUser.email,\n })}\n intent=\"danger\"\n onClick={() => onDelete(managedUser)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.delete')}\n </TRButton>\n </div>\n ) : (\n <TRBadge className=\"whitespace-nowrap\" uiSize=\"md\">\n {t('admin.users.readonly')}\n </TRBadge>\n )}\n </TRTable.Cell>\n </TRTable.Row>\n ))}\n {users.length === 0 ? (\n <TRTable.Row>\n <TRTable.Cell\n className=\"py-tinyrack-3xl text-center text-tinyrack-text-muted\"\n colSpan={7}\n >\n {t('admin.users.emptyFiltered')}\n </TRTable.Cell>\n </TRTable.Row>\n ) : null}\n </TRTable.Body>\n </TRTable.Root>\n </div>\n );\n}\n","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCard } from '@tinyrack/ui/components/card';\nimport { TRCheckbox } from '@tinyrack/ui/components/checkbox';\nimport { TRField } from '@tinyrack/ui/components/field';\nimport { TRInput } from '@tinyrack/ui/components/input';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { PlusIcon, SearchIcon, UsersIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport type { QuickFilter } from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUsersToolbarProps = {\n total: number;\n draftQuery: string;\n onDraftQueryChange: (value: string) => void;\n draftIncludeDeleted: boolean;\n onDraftIncludeDeletedChange: (value: boolean) => void;\n onSearch: () => void;\n onCreate: () => void;\n activeQuickFilter: QuickFilter;\n onQuickFilter: (filter: QuickFilter) => void;\n};\n\nconst QUICK_FILTERS: QuickFilter[] = ['all', 'database', 'config', 'admins'];\n\nexport function AdminUsersToolbar({\n total,\n draftQuery,\n onDraftQueryChange,\n draftIncludeDeleted,\n onDraftIncludeDeletedChange,\n onSearch,\n onCreate,\n activeQuickFilter,\n onQuickFilter,\n}: AdminUsersToolbarProps) {\n const { t } = useTranslation();\n\n return (\n <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\">\n <div className=\"flex flex-col gap-tinyrack-sm\">\n <div className=\"flex items-center gap-tinyrack-sm\">\n <UsersIcon\n aria-hidden\n className=\"size-tinyrack-lg text-tinyrack-success\"\n />\n <TRText color=\"muted\" variant=\"label\">\n {t('admin.users.directoryEyebrow')}\n </TRText>\n </div>\n <TRCard.Title>{t('admin.users.directory')}</TRCard.Title>\n <TRCard.Description className=\"text-tinyrack-sm\">\n {t('admin.users.total', { count: total })}\n </TRCard.Description>\n </div>\n\n <div className=\"flex flex-col gap-tinyrack-md xl:items-end\">\n <div className=\"flex flex-col gap-tinyrack-sm lg:flex-row lg:items-center\">\n <TRInput\n aria-label={t('admin.users.searchPlaceholder')}\n className=\"w-full lg:w-tinyrack-overlay-width-sm\"\n onChange={(event) => onDraftQueryChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') onSearch();\n }}\n placeholder={t('admin.users.searchPlaceholder')}\n type=\"search\"\n uiSize=\"sm\"\n value={draftQuery}\n />\n\n {/*\n `aria-label` rather than relying on the label association: the\n design system's checkbox is a `button[role=checkbox]`, and the\n accessible-name path through `Field.Label` for a non-input control\n is not something to gamble a test contract on.\n */}\n <TRField.Root>\n <div className=\"flex items-center gap-tinyrack-sm rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface px-tinyrack-md py-tinyrack-sm\">\n <TRCheckbox.Root\n aria-label={t('admin.users.includeDeleted')}\n checked={draftIncludeDeleted}\n onCheckedChange={(checked) =>\n onDraftIncludeDeletedChange(checked === true)\n }\n uiSize=\"md\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n <TRField.Label className=\"cursor-pointer\">\n {t('admin.users.includeDeleted')}\n </TRField.Label>\n </div>\n </TRField.Root>\n\n <TRButton\n appearance=\"outline\"\n onClick={onSearch}\n type=\"button\"\n uiSize=\"sm\"\n >\n <SearchIcon aria-hidden className=\"size-tinyrack-lg\" />\n {t('admin.users.search')}\n </TRButton>\n <TRButton\n intent=\"primary\"\n onClick={onCreate}\n type=\"button\"\n uiSize=\"sm\"\n >\n <PlusIcon aria-hidden className=\"size-tinyrack-lg\" />\n {t('admin.users.create')}\n </TRButton>\n </div>\n\n <div className=\"inline-flex items-center gap-tinyrack-3xs rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface-muted p-tinyrack-xs\">\n {QUICK_FILTERS.map((filter) => (\n <TRButton\n appearance={activeQuickFilter === filter ? 'solid' : 'ghost'}\n intent={activeQuickFilter === filter ? 'primary' : undefined}\n key={filter}\n onClick={() => onQuickFilter(filter)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t(`admin.users.filter.${filter}`)}\n </TRButton>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","import {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, redirect } from '@tanstack/react-router';\nimport { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCard } from '@tinyrack/ui/components/card';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { AdminGateScreen } from '#frontend/features/admin/admin-gate-screen.tsx';\nimport { AdminShell } from '#frontend/features/admin/admin-shell.tsx';\nimport { AdminUserFormModal } from '#frontend/features/admin/users/admin-user-form-modal.tsx';\nimport { AdminUsersFilterBar } from '#frontend/features/admin/users/admin-users-filter-bar.tsx';\nimport {\n getActiveQuickFilter,\n type NoticeState,\n type QuickFilter,\n type UserModalState,\n} from '#frontend/features/admin/users/admin-users-filters.ts';\nimport { AdminUsersNotice } from '#frontend/features/admin/users/admin-users-notice.tsx';\nimport { AdminUsersSummary } from '#frontend/features/admin/users/admin-users-summary.tsx';\nimport { AdminUsersTable } from '#frontend/features/admin/users/admin-users-table.tsx';\nimport { AdminUsersToolbar } from '#frontend/features/admin/users/admin-users-toolbar.tsx';\nimport {\n adminUsersQueryOptions,\n createAdminUser,\n deleteAdminUser,\n normalizeAdminUsersQuery,\n updateAdminUser,\n} from '#frontend/queries/admin-users.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport type { SessionUser } from '#frontend/queries/session.ts';\n\nexport const Route = createFileRoute('/admin/users/')({\n component: AdminUsersPage,\n beforeLoad: async ({ context }) => {\n if (!context.user) {\n throw redirect({ to: '/login' });\n }\n },\n});\n\nfunction AdminUsersPage() {\n const user = Route.useRouteContext({ select: (context) => context.user });\n\n if (user?.role !== 'admin') {\n return <AdminGateScreen reason=\"access-required\" />;\n }\n\n return <AdminUsersGate user={user} />;\n}\n\nfunction AdminUsersGate({ user }: { user: SessionUser }) {\n const { data: config } = useSuspenseQuery(appConfigQueryOptions);\n if (!config.admin.enabled) {\n return <AdminGateScreen reason=\"console-disabled\" />;\n }\n return <AdminUsersContent user={user} />;\n}\n\nfunction AdminUsersContent({ user }: { user: SessionUser }) {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const [draftQuery, setDraftQuery] = useState('');\n const [draftIncludeDeleted, setDraftIncludeDeleted] = useState(false);\n const [filters, setFilters] = useState(() => normalizeAdminUsersQuery());\n const [notice, setNotice] = useState<NoticeState>(null);\n const [modal, setModal] = useState<UserModalState>(null);\n const { data } = useSuspenseQuery(adminUsersQueryOptions(filters));\n\n const activeUsers = data.users.filter(\n (managedUser) => !managedUser.deleted_at,\n ).length;\n const configUsers = data.users.filter(\n (managedUser) => managedUser.managed_by === 'config',\n ).length;\n const databaseUsers = data.users.filter(\n (managedUser) => managedUser.managed_by === 'database',\n ).length;\n const activeQuickFilter = getActiveQuickFilter(filters);\n const hasActiveFilters =\n filters.query !== '' ||\n filters.includeDeleted ||\n filters.managedBy !== undefined ||\n filters.role !== undefined;\n const pageStart =\n data.pagination.total === 0\n ? 0\n : (data.pagination.page - 1) * data.pagination.page_size + 1;\n const pageEnd = Math.min(\n data.pagination.page * data.pagination.page_size,\n data.pagination.total,\n );\n\n const noticeOn = (message: string) => setNotice({ tone: 'success', message });\n const noticeFail = () =>\n setNotice({ tone: 'error', message: t('admin.users.operationFailed') });\n\n const createMutation = useMutation({\n mutationFn: createAdminUser,\n onSuccess: ({ user: nextUser }) => {\n void queryClient.invalidateQueries({ queryKey: ['admin', 'users'] });\n noticeOn(t('admin.users.createdNotice', { email: nextUser.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n\n const updateMutation = useMutation({\n mutationFn: updateAdminUser,\n onSuccess: ({ user: nextUser }) => {\n void queryClient.invalidateQueries({ queryKey: ['admin', 'users'] });\n noticeOn(t('admin.users.updatedNotice', { email: nextUser.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n\n const deleteMutation = useMutation({\n mutationFn: deleteAdminUser,\n onSuccess: ({ user: nextUser }) => {\n void queryClient.invalidateQueries({ queryKey: ['admin', 'users'] });\n noticeOn(t('admin.users.deletedNotice', { email: nextUser.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n\n const isMutating =\n createMutation.isPending ||\n updateMutation.isPending ||\n deleteMutation.isPending;\n\n const applySearch = () => {\n setFilters((current) => ({\n ...current,\n query: draftQuery.trim(),\n includeDeleted: draftIncludeDeleted,\n page: 1,\n }));\n };\n\n const clearFilters = () => {\n setDraftQuery('');\n setDraftIncludeDeleted(false);\n setFilters(normalizeAdminUsersQuery());\n };\n\n const applyQuickFilter = (nextFilter: QuickFilter) => {\n setFilters((current) => ({\n ...current,\n page: 1,\n managedBy:\n nextFilter === 'database'\n ? 'database'\n : nextFilter === 'config'\n ? 'config'\n : undefined,\n role: nextFilter === 'admins' ? 'admin' : undefined,\n }));\n };\n\n return (\n <AdminShell\n current=\"users\"\n description={t('admin.users.description')}\n title={t('admin.users.title')}\n user={user}\n >\n <AdminUsersSummary\n active={activeUsers}\n config={configUsers}\n database={databaseUsers}\n />\n\n {notice ? (\n <AdminUsersNotice notice={notice} onDismiss={() => setNotice(null)} />\n ) : null}\n\n <TRCard.Root\n className=\"overflow-hidden shadow-tinyrack-raised\"\n data-testid=\"admin-users-directory\"\n variant=\"outlined\"\n >\n <TRCard.Content className=\"gap-tinyrack-lg p-0\">\n <AdminUsersToolbar\n activeQuickFilter={activeQuickFilter}\n draftIncludeDeleted={draftIncludeDeleted}\n draftQuery={draftQuery}\n onCreate={() => setModal({ type: 'create' })}\n onDraftIncludeDeletedChange={setDraftIncludeDeleted}\n onDraftQueryChange={setDraftQuery}\n onQuickFilter={applyQuickFilter}\n onSearch={applySearch}\n total={data.pagination.total}\n />\n\n <AdminUsersFilterBar\n activeQuickFilter={activeQuickFilter}\n hasActiveFilters={hasActiveFilters}\n includeDeleted={filters.includeDeleted}\n onClearFilters={clearFilters}\n onPageSizeChange={(pageSize) =>\n setFilters((current) => ({ ...current, page: 1, pageSize }))\n }\n pageEnd={pageEnd}\n pageSize={filters.pageSize}\n pageStart={pageStart}\n query={filters.query}\n total={data.pagination.total}\n />\n\n <AdminUsersTable\n onDelete={(managedUser) =>\n setModal({ type: 'delete', user: managedUser })\n }\n onEdit={(managedUser) =>\n setModal({ type: 'edit', user: managedUser })\n }\n users={data.users}\n />\n\n <div className=\"flex items-center justify-between border-tinyrack-border border-t-tinyrack-default bg-tinyrack-surface-muted p-tinyrack-lg\">\n <TRButton\n appearance=\"outline\"\n disabled={filters.page <= 1}\n onClick={() =>\n setFilters((current) => ({\n ...current,\n page: current.page - 1,\n }))\n }\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.previous')}\n </TRButton>\n <TRBadge uiSize=\"md\">\n {t('admin.users.page', { page: data.pagination.page })}\n </TRBadge>\n <TRButton\n appearance=\"outline\"\n disabled={\n data.pagination.page * data.pagination.page_size >=\n data.pagination.total\n }\n onClick={() =>\n setFilters((current) => ({\n ...current,\n page: current.page + 1,\n }))\n }\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.next')}\n </TRButton>\n </div>\n </TRCard.Content>\n </TRCard.Root>\n\n <AdminUserFormModal\n isMutating={isMutating}\n modal={modal}\n onClose={() => setModal(null)}\n onCreate={(values) => createMutation.mutate(values)}\n onDelete={(sub) => deleteMutation.mutate(sub)}\n onUpdate={(values) => updateMutation.mutate(values)}\n />\n </AdminShell>\n );\n}\n"],"x_google_ignoreList":[0,6,7,8,9,10,11,12,13,14],"mappings":"mwBAaA,IAAM,EAAS,EAAiB,SAAU,CAHxC,CAAC,OAAQ,CAAE,EAAG,mBAAoB,IAAK,QAAS,CAAC,EACjD,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,QAAS,CAAC,CAEhB,CAAU,aCKpD,SAAA,EAAA,EAAA,kCAIA,CAEA,SAAA,EAAA,EAAA,2GAOA,WCIA,SAAgB,EAAmB,CACjC,QACA,aACA,UACA,WACA,WACA,YAC0B,CAC1B,GAAM,CAAE,KAAM,EAAe,EACvB,GAAA,EAAA,EAAA,QAAA,KACG,GAAO,OAAS,OAAS,EAAM,KAAO,KAC7C,CAAC,CAAK,CACR,EAEA,GAAI,CAAC,EAAO,OAAO,KAEnB,GAAI,EAAM,OAAS,SACjB,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,OAAA,GACS,UACT,MAAO,EAAE,0BAA2B,CAAE,MAAO,EAAM,KAAK,KAAM,CAAC,EAC/D,QAAQ,uBAJV,EAME,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gKAAf,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,6CAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAmB,cAAA,GAAY,UAAU,kBAAoB,CAAA,GAC7D,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,GAAG,IAAI,OAAO,kBACnB,EAAE,2BAA2B,CACxB,CAAA,CACL,KACL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,GAAG,IAAI,QAAQ,kBACpB,EAAE,+BAA+B,CAC5B,CAAA,CACL,KACL,EAAA,EAAA,KAAA,CAAC,EAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,SAAU,EACV,QAAS,EACT,KAAK,SACL,OAAO,cAEN,EAAE,oBAAoB,CACf,CAAA,GACV,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,SAAU,EACV,OAAO,SACP,YAAe,EAAS,EAAM,KAAK,GAAG,EACtC,KAAK,SACL,OAAO,cAEN,EAAE,2BAA2B,CACtB,CAAA,CACE,CAAA,CAAA,CACT,IAIX,IAAM,EACJ,EAAM,OAAS,SACX,EAAE,oBAAoB,EACtB,EAAE,uBAAuB,EACzB,EACJ,EAAM,OAAS,SACX,EAAE,0BAA0B,EAC5B,EAAE,kBAAkB,EAoB1B,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,YACE,EAAM,OAAS,SACX,EAAE,wBAAwB,EAC1B,EAAE,sBAAsB,EAE9B,OAAA,GACS,UACF,kBAEP,EAAA,EAAA,KAAA,CAAC,OAAD,CACE,UAAU,+CACV,SA/BgB,GAAsC,CAC1D,EAAM,eAAe,EACrB,IAAM,EAAW,IAAI,SAAS,EAAM,aAAa,EAC3C,EAAS,CACb,MAAO,OAAO,EAAS,IAAI,OAAO,GAAK,EAAE,EACzC,KAAM,EAAc,EAAS,IAAI,MAAM,CAAC,EACxC,eAAgB,EAAS,IAAI,gBAAgB,IAAM,IACrD,EACI,EAAM,OAAS,SACjB,EAAS,CACP,GAAG,EACH,SAAU,OAAO,EAAS,IAAI,UAAU,GAAK,EAAE,CACjD,CAAC,EAED,EAAS,CAAE,IAAK,EAAM,KAAK,IAAK,GAAG,CAAO,CAAC,CAE/C,WAaI,EAIE,EAAA,EAAA,KAAA,CAAC,EAAQ,KAAT,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAQ,MAAT,CAAe,QAAQ,4BACpB,EAAE,qBAAqB,CACX,CAAA,GACf,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,aAAc,GAAe,OAAS,GACtC,GAAG,mBACH,KAAK,QACL,SAAA,GACA,KAAK,QACL,OAAO,IACR,CAAA,CACW,CAAA,CAAA,EAEb,EAAM,OAAS,UACd,EAAA,EAAA,KAAA,CAAC,EAAQ,KAAT,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAQ,MAAT,CAAe,QAAQ,+BACpB,EAAE,sBAAsB,CACZ,CAAA,GACf,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,GAAG,sBACH,KAAK,WACL,SAAA,GACA,KAAK,WACL,OAAO,IACR,CAAA,CACW,CAAA,CAAA,EACZ,MAEJ,EAAA,EAAA,KAAA,CAAC,EAAQ,KAAT,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAQ,MAAT,CAAe,QAAQ,2BACpB,EAAE,kBAAkB,CACR,CAAA,GACf,EAAA,EAAA,KAAA,CAAC,EAAS,KAAV,CACE,aAAc,GAAe,MAAQ,OACrC,KAAK,gBAFP,EAIE,EAAA,EAAA,IAAA,CAAC,EAAS,QAAV,CAAkB,GAAG,kBAAkB,OAAO,eAC5C,EAAA,EAAA,IAAA,CAAC,EAAS,MAAV,CAAiB,CAAA,CACD,CAAA,GAClB,EAAA,EAAA,IAAA,CAAC,EAAS,WAAV,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAS,MAAV,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAS,KAAV,CAAA,SACG,CAAC,OAAQ,OAAO,CAAC,CAAC,IAAK,IACtB,EAAA,EAAA,KAAA,CAAC,EAAS,KAAV,CAA0B,MAAO,WAAjC,EACE,EAAA,EAAA,IAAA,CAAC,EAAS,SAAV,CAAA,SACG,EACC,mBAAmB,IAAS,OAAS,OAAS,SAChD,CACiB,CAAA,GACnB,EAAA,EAAA,IAAA,CAAC,EAAS,cAAV,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,cAAA,EAAa,CAAA,CACF,CAAA,CACX,GATK,CASL,CAChB,CACY,CAAA,CACD,CAAA,CACG,CAAA,CACR,GACH,CAAA,CAAA,GAEd,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,UACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,iJAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAW,KAAZ,CACE,aAAY,EAAE,2BAA2B,EACzC,eAAgB,GAAe,gBAAkB,GACjD,KAAK,iBACL,OAAO,KACP,MAAM,eAEN,EAAA,EAAA,IAAA,CAAC,EAAW,UAAZ,CAAuB,CAAA,CACR,CAAA,GACjB,EAAA,EAAA,IAAA,CAAC,EAAQ,MAAT,CAAe,UAAU,0BACtB,EAAE,2BAA2B,CACjB,CAAA,CACZ,GACO,CAAA,GAEd,EAAA,EAAA,KAAA,CAAC,EAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,SAAU,EACV,QAAS,EACT,KAAK,SACL,OAAO,cAEN,EAAE,oBAAoB,CACf,CAAA,GACV,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,SAAU,EACV,OAAO,UACP,KAAK,SACL,OAAO,cAEN,CACO,CAAA,CACE,CAAA,CAAA,CACV,GACD,CAAA,CAEX,CCrNA,IAAM,EAAa,CAAC,GAAI,GAAI,EAAE,EAG9B,SAAgB,EAAoB,CAClC,YACA,UACA,QACA,QACA,iBACA,oBACA,mBACA,iBACA,WACA,oBAC2B,CAC3B,GAAM,CAAE,KAAM,EAAe,EAE7B,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sFAAf,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,uDAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAM,QAAQ,QAAQ,kBAC3B,EAAE,2BAA4B,CAC7B,KAAM,EACN,GAAI,EACJ,OACF,CAAC,CACK,CAAA,EACP,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,OAAO,KAAK,QAAQ,mBAC1B,EAAE,wBAAyB,CAAE,OAAM,CAAC,CAC9B,CAAA,EACP,KACH,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,OAAO,KAAK,QAAQ,mBAC1B,EAAE,4BAA4B,CACxB,CAAA,EACP,KACH,IAAsB,MAInB,MAHF,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,OAAO,cACb,EAAE,sBAAsB,GAAmB,CACrC,CAAA,EAEV,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,WAAW,QACX,QAAS,EACT,KAAK,SACL,OAAO,cAEN,EAAE,0BAA0B,CACrB,CAAA,EACR,IACD,KAEL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,6CAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAM,QAAQ,QAAQ,kBAC3B,EAAE,sBAAsB,CACnB,CAAA,GACR,EAAA,EAAA,KAAA,CAAC,EAAS,KAAV,CACE,cAAgB,GAAU,CACpB,OAAO,GAAU,UAAU,EAAiB,CAAK,CACvD,EACA,MAAO,WAJT,EAME,EAAA,EAAA,IAAA,CAAC,EAAS,QAAV,CAAkB,aAAY,EAAE,sBAAsB,EAAG,OAAO,eAC9D,EAAA,EAAA,IAAA,CAAC,EAAS,MAAV,CAAiB,CAAA,CACD,CAAA,GAClB,EAAA,EAAA,IAAA,CAAC,EAAS,OAAV,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAS,WAAV,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAS,MAAV,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAS,KAAV,CAAA,SACG,EAAW,IAAK,IACf,EAAA,EAAA,KAAA,CAAC,EAAS,KAAV,CAA0B,MAAO,WAAjC,EACE,EAAA,EAAA,IAAA,CAAC,EAAS,SAAV,CAAA,SAAoB,CAAwB,CAAA,GAC5C,EAAA,EAAA,IAAA,CAAC,EAAS,cAAV,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,CAAA,CACU,CAAA,CACX,GALK,CAKL,CAChB,CACY,CAAA,CACD,CAAA,CACG,CAAA,CACN,CAAA,CACJ,GACZ,GACF,GAET,CCzFA,SAAgB,EAAiB,CAAE,SAAQ,aAAoC,CAC7E,GAAM,CAAE,KAAM,EAAe,EACvB,EAAY,EAAO,OAAS,UAElC,OACE,EAAA,EAAA,KAAA,CAAC,EAAQ,KAAT,CACE,YAAW,EAAY,SAAW,YAClC,KAAM,EAAY,SAAW,QAC7B,QAAS,EAAY,UAAY,kBAHnC,CAKG,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,cAAA,GAAY,UAAU,kBAAoB,CAAA,GAErD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAmB,cAAA,GAAY,UAAU,kBAAoB,CAAA,GAE/D,EAAA,EAAA,IAAA,CAAC,EAAQ,MAAT,CAAA,SAAgB,EAAO,OAAuB,CAAA,GAC9C,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,WAAW,QACX,aAAY,EAAE,cAAc,EAC5B,UAAU,UACV,QAAS,EACT,KAAK,SACL,OAAO,eAEP,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,cAAA,GAAY,UAAU,kBAAoB,CAAA,CACzC,CAAA,CACE,GAElB,CCrCA,SAAgB,EAAkB,CAChC,SACA,SACA,YACyB,CACzB,GAAM,CAAE,KAAM,EAAe,EACvB,EAAO,EAAE,yBAAyB,EAExC,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,wLAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACQ,OACN,MAAO,EAAE,0BAA0B,EACnC,MAAO,CACR,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CACQ,OACN,MAAO,EAAE,0BAA0B,EACnC,MAAO,CACR,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CACQ,OACN,MAAO,EAAE,4BAA4B,EACrC,MAAO,CACR,CAAA,CACE,GAET,CClCA,SAAS,EAAY,CAAE,YAAW,GAAG,GAAS,CAC7C,OAAuB,EAAA,EAAA,IAAA,CAAI,QAAS,CACnC,GAAG,EACH,UAAW,EAAgB,gBAAiB,CAAS,CACtD,CAAC,CACF,CCLA,SAAS,EAAe,CAAE,YAAW,GAAG,GAAS,CAChD,OAAuB,EAAA,EAAA,IAAA,CAAI,UAAW,CACrC,GAAG,EACH,UAAW,EAAgB,mBAAoB,CAAS,CACzD,CAAC,CACF,CCLA,SAAS,EAAY,CAAE,YAAW,GAAG,GAAS,CAC7C,OAAuB,EAAA,EAAA,IAAA,CAAI,KAAM,CAChC,GAAG,EACH,UAAW,EAAgB,gBAAiB,CAAS,CACtD,CAAC,CACF,CCLA,SAAS,EAAc,CAAE,YAAW,GAAG,GAAS,CAC/C,OAAuB,EAAA,EAAA,IAAA,CAAI,QAAS,CACnC,GAAG,EACH,UAAW,EAAgB,kBAAmB,CAAS,CACxD,CAAC,CACF,CCLA,SAAS,EAAY,CAAE,YAAW,GAAG,GAAS,CAC7C,OAAuB,EAAA,EAAA,IAAA,CAAI,KAAM,CAChC,GAAG,EACH,UAAW,EAAgB,gBAAiB,CAAS,CACtD,CAAC,CACF,CCLA,SAAS,EAAc,CAAE,YAAW,GAAG,GAAS,CAC/C,OAAuB,EAAA,EAAA,IAAA,CAAI,QAAS,CACnC,GAAG,EACH,UAAW,EAAgB,kBAAmB,CAAS,CACxD,CAAC,CACF,CCLA,SAAS,EAAY,CAAE,YAAW,qBAAoB,iBAAgB,eAAc,UAAU,cAAe,UAAU,GAAO,GAAG,GAAS,CACzI,GAAM,CAAE,UAAW,EAAyB,IAAK,EAAmB,GAAG,GAAuB,GAAkB,CAAC,EACjH,OAAuB,EAAA,EAAA,IAAA,CAAI,MAAO,CACjC,GAAG,EACH,UAAW,EAAgB,qBAAsB,EAAoB,CAAuB,EAC5F,IAAK,GAAgB,EACrB,UAA0B,EAAA,EAAA,IAAA,CAAI,QAAS,CACtC,GAAG,EACH,UAAW,EAAgB,WAAY,CAAS,EAChD,eAAgB,EAChB,eAAgB,EAAU,OAAS,IAAK,EACzC,CAAC,CACF,CAAC,CACF,CCbA,SAAS,EAAW,CAAE,YAAW,GAAG,GAAS,CAC5C,OAAuB,EAAA,EAAA,IAAA,CAAI,KAAM,CAChC,GAAG,EACH,UAAW,EAAgB,eAAgB,CAAS,CACrD,CAAC,CACF,CCCA,IAAM,EAAU,CACf,KAAM,EACN,QAAS,EACT,OAAQ,EACR,KAAM,EACN,OAAQ,EACR,IAAK,EACL,KAAM,EACN,KAAM,CACP,ECDA,SAAgB,GAAgB,CAC9B,QACA,SACA,YACuB,CACvB,GAAM,CAAE,KAAM,EAAe,EAE7B,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,2CACb,EAAA,EAAA,KAAA,CAAC,EAAQ,KAAT,CAAc,QAAQ,UAAU,QAAA,YAAhC,EACE,EAAA,EAAA,IAAA,CAAC,EAAQ,OAAT,CAAA,UACE,EAAA,EAAA,KAAA,CAAC,EAAQ,IAAT,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,SAAe,EAAE,qBAAqB,CAAgB,CAAA,GACtD,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,SAAe,EAAE,kBAAkB,CAAgB,CAAA,GACnD,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,SAAe,EAAE,oBAAoB,CAAgB,CAAA,GACrD,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,SAAe,EAAE,2BAA2B,CAAgB,CAAA,GAC5D,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,SAAe,EAAE,0BAA0B,CAAgB,CAAA,GAC3D,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,SAAe,EAAE,oBAAoB,CAAgB,CAAA,GACrD,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,SAAe,EAAE,qBAAqB,CAAgB,CAAA,CAC3C,CAAA,CAAA,CACC,CAAA,GAChB,EAAA,EAAA,KAAA,CAAC,EAAQ,KAAT,CAAA,SAAA,CACG,EAAM,IAAK,IACV,EAAA,EAAA,KAAA,CAAC,EAAQ,IAAT,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,UACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,0CAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,GAAG,MAAM,QAAQ,SAAS,OAAO,kBACtC,EAAY,KACP,CAAA,GAKR,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,GAAG,MACH,UAAU,4BACV,MAAM,QACN,SAAA,GACA,QAAQ,oBAER,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,8BACb,EAAY,GACT,CAAA,CACA,CAAA,CACL,GACO,CAAA,GAQd,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,UAAU,oBACV,OAAO,KACP,QAAS,EAAY,OAAS,QAAU,UAAY,IAAA,YAEnD,EAAgB,EAAG,EAAY,IAAI,CAC7B,CAAA,CACG,CAAA,GACd,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,UAAU,oBACV,OAAO,KACP,QACE,EAAY,aAAe,SAAW,UAAY,gBAGnD,EAAgB,EAAG,EAAY,UAAU,CACnC,CAAA,CACG,CAAA,GACd,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,SACG,EAAY,eAAiB,EAAE,YAAY,EAAI,EAAE,WAAW,CACjD,CAAA,GACd,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,SACG,EAAY,gBACT,EAAE,8BAA8B,EAChC,EAAY,cAAgB,EAC1B,EACE,EAAY,gBAAkB,EAC1B,kCACA,mCACJ,CAAE,MAAO,EAAY,aAAc,CACrC,EACA,EAAE,aAAa,CACT,CAAA,GACd,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,UAME,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,UAAU,oBACV,OAAO,KACP,QAAS,EAAY,WAAa,SAAW,mBAE5C,EAAY,WACT,EAAE,qBAAqB,EACvB,EAAE,oBAAoB,CACnB,CAAA,CACG,CAAA,GACd,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,SACG,EAAY,aAAe,YAC5B,CAAC,EAAY,YACX,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,kIAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,WAAW,QACX,aAAY,EAAE,uBAAwB,CACpC,MAAO,EAAY,KACrB,CAAC,EACD,YAAe,EAAO,CAAW,EACjC,KAAK,SACL,OAAO,cAEN,EAAE,kBAAkB,CACb,CAAA,GACV,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,WAAW,UACX,aAAY,EAAE,yBAA0B,CACtC,MAAO,EAAY,KACrB,CAAC,EACD,OAAO,SACP,YAAe,EAAS,CAAW,EACnC,KAAK,SACL,OAAO,cAEN,EAAE,oBAAoB,CACf,CAAA,CACP,KAEL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,UAAU,oBAAoB,OAAO,cAC3C,EAAE,sBAAsB,CAClB,CAAA,CAEC,CAAA,CACH,CAAA,EAnHK,EAAY,GAmHjB,CACd,EACA,EAAM,SAAW,GAChB,EAAA,EAAA,IAAA,CAAC,EAAQ,IAAT,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CACE,UAAU,uDACV,QAAS,WAER,EAAE,2BAA2B,CAClB,CAAA,CACH,CAAA,EACX,IACQ,CAAA,CAAA,CACF,GACX,CAAA,CAET,CCrJA,IAAM,GAA+B,CAAC,MAAO,WAAY,SAAU,QAAQ,EAE3E,SAAgB,GAAkB,CAChC,QACA,aACA,qBACA,sBACA,8BACA,WACA,WACA,oBACA,iBACyB,CACzB,GAAM,CAAE,KAAM,EAAe,EAE7B,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,8KAAf,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,yCAAf,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,6CAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,cAAA,GACA,UAAU,wCACX,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAM,QAAQ,QAAQ,iBAC3B,EAAE,8BAA8B,CAC3B,CAAA,CACL,KACL,EAAA,EAAA,IAAA,CAAC,EAAO,MAAR,CAAA,SAAe,EAAE,uBAAuB,CAAgB,CAAA,GACxD,EAAA,EAAA,IAAA,CAAC,EAAO,YAAR,CAAoB,UAAU,4BAC3B,EAAE,oBAAqB,CAAE,MAAO,CAAM,CAAC,CACtB,CAAA,CACjB,KAEL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sDAAf,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,qEAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,aAAY,EAAE,+BAA+B,EAC7C,UAAU,wCACV,SAAW,GAAU,EAAmB,EAAM,OAAO,KAAK,EAC1D,UAAY,GAAU,CAChB,EAAM,MAAQ,SAAS,EAAS,CACtC,EACA,YAAa,EAAE,+BAA+B,EAC9C,KAAK,SACL,OAAO,KACP,MAAO,CACR,CAAA,GAQD,EAAA,EAAA,IAAA,CAAC,EAAQ,KAAT,CAAA,UACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,iJAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAW,KAAZ,CACE,aAAY,EAAE,4BAA4B,EAC1C,QAAS,EACT,gBAAkB,GAChB,EAA4B,IAAY,EAAI,EAE9C,OAAO,eAEP,EAAA,EAAA,IAAA,CAAC,EAAW,UAAZ,CAAuB,CAAA,CACR,CAAA,GACjB,EAAA,EAAA,IAAA,CAAC,EAAQ,MAAT,CAAe,UAAU,0BACtB,EAAE,4BAA4B,CAClB,CAAA,CACZ,GACO,CAAA,GAEd,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,WAAW,UACX,QAAS,EACT,KAAK,SACL,OAAO,cAJT,EAME,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,cAAA,GAAY,UAAU,kBAAoB,CAAA,EACrD,EAAE,oBAAoB,CACf,KACV,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,OAAO,UACP,QAAS,EACT,KAAK,SACL,OAAO,cAJT,EAME,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,cAAA,GAAY,UAAU,kBAAoB,CAAA,EACnD,EAAE,oBAAoB,CACf,GACP,KAEL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,+IACZ,GAAc,IAAK,IAClB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,WAAY,IAAsB,EAAS,QAAU,QACrD,OAAQ,IAAsB,EAAS,UAAY,IAAA,GAEnD,YAAe,EAAc,CAAM,EACnC,KAAK,SACL,OAAO,cAEN,EAAE,sBAAsB,GAAQ,CACzB,EANH,CAMG,CACX,CACE,CAAA,CACF,GACF,GAET,CCvFA,SAASwB,IAAiB,CACxB,IAAMC,EAAOF,EAAMG,gBAAgB,CAAEC,OAASC,GAAYA,EAAQH,IAAK,CAAC,EAMxE,OAJIA,GAAMI,OAAS,SAIZ,EAAA,EAAA,IAAA,CAAC,GAAD,CAAsBJ,MAAK,CAAA,GAHzB,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,OAAO,iBAAiB,CAAA,CAIpD,CAEA,SAASK,GAAe,CAAEL,QAA+B,CACvD,GAAM,CAAEO,KAAMC,GAAW/B,EAAiBoB,CAAqB,EAI/D,OAHKW,EAAOC,MAAMC,SAGX,EAAA,EAAA,IAAA,CAAC,GAAD,CAAyBV,MAAK,CAAA,GAF5B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,OAAO,kBAAkB,CAAA,CAGrD,CAEA,SAASW,GAAkB,CAAEX,QAA+B,CAC1D,GAAM,CAAEY,GAAM9B,EAAe,EACvB+B,EAAcrC,EAAe,EAC7B,CAACsC,EAAYC,IAAAA,EAAAA,EAAAA,SAAAA,CAA0B,EAAE,EACzC,CAACC,EAAqBC,IAAAA,EAAAA,EAAAA,SAAAA,CAAmC,EAAK,EAC9D,CAACC,EAASC,IAAAA,EAAAA,EAAAA,SAAAA,KAA6BxB,EAAyB,CAAC,EACjE,CAACyB,EAAQC,IAAAA,EAAAA,EAAAA,SAAAA,CAAmC,IAAI,EAChD,CAACE,EAAOC,IAAAA,EAAAA,EAAAA,SAAAA,CAAqC,IAAI,EACjD,CAAEjB,QAAS9B,EAAiBe,EAAuB0B,CAAO,CAAC,EAE3DQ,EAAcnB,EAAKoB,MAAMC,OAC5BC,GAAgB,CAACA,EAAYC,UAChC,CAAC,CAACC,OACIC,EAAczB,EAAKoB,MAAMC,OAC5BC,GAAgBA,EAAYI,aAAe,QAC9C,CAAC,CAACF,OACIG,EAAgB3B,EAAKoB,MAAMC,OAC9BC,GAAgBA,EAAYI,aAAe,UAC9C,CAAC,CAACF,OACII,EAAoBhD,EAAqB+B,CAAO,EAChDkB,EACJlB,EAAQmB,QAAU,IAClBnB,EAAQoB,gBACRpB,EAAQqB,YAAcC,IAAAA,IACtBtB,EAAQd,OAASoC,IAAAA,GACbC,EACJlC,EAAKmC,WAAWC,QAAU,EACtB,GACCpC,EAAKmC,WAAWE,KAAO,GAAKrC,EAAKmC,WAAWG,UAAY,EACzDC,EAAUC,KAAKC,IACnBzC,EAAKmC,WAAWE,KAAOrC,EAAKmC,WAAWG,UACvCtC,EAAKmC,WAAWC,KAClB,EAEMM,EAAYC,GAAoB7B,EAAU,CAAE8B,KAAM,UAAWD,SAAQ,CAAC,EACtEE,MACJ/B,EAAU,CAAE8B,KAAM,QAASD,QAAStC,EAAE,6BAA6B,CAAE,CAAC,EAElEyC,EAAiB9E,EAAY,CACjC+E,WAAY7D,GACZ8D,WAAY,CAAEvD,KAAMwD,KAAe,CACjC,EAAiBC,kBAAkB,CAAEC,SAAU,CAAC,QAAS,OAAO,CAAE,CAAC,EACnET,EAASrC,EAAE,4BAA6B,CAAE+C,MAAOH,EAASG,KAAM,CAAC,CAAC,EAClEnC,EAAS,IAAI,CACf,EACAoC,QAASR,CACX,CAAC,EAEKS,EAAiBtF,EAAY,CACjC+E,WAAY1D,EACZ2D,WAAY,CAAEvD,KAAMwD,KAAe,CACjC,EAAiBC,kBAAkB,CAAEC,SAAU,CAAC,QAAS,OAAO,CAAE,CAAC,EACnET,EAASrC,EAAE,4BAA6B,CAAE+C,MAAOH,EAASG,KAAM,CAAC,CAAC,EAClEnC,EAAS,IAAI,CACf,EACAoC,QAASR,CACX,CAAC,EAEKU,EAAiBvF,EAAY,CACjC+E,WAAY5D,EACZ6D,WAAY,CAAEvD,KAAMwD,KAAe,CACjC,EAAiBC,kBAAkB,CAAEC,SAAU,CAAC,QAAS,OAAO,CAAE,CAAC,EACnET,EAASrC,EAAE,4BAA6B,CAAE+C,MAAOH,EAASG,KAAM,CAAC,CAAC,EAClEnC,EAAS,IAAI,CACf,EACAoC,QAASR,CACX,CAAC,EAEKW,EACJV,EAAeW,WACfH,EAAeG,WACfF,EAAeE,UA+BjB,OACE,EAAA,EAAA,KAAA,CAAC,GAAD,CACE,QAAQ,QACR,YAAapD,EAAE,yBAAyB,EACxC,MAAOA,EAAE,mBAAmB,EACtBZ,gBAJR,EAME,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ0B,EACR,OAAQM,EACR,SAAUE,CAAc,CAAA,EAGzBd,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAA0BA,SAAQ,cAAiBC,EAAU,IAAI,CAAE,CAAA,EACjE,MAEJ,EAAA,EAAA,IAAA,CAAC,EAAO,KAAR,CACE,UAAU,yCACV,cAAY,wBACZ,QAAQ,qBAER,EAAA,EAAA,KAAA,CAAC,EAAO,QAAR,CAAgB,UAAU,+BAA1B,EACE,EAAA,EAAA,IAAA,CAAC,GAAD,CACqBc,oBACEnB,sBACTF,aACZ,aAAgBU,EAAS,CAAEgD,KAAM,QAAS,CAAC,EAC3C,4BAA6BvD,EAC7B,mBAAoBF,EACpB,cA5CgBuD,GAA4B,CACpDnD,EAAY+C,IAAa,CACvB,GAAGA,EACHtB,KAAM,EACNL,UACE+B,IAAe,WACX,WACAA,IAAe,SACb,SACA9B,IAAAA,GACRpC,KAAMkE,IAAe,SAAW,QAAU9B,IAAAA,EAC5C,EAAE,CACJ,EAiCU,aA5DgB,CACxBrB,EAAY+C,IAAa,CACvB,GAAGA,EACH7B,MAAOvB,EAAWqD,KAAK,EACvB7B,eAAgBtB,EAChB4B,KAAM,CACR,EAAE,CACJ,EAsDU,MAAOrC,EAAKmC,WAAWC,KAAM,CAAA,GAG/B,EAAA,EAAA,IAAA,CAAC,EAAD,CACqBR,oBACDC,mBAClB,eAAgBlB,EAAQoB,eACxB,mBA3DiB,CACzBvB,EAAc,EAAE,EAChBE,EAAuB,EAAK,EAC5BE,EAAWxB,EAAyB,CAAC,CACvC,EAwDU,iBAAmB8E,GACjBtD,EAAY+C,IAAa,CAAE,GAAGA,EAAStB,KAAM,EAAG6B,UAAS,EAAE,EAEpD3B,UACT,SAAU5B,EAAQuD,SACPhC,YACX,MAAOvB,EAAQmB,MACf,MAAO9B,EAAKmC,WAAWC,KAAM,CAAA,GAG/B,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,SAAWd,GACTL,EAAS,CAAEgD,KAAM,SAAUxE,KAAM6B,CAAY,CAAC,EAEhD,OAASA,GACPL,EAAS,CAAEgD,KAAM,OAAQxE,KAAM6B,CAAY,CAAC,EAE9C,MAAOtB,EAAKoB,KAAM,CAAA,GAGpB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sIAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,WAAW,UACX,SAAUT,EAAQ0B,MAAQ,EAC1B,YACEzB,EAAY+C,IAAa,CACvB,GAAGA,EACHtB,KAAMsB,EAAQtB,KAAO,CACvB,EAAE,EAEJ,KAAK,SACL,OAAO,cAENhC,EAAE,sBAAsB,CACjB,CAAA,GACV,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,OAAO,cACbA,EAAE,mBAAoB,CAAEgC,KAAMrC,EAAKmC,WAAWE,IAAK,CAAC,CAC9C,CAAA,GACT,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,WAAW,UACX,SACErC,EAAKmC,WAAWE,KAAOrC,EAAKmC,WAAWG,WACvCtC,EAAKmC,WAAWC,MAElB,YACExB,EAAY+C,IAAa,CACvB,GAAGA,EACHtB,KAAMsB,EAAQtB,KAAO,CACvB,EAAE,EAEJ,KAAK,SACL,OAAO,cAENhC,EAAE,kBAAkB,CACb,CAAA,CACP,GACS,GACL,CAAA,GAEb,EAAA,EAAA,IAAA,CAAC,EAAD,CACcmD,aACLxC,QACP,YAAeC,EAAS,IAAI,EAC5B,SAAWkD,GAAWrB,EAAesB,OAAOD,CAAM,EAClD,SAAWE,GAAQd,EAAea,OAAOC,CAAG,EAC5C,SAAWF,GAAWb,EAAec,OAAOD,CAAM,CAAE,CAAA,CAE5C,GAEhB"}
|
|
1
|
+
{"version":3,"file":"users-COM7u3A-.js","names":["useMutation","useQueryClient","useSuspenseQuery","TRBadge","TRButton","TRCard","useState","useTranslation","AdminGateScreen","AdminShell","AdminUserFormModal","AdminUsersFilterBar","getActiveQuickFilter","AdminUsersNotice","AdminUsersSummary","AdminUsersTable","AdminUsersToolbar","adminUsersQueryOptions","createAdminUser","deleteAdminUser","normalizeAdminUsersQuery","updateAdminUser","appConfigQueryOptions","Route","AdminUsersPage","user","useRouteContext","select","context","role","AdminUsersGate","SessionUser","data","config","admin","enabled","AdminUsersContent","t","queryClient","draftQuery","setDraftQuery","draftIncludeDeleted","setDraftIncludeDeleted","filters","setFilters","notice","setNotice","NoticeState","modal","setModal","UserModalState","activeUsers","users","filter","managedUser","deleted_at","length","configUsers","managed_by","databaseUsers","activeQuickFilter","hasActiveFilters","query","includeDeleted","managedBy","undefined","pageStart","pagination","total","page","page_size","pageEnd","Math","min","noticeOn","message","tone","noticeFail","createMutation","mutationFn","onSuccess","nextUser","invalidateQueries","queryKey","email","onError","updateMutation","deleteMutation","isMutating","isPending","applySearch","current","trim","clearFilters","applyQuickFilter","nextFilter","QuickFilter","type","pageSize","values","mutate","sub","component"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/search.mjs","../../../frontend/src/features/admin/users/admin-users-filters.ts","../../../frontend/src/features/admin/users/admin-user-form-modal.tsx","../../../frontend/src/features/admin/users/admin-users-filter-bar.tsx","../../../frontend/src/features/admin/users/admin-users-notice.tsx","../../../frontend/src/features/admin/users/admin-users-summary.tsx","../../../../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/table/table-body.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/table/table-caption.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/table/table-cell.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/table/table-footer.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/table/table-head.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/table/table-header.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/table/table-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/table/table-row.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/table/index.js","../../../frontend/src/features/admin/users/admin-users-table.tsx","../../../frontend/src/features/admin/users/admin-users-toolbar.tsx","../../../frontend/src/routes/admin/users/index.tsx?tsr-split=component"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.mjs.map\n","import type {\n AdminUser,\n normalizeAdminUsersQuery,\n} from '#frontend/queries/admin-users.ts';\n\nexport type QuickFilter = 'all' | 'database' | 'config' | 'admins';\n\nexport type NoticeState = {\n tone: 'success' | 'error';\n message: string;\n} | null;\n\nexport type UserModalState =\n | { type: 'create' }\n | { type: 'edit'; user: AdminUser }\n | { type: 'delete'; user: AdminUser }\n | null;\n\nexport function parseUserRole(\n value: FormDataEntryValue | null,\n): 'user' | 'admin' {\n return value === 'admin' ? 'admin' : 'user';\n}\n\nexport function getActiveQuickFilter(\n filters: ReturnType<typeof normalizeAdminUsersQuery>,\n): QuickFilter {\n if (filters.role === 'admin') return 'admins';\n if (filters.managedBy === 'database') return 'database';\n if (filters.managedBy === 'config') return 'config';\n return 'all';\n}\n","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCheckbox } from '@tinyrack/ui/components/checkbox';\nimport { TRField } from '@tinyrack/ui/components/field';\nimport { TRInput } from '@tinyrack/ui/components/input';\nimport { TRSelect } from '@tinyrack/ui/components/select';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { CheckIcon, TriangleAlertIcon } from 'lucide-react';\nimport type { FormEvent } from 'react';\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Modal, ModalActions } from '#frontend/components/ui/modal.tsx';\nimport {\n parseUserRole,\n type UserModalState,\n} from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUserFormModalProps = {\n modal: UserModalState;\n isMutating: boolean;\n onClose: () => void;\n onCreate: (values: {\n email: string;\n password: string;\n role: 'user' | 'admin';\n email_verified: boolean;\n }) => void;\n onUpdate: (values: {\n sub: string;\n email: string;\n role: 'user' | 'admin';\n email_verified: boolean;\n }) => void;\n onDelete: (sub: string) => void;\n};\n\nexport function AdminUserFormModal({\n modal,\n isMutating,\n onClose,\n onCreate,\n onUpdate,\n onDelete,\n}: AdminUserFormModalProps) {\n const { t } = useTranslation();\n const defaultValues = useMemo(\n () => (modal?.type === 'edit' ? modal.user : null),\n [modal],\n );\n\n if (!modal) return null;\n\n if (modal.type === 'delete') {\n return (\n <Modal\n isOpen\n onClose={onClose}\n title={t('admin.users.deleteTitle', { email: modal.user.email })}\n variant=\"destructive\"\n >\n <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\">\n <div className=\"flex items-center gap-tinyrack-sm\">\n <TriangleAlertIcon aria-hidden className=\"size-tinyrack-lg\" />\n <TRText as=\"p\" weight=\"medium\">\n {t('admin.users.deleteWarning')}\n </TRText>\n </div>\n <TRText as=\"p\" variant=\"bodySm\">\n {t('admin.users.deleteDescription')}\n </TRText>\n </div>\n <ModalActions>\n <TRButton\n disabled={isMutating}\n onClick={onClose}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.cancel')}\n </TRButton>\n <TRButton\n disabled={isMutating}\n intent=\"danger\"\n onClick={() => onDelete(modal.user.sub)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.deleteConfirm')}\n </TRButton>\n </ModalActions>\n </Modal>\n );\n }\n\n const title =\n modal.type === 'create'\n ? t('admin.users.create')\n : t('admin.users.editTitle');\n const submit =\n modal.type === 'create'\n ? t('admin.users.createSubmit')\n : t('admin.users.save');\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n const values = {\n email: String(formData.get('email') ?? ''),\n role: parseUserRole(formData.get('role')),\n email_verified: formData.get('email_verified') === 'on',\n };\n if (modal.type === 'create') {\n onCreate({\n ...values,\n password: String(formData.get('password') ?? ''),\n });\n } else {\n onUpdate({ sub: modal.user.sub, ...values });\n }\n };\n\n return (\n <Modal\n description={\n modal.type === 'create'\n ? t('admin.users.createHint')\n : t('admin.users.editHint')\n }\n isOpen\n onClose={onClose}\n title={title}\n >\n <form\n className=\"mt-tinyrack-lg flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit}\n >\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-email\">\n {t('profile.email.label')}\n </TRField.Label>\n <TRInput\n defaultValue={defaultValues?.email ?? ''}\n id=\"admin-user-email\"\n name=\"email\"\n required\n type=\"email\"\n uiSize=\"sm\"\n />\n </TRField.Root>\n\n {modal.type === 'create' ? (\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-password\">\n {t('admin.users.password')}\n </TRField.Label>\n <TRInput\n id=\"admin-user-password\"\n name=\"password\"\n required\n type=\"password\"\n uiSize=\"sm\"\n />\n </TRField.Root>\n ) : null}\n\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-role\">\n {t('admin.users.role')}\n </TRField.Label>\n <TRSelect.Root\n defaultValue={defaultValues?.role ?? 'user'}\n name=\"role\"\n >\n <TRSelect.Trigger id=\"admin-user-role\" uiSize=\"sm\">\n <TRSelect.Value />\n </TRSelect.Trigger>\n <TRSelect.Positioner>\n <TRSelect.Popup>\n <TRSelect.List>\n {['user', 'admin'].map((role) => (\n <TRSelect.Item key={role} value={role}>\n <TRSelect.ItemText>\n {t(\n `admin.users.role${role === 'user' ? 'User' : 'Admin'}`,\n )}\n </TRSelect.ItemText>\n <TRSelect.ItemIndicator>\n <CheckIcon aria-hidden />\n </TRSelect.ItemIndicator>\n </TRSelect.Item>\n ))}\n </TRSelect.List>\n </TRSelect.Popup>\n </TRSelect.Positioner>\n </TRSelect.Root>\n </TRField.Root>\n\n <TRField.Root>\n <div className=\"flex items-center gap-tinyrack-md rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface px-tinyrack-md py-tinyrack-sm\">\n <TRCheckbox.Root\n aria-label={t('admin.users.emailVerified')}\n defaultChecked={defaultValues?.email_verified ?? false}\n name=\"email_verified\"\n uiSize=\"md\"\n value=\"on\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n <TRField.Label className=\"cursor-pointer\">\n {t('admin.users.emailVerified')}\n </TRField.Label>\n </div>\n </TRField.Root>\n\n <ModalActions>\n <TRButton\n disabled={isMutating}\n onClick={onClose}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.cancel')}\n </TRButton>\n <TRButton\n disabled={isMutating}\n intent=\"primary\"\n type=\"submit\"\n uiSize=\"sm\"\n >\n {submit}\n </TRButton>\n </ModalActions>\n </form>\n </Modal>\n );\n}\n","import { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRSelect } from '@tinyrack/ui/components/select';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { CheckIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport type { QuickFilter } from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUsersFilterBarProps = {\n pageStart: number;\n pageEnd: number;\n total: number;\n query: string;\n includeDeleted: boolean;\n activeQuickFilter: QuickFilter;\n hasActiveFilters: boolean;\n onClearFilters: () => void;\n pageSize: number;\n onPageSizeChange: (pageSize: number) => void;\n};\n\nconst PAGE_SIZES = [10, 20, 50];\n\n/** What the current result set is filtered by, and how much of it is shown. */\nexport function AdminUsersFilterBar({\n pageStart,\n pageEnd,\n total,\n query,\n includeDeleted,\n activeQuickFilter,\n hasActiveFilters,\n onClearFilters,\n pageSize,\n onPageSizeChange,\n}: AdminUsersFilterBarProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-tinyrack-md px-tinyrack-xl\">\n <div className=\"flex flex-wrap items-center gap-tinyrack-sm\">\n <TRText color=\"muted\" variant=\"bodySm\">\n {t('admin.users.showingRange', {\n from: pageStart,\n to: pageEnd,\n total,\n })}\n </TRText>\n {query ? (\n <TRBadge uiSize=\"md\" variant=\"neutral\">\n {t('admin.users.queryChip', { query })}\n </TRBadge>\n ) : null}\n {includeDeleted ? (\n <TRBadge uiSize=\"md\" variant=\"warning\">\n {t('admin.users.includeDeleted')}\n </TRBadge>\n ) : null}\n {activeQuickFilter !== 'all' ? (\n <TRBadge uiSize=\"md\">\n {t(`admin.users.filter.${activeQuickFilter}`)}\n </TRBadge>\n ) : null}\n {hasActiveFilters ? (\n <TRButton\n appearance=\"ghost\"\n onClick={onClearFilters}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.clearFilters')}\n </TRButton>\n ) : null}\n </div>\n\n <div className=\"flex items-center gap-tinyrack-sm\">\n <TRText color=\"muted\" variant=\"bodySm\">\n {t('admin.users.pageSize')}\n </TRText>\n <TRSelect.Root\n onValueChange={(value) => {\n if (typeof value === 'number') onPageSizeChange(value);\n }}\n value={pageSize}\n >\n <TRSelect.Trigger aria-label={t('admin.users.pageSize')} uiSize=\"sm\">\n <TRSelect.Value />\n </TRSelect.Trigger>\n <TRSelect.Portal>\n <TRSelect.Positioner>\n <TRSelect.Popup>\n <TRSelect.List>\n {PAGE_SIZES.map((size) => (\n <TRSelect.Item key={size} value={size}>\n <TRSelect.ItemText>{size}</TRSelect.ItemText>\n <TRSelect.ItemIndicator>\n <CheckIcon />\n </TRSelect.ItemIndicator>\n </TRSelect.Item>\n ))}\n </TRSelect.List>\n </TRSelect.Popup>\n </TRSelect.Positioner>\n </TRSelect.Portal>\n </TRSelect.Root>\n </div>\n </div>\n );\n}\n","import { TRAlert } from '@tinyrack/ui/components/alert';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { CheckIcon, TriangleAlertIcon, XIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport type { NoticeState } from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUsersNoticeProps = {\n notice: NonNullable<NoticeState>;\n onDismiss: () => void;\n};\n\n/**\n * Result of the last create/update/delete.\n *\n * Stays an inline banner rather than becoming a toast now that the shell\n * mounts a viewport: Base UI renders toasts as `dialog`/`alertdialog` inside a\n * `region`, never as a live `status`, so a toast would silently drop the\n * polite announcement this makes.\n */\nexport function AdminUsersNotice({ notice, onDismiss }: AdminUsersNoticeProps) {\n const { t } = useTranslation();\n const isSuccess = notice.tone === 'success';\n\n return (\n <TRAlert.Root\n aria-live={isSuccess ? 'polite' : 'assertive'}\n role={isSuccess ? 'status' : 'alert'}\n variant={isSuccess ? 'success' : 'danger'}\n >\n {isSuccess ? (\n <CheckIcon aria-hidden className=\"size-tinyrack-xl\" />\n ) : (\n <TriangleAlertIcon aria-hidden className=\"size-tinyrack-xl\" />\n )}\n <TRAlert.Title>{notice.message}</TRAlert.Title>\n <TRButton\n appearance=\"ghost\"\n aria-label={t('common.close')}\n className=\"ms-auto\"\n onClick={onDismiss}\n type=\"button\"\n uiSize=\"sm\"\n >\n <XIcon aria-hidden className=\"size-tinyrack-lg\" />\n </TRButton>\n </TRAlert.Root>\n );\n}\n","import { useTranslation } from 'react-i18next';\nimport { AdminStat } from '#frontend/features/admin/admin-stat.tsx';\n\ntype AdminUsersSummaryProps = {\n active: number;\n config: number;\n database: number;\n};\n\n/** Counts for the page currently in view, not the whole directory. */\nexport function AdminUsersSummary({\n active,\n config,\n database,\n}: AdminUsersSummaryProps) {\n const { t } = useTranslation();\n const hint = t('admin.users.currentPage');\n\n return (\n <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\">\n <AdminStat\n hint={hint}\n label={t('admin.users.activeOnPage')}\n value={active}\n />\n <AdminStat\n hint={hint}\n label={t('admin.users.configOnPage')}\n value={config}\n />\n <AdminStat\n hint={hint}\n label={t('admin.users.databaseOnPage')}\n value={database}\n />\n </div>\n );\n}\n","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-body.tsx\nfunction TRTableBody({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"tbody\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-body\", className)\n\t});\n}\n//#endregion\nexport { TRTableBody };\n\n//# sourceMappingURL=table-body.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-caption.tsx\nfunction TRTableCaption({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"caption\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-caption\", className)\n\t});\n}\n//#endregion\nexport { TRTableCaption };\n\n//# sourceMappingURL=table-caption.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-cell.tsx\nfunction TRTableCell({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"td\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-cell\", className)\n\t});\n}\n//#endregion\nexport { TRTableCell };\n\n//# sourceMappingURL=table-cell.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-footer.tsx\nfunction TRTableFooter({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"tfoot\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-footer\", className)\n\t});\n}\n//#endregion\nexport { TRTableFooter };\n\n//# sourceMappingURL=table-footer.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-head.tsx\nfunction TRTableHead({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"th\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-head\", className)\n\t});\n}\n//#endregion\nexport { TRTableHead };\n\n//# sourceMappingURL=table-head.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-header.tsx\nfunction TRTableHeader({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"thead\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-header\", className)\n\t});\n}\n//#endregion\nexport { TRTableHeader };\n\n//# sourceMappingURL=table-header.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-root.tsx\nfunction TRTableRoot({ className, containerClassName, containerProps, containerRef, density = \"comfortable\", striped = false, ...props }) {\n\tconst { className: containerPropsClassName, ref: containerPropsRef, ...restContainerProps } = containerProps ?? {};\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\t...restContainerProps,\n\t\tclassName: mergeClassNames(\"tr-table-container\", containerClassName, containerPropsClassName),\n\t\tref: containerRef ?? containerPropsRef,\n\t\tchildren: /* @__PURE__ */ jsx(\"table\", {\n\t\t\t...props,\n\t\t\tclassName: mergeClassNames(\"tr-table\", className),\n\t\t\t\"data-density\": density,\n\t\t\t\"data-striped\": striped ? \"true\" : void 0\n\t\t})\n\t});\n}\n//#endregion\nexport { TRTableRoot };\n\n//# sourceMappingURL=table-root.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-row.tsx\nfunction TRTableRow({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"tr\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-row\", className)\n\t});\n}\n//#endregion\nexport { TRTableRow };\n\n//# sourceMappingURL=table-row.js.map","import { TRTableBody } from \"./table-body.js\";\nimport { TRTableCaption } from \"./table-caption.js\";\nimport { TRTableCell } from \"./table-cell.js\";\nimport { TRTableFooter } from \"./table-footer.js\";\nimport { TRTableHead } from \"./table-head.js\";\nimport { TRTableHeader } from \"./table-header.js\";\nimport { TRTableRoot } from \"./table-root.js\";\nimport { TRTableRow } from \"./table-row.js\";\n//#region src/components/table/index.tsx\nconst TRTable = {\n\tRoot: TRTableRoot,\n\tCaption: TRTableCaption,\n\tHeader: TRTableHeader,\n\tBody: TRTableBody,\n\tFooter: TRTableFooter,\n\tRow: TRTableRow,\n\tHead: TRTableHead,\n\tCell: TRTableCell\n};\n//#endregion\nexport { TRTable, TRTableBody, TRTableCaption, TRTableCell, TRTableFooter, TRTableHead, TRTableHeader, TRTableRoot, TRTableRow };\n\n//# sourceMappingURL=index.js.map","import { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRTable } from '@tinyrack/ui/components/table';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { useTranslation } from 'react-i18next';\nimport {\n formatAdminRole,\n formatManagedBy,\n} from '#frontend/features/admin/format-admin-user.ts';\nimport type { AdminUser } from '#frontend/queries/admin-users.ts';\n\ntype AdminUsersTableProps = {\n users: AdminUser[];\n onEdit: (user: AdminUser) => void;\n onDelete: (user: AdminUser) => void;\n};\n\nexport function AdminUsersTable({\n users,\n onEdit,\n onDelete,\n}: AdminUsersTableProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"overflow-x-auto pb-tinyrack-sm\">\n <TRTable.Root density=\"compact\" striped>\n <TRTable.Header>\n <TRTable.Row>\n <TRTable.Head>{t('profile.email.label')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.role')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.source')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.emailVerified')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.secondFactor')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.status')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.actions')}</TRTable.Head>\n </TRTable.Row>\n </TRTable.Header>\n <TRTable.Body>\n {users.map((managedUser) => (\n <TRTable.Row key={managedUser.sub}>\n <TRTable.Cell>\n <div className=\"flex flex-col gap-tinyrack-3xs\">\n <TRText as=\"div\" variant=\"bodySm\" weight=\"medium\">\n {managedUser.email}\n </TRText>\n {/*\n Mono on a bare span: a font utility on `TRText` loses to\n the component's own per-variant `font-family` rule.\n */}\n <TRText\n as=\"div\"\n className=\"max-w-tinyrack-measure-lg\"\n color=\"muted\"\n truncate\n variant=\"caption\"\n >\n <span className=\"font-tinyrack-mono\">\n {managedUser.sub}\n </span>\n </TRText>\n </div>\n </TRTable.Cell>\n {/*\n `whitespace-nowrap` on every badge: without it a narrow\n viewport squeezes these columns until the labels break one\n letter per line. Keeping them intact makes the table wider\n than the phone, which is what the horizontal scroller below\n is for.\n */}\n <TRTable.Cell>\n <TRBadge\n className=\"whitespace-nowrap\"\n uiSize=\"md\"\n variant={managedUser.role === 'admin' ? 'neutral' : undefined}\n >\n {formatAdminRole(t, managedUser.role)}\n </TRBadge>\n </TRTable.Cell>\n <TRTable.Cell>\n <TRBadge\n className=\"whitespace-nowrap\"\n uiSize=\"md\"\n variant={\n managedUser.managed_by === 'config' ? 'warning' : 'info'\n }\n >\n {formatManagedBy(t, managedUser.managed_by)}\n </TRBadge>\n </TRTable.Cell>\n <TRTable.Cell>\n {managedUser.email_verified ? t('common.yes') : t('common.no')}\n </TRTable.Cell>\n <TRTable.Cell>\n {managedUser.totp_registered\n ? t('admin.users.secondFactorTotp')\n : managedUser.passkey_count > 0\n ? t(\n managedUser.passkey_count === 1\n ? 'admin.users.secondFactorPasskey'\n : 'admin.users.secondFactorPasskeys',\n { count: managedUser.passkey_count },\n )\n : t('common.none')}\n </TRTable.Cell>\n <TRTable.Cell>\n {/*\n `variant` here is a test contract: the directory test reads\n `[data-variant=\"success\"]` out of the row to assert the\n status. Changing these tones breaks it.\n */}\n <TRBadge\n className=\"whitespace-nowrap\"\n uiSize=\"md\"\n variant={managedUser.deleted_at ? 'danger' : 'success'}\n >\n {managedUser.deleted_at\n ? t('admin.users.deleted')\n : t('admin.users.active')}\n </TRBadge>\n </TRTable.Cell>\n <TRTable.Cell>\n {managedUser.managed_by === 'database' &&\n !managedUser.deleted_at ? (\n <div className=\"inline-flex items-center whitespace-nowrap rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface-muted\">\n <TRButton\n appearance=\"ghost\"\n aria-label={t('admin.users.editUser', {\n email: managedUser.email,\n })}\n onClick={() => onEdit(managedUser)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.edit')}\n </TRButton>\n <TRButton\n appearance=\"outline\"\n aria-label={t('admin.users.deleteUser', {\n email: managedUser.email,\n })}\n intent=\"danger\"\n onClick={() => onDelete(managedUser)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.delete')}\n </TRButton>\n </div>\n ) : (\n <TRBadge className=\"whitespace-nowrap\" uiSize=\"md\">\n {t('admin.users.readonly')}\n </TRBadge>\n )}\n </TRTable.Cell>\n </TRTable.Row>\n ))}\n {users.length === 0 ? (\n <TRTable.Row>\n <TRTable.Cell\n className=\"py-tinyrack-3xl text-center text-tinyrack-text-muted\"\n colSpan={7}\n >\n {t('admin.users.emptyFiltered')}\n </TRTable.Cell>\n </TRTable.Row>\n ) : null}\n </TRTable.Body>\n </TRTable.Root>\n </div>\n );\n}\n","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCard } from '@tinyrack/ui/components/card';\nimport { TRCheckbox } from '@tinyrack/ui/components/checkbox';\nimport { TRField } from '@tinyrack/ui/components/field';\nimport { TRInput } from '@tinyrack/ui/components/input';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { PlusIcon, SearchIcon, UsersIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport type { QuickFilter } from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUsersToolbarProps = {\n total: number;\n draftQuery: string;\n onDraftQueryChange: (value: string) => void;\n draftIncludeDeleted: boolean;\n onDraftIncludeDeletedChange: (value: boolean) => void;\n onSearch: () => void;\n onCreate: () => void;\n activeQuickFilter: QuickFilter;\n onQuickFilter: (filter: QuickFilter) => void;\n};\n\nconst QUICK_FILTERS: QuickFilter[] = ['all', 'database', 'config', 'admins'];\n\nexport function AdminUsersToolbar({\n total,\n draftQuery,\n onDraftQueryChange,\n draftIncludeDeleted,\n onDraftIncludeDeletedChange,\n onSearch,\n onCreate,\n activeQuickFilter,\n onQuickFilter,\n}: AdminUsersToolbarProps) {\n const { t } = useTranslation();\n\n return (\n <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\">\n <div className=\"flex flex-col gap-tinyrack-sm\">\n <div className=\"flex items-center gap-tinyrack-sm\">\n <UsersIcon\n aria-hidden\n className=\"size-tinyrack-lg text-tinyrack-success\"\n />\n <TRText color=\"muted\" variant=\"label\">\n {t('admin.users.directoryEyebrow')}\n </TRText>\n </div>\n <TRCard.Title>{t('admin.users.directory')}</TRCard.Title>\n <TRCard.Description className=\"text-tinyrack-sm\">\n {t('admin.users.total', { count: total })}\n </TRCard.Description>\n </div>\n\n <div className=\"flex flex-col gap-tinyrack-md xl:items-end\">\n <div className=\"flex flex-col gap-tinyrack-sm lg:flex-row lg:items-center\">\n <TRInput\n aria-label={t('admin.users.searchPlaceholder')}\n className=\"w-full lg:w-tinyrack-overlay-width-sm\"\n onChange={(event) => onDraftQueryChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') onSearch();\n }}\n placeholder={t('admin.users.searchPlaceholder')}\n type=\"search\"\n uiSize=\"sm\"\n value={draftQuery}\n />\n\n {/*\n `aria-label` rather than relying on the label association: the\n design system's checkbox is a `button[role=checkbox]`, and the\n accessible-name path through `Field.Label` for a non-input control\n is not something to gamble a test contract on.\n */}\n <TRField.Root>\n <div className=\"flex items-center gap-tinyrack-sm rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface px-tinyrack-md py-tinyrack-sm\">\n <TRCheckbox.Root\n aria-label={t('admin.users.includeDeleted')}\n checked={draftIncludeDeleted}\n onCheckedChange={(checked) =>\n onDraftIncludeDeletedChange(checked === true)\n }\n uiSize=\"md\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n <TRField.Label className=\"cursor-pointer\">\n {t('admin.users.includeDeleted')}\n </TRField.Label>\n </div>\n </TRField.Root>\n\n <TRButton\n appearance=\"outline\"\n onClick={onSearch}\n type=\"button\"\n uiSize=\"sm\"\n >\n <SearchIcon aria-hidden className=\"size-tinyrack-lg\" />\n {t('admin.users.search')}\n </TRButton>\n <TRButton\n intent=\"primary\"\n onClick={onCreate}\n type=\"button\"\n uiSize=\"sm\"\n >\n <PlusIcon aria-hidden className=\"size-tinyrack-lg\" />\n {t('admin.users.create')}\n </TRButton>\n </div>\n\n <div className=\"inline-flex items-center gap-tinyrack-3xs rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface-muted p-tinyrack-xs\">\n {QUICK_FILTERS.map((filter) => (\n <TRButton\n appearance={activeQuickFilter === filter ? 'solid' : 'ghost'}\n intent={activeQuickFilter === filter ? 'primary' : undefined}\n key={filter}\n onClick={() => onQuickFilter(filter)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t(`admin.users.filter.${filter}`)}\n </TRButton>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","import {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, redirect } from '@tanstack/react-router';\nimport { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCard } from '@tinyrack/ui/components/card';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { AdminGateScreen } from '#frontend/features/admin/admin-gate-screen.tsx';\nimport { AdminShell } from '#frontend/features/admin/admin-shell.tsx';\nimport { AdminUserFormModal } from '#frontend/features/admin/users/admin-user-form-modal.tsx';\nimport { AdminUsersFilterBar } from '#frontend/features/admin/users/admin-users-filter-bar.tsx';\nimport {\n getActiveQuickFilter,\n type NoticeState,\n type QuickFilter,\n type UserModalState,\n} from '#frontend/features/admin/users/admin-users-filters.ts';\nimport { AdminUsersNotice } from '#frontend/features/admin/users/admin-users-notice.tsx';\nimport { AdminUsersSummary } from '#frontend/features/admin/users/admin-users-summary.tsx';\nimport { AdminUsersTable } from '#frontend/features/admin/users/admin-users-table.tsx';\nimport { AdminUsersToolbar } from '#frontend/features/admin/users/admin-users-toolbar.tsx';\nimport {\n adminUsersQueryOptions,\n createAdminUser,\n deleteAdminUser,\n normalizeAdminUsersQuery,\n updateAdminUser,\n} from '#frontend/queries/admin-users.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport type { SessionUser } from '#frontend/queries/session.ts';\n\nexport const Route = createFileRoute('/admin/users/')({\n component: AdminUsersPage,\n beforeLoad: async ({ context }) => {\n if (!context.user) {\n throw redirect({ to: '/login' });\n }\n },\n});\n\nfunction AdminUsersPage() {\n const user = Route.useRouteContext({ select: (context) => context.user });\n\n if (user?.role !== 'admin') {\n return <AdminGateScreen reason=\"access-required\" />;\n }\n\n return <AdminUsersGate user={user} />;\n}\n\nfunction AdminUsersGate({ user }: { user: SessionUser }) {\n const { data: config } = useSuspenseQuery(appConfigQueryOptions);\n if (!config.admin.enabled) {\n return <AdminGateScreen reason=\"console-disabled\" />;\n }\n return <AdminUsersContent user={user} />;\n}\n\nfunction AdminUsersContent({ user }: { user: SessionUser }) {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const [draftQuery, setDraftQuery] = useState('');\n const [draftIncludeDeleted, setDraftIncludeDeleted] = useState(false);\n const [filters, setFilters] = useState(() => normalizeAdminUsersQuery());\n const [notice, setNotice] = useState<NoticeState>(null);\n const [modal, setModal] = useState<UserModalState>(null);\n const { data } = useSuspenseQuery(adminUsersQueryOptions(filters));\n\n const activeUsers = data.users.filter(\n (managedUser) => !managedUser.deleted_at,\n ).length;\n const configUsers = data.users.filter(\n (managedUser) => managedUser.managed_by === 'config',\n ).length;\n const databaseUsers = data.users.filter(\n (managedUser) => managedUser.managed_by === 'database',\n ).length;\n const activeQuickFilter = getActiveQuickFilter(filters);\n const hasActiveFilters =\n filters.query !== '' ||\n filters.includeDeleted ||\n filters.managedBy !== undefined ||\n filters.role !== undefined;\n const pageStart =\n data.pagination.total === 0\n ? 0\n : (data.pagination.page - 1) * data.pagination.page_size + 1;\n const pageEnd = Math.min(\n data.pagination.page * data.pagination.page_size,\n data.pagination.total,\n );\n\n const noticeOn = (message: string) => setNotice({ tone: 'success', message });\n const noticeFail = () =>\n setNotice({ tone: 'error', message: t('admin.users.operationFailed') });\n\n const createMutation = useMutation({\n mutationFn: createAdminUser,\n onSuccess: ({ user: nextUser }) => {\n void queryClient.invalidateQueries({ queryKey: ['admin', 'users'] });\n noticeOn(t('admin.users.createdNotice', { email: nextUser.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n\n const updateMutation = useMutation({\n mutationFn: updateAdminUser,\n onSuccess: ({ user: nextUser }) => {\n void queryClient.invalidateQueries({ queryKey: ['admin', 'users'] });\n noticeOn(t('admin.users.updatedNotice', { email: nextUser.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n\n const deleteMutation = useMutation({\n mutationFn: deleteAdminUser,\n onSuccess: ({ user: nextUser }) => {\n void queryClient.invalidateQueries({ queryKey: ['admin', 'users'] });\n noticeOn(t('admin.users.deletedNotice', { email: nextUser.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n\n const isMutating =\n createMutation.isPending ||\n updateMutation.isPending ||\n deleteMutation.isPending;\n\n const applySearch = () => {\n setFilters((current) => ({\n ...current,\n query: draftQuery.trim(),\n includeDeleted: draftIncludeDeleted,\n page: 1,\n }));\n };\n\n const clearFilters = () => {\n setDraftQuery('');\n setDraftIncludeDeleted(false);\n setFilters(normalizeAdminUsersQuery());\n };\n\n const applyQuickFilter = (nextFilter: QuickFilter) => {\n setFilters((current) => ({\n ...current,\n page: 1,\n managedBy:\n nextFilter === 'database'\n ? 'database'\n : nextFilter === 'config'\n ? 'config'\n : undefined,\n role: nextFilter === 'admins' ? 'admin' : undefined,\n }));\n };\n\n return (\n <AdminShell\n current=\"users\"\n description={t('admin.users.description')}\n title={t('admin.users.title')}\n user={user}\n >\n <AdminUsersSummary\n active={activeUsers}\n config={configUsers}\n database={databaseUsers}\n />\n\n {notice ? (\n <AdminUsersNotice notice={notice} onDismiss={() => setNotice(null)} />\n ) : null}\n\n <TRCard.Root\n className=\"overflow-hidden shadow-tinyrack-raised\"\n data-testid=\"admin-users-directory\"\n variant=\"outlined\"\n >\n <TRCard.Content className=\"gap-tinyrack-lg p-0\">\n <AdminUsersToolbar\n activeQuickFilter={activeQuickFilter}\n draftIncludeDeleted={draftIncludeDeleted}\n draftQuery={draftQuery}\n onCreate={() => setModal({ type: 'create' })}\n onDraftIncludeDeletedChange={setDraftIncludeDeleted}\n onDraftQueryChange={setDraftQuery}\n onQuickFilter={applyQuickFilter}\n onSearch={applySearch}\n total={data.pagination.total}\n />\n\n <AdminUsersFilterBar\n activeQuickFilter={activeQuickFilter}\n hasActiveFilters={hasActiveFilters}\n includeDeleted={filters.includeDeleted}\n onClearFilters={clearFilters}\n onPageSizeChange={(pageSize) =>\n setFilters((current) => ({ ...current, page: 1, pageSize }))\n }\n pageEnd={pageEnd}\n pageSize={filters.pageSize}\n pageStart={pageStart}\n query={filters.query}\n total={data.pagination.total}\n />\n\n <AdminUsersTable\n onDelete={(managedUser) =>\n setModal({ type: 'delete', user: managedUser })\n }\n onEdit={(managedUser) =>\n setModal({ type: 'edit', user: managedUser })\n }\n users={data.users}\n />\n\n <div className=\"flex items-center justify-between border-tinyrack-border border-t-tinyrack-default bg-tinyrack-surface-muted p-tinyrack-lg\">\n <TRButton\n appearance=\"outline\"\n disabled={filters.page <= 1}\n onClick={() =>\n setFilters((current) => ({\n ...current,\n page: current.page - 1,\n }))\n }\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.previous')}\n </TRButton>\n <TRBadge uiSize=\"md\">\n {t('admin.users.page', { page: data.pagination.page })}\n </TRBadge>\n <TRButton\n appearance=\"outline\"\n disabled={\n data.pagination.page * data.pagination.page_size >=\n data.pagination.total\n }\n onClick={() =>\n setFilters((current) => ({\n ...current,\n page: current.page + 1,\n }))\n }\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.next')}\n </TRButton>\n </div>\n </TRCard.Content>\n </TRCard.Root>\n\n <AdminUserFormModal\n isMutating={isMutating}\n modal={modal}\n onClose={() => setModal(null)}\n onCreate={(values) => createMutation.mutate(values)}\n onDelete={(sub) => deleteMutation.mutate(sub)}\n onUpdate={(values) => updateMutation.mutate(values)}\n />\n </AdminShell>\n );\n}\n"],"x_google_ignoreList":[0,6,7,8,9,10,11,12,13,14],"mappings":"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"}
|
package/public/index.html
CHANGED
|
@@ -18,10 +18,11 @@
|
|
|
18
18
|
<!-- Preload critical API data for faster initial render -->
|
|
19
19
|
<link rel="preload" href="/api/config" as="fetch" crossorigin="anonymous" />
|
|
20
20
|
<link rel="preload" href="/api/user/session" as="fetch" crossorigin="anonymous" />
|
|
21
|
-
<script type="module" crossorigin src="/assets/index-
|
|
21
|
+
<script type="module" crossorigin src="/assets/index-gliHKncz.js"></script>
|
|
22
22
|
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-BPpAIXR_.js">
|
|
23
|
-
<link rel="modulepreload" crossorigin href="/assets/config-
|
|
24
|
-
<link rel="modulepreload" crossorigin href="/assets/mutationOptions-
|
|
23
|
+
<link rel="modulepreload" crossorigin href="/assets/config-v3-oy_ef.js">
|
|
24
|
+
<link rel="modulepreload" crossorigin href="/assets/mutationOptions-CrswitPs.js">
|
|
25
|
+
<link rel="modulepreload" crossorigin href="/assets/link-BN90emXr.js">
|
|
25
26
|
<link rel="modulepreload" crossorigin href="/assets/zod-C87S6Tec.js">
|
|
26
27
|
<link rel="stylesheet" crossorigin href="/assets/index-DZyHRhbQ.css">
|
|
27
28
|
</head>
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e,q as t}from"./createLucideIcon-BPpAIXR_.js";import{Sn as n,t as r}from"./config-DTQCUlfZ.js";import{tt as i}from"./shell-header-bar-CjG5qvPg.js";import{t as a}from"./fingerprint-pattern-DP62Vk8x.js";import{t as o}from"./shield-check-D_p8H0ni.js";import{N as s,f as c}from"./index-CS23Ozt6.js";import{t as l}from"./auth-choice-row-BCGjuedo.js";import{t as u}from"./auth-page-header-CIn2E4zI.js";import{t as d}from"./auth-layout-VtpryDof.js";import{n as f,t as p}from"./auth-footer-Cz5ivsDc.js";var m=t();function h(){let{t}=e(),h=s(c.useSearch()),{data:g}=i(r);return(0,m.jsxs)(d,{children:[(0,m.jsx)(u,{subtitle:t(`verify2fa.subtitle`),title:t(`verify2fa.title`)}),(0,m.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-sm`,children:[g.auth.password.enabled&&g.auth.password.totp.enabled&&(0,m.jsx)(l,{description:t(`verify2fa.totp.description`),icon:o,label:t(`verify2fa.totp.title`),render:(0,m.jsx)(n,{search:h,to:`/verify/totp`})}),g.auth.passkey.enabled&&(0,m.jsx)(l,{description:t(`verify2fa.passkey.description`),icon:a,label:t(`verify2fa.passkey.title`),render:(0,m.jsx)(n,{search:h,to:`/verify/passkey`})})]}),(0,m.jsx)(p,{children:(0,m.jsx)(f,{link:(0,m.jsx)(n,{search:h,to:`/login`,children:t(`verify2fa.backToLogin`)})})})]})}export{h as component};
|
|
2
|
-
//# sourceMappingURL=2fa-B5vLgDXQ.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e,q as t}from"./createLucideIcon-BPpAIXR_.js";import{Sn as n,t as r}from"./config-DTQCUlfZ.js";import{tt as i}from"./shell-header-bar-CjG5qvPg.js";import{t as a}from"./fingerprint-pattern-DP62Vk8x.js";import{t as o}from"./shield-check-D_p8H0ni.js";import{N as s,l as c}from"./index-CS23Ozt6.js";import{t as l}from"./auth-choice-row-BCGjuedo.js";import{t as u}from"./auth-page-header-CIn2E4zI.js";import{t as d}from"./alert-leqyvHOp.js";import{t as f}from"./auth-layout-VtpryDof.js";import{n as p,t as m}from"./auth-footer-Cz5ivsDc.js";var h=t();function g(){let{t}=e(),g=c.useSearch(),{data:_}=i(r),v=s(g);return(0,h.jsxs)(f,{children:[(0,h.jsx)(u,{subtitle:t(`setup2fa.subtitle`),title:t(`setup2fa.title`)}),(0,h.jsx)(d,{icon:o,type:`info`,children:t(`setup2fa.required`)}),(0,h.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-sm`,children:[_.auth.password.enabled&&_.auth.password.totp.enabled&&(0,h.jsx)(l,{description:t(`setup2fa.totp.description`),icon:o,label:t(`setup2fa.totp.title`),render:(0,h.jsx)(n,{search:v,to:`/setup/totp`})}),_.auth.passkey.enabled&&(0,h.jsx)(l,{description:t(`setup2fa.passkey.description`),icon:a,label:t(`setup2fa.passkey.title`),render:(0,h.jsx)(n,{search:{...v,passkey_name:`default`},to:`/setup/passkey`})})]}),(0,h.jsx)(m,{children:(0,h.jsx)(p,{link:(0,h.jsx)(n,{search:v,to:`/login`,children:t(`setup2fa.backToLogin`)})})})]})}export{g as component};
|
|
2
|
-
//# sourceMappingURL=2fa-BqsM_D-X.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e,n as t,q as n,t as r}from"./createLucideIcon-BPpAIXR_.js";import{Sn as i,t as a}from"./config-DTQCUlfZ.js";import{tt as o}from"./shell-header-bar-CjG5qvPg.js";import{c as s,l as c,o as l,s as u,t as d,u as f}from"./admin-users-DvPbw1Vq.js";import{B as p,H as m,g as h,z as g}from"./index-CS23Ozt6.js";import{t as _}from"./badge-CsOfUji0.js";var v=r(`network`,[[`rect`,{x:`16`,y:`16`,width:`6`,height:`6`,rx:`1`,key:`4q2zg0`}],[`rect`,{x:`2`,y:`16`,width:`6`,height:`6`,rx:`1`,key:`8cvhb9`}],[`rect`,{x:`9`,y:`2`,width:`6`,height:`6`,rx:`1`,key:`1egb70`}],[`path`,{d:`M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3`,key:`1jsf9p`}],[`path`,{d:`M12 12V8`,key:`2874zd`}]]),y=n();function b(){let e=h.useRouteContext({select:e=>e.user});return e?.role===`admin`?(0,y.jsx)(x,{user:e}):(0,y.jsx)(f,{reason:`access-required`})}function x({user:e}){let{data:t}=o(a);return t.admin.enabled?(0,y.jsx)(S,{user:e}):(0,y.jsx)(f,{reason:`console-disabled`})}function S({user:n}){let{t:r}=e(),[a,o,f,h]=m({queries:[d(),d({pageSize:1,role:`admin`}),d({managedBy:`config`,pageSize:1}),d({managedBy:`database`,pageSize:1})]}),b=a.data,x=f.data.pagination.total,S=h.data.pagination.total,w=o.data.pagination.total;return(0,y.jsxs)(u,{current:`dashboard`,description:r(`admin.dashboardDescription`),title:r(`admin.dashboardTitle`),user:n,children:[(0,y.jsxs)(`div`,{className:`flex flex-col divide-y divide-tinyrack-border overflow-hidden rounded-tinyrack-lg border border-tinyrack-border bg-tinyrack-surface shadow-tinyrack-raised lg:flex-row lg:divide-x lg:divide-y-0`,children:[(0,y.jsx)(l,{accent:`bg-tinyrack-primary`,hint:r(`admin.metrics.totalUsersHint`),label:r(`admin.metrics.totalUsers`),value:b.pagination.total}),(0,y.jsx)(l,{accent:`bg-tinyrack-success`,hint:r(`admin.metrics.adminsHint`),label:r(`admin.metrics.admins`),value:w}),(0,y.jsx)(l,{accent:`bg-tinyrack-info`,hint:r(`admin.metrics.databaseUsersHint`),label:r(`admin.metrics.databaseUsers`),value:S})]}),(0,y.jsxs)(`div`,{className:`grid gap-tinyrack-xl xl:grid-cols-3`,children:[(0,y.jsx)(p.Root,{className:`overflow-hidden border-tinyrack-border shadow-tinyrack-raised xl:col-span-2`,variant:`outlined`,children:(0,y.jsxs)(p.Content,{className:`p-0`,children:[(0,y.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-lg border-tinyrack-border border-b-tinyrack-default p-tinyrack-xl sm:flex-row sm:items-center sm:justify-between`,children:[(0,y.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-sm`,children:[(0,y.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[(0,y.jsx)(v,{"aria-hidden":!0,className:`size-tinyrack-lg text-tinyrack-primary`}),(0,y.jsx)(t,{color:`muted`,variant:`label`,children:r(`admin.identityGraph`)})]}),(0,y.jsx)(p.Title,{children:r(`admin.users.title`)}),(0,y.jsx)(p.Description,{className:`text-tinyrack-sm`,children:r(`admin.users.description`)})]}),(0,y.jsx)(g,{intent:`primary`,render:(0,y.jsx)(i,{to:`/admin/users`}),uiSize:`sm`,children:r(`admin.users.open`)})]}),(0,y.jsx)(`div`,{className:`grid divide-y divide-tinyrack-border [gap:0] md:grid-cols-2 md:divide-x md:divide-y-0`,children:b.users.slice(0,4).map(e=>(0,y.jsxs)(i,{className:`group flex flex-col gap-tinyrack-lg bg-tinyrack-surface p-tinyrack-lg transition hover:bg-tinyrack-surface-hover`,to:`/admin/users`,children:[(0,y.jsxs)(`div`,{className:`flex items-start justify-between gap-tinyrack-lg`,children:[(0,y.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-tinyrack-xs`,children:[(0,y.jsx)(t,{as:`p`,truncate:!0,variant:`bodySm`,weight:`medium`,children:e.email}),(0,y.jsx)(t,{as:`p`,color:`muted`,truncate:!0,variant:`caption`,children:(0,y.jsx)(`span`,{className:`font-tinyrack-mono`,children:e.sub})})]}),(0,y.jsx)(_,{className:`shrink-0`,uiSize:`md`,variant:e.role===`admin`?`neutral`:void 0,children:s(r,e.role)})]}),(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-tinyrack-sm`,children:[(0,y.jsx)(_,{uiSize:`md`,children:c(r,e.managed_by)}),(0,y.jsxs)(t,{color:`muted`,variant:`caption`,children:[r(`admin.users.verifiedLabel`),` `,e.email_verified?r(`common.yes`):r(`common.no`)]})]})]},e.sub))})]})}),(0,y.jsx)(p.Root,{className:`overflow-hidden border-tinyrack-border shadow-tinyrack-raised`,variant:`outlined`,children:(0,y.jsxs)(p.Content,{className:`flex flex-col items-start gap-tinyrack-md`,children:[(0,y.jsx)(_,{uiSize:`md`,variant:`neutral`,children:r(`admin.policy.title`)}),(0,y.jsx)(p.Title,{className:`text-tinyrack-xl`,children:r(`admin.policy.heading`)}),(0,y.jsx)(p.Description,{className:`text-tinyrack-sm`,children:r(`admin.policy.description`)}),(0,y.jsxs)(`div`,{className:`flex w-full flex-col gap-tinyrack-md`,children:[(0,y.jsx)(C,{label:r(`admin.metrics.configUsers`),value:x}),(0,y.jsx)(C,{label:r(`admin.metrics.databaseUsers`),value:S}),(0,y.jsx)(C,{label:r(`admin.policy.configReadonly`),value:r(`common.on`)})]})]})})]})]})}function C({label:e,value:n}){return(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-tinyrack-sm rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface-muted px-tinyrack-lg py-tinyrack-md`,children:[(0,y.jsx)(t,{color:`muted`,variant:`bodySm`,children:e}),(0,y.jsx)(_,{uiSize:`md`,variant:`neutral`,children:n})]})}export{b as component};
|
|
2
|
-
//# sourceMappingURL=admin-BPijkLw-.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{F as e,G as t,J as n,M as r,P as i,W as a,Z as o,_ as s,b as c,c as l,d as u,f as d,i as f,j as p,n as m,o as h,q as g,s as _,t as v,v as y,w as b,x,y as S}from"./createLucideIcon-BPpAIXR_.js";import{Cn as C,On as w,P as T,Qt as E,R as D,S as O,Sn as k,Sr as A,Wt as j,Xt as M,Z as N,Zt as P,_ as F,a as I,an as L,at as R,bn as z,bt as B,ct as V,fn as H,gt as ee,h as U,i as W,it as te,lt as ne,on as re,ot as G,pn as K,pt as q,r as J,rt as ie,st as Y,un as X,ur as ae,zt as oe}from"./config-DTQCUlfZ.js";import{t as se}from"./useMutation-BWZ0G4Td.js";import{A as ce,E as le,M as ue,N as de,O as fe,T as pe,Y as me,a as he,et as ge,f as _e,j as ve,n as ye,o as be,p as xe,s as Se,z as Ce}from"./shell-header-bar-CjG5qvPg.js";import{t as we}from"./chevron-right-CN0jUyV0.js";import{n as Te,t as Ee}from"./logout-B5T52P8u.js";import{t as De}from"./triangle-alert-CqNn0kPs.js";import{L as Oe,S as ke,z as Ae}from"./index-CS23Ozt6.js";import{t as je}from"./badge-CsOfUji0.js";import{t as Me}from"./alert-leqyvHOp.js";import{t as Ne}from"./avatar-BEQjf2x6.js";import{t as Pe}from"./auth-layout-VtpryDof.js";import{a as Fe,c as Ie,d as Le,f as Re,l as ze,o as Be,r as Ve,s as He,t as Ue,u as We}from"./DialogHandle-BmtK2pRn.js";import{n as Ge,t as Ke}from"./valueToPercent-LgbY_prH.js";import{t as qe}from"./promise-OpBtq8tG.js";var Je=v(`layout-dashboard`,[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`,key:`10lvy0`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`,key:`16une8`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`,key:`1hutg5`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`,key:`ldoo1y`}]]),Ye=v(`menu`,[[`path`,{d:`M4 5h16`,key:`1tepv9`}],[`path`,{d:`M4 12h16`,key:`1lakjw`}],[`path`,{d:`M4 19h16`,key:`1djgab`}]]),Xe=v(`power-off`,[[`path`,{d:`M18.36 6.64A9 9 0 0 1 20.77 15`,key:`dxknvb`}],[`path`,{d:`M6.16 6.16a9 9 0 1 0 12.68 12.68`,key:`1x7qb5`}],[`path`,{d:`M12 2v4`,key:`3427ic`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}]]),Ze=v(`shield-off`,[[`path`,{d:`m2 2 20 20`,key:`1ooewy`}],[`path`,{d:`M5 5a1 1 0 0 0-1 1v7c0 5 3.5 7.5 7.67 8.94a1 1 0 0 0 .67.01c2.35-.82 4.48-1.97 5.9-3.71`,key:`1jlk70`}],[`path`,{d:`M9.309 3.652A12.252 12.252 0 0 0 11.24 2.28a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1v7a9.784 9.784 0 0 1-.08 1.264`,key:`18rp1v`}]]),Qe=v(`shield`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}]]),$e=v(`users`,[[`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`,key:`1yyitq`}],[`path`,{d:`M16 3.128a4 4 0 0 1 0 7.744`,key:`16gr8j`}],[`path`,{d:`M22 21v-2a4 4 0 0 0-3-3.87`,key:`kshegd`}],[`circle`,{cx:`9`,cy:`7`,r:`4`,key:`nufk8`}]]),Z=g();function et({reason:e}){let{t}=f(),n=e===`access-required`?{icon:Ze,tone:`danger`,title:t(`admin.accessRequired`),description:t(`admin.accessRequiredDescription`)}:{icon:Xe,tone:`info`,title:t(`admin.disabled`),description:t(`admin.disabledDescription`)};return(0,Z.jsx)(Pe,{children:(0,Z.jsx)(Oe,{description:n.description,icon:n.icon,title:n.title,tone:n.tone,children:(0,Z.jsx)(Ae,{className:`w-full`,intent:`primary`,render:(0,Z.jsx)(k,{to:`/profile`}),uiSize:`lg`,children:t(`profile.title`)})})})}var Q=o(n(),1),tt=o(C(),1);function nt({className:e,...t}){return(0,Z.jsx)(`div`,{...t,className:a(`tr-app-shell-actions`,e)})}function rt({className:e,...t}){return(0,Z.jsx)(`div`,{...t,className:a(`tr-app-shell-brand`,e)})}var $=function(e){return e.nestedDrawers=`--nested-drawers`,e.height=`--drawer-height`,e.frontmostHeight=`--drawer-frontmost-height`,e.swipeMovementX=`--drawer-swipe-movement-x`,e.swipeMovementY=`--drawer-swipe-movement-y`,e.snapPointOffset=`--drawer-snap-point-offset`,e.swipeStrength=`--drawer-swipe-strength`,e}({}),it=function(e){return e.swipeProgress=`--drawer-swipe-progress`,e}({}),at=Q.forwardRef(function(e,t){let{render:n,className:r,style:i,forceRender:a=!1,...o}=e,s=Re(),c=s.useState(`open`),u=s.useState(`nested`),d=s.useState(`mounted`);return l(`div`,e,{state:{open:c,transitionStatus:s.useState(`transitionStatus`)},ref:[s.context.backdropRef,t],stateAttributesMapping:F,props:[{role:`presentation`,hidden:!d,style:{pointerEvents:c?void 0:`none`,userSelect:`none`,WebkitUserSelect:`none`,[it.swipeProgress]:`0`,[$.swipeStrength]:`1`}},o],enabled:a||!u})}),ot=Le,st=`data-drawer-content`,ct=Q.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e;return Re(),l(`div`,e,{ref:t,props:[{[st]:``},a]})}),lt=We,ut=Q.createContext(void 0);function dt(){return Q.useContext(ut)}var ft={active(e){return e?{"data-active":``}:{"data-inactive":``}}},pt=Q.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e,o=dt(),s=o?.active??!1,u=o?.visualStateStore,d=Q.useRef(null);return c(()=>{let e=d.current;if(!e||!u)return;let t=()=>{let{swipeProgress:t,frontmostHeight:n}=u.getSnapshot();t<=0?e.style.setProperty(it.swipeProgress,`0`):e.style.setProperty(it.swipeProgress,`${t}`),n<=0?e.style.removeProperty($.height):e.style.setProperty($.height,`${n}px`)};t();let n=u.subscribe(t);return()=>{n(),e.style.setProperty(it.swipeProgress,`0`),e.style.removeProperty($.height)}},[u]),l(`div`,e,{ref:[t,d],state:{active:s},props:[{style:{[it.swipeProgress]:`0`}},a],stateAttributesMapping:ft})}),mt={active(e){return e?{"data-active":``}:{"data-inactive":``}}},ht=Q.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e;return l(`div`,e,{ref:t,state:{active:dt()?.active??!1},props:a,stateAttributesMapping:mt})}),gt=function(e){return e[e.open=U.open]=`open`,e[e.closed=U.closed]=`closed`,e[e.startingStyle=U.startingStyle]=`startingStyle`,e[e.endingStyle=U.endingStyle]=`endingStyle`,e.expanded=`data-expanded`,e.nestedDrawerOpen=`data-nested-drawer-open`,e.nestedDrawerSwiping=`data-nested-drawer-swiping`,e.swipeDismiss=`data-swipe-dismiss`,e.swipeDirection=`data-swipe-direction`,e.swiping=`data-swiping`,e}({}),_t=Q.createContext(void 0);function vt(e){let t=Q.useContext(_t);if(e!==!0&&t===void 0)throw Error(y(90));return t}function yt(e,t){let n=e+t;return n>=0?t:-Math.sqrt(-n)-e}function bt(e,t,n){if(!Number.isFinite(t)||t<=0)return null;if(typeof e==`number`)return Number.isFinite(e)?e<=1?Y(e,0,1)*t:e:null;let r=e.trim();if(r.endsWith(`px`)){let e=Number.parseFloat(r);return Number.isFinite(e)?e:null}if(r.endsWith(`rem`)){let e=Number.parseFloat(r);return Number.isFinite(e)?e*n:null}return null}function xt(e,t){let n=-1,r=1/0;for(let i=0;i<e.length;i+=1){let a=Math.abs(e[i]-t);a<r&&(r=a,n=i)}return n}function St(){let e=Re(),{snapPoints:t,activeSnapPoint:n,setActiveSnapPoint:r,popupHeight:i}=vt(),a=e.useState(`viewportElement`),[o,l]=Q.useState(0),[u,d]=Q.useState(16),f=x(()=>{let e=s(a).documentElement;l(a?a.offsetHeight:e.clientHeight);let t=parseFloat(getComputedStyle(e).fontSize);Number.isFinite(t)&&d(t)});c(()=>{if(f(),!a||typeof ResizeObserver!=`function`)return;let e=new ResizeObserver(f);return e.observe(a),()=>{e.disconnect()}},[f,a]);let p=Q.useMemo(()=>{if(!t||t.length===0||o<=0||i<=0)return[];let e=Math.min(i,o),n=t.map(t=>{let n=bt(t,o,u);if(n===null)return null;let r=Y(n,0,e);return{value:t,height:r,offset:Math.max(0,i-r)}}).filter(e=>!!e);if(n.length<=1)return n;let r=[],a=[];for(let e=n.length-1;e>=0;--e){let t=n[e];a.some(e=>Math.abs(e-t.height)<=1)||(a.push(t.height),r.push(t))}return r.reverse(),r},[i,u,t,o]);return{snapPoints:t,activeSnapPoint:n,setActiveSnapPoint:r,popupHeight:i,viewportHeight:o,resolvedSnapPoints:p,activeSnapPointOffset:Q.useMemo(()=>{if(n===null)return;let e=p.find(e=>Object.is(e.value,n));if(e)return e;let t=Math.min(i,o),r=bt(n,o,u);if(r===null)return;let a=Y(r,0,t);return p[xt(p.map(e=>e.height),a)]},[n,i,p,u,o])?.offset??null}}var Ct=Q.createContext(null);function wt(){return Q.useContext(Ct)}var Tt=!1;function Et(){Tt||=(typeof CSS<`u`&&`registerProperty`in CSS&&([$.swipeMovementX,$.swipeMovementY,$.snapPointOffset].forEach(e=>{try{CSS.registerProperty({name:e,syntax:`<length>`,inherits:!1,initialValue:`0px`})}catch{}}),[{name:it.swipeProgress,initialValue:`0`},{name:$.swipeStrength,initialValue:`1`}].forEach(({name:e,initialValue:t})=>{try{CSS.registerProperty({name:e,syntax:`<number>`,inherits:!1,initialValue:t})}catch{}})),!0)}var Dt={...F,expanded(e){return e?{[gt.expanded]:``}:null},nestedDrawerOpen(e){return e?{[gt.nestedDrawerOpen]:``}:null},nestedDrawerSwiping(e){return e?{[gt.nestedDrawerSwiping]:``}:null},swipeDirection(e){return{[gt.swipeDirection]:e}},swiping(e){return e?{[gt.swiping]:``}:null}},Ot=Q.forwardRef(function(e,t){let{render:n,className:r,style:i,finalFocus:a,initialFocus:o,...s}=e,d=Re(),f=d.context.popupRef,{swipeDirection:p,frontmostHeight:m,hasNestedDrawer:h,nestedSwiping:g,nestedSwipeProgressStore:_,onPopupHeightChange:v,notifyParentFrontmostHeight:y,notifyParentHasNestedDrawer:b}=vt(),S=d.useState(`descriptionElementId`),C=d.useState(`disablePointerDismissal`),w=d.useState(`floatingRootContext`),T=d.useState(`popupProps`),E=d.useState(`modal`),D=d.useState(`mounted`),O=d.useState(`nested`),k=d.useState(`nestedOpenDrawerCount`),A=d.useState(`transitionStatus`),j=d.useState(`open`),M=d.useState(`openMethod`),N=d.useState(`titleElementId`),P=d.useState(`role`),F=w.useState(`floatingId`),I=s.id??F,L=wt();ze();let{snapPoints:R,activeSnapPoint:z,activeSnapPointOffset:B}=St(),V=k>0,H=L?.swiping??!1,ee=L?.swipeStrength??null,[U,W]=Q.useState(0),te=Q.useRef(0),ne=x(()=>{let e=f.current;if(!e)return;let t=e.offsetHeight;if(te.current>0&&m>te.current&&t>te.current)return;if(te.current>0&&h){let e=te.current;W(e),v(e);return}let n=t;n!==te.current&&(te.current=n,W(n),v(n))});c(()=>{if(!D){te.current=0,W(0),v(0);return}let e=f.current;if(!e||(Et(),ne(),typeof ResizeObserver!=`function`))return;let t=new ResizeObserver(ne);return t.observe(e),()=>{t.disconnect()}},[ne,D,V,v,f]),c(()=>{let e=()=>{let e=f.current;if(!e)return;let t=_.getSnapshot();t>0?e.style.setProperty(it.swipeProgress,`${t}`):e.style.setProperty(it.swipeProgress,`0`)};e();let t=_.subscribe(e),n=f.current;return()=>{t(),n&&n.style.setProperty(it.swipeProgress,`0`)}},[_,f]),c(()=>{if(j)return y?.(m),()=>{y?.(0)}},[m,j,y]),c(()=>{if(b)return b(j||A===`ending`),()=>{b(!1)}},[b,j,A]),q({open:j,ref:f,onComplete(){j&&d.context.onOpenChangeComplete?.(!0)}});let re=o===void 0?f:o,G=d.useStateSetter(`popupElement`),K={open:j,nested:O,transitionStatus:A,expanded:z===1,nestedDrawerOpen:V,nestedDrawerSwiping:g,swipeDirection:p,swiping:H},J;U&&!(!h&&A!==`ending`)&&(J=`${U}px`);let ie=R&&R.length>0&&(p===`down`||p===`up`),Y=null;ie&&B!==null&&(Y=p===`up`?-B:B);let X=L?L.getDragStyles():u;if(ie&&p===`down`){let e=B??0,t=Number.parseFloat(String(X[$.swipeMovementY]));X=H&&Number.isFinite(t)?{...X,transform:void 0,[$.swipeMovementY]:`${yt(e,t)}px`}:{...X,transform:void 0}}let ae=l(`div`,e,{state:K,props:[T,{id:I,"aria-labelledby":N,"aria-describedby":S,role:P,...Ce,hidden:!D,onKeyDown(e){be.has(e.key)&&e.stopPropagation()},style:{...X,[it.swipeProgress]:`0`,[$.nestedDrawers]:k,[$.height]:J,[$.snapPointOffset]:typeof Y==`number`?`${Y}px`:`0px`,[$.frontmostHeight]:m?`${m}px`:void 0,[$.swipeStrength]:typeof ee==`number`&&Number.isFinite(ee)&&ee>0?`${ee}`:`1`}},s],ref:[t,f,G],stateAttributesMapping:Dt});return(0,Z.jsx)(ge,{context:w,openInteractionType:M,disabled:!D,closeOnFocusOut:!C,initialFocus:re,returnFocus:a,modal:E!==!1,restoreFocus:`popup`,children:ae})}),kt=Ie;function At(e){let{children:t}=e,[n,r]=Q.useState(()=>new Set),[i]=Q.useState(jt),a=x((e,t)=>{r(n=>{if(n.has(e)===t)return n;let r=new Set(n);return t?r.add(e):r.delete(e),r})}),o=x(e=>{a(e,!1)}),s=n.size>0,c=Q.useMemo(()=>({setDrawerOpen:a,removeDrawer:o,active:s,visualStateStore:i}),[s,o,a,i]);return(0,Z.jsx)(ut.Provider,{value:c,children:t})}function jt(){let e={swipeProgress:0,frontmostHeight:0},t=new Set;return{getSnapshot:()=>e,set(n){let r=e.swipeProgress;n.swipeProgress!==void 0&&(r=Number.isFinite(n.swipeProgress)?n.swipeProgress:0);let i=e.frontmostHeight;n.frontmostHeight!==void 0&&(i=Number.isFinite(n.frontmostHeight)?n.frontmostHeight:0),!(r===e.swipeProgress&&i===e.frontmostHeight)&&(e={swipeProgress:r,frontmostHeight:i},t.forEach(e=>{e()}))},subscribe(e){return t.add(e),()=>{t.delete(e)}}}}var Mt,Nt;function Pt(e){let{children:t,open:n,defaultOpen:r=!1,onOpenChange:i,onOpenChangeComplete:a,disablePointerDismissal:o=!1,modal:s=!0,actionsRef:c,handle:l,triggerId:u,defaultTriggerId:d=null,swipeDirection:f=`down`,snapToSequentialPoints:p=!1,snapPoints:m,snapPoint:h,defaultSnapPoint:g,onSnapPointChange:_}=e,v=vt(!0),y=v?.onNestedSwipeProgressChange,b=v?.onNestedFrontmostHeightChange,S=v?.onNestedSwipingChange,C=v?.onNestedDrawerPresenceChange,[w,E]=Q.useState(0),[D,O]=Q.useState(0),[k,A]=Q.useState(!1),[j,M]=Q.useState(!1),[N]=Q.useState(Ft),P=g===void 0?m?.[0]??null:g,F=h!==void 0,[I,L]=pe({controlled:h,default:P,name:`Drawer`,state:`snapPoint`}),R=Q.useRef(!1),z=Q.useRef(!1),B=x((e,t)=>{let n=t??T(`none`);_?.(e,n),!n.isCanceled&&L(e)}),V=Q.useMemo(()=>F||!m||m.length===0?I:I===null||!m.some(e=>Object.is(e,I))?P:I,[I,F,P,m]),H=x(e=>{E(e),!R.current&&e>0&&O(e)}),ee=x(e=>{if(e>0){R.current=!0,O(e);return}R.current=!1,w>0&&O(w)}),U=x(e=>{A(e)}),W=x(e=>{N.set(e),y?.(e)}),te=x(e=>{M(e),S?.(e)}),ne=x((e,t)=>{i?.(e,t),!t.isCanceled&&!e&&m&&m.length>0&&B(P,T(t.reason,t.event,t.trigger))}),re=Q.useMemo(()=>({swipeDirection:f,swipeAreaActiveRef:z,snapToSequentialPoints:p,snapPoints:m,activeSnapPoint:V,setActiveSnapPoint:B,frontmostHeight:D,popupHeight:w,hasNestedDrawer:k,nestedSwiping:j,nestedSwipeProgressStore:N,onNestedDrawerPresenceChange:U,onPopupHeightChange:H,onNestedFrontmostHeightChange:ee,onNestedSwipingChange:te,onNestedSwipeProgressChange:W,notifyParentFrontmostHeight:b,notifyParentSwipingChange:S,notifyParentSwipeProgressChange:y,notifyParentHasNestedDrawer:C}),[V,D,k,j,N,C,y,S,b,U,ee,W,te,H,w,B,m,p,z,f]),G=He(`drawer`,{open:n,defaultOpen:r,onOpenChange:ne,onOpenChangeComplete:a,disablePointerDismissal:o,modal:s,actionsRef:c,handle:l,triggerId:u,defaultTriggerId:d,children:typeof t==`function`?e=>(0,Z.jsxs)(Q.Fragment,{children:[Mt||=(0,Z.jsx)(It,{}),t(e)]}):(0,Z.jsxs)(Q.Fragment,{children:[Nt||=(0,Z.jsx)(It,{}),t]})});return(0,Z.jsx)(_t.Provider,{value:re,children:G})}function Ft(){let e=0,t=new Set;return{getSnapshot:()=>e,set(n){let r=Number.isFinite(n)?n:0;r!==e&&(e=r,t.forEach(e=>{e()}))},subscribe(e){return t.add(e),()=>{t.delete(e)}}}}function It(){let e=dt(),t=Re(!1),n=e?.setDrawerOpen,i=e?.removeDrawer,a=t.useState(`open`),o=t.useState(`nestedOpenDialogCount`),s=t.useState(`popupElement`),l=o===0;return c(()=>{if(i)return()=>{i(t)}},[i,t]),c(()=>{n?.(t,a)},[a,n,t]),Q.useEffect(()=>{if(!a||!l||!re)return;let e=r(s).CloseWatcher;if(!e)return;function n(e){t.select(`open`)&&t.setOpen(!1,T(D,e))}let i=new e,o=K(i,`close`,n);return()=>{o(),i.destroy()}},[t,l,a,s]),null}var Lt=function(e){return e[e.open=U.open]=`open`,e[e.closed=U.closed]=`closed`,e.disabled=`data-disabled`,e.swipeDirection=`data-swipe-direction`,e.swiping=`data-swiping`,e}({}),Rt=.5,zt=1,Bt=.1,Vt=40,Ht={[Lt.open]:``},Ut={[Lt.closed]:``},Wt={[Lt.swiping]:``},Gt={[Lt.disabled]:``},Kt={open(e){return e?Ht:Ut},swiping(e){return e?Wt:null},swipeDirection(e){return{[Lt.swipeDirection]:e}},disabled(e){return e?Gt:null}},qt={up:`down`,down:`up`,left:`right`,right:`left`};function Jt(e){return e===`left`||e===`right`?`pan-y`:`pan-x`}var Yt=Q.forwardRef(function(e,t){let{render:n,className:r,style:i,disabled:a=!1,swipeDirection:o,...u}=e,f=Re(),{swipeDirection:p,frontmostHeight:m,swipeAreaActiveRef:h}=vt(),g=dt(),[_,v]=Q.useState(!1),y=Q.useRef(null),b=Q.useRef(null),S=Q.useRef(!1),C=Q.useRef({x:0,y:0}),w=Q.useRef(null),E=Q.useRef(!1),D=Q.useRef(null),O=Q.useRef(null),k=Q.useRef(null),A=Q.useRef(d),j=fe(e.id),M=me(j,f),P=f.useState(`open`),F=x(()=>{C.current.x=0,C.current.y=0}),I=o??qt[p],L=qt[I],z=!a&&(!P||_);function B(){A.current(),f.context.outsidePressEnabledRef.current=!1}let V=x(()=>{A.current();let e=s(y.current);function t(n){n?.type===`click`&&n.detail!==0&&!oe(n)||(A.current=d,e.removeEventListener(`pointerdown`,t,!0),e.removeEventListener(`click`,t,!0),f.context.outsidePressEnabledRef.current=!0)}A.current=t,e.addEventListener(`pointerdown`,t,!0),e.addEventListener(`click`,t,!0)});function H(e){let t=L===`left`||L===`right`?e.offsetWidth:e.offsetHeight;return t<=0?null:t}function ee(){let e=f.context.popupRef.current;return e?H(e):null}function U(e){let t=H(e);if(t==null)return null;let n=L===`left`||L===`right`,r=te(e),i=n?r.x:r.y;return Number.isFinite(i)&&Math.abs(i)>.5?Math.min(t,Math.abs(i)):t}function W(){let e=ee();return e==null?Vt:e*Rt}function ne(){let e=f.context.popupRef.current;if(!e||!f.select(`open`)||!f.select(`mounted`))return;w.current??=U(e);let t=w.current;if(t===null)return;let{x:n,y:r}=C.current,i=ie(I,n,r),a=Math.max(0,i),o=(t-(a>t?t+Math.sqrt(a-t):a))*(L===`left`||L===`up`?-1:1),s=L===`left`||L===`right`,c=s?o:0,l=s?0:o,u=Math.max(0,Math.min(1,a/t)),d=Math.max(0,Math.min(1,1-u));e.style.setProperty($.swipeMovementX,`${c}px`),e.style.setProperty($.swipeMovementY,`${l}px`),e.setAttribute(gt.swiping,``),D.current=e,k.current===null&&(k.current=e.style.transition),e.style.transition=`none`;let p=f.context.backdropRef.current;p&&(p.setAttribute(gt.swiping,``),O.current=p,p.style.setProperty(it.swipeProgress,`${d}`),u>0&&m>0?p.style.setProperty($.height,`${m}px`):p.style.removeProperty($.height)),g?.visualStateStore.set({swipeProgress:u,frontmostHeight:u>0?m:0}),E.current=!0,h.current=!0}let re=x(()=>{let e=D.current;e&&(e.style.removeProperty($.swipeMovementX),e.style.removeProperty($.swipeMovementY),e.removeAttribute(gt.swiping)),e&&k.current!==null&&(e.style.transition=k.current,k.current=null);let t=O.current;t&&(t.removeAttribute(gt.swiping),t.style.setProperty(it.swipeProgress,`0`),t.style.removeProperty($.height)),g?.visualStateStore.set({swipeProgress:0,frontmostHeight:0}),E.current=!1,D.current=null,O.current=null,h.current=!1});function G(e){S.current=!0,f.setOpen(!0,T(N,e,y.current))}function K(e){f.setOpen(!1,T(N,e,y.current))}function q(){b.current=null,S.current=!1,w.current=null,v(!1)}function J(){q(),V(),F(),re()}let Y=R({enabled:z,directions:[I],elementRef:y,trackDrag:!1,movementCssVars:{x:$.swipeMovementX,y:$.swipeMovementY},onSwipeStart(e){B(),b.current=e,S.current=!1,v(!0),F()},onProgress(e,t){if(!t||!b.current||(C.current.x=t.deltaX,C.current.y=t.deltaY,t.direction!==I))return;let n=ie(I,t.deltaX,t.deltaY);!S.current&&n<zt||(!S.current&&!f.select(`open`)&&G(b.current),ne())},onRelease({event:e,direction:t,deltaX:n,deltaY:r,releaseVelocityX:i,releaseVelocityY:o}){let s=ie(I,n,r),c=ie(I,i,o),l=s>=W();return t===I&&(l||c>=Bt)&&!a?f.select(`open`)||G(e):S.current&&f.select(`open`)&&K(e),J(),!1},onCancel:J}),X=Y.getPointerProps(),ae=Y.getTouchProps(),se=Y.reset;return c(()=>{_&&E.current&&ne()}),c(()=>{z||(_&&V(),se(),F(),re(),q())},[re,V,z,F,se,_]),Q.useEffect(()=>()=>{A.current(),f.context.outsidePressEnabledRef.current=!0},[f]),l(`div`,e,{state:{open:P,swiping:Y.swiping,swipeDirection:I,disabled:a},ref:[t,y,M],stateAttributesMapping:Kt,props:[{role:`presentation`,"aria-hidden":!0,style:{pointerEvents:z?void 0:`none`,touchAction:Jt(I)},onPointerDown(e){e.pointerType!==`touch`&&(X.onPointerDown?.(e),e.cancelable&&e.preventDefault())},onPointerMove(e){e.pointerType!==`touch`&&X.onPointerMove?.(e)},onPointerUp(e){e.pointerType!==`touch`&&X.onPointerUp?.(e)},onPointerCancel(e){e.pointerType!==`touch`&&X.onPointerCancel?.(e)}},ae,j?{id:j}:void 0,u]})}),Xt=Be,Zt=Fe,Qt=Q.createContext(void 0);function $t(){return Q.useContext(Qt)}var en=10,tn=.5,nn=.5,rn=300,an=4,on=.2,sn=4,cn=80,ln=360,un=.1,dn=1,fn=6,pn=2,mn=`[${st}]`,hn=Q.forwardRef(function(e,t){let{render:n,className:r,style:a,children:o,...l}=e,u=Re(),d=u.context.popupRef,f=u.context.backdropRef,{swipeDirection:p,notifyParentSwipingChange:m,notifyParentSwipeProgressChange:h,frontmostHeight:g,snapToSequentialPoints:_,swipeAreaActiveRef:v}=vt(),y=dt(),{snapPoints:b,resolvedSnapPoints:C,activeSnapPoint:w,activeSnapPointOffset:D,setActiveSnapPoint:O,popupHeight:k}=St(),A=u.useState(`open`),j=u.useState(`mounted`),M=u.useState(`nested`),F=u.useState(`nestedOpenDrawerCount`),I=u.useState(`viewportElement`),L=u.useState(`popupElement`),z=y?.visualStateStore,B=F>0,U=p===`left`||p===`right`?`horizontal`:`vertical`,W=U===`vertical`,te=W?`horizontal`:`vertical`,[ne,re]=Q.useState(null),q=Q.useRef(void 0),J=Q.useRef(null),X=H(),ae=Q.useRef(!1),oe=Q.useRef(!1),se=Q.useRef(``),ce=Q.useRef(!1),le=Q.useRef(!1),ue=Q.useRef(null),de=$t(),fe=Q.useMemo(()=>{if(!b||b.length<2||C.length<2||p!==`down`&&p!==`up`)return null;let e=C.map(e=>e.offset).sort((e,t)=>e-t),t=e[0];return{minOffset:t,range:e[1]-t}},[C,b,p]),pe=Q.useMemo(()=>!fe||D===null?null:Y((D-fe.minOffset)/fe.range,0,1),[D,fe]),me=Q.useMemo(()=>b&&b.length>0&&(p===`down`||p===`up`)?p===`down`?[`down`,`up`]:[`up`,`down`]:[p],[b,p]),he=x(e=>{d.current?.toggleAttribute(gt.swipeDismiss,e),f.current?.toggleAttribute(gt.swipeDismiss,e)}),ge=x(()=>{he(!1),d.current?.removeAttribute(ee.endingStyle),re(null)}),_e=x(()=>{oe.current&&(oe.current=!1,m?.(!1))}),ve=x((e,t,n)=>{let r=A&&!M&&t,i=r?e:0,a=A&&t?e:0;n&&h&&(h(a),a<=0&&_e()),z?.set({swipeProgress:i,frontmostHeight:i>0?g:0});let o=f.current;if(!o)return;let s=r&&i>0;o.style.setProperty(it.swipeProgress,s?`${i}`:`0`),s&&g>0?o.style.setProperty($.height,`${g}px`):o.style.removeProperty($.height)});function ye(e,t,n,r,i,a,o,s){let c=yn(e,t);if(c<=0)return null;let l=((t===`down`||t===`up`)&&b&&b.length>0?D??0:0)+ie(t,n,r),u=Math.max(0,c-l);if(u<=0)return null;let d=ie(t,o,s),f=Math.abs(d)>0?d:ie(t,i,a);return f<=on?null:un+(Y(u/Y(f,on,sn),cn,ln)-cn)/(ln-cn)*(dn-un)}function be(e){if(oe.current||!e)return;let t=ie(e.direction??p,e.deltaX,e.deltaY);Math.abs(t)<en||(oe.current=!0,m?.(!0))}let xe=R({enabled:j&&!B,directions:me,elementRef:u.context.popupRef,ignoreSelectorWhenTouch:!1,ignoreScrollableAncestors:!0,movementCssVars:{x:$.swipeMovementX,y:$.swipeMovementY},onSwipeStart(e){if(`touches`in e||e.pointerType===`touch`)return;let t=d.current,n=s(t).getSelection?.();if(!n||n.isCollapsed)return;let r=i(n.anchorNode)?n.anchorNode:n.anchorNode?.parentElement,a=i(n.focusNode)?n.focusNode:n.focusNode?.parentElement;!P(t,r)&&!P(t,a)||n.removeAllRanges()},onSwipingChange(e){ae.current=e,gn(u.context.backdropRef.current,e),!e&&!h&&_e()},swipeThreshold({element:e,direction:t}){return bn(e,t)},canStart(e,t){let n=u.context.popupRef.current;if(!n)return!1;let r=n.ownerDocument,i=G(n.getRootNode(),e.x,e.y);if(!i||!P(n,i))return!1;let a=t.nativeEvent;return!((`touches`in a||a.pointerType===`touch`)&&wn(r,n))},onProgress(e,t){be(t);let n=!!(b&&b.length>0);if(ae.current&&p===`down`&&n&&t){let e=u.context.popupRef.current;e&&(e.style.removeProperty(`transform`),e.style.setProperty($.swipeMovementY,`${yt(D??0,t.deltaY)}px`))}let r=e;if(fe&&k>0){let e=D??fe.minOffset;t&&Number.isFinite(t.deltaY)?r=(e=>Y((e-fe.minOffset)/fe.range,0,1))(Y(e+t.deltaY,0,k)):pe!==null&&(r=pe)}ve(r,!0,!0)},onRelease({event:e,deltaX:t,deltaY:n,direction:r,velocityX:i,velocityY:a,releaseVelocityX:o,releaseVelocityY:s}){let c=u.context.popupRef.current;if(!c){ge();return}let l=c;function d(e){_e(),he(!0),l.style.removeProperty(`transition`),l.setAttribute(ee.endingStyle,``),tt.flushSync(()=>{re(ye(l,e,t,n,i,a,o,s))})}if(!b||b.length===0){if(!r){ge();return}let e=ie(r,t,n);if(e<=0)return ge(),!1;if(ie(r,i,a)>=tn)return d(r),!0;let o=e>bn(l,r);return o?d(r):ge(),o}if(p!==`down`&&p!==`up`){ge();return}if(!k)return ge(),!1;if(C.length===0){ge();return}let f=p===`down`?n:-n,m=Math.sign(f),h=p===`down`?s:-s,g=p===`down`?a:-a,v=h;if(m!==0&&Math.abs(f)>=en){let e=Math.sign(v);e!==0&&e!==m&&(v=g)}let y=D??0,x=Y(y+f,0,k),S=Math.abs(v)>=nn?Y(v,-4,an)*rn:0,E=_?x:Y(x+S,0,k),A=T(N,e),j=()=>(q.current=w,O(null,A),d(p),!0);if(_){let e=[...C].sort((e,t)=>e.offset-t.offset),t=e.map(e=>e.offset),n=xt(t,y),r=e[xt(t,E)],i=Math.sign(v),a=m!==0&&i!==0&&i===m&&Math.abs(v)>=nn,o=E;if(a){let t=Y(n+m,0,e.length-1);if(t!==n){let n=e[t];(m>0?E<n.offset:E>n.offset)&&(r=n,o=n.offset)}else if(m>0)return j()}return Math.abs(o-k)<Math.abs(o-r.offset)?j():(O(r.value,A),ge(),!1)}if(v>=tn&&f>0)return j();let M=C[xt(C.map(e=>e.offset),E)];return Math.abs(E-k)<Math.abs(E-M.offset)?j():(O(M.value,A),ge(),!1)},onDismiss(e){z?.set({swipeProgress:0,frontmostHeight:0});let t=u.context.backdropRef.current;t&&(t.style.setProperty(it.swipeProgress,`0`),t.style.removeProperty($.height));let n=T(N,e);if(u.setOpen(!1,n),n.isCanceled){let t=q.current;t!==void 0&&O(t,T(N,e)),q.current=void 0,J.current?.(),ge();return}if(u.select(`open`)){let t=e;X.request(()=>{if(u.select(`open`)){let e=q.current;e!==void 0&&O(e,T(N,t)),q.current=void 0,ge(),J.current?.()}else q.current=void 0});return}q.current=void 0,he(!0)}}),Se=xe.getPointerProps(),Ce=xe.getTouchProps(),{moveNative:we,reset:Te}=xe;J.current=Te,Q.useEffect(()=>{let e=I??L;if(!e)return;let t=e,n=s(t);function r(e,r,i){let a=W?i.clientY-r.lastY:i.clientX-r.lastX;if(e.touches.length===2||wn(n,t)||!A||!j||B||On(r,e,i,W))return;let o=r.scrollTarget;if(!o||o===n.documentElement||o===n.body){e.cancelable&&e.preventDefault(),e.stopPropagation(),we(e,t);return}if(!kn(o,U)){e.cancelable&&e.preventDefault(),e.stopPropagation();return}if(a!==0){let t=Mn(o,U,p,a);r.allowSwipe?e.cancelable&&e.preventDefault():e.cancelable&&t?(r.allowSwipe=!0,e.preventDefault()):r.allowSwipe=!1}r.allowSwipe===!0&&(e.stopPropagation(),we(e,t))}function i(e){if(de?.onTouchMove(e),le.current)return;let t=ue.current,n=e.touches[0];!n||!t||(r(e,t,n),Dn(t,n))}return K(n,`touchmove`,i,{passive:!1,capture:!0})},[j,B,A,L,W,U,p,we,I,de]),c(()=>{!fe||xe.swiping||ve(!A||M?0:pe??0,!0,!1)},[ve,g,M,h,A,pe,fe,xe.swiping,u,z]),c(()=>{if(h)return A||h(0),()=>{h(0)}},[h,A]),c(()=>{A&&(v.current||Te(),ge())},[ge,A,Te,v]),c(()=>{let e=f.current;return()=>{z?.set({swipeProgress:0,frontmostHeight:0}),gn(e,!1);let t=f.current;t!==e&&gn(t,!1),_e()}},[f,_e,z]);let Ee=Q.useMemo(()=>({swiping:xe.swiping,getDragStyles:xe.getDragStyles,swipeStrength:ne??null,setSwipeDismissed:he}),[he,xe.getDragStyles,xe.swiping,ne]);function De(e){le.current=e,ue.current=null}function Oe(){De(!1),se.current=``,ce.current=!1}function ke(e){return se.current=``,e.pointerType!==`touch`}return(0,Z.jsx)(Ve,{ref:t,className:r,style:a,render:n,...S(l,{onPointerDown(e){if(se.current=e.pointerType,ce.current=e.pointerType===`pen`,!A||!j||B)return;let t=G(e.currentTarget.getRootNode(),e.clientX,e.clientY);_n(t)||vn(t)||e.pointerType!==`touch`&&Se.onPointerDown?.(e)},onPointerMove(e){e.pointerType!==`touch`&&Se.onPointerMove?.(e)},onPointerUp(e){ke(e)&&Se.onPointerUp?.(e)},onPointerCancel(e){ke(e)&&Se.onPointerCancel?.(e)},onTouchStart(e){if(se.current===`pen`&&ce.current){ce.current=!1,De(!1);return}if(!A||!j||B){De(!1);return}let t=e.touches[0];if(!t)return;if(En(e)){De(!1);return}let n=e.currentTarget,r=G(n.getRootNode(),t.clientX,t.clientY),a=E(e.nativeEvent),o=i(a)?a:n;if(!P(n,o)){De(!0);return}if(de?.onTouchStart(e),_n(r)){De(!0);return}le.current=!1;let s=V(o,n,U),c=V(o,n,te)!=null,l=null;s&&(l=jn(s,U,p)?null:!1),ue.current={startX:t.clientX,startY:t.clientY,lastX:t.clientX,lastY:t.clientY,scrollTarget:s,hasCrossAxisScrollableContent:c,allowSwipe:l,preserveNativeCrossAxisScroll:!1,drawerAxisAttributed:!1},Ce.onTouchStart?.(e)},onTouchEnd(e){de?.onTouchEnd(e),Oe(),Ce.onTouchEnd?.(e)},onTouchCancel(e){de?.onTouchCancel(),Oe(),Ce.onTouchCancel?.(e)},"data-nested-dialog-open":void 0}),children:(0,Z.jsx)(Ct.Provider,{value:Ee,children:o})})});function gn(e,t){e?.toggleAttribute(gt.swiping,t)}function _n(e){return!!e?.closest(ne)}function vn(e){return!!e?.closest(mn)}function yn(e,t){return t===`left`||t===`right`?e.offsetWidth:e.offsetHeight}function bn(e,t){return Math.max(yn(e,t)*.5,en)}function xn(e,t){return e instanceof t.HTMLInputElement&&e.type===`range`}function Sn(e){return e.tagName===`INPUT`||e.tagName===`TEXTAREA`}function Cn(e,t){let n=i(e.anchorNode)?e.anchorNode:e.anchorNode?.parentElement,r=i(e.focusNode)?e.focusNode:e.focusNode?.parentElement;return e.containsNode(t,!0)||P(t,n)||P(t,r)}function wn(e,t){let n=M(e);if(n&&P(t,n)&&Sn(n)){let{selectionStart:e,selectionEnd:t}=n;if(e!=null&&t!=null&&e<t)return!0}let r=e.getSelection?.();return!r||r.isCollapsed?!1:Cn(r,t)}function Tn(e,t){return e.composedPath().some(e=>xn(e,t))}function En(e){return Tn(e.nativeEvent,r(e.currentTarget))}function Dn(e,t){e.lastX=t.clientX,e.lastY=t.clientY}function On(e,t,n,r){if(e.preserveNativeCrossAxisScroll)return!0;if(e.drawerAxisAttributed||e.allowSwipe===!0||!e.hasCrossAxisScrollableContent)return!1;if(!t.cancelable)return e.preserveNativeCrossAxisScroll=!0,!0;let i=r?n.clientY-e.startY:n.clientX-e.startX,a=r?n.clientX-e.startX:n.clientY-e.startY,o=Math.abs(i),s=Math.abs(a);return s>=fn&&s>o+pn?(e.preserveNativeCrossAxisScroll=!0,!0):o>=fn?(e.drawerAxisAttributed=!0,!1):!0}function kn(e,t){return An(e,t).max>0}function An(e,t){if(t===`vertical`){let t=Math.max(0,e.scrollHeight-e.clientHeight);return{offset:e.scrollTop,max:t}}let n=Math.max(0,e.scrollWidth-e.clientWidth);return{offset:e.scrollLeft,max:n}}function jn(e,t,n){let r=Nn(n,t),{offset:i,max:a}=An(e,t);return r?i<=0:i>=a}function Mn(e,t,n,r){return(Nn(n,t)?r>0:r<0)?jn(e,t,n):!1}function Nn(e,t){return t===`vertical`?e===`down`:e===`right`}var Pn=function(e){return e.keyboardInset=`--drawer-keyboard-inset`,e}({}),Fn=60,In=16,Ln=48,Rn=150,zn=4,Bn=60,Vn=10,Hn=16,Un=new Set([`email`,`number`,`password`,`search`,`tel`,`text`,`url`]),Wn=Symbol(`KeyboardTapBlocked`);function Gn(e){let{children:t}=e,n=Re(),i=n.useState(`open`),a=n.useState(`mounted`),o=n.useState(`modal`),c=n.useState(`nestedOpenDialogCount`),l=n.useState(`viewportElement`),u=c>0,d=Q.useRef(!1),f=Q.useRef(null),p=Q.useRef(null),m=Q.useRef(null),h=Q.useRef(!1),g=H(),_=X(),v=x(()=>{let e=m.current;e&&(e.element.style.overflowAnchor=e.overflowAnchor,e.element.style.paddingBottom=e.paddingBottom,e.element.style.scrollPaddingBottom=e.scrollPaddingBottom,m.current=null)}),y=x((e,t)=>{let n=Math.max(0,Math.ceil(t)),r=m.current;if(r&&!r.element.isConnected&&(v(),r=null),n===0){v();return}if(r&&r.element!==e&&(v(),r=null),!r){let t=b(e);r={element:e,overflowAnchor:e.style.overflowAnchor,paddingBottom:e.style.paddingBottom,scrollPaddingBottom:e.style.scrollPaddingBottom,computedPaddingBottom:Number.parseFloat(t.paddingBottom)||0,computedScrollPaddingBottom:Number.parseFloat(t.scrollPaddingBottom)||0},m.current=r}e.style.overflowAnchor=`none`,e.style.paddingBottom=`${r.computedPaddingBottom+n}px`,e.style.scrollPaddingBottom=`${r.computedScrollPaddingBottom+In}px`}),S=x((e,t)=>{let n=r(e).matchMedia?.(`(prefers-reduced-motion: reduce)`)?.matches?`auto`:`smooth`;e.scrollTo({top:t,behavior:n})}),C=x(()=>{d.current=!1,f.current=null});Q.useEffect(()=>{if(!a||!i){p.current=null,v(),g.cancel();return}if(!l){v();return}let e=s(l),t=r(l),n=t.visualViewport,c=null,d=0,f=0,m=-1,b=e=>{l.style.setProperty(Pn.keyboardInset,`${Math.max(0,Math.ceil(e))}px`)},x=()=>{p.current=null,c=null,b(0),v(),g.cancel(),_.clear()},C=t.scrollX,w=t.scrollY,T=()=>o!==!0||u||!p.current||tr(t)==null?!1:t.scrollX!==C||t.scrollY!==w?(t.scrollTo({left:C,top:w,behavior:`instant`}),!0):!1,D=null,O=()=>{D?.(),D=null},k=(e,t)=>{O();let n=e.getBoundingClientRect();D=$n(e,(t.top+t.bottom-n.top-n.bottom)/2)},A=()=>{O();let e=p.current;if(u||!e||!P(l,e)){b(0),v();return}T();let n=tr(t);if(!n){b(0),v();return}b(Math.max(0,t.innerHeight-n.bottom));let r=er(e,l);if(!r){v();return}let i=r.getBoundingClientRect(),a=Math.min(i.bottom,n.bottom),o=Math.max(0,i.bottom-n.bottom);y(r,o>0?o+Ln:0);let s=Math.max(0,r.scrollHeight-r.clientHeight);if(s<=0)return;let h=Math.max(i.top,n.top)+In,_=a-In;if(_<=h)return;let x=e.getBoundingClientRect(),C=r.scrollTop+(x.top+x.bottom-h-_)/2,w=Math.round(Y(C,0,s));if(!(c===r&&Math.abs(d-w)<=1)){let e=c===r?f+1:1;if(c=r,d=w,f=e,m=-1,e<=Bn){g.request(A);return}}else if(m>=0){let e=r.scrollTop;if(Math.abs(e-w)<=1)return;if(e!==m){m=e;return}}c=r,d=w,f=0,m=r.scrollTop,S(r,w)},j=()=>{g.request(A)},N=()=>{let e=zn,t=()=>{A(),--e,e>0&&_.start(Rn,t)};_.start(Rn,t)},F=e=>{if(u)return!1;let t=qn(e);return!t||!P(l,t)?!1:(p.current!==t&&(c=null),p.current=t,!0)},I=e=>{if(h.current=!1,O(),!F(E(e))){x();return}tr(t)!=null&&N(),j()},L=e=>{if(!h.current){if(F(e.relatedTarget)){let e=p.current,n=tr(t);e&&n&&k(e,n),j();return}x()}},R=()=>{(p.current||F(M(e)))&&j()},z=[];return n&&z.push(K(n,`resize`,R),K(n,`scroll`,R)),z.push(K(e,`focusin`,I,!0),K(e,`focusout`,L,!0),K(t,`scroll`,()=>{T()&&j()}),K(e,`pointerdown`,()=>{g.cancel(),_.clear(),c=null},!0)),F(M(e))&&j(),()=>{z.forEach(e=>e()),O(),x(),l.style.removeProperty(Pn.keyboardInset)}},[S,g,_,o,a,u,i,v,l,y]);let w=x(e=>{let t=e.touches[0];d.current=!1,f.current={x:t.clientX,y:t.clientY}}),T=x(e=>{let t=e.touches[0],n=f.current;!t||!n||d.current||(Math.abs(t.clientX-n.x)>Vn||Math.abs(t.clientY-n.y)>Vn)&&(d.current=!0)}),D=x(e=>{if(!i||!a||u||!l||!f.current||d.current){C();return}let t=e.changedTouches[0]??e.touches[0],n=l.getRootNode(),o=E(e.nativeEvent),c=t?Xn(n,t.clientX,t.clientY):null;if(c===Wn){C();return}let p=t&&(c??Jn(o));if(p&&(!P(l,p.focusTarget)||!P(l,p.clickTarget))){C();return}if(p){let{clickTarget:n,focusTarget:i}=p,a=r(i);if(a.visualViewport&&a.visualViewport.scale!==1){C();return}if(M(s(i))===i&&(!a.visualViewport||tr(a)!=null)){C();return}e.preventDefault(),h.current=!0;try{Qn(i)}finally{h.current=!1}Zn(n,t),C();return}C()}),O=Q.useMemo(()=>({onTouchStart:w,onTouchMove:T,onTouchEnd:D,onTouchCancel:C}),[D,T,w,C]);return(0,Z.jsx)(Qt.Provider,{value:O,children:t})}function Kn(e){if(e.isContentEditable)return!0;let t=r(e);return e instanceof t.HTMLTextAreaElement||e instanceof t.HTMLInputElement&&Un.has(e.type)?!e.matches(`:disabled`):!1}function qn(t){if(!e(t))return null;if(Kn(t))return t.isContentEditable?Yn(t):t;let n=t.closest(`label`)?.control??null;return e(n)&&Kn(n)?n:null}function Jn(t){if(!e(t))return null;let n=qn(t);return n?{focusTarget:n,clickTarget:t}:null}function Yn(e){let t=e;for(;t.parentElement?.isContentEditable;)t=t.parentElement;return t}function Xn(t,n,r){let i=G(t,n,r);if(e(i)){let e=qn(i);if(e)return{focusTarget:e,clickTarget:i}}if(j(i)||i?.closest(`label`)!=null)return Wn;for(let[e,i]of[[0,Hn],[0,-16],[Hn,0],[-16,0]]){let a=qn(G(t,n+e,r+i));if(a)return{focusTarget:a,clickTarget:a}}return null}function Zn(e,t){let n=r(e),i=n.PointerEvent??n.MouseEvent;e.dispatchEvent(new i(`click`,{bubbles:!0,cancelable:!0,clientX:t.clientX,clientY:t.clientY,detail:1,view:n}))}function Qn(e){let t=M(s(e))===e,n=$n(e,-2e3);try{t&&e.blur(),e.focus({preventScroll:!0})}finally{n()}}function $n(e,t){let n=e.style.opacity,r=e.style.transform,i=e.style.transition;return e.style.transition=`none`,e.style.opacity=`0`,e.style.transform=`translateY(${t}px)`,()=>{e.style.opacity=n,e.style.transform=r,e.style.transition=i}}function er(e,t){let n=p(e);return V(n,t,`vertical`)??V(n,t,`vertical`,!0)}function tr(e){let t=e.visualViewport;if(!t||t.scale!==1||e.innerHeight-t.height<=Fn)return null;let n=Math.max(0,t.offsetTop);return{top:n,bottom:Math.min(e.innerHeight,n+t.height)}}var nr=class extends Ue{};function rr(){return new nr}var ir=z(at,`tr-layer-backdrop tr-drawer-backdrop`),ar=z(ot,`tr-drawer-close`),or=z(ct,`tr-drawer-content`),sr=z(lt,`tr-drawer-description`);function cr(){return rr()}var lr=z(pt,`tr-drawer-indent`),ur=z(ht,`tr-drawer-indent-background`),dr=z(Ot,`tr-drawer-popup`),fr=z(kt,`tr-drawer-portal`),pr=z(At,`tr-drawer-provider`);function mr(e){return(0,Z.jsx)(Pt,{...e})}var hr=z(Yt,`tr-drawer-swipe-area`),gr=z(Xt,`tr-drawer-title`);function _r({className:e,...n}){return(0,Z.jsx)(Zt,{...n,className:t(`tr-drawer-trigger`,e)})}var vr={Backdrop:ir,Close:ar,Content:or,Description:sr,Indent:lr,IndentBackground:ur,Popup:dr,Portal:fr,Provider:pr,Root:mr,SwipeArea:hr,Title:gr,Trigger:_r,Viewport:z(hn,`tr-layer-viewport tr-drawer-viewport`),VirtualKeyboardProvider:z(Gn,`tr-drawer-virtual-keyboard-provider`),createHandle:cr},yr=(0,Q.createContext)(null);function br(e){let t=(0,Q.useContext)(yr);if(!t)throw Error(`TRAppShell.${e} must be used inside TRAppShell.Root.`);return t}function xr({appearance:e=`ghost`,className:n,uiSize:r=`md`,...i}){let{drawerActive:a,mobile:o}=br(`Close`);if(o&&!a)return null;let s=(0,Z.jsx)(ue,{...i,appearance:e,className:t(`tr-app-shell-close`,n),uiSize:r});return a?(0,Z.jsx)(vr.Close,{render:s}):s}function Sr({className:e,...t}){return(0,Z.jsx)(`header`,{...t,className:a(`tr-app-shell-header`,e)})}var Cr=Q.createContext(void 0);function wr(){let e=Q.useContext(Cr);if(e===void 0)throw Error(y(53));return e}function Tr(e,t,n){if(!e)return 0;let r=getComputedStyle(e),i=`${t}${n===`x`?`Inline`:`Block`}`,a=parseFloat(r[`${i}Start`]);return n===`x`&&t===`margin`?a*2:a+parseFloat(r[`${i}End`])}var Er=e=>t=>t?{[e]:``}:null,Dr={hasOverflowX:Er(`data-has-overflow-x`),hasOverflowY:Er(`data-has-overflow-y`),overflowXStart:Er(`data-overflow-x-start`),overflowXEnd:Er(`data-overflow-x-end`),overflowYStart:Er(`data-overflow-y-start`),overflowYEnd:Er(`data-overflow-y-end`),cornerHidden:()=>null},Or={x:0,y:0},kr={width:0,height:0},Ar={xStart:!1,xEnd:!1,yStart:!1,yEnd:!1},jr={x:!0,y:!0,corner:!0},Mr=Q.forwardRef(function(e,t){let{render:n,className:r,overflowEdgeThreshold:i,style:a,...o}=e,{xStart:s,xEnd:c,yStart:u,yEnd:d}=Nr(i),f=fe(),p=X(),m=X(),{nonce:h,disableStyleElements:g}=he(),[_,v]=Q.useState(!1),[y,b]=Q.useState(!1),[S,C]=Q.useState(!1),[w,T]=Q.useState(!1),[E,D]=Q.useState(!1),[O,k]=Q.useState(kr),[A,j]=Q.useState(kr),[M,N]=Q.useState(Ar),[F,I]=Q.useState(jr),L=Q.useRef(null),R=Q.useRef(null),z=Q.useRef(null),B=Q.useRef(null),V=Q.useRef(null),H=Q.useRef(null),ee=Q.useRef(null),U=Q.useRef(null),W=Q.useRef(0),te=Q.useRef(0),ne=Q.useRef(0),re=Q.useRef(0),G=Q.useRef(`vertical`),K=Q.useRef(Or),q=Q.useRef(null);function J(e){let t=e?C:b,n=e?p:m;t(!0),n.start(500,()=>{t(!1)})}let ie=x(e=>{let t=e.x-K.current.x,n=e.y-K.current.y;K.current=e,n!==0&&J(!0),t!==0&&J(!1)}),Y=x(()=>{let e=R.current;e&&q.current===null&&(q.current=e.style.scrollSnapType,e.style.scrollSnapType=`none`)}),ae=x(e=>{if(e.button!==0||U.current!==null&&(G.current===`vertical`?V.current:H.current)?.hasPointerCapture(U.current))return;U.current=e.pointerId,W.current=e.clientY,te.current=e.clientX,G.current=e.currentTarget.getAttribute(`data-orientation`);let t=R.current;t&&(ne.current=t.scrollTop,re.current=t.scrollLeft,Y()),(G.current===`vertical`?V.current:H.current)?.setPointerCapture(e.pointerId)}),oe=x(e=>{if(e.pointerId!==U.current)return;U.current=null,(G.current===`vertical`?C:b)(!1),q.current!==null&&(R.current&&(R.current.style.scrollSnapType=q.current),q.current=null);let t=G.current===`vertical`?V.current:H.current;t?.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId)}),se=x(e=>{if(e.pointerId!==U.current)return;if(e.buttons%2==0){oe(e);return}let t=R.current;if(!t)return;let n=G.current===`vertical`,r=n?V.current:H.current,i=n?z.current:B.current;if(!r||!i)return;let a=n?`y`:`x`,o=Tr(i,`padding`,a),s=Tr(r,`margin`,a),c=n?r.offsetHeight:r.offsetWidth,l=(n?i.offsetHeight:i.offsetWidth)-c-o-s,u=n?e.clientY-W.current:e.clientX-te.current,d=l<=0?0:u/l,f=n?t.scrollHeight:t.scrollWidth,p=n?t.clientHeight:t.clientWidth,m=(n?ne.current:re.current)+d*(f-p);n?t.scrollTop=m:t.scrollLeft=m,e.preventDefault(),J(n)});function ce(e){T(e.pointerType===`touch`)}function le(e){if(ce(e),e.pointerType!==`touch`){let t=P(L.current,e.target);v(t)}}let ue=Q.useMemo(()=>({scrolling:y||S,hasOverflowX:!F.x,hasOverflowY:!F.y,overflowXStart:M.xStart,overflowXEnd:M.xEnd,overflowYStart:M.yStart,overflowYEnd:M.yEnd,cornerHidden:F.corner}),[y,S,F.x,F.y,F.corner,M]),de={role:`presentation`,onPointerEnter:le,onPointerMove:le,onPointerDown:ce,onPointerLeave(){v(!1)},style:{position:`relative`,"--scroll-area-corner-height":`${O.height}px`,"--scroll-area-corner-width":`${O.width}px`}},pe=l(`div`,e,{state:ue,ref:[t,L],props:[de,o],stateAttributesMapping:Dr}),me=Q.useMemo(()=>({handlePointerDown:ae,handlePointerMove:se,handlePointerUp:oe,handleScroll:ie,disableViewportSnap:Y,cornerSize:O,setCornerSize:k,thumbSize:A,setThumbSize:j,hasMeasuredScrollbar:E,setHasMeasuredScrollbar:D,touchModality:w,cornerRef:ee,scrollingX:y,scrollingY:S,hovering:_,setHovering:v,viewportRef:R,scrollbarYRef:z,scrollbarXRef:B,thumbYRef:V,thumbXRef:H,rootId:f,hiddenState:F,setHiddenState:I,overflowEdges:M,setOverflowEdges:N,viewportState:ue,overflowEdgeThreshold:{xStart:s,xEnd:c,yStart:u,yEnd:d}}),[ae,se,oe,ie,Y,O,A,E,w,y,S,_,f,F,M,ue,s,c,u,d]);return(0,Z.jsxs)(Cr.Provider,{value:me,children:[!g&&Se.getElement(h),pe]})});function Nr(e){let t=typeof e==`number`?{xStart:e,xEnd:e,yStart:e,yEnd:e}:e;return{xStart:Math.max(0,t?.xStart||0),xEnd:Math.max(0,t?.xEnd||0),yStart:Math.max(0,t?.yStart||0),yEnd:Math.max(0,t?.yEnd||0)}}var Pr=Q.createContext(void 0);function Fr(){let e=Q.useContext(Pr);if(e===void 0)throw Error(y(55));return e}var Ir=[`--scroll-area-overflow-x-start`,`--scroll-area-overflow-x-end`,`--scroll-area-overflow-y-start`,`--scroll-area-overflow-y-end`],Lr=!1;function Rr(){Lr||L||(typeof CSS<`u`&&`registerProperty`in CSS&&Ir.forEach(e=>{try{CSS.registerProperty({name:e,syntax:`<length>`,inherits:!1,initialValue:`0px`})}catch{}}),Lr=!0)}var zr=Q.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e,{viewportRef:o,scrollbarYRef:s,scrollbarXRef:u,thumbYRef:d,thumbXRef:f,cornerRef:p,cornerSize:m,setCornerSize:h,setThumbSize:g,rootId:_,setHiddenState:v,hiddenState:y,setHasMeasuredScrollbar:b,handleScroll:S,touchModality:C,setHovering:w,setOverflowEdges:T,overflowEdgeThreshold:E,viewportState:D}=wr(),k=O(),A=Q.useRef(!0),j=Q.useRef([NaN,NaN,NaN,NaN]),M=X(),N=X(),P=x(()=>{let e=o.current,t=s.current,n=u.current,r=d.current,i=f.current,a=p.current;if(!e)return;let c=e.scrollHeight,l=e.scrollWidth,_=e.clientHeight,y=e.clientWidth,x=e.scrollTop,S=e.scrollLeft,C=j.current,w=Number.isNaN(C[0]);if(C[0]=_,C[1]=c,C[2]=y,C[3]=l,w&&b(!0),c===0||l===0)return;let D=Br(e),O=D.y,A=D.x,M=y/l,N=_/c,P=Math.max(0,l-y),F=Math.max(0,c-_),I=0,L=0;A||(I=xe(k===`rtl`?-S:S,P),L=P-I);let R=O?0:xe(x,F),z=O?0:F-R,B=A?0:y,V=O?0:_,H=0,ee=0;!A&&!O&&(H=t?.offsetWidth||0,ee=n?.offsetHeight||0);let U=m.width===0&&m.height===0,W=U?H:0,te=U?ee:0,ne=Tr(n,`padding`,`x`),re=Tr(t,`padding`,`y`),G=Tr(i,`margin`,`x`),K=Tr(r,`margin`,`y`),q=B-ne-G,J=V-re-K,ie=n?Math.min(n.offsetWidth-W,q):q,Y=t?Math.min(t.offsetHeight-te,J):J,X=Math.max(16,ie*M),ae=Math.max(16,Y*N);if(g(e=>Vr(e,{width:X,height:ae})),t&&r){let e=Hr(r,`--scroll-area-thumb-height`,x,F,c,ae,t.offsetHeight-ae-re-K);r.style.transform=`translate3d(0,${e}px,0)`}if(n&&i){let e=n.offsetWidth-X-ne-G,t=Hr(i,`--scroll-area-thumb-width`,k===`rtl`?-S:S,P,l,X,e);i.style.transform=`translate3d(${k===`rtl`?-t:t}px,0,0)`}let oe=[I,L,R,z];Ir.forEach((t,n)=>{e.style.setProperty(t,`${oe[n]}px`)}),a&&h(e=>Vr(e,{width:H,height:ee})),v(e=>Vr(e,D));let se={xStart:!A&&I>E.xStart,xEnd:!A&&L>E.xEnd,yStart:!O&&R>E.yStart,yEnd:!O&&z>E.yEnd};T(e=>Vr(e,se))});c(()=>{Rr()},[]),c(()=>{queueMicrotask(P)},[P,y,k,E.xStart,E.xEnd,E.yStart,E.yEnd]),c(()=>{o.current?.matches(`:hover`)&&w(!0)},[o,w]),c(()=>{let e=o.current;if(typeof ResizeObserver>`u`||!e)return;let t=!1,n=new ResizeObserver(()=>{if(!t){t=!0;let n=j.current;if(n[0]===e.clientHeight&&n[1]===e.scrollHeight&&n[2]===e.clientWidth&&n[3]===e.scrollWidth)return}P()});return n.observe(e),N.start(0,()=>{let t=e.getAnimations({subtree:!0});t.length!==0&&Promise.allSettled(t.map(e=>e.finished)).then(P).catch(()=>{})}),()=>{n.disconnect(),N.clear()}},[P,o,N]);function F(){A.current=!1}let I={role:`presentation`,..._&&{"data-id":`${_}-viewport`},tabIndex:y.x&&y.y?-1:0,className:Se.className,style:{overflow:`scroll`},onScroll(){o.current&&(P(),(C||!A.current)&&S({x:o.current.scrollLeft,y:o.current.scrollTop}),M.start(100,()=>{A.current=!0}))},onWheel:F,onPointerMove:F,onPointerEnter:F,onKeyDown:F},L=l(`div`,e,{ref:[t,o],state:D,props:[I,a],stateAttributesMapping:Dr}),R=Q.useMemo(()=>({computeThumbPosition:P}),[P]);return(0,Z.jsx)(Pr.Provider,{value:R,children:L})});function Br(e){let t=e.clientHeight>=e.scrollHeight,n=e.clientWidth>=e.scrollWidth;return{y:t,x:n,corner:t||n}}function Vr(e,t){for(let n in t)if(e[n]!==t[n])return t;return e}function Hr(e,t,n,r,i,a,o){let s=Y(n,0,r),c=n-s,l=Math.max(16,a*i/(i+Math.abs(c)));return e.style.setProperty(t,c?`${l}px`:``),(r?s/r*o:0)+(c>0?a-l:0)}var Ur=Q.createContext(void 0);function Wr(){let e=Q.useContext(Ur);if(e===void 0)throw Error(y(54));return e}var Gr=Q.forwardRef(function(e,t){let{render:n,className:r,orientation:i=`vertical`,keepMounted:a=!1,style:o,...s}=e,{hovering:c,scrollingX:u,scrollingY:d,hiddenState:f,scrollbarYRef:p,scrollbarXRef:m,viewportRef:h,thumbYRef:g,thumbXRef:_,handlePointerDown:v,handlePointerUp:y,handleScroll:b,disableViewportSnap:x,rootId:S,thumbSize:C,hasMeasuredScrollbar:w,viewportState:T}=wr(),D=i===`vertical`,k={...T,hovering:c,scrolling:D?d:u,orientation:i},A=O(),j=!w&&!a,M=D?f.y:f.x,N=a||!M;Q.useEffect(()=>{if(!N)return;let e=h.current,t=D?p.current:m.current;if(!t)return;function n(t){if(!e||t.ctrlKey)return;let n=!D,r=n?`scrollLeft`:`scrollTop`,i=n?t.deltaX:t.deltaY;if(i===0)return;let a=n?e.scrollWidth-e.clientWidth:e.scrollHeight-e.clientHeight,o=n&&A===`rtl`?-a:0,s=n&&A===`rtl`?0:a,c=e[r];c<=o&&i<0||c>=s&&i>0||(t.preventDefault(),e[r]=Math.min(s,Math.max(o,c+i)),b({x:e.scrollLeft,y:e.scrollTop}))}return K(t,`wheel`,n,{passive:!1})},[A,b,D,m,p,N,h]);let F={...S&&{"data-id":`${S}-scrollbar`},onPointerDown(e){if(e.button!==0)return;let t=E(e.nativeEvent),n=D?g.current:_.current;if(n&&P(n,t))return;let r=h.current;if(!r)return;let i=D?p.current:m.current;if(!n||!i)return;let a=D?`y`:`x`,o=Tr(n,`margin`,a),s=Tr(i,`padding`,a),c=D?n.offsetHeight:n.offsetWidth,l=i.getBoundingClientRect(),u=D?e.clientY-l.top-c/2-s+o/2:e.clientX-l.left-c/2-s+o/2,d=D?r.scrollHeight:r.scrollWidth,f=D?r.clientHeight:r.clientWidth,y=(D?i.offsetHeight:i.offsetWidth)-c-s-o;if(y<=0)return;let S=u/y,C=d-f;x(),D?r.scrollTop=S*C:A===`rtl`?r.scrollLeft=-(1-S)*C:r.scrollLeft=S*C,b({x:r.scrollLeft,y:r.scrollTop}),v(e)},onPointerUp:y,onPointerCancel:y,style:{position:`absolute`,touchAction:`none`,WebkitUserSelect:`none`,userSelect:`none`,visibility:j?`hidden`:void 0,...D?{top:0,bottom:`var(--scroll-area-corner-height)`,insetInlineEnd:0,"--scroll-area-thumb-height":`${C.height}px`}:{insetInlineStart:0,insetInlineEnd:`var(--scroll-area-corner-width)`,bottom:0,"--scroll-area-thumb-width":`${C.width}px`}}},I=l(`div`,e,{ref:[t,D?p:m],state:k,props:[F,s],stateAttributesMapping:Dr});return N?(0,Z.jsx)(Ur.Provider,{value:i,children:I}):null}),Kr=Q.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e,{computeThumbPosition:o}=Fr(),{hasMeasuredScrollbar:s,viewportState:u}=wr(),d=Q.useRef(null),f=Q.useRef(s);return c(()=>{if(typeof ResizeObserver>`u`)return;let e=!1,t=new ResizeObserver(()=>{!e&&(e=!0,!f.current)||o()});return d.current&&t.observe(d.current),()=>{t.disconnect()}},[o]),l(`div`,e,{ref:[t,d],state:u,stateAttributesMapping:Dr,props:[{role:`presentation`,style:{minWidth:`fit-content`}},a]})}),qr=Q.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e,{thumbYRef:o,thumbXRef:s,handlePointerDown:c,handlePointerMove:u,handlePointerUp:d,scrollingX:f,scrollingY:p,hasMeasuredScrollbar:m}=wr(),h=Wr(),g=h===`vertical`;return l(`div`,e,{ref:[t,g?o:s],state:{scrolling:g?p:f,orientation:h},props:[{onPointerDown:c,onPointerMove:u,onPointerUp:d,onPointerCancel:d,style:{visibility:m?void 0:`hidden`,...g?{height:`var(--scroll-area-thumb-height)`}:{width:`var(--scroll-area-thumb-width)`}}},a]})}),Jr=Q.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e,{cornerRef:o,cornerSize:s,hiddenState:c}=wr(),u=l(`div`,e,{ref:[t,o],props:[{style:{position:`absolute`,bottom:0,insetInlineEnd:0,width:s.width,height:s.height}},a]});return c.corner?null:u}),Yr=z(Kr,`tr-scroll-area-content`),Xr=z(Jr,`tr-scroll-area-corner`);function Zr({autoHide:e=!1,className:n,variant:r=`surface`,...i}){return(0,Z.jsx)(Mr,{...i,className:t(`tr-scroll-area`,n),"data-auto-hide":e||void 0,"data-variant":r})}var Qr=z(Gr,`tr-scroll-area-scrollbar`),$r=z(qr,`tr-scroll-area-thumb`),ei={Root:Zr,Viewport:z(zr,`tr-scroll-area-viewport`),Scrollbar:Qr,Content:Yr,Thumb:$r,Corner:Xr};function ti({children:e,className:t,contentClassName:n,ref:r,render:i,scroll:o=!1,viewportLabel:s=`Page content`,...c}){let{isPending:l,mainViewportRef:u,onMainScroll:d,pageScroll:f}=br(`Main`),p=(0,Z.jsx)(`div`,{"aria-busy":l||void 0,className:a(`tr-app-shell-main-content`,n),children:e}),m=e;return o&&f===`document`?m=p:o&&(m=(0,Z.jsxs)(ei.Root,{className:`tr-app-shell-main-scroll-area`,variant:`plain`,children:[(0,Z.jsx)(ei.Viewport,{"aria-label":s,className:`tr-app-shell-main-viewport`,onScroll:d,ref:u,role:`region`,children:(0,Z.jsx)(ei.Content,{"aria-busy":l||void 0,className:a(`tr-app-shell-main-content`,n),children:e})}),(0,Z.jsx)(ei.Scrollbar,{orientation:`vertical`,children:(0,Z.jsx)(ei.Thumb,{})})]})),h({defaultTagName:`main`,props:{...c,children:m,className:a(`tr-app-shell-main`,t)},ref:r,render:i})}function ni({className:e,...t}){return(0,Z.jsx)(`aside`,{...t,className:a(`tr-app-shell-outline`,e)})}var ri={sm:`40rem`,md:`48rem`,lg:`64rem`,xl:`80rem`},ii=typeof window>`u`?Q.useEffect:Q.useLayoutEffect,ai=Q.createContext(void 0);function oi(){let e=Q.useContext(ai);if(e===void 0)throw Error(y(51));return e}var si={status(e){return{[`data-${e}`]:``}}},ci=Q.forwardRef(function(e,t){let{format:n,getAriaValueText:r,locale:i,max:a=100,min:o=0,value:s,render:c,className:u,children:d,style:f,...p}=e,[m,h]=Q.useState(),g=`indeterminate`,_=null,v=null,y=``,b=`indeterminate progress`;if(s!=null&&Number.isFinite(s)){let e=Ke(s,o,a);_=Y(Number.isNaN(e)?0:e,0,100),v=Y(s,o,a),g=v===a?`complete`:`progressing`,y=n?Ge(v,i,n):Ge(_/100,i,{style:`percent`}),b=y}let x=Q.useMemo(()=>({status:g}),[g]),S={"aria-labelledby":m,"aria-valuemax":a,"aria-valuemin":o,"aria-valuenow":v??void 0,"aria-valuetext":r?r(y,s):b,role:`progressbar`,children:(0,Z.jsxs)(Q.Fragment,{children:[d,(0,Z.jsx)(`span`,{role:`presentation`,style:B,children:`x`})]})},C=Q.useMemo(()=>({formattedValue:y,percentageValue:_,setLabelId:h,state:x,value:s}),[y,_,h,x,s]),w=l(`div`,e,{state:x,ref:t,props:[S,p],stateAttributesMapping:si});return(0,Z.jsx)(ai.Provider,{value:C,children:w})}),li=Q.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e,{state:o}=oi();return l(`div`,e,{state:o,ref:t,props:a,stateAttributesMapping:si})}),ui=Q.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e,{percentageValue:o,state:s}=oi();return l(`div`,e,{state:s,ref:t,props:[{style:o==null?{}:{insetInlineStart:0,height:`inherit`,width:`${o}%`}},a],stateAttributesMapping:si})}),di=Q.forwardRef(function(e,t){let{className:n,render:r,children:i,style:a,...o}=e,{value:s,formattedValue:c,state:u}=oi(),d=u.status===`indeterminate`;return l(`span`,e,{state:u,ref:t,props:[{"aria-hidden":!0,children:typeof i==`function`?i(d?`indeterminate`:c,s):d?null:c},o],stateAttributesMapping:si})}),fi=Q.forwardRef(function(e,t){let{render:n,className:r,style:i,id:a,...o}=e,{setLabelId:s,state:c}=oi();return l(`span`,e,{state:c,ref:t,props:[{id:_e(a,s),role:`presentation`},o],stateAttributesMapping:si})}),pi=z(ui,`tr-progress-indicator`),mi=z(fi,`tr-progress-label`);function hi({className:e,uiSize:n=`md`,variant:r=`neutral`,...i}){return(0,Z.jsx)(ci,{...i,className:t(`tr-progress`,e),"data-ui-size":n,"data-variant":r})}var gi={Root:hi,Track:z(li,`tr-progress-track`),Indicator:pi,Label:mi,Value:z(di,`tr-progress-value`)};function _i({label:e}){return(0,Z.jsxs)(gi.Root,{className:`tr-app-shell-progress`,uiSize:`md`,value:null,children:[(0,Z.jsx)(gi.Label,{className:`tr-app-shell-visually-hidden`,children:e}),(0,Z.jsx)(gi.Track,{children:(0,Z.jsx)(gi.Indicator,{})})]})}var vi={sm:`(width < ${ri.md})`,lg:`(width < ${ri.lg})`};function yi(e,t){let n=window.matchMedia(e);return n.addEventListener(`change`,t),()=>n.removeEventListener(`change`,t)}function bi(e){let t=e.replace(/^#/,``);try{return decodeURIComponent(t)}catch{return t}}function xi({breakpoint:e=`lg`,children:t,chrome:n=`app`,className:r,currentPath:i,defaultOpen:o,defaultSidebarMode:s=`expanded`,drawerPopupClassName:c,hash:l=``,layout:u=`header-first`,loadingLabel:d=`Loading page`,locationKey:f,mobileDrawerSide:p=`left`,mobileSidebar:m=`drawer`,navigationKind:h=`PUSH`,onOpenChange:g,onSidebarModeChange:_,open:v,pageScroll:y=`container`,pendingPath:b,portalContainer:x,sidebarMode:S,...C}){let w=vi[e],T=(0,Q.useSyncExternalStore)(e=>yi(w,e),()=>window.matchMedia(w).matches,()=>!1),[E,D]=(0,Q.useState)(s),O=T&&m===`rail`?`rail`:S??E,k=T&&m===`drawer`,A=(0,Q.useCallback)(e=>{S===void 0&&D(e),_?.(e)},[S,_]),j=(0,Q.useMemo)(()=>vr.createHandle(),[]),M=(0,Q.useRef)(null),N=(0,Q.useRef)(null),P=(0,Q.useRef)(new Map),F=b!==void 0&&i!==void 0&&b!==i,I=f??i??``,L=y===`document`,R=(0,Q.useRef)(!1),z=(0,Q.useCallback)(e=>{P.current.set(I,e.currentTarget.scrollTop)},[I]),B=(0,Q.useMemo)(()=>({breakpoint:e,chrome:n,defaultOpen:o,drawerHandle:j,drawerPopupClassName:c,drawerActive:k,isPending:F,mainViewportRef:N,mobile:T,mobileDrawerSide:p,mobileSidebar:m,onMainScroll:z,onOpenChange:g,open:v,pageScroll:y,portalContainer:x,setSidebarMode:A,sidebarMode:O,triggerRef:M}),[e,n,o,j,c,k,F,T,p,m,z,g,v,y,x,A,O]);return ii(()=>{if(!L||!(`scrollRestoration`in history))return;let e=history.scrollRestoration;return history.scrollRestoration=`manual`,()=>{history.scrollRestoration=e}},[L]),(0,Q.useEffect)(()=>{if(!L)return;let e=()=>{R.current||P.current.set(I,window.scrollY)};return window.addEventListener(`scroll`,e,{passive:!0}),()=>window.removeEventListener(`scroll`,e)},[L,I]),(0,Q.useEffect)(()=>{let e=N.current;if(!L&&e===null)return;R.current=!0;let t=requestAnimationFrame(()=>{R.current=!1});if(l.length>1){let t=document.getElementById(bi(l));t!==null&&(L||e?.contains(t)===!0)&&t.scrollIntoView({block:`start`})}else{let t=h===`POP`?P.current.get(I)??0:0;L?window.scrollTo(0,t):e!==null&&(e.scrollTop=t)}return()=>cancelAnimationFrame(t)},[L,l,I,h]),(0,Z.jsx)(yr.Provider,{value:B,children:(0,Z.jsxs)(`div`,{...C,className:a(`tr-app-shell`,r),"data-breakpoint":e,"data-chrome":n,"data-layout":u,"data-mobile-sidebar":m,"data-page-scroll":y,"data-sidebar-mode":O,children:[F?(0,Z.jsx)(_i,{label:d}):null,t]})})}function Si({children:e}){return(0,Z.jsxs)(ei.Root,{className:`tr-app-shell-scroll-area`,variant:`plain`,children:[(0,Z.jsx)(ei.Viewport,{className:`tr-app-shell-scroll-viewport`,children:(0,Z.jsx)(ei.Content,{children:e})}),(0,Z.jsx)(ei.Scrollbar,{orientation:`vertical`,children:(0,Z.jsx)(ei.Thumb,{})})]})}function Ci({children:e,className:t,collapsed:n=!1,...r}){let{defaultOpen:i,drawerHandle:o,drawerPopupClassName:s,drawerActive:c,mobileDrawerSide:l,mobile:u,onOpenChange:d,open:f,portalContainer:p,sidebarMode:m,triggerRef:h}=br(`Sidebar`),g={...r[`aria-label`]?{"aria-label":r[`aria-label`]}:{},...r[`aria-labelledby`]?{"aria-labelledby":r[`aria-labelledby`]}:{}},_=(0,Z.jsx)(`aside`,{...r,className:a(`tr-app-shell-sidebar`,t),"data-collapsed":n?`true`:`false`,"data-sidebar-mode":c?`expanded`:m,inert:n&&!c,children:(0,Z.jsx)(Si,{children:e})});return!u||!c?_:(0,Z.jsx)(vr.Root,{defaultOpen:i,handle:o,modal:!0,onOpenChange:d,open:f,swipeDirection:l,children:(0,Z.jsxs)(vr.Portal,{container:p,children:[(0,Z.jsx)(vr.Backdrop,{className:`tr-app-shell-backdrop`}),(0,Z.jsx)(vr.Viewport,{className:a(`tr-app-shell-drawer-viewport`,l===`right`?`tr-app-shell-drawer-viewport-right`:void 0),children:(0,Z.jsx)(vr.Popup,{...g,className:a(`tr-app-shell-drawer-popup`,s),finalFocus:()=>h.current,children:(0,Z.jsx)(vr.Content,{className:`tr-app-shell-drawer-content`,children:_})})})]})})}function wi({className:e,...t}){return(0,Z.jsx)(`span`,{...t,className:a(`tr-app-shell-sidebar-label`,e)})}function Ti({appearance:e=`ghost`,className:n,onClick:r,uiSize:i=`md`,...a}){let{mobile:o,setSidebarMode:s,sidebarMode:c}=br(`SidebarToggle`);return o?null:(0,Z.jsx)(ue,{...a,appearance:e,"aria-expanded":c===`expanded`,className:t(`tr-app-shell-sidebar-toggle`,n),onClick:e=>{r?.(e),e.defaultPrevented||s(c===`expanded`?`rail`:`expanded`)},uiSize:i})}function Ei({appearance:e=`ghost`,className:n,ref:r,uiSize:i=`md`,...a}){let{drawerActive:o,drawerHandle:s,mobile:c,triggerRef:l}=br(`Trigger`),u=(0,Q.useCallback)(e=>{l.current=e,typeof r==`function`?r(e):r&&(r.current=e)},[r,l]);return c&&!o?null:(0,Z.jsx)(vr.Trigger,{handle:s,render:(0,Z.jsx)(ue,{...a,appearance:e,className:t(`tr-app-shell-trigger`,n),ref:u,uiSize:i})})}var Di={Actions:nt,Brand:rt,Close:xr,Header:Sr,Main:ti,Outline:ni,Root:xi,Sidebar:Ci,SidebarLabel:wi,SidebarToggle:Ti,Trigger:Ei};function Oi(e,t){return e(t===`admin`?`admin.users.roleAdmin`:`admin.users.roleUser`)}function ki(e,t){return e(t===`database`?`admin.users.sourceDatabase`:`admin.users.sourceConfig`)}function Ai({user:e,current:t,title:n,description:r,children:i}){let{t:a}=f(),{title:o,iconUrl:s}=ve(),{colorScheme:c,toggleColorScheme:l}=I(),u=w(),d=A(),p=se({...Ee,onSuccess:async()=>{d.setQueryData(ke.queryKey,{user:null}),await qe(),u.navigate({to:`/login`})},onSettled:()=>{d.invalidateQueries({queryKey:ke.queryKey})}});return(0,Z.jsxs)(Di.Root,{breakpoint:`lg`,className:`bg-tinyrack-surface`,children:[(0,Z.jsx)(ce,{}),(0,Z.jsxs)(Di.Sidebar,{className:`flex flex-col gap-tinyrack-xl border-tinyrack-border border-r-tinyrack-default bg-tinyrack-surface p-tinyrack-lg`,children:[(0,Z.jsx)(Di.Close,{"aria-label":a(`admin.nav.close`),children:(0,Z.jsx)(de,{"aria-hidden":!0,className:`size-tinyrack-lg`})}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-md`,children:[s?(0,Z.jsx)(`img`,{alt:``,className:`size-tinyrack-2xl object-contain`,src:s}):(0,Z.jsx)(Ne.Root,{shape:`square`,uiSize:`lg`,children:(0,Z.jsx)(Ne.Fallback,{className:`bg-tinyrack-primary text-tinyrack-on-primary`,children:(0,Z.jsx)(Qe,{"aria-hidden":!0,className:`size-tinyrack-xl`})})}),(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(m,{as:`p`,truncate:!0,weight:`medium`,children:o??a(`admin.mobileTitle`)}),(0,Z.jsx)(m,{as:`p`,color:`muted`,variant:`caption`,children:a(`admin.console`)})]})]}),(0,Z.jsxs)(`ul`,{className:`flex w-full flex-col gap-tinyrack-xs p-0`,children:[(0,Z.jsx)(`li`,{children:(0,Z.jsx)(ji,{active:t===`dashboard`,icon:Je,to:`/admin`,children:a(`admin.nav.dashboard`)})}),(0,Z.jsx)(`li`,{children:(0,Z.jsx)(ji,{active:t===`users`,icon:$e,to:`/admin/users`,children:a(`admin.nav.users`)})})]}),(0,Z.jsxs)(`div`,{className:`mt-auto flex flex-col items-start gap-tinyrack-sm border-tinyrack-border border-t-tinyrack-default pt-tinyrack-lg`,children:[(0,Z.jsx)(m,{color:`muted`,variant:`label`,children:a(`admin.signedInAs`)}),(0,Z.jsx)(m,{as:`p`,className:`w-full`,truncate:!0,variant:`bodySm`,children:e.email}),(0,Z.jsx)(je,{uiSize:`md`,variant:`neutral`,children:a(`admin.roleBadge`,{role:Oi(a,e.role)})}),(0,Z.jsxs)(_,{appearance:`ghost`,"data-testid":`admin-logout`,disabled:p.isPending,loading:p.isPending,onClick:()=>p.mutate(),type:`button`,uiSize:`sm`,children:[(0,Z.jsx)(Te,{"aria-hidden":!0,className:`size-tinyrack-lg`}),a(`profile.logout`)]})]})]}),(0,Z.jsxs)(Di.Header,{className:`sticky top-0 z-tinyrack-chrome flex items-center gap-tinyrack-md border-tinyrack-border border-b-tinyrack-default bg-tinyrack-surface px-tinyrack-lg lg:px-tinyrack-2xl`,children:[(0,Z.jsx)(Di.Trigger,{"aria-label":a(`admin.nav.open`),children:(0,Z.jsx)(Ye,{"aria-hidden":!0,className:`size-tinyrack-xl`})}),(0,Z.jsxs)(Di.Brand,{className:`min-w-0`,children:[(0,Z.jsxs)(`nav`,{"aria-label":a(`admin.breadcrumbLabel`),className:`hidden items-center gap-tinyrack-sm lg:flex`,children:[(0,Z.jsx)(m,{color:`muted`,variant:`bodySm`,children:a(`admin.console`)}),(0,Z.jsx)(we,{"aria-hidden":!0,className:`size-tinyrack-lg text-tinyrack-text-placeholder`}),(0,Z.jsx)(m,{variant:`bodySm`,weight:`medium`,children:n})]}),(0,Z.jsxs)(`div`,{className:`min-w-0 lg:hidden`,children:[(0,Z.jsx)(m,{as:`p`,truncate:!0,weight:`medium`,children:a(`admin.mobileTitle`)}),(0,Z.jsx)(m,{as:`p`,color:`muted`,truncate:!0,variant:`caption`,children:e.email})]})]}),(0,Z.jsxs)(Di.Actions,{children:[(0,Z.jsxs)(`div`,{className:`hidden items-center gap-tinyrack-xs rounded-tinyrack-full border border-tinyrack-border bg-tinyrack-surface-muted px-tinyrack-md py-tinyrack-xs sm:flex`,children:[(0,Z.jsx)(`span`,{"aria-hidden":!0,className:`size-tinyrack-sm rounded-tinyrack-full bg-tinyrack-success`}),(0,Z.jsx)(m,{color:`muted`,variant:`caption`,children:a(`admin.livePolicy`)})]}),(0,Z.jsx)(je,{uiSize:`md`,variant:`neutral`,children:a(`admin.environment`)}),(0,Z.jsx)(ye,{}),(0,Z.jsx)(le,{colorScheme:c,onToggle:l})]})]}),(0,Z.jsxs)(Di.Main,{className:`mx-auto flex w-full flex-1 flex-col gap-tinyrack-xl px-tinyrack-lg py-tinyrack-2xl lg:px-tinyrack-2xl`,children:[(0,Z.jsxs)(`header`,{className:`flex flex-col gap-tinyrack-xl xl:flex-row xl:items-end xl:justify-between`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-tinyrack-md`,children:[(0,Z.jsx)(m,{color:`primary`,variant:`label`,children:a(`admin.eyebrow`)}),(0,Z.jsx)(m,{as:`h1`,variant:`display`,children:n}),(0,Z.jsx)(m,{as:`p`,className:`max-w-tinyrack-overlay-md`,color:`muted`,variant:`body`,children:r})]}),(0,Z.jsx)(Me,{className:`max-w-tinyrack-overlay-md`,icon:De,type:`warning`,children:a(`admin.readonlyNotice`)})]}),i]})]})}function ji({active:e,icon:t,to:n,children:r}){return(0,Z.jsxs)(k,{className:`flex items-center gap-tinyrack-sm rounded-tinyrack-md px-tinyrack-lg py-tinyrack-sm ${e?`bg-tinyrack-surface-selected font-tinyrack-medium text-tinyrack-text`:`text-tinyrack-text-muted hover:bg-tinyrack-surface-hover hover:text-tinyrack-text`}`,to:n,children:[(0,Z.jsx)(t,{"aria-hidden":!0,className:`size-tinyrack-lg`}),(0,Z.jsx)(`span`,{children:r})]})}function Mi({label:e,value:t,hint:n,accent:r}){return(0,Z.jsxs)(`div`,{className:`flex flex-1 flex-col gap-tinyrack-xs p-tinyrack-xl`,children:[r&&(0,Z.jsx)(`div`,{className:`mb-tinyrack-sm h-tinyrack-xs w-tinyrack-3xl rounded-tinyrack-full ${r}`}),(0,Z.jsx)(m,{as:`p`,color:`muted`,variant:`bodySm`,children:e}),(0,Z.jsx)(m,{as:`p`,variant:`headingLg`,children:t}),(0,Z.jsx)(m,{as:`p`,color:`muted`,variant:`caption`,children:n})]})}var Ni={query:``,page:1,pageSize:20,includeDeleted:!1};function Pi(e={}){return{...Ni,...e}}async function Fi({query:e,page:t,pageSize:n,includeDeleted:r,managedBy:i,role:a}){return W(await J.api.admin.users.$get({query:{query:e,page:String(t),page_size:String(n),include_deleted:String(r),managed_by:i,role:a}}))}async function Ii(e){return W(await J.api.admin.users.$post({json:e}))}async function Li({sub:e,...t}){return W(await J.api.admin.users[`:sub`].$patch({param:{sub:e},json:t}))}async function Ri(e){return W(await J.api.admin.users[`:sub`].$delete({param:{sub:e}}))}var zi=(e={})=>{let t=Pi(e);return ae({queryKey:[`admin`,`users`,t],queryFn:async()=>Fi(t)})};export{Li as a,Oi as c,$e as d,Pi as i,ki as l,Ii as n,Mi as o,Ri as r,Ai as s,zi as t,et as u};
|
|
2
|
-
//# sourceMappingURL=admin-users-DvPbw1Vq.js.map
|