@tinyrack/issuary-server 0.24.0 → 0.25.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/package.json +1 -1
- package/public/assets/2fa-BlpDkf-r.js +2 -0
- package/public/assets/{2fa-6btYq1AL.js.map → 2fa-BlpDkf-r.js.map} +1 -1
- package/public/assets/{2fa-Dxh4Kxy-.js → 2fa-DIpGlpoI.js} +2 -2
- package/public/assets/{2fa-Dxh4Kxy-.js.map → 2fa-DIpGlpoI.js.map} +1 -1
- package/public/assets/2fa-tzTSqiOS.js +2 -0
- package/public/assets/{2fa-UcpXAI9J.js.map → 2fa-tzTSqiOS.js.map} +1 -1
- package/public/assets/{2fa-D3ieXkuh.js → 2fa-waFAdIa0.js} +2 -2
- package/public/assets/{2fa-D3ieXkuh.js.map → 2fa-waFAdIa0.js.map} +1 -1
- package/public/assets/DialogHandle-ChG5Sj7T.js +2 -0
- package/public/assets/{DialogHandle-tiMUnjZQ.js.map → DialogHandle-ChG5Sj7T.js.map} +1 -1
- package/public/assets/{admin-B8RQbf4_.js → admin-Ii29X08B.js} +2 -2
- package/public/assets/{admin-B8RQbf4_.js.map → admin-Ii29X08B.js.map} +1 -1
- package/public/assets/{admin-users-Dz1QNdy3.js → admin-users-d7tT-cjc.js} +2 -2
- package/public/assets/{admin-users-Dz1QNdy3.js.map → admin-users-d7tT-cjc.js.map} +1 -1
- package/public/assets/alert-leqyvHOp.js.map +1 -1
- package/public/assets/{auth-choice-row-DWzfcZQY.js → auth-choice-row-DUvFyo7b.js} +2 -2
- package/public/assets/{auth-choice-row-DWzfcZQY.js.map → auth-choice-row-DUvFyo7b.js.map} +1 -1
- package/public/assets/{auth-field-DsLGh1U-.js → auth-field-BSlAWkbx.js} +2 -2
- package/public/assets/{auth-field-DsLGh1U-.js.map → auth-field-BSlAWkbx.js.map} +1 -1
- package/public/assets/auth-layout-CcJy6dVY.js +2 -0
- package/public/assets/auth-layout-CcJy6dVY.js.map +1 -0
- package/public/assets/{auth-page-header-COvqWINf.js → auth-page-header-ZLhtQ7Et.js} +2 -2
- package/public/assets/{auth-page-header-COvqWINf.js.map → auth-page-header-ZLhtQ7Et.js.map} +1 -1
- package/public/assets/{authorization-context-banner-DVx1TsPY.js → authorization-context-banner-DfkjwE93.js} +2 -2
- package/public/assets/{authorization-context-banner-DVx1TsPY.js.map → authorization-context-banner-DfkjwE93.js.map} +1 -1
- package/public/assets/{avatar-BCLugfaZ.js → avatar-D-70MKp8.js} +2 -2
- package/public/assets/{avatar-BCLugfaZ.js.map → avatar-D-70MKp8.js.map} +1 -1
- package/public/assets/badge-CsOfUji0.js.map +1 -1
- package/public/assets/checkbox-C3UmXoKz.js +2 -0
- package/public/assets/{checkbox-CFVDS3zJ.js.map → checkbox-C3UmXoKz.js.map} +1 -1
- package/public/assets/config-DTQCUlfZ.js.map +1 -1
- package/public/assets/{consent-ChiWc7Ql.js → consent-BJgO9pEV.js} +2 -2
- package/public/assets/{consent-ChiWc7Ql.js.map → consent-BJgO9pEV.js.map} +1 -1
- package/public/assets/{consent-CKOohdYI.js → consent-D_yGE8TR.js} +2 -2
- package/public/assets/{consent-CKOohdYI.js.map → consent-D_yGE8TR.js.map} +1 -1
- package/public/assets/createLucideIcon-BPpAIXR_.js.map +1 -1
- package/public/assets/{email-Crjg1dcr.js → email-DAa8JGoC.js} +2 -2
- package/public/assets/{email-Crjg1dcr.js.map → email-DAa8JGoC.js.map} +1 -1
- package/public/assets/email-tzTSqiOS.js +2 -0
- package/public/assets/{email-UcpXAI9J.js.map → email-tzTSqiOS.js.map} +1 -1
- package/public/assets/{error-VfMv226c.js → error-Dj4QQ8vW.js} +2 -2
- package/public/assets/{error-VfMv226c.js.map → error-Dj4QQ8vW.js.map} +1 -1
- package/public/assets/field-CEs4ugVJ.js +3 -0
- package/public/assets/{field-89zKYDVL.js.map → field-CEs4ugVJ.js.map} +1 -1
- package/public/assets/{forgot-Dr88fVMq.js → forgot-CYMAWPVu.js} +2 -2
- package/public/assets/{forgot-Dr88fVMq.js.map → forgot-CYMAWPVu.js.map} +1 -1
- package/public/assets/forgot-tzTSqiOS.js +2 -0
- package/public/assets/{forgot-UcpXAI9J.js.map → forgot-tzTSqiOS.js.map} +1 -1
- package/public/assets/{index-CZ0rWM7l.js → index-H6CJKjiN.js} +3 -3
- package/public/assets/{index-CZ0rWM7l.js.map → index-H6CJKjiN.js.map} +1 -1
- package/public/assets/{index-CDD8owGK.css → index-kD9gQA-w.css} +1 -1
- package/public/assets/{initial-avatar-ocwNWL38.js → initial-avatar-DjSqgENY.js} +2 -2
- package/public/assets/{initial-avatar-ocwNWL38.js.map → initial-avatar-DjSqgENY.js.map} +1 -1
- package/public/assets/{input-GPigtjgi.js → input-BHPUSlfp.js} +2 -2
- package/public/assets/{input-GPigtjgi.js.map → input-BHPUSlfp.js.map} +1 -1
- package/public/assets/link-C-WdTj3F.js.map +1 -1
- package/public/assets/{login-CQeTLmIu.js → login-CBinfk4L.js} +2 -2
- package/public/assets/{login-CQeTLmIu.js.map → login-CBinfk4L.js.map} +1 -1
- package/public/assets/login-tzTSqiOS.js +2 -0
- package/public/assets/{login-UcpXAI9J.js.map → login-tzTSqiOS.js.map} +1 -1
- package/public/assets/{modal-BV3gpI-p.js → modal-CwoBUXp3.js} +2 -2
- package/public/assets/{modal-BV3gpI-p.js.map → modal-CwoBUXp3.js.map} +1 -1
- package/public/assets/{passkey-Bf7n49Z7.js → passkey-Jw2CRzJp.js} +2 -2
- package/public/assets/{passkey-Bf7n49Z7.js.map → passkey-Jw2CRzJp.js.map} +1 -1
- package/public/assets/{passkey-CT3G7pCL.js → passkey-V_tav53p.js} +2 -2
- package/public/assets/{passkey-CT3G7pCL.js.map → passkey-V_tav53p.js.map} +1 -1
- package/public/assets/passkey-tzTSqiOS.js +2 -0
- package/public/assets/{passkey-UcpXAI9J.js.map → passkey-tzTSqiOS.js.map} +1 -1
- package/public/assets/{password-BKI5GTRs.js → password-6QOqTV_s.js} +2 -2
- package/public/assets/{password-BKI5GTRs.js.map → password-6QOqTV_s.js.map} +1 -1
- package/public/assets/{password-strength-DTWF07Px.js → password-strength-DtGMHOD-.js} +2 -2
- package/public/assets/{password-strength-DTWF07Px.js.map → password-strength-DtGMHOD-.js.map} +1 -1
- package/public/assets/password-tzTSqiOS.js +2 -0
- package/public/assets/{password-UcpXAI9J.js.map → password-tzTSqiOS.js.map} +1 -1
- package/public/assets/pin-input-DdhzDNy9.js +2 -0
- package/public/assets/{pin-input-BGOLfkwL.js.map → pin-input-DdhzDNy9.js.map} +1 -1
- package/public/assets/{profile-DSTMtoUf.js → profile-DVjIWt8X.js} +2 -2
- package/public/assets/{profile-DSTMtoUf.js.map → profile-DVjIWt8X.js.map} +1 -1
- package/public/assets/profile-SHr6F-7b.js +2 -0
- package/public/assets/profile-SHr6F-7b.js.map +1 -0
- package/public/assets/{recovery-DbgpqG6f.js → recovery-CvNl-yt9.js} +2 -2
- package/public/assets/{recovery-DbgpqG6f.js.map → recovery-CvNl-yt9.js.map} +1 -1
- package/public/assets/{register-B2Lixapy.js → register-SFXa5EeL.js} +2 -2
- package/public/assets/{register-B2Lixapy.js.map → register-SFXa5EeL.js.map} +1 -1
- package/public/assets/register-tzTSqiOS.js +2 -0
- package/public/assets/{register-UcpXAI9J.js.map → register-tzTSqiOS.js.map} +1 -1
- package/public/assets/{reset-C-Qjl2Qy.js → reset-l-pLzjwe.js} +2 -2
- package/public/assets/{reset-C-Qjl2Qy.js.map → reset-l-pLzjwe.js.map} +1 -1
- package/public/assets/reset-tzTSqiOS.js +2 -0
- package/public/assets/{reset-UcpXAI9J.js.map → reset-tzTSqiOS.js.map} +1 -1
- package/public/assets/{select-BKx4bF4A.js → select-D2H87qXJ.js} +2 -2
- package/public/assets/{select-BKx4bF4A.js.map → select-D2H87qXJ.js.map} +1 -1
- package/public/assets/select-tzTSqiOS.js +2 -0
- package/public/assets/{select-UcpXAI9J.js.map → select-tzTSqiOS.js.map} +1 -1
- package/public/assets/separator-B0Bvh1he.js.map +1 -1
- package/public/assets/shell-header-bar-BPgCjFPv.js +2 -0
- package/public/assets/shell-header-bar-BPgCjFPv.js.map +1 -0
- package/public/assets/{terms-Vgpg5IZK.js → terms-D5rfQhog.js} +2 -2
- package/public/assets/{terms-Vgpg5IZK.js.map → terms-D5rfQhog.js.map} +1 -1
- package/public/assets/{terms-DSTMtoUf.js → terms-DVjIWt8X.js} +2 -2
- package/public/assets/{terms-DSTMtoUf.js.map → terms-DVjIWt8X.js.map} +1 -1
- package/public/assets/{terms-checkbox-list-DqbXU4qw.js → terms-checkbox-list-BKJcS2pJ.js} +2 -2
- package/public/assets/{terms-checkbox-list-DqbXU4qw.js.map → terms-checkbox-list-BKJcS2pJ.js.map} +1 -1
- package/public/assets/{totp-g0-s50HZ.js → totp-BbQi-gsF.js} +2 -2
- package/public/assets/{totp-g0-s50HZ.js.map → totp-BbQi-gsF.js.map} +1 -1
- package/public/assets/{totp-Cjns-PoB.js → totp-wY0Zji8E.js} +2 -2
- package/public/assets/{totp-Cjns-PoB.js.map → totp-wY0Zji8E.js.map} +1 -1
- package/public/assets/{use-totp-setup-CtTaklH-.js → use-totp-setup-OH_GTMxA.js} +3 -3
- package/public/assets/{use-totp-setup-CtTaklH-.js.map → use-totp-setup-OH_GTMxA.js.map} +1 -1
- package/public/assets/{useAriaLabelledBy-7uIPXK-0.js → useAriaLabelledBy-9o83pv9X.js} +2 -2
- package/public/assets/{useAriaLabelledBy-7uIPXK-0.js.map → useAriaLabelledBy-9o83pv9X.js.map} +1 -1
- package/public/assets/useQuery-CI5Ukuae.js +2 -0
- package/public/assets/{useQuery-pOdkMV4B.js.map → useQuery-CI5Ukuae.js.map} +1 -1
- package/public/assets/{users-B1hvVo3B.js → users-DqCnblEo.js} +2 -2
- package/public/assets/{users-B1hvVo3B.js.map → users-DqCnblEo.js.map} +1 -1
- package/public/index.html +2 -2
- package/public/assets/2fa-6btYq1AL.js +0 -2
- package/public/assets/2fa-UcpXAI9J.js +0 -2
- package/public/assets/DialogHandle-tiMUnjZQ.js +0 -2
- package/public/assets/auth-layout-DGTylGtX.js +0 -2
- package/public/assets/auth-layout-DGTylGtX.js.map +0 -1
- package/public/assets/checkbox-CFVDS3zJ.js +0 -2
- package/public/assets/email-UcpXAI9J.js +0 -2
- package/public/assets/field-89zKYDVL.js +0 -3
- package/public/assets/forgot-UcpXAI9J.js +0 -2
- package/public/assets/login-UcpXAI9J.js +0 -2
- package/public/assets/passkey-UcpXAI9J.js +0 -2
- package/public/assets/password-UcpXAI9J.js +0 -2
- package/public/assets/pin-input-BGOLfkwL.js +0 -2
- package/public/assets/profile-RpDmbWNA.js +0 -2
- package/public/assets/profile-RpDmbWNA.js.map +0 -1
- package/public/assets/register-UcpXAI9J.js +0 -2
- package/public/assets/reset-UcpXAI9J.js +0 -2
- package/public/assets/select-UcpXAI9J.js +0 -2
- package/public/assets/shell-header-bar-CgyNXbPS.js +0 -2
- package/public/assets/shell-header-bar-CgyNXbPS.js.map +0 -1
- package/public/assets/useQuery-pOdkMV4B.js +0 -2
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"2fa-
|
|
1
|
+
{"version":3,"file":"2fa-BlpDkf-r.js","names":["RouteErrorFallback","SplitErrorComponent","errorComponent"],"sources":["../../../frontend/src/routes/setup/2fa/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import { useSuspenseQuery } from '@tanstack/react-query';\nimport { createFileRoute, Link } from '@tanstack/react-router';\nimport { FingerprintIcon, ShieldCheckIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { AuthChoiceRow } from '#frontend/components/auth/auth-choice-row.tsx';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport { extractOAuthParams } from '#frontend/libs/oauth-search.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\n\nexport const Route = createFileRoute('/setup/2fa/')({\n component: Setup2FA,\n errorComponent: RouteErrorFallback,\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\nfunction Setup2FA() {\n const { t } = useTranslation();\n const search = Route.useSearch();\n const { data: appConfig } = useSuspenseQuery(appConfigQueryOptions);\n const oauthParams = extractOAuthParams(search);\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('setup2fa.subtitle')}\n title={t('setup2fa.title')}\n />\n\n <Alert icon={ShieldCheckIcon} type=\"info\">\n {t('setup2fa.required')}\n </Alert>\n\n <div className=\"flex flex-col gap-tinyrack-sm\">\n {appConfig.auth.password.enabled &&\n appConfig.auth.password.totp.enabled && (\n <AuthChoiceRow\n description={t('setup2fa.totp.description')}\n icon={ShieldCheckIcon}\n label={t('setup2fa.totp.title')}\n // No children here — the row supplies them, and an element\n // passed to `render` with children would override them.\n render={<Link search={oauthParams} to=\"/setup/totp\" />}\n />\n )}\n\n {appConfig.auth.passkey.enabled && (\n <AuthChoiceRow\n description={t('setup2fa.passkey.description')}\n icon={FingerprintIcon}\n label={t('setup2fa.passkey.title')}\n render={\n <Link\n search={{\n ...oauthParams,\n passkey_name: 'default',\n }}\n to=\"/setup/passkey\"\n />\n }\n />\n )}\n </div>\n\n <AuthFooter>\n <AuthFooterLink\n link={\n <Link search={oauthParams} to=\"/login\">\n {t('setup2fa.backToLogin')}\n </Link>\n }\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"mappings":"wCAWsF,IAAAC,EAA7ED"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e,q as t}from"./createLucideIcon-BPpAIXR_.js";import{Sn as n,t as r}from"./config-DTQCUlfZ.js";import{
|
|
2
|
-
//# sourceMappingURL=2fa-
|
|
1
|
+
import{i as e,q as t}from"./createLucideIcon-BPpAIXR_.js";import{Sn as n,t as r}from"./config-DTQCUlfZ.js";import{nt as i}from"./shell-header-bar-BPgCjFPv.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-H6CJKjiN.js";import{t as l}from"./auth-choice-row-DUvFyo7b.js";import{t as u}from"./auth-page-header-ZLhtQ7Et.js";import{t as d}from"./auth-layout-CcJy6dVY.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-DIpGlpoI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"2fa-
|
|
1
|
+
{"version":3,"file":"2fa-DIpGlpoI.js","names":["useSuspenseQuery","Link","FingerprintIcon","ShieldCheckIcon","useTranslation","AuthChoiceRow","AuthFooter","AuthFooterLink","AuthPageHeader","AuthLayout","extractOAuthParams","appConfigQueryOptions","Route","Verify2FA","t","search","useSearch","oauthParams","data","appConfig","auth","password","enabled","totp","passkey","component"],"sources":["../../../frontend/src/routes/verify/2fa/index.tsx?tsr-split=component"],"sourcesContent":["import { useSuspenseQuery } from '@tanstack/react-query';\nimport { createFileRoute, Link } from '@tanstack/react-router';\nimport { FingerprintIcon, ShieldCheckIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { AuthChoiceRow } from '#frontend/components/auth/auth-choice-row.tsx';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport { extractOAuthParams } from '#frontend/libs/oauth-search.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nexport const Route = createFileRoute('/verify/2fa/')({\n component: Verify2FA,\n errorComponent: RouteErrorFallback,\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\nfunction Verify2FA() {\n const { t } = useTranslation();\n const search = Route.useSearch();\n const oauthParams = extractOAuthParams(search);\n const { data: appConfig } = useSuspenseQuery(appConfigQueryOptions);\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('verify2fa.subtitle')}\n title={t('verify2fa.title')}\n />\n\n <div className=\"flex flex-col gap-tinyrack-sm\">\n {appConfig.auth.password.enabled &&\n appConfig.auth.password.totp.enabled && (\n <AuthChoiceRow\n description={t('verify2fa.totp.description')}\n icon={ShieldCheckIcon}\n label={t('verify2fa.totp.title')}\n // No children here — the row supplies them, and an element\n // passed to `render` with children would override them.\n render={<Link search={oauthParams} to=\"/verify/totp\" />}\n />\n )}\n\n {appConfig.auth.passkey.enabled && (\n <AuthChoiceRow\n description={t('verify2fa.passkey.description')}\n icon={FingerprintIcon}\n label={t('verify2fa.passkey.title')}\n render={<Link search={oauthParams} to=\"/verify/passkey\" />}\n />\n )}\n </div>\n\n <AuthFooter>\n <AuthFooterLink\n link={\n <Link search={oauthParams} to=\"/login\">\n {t('verify2fa.backToLogin')}\n </Link>\n }\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"mappings":"qgBAsBA,SAASa,GAAY,CACnB,GAAM,CAAEC,GAAMV,EAAe,EAEvBa,EAAcP,EADLE,EAAMI,UACkBD,CAAM,EACvC,CAAEG,KAAMC,GAAcnB,EAAiBW,CAAqB,EAElE,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,SAAUG,EAAE,oBAAoB,EAChC,MAAOA,EAAE,iBAAiB,CAAE,CAAA,GAG9B,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,yCAAf,CACGK,EAAUC,KAAKC,SAASC,SACvBH,EAAUC,KAAKC,SAASE,KAAKD,UAC3B,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,YAAaR,EAAE,4BAA4B,EAC3C,KAAMX,EACN,MAAOW,EAAE,sBAAsB,EAG/B,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,OAAQG,EAAa,GAAG,cAAc,CAAA,CAAI,CAAA,EAI7DE,EAAUC,KAAKI,QAAQF,UACtB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,YAAaR,EAAE,+BAA+B,EAC9C,KAAMZ,EACN,MAAOY,EAAE,yBAAyB,EAClC,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,OAAQG,EAAa,GAAG,iBAAiB,CAAA,CAAI,CAAA,CAG5D,KAEL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,OAAQA,EAAa,GAAG,kBAC3BH,EAAE,uBAAuB,CACtB,CAAA,CACP,CAAA,CAEO,CAAA,CACF,CAAA,CAAA,CAEhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"2fa-
|
|
1
|
+
{"version":3,"file":"2fa-tzTSqiOS.js","names":["RouteErrorFallback","SplitErrorComponent","errorComponent"],"sources":["../../../frontend/src/routes/verify/2fa/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import { useSuspenseQuery } from '@tanstack/react-query';\nimport { createFileRoute, Link } from '@tanstack/react-router';\nimport { FingerprintIcon, ShieldCheckIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { AuthChoiceRow } from '#frontend/components/auth/auth-choice-row.tsx';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport { extractOAuthParams } from '#frontend/libs/oauth-search.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nexport const Route = createFileRoute('/verify/2fa/')({\n component: Verify2FA,\n errorComponent: RouteErrorFallback,\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\nfunction Verify2FA() {\n const { t } = useTranslation();\n const search = Route.useSearch();\n const oauthParams = extractOAuthParams(search);\n const { data: appConfig } = useSuspenseQuery(appConfigQueryOptions);\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('verify2fa.subtitle')}\n title={t('verify2fa.title')}\n />\n\n <div className=\"flex flex-col gap-tinyrack-sm\">\n {appConfig.auth.password.enabled &&\n appConfig.auth.password.totp.enabled && (\n <AuthChoiceRow\n description={t('verify2fa.totp.description')}\n icon={ShieldCheckIcon}\n label={t('verify2fa.totp.title')}\n // No children here — the row supplies them, and an element\n // passed to `render` with children would override them.\n render={<Link search={oauthParams} to=\"/verify/totp\" />}\n />\n )}\n\n {appConfig.auth.passkey.enabled && (\n <AuthChoiceRow\n description={t('verify2fa.passkey.description')}\n icon={FingerprintIcon}\n label={t('verify2fa.passkey.title')}\n render={<Link search={oauthParams} to=\"/verify/passkey\" />}\n />\n )}\n </div>\n\n <AuthFooter>\n <AuthFooterLink\n link={\n <Link search={oauthParams} to=\"/login\">\n {t('verify2fa.backToLogin')}\n </Link>\n }\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"mappings":"wCAUsF,IAAAC,EAA7ED"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e,q as t}from"./createLucideIcon-BPpAIXR_.js";import{Sn as n,t as r}from"./config-DTQCUlfZ.js";import{
|
|
2
|
-
//# sourceMappingURL=2fa-
|
|
1
|
+
import{i as e,q as t}from"./createLucideIcon-BPpAIXR_.js";import{Sn as n,t as r}from"./config-DTQCUlfZ.js";import{nt as i}from"./shell-header-bar-BPgCjFPv.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-H6CJKjiN.js";import{t as l}from"./auth-choice-row-DUvFyo7b.js";import{t as u}from"./auth-page-header-ZLhtQ7Et.js";import{t as d}from"./alert-leqyvHOp.js";import{t as f}from"./auth-layout-CcJy6dVY.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-waFAdIa0.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"2fa-
|
|
1
|
+
{"version":3,"file":"2fa-waFAdIa0.js","names":["useSuspenseQuery","Link","FingerprintIcon","ShieldCheckIcon","useTranslation","AuthChoiceRow","AuthFooter","AuthFooterLink","AuthPageHeader","Alert","AuthLayout","extractOAuthParams","appConfigQueryOptions","Route","Setup2FA","t","search","useSearch","data","appConfig","oauthParams","auth","password","enabled","totp","passkey","passkey_name","component"],"sources":["../../../frontend/src/routes/setup/2fa/index.tsx?tsr-split=component"],"sourcesContent":["import { useSuspenseQuery } from '@tanstack/react-query';\nimport { createFileRoute, Link } from '@tanstack/react-router';\nimport { FingerprintIcon, ShieldCheckIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { AuthChoiceRow } from '#frontend/components/auth/auth-choice-row.tsx';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport { extractOAuthParams } from '#frontend/libs/oauth-search.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\n\nexport const Route = createFileRoute('/setup/2fa/')({\n component: Setup2FA,\n errorComponent: RouteErrorFallback,\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\nfunction Setup2FA() {\n const { t } = useTranslation();\n const search = Route.useSearch();\n const { data: appConfig } = useSuspenseQuery(appConfigQueryOptions);\n const oauthParams = extractOAuthParams(search);\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('setup2fa.subtitle')}\n title={t('setup2fa.title')}\n />\n\n <Alert icon={ShieldCheckIcon} type=\"info\">\n {t('setup2fa.required')}\n </Alert>\n\n <div className=\"flex flex-col gap-tinyrack-sm\">\n {appConfig.auth.password.enabled &&\n appConfig.auth.password.totp.enabled && (\n <AuthChoiceRow\n description={t('setup2fa.totp.description')}\n icon={ShieldCheckIcon}\n label={t('setup2fa.totp.title')}\n // No children here — the row supplies them, and an element\n // passed to `render` with children would override them.\n render={<Link search={oauthParams} to=\"/setup/totp\" />}\n />\n )}\n\n {appConfig.auth.passkey.enabled && (\n <AuthChoiceRow\n description={t('setup2fa.passkey.description')}\n icon={FingerprintIcon}\n label={t('setup2fa.passkey.title')}\n render={\n <Link\n search={{\n ...oauthParams,\n passkey_name: 'default',\n }}\n to=\"/setup/passkey\"\n />\n }\n />\n )}\n </div>\n\n <AuthFooter>\n <AuthFooterLink\n link={\n <Link search={oauthParams} to=\"/login\">\n {t('setup2fa.backToLogin')}\n </Link>\n }\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"mappings":"6iBAwBA,SAASc,GAAW,CAClB,GAAM,CAAEC,GAAMX,EAAe,EACvBY,EAASH,EAAMI,UAAU,EACzB,CAAEC,KAAMC,GAAcnB,EAAiBY,CAAqB,EAC5DQ,EAAcT,EAAmBK,CAAM,EAE7C,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,SAAUD,EAAE,mBAAmB,EAC/B,MAAOA,EAAE,gBAAgB,CAAE,CAAA,GAG7B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,KAAMZ,EAAiB,KAAK,gBAChCY,EAAE,mBAAmB,CACjB,CAAA,GAEP,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,yCAAf,CACGI,EAAUE,KAAKC,SAASC,SACvBJ,EAAUE,KAAKC,SAASE,KAAKD,UAC3B,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,YAAaR,EAAE,2BAA2B,EAC1C,KAAMZ,EACN,MAAOY,EAAE,qBAAqB,EAG9B,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,OAAQK,EAAa,GAAG,aAAa,CAAA,CAAI,CAAA,EAI5DD,EAAUE,KAAKI,QAAQF,UACtB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,YAAaR,EAAE,8BAA8B,EAC7C,KAAMb,EACN,MAAOa,EAAE,wBAAwB,EACjC,QACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ,CACN,GAAGK,EACHM,aAAc,SAChB,EACA,GAAG,gBAAgB,CAAA,CAEtB,CAAA,CAGF,KAEL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,OAAQN,EAAa,GAAG,kBAC3BL,EAAE,sBAAsB,CACrB,CAAA,CACP,CAAA,CAEO,CAAA,CACF,CAAA,CAAA,CAEhB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{J as e,Z as t,b as n,c as r,h as i,q as a,v as o}from"./createLucideIcon-BPpAIXR_.js";import{H as s,L as c,P as l,Qt as u,Zt as d,_t as f,g as p,hn as m,j as h,ut as g,vt as _,w as v,y}from"./config-DTQCUlfZ.js";import{$ as b,G as x,I as S,J as C,K as w,L as T,Q as E,R as D,U as O,V as k,W as A,Y as j,et as M,f as N,i as P,p as F,q as I,v as L,w as R,z}from"./shell-header-bar-BPgCjFPv.js";var B=t(e(),1),V=B.createContext(void 0);function H(e){let t=B.useContext(V);if(!e&&t===void 0)throw Error(o(27));return t}var U=B.forwardRef(function(e,t){let{render:n,className:a,style:o,disabled:s=!1,nativeButton:u=!0,...d}=e,f=H(),p=f.useState(`open`),{getButtonProps:m,buttonRef:h}=i({disabled:s,native:u}),g={disabled:s};function _(e){p&&f.setOpen(!1,l(c,e.nativeEvent))}return r(`button`,e,{state:g,ref:[t,h],props:[{onClick:_},d,m]})}),W=B.forwardRef(function(e,t){let{render:n,className:i,style:a,id:o,...s}=e,c=H(),l=R(o);return c.useSyncedValueWithCleanup(`descriptionElementId`,l),r(`p`,e,{ref:t,props:[{id:l},s]})}),G=B.createContext(void 0);function K(){let e=B.useContext(G);if(e===void 0)throw Error(o(26));return e}var q=a(),J=B.forwardRef(function(e,t){let{keepMounted:n=!1,...r}=e,i=H(),a=i.useState(`mounted`),o=i.useState(`modal`),s=i.useState(`open`);return a||n?(0,q.jsx)(G.Provider,{value:n,children:(0,q.jsxs)(h,{ref:t,...r,children:[a&&o===!0&&(0,q.jsx)(F,{ref:i.context.internalBackdropRef,inert:_(!s)}),e.children]})}):null});function ee({store:e,parentContext:t,isDrawer:r}){let i=e.useState(`open`),a=e.useState(`disablePointerDismissal`),o=e.useState(`modal`),s=e.useState(`popupElement`),c=e.useState(`floatingRootContext`),[l,f]=B.useState(0),[p,m]=B.useState(0),h=l===0,g=b(c,{outsidePressEvent(){return e.context.internalBackdropRef.current||e.context.backdropRef.current?`intentional`:{mouse:o===`trap-focus`?`sloppy`:`intentional`,touch:`sloppy`}},outsidePress(t){if(!e.context.outsidePressEnabledRef.current||`button`in t&&t.button!==0)return!1;if(`touches`in t){if(t.type===`touchend`){if(t.changedTouches.length!==1||t.touches.length!==0)return!1}else if(t.touches.length!==1)return!1}let n=u(t);if(h&&!a){if(o){let t=e.context.internalBackdropRef.current,r=e.context.backdropRef.current;return t||r?t===n||r===n||d(n,s)&&!n?.hasAttribute(`data-base-ui-portal`):!0}return!0}return!1},escapeKey:h});return N(i&&o===!0,s),e.useContextCallback(`onNestedDialogOpen`,(e,t)=>{f(e),m(t)}),n(()=>(t?.onNestedDialogOpen&&(i?t.onNestedDialogOpen(l+1,p+ +!!r):t.onNestedDialogOpen(0,0)),()=>{t?.onNestedDialogOpen&&i&&t.onNestedDialogOpen(0,0)}),[r,i,l,p,t]),w(e,{activeTriggerProps:g.reference,inactiveTriggerProps:g.trigger,popupProps:g.floating,nestedOpenDialogCount:l,nestedOpenDrawerCount:p}),null}var Y={...z,modal:e=>e.modal,nested:e=>e.nested,nestedOpenDialogCount:e=>e.nestedOpenDialogCount,nestedOpenDrawerCount:e=>e.nestedOpenDrawerCount,disablePointerDismissal:e=>e.disablePointerDismissal,openMethod:e=>e.openMethod,descriptionElementId:e=>e.descriptionElementId,titleElementId:e=>e.titleElementId,viewportElement:e=>e.viewportElement,role:e=>e.role},te=class extends m{constructor(e,t,n){let r=new v,i=X(e,r,t,n);super(i,Z(r),Y)}setOpen=(e,t)=>{if(t.preventUnmountOnClose=()=>{this.set(`preventUnmountingOnClose`,!0)},!e&&t.trigger==null&&this.state.activeTriggerId!=null&&(t.trigger=this.state.activeTriggerElement??void 0),this.context.onOpenChange?.(e,t),t.isCanceled)return;this.state.floatingRootContext.dispatchOpenChange(e,t);let n={open:e};O(n,e,t.trigger),this.update(n)}};function ne(){let e=new v;return new P(Object.freeze(X(void 0,e)),Object.freeze(Z(e)),Y)}function X(e,t,n,r=!1){let i={...T(),modal:!0,disablePointerDismissal:!1,viewportElement:null,descriptionElementId:void 0,titleElementId:void 0,openMethod:null,nested:!1,nestedOpenDialogCount:0,nestedOpenDrawerCount:0,role:`dialog`,...e};return i.floatingRootContext=D(t,n,r),i}function Z(e){return{popupRef:B.createRef(),backdropRef:B.createRef(),internalBackdropRef:B.createRef(),outsidePressEnabledRef:{current:!0},triggerElements:e,onOpenChange:void 0,onOpenChangeComplete:void 0}}function re(e,t){let{children:n,open:r,defaultOpen:i=!1,onOpenChange:a,onOpenChangeComplete:o,disablePointerDismissal:c=!1,modal:u=!0,actionsRef:d,handle:f,triggerId:p,defaultTriggerId:m=null}=t,h=e===`drawer`,g=e===`alert-dialog`,_=g?!0:u,v=g||c,y=g?`alertdialog`:`dialog`,b=H(!0),S={modal:_,disablePointerDismissal:v,nested:b!=null,role:y},w=I((e,t)=>new te({open:i,openProp:r,activeTriggerId:m,triggerIdProp:p,...S},e,t),!0);w.useControlledProp(`openProp`,r),w.useControlledProp(`triggerIdProp`,p),w.useSyncedValues(S),w.useContextCallback(`onOpenChange`,a),w.useContextCallback(`onOpenChangeComplete`,o);let T=w.useState(`open`),E=w.useState(`mounted`),D=w.useState(`payload`);C(w,T),A(w);let{forceUnmount:O}=x(T,w);B.useImperativeHandle(d,()=>({unmount:O,close:()=>w.setOpen(!1,l(s))}),[O,w]);let j=T||E;return(0,q.jsxs)(V.Provider,{value:w,children:[f&&(0,q.jsx)(k,{handle:f,store:w}),j&&(0,q.jsx)(ee,{store:w,parentContext:b?.context,isDrawer:h}),typeof n==`function`?n({payload:D}):n]})}var ie=B.forwardRef(function(e,t){let{render:n,className:i,style:a,id:o,...s}=e,c=H(),l=R(o);return c.useSyncedValueWithCleanup(`titleElementId`,l),r(`h2`,e,{ref:t,props:[{id:l},s]})}),ae=B.forwardRef(function(e,t){let{render:n,className:a,style:s,disabled:c=!1,nativeButton:l=!0,id:u,payload:d,handle:f,...p}=e,m=H(!0),h=S(f)??m;if(!h)throw Error(o(79));let _=R(u),v=h.useState(`floatingRootContext`),b=h.useState(`isOpenedByTrigger`,_),x=h.useState(`triggerPopupId`,_),C=B.useRef(null),{registerTrigger:w,isMountedByThisTrigger:T}=j(_,C,h,{payload:d}),{getButtonProps:E,buttonRef:D}=i({disabled:c,native:l}),O=M(v),k=L(()=>h.select(`open`),e=>{h.set(`openMethod`,e)}),A={disabled:c,open:b},N=h.useState(`triggerProps`,T);return r(`button`,e,{state:A,ref:[D,t,w,C],props:[O.reference,N,k,{[g]:``,id:_,"aria-haspopup":`dialog`,"aria-expanded":b,"aria-controls":x},p,E],stateAttributesMapping:y})}),Q={...p,...f,nestedDialogOpen(e){return e?{"data-nested-dialog-open":``}:null}},oe=B.forwardRef(function(e,t){let{render:n,className:i,style:a,children:o,...s}=e,c=K(),l=H(),u=l.useState(`open`),d=l.useState(`nested`),f=l.useState(`transitionStatus`),p=l.useState(`nestedOpenDialogCount`),m=l.useState(`mounted`),h=l.useStateSetter(`viewportElement`);return r(`div`,e,{enabled:c||m,state:{open:u,nested:d,transitionStatus:f,nestedDialogOpen:p>0},ref:[t,h],stateAttributesMapping:Q,props:[{role:`presentation`,hidden:!m,style:{pointerEvents:u?void 0:`none`},children:o},s]})}),$=class extends E{constructor(){super(ne(),`Dialog`,!1)}open(e){this.openByTrigger(e)}openWithPayload(e){let t=this.attachedStore;t!==null&&(t.set(`payload`,e),t.setOpen(!0,l(s)))}close(){this.closePopup()}get isOpen(){return this.attachedStore?.select(`open`)??!1}};function se(){return new $}export{ae as a,J as c,U as d,H as f,Q as i,K as l,se as n,ie as o,oe as r,re as s,$ as t,W as u};
|
|
2
|
+
//# sourceMappingURL=DialogHandle-ChG5Sj7T.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialogHandle-tiMUnjZQ.js","names":["_formatErrorMessage","REASONS.closePress","_formatErrorMessage","REASONS.imperativeAction","_formatErrorMessage","REASONS.imperativeAction"],"sources":["../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/root/DialogRootContext.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/close/DialogClose.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/description/DialogDescription.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/portal/DialogPortalContext.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/portal/DialogPortal.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/root/useDialogRoot.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/store/DialogStore.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/root/useRenderDialogRoot.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/title/DialogTitle.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/trigger/DialogTrigger.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/utils/stateAttributesMapping.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/viewport/DialogViewport.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/store/DialogHandle.mjs"],"sourcesContent":["'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nexport const DialogRootContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") DialogRootContext.displayName = \"DialogRootContext\";\nexport function useDialogRootContext(optional) {\n const store = React.useContext(DialogRootContext);\n if (!optional && store === undefined) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: DialogRootContext is missing. Dialog parts must be placed within <Dialog.Root>.' : _formatErrorMessage(27));\n }\n return store;\n}","'use client';\n\nimport * as React from 'react';\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useButton } from \"../../internals/use-button/index.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\n\n/**\n * A button that closes the dialog.\n * Renders a `<button>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogClose = /*#__PURE__*/React.forwardRef(function DialogClose(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n disabled = false,\n nativeButton = true,\n ...elementProps\n } = componentProps;\n const store = useDialogRootContext();\n const open = store.useState('open');\n const {\n getButtonProps,\n buttonRef\n } = useButton({\n disabled,\n native: nativeButton\n });\n const state = {\n disabled\n };\n function handleClick(event) {\n if (open) {\n store.setOpen(false, createChangeEventDetails(REASONS.closePress, event.nativeEvent));\n }\n }\n return useRenderElement('button', componentProps, {\n state,\n ref: [forwardedRef, buttonRef],\n props: [{\n onClick: handleClick\n }, elementProps, getButtonProps]\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogClose.displayName = \"DialogClose\";","'use client';\n\nimport * as React from 'react';\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\n/**\n * A paragraph with additional information about the dialog.\n * Renders a `<p>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogDescription = /*#__PURE__*/React.forwardRef(function DialogDescription(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n id: idProp,\n ...elementProps\n } = componentProps;\n const store = useDialogRootContext();\n const id = useBaseUiId(idProp);\n store.useSyncedValueWithCleanup('descriptionElementId', id);\n return useRenderElement('p', componentProps, {\n ref: forwardedRef,\n props: [{\n id\n }, elementProps]\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogDescription.displayName = \"DialogDescription\";","'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nexport const DialogPortalContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") DialogPortalContext.displayName = \"DialogPortalContext\";\nexport function useDialogPortalContext() {\n const value = React.useContext(DialogPortalContext);\n if (value === undefined) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: <Dialog.Portal> is missing.' : _formatErrorMessage(26));\n }\n return value;\n}","'use client';\n\nimport * as React from 'react';\nimport { inertValue } from '@base-ui/utils/inertValue';\nimport { FloatingPortal } from \"../../floating-ui-react/index.mjs\";\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { DialogPortalContext } from \"./DialogPortalContext.mjs\";\nimport { InternalBackdrop } from \"../../utils/InternalBackdrop.mjs\";\n\n/**\n * A portal element that moves the popup to a different part of the DOM.\n * By default, the portal element is appended to `<body>`.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport const DialogPortal = /*#__PURE__*/React.forwardRef(function DialogPortal(props, forwardedRef) {\n const {\n keepMounted = false,\n ...portalProps\n } = props;\n const store = useDialogRootContext();\n const mounted = store.useState('mounted');\n const modal = store.useState('modal');\n const open = store.useState('open');\n const shouldRender = mounted || keepMounted;\n if (!shouldRender) {\n return null;\n }\n return /*#__PURE__*/_jsx(DialogPortalContext.Provider, {\n value: keepMounted,\n children: /*#__PURE__*/_jsxs(FloatingPortal, {\n ref: forwardedRef,\n ...portalProps,\n children: [mounted && modal === true && /*#__PURE__*/_jsx(InternalBackdrop, {\n ref: store.context.internalBackdropRef,\n inert: inertValue(!open)\n }), props.children]\n })\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogPortal.displayName = \"DialogPortal\";","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useScrollLock } from '@base-ui/utils/useScrollLock';\nimport { useDismiss } from \"../../floating-ui-react/index.mjs\";\nimport { contains, getTarget } from \"../../floating-ui-react/utils.mjs\";\nimport { usePopupInteractionProps } from \"../../utils/popups/index.mjs\";\nexport function DialogInteractions({\n store,\n parentContext,\n isDrawer\n}) {\n const open = store.useState('open');\n const disablePointerDismissal = store.useState('disablePointerDismissal');\n const modal = store.useState('modal');\n const popupElement = store.useState('popupElement');\n const floatingRootContext = store.useState('floatingRootContext');\n const [ownNestedOpenDialogs, setOwnNestedOpenDialogs] = React.useState(0);\n const [ownNestedOpenDrawers, setOwnNestedOpenDrawers] = React.useState(0);\n const isTopmost = ownNestedOpenDialogs === 0;\n const dismiss = useDismiss(floatingRootContext, {\n outsidePressEvent() {\n if (store.context.internalBackdropRef.current || store.context.backdropRef.current) {\n return 'intentional';\n }\n // Ensure `aria-hidden` on outside elements is removed immediately\n // on outside press when trapping focus.\n return {\n mouse: modal === 'trap-focus' ? 'sloppy' : 'intentional',\n touch: 'sloppy'\n };\n },\n outsidePress(event) {\n if (!store.context.outsidePressEnabledRef.current) {\n return false;\n }\n\n // For mouse events, only accept left button (button 0)\n // For touch events, a single touch is equivalent to left button\n if ('button' in event && event.button !== 0) {\n return false;\n }\n if ('touches' in event) {\n // Outside press can be handled on `touchend`, where the lifted point is\n // reported in `changedTouches` and `touches` contains any remaining\n // active points. Treat it as a single-finger tap only when exactly one\n // touch ended and no other fingers are still down.\n if (event.type === 'touchend') {\n if (event.changedTouches.length !== 1 || event.touches.length !== 0) {\n return false;\n }\n } else if (event.touches.length !== 1) {\n return false;\n }\n }\n const target = getTarget(event);\n if (isTopmost && !disablePointerDismissal) {\n // Only close if the click occurred on the dialog's owning backdrop.\n // This supports multiple modal dialogs that aren't nested in the React tree:\n // https://github.com/mui/base-ui/issues/1320\n if (modal) {\n const internalBackdrop = store.context.internalBackdropRef.current;\n const backdrop = store.context.backdropRef.current;\n return internalBackdrop || backdrop ? internalBackdrop === target || backdrop === target || contains(target, popupElement) && !target?.hasAttribute('data-base-ui-portal') : true;\n }\n return true;\n }\n return false;\n },\n escapeKey: isTopmost\n });\n useScrollLock(open && modal === true, popupElement);\n\n // Listen for nested open/close events on this store to maintain the counts.\n // A close notification is an open notification with zeroed counts.\n store.useContextCallback('onNestedDialogOpen', (dialogCount, drawerCount) => {\n setOwnNestedOpenDialogs(dialogCount);\n setOwnNestedOpenDrawers(drawerCount);\n });\n\n // Notify parent of our open/close state using parent callbacks, if any\n useIsoLayoutEffect(() => {\n if (parentContext?.onNestedDialogOpen) {\n if (open) {\n parentContext.onNestedDialogOpen(ownNestedOpenDialogs + 1, ownNestedOpenDrawers + (isDrawer ? 1 : 0));\n } else {\n parentContext.onNestedDialogOpen(0, 0);\n }\n }\n return () => {\n if (parentContext?.onNestedDialogOpen && open) {\n parentContext.onNestedDialogOpen(0, 0);\n }\n };\n }, [isDrawer, open, ownNestedOpenDialogs, ownNestedOpenDrawers, parentContext]);\n usePopupInteractionProps(store, {\n // `enabled` is not passed to `useDismiss`, so its props are always defined,\n // and `trigger` is the same object as `reference`.\n activeTriggerProps: dismiss.reference,\n inactiveTriggerProps: dismiss.trigger,\n // DialogPopup and DrawerPopup spread `FOCUSABLE_POPUP_PROPS` directly, so\n // this only needs to carry the dismiss handlers.\n popupProps: dismiss.floating,\n nestedOpenDialogCount: ownNestedOpenDialogs,\n nestedOpenDrawerCount: ownNestedOpenDrawers\n });\n return null;\n}","import * as React from 'react';\nimport { ReactStore } from '@base-ui/utils/store';\nimport { NullStore } from \"../../utils/NullStore.mjs\";\nimport { createPopupFloatingRootContext, createInitialPopupStoreState, popupStoreSelectors, PopupTriggerMap, setPopupOpenState } from \"../../utils/popups/index.mjs\";\nconst selectors = {\n ...popupStoreSelectors,\n modal: state => state.modal,\n nested: state => state.nested,\n nestedOpenDialogCount: state => state.nestedOpenDialogCount,\n nestedOpenDrawerCount: state => state.nestedOpenDrawerCount,\n disablePointerDismissal: state => state.disablePointerDismissal,\n openMethod: state => state.openMethod,\n descriptionElementId: state => state.descriptionElementId,\n titleElementId: state => state.titleElementId,\n viewportElement: state => state.viewportElement,\n role: state => state.role\n};\n\n/**\n * The subset of `DialogStore` that detached handle-backed triggers rely on. Both the real\n * `DialogStore` and the inert fallback store satisfy it, so a trigger can read from whichever\n * store the handle currently exposes.\n */\n\nexport class DialogStore extends ReactStore {\n constructor(initialState, floatingId, nested) {\n const triggerElements = new PopupTriggerMap();\n const state = createInitialState(initialState, triggerElements, floatingId, nested);\n super(state, createInitialContext(triggerElements), selectors);\n }\n setOpen = (nextOpen, eventDetails) => {\n eventDetails.preventUnmountOnClose = () => {\n this.set('preventUnmountingOnClose', true);\n };\n if (!nextOpen && eventDetails.trigger == null && this.state.activeTriggerId != null) {\n // When closing the dialog, pass the old trigger to the onOpenChange event\n // so it's not reset too early (potentially causing focus issues in controlled scenarios).\n eventDetails.trigger = this.state.activeTriggerElement ?? undefined;\n }\n this.context.onOpenChange?.(nextOpen, eventDetails);\n if (eventDetails.isCanceled) {\n return;\n }\n this.state.floatingRootContext.dispatchOpenChange(nextOpen, eventDetails);\n const updatedState = {\n open: nextOpen\n };\n setPopupOpenState(updatedState, nextOpen, eventDetails.trigger);\n this.update(updatedState);\n };\n}\n\n/**\n * Creates the inert fallback store used by detached handle-backed triggers while no\n * `Dialog.Root` is attached. It preserves a dialog-specific trigger registry in context so\n * detached triggers can register before migrating to the live root store.\n */\nexport function createNullDialogStore() {\n const triggerElements = new PopupTriggerMap();\n return new NullStore(Object.freeze(createInitialState(undefined, triggerElements)), Object.freeze(createInitialContext(triggerElements)), selectors);\n}\nfunction createInitialState(initialState, triggerElements, floatingId, nested = false) {\n const state = {\n ...createInitialPopupStoreState(),\n modal: true,\n disablePointerDismissal: false,\n viewportElement: null,\n descriptionElementId: undefined,\n titleElementId: undefined,\n openMethod: null,\n nested: false,\n nestedOpenDialogCount: 0,\n nestedOpenDrawerCount: 0,\n role: 'dialog',\n ...initialState\n };\n state.floatingRootContext = createPopupFloatingRootContext(triggerElements, floatingId, nested);\n return state;\n}\nfunction createInitialContext(triggerElements) {\n return {\n popupRef: /*#__PURE__*/React.createRef(),\n backdropRef: /*#__PURE__*/React.createRef(),\n internalBackdropRef: /*#__PURE__*/React.createRef(),\n outsidePressEnabledRef: {\n current: true\n },\n triggerElements,\n onOpenChange: undefined,\n onOpenChangeComplete: undefined\n };\n}","'use client';\n\nimport * as React from 'react';\nimport { DialogInteractions } from \"./useDialogRoot.mjs\";\nimport { DialogRootContext, useDialogRootContext } from \"./DialogRootContext.mjs\";\nimport { DialogStore } from \"../store/DialogStore.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { useImplicitActiveTrigger, useOpenStateTransitions, PopupHandleAttachment, usePopupRootStore, usePopupRootSync } from \"../../utils/popups/index.mjs\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function useRenderDialogRoot(mode, props) {\n const {\n children,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n onOpenChangeComplete,\n disablePointerDismissal: disablePointerDismissalProp = false,\n modal: modalProp = true,\n actionsRef,\n handle,\n triggerId: triggerIdProp,\n defaultTriggerId: defaultTriggerIdProp = null\n } = props;\n const isDrawer = mode === 'drawer';\n const isAlertDialog = mode === 'alert-dialog';\n const modal = isAlertDialog ? true : modalProp;\n const disablePointerDismissal = isAlertDialog || disablePointerDismissalProp;\n const role = isAlertDialog ? 'alertdialog' : 'dialog';\n const parentStore = useDialogRootContext(true);\n const nested = parentStore != null;\n const rootState = {\n modal,\n disablePointerDismissal,\n nested,\n role\n };\n\n // The store is owned by this Root instance and created exactly once. It is not tied to the handle:\n // the handle attaches to it, so swapping the handle re-attaches rather than recreating state.\n // Default values are only initial values; controlled values and root state are synced after creation.\n // Dialogs pass the popup element to Floating UI as the floating element (`treatPopupAsFloatingElement`).\n const store = usePopupRootStore((floatingId, floatingNested) => new DialogStore({\n open: defaultOpen,\n openProp,\n activeTriggerId: defaultTriggerIdProp,\n triggerIdProp,\n ...rootState\n }, floatingId, floatingNested), true);\n store.useControlledProp('openProp', openProp);\n store.useControlledProp('triggerIdProp', triggerIdProp);\n store.useSyncedValues(rootState);\n store.useContextCallback('onOpenChange', onOpenChange);\n store.useContextCallback('onOpenChangeComplete', onOpenChangeComplete);\n const open = store.useState('open');\n const mounted = store.useState('mounted');\n const payload = store.useState('payload');\n usePopupRootSync(store, open);\n useImplicitActiveTrigger(store);\n const {\n forceUnmount\n } = useOpenStateTransitions(open, store);\n React.useImperativeHandle(actionsRef, () => ({\n unmount: forceUnmount,\n close: () => store.setOpen(false, createChangeEventDetails(REASONS.imperativeAction))\n }), [forceUnmount, store]);\n const shouldRenderInteractions = open || mounted;\n return /*#__PURE__*/_jsxs(DialogRootContext.Provider, {\n value: store,\n children: [handle && /*#__PURE__*/_jsx(PopupHandleAttachment, {\n handle: handle,\n store: store\n }), shouldRenderInteractions && /*#__PURE__*/_jsx(DialogInteractions, {\n store: store,\n parentContext: parentStore?.context,\n isDrawer: isDrawer\n }), typeof children === 'function' ? children({\n payload\n }) : children]\n });\n}","'use client';\n\nimport * as React from 'react';\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\n/**\n * A heading that labels the dialog.\n * Renders an `<h2>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogTitle = /*#__PURE__*/React.forwardRef(function DialogTitle(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n id: idProp,\n ...elementProps\n } = componentProps;\n const store = useDialogRootContext();\n const id = useBaseUiId(idProp);\n store.useSyncedValueWithCleanup('titleElementId', id);\n return useRenderElement('h2', componentProps, {\n ref: forwardedRef,\n props: [{\n id\n }, elementProps]\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogTitle.displayName = \"DialogTitle\";","'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useButton } from \"../../internals/use-button/useButton.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { triggerOpenStateMapping } from \"../../utils/popupStateMapping.mjs\";\nimport { CLICK_TRIGGER_IDENTIFIER } from \"../../internals/constants.mjs\";\nimport { usePopupHandleStore, useTriggerDataForwarding } from \"../../utils/popups/index.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\nimport { useClick } from \"../../floating-ui-react/index.mjs\";\nimport { useOpenMethodTriggerProps } from \"../../utils/useOpenInteractionType.mjs\";\n\n/**\n * A button that opens the dialog.\n * Renders a `<button>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogTrigger = /*#__PURE__*/React.forwardRef(function DialogTrigger(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n disabled = false,\n nativeButton = true,\n id: idProp,\n payload,\n handle,\n ...elementProps\n } = componentProps;\n const dialogRootStore = useDialogRootContext(true);\n const handleStore = usePopupHandleStore(handle);\n const store = handleStore ?? dialogRootStore;\n if (!store) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: <Dialog.Trigger> must be used within <Dialog.Root> or provided with a handle.' : _formatErrorMessage(79));\n }\n const thisTriggerId = useBaseUiId(idProp);\n const floatingContext = store.useState('floatingRootContext');\n const isOpenedByThisTrigger = store.useState('isOpenedByTrigger', thisTriggerId);\n const popupId = store.useState('triggerPopupId', thisTriggerId);\n const triggerElementRef = React.useRef(null);\n const {\n registerTrigger,\n isMountedByThisTrigger\n } = useTriggerDataForwarding(thisTriggerId, triggerElementRef, store, {\n payload\n });\n const {\n getButtonProps,\n buttonRef\n } = useButton({\n disabled,\n native: nativeButton\n });\n const click = useClick(floatingContext);\n const interactionTypeProps = useOpenMethodTriggerProps(() => store.select('open'), interactionType => {\n store.set('openMethod', interactionType);\n });\n const state = {\n disabled,\n open: isOpenedByThisTrigger\n };\n const rootTriggerProps = store.useState('triggerProps', isMountedByThisTrigger);\n return useRenderElement('button', componentProps, {\n state,\n ref: [buttonRef, forwardedRef, registerTrigger, triggerElementRef],\n props: [click.reference, rootTriggerProps, interactionTypeProps, {\n [CLICK_TRIGGER_IDENTIFIER]: '',\n id: thisTriggerId,\n 'aria-haspopup': 'dialog',\n 'aria-expanded': isOpenedByThisTrigger,\n 'aria-controls': popupId\n }, elementProps, getButtonProps],\n stateAttributesMapping: triggerOpenStateMapping\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogTrigger.displayName = \"DialogTrigger\";","import { transitionStatusMapping } from \"../../internals/stateAttributesMapping.mjs\";\nimport { popupStateMapping } from \"../../utils/popupStateMapping.mjs\";\n/**\n * Shared by `Dialog.Popup` and `Dialog.Viewport`, whose states have the same shape.\n * `nested` is not mapped: unmapped `true` booleans already render as `data-nested`.\n */\nexport const dialogStateAttributesMapping = {\n ...popupStateMapping,\n ...transitionStatusMapping,\n nestedDialogOpen(value) {\n return value ? {\n 'data-nested-dialog-open': ''\n } : null;\n }\n};","'use client';\n\nimport * as React from 'react';\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useDialogPortalContext } from \"../portal/DialogPortalContext.mjs\";\nimport { dialogStateAttributesMapping } from \"../utils/stateAttributesMapping.mjs\";\n\n/**\n * A positioning container for the dialog popup that can be made scrollable.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogViewport = /*#__PURE__*/React.forwardRef(function DialogViewport(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n children,\n ...elementProps\n } = componentProps;\n const keepMounted = useDialogPortalContext();\n const store = useDialogRootContext();\n const open = store.useState('open');\n const nested = store.useState('nested');\n const transitionStatus = store.useState('transitionStatus');\n const nestedOpenDialogCount = store.useState('nestedOpenDialogCount');\n const mounted = store.useState('mounted');\n const setViewportElement = store.useStateSetter('viewportElement');\n const nestedDialogOpen = nestedOpenDialogCount > 0;\n const state = {\n open,\n nested,\n transitionStatus,\n nestedDialogOpen\n };\n const shouldRender = keepMounted || mounted;\n return useRenderElement('div', componentProps, {\n enabled: shouldRender,\n state,\n ref: [forwardedRef, setViewportElement],\n stateAttributesMapping: dialogStateAttributesMapping,\n props: [{\n role: 'presentation',\n hidden: !mounted,\n style: {\n pointerEvents: !open ? 'none' : undefined\n },\n children\n }, elementProps]\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogViewport.displayName = \"DialogViewport\";","import { createNullDialogStore } from \"./DialogStore.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { BasePopupHandle } from \"../../utils/popups/popupHandle.mjs\";\n\n/**\n * Controls a Dialog imperatively and associates detached `Dialog.Trigger` components with a\n * `Dialog.Root`. Create one with `Dialog.createHandle()` and pass it to the `handle` prop of the\n * root and of any triggers rendered outside of it.\n *\n * The imperative methods take effect only while a root using this handle is mounted; calls made\n * before a root attaches (or after it unmounts) are ignored.\n */\nexport class DialogHandle extends BasePopupHandle {\n constructor() {\n super(createNullDialogStore(), 'Dialog', false);\n }\n\n /**\n * Opens the dialog, optionally associating it with a trigger.\n *\n * This method should only be called in an event handler or an effect (not during rendering).\n *\n * @param triggerId ID of the trigger to associate with the dialog. The trigger must be a matching\n * `Dialog.Trigger` with this handle passed as a prop. Pass `null` to open without associating any trigger.\n */\n open(triggerId) {\n this.openByTrigger(triggerId);\n }\n\n /**\n * Opens the dialog with the given payload, without associating it with any trigger.\n *\n * This method should only be called in an event handler or an effect (not during rendering).\n *\n * @param payload Payload to set when opening the dialog. It is exposed to the root's render-prop children.\n */\n openWithPayload(payload) {\n const attachedStore = this.attachedStore;\n if (attachedStore === null) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Base UI: DialogHandle.openWithPayload() was called while no root using this handle is mounted. ' + 'The call and its payload were ignored; mount a root with this handle before opening it imperatively.');\n }\n return;\n }\n attachedStore.set('payload', payload);\n attachedStore.setOpen(true, createChangeEventDetails(REASONS.imperativeAction));\n }\n\n /**\n * Closes the dialog.\n *\n * This method should only be called in an event handler or an effect (not during rendering).\n */\n close() {\n this.closePopup();\n }\n\n /**\n * Whether the dialog is currently open. Returns `false` while no root is attached to the handle.\n */\n get isOpen() {\n return this.attachedStore?.select('open') ?? false;\n }\n}\n\n/**\n * Creates a new handle to connect a Dialog.Root with detached Dialog.Trigger components.\n */\nexport function createDialogHandle() {\n return new DialogHandle();\n}"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DialogHandle-ChG5Sj7T.js","names":["_formatErrorMessage","REASONS.closePress","_formatErrorMessage","REASONS.imperativeAction","_formatErrorMessage","REASONS.imperativeAction"],"sources":["../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/root/DialogRootContext.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/close/DialogClose.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/description/DialogDescription.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/portal/DialogPortalContext.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/portal/DialogPortal.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/root/useDialogRoot.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/store/DialogStore.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/root/useRenderDialogRoot.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/title/DialogTitle.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/trigger/DialogTrigger.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/utils/stateAttributesMapping.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/viewport/DialogViewport.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/dialog/store/DialogHandle.mjs"],"sourcesContent":["'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nexport const DialogRootContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") DialogRootContext.displayName = \"DialogRootContext\";\nexport function useDialogRootContext(optional) {\n const store = React.useContext(DialogRootContext);\n if (!optional && store === undefined) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: DialogRootContext is missing. Dialog parts must be placed within <Dialog.Root>.' : _formatErrorMessage(27));\n }\n return store;\n}","'use client';\n\nimport * as React from 'react';\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useButton } from \"../../internals/use-button/index.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\n\n/**\n * A button that closes the dialog.\n * Renders a `<button>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogClose = /*#__PURE__*/React.forwardRef(function DialogClose(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n disabled = false,\n nativeButton = true,\n ...elementProps\n } = componentProps;\n const store = useDialogRootContext();\n const open = store.useState('open');\n const {\n getButtonProps,\n buttonRef\n } = useButton({\n disabled,\n native: nativeButton\n });\n const state = {\n disabled\n };\n function handleClick(event) {\n if (open) {\n store.setOpen(false, createChangeEventDetails(REASONS.closePress, event.nativeEvent));\n }\n }\n return useRenderElement('button', componentProps, {\n state,\n ref: [forwardedRef, buttonRef],\n props: [{\n onClick: handleClick\n }, elementProps, getButtonProps]\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogClose.displayName = \"DialogClose\";","'use client';\n\nimport * as React from 'react';\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\n/**\n * A paragraph with additional information about the dialog.\n * Renders a `<p>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogDescription = /*#__PURE__*/React.forwardRef(function DialogDescription(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n id: idProp,\n ...elementProps\n } = componentProps;\n const store = useDialogRootContext();\n const id = useBaseUiId(idProp);\n store.useSyncedValueWithCleanup('descriptionElementId', id);\n return useRenderElement('p', componentProps, {\n ref: forwardedRef,\n props: [{\n id\n }, elementProps]\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogDescription.displayName = \"DialogDescription\";","'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nexport const DialogPortalContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") DialogPortalContext.displayName = \"DialogPortalContext\";\nexport function useDialogPortalContext() {\n const value = React.useContext(DialogPortalContext);\n if (value === undefined) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: <Dialog.Portal> is missing.' : _formatErrorMessage(26));\n }\n return value;\n}","'use client';\n\nimport * as React from 'react';\nimport { inertValue } from '@base-ui/utils/inertValue';\nimport { FloatingPortal } from \"../../floating-ui-react/index.mjs\";\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { DialogPortalContext } from \"./DialogPortalContext.mjs\";\nimport { InternalBackdrop } from \"../../utils/InternalBackdrop.mjs\";\n\n/**\n * A portal element that moves the popup to a different part of the DOM.\n * By default, the portal element is appended to `<body>`.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport const DialogPortal = /*#__PURE__*/React.forwardRef(function DialogPortal(props, forwardedRef) {\n const {\n keepMounted = false,\n ...portalProps\n } = props;\n const store = useDialogRootContext();\n const mounted = store.useState('mounted');\n const modal = store.useState('modal');\n const open = store.useState('open');\n const shouldRender = mounted || keepMounted;\n if (!shouldRender) {\n return null;\n }\n return /*#__PURE__*/_jsx(DialogPortalContext.Provider, {\n value: keepMounted,\n children: /*#__PURE__*/_jsxs(FloatingPortal, {\n ref: forwardedRef,\n ...portalProps,\n children: [mounted && modal === true && /*#__PURE__*/_jsx(InternalBackdrop, {\n ref: store.context.internalBackdropRef,\n inert: inertValue(!open)\n }), props.children]\n })\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogPortal.displayName = \"DialogPortal\";","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useScrollLock } from '@base-ui/utils/useScrollLock';\nimport { useDismiss } from \"../../floating-ui-react/index.mjs\";\nimport { contains, getTarget } from \"../../floating-ui-react/utils.mjs\";\nimport { usePopupInteractionProps } from \"../../utils/popups/index.mjs\";\nexport function DialogInteractions({\n store,\n parentContext,\n isDrawer\n}) {\n const open = store.useState('open');\n const disablePointerDismissal = store.useState('disablePointerDismissal');\n const modal = store.useState('modal');\n const popupElement = store.useState('popupElement');\n const floatingRootContext = store.useState('floatingRootContext');\n const [ownNestedOpenDialogs, setOwnNestedOpenDialogs] = React.useState(0);\n const [ownNestedOpenDrawers, setOwnNestedOpenDrawers] = React.useState(0);\n const isTopmost = ownNestedOpenDialogs === 0;\n const dismiss = useDismiss(floatingRootContext, {\n outsidePressEvent() {\n if (store.context.internalBackdropRef.current || store.context.backdropRef.current) {\n return 'intentional';\n }\n // Ensure `aria-hidden` on outside elements is removed immediately\n // on outside press when trapping focus.\n return {\n mouse: modal === 'trap-focus' ? 'sloppy' : 'intentional',\n touch: 'sloppy'\n };\n },\n outsidePress(event) {\n if (!store.context.outsidePressEnabledRef.current) {\n return false;\n }\n\n // For mouse events, only accept left button (button 0)\n // For touch events, a single touch is equivalent to left button\n if ('button' in event && event.button !== 0) {\n return false;\n }\n if ('touches' in event) {\n // Outside press can be handled on `touchend`, where the lifted point is\n // reported in `changedTouches` and `touches` contains any remaining\n // active points. Treat it as a single-finger tap only when exactly one\n // touch ended and no other fingers are still down.\n if (event.type === 'touchend') {\n if (event.changedTouches.length !== 1 || event.touches.length !== 0) {\n return false;\n }\n } else if (event.touches.length !== 1) {\n return false;\n }\n }\n const target = getTarget(event);\n if (isTopmost && !disablePointerDismissal) {\n // Only close if the click occurred on the dialog's owning backdrop.\n // This supports multiple modal dialogs that aren't nested in the React tree:\n // https://github.com/mui/base-ui/issues/1320\n if (modal) {\n const internalBackdrop = store.context.internalBackdropRef.current;\n const backdrop = store.context.backdropRef.current;\n return internalBackdrop || backdrop ? internalBackdrop === target || backdrop === target || contains(target, popupElement) && !target?.hasAttribute('data-base-ui-portal') : true;\n }\n return true;\n }\n return false;\n },\n escapeKey: isTopmost\n });\n useScrollLock(open && modal === true, popupElement);\n\n // Listen for nested open/close events on this store to maintain the counts.\n // A close notification is an open notification with zeroed counts.\n store.useContextCallback('onNestedDialogOpen', (dialogCount, drawerCount) => {\n setOwnNestedOpenDialogs(dialogCount);\n setOwnNestedOpenDrawers(drawerCount);\n });\n\n // Notify parent of our open/close state using parent callbacks, if any\n useIsoLayoutEffect(() => {\n if (parentContext?.onNestedDialogOpen) {\n if (open) {\n parentContext.onNestedDialogOpen(ownNestedOpenDialogs + 1, ownNestedOpenDrawers + (isDrawer ? 1 : 0));\n } else {\n parentContext.onNestedDialogOpen(0, 0);\n }\n }\n return () => {\n if (parentContext?.onNestedDialogOpen && open) {\n parentContext.onNestedDialogOpen(0, 0);\n }\n };\n }, [isDrawer, open, ownNestedOpenDialogs, ownNestedOpenDrawers, parentContext]);\n usePopupInteractionProps(store, {\n // `enabled` is not passed to `useDismiss`, so its props are always defined,\n // and `trigger` is the same object as `reference`.\n activeTriggerProps: dismiss.reference,\n inactiveTriggerProps: dismiss.trigger,\n // DialogPopup and DrawerPopup spread `FOCUSABLE_POPUP_PROPS` directly, so\n // this only needs to carry the dismiss handlers.\n popupProps: dismiss.floating,\n nestedOpenDialogCount: ownNestedOpenDialogs,\n nestedOpenDrawerCount: ownNestedOpenDrawers\n });\n return null;\n}","import * as React from 'react';\nimport { ReactStore } from '@base-ui/utils/store';\nimport { NullStore } from \"../../utils/NullStore.mjs\";\nimport { createPopupFloatingRootContext, createInitialPopupStoreState, popupStoreSelectors, PopupTriggerMap, setPopupOpenState } from \"../../utils/popups/index.mjs\";\nconst selectors = {\n ...popupStoreSelectors,\n modal: state => state.modal,\n nested: state => state.nested,\n nestedOpenDialogCount: state => state.nestedOpenDialogCount,\n nestedOpenDrawerCount: state => state.nestedOpenDrawerCount,\n disablePointerDismissal: state => state.disablePointerDismissal,\n openMethod: state => state.openMethod,\n descriptionElementId: state => state.descriptionElementId,\n titleElementId: state => state.titleElementId,\n viewportElement: state => state.viewportElement,\n role: state => state.role\n};\n\n/**\n * The subset of `DialogStore` that detached handle-backed triggers rely on. Both the real\n * `DialogStore` and the inert fallback store satisfy it, so a trigger can read from whichever\n * store the handle currently exposes.\n */\n\nexport class DialogStore extends ReactStore {\n constructor(initialState, floatingId, nested) {\n const triggerElements = new PopupTriggerMap();\n const state = createInitialState(initialState, triggerElements, floatingId, nested);\n super(state, createInitialContext(triggerElements), selectors);\n }\n setOpen = (nextOpen, eventDetails) => {\n eventDetails.preventUnmountOnClose = () => {\n this.set('preventUnmountingOnClose', true);\n };\n if (!nextOpen && eventDetails.trigger == null && this.state.activeTriggerId != null) {\n // When closing the dialog, pass the old trigger to the onOpenChange event\n // so it's not reset too early (potentially causing focus issues in controlled scenarios).\n eventDetails.trigger = this.state.activeTriggerElement ?? undefined;\n }\n this.context.onOpenChange?.(nextOpen, eventDetails);\n if (eventDetails.isCanceled) {\n return;\n }\n this.state.floatingRootContext.dispatchOpenChange(nextOpen, eventDetails);\n const updatedState = {\n open: nextOpen\n };\n setPopupOpenState(updatedState, nextOpen, eventDetails.trigger);\n this.update(updatedState);\n };\n}\n\n/**\n * Creates the inert fallback store used by detached handle-backed triggers while no\n * `Dialog.Root` is attached. It preserves a dialog-specific trigger registry in context so\n * detached triggers can register before migrating to the live root store.\n */\nexport function createNullDialogStore() {\n const triggerElements = new PopupTriggerMap();\n return new NullStore(Object.freeze(createInitialState(undefined, triggerElements)), Object.freeze(createInitialContext(triggerElements)), selectors);\n}\nfunction createInitialState(initialState, triggerElements, floatingId, nested = false) {\n const state = {\n ...createInitialPopupStoreState(),\n modal: true,\n disablePointerDismissal: false,\n viewportElement: null,\n descriptionElementId: undefined,\n titleElementId: undefined,\n openMethod: null,\n nested: false,\n nestedOpenDialogCount: 0,\n nestedOpenDrawerCount: 0,\n role: 'dialog',\n ...initialState\n };\n state.floatingRootContext = createPopupFloatingRootContext(triggerElements, floatingId, nested);\n return state;\n}\nfunction createInitialContext(triggerElements) {\n return {\n popupRef: /*#__PURE__*/React.createRef(),\n backdropRef: /*#__PURE__*/React.createRef(),\n internalBackdropRef: /*#__PURE__*/React.createRef(),\n outsidePressEnabledRef: {\n current: true\n },\n triggerElements,\n onOpenChange: undefined,\n onOpenChangeComplete: undefined\n };\n}","'use client';\n\nimport * as React from 'react';\nimport { DialogInteractions } from \"./useDialogRoot.mjs\";\nimport { DialogRootContext, useDialogRootContext } from \"./DialogRootContext.mjs\";\nimport { DialogStore } from \"../store/DialogStore.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { useImplicitActiveTrigger, useOpenStateTransitions, PopupHandleAttachment, usePopupRootStore, usePopupRootSync } from \"../../utils/popups/index.mjs\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function useRenderDialogRoot(mode, props) {\n const {\n children,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n onOpenChangeComplete,\n disablePointerDismissal: disablePointerDismissalProp = false,\n modal: modalProp = true,\n actionsRef,\n handle,\n triggerId: triggerIdProp,\n defaultTriggerId: defaultTriggerIdProp = null\n } = props;\n const isDrawer = mode === 'drawer';\n const isAlertDialog = mode === 'alert-dialog';\n const modal = isAlertDialog ? true : modalProp;\n const disablePointerDismissal = isAlertDialog || disablePointerDismissalProp;\n const role = isAlertDialog ? 'alertdialog' : 'dialog';\n const parentStore = useDialogRootContext(true);\n const nested = parentStore != null;\n const rootState = {\n modal,\n disablePointerDismissal,\n nested,\n role\n };\n\n // The store is owned by this Root instance and created exactly once. It is not tied to the handle:\n // the handle attaches to it, so swapping the handle re-attaches rather than recreating state.\n // Default values are only initial values; controlled values and root state are synced after creation.\n // Dialogs pass the popup element to Floating UI as the floating element (`treatPopupAsFloatingElement`).\n const store = usePopupRootStore((floatingId, floatingNested) => new DialogStore({\n open: defaultOpen,\n openProp,\n activeTriggerId: defaultTriggerIdProp,\n triggerIdProp,\n ...rootState\n }, floatingId, floatingNested), true);\n store.useControlledProp('openProp', openProp);\n store.useControlledProp('triggerIdProp', triggerIdProp);\n store.useSyncedValues(rootState);\n store.useContextCallback('onOpenChange', onOpenChange);\n store.useContextCallback('onOpenChangeComplete', onOpenChangeComplete);\n const open = store.useState('open');\n const mounted = store.useState('mounted');\n const payload = store.useState('payload');\n usePopupRootSync(store, open);\n useImplicitActiveTrigger(store);\n const {\n forceUnmount\n } = useOpenStateTransitions(open, store);\n React.useImperativeHandle(actionsRef, () => ({\n unmount: forceUnmount,\n close: () => store.setOpen(false, createChangeEventDetails(REASONS.imperativeAction))\n }), [forceUnmount, store]);\n const shouldRenderInteractions = open || mounted;\n return /*#__PURE__*/_jsxs(DialogRootContext.Provider, {\n value: store,\n children: [handle && /*#__PURE__*/_jsx(PopupHandleAttachment, {\n handle: handle,\n store: store\n }), shouldRenderInteractions && /*#__PURE__*/_jsx(DialogInteractions, {\n store: store,\n parentContext: parentStore?.context,\n isDrawer: isDrawer\n }), typeof children === 'function' ? children({\n payload\n }) : children]\n });\n}","'use client';\n\nimport * as React from 'react';\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\n/**\n * A heading that labels the dialog.\n * Renders an `<h2>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogTitle = /*#__PURE__*/React.forwardRef(function DialogTitle(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n id: idProp,\n ...elementProps\n } = componentProps;\n const store = useDialogRootContext();\n const id = useBaseUiId(idProp);\n store.useSyncedValueWithCleanup('titleElementId', id);\n return useRenderElement('h2', componentProps, {\n ref: forwardedRef,\n props: [{\n id\n }, elementProps]\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogTitle.displayName = \"DialogTitle\";","'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useButton } from \"../../internals/use-button/useButton.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { triggerOpenStateMapping } from \"../../utils/popupStateMapping.mjs\";\nimport { CLICK_TRIGGER_IDENTIFIER } from \"../../internals/constants.mjs\";\nimport { usePopupHandleStore, useTriggerDataForwarding } from \"../../utils/popups/index.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\nimport { useClick } from \"../../floating-ui-react/index.mjs\";\nimport { useOpenMethodTriggerProps } from \"../../utils/useOpenInteractionType.mjs\";\n\n/**\n * A button that opens the dialog.\n * Renders a `<button>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogTrigger = /*#__PURE__*/React.forwardRef(function DialogTrigger(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n disabled = false,\n nativeButton = true,\n id: idProp,\n payload,\n handle,\n ...elementProps\n } = componentProps;\n const dialogRootStore = useDialogRootContext(true);\n const handleStore = usePopupHandleStore(handle);\n const store = handleStore ?? dialogRootStore;\n if (!store) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: <Dialog.Trigger> must be used within <Dialog.Root> or provided with a handle.' : _formatErrorMessage(79));\n }\n const thisTriggerId = useBaseUiId(idProp);\n const floatingContext = store.useState('floatingRootContext');\n const isOpenedByThisTrigger = store.useState('isOpenedByTrigger', thisTriggerId);\n const popupId = store.useState('triggerPopupId', thisTriggerId);\n const triggerElementRef = React.useRef(null);\n const {\n registerTrigger,\n isMountedByThisTrigger\n } = useTriggerDataForwarding(thisTriggerId, triggerElementRef, store, {\n payload\n });\n const {\n getButtonProps,\n buttonRef\n } = useButton({\n disabled,\n native: nativeButton\n });\n const click = useClick(floatingContext);\n const interactionTypeProps = useOpenMethodTriggerProps(() => store.select('open'), interactionType => {\n store.set('openMethod', interactionType);\n });\n const state = {\n disabled,\n open: isOpenedByThisTrigger\n };\n const rootTriggerProps = store.useState('triggerProps', isMountedByThisTrigger);\n return useRenderElement('button', componentProps, {\n state,\n ref: [buttonRef, forwardedRef, registerTrigger, triggerElementRef],\n props: [click.reference, rootTriggerProps, interactionTypeProps, {\n [CLICK_TRIGGER_IDENTIFIER]: '',\n id: thisTriggerId,\n 'aria-haspopup': 'dialog',\n 'aria-expanded': isOpenedByThisTrigger,\n 'aria-controls': popupId\n }, elementProps, getButtonProps],\n stateAttributesMapping: triggerOpenStateMapping\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogTrigger.displayName = \"DialogTrigger\";","import { transitionStatusMapping } from \"../../internals/stateAttributesMapping.mjs\";\nimport { popupStateMapping } from \"../../utils/popupStateMapping.mjs\";\n/**\n * Shared by `Dialog.Popup` and `Dialog.Viewport`, whose states have the same shape.\n * `nested` is not mapped: unmapped `true` booleans already render as `data-nested`.\n */\nexport const dialogStateAttributesMapping = {\n ...popupStateMapping,\n ...transitionStatusMapping,\n nestedDialogOpen(value) {\n return value ? {\n 'data-nested-dialog-open': ''\n } : null;\n }\n};","'use client';\n\nimport * as React from 'react';\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useDialogPortalContext } from \"../portal/DialogPortalContext.mjs\";\nimport { dialogStateAttributesMapping } from \"../utils/stateAttributesMapping.mjs\";\n\n/**\n * A positioning container for the dialog popup that can be made scrollable.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogViewport = /*#__PURE__*/React.forwardRef(function DialogViewport(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n children,\n ...elementProps\n } = componentProps;\n const keepMounted = useDialogPortalContext();\n const store = useDialogRootContext();\n const open = store.useState('open');\n const nested = store.useState('nested');\n const transitionStatus = store.useState('transitionStatus');\n const nestedOpenDialogCount = store.useState('nestedOpenDialogCount');\n const mounted = store.useState('mounted');\n const setViewportElement = store.useStateSetter('viewportElement');\n const nestedDialogOpen = nestedOpenDialogCount > 0;\n const state = {\n open,\n nested,\n transitionStatus,\n nestedDialogOpen\n };\n const shouldRender = keepMounted || mounted;\n return useRenderElement('div', componentProps, {\n enabled: shouldRender,\n state,\n ref: [forwardedRef, setViewportElement],\n stateAttributesMapping: dialogStateAttributesMapping,\n props: [{\n role: 'presentation',\n hidden: !mounted,\n style: {\n pointerEvents: !open ? 'none' : undefined\n },\n children\n }, elementProps]\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogViewport.displayName = \"DialogViewport\";","import { createNullDialogStore } from \"./DialogStore.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { BasePopupHandle } from \"../../utils/popups/popupHandle.mjs\";\n\n/**\n * Controls a Dialog imperatively and associates detached `Dialog.Trigger` components with a\n * `Dialog.Root`. Create one with `Dialog.createHandle()` and pass it to the `handle` prop of the\n * root and of any triggers rendered outside of it.\n *\n * The imperative methods take effect only while a root using this handle is mounted; calls made\n * before a root attaches (or after it unmounts) are ignored.\n */\nexport class DialogHandle extends BasePopupHandle {\n constructor() {\n super(createNullDialogStore(), 'Dialog', false);\n }\n\n /**\n * Opens the dialog, optionally associating it with a trigger.\n *\n * This method should only be called in an event handler or an effect (not during rendering).\n *\n * @param triggerId ID of the trigger to associate with the dialog. The trigger must be a matching\n * `Dialog.Trigger` with this handle passed as a prop. Pass `null` to open without associating any trigger.\n */\n open(triggerId) {\n this.openByTrigger(triggerId);\n }\n\n /**\n * Opens the dialog with the given payload, without associating it with any trigger.\n *\n * This method should only be called in an event handler or an effect (not during rendering).\n *\n * @param payload Payload to set when opening the dialog. It is exposed to the root's render-prop children.\n */\n openWithPayload(payload) {\n const attachedStore = this.attachedStore;\n if (attachedStore === null) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Base UI: DialogHandle.openWithPayload() was called while no root using this handle is mounted. ' + 'The call and its payload were ignored; mount a root with this handle before opening it imperatively.');\n }\n return;\n }\n attachedStore.set('payload', payload);\n attachedStore.setOpen(true, createChangeEventDetails(REASONS.imperativeAction));\n }\n\n /**\n * Closes the dialog.\n *\n * This method should only be called in an event handler or an effect (not during rendering).\n */\n close() {\n this.closePopup();\n }\n\n /**\n * Whether the dialog is currently open. Returns `false` while no root is attached to the handle.\n */\n get isOpen() {\n return this.attachedStore?.select('open') ?? false;\n }\n}\n\n/**\n * Creates a new handle to connect a Dialog.Root with detached Dialog.Trigger components.\n */\nexport function createDialogHandle() {\n return new DialogHandle();\n}"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12],"mappings":"8ZAIa,EAAiC,EAAM,cAAc,IAAA,EAAS,EAE3E,SAAgB,EAAqB,EAAU,CAC7C,IAAM,EAAA,EAAc,WAAW,CAAiB,EAChD,GAAI,CAAC,GAAY,IAAU,IAAA,GACzB,MAAU,MAA2IA,EAAoB,EAAE,CAAC,EAE9K,OAAO,CACT,CCGA,IAAa,EAA2B,EAAM,WAAW,SAAqB,EAAgB,EAAc,CAC1G,GAAM,CACJ,SACA,YACA,QACA,WAAW,GACX,eAAe,GACf,GAAG,GACD,EACE,EAAQ,EAAqB,EAC7B,EAAO,EAAM,SAAS,MAAM,EAC5B,CACJ,iBACA,aACE,EAAU,CACZ,WACA,OAAQ,CACV,CAAC,EACK,EAAQ,CACZ,UACF,EACA,SAAS,EAAY,EAAO,CACtB,GACF,EAAM,QAAQ,GAAO,EAAyBC,EAAoB,EAAM,WAAW,CAAC,CAExF,CACA,OAAO,EAAiB,SAAU,EAAgB,CAChD,QACA,IAAK,CAAC,EAAc,CAAS,EAC7B,MAAO,CAAC,CACN,QAAS,CACX,EAAG,EAAc,CAAc,CACjC,CAAC,CACH,CAAC,ECpCY,EAAiC,EAAM,WAAW,SAA2B,EAAgB,EAAc,CACtH,GAAM,CACJ,SACA,YACA,QACA,GAAI,EACJ,GAAG,GACD,EACE,EAAQ,EAAqB,EAC7B,EAAK,EAAY,CAAM,EAE7B,OADA,EAAM,0BAA0B,uBAAwB,CAAE,EACnD,EAAiB,IAAK,EAAgB,CAC3C,IAAK,EACL,MAAO,CAAC,CACN,IACF,EAAG,CAAY,CACjB,CAAC,CACH,CAAC,ECzBY,EAAmC,EAAM,cAAc,IAAA,EAAS,EAE7E,SAAgB,GAAyB,CACvC,IAAM,EAAA,EAAc,WAAW,CAAmB,EAClD,GAAI,IAAU,IAAA,GACZ,MAAU,MAAuFC,EAAoB,EAAE,CAAC,EAE1H,OAAO,CACT,WCKa,EAA4B,EAAM,WAAW,SAAsB,EAAO,EAAc,CACnG,GAAM,CACJ,cAAc,GACd,GAAG,GACD,EACE,EAAQ,EAAqB,EAC7B,EAAU,EAAM,SAAS,SAAS,EAClC,EAAQ,EAAM,SAAS,OAAO,EAC9B,EAAO,EAAM,SAAS,MAAM,EAKlC,OAJqB,GAAW,GAIZ,EAAA,EAAA,IAAA,CAAK,EAAoB,SAAU,CACrD,MAAO,EACP,UAAuB,EAAA,EAAA,KAAA,CAAM,EAAgB,CAC3C,IAAK,EACL,GAAG,EACH,SAAU,CAAC,GAAW,IAAU,KAAqB,EAAA,EAAA,IAAA,CAAK,EAAkB,CAC1E,IAAK,EAAM,QAAQ,oBACnB,MAAO,EAAW,CAAC,CAAI,CACzB,CAAC,EAAG,EAAM,QAAQ,CACpB,CAAC,CACH,CAAC,EAZQ,IAaX,CAAC,ECjCD,SAAgB,GAAmB,CACjC,QACA,gBACA,YACC,CACD,IAAM,EAAO,EAAM,SAAS,MAAM,EAC5B,EAA0B,EAAM,SAAS,yBAAyB,EAClE,EAAQ,EAAM,SAAS,OAAO,EAC9B,EAAe,EAAM,SAAS,cAAc,EAC5C,EAAsB,EAAM,SAAS,qBAAqB,EAC1D,CAAC,EAAsB,GAAA,EAAiC,SAAS,CAAC,EAClE,CAAC,EAAsB,GAAA,EAAiC,SAAS,CAAC,EAClE,EAAY,IAAyB,EACrC,EAAU,EAAW,EAAqB,CAC9C,mBAAoB,CAMlB,OALI,EAAM,QAAQ,oBAAoB,SAAW,EAAM,QAAQ,YAAY,QAClE,cAIF,CACL,MAAO,IAAU,aAAe,SAAW,cAC3C,MAAO,QACT,CACF,EACA,aAAa,EAAO,CAOlB,GANI,CAAC,EAAM,QAAQ,uBAAuB,SAMtC,WAAY,GAAS,EAAM,SAAW,EACxC,MAAO,GAET,GAAI,YAAa,MAKX,EAAM,OAAS,eACb,EAAM,eAAe,SAAW,GAAK,EAAM,QAAQ,SAAW,EAChE,MAAO,EAAA,MAEJ,GAAI,EAAM,QAAQ,SAAW,EAClC,MAAO,EAAA,CAGX,IAAM,EAAS,EAAU,CAAK,EAC9B,GAAI,GAAa,CAAC,EAAyB,CAIzC,GAAI,EAAO,CACT,IAAM,EAAmB,EAAM,QAAQ,oBAAoB,QACrD,EAAW,EAAM,QAAQ,YAAY,QAC3C,OAAO,GAAoB,EAAW,IAAqB,GAAU,IAAa,GAAU,EAAS,EAAQ,CAAY,GAAK,CAAC,GAAQ,aAAa,qBAAqB,EAAI,EAC/K,CACA,MAAO,EACT,CACA,MAAO,EACT,EACA,UAAW,CACb,CAAC,EAoCD,OAnCA,EAAc,GAAQ,IAAU,GAAM,CAAY,EAIlD,EAAM,mBAAmB,sBAAuB,EAAa,IAAgB,CAC3E,EAAwB,CAAW,EACnC,EAAwB,CAAW,CACrC,CAAC,EAGD,OACM,GAAe,qBACb,EACF,EAAc,mBAAmB,EAAuB,EAAG,GAAwB,IAAiB,EAEpG,EAAc,mBAAmB,EAAG,CAAC,OAG5B,CACP,GAAe,oBAAsB,GACvC,EAAc,mBAAmB,EAAG,CAAC,CAEzC,GACC,CAAC,EAAU,EAAM,EAAsB,EAAsB,CAAa,CAAC,EAC9E,EAAyB,EAAO,CAG9B,mBAAoB,EAAQ,UAC5B,qBAAsB,EAAQ,QAG9B,WAAY,EAAQ,SACpB,sBAAuB,EACvB,sBAAuB,CACzB,CAAC,EACM,IACT,CCxGA,IAAM,EAAY,CAChB,GAAG,EACH,MAAO,GAAS,EAAM,MACtB,OAAQ,GAAS,EAAM,OACvB,sBAAuB,GAAS,EAAM,sBACtC,sBAAuB,GAAS,EAAM,sBACtC,wBAAyB,GAAS,EAAM,wBACxC,WAAY,GAAS,EAAM,WAC3B,qBAAsB,GAAS,EAAM,qBACrC,eAAgB,GAAS,EAAM,eAC/B,gBAAiB,GAAS,EAAM,gBAChC,KAAM,GAAS,EAAM,IACvB,EAQa,GAAb,cAAiC,CAAW,CAC1C,YAAY,EAAc,EAAY,EAAQ,CAC5C,IAAM,EAAkB,IAAI,EACtB,EAAQ,EAAmB,EAAc,EAAiB,EAAY,CAAM,EAClF,MAAM,EAAO,EAAqB,CAAe,EAAG,CAAS,CAC/D,CACA,SAAW,EAAU,IAAiB,CAUpC,GATA,EAAa,0BAA8B,CACzC,KAAK,IAAI,2BAA4B,EAAI,CAC3C,EACI,CAAC,GAAY,EAAa,SAAW,MAAQ,KAAK,MAAM,iBAAmB,OAG7E,EAAa,QAAU,KAAK,MAAM,sBAAwB,IAAA,IAE5D,KAAK,QAAQ,eAAe,EAAU,CAAY,EAC9C,EAAa,WACf,OAEF,KAAK,MAAM,oBAAoB,mBAAmB,EAAU,CAAY,EACxE,IAAM,EAAe,CACnB,KAAM,CACR,EACA,EAAkB,EAAc,EAAU,EAAa,OAAO,EAC9D,KAAK,OAAO,CAAY,CAC1B,CACF,EAOA,SAAgB,IAAwB,CACtC,IAAM,EAAkB,IAAI,EAC5B,OAAO,IAAI,EAAU,OAAO,OAAO,EAAmB,IAAA,GAAW,CAAe,CAAC,EAAG,OAAO,OAAO,EAAqB,CAAe,CAAC,EAAG,CAAS,CACrJ,CACA,SAAS,EAAmB,EAAc,EAAiB,EAAY,EAAS,GAAO,CACrF,IAAM,EAAQ,CACZ,GAAG,EAA6B,EAChC,MAAO,GACP,wBAAyB,GACzB,gBAAiB,KACjB,qBAAsB,IAAA,GACtB,eAAgB,IAAA,GAChB,WAAY,KACZ,OAAQ,GACR,sBAAuB,EACvB,sBAAuB,EACvB,KAAM,SACN,GAAG,CACL,EAEA,MADA,GAAM,oBAAsB,EAA+B,EAAiB,EAAY,CAAM,EACvF,CACT,CACA,SAAS,EAAqB,EAAiB,CAC7C,MAAO,CACL,SAAuB,EAAM,UAAU,EACvC,YAA0B,EAAM,UAAU,EAC1C,oBAAkC,EAAM,UAAU,EAClD,uBAAwB,CACtB,QAAS,EACX,EACA,kBACA,aAAc,IAAA,GACd,qBAAsB,IAAA,EACxB,CACF,CCjFA,SAAgB,GAAoB,EAAM,EAAO,CAC/C,GAAM,CACJ,WACA,KAAM,EACN,cAAc,GACd,eACA,uBACA,wBAAyB,EAA8B,GACvD,MAAO,EAAY,GACnB,aACA,SACA,UAAW,EACX,iBAAkB,EAAuB,MACvC,EACE,EAAW,IAAS,SACpB,EAAgB,IAAS,eACzB,EAAQ,EAAgB,GAAO,EAC/B,EAA0B,GAAiB,EAC3C,EAAO,EAAgB,cAAgB,SACvC,EAAc,EAAqB,EAAI,EAEvC,EAAY,CAChB,QACA,0BACA,OAJa,GAAe,KAK5B,MACF,EAMM,EAAQ,GAAmB,EAAY,IAAmB,IAAI,GAAY,CAC9E,KAAM,EACN,WACA,gBAAiB,EACjB,gBACA,GAAG,CACL,EAAG,EAAY,CAAc,EAAG,EAAI,EACpC,EAAM,kBAAkB,WAAY,CAAQ,EAC5C,EAAM,kBAAkB,gBAAiB,CAAa,EACtD,EAAM,gBAAgB,CAAS,EAC/B,EAAM,mBAAmB,eAAgB,CAAY,EACrD,EAAM,mBAAmB,uBAAwB,CAAoB,EACrE,IAAM,EAAO,EAAM,SAAS,MAAM,EAC5B,EAAU,EAAM,SAAS,SAAS,EAClC,EAAU,EAAM,SAAS,SAAS,EACxC,EAAiB,EAAO,CAAI,EAC5B,EAAyB,CAAK,EAC9B,GAAM,CACJ,gBACE,EAAwB,EAAM,CAAK,EACvC,EAAM,oBAAoB,OAAmB,CAC3C,QAAS,EACT,UAAa,EAAM,QAAQ,GAAO,EAAyBC,CAAwB,CAAC,CACtF,GAAI,CAAC,EAAc,CAAK,CAAC,EACzB,IAAM,EAA2B,GAAQ,EACzC,OAAoB,EAAA,EAAA,KAAA,CAAM,EAAkB,SAAU,CACpD,MAAO,EACP,SAAU,CAAC,IAAuB,EAAA,EAAA,IAAA,CAAK,EAAuB,CACpD,SACD,OACT,CAAC,EAAG,IAAyC,EAAA,EAAA,IAAA,CAAK,GAAoB,CAC7D,QACP,cAAe,GAAa,QAClB,UACZ,CAAC,EAAG,OAAO,GAAa,WAAa,EAAS,CAC5C,SACF,CAAC,EAAI,CAAQ,CACf,CAAC,CACH,CCpEA,IAAa,GAA2B,EAAM,WAAW,SAAqB,EAAgB,EAAc,CAC1G,GAAM,CACJ,SACA,YACA,QACA,GAAI,EACJ,GAAG,GACD,EACE,EAAQ,EAAqB,EAC7B,EAAK,EAAY,CAAM,EAE7B,OADA,EAAM,0BAA0B,iBAAkB,CAAE,EAC7C,EAAiB,KAAM,EAAgB,CAC5C,IAAK,EACL,MAAO,CAAC,CACN,IACF,EAAG,CAAY,CACjB,CAAC,CACH,CAAC,ECTY,GAA6B,EAAM,WAAW,SAAuB,EAAgB,EAAc,CAC9G,GAAM,CACJ,SACA,YACA,QACA,WAAW,GACX,eAAe,GACf,GAAI,EACJ,UACA,SACA,GAAG,GACD,EACE,EAAkB,EAAqB,EAAI,EAE3C,EADc,EAAoB,CAChB,GAAK,EAC7B,GAAI,CAAC,EACH,MAAU,MAAyIC,EAAoB,EAAE,CAAC,EAE5K,IAAM,EAAgB,EAAY,CAAM,EAClC,EAAkB,EAAM,SAAS,qBAAqB,EACtD,EAAwB,EAAM,SAAS,oBAAqB,CAAa,EACzE,EAAU,EAAM,SAAS,iBAAkB,CAAa,EACxD,EAAA,EAA0B,OAAO,IAAI,EACrC,CACJ,kBACA,0BACE,EAAyB,EAAe,EAAmB,EAAO,CACpE,SACF,CAAC,EACK,CACJ,iBACA,aACE,EAAU,CACZ,WACA,OAAQ,CACV,CAAC,EACK,EAAQ,EAAS,CAAe,EAChC,EAAuB,MAAgC,EAAM,OAAO,MAAM,EAAG,GAAmB,CACpG,EAAM,IAAI,aAAc,CAAe,CACzC,CAAC,EACK,EAAQ,CACZ,WACA,KAAM,CACR,EACM,EAAmB,EAAM,SAAS,eAAgB,CAAsB,EAC9E,OAAO,EAAiB,SAAU,EAAgB,CAChD,QACA,IAAK,CAAC,EAAW,EAAc,EAAiB,CAAiB,EACjE,MAAO,CAAC,EAAM,UAAW,EAAkB,EAAsB,EAC9D,GAA2B,GAC5B,GAAI,EACJ,gBAAiB,SACjB,gBAAiB,EACjB,gBAAiB,CACnB,EAAG,EAAc,CAAc,EAC/B,uBAAwB,CAC1B,CAAC,CACH,CAAC,ECvEY,EAA+B,CAC1C,GAAG,EACH,GAAG,EACH,iBAAiB,EAAO,CACtB,OAAO,EAAQ,CACb,0BAA2B,EAC7B,EAAI,IACN,CACF,ECAa,GAA8B,EAAM,WAAW,SAAwB,EAAgB,EAAc,CAChH,GAAM,CACJ,SACA,YACA,QACA,WACA,GAAG,GACD,EACE,EAAc,EAAuB,EACrC,EAAQ,EAAqB,EAC7B,EAAO,EAAM,SAAS,MAAM,EAC5B,EAAS,EAAM,SAAS,QAAQ,EAChC,EAAmB,EAAM,SAAS,kBAAkB,EACpD,EAAwB,EAAM,SAAS,uBAAuB,EAC9D,EAAU,EAAM,SAAS,SAAS,EAClC,EAAqB,EAAM,eAAe,iBAAiB,EASjE,OAAO,EAAiB,MAAO,EAAgB,CAC7C,QAFmB,GAAe,EAGlC,MAAA,CARA,OACA,SACA,mBACA,iBALuB,EAAwB,CAU3C,EACJ,IAAK,CAAC,EAAc,CAAkB,EACtC,uBAAwB,EACxB,MAAO,CAAC,CACN,KAAM,eACN,OAAQ,CAAC,EACT,MAAO,CACL,cAAgB,EAAgB,IAAA,GAAT,MACzB,EACA,UACF,EAAG,CAAY,CACjB,CAAC,CACH,CAAC,ECvCY,EAAb,cAAkC,CAAgB,CAChD,aAAc,CACZ,MAAM,GAAsB,EAAG,SAAU,EAAK,CAChD,CAUA,KAAK,EAAW,CACd,KAAK,cAAc,CAAS,CAC9B,CASA,gBAAgB,EAAS,CACvB,IAAM,EAAgB,KAAK,cACvB,IAAkB,OAMtB,EAAc,IAAI,UAAW,CAAO,EACpC,EAAc,QAAQ,GAAM,EAAyBC,CAAwB,CAAC,EAChF,CAOA,OAAQ,CACN,KAAK,WAAW,CAClB,CAKA,IAAI,QAAS,CACX,OAAO,KAAK,eAAe,OAAO,MAAM,GAAK,EAC/C,CACF,EAKA,SAAgB,IAAqB,CACnC,OAAO,IAAI,CACb"}
|
|
@@ -1,2 +1,2 @@
|
|
|
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{
|
|
2
|
-
//# sourceMappingURL=admin-
|
|
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{nt as o}from"./shell-header-bar-BPgCjFPv.js";import{c as s,l as c,o as l,s as u,t as d,u as f}from"./admin-users-d7tT-cjc.js";import{B as p,H as m,g as h,z as g}from"./index-H6CJKjiN.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-foreground`}),(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-Ii29X08B.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-B8RQbf4_.js","names":["useSuspenseQueries","useSuspenseQuery","Link","TRBadge","TRCard","TRLinkButton","TRText","NetworkIcon","useTranslation","AdminGateScreen","AdminShell","AdminStat","formatAdminRole","formatManagedBy","adminUsersQueryOptions","appConfigQueryOptions","Route","AdminDashboard","user","useRouteContext","select","context","role","AdminDashboardGate","SessionUser","data","config","admin","enabled","AdminDashboardContent","t","usersQuery","adminQuery","configQuery","databaseQuery","queries","pageSize","managedBy","configUsers","pagination","total","databaseUsers","admins","users","slice","map","managedUser","sub","email","undefined","managed_by","email_verified","PolicyRow","label","value","component"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/network.mjs","../../../frontend/src/routes/admin/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 [\"rect\", { x: \"16\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"4q2zg0\" }],\n [\"rect\", { x: \"2\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"8cvhb9\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"6\", rx: \"1\", key: \"1egb70\" }],\n [\"path\", { d: \"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3\", key: \"1jsf9p\" }],\n [\"path\", { d: \"M12 12V8\", key: \"2874zd\" }]\n];\nconst Network = createLucideIcon(\"network\", __iconNode);\n\nexport { __iconNode, Network as default };\n//# sourceMappingURL=network.mjs.map\n","import { useSuspenseQueries, useSuspenseQuery } from '@tanstack/react-query';\nimport { createFileRoute, Link, redirect } from '@tanstack/react-router';\nimport { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRCard } from '@tinyrack/ui/components/card';\nimport { TRLinkButton } from '@tinyrack/ui/components/link-button';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { NetworkIcon } from 'lucide-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 { AdminStat } from '#frontend/features/admin/admin-stat.tsx';\nimport {\n formatAdminRole,\n formatManagedBy,\n} from '#frontend/features/admin/format-admin-user.ts';\nimport { adminUsersQueryOptions } from '#frontend/queries/admin-users.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport type { SessionUser } from '#frontend/queries/session.ts';\nexport const Route = createFileRoute('/admin/')({\n component: AdminDashboard,\n beforeLoad: async ({ context }) => {\n if (!context.user) {\n throw redirect({\n to: '/login',\n });\n }\n },\n});\n\nfunction AdminDashboard() {\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 <AdminDashboardGate user={user} />;\n}\n\nfunction AdminDashboardGate({ user }: { user: SessionUser }) {\n const { data: config } = useSuspenseQuery(appConfigQueryOptions);\n if (!config.admin.enabled) {\n return <AdminGateScreen reason=\"console-disabled\" />;\n }\n return <AdminDashboardContent user={user} />;\n}\n\nfunction AdminDashboardContent({ user }: { user: SessionUser }) {\n const { t } = useTranslation();\n const [usersQuery, adminQuery, configQuery, databaseQuery] =\n useSuspenseQueries({\n queries: [\n adminUsersQueryOptions(),\n adminUsersQueryOptions({ pageSize: 1, role: 'admin' }),\n adminUsersQueryOptions({ managedBy: 'config', pageSize: 1 }),\n adminUsersQueryOptions({ managedBy: 'database', pageSize: 1 }),\n ],\n });\n const data = usersQuery.data;\n const configUsers = configQuery.data.pagination.total;\n const databaseUsers = databaseQuery.data.pagination.total;\n const admins = adminQuery.data.pagination.total;\n\n return (\n <AdminShell\n current=\"dashboard\"\n description={t('admin.dashboardDescription')}\n title={t('admin.dashboardTitle')}\n user={user}\n >\n <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\">\n <AdminStat\n accent=\"bg-tinyrack-primary\"\n hint={t('admin.metrics.totalUsersHint')}\n label={t('admin.metrics.totalUsers')}\n value={data.pagination.total}\n />\n <AdminStat\n accent=\"bg-tinyrack-success\"\n hint={t('admin.metrics.adminsHint')}\n label={t('admin.metrics.admins')}\n value={admins}\n />\n <AdminStat\n accent=\"bg-tinyrack-info\"\n hint={t('admin.metrics.databaseUsersHint')}\n label={t('admin.metrics.databaseUsers')}\n value={databaseUsers}\n />\n </div>\n\n {/* 2:1 rather than the 1.35:0.75 arbitrary value — the same ratio to the eye. */}\n <div className=\"grid gap-tinyrack-xl xl:grid-cols-3\">\n <TRCard.Root\n className=\"overflow-hidden border-tinyrack-border shadow-tinyrack-raised xl:col-span-2\"\n variant=\"outlined\"\n >\n <TRCard.Content className=\"p-0\">\n <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\">\n <div className=\"flex flex-col gap-tinyrack-sm\">\n <div className=\"flex items-center gap-tinyrack-sm\">\n <NetworkIcon\n aria-hidden\n className=\"size-tinyrack-lg text-tinyrack-primary-foreground\"\n />\n <TRText color=\"muted\" variant=\"label\">\n {t('admin.identityGraph')}\n </TRText>\n </div>\n <TRCard.Title>{t('admin.users.title')}</TRCard.Title>\n <TRCard.Description className=\"text-tinyrack-sm\">\n {t('admin.users.description')}\n </TRCard.Description>\n </div>\n <TRLinkButton\n intent=\"primary\"\n render={<Link to=\"/admin/users\" />}\n uiSize=\"sm\"\n >\n {t('admin.users.open')}\n </TRLinkButton>\n </div>\n\n <div className=\"grid divide-y divide-tinyrack-border [gap:0] md:grid-cols-2 md:divide-x md:divide-y-0\">\n {data.users.slice(0, 4).map((managedUser) => (\n <Link\n className=\"group flex flex-col gap-tinyrack-lg bg-tinyrack-surface p-tinyrack-lg transition hover:bg-tinyrack-surface-hover\"\n key={managedUser.sub}\n to=\"/admin/users\"\n >\n <div className=\"flex items-start justify-between gap-tinyrack-lg\">\n <div className=\"flex min-w-0 flex-col gap-tinyrack-xs\">\n <TRText as=\"p\" truncate 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 as=\"p\" color=\"muted\" truncate variant=\"caption\">\n <span className=\"font-tinyrack-mono\">\n {managedUser.sub}\n </span>\n </TRText>\n </div>\n {/* `shrink-0`: without it the tile squeezes the badge and\n \"User\" wraps to two lines. */}\n <TRBadge\n className=\"shrink-0\"\n uiSize=\"md\"\n variant={\n managedUser.role === 'admin' ? 'neutral' : undefined\n }\n >\n {formatAdminRole(t, managedUser.role)}\n </TRBadge>\n </div>\n <div className=\"flex items-center justify-between gap-tinyrack-sm\">\n <TRBadge uiSize=\"md\">\n {formatManagedBy(t, managedUser.managed_by)}\n </TRBadge>\n <TRText color=\"muted\" variant=\"caption\">\n {t('admin.users.verifiedLabel')}{' '}\n {managedUser.email_verified\n ? t('common.yes')\n : t('common.no')}\n </TRText>\n </div>\n </Link>\n ))}\n </div>\n </TRCard.Content>\n </TRCard.Root>\n\n <TRCard.Root\n className=\"overflow-hidden border-tinyrack-border shadow-tinyrack-raised\"\n variant=\"outlined\"\n >\n <TRCard.Content className=\"flex flex-col items-start gap-tinyrack-md\">\n <TRBadge uiSize=\"md\" variant=\"neutral\">\n {t('admin.policy.title')}\n </TRBadge>\n <TRCard.Title className=\"text-tinyrack-xl\">\n {t('admin.policy.heading')}\n </TRCard.Title>\n <TRCard.Description className=\"text-tinyrack-sm\">\n {t('admin.policy.description')}\n </TRCard.Description>\n <div className=\"flex w-full flex-col gap-tinyrack-md\">\n <PolicyRow\n label={t('admin.metrics.configUsers')}\n value={configUsers}\n />\n <PolicyRow\n label={t('admin.metrics.databaseUsers')}\n value={databaseUsers}\n />\n <PolicyRow\n label={t('admin.policy.configReadonly')}\n value={t('common.on')}\n />\n </div>\n </TRCard.Content>\n </TRCard.Root>\n </div>\n </AdminShell>\n );\n}\n\nfunction PolicyRow({\n label,\n value,\n}: {\n label: string;\n value: number | string;\n}) {\n return (\n <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\">\n <TRText color=\"muted\" variant=\"bodySm\">\n {label}\n </TRText>\n <TRBadge uiSize=\"md\" variant=\"neutral\">\n {value}\n </TRBadge>\n </div>\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admin-Ii29X08B.js","names":["useSuspenseQueries","useSuspenseQuery","Link","TRBadge","TRCard","TRLinkButton","TRText","NetworkIcon","useTranslation","AdminGateScreen","AdminShell","AdminStat","formatAdminRole","formatManagedBy","adminUsersQueryOptions","appConfigQueryOptions","Route","AdminDashboard","user","useRouteContext","select","context","role","AdminDashboardGate","SessionUser","data","config","admin","enabled","AdminDashboardContent","t","usersQuery","adminQuery","configQuery","databaseQuery","queries","pageSize","managedBy","configUsers","pagination","total","databaseUsers","admins","users","slice","map","managedUser","sub","email","undefined","managed_by","email_verified","PolicyRow","label","value","component"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/network.mjs","../../../frontend/src/routes/admin/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 [\"rect\", { x: \"16\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"4q2zg0\" }],\n [\"rect\", { x: \"2\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"8cvhb9\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"6\", rx: \"1\", key: \"1egb70\" }],\n [\"path\", { d: \"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3\", key: \"1jsf9p\" }],\n [\"path\", { d: \"M12 12V8\", key: \"2874zd\" }]\n];\nconst Network = createLucideIcon(\"network\", __iconNode);\n\nexport { __iconNode, Network as default };\n//# sourceMappingURL=network.mjs.map\n","import { useSuspenseQueries, useSuspenseQuery } from '@tanstack/react-query';\nimport { createFileRoute, Link, redirect } from '@tanstack/react-router';\nimport { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRCard } from '@tinyrack/ui/components/card';\nimport { TRLinkButton } from '@tinyrack/ui/components/link-button';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { NetworkIcon } from 'lucide-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 { AdminStat } from '#frontend/features/admin/admin-stat.tsx';\nimport {\n formatAdminRole,\n formatManagedBy,\n} from '#frontend/features/admin/format-admin-user.ts';\nimport { adminUsersQueryOptions } from '#frontend/queries/admin-users.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport type { SessionUser } from '#frontend/queries/session.ts';\nexport const Route = createFileRoute('/admin/')({\n component: AdminDashboard,\n beforeLoad: async ({ context }) => {\n if (!context.user) {\n throw redirect({\n to: '/login',\n });\n }\n },\n});\n\nfunction AdminDashboard() {\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 <AdminDashboardGate user={user} />;\n}\n\nfunction AdminDashboardGate({ user }: { user: SessionUser }) {\n const { data: config } = useSuspenseQuery(appConfigQueryOptions);\n if (!config.admin.enabled) {\n return <AdminGateScreen reason=\"console-disabled\" />;\n }\n return <AdminDashboardContent user={user} />;\n}\n\nfunction AdminDashboardContent({ user }: { user: SessionUser }) {\n const { t } = useTranslation();\n const [usersQuery, adminQuery, configQuery, databaseQuery] =\n useSuspenseQueries({\n queries: [\n adminUsersQueryOptions(),\n adminUsersQueryOptions({ pageSize: 1, role: 'admin' }),\n adminUsersQueryOptions({ managedBy: 'config', pageSize: 1 }),\n adminUsersQueryOptions({ managedBy: 'database', pageSize: 1 }),\n ],\n });\n const data = usersQuery.data;\n const configUsers = configQuery.data.pagination.total;\n const databaseUsers = databaseQuery.data.pagination.total;\n const admins = adminQuery.data.pagination.total;\n\n return (\n <AdminShell\n current=\"dashboard\"\n description={t('admin.dashboardDescription')}\n title={t('admin.dashboardTitle')}\n user={user}\n >\n <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\">\n <AdminStat\n accent=\"bg-tinyrack-primary\"\n hint={t('admin.metrics.totalUsersHint')}\n label={t('admin.metrics.totalUsers')}\n value={data.pagination.total}\n />\n <AdminStat\n accent=\"bg-tinyrack-success\"\n hint={t('admin.metrics.adminsHint')}\n label={t('admin.metrics.admins')}\n value={admins}\n />\n <AdminStat\n accent=\"bg-tinyrack-info\"\n hint={t('admin.metrics.databaseUsersHint')}\n label={t('admin.metrics.databaseUsers')}\n value={databaseUsers}\n />\n </div>\n\n {/* 2:1 rather than the 1.35:0.75 arbitrary value — the same ratio to the eye. */}\n <div className=\"grid gap-tinyrack-xl xl:grid-cols-3\">\n <TRCard.Root\n className=\"overflow-hidden border-tinyrack-border shadow-tinyrack-raised xl:col-span-2\"\n variant=\"outlined\"\n >\n <TRCard.Content className=\"p-0\">\n <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\">\n <div className=\"flex flex-col gap-tinyrack-sm\">\n <div className=\"flex items-center gap-tinyrack-sm\">\n <NetworkIcon\n aria-hidden\n className=\"size-tinyrack-lg text-tinyrack-primary-foreground\"\n />\n <TRText color=\"muted\" variant=\"label\">\n {t('admin.identityGraph')}\n </TRText>\n </div>\n <TRCard.Title>{t('admin.users.title')}</TRCard.Title>\n <TRCard.Description className=\"text-tinyrack-sm\">\n {t('admin.users.description')}\n </TRCard.Description>\n </div>\n <TRLinkButton\n intent=\"primary\"\n render={<Link to=\"/admin/users\" />}\n uiSize=\"sm\"\n >\n {t('admin.users.open')}\n </TRLinkButton>\n </div>\n\n <div className=\"grid divide-y divide-tinyrack-border [gap:0] md:grid-cols-2 md:divide-x md:divide-y-0\">\n {data.users.slice(0, 4).map((managedUser) => (\n <Link\n className=\"group flex flex-col gap-tinyrack-lg bg-tinyrack-surface p-tinyrack-lg transition hover:bg-tinyrack-surface-hover\"\n key={managedUser.sub}\n to=\"/admin/users\"\n >\n <div className=\"flex items-start justify-between gap-tinyrack-lg\">\n <div className=\"flex min-w-0 flex-col gap-tinyrack-xs\">\n <TRText as=\"p\" truncate 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 as=\"p\" color=\"muted\" truncate variant=\"caption\">\n <span className=\"font-tinyrack-mono\">\n {managedUser.sub}\n </span>\n </TRText>\n </div>\n {/* `shrink-0`: without it the tile squeezes the badge and\n \"User\" wraps to two lines. */}\n <TRBadge\n className=\"shrink-0\"\n uiSize=\"md\"\n variant={\n managedUser.role === 'admin' ? 'neutral' : undefined\n }\n >\n {formatAdminRole(t, managedUser.role)}\n </TRBadge>\n </div>\n <div className=\"flex items-center justify-between gap-tinyrack-sm\">\n <TRBadge uiSize=\"md\">\n {formatManagedBy(t, managedUser.managed_by)}\n </TRBadge>\n <TRText color=\"muted\" variant=\"caption\">\n {t('admin.users.verifiedLabel')}{' '}\n {managedUser.email_verified\n ? t('common.yes')\n : t('common.no')}\n </TRText>\n </div>\n </Link>\n ))}\n </div>\n </TRCard.Content>\n </TRCard.Root>\n\n <TRCard.Root\n className=\"overflow-hidden border-tinyrack-border shadow-tinyrack-raised\"\n variant=\"outlined\"\n >\n <TRCard.Content className=\"flex flex-col items-start gap-tinyrack-md\">\n <TRBadge uiSize=\"md\" variant=\"neutral\">\n {t('admin.policy.title')}\n </TRBadge>\n <TRCard.Title className=\"text-tinyrack-xl\">\n {t('admin.policy.heading')}\n </TRCard.Title>\n <TRCard.Description className=\"text-tinyrack-sm\">\n {t('admin.policy.description')}\n </TRCard.Description>\n <div className=\"flex w-full flex-col gap-tinyrack-md\">\n <PolicyRow\n label={t('admin.metrics.configUsers')}\n value={configUsers}\n />\n <PolicyRow\n label={t('admin.metrics.databaseUsers')}\n value={databaseUsers}\n />\n <PolicyRow\n label={t('admin.policy.configReadonly')}\n value={t('common.on')}\n />\n </div>\n </TRCard.Content>\n </TRCard.Root>\n </div>\n </AdminShell>\n );\n}\n\nfunction PolicyRow({\n label,\n value,\n}: {\n label: string;\n value: number | string;\n}) {\n return (\n <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\">\n <TRText color=\"muted\" variant=\"bodySm\">\n {label}\n </TRText>\n <TRBadge uiSize=\"md\" variant=\"neutral\">\n {value}\n </TRBadge>\n </div>\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|