@tinyrack/issuary-server 0.23.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/entrypoints/app.d.ts +0 -6
- package/dist/entrypoints/app.d.ts.map +1 -1
- package/dist/lib/config/branding.d.ts +0 -4
- package/dist/lib/config/branding.d.ts.map +1 -1
- package/dist/lib/config/branding.js +0 -14
- package/dist/lib/config/branding.js.map +1 -1
- package/dist/lib/config/resolved.d.ts +0 -2
- package/dist/lib/config/resolved.d.ts.map +1 -1
- package/dist/routes/api/config/get.d.ts +0 -4
- package/dist/routes/api/config/get.d.ts.map +1 -1
- package/dist/routes/api/config/get.js +0 -2
- package/dist/routes/api/config/get.js.map +1 -1
- package/dist/routes/api/config/index.d.ts +0 -4
- package/dist/routes/api/config/index.d.ts.map +1 -1
- package/dist/routes/api/index.d.ts +0 -4
- package/dist/routes/api/index.d.ts.map +1 -1
- package/dist/routes/index.d.ts +0 -4
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/schemas/response.d.ts +0 -2
- package/dist/schemas/response.d.ts.map +1 -1
- package/dist/schemas/response.js +0 -5
- package/dist/schemas/response.js.map +1 -1
- package/dist/services/container.d.ts +0 -2
- package/dist/services/container.d.ts.map +1 -1
- package/package.json +2 -1
- package/public/assets/2fa-6btYq1AL.js +2 -0
- package/public/assets/{2fa-CCOTIHDZ.js.map → 2fa-6btYq1AL.js.map} +1 -1
- package/public/assets/{2fa-BqsM_D-X.js → 2fa-D3ieXkuh.js} +2 -2
- package/public/assets/{2fa-BqsM_D-X.js.map → 2fa-D3ieXkuh.js.map} +1 -1
- package/public/assets/{2fa-B5vLgDXQ.js → 2fa-Dxh4Kxy-.js} +2 -2
- package/public/assets/{2fa-B5vLgDXQ.js.map → 2fa-Dxh4Kxy-.js.map} +1 -1
- package/public/assets/2fa-UcpXAI9J.js +2 -0
- package/public/assets/{2fa-C5vUVgr_.js.map → 2fa-UcpXAI9J.js.map} +1 -1
- package/public/assets/{DialogHandle-BmtK2pRn.js → DialogHandle-tiMUnjZQ.js} +2 -2
- package/public/assets/{DialogHandle-BmtK2pRn.js.map → DialogHandle-tiMUnjZQ.js.map} +1 -1
- package/public/assets/admin-B8RQbf4_.js +2 -0
- package/public/assets/admin-B8RQbf4_.js.map +1 -0
- package/public/assets/{admin-users-DvPbw1Vq.js → admin-users-Dz1QNdy3.js} +2 -2
- package/public/assets/{admin-users-DvPbw1Vq.js.map → admin-users-Dz1QNdy3.js.map} +1 -1
- package/public/assets/alert-leqyvHOp.js.map +1 -1
- package/public/assets/{auth-choice-row-BCGjuedo.js → auth-choice-row-DWzfcZQY.js} +2 -2
- package/public/assets/{auth-choice-row-BCGjuedo.js.map → auth-choice-row-DWzfcZQY.js.map} +1 -1
- package/public/assets/{auth-field-DD8kvl--.js → auth-field-DsLGh1U-.js} +2 -2
- package/public/assets/{auth-field-DD8kvl--.js.map → auth-field-DsLGh1U-.js.map} +1 -1
- package/public/assets/auth-layout-DGTylGtX.js +2 -0
- package/public/assets/auth-layout-DGTylGtX.js.map +1 -0
- package/public/assets/{auth-page-header-CIn2E4zI.js → auth-page-header-COvqWINf.js} +2 -2
- package/public/assets/auth-page-header-COvqWINf.js.map +1 -0
- package/public/assets/authorization-context-banner-DVx1TsPY.js +2 -0
- package/public/assets/authorization-context-banner-DVx1TsPY.js.map +1 -0
- package/public/assets/{avatar-BEQjf2x6.js → avatar-BCLugfaZ.js} +2 -2
- package/public/assets/{avatar-BEQjf2x6.js.map → avatar-BCLugfaZ.js.map} +1 -1
- package/public/assets/badge-CsOfUji0.js.map +1 -1
- package/public/assets/{checkbox-gdHnSFQ-.js → checkbox-CFVDS3zJ.js} +2 -2
- package/public/assets/{checkbox-gdHnSFQ-.js.map → checkbox-CFVDS3zJ.js.map} +1 -1
- package/public/assets/config-DTQCUlfZ.js.map +1 -1
- package/public/assets/{consent-BqqFDdsr.js → consent-CKOohdYI.js} +2 -2
- package/public/assets/{consent-BqqFDdsr.js.map → consent-CKOohdYI.js.map} +1 -1
- package/public/assets/{consent-CfRbz2R7.js → consent-ChiWc7Ql.js} +2 -2
- package/public/assets/{consent-CfRbz2R7.js.map → consent-ChiWc7Ql.js.map} +1 -1
- package/public/assets/createLucideIcon-BPpAIXR_.js.map +1 -1
- package/public/assets/{email-CKKakxPJ.js → email-Crjg1dcr.js} +2 -2
- package/public/assets/{email-CKKakxPJ.js.map → email-Crjg1dcr.js.map} +1 -1
- package/public/assets/email-UcpXAI9J.js +2 -0
- package/public/assets/{email-C5vUVgr_.js.map → email-UcpXAI9J.js.map} +1 -1
- package/public/assets/{error-BMXxpgfR.js → error-VfMv226c.js} +2 -2
- package/public/assets/{error-BMXxpgfR.js.map → error-VfMv226c.js.map} +1 -1
- package/public/assets/{field-Cn4H1CUj.js → field-89zKYDVL.js} +2 -2
- package/public/assets/{field-Cn4H1CUj.js.map → field-89zKYDVL.js.map} +1 -1
- package/public/assets/{forgot-rO9sByfV.js → forgot-Dr88fVMq.js} +2 -2
- package/public/assets/{forgot-rO9sByfV.js.map → forgot-Dr88fVMq.js.map} +1 -1
- package/public/assets/forgot-UcpXAI9J.js +2 -0
- package/public/assets/{forgot-C5vUVgr_.js.map → forgot-UcpXAI9J.js.map} +1 -1
- package/public/assets/{index-DZyHRhbQ.css → index-CDD8owGK.css} +1 -1
- package/public/assets/{index-CS23Ozt6.js → index-CZ0rWM7l.js} +3 -3
- package/public/assets/{index-CS23Ozt6.js.map → index-CZ0rWM7l.js.map} +1 -1
- package/public/assets/{initial-avatar-CtuDUz_W.js → initial-avatar-ocwNWL38.js} +2 -2
- package/public/assets/{initial-avatar-CtuDUz_W.js.map → initial-avatar-ocwNWL38.js.map} +1 -1
- package/public/assets/{input-CzQki7k6.js → input-GPigtjgi.js} +2 -2
- package/public/assets/{input-CzQki7k6.js.map → input-GPigtjgi.js.map} +1 -1
- package/public/assets/link-C-WdTj3F.js.map +1 -1
- package/public/assets/{login-nukebli4.js → login-CQeTLmIu.js} +2 -2
- package/public/assets/{login-nukebli4.js.map → login-CQeTLmIu.js.map} +1 -1
- package/public/assets/login-UcpXAI9J.js +2 -0
- package/public/assets/{login-C5vUVgr_.js.map → login-UcpXAI9J.js.map} +1 -1
- package/public/assets/{modal-BDQFucjz.js → modal-BV3gpI-p.js} +2 -2
- package/public/assets/{modal-BDQFucjz.js.map → modal-BV3gpI-p.js.map} +1 -1
- package/public/assets/{passkey-CynCz1Dt.js → passkey-Bf7n49Z7.js} +2 -2
- package/public/assets/{passkey-CynCz1Dt.js.map → passkey-Bf7n49Z7.js.map} +1 -1
- package/public/assets/{passkey-BE9JvJOP.js → passkey-CT3G7pCL.js} +2 -2
- package/public/assets/{passkey-BE9JvJOP.js.map → passkey-CT3G7pCL.js.map} +1 -1
- package/public/assets/passkey-UcpXAI9J.js +2 -0
- package/public/assets/{passkey-C5vUVgr_.js.map → passkey-UcpXAI9J.js.map} +1 -1
- package/public/assets/{password-RkUttbhD.js → password-BKI5GTRs.js} +2 -2
- package/public/assets/{password-RkUttbhD.js.map → password-BKI5GTRs.js.map} +1 -1
- package/public/assets/password-UcpXAI9J.js +2 -0
- package/public/assets/{password-C5vUVgr_.js.map → password-UcpXAI9J.js.map} +1 -1
- package/public/assets/{password-strength-BeSOu_Ga.js → password-strength-DTWF07Px.js} +2 -2
- package/public/assets/{password-strength-BeSOu_Ga.js.map → password-strength-DTWF07Px.js.map} +1 -1
- package/public/assets/{pin-input-Cc-VkrQ3.js → pin-input-BGOLfkwL.js} +2 -2
- package/public/assets/{pin-input-Cc-VkrQ3.js.map → pin-input-BGOLfkwL.js.map} +1 -1
- package/public/assets/{profile-B5NaJfeS.js → profile-DSTMtoUf.js} +2 -2
- package/public/assets/{profile-B5NaJfeS.js.map → profile-DSTMtoUf.js.map} +1 -1
- package/public/assets/profile-RpDmbWNA.js +2 -0
- package/public/assets/profile-RpDmbWNA.js.map +1 -0
- package/public/assets/provider-logos-u1YURWQr.js.map +1 -1
- package/public/assets/{recovery-PnUATiUi.js → recovery-DbgpqG6f.js} +2 -2
- package/public/assets/{recovery-PnUATiUi.js.map → recovery-DbgpqG6f.js.map} +1 -1
- package/public/assets/{register-DQXhru0_.js → register-B2Lixapy.js} +2 -2
- package/public/assets/{register-DQXhru0_.js.map → register-B2Lixapy.js.map} +1 -1
- package/public/assets/register-UcpXAI9J.js +2 -0
- package/public/assets/{register-C5vUVgr_.js.map → register-UcpXAI9J.js.map} +1 -1
- package/public/assets/{reset-CQgIa3yf.js → reset-C-Qjl2Qy.js} +2 -2
- package/public/assets/{reset-CQgIa3yf.js.map → reset-C-Qjl2Qy.js.map} +1 -1
- package/public/assets/reset-UcpXAI9J.js +2 -0
- package/public/assets/{reset-C5vUVgr_.js.map → reset-UcpXAI9J.js.map} +1 -1
- package/public/assets/{select-DqZynXSt.js → select-BKx4bF4A.js} +2 -2
- package/public/assets/{select-DqZynXSt.js.map → select-BKx4bF4A.js.map} +1 -1
- package/public/assets/select-UcpXAI9J.js +2 -0
- package/public/assets/{select-C5vUVgr_.js.map → select-UcpXAI9J.js.map} +1 -1
- package/public/assets/separator-B0Bvh1he.js.map +1 -1
- package/public/assets/shell-header-bar-CgyNXbPS.js +2 -0
- package/public/assets/shell-header-bar-CgyNXbPS.js.map +1 -0
- package/public/assets/{terms-B5NaJfeS.js → terms-DSTMtoUf.js} +2 -2
- package/public/assets/{terms-B5NaJfeS.js.map → terms-DSTMtoUf.js.map} +1 -1
- package/public/assets/{terms-BHDAgn-H.js → terms-Vgpg5IZK.js} +2 -2
- package/public/assets/{terms-BHDAgn-H.js.map → terms-Vgpg5IZK.js.map} +1 -1
- package/public/assets/{terms-checkbox-list-6jteUTIZ.js → terms-checkbox-list-DqbXU4qw.js} +2 -2
- package/public/assets/{terms-checkbox-list-6jteUTIZ.js.map → terms-checkbox-list-DqbXU4qw.js.map} +1 -1
- package/public/assets/{totp-CJtfVNEq.js → totp-Cjns-PoB.js} +2 -2
- package/public/assets/{totp-CJtfVNEq.js.map → totp-Cjns-PoB.js.map} +1 -1
- package/public/assets/{totp-ECvOUcFx.js → totp-g0-s50HZ.js} +2 -2
- package/public/assets/{totp-ECvOUcFx.js.map → totp-g0-s50HZ.js.map} +1 -1
- package/public/assets/{use-totp-setup-BbS3XcZA.js → use-totp-setup-CtTaklH-.js} +2 -2
- package/public/assets/{use-totp-setup-BbS3XcZA.js.map → use-totp-setup-CtTaklH-.js.map} +1 -1
- package/public/assets/{useAriaLabelledBy-ByuMi3Ry.js → useAriaLabelledBy-7uIPXK-0.js} +2 -2
- package/public/assets/{useAriaLabelledBy-ByuMi3Ry.js.map → useAriaLabelledBy-7uIPXK-0.js.map} +1 -1
- package/public/assets/useQuery-pOdkMV4B.js +2 -0
- package/public/assets/{useQuery-Ckxjmvtl.js.map → useQuery-pOdkMV4B.js.map} +1 -1
- package/public/assets/users-B1hvVo3B.js +2 -0
- package/public/assets/users-B1hvVo3B.js.map +1 -0
- package/public/index.html +2 -2
- package/public/assets/2fa-C5vUVgr_.js +0 -2
- package/public/assets/2fa-CCOTIHDZ.js +0 -2
- package/public/assets/admin-BPijkLw-.js +0 -2
- package/public/assets/admin-BPijkLw-.js.map +0 -1
- package/public/assets/auth-layout-VtpryDof.js +0 -2
- package/public/assets/auth-layout-VtpryDof.js.map +0 -1
- package/public/assets/auth-page-header-CIn2E4zI.js.map +0 -1
- package/public/assets/authorization-context-banner-SOuBHWIb.js +0 -2
- package/public/assets/authorization-context-banner-SOuBHWIb.js.map +0 -1
- package/public/assets/email-C5vUVgr_.js +0 -2
- package/public/assets/forgot-C5vUVgr_.js +0 -2
- package/public/assets/login-C5vUVgr_.js +0 -2
- package/public/assets/passkey-C5vUVgr_.js +0 -2
- package/public/assets/password-C5vUVgr_.js +0 -2
- package/public/assets/profile-BcjsVYOx.js +0 -2
- package/public/assets/profile-BcjsVYOx.js.map +0 -1
- package/public/assets/register-C5vUVgr_.js +0 -2
- package/public/assets/reset-C5vUVgr_.js +0 -2
- package/public/assets/select-C5vUVgr_.js +0 -2
- package/public/assets/shell-header-bar-CjG5qvPg.js +0 -2
- package/public/assets/shell-header-bar-CjG5qvPg.js.map +0 -1
- package/public/assets/useQuery-Ckxjmvtl.js +0 -2
- package/public/assets/users-CmFxrCQT.js +0 -2
- package/public/assets/users-CmFxrCQT.js.map +0 -1
package/public/index.html
CHANGED
|
@@ -18,12 +18,12 @@
|
|
|
18
18
|
<!-- Preload critical API data for faster initial render -->
|
|
19
19
|
<link rel="preload" href="/api/config" as="fetch" crossorigin="anonymous" />
|
|
20
20
|
<link rel="preload" href="/api/user/session" as="fetch" crossorigin="anonymous" />
|
|
21
|
-
<script type="module" crossorigin src="/assets/index-
|
|
21
|
+
<script type="module" crossorigin src="/assets/index-CZ0rWM7l.js"></script>
|
|
22
22
|
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-BPpAIXR_.js">
|
|
23
23
|
<link rel="modulepreload" crossorigin href="/assets/config-DTQCUlfZ.js">
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/mutationOptions-DyYFUbyn.js">
|
|
25
25
|
<link rel="modulepreload" crossorigin href="/assets/zod-C87S6Tec.js">
|
|
26
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
26
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CDD8owGK.css">
|
|
27
27
|
</head>
|
|
28
28
|
<body>
|
|
29
29
|
<div id="root"></div>
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e,n as t,q as n,t as r}from"./createLucideIcon-BPpAIXR_.js";import{Sn as i,t as a}from"./config-DTQCUlfZ.js";import{tt as o}from"./shell-header-bar-CjG5qvPg.js";import{c as s,l as c,o as l,s as u,t as d,u as f}from"./admin-users-DvPbw1Vq.js";import{B as p,H as m,g as h,z as g}from"./index-CS23Ozt6.js";import{t as _}from"./badge-CsOfUji0.js";var v=r(`network`,[[`rect`,{x:`16`,y:`16`,width:`6`,height:`6`,rx:`1`,key:`4q2zg0`}],[`rect`,{x:`2`,y:`16`,width:`6`,height:`6`,rx:`1`,key:`8cvhb9`}],[`rect`,{x:`9`,y:`2`,width:`6`,height:`6`,rx:`1`,key:`1egb70`}],[`path`,{d:`M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3`,key:`1jsf9p`}],[`path`,{d:`M12 12V8`,key:`2874zd`}]]),y=n();function b(){let e=h.useRouteContext({select:e=>e.user});return e?.role===`admin`?(0,y.jsx)(x,{user:e}):(0,y.jsx)(f,{reason:`access-required`})}function x({user:e}){let{data:t}=o(a);return t.admin.enabled?(0,y.jsx)(S,{user:e}):(0,y.jsx)(f,{reason:`console-disabled`})}function S({user:n}){let{t:r}=e(),[a,o,f,h]=m({queries:[d(),d({pageSize:1,role:`admin`}),d({managedBy:`config`,pageSize:1}),d({managedBy:`database`,pageSize:1})]}),b=a.data,x=f.data.pagination.total,S=h.data.pagination.total,w=o.data.pagination.total;return(0,y.jsxs)(u,{current:`dashboard`,description:r(`admin.dashboardDescription`),title:r(`admin.dashboardTitle`),user:n,children:[(0,y.jsxs)(`div`,{className:`flex flex-col divide-y divide-tinyrack-border overflow-hidden rounded-tinyrack-lg border border-tinyrack-border bg-tinyrack-surface shadow-tinyrack-raised lg:flex-row lg:divide-x lg:divide-y-0`,children:[(0,y.jsx)(l,{accent:`bg-tinyrack-primary`,hint:r(`admin.metrics.totalUsersHint`),label:r(`admin.metrics.totalUsers`),value:b.pagination.total}),(0,y.jsx)(l,{accent:`bg-tinyrack-success`,hint:r(`admin.metrics.adminsHint`),label:r(`admin.metrics.admins`),value:w}),(0,y.jsx)(l,{accent:`bg-tinyrack-info`,hint:r(`admin.metrics.databaseUsersHint`),label:r(`admin.metrics.databaseUsers`),value:S})]}),(0,y.jsxs)(`div`,{className:`grid gap-tinyrack-xl xl:grid-cols-3`,children:[(0,y.jsx)(p.Root,{className:`overflow-hidden border-tinyrack-border shadow-tinyrack-raised xl:col-span-2`,variant:`outlined`,children:(0,y.jsxs)(p.Content,{className:`p-0`,children:[(0,y.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-lg border-tinyrack-border border-b-tinyrack-default p-tinyrack-xl sm:flex-row sm:items-center sm:justify-between`,children:[(0,y.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-sm`,children:[(0,y.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[(0,y.jsx)(v,{"aria-hidden":!0,className:`size-tinyrack-lg text-tinyrack-primary`}),(0,y.jsx)(t,{color:`muted`,variant:`label`,children:r(`admin.identityGraph`)})]}),(0,y.jsx)(p.Title,{children:r(`admin.users.title`)}),(0,y.jsx)(p.Description,{className:`text-tinyrack-sm`,children:r(`admin.users.description`)})]}),(0,y.jsx)(g,{intent:`primary`,render:(0,y.jsx)(i,{to:`/admin/users`}),uiSize:`sm`,children:r(`admin.users.open`)})]}),(0,y.jsx)(`div`,{className:`grid divide-y divide-tinyrack-border [gap:0] md:grid-cols-2 md:divide-x md:divide-y-0`,children:b.users.slice(0,4).map(e=>(0,y.jsxs)(i,{className:`group flex flex-col gap-tinyrack-lg bg-tinyrack-surface p-tinyrack-lg transition hover:bg-tinyrack-surface-hover`,to:`/admin/users`,children:[(0,y.jsxs)(`div`,{className:`flex items-start justify-between gap-tinyrack-lg`,children:[(0,y.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-tinyrack-xs`,children:[(0,y.jsx)(t,{as:`p`,truncate:!0,variant:`bodySm`,weight:`medium`,children:e.email}),(0,y.jsx)(t,{as:`p`,color:`muted`,truncate:!0,variant:`caption`,children:(0,y.jsx)(`span`,{className:`font-tinyrack-mono`,children:e.sub})})]}),(0,y.jsx)(_,{className:`shrink-0`,uiSize:`md`,variant:e.role===`admin`?`neutral`:void 0,children:s(r,e.role)})]}),(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-tinyrack-sm`,children:[(0,y.jsx)(_,{uiSize:`md`,children:c(r,e.managed_by)}),(0,y.jsxs)(t,{color:`muted`,variant:`caption`,children:[r(`admin.users.verifiedLabel`),` `,e.email_verified?r(`common.yes`):r(`common.no`)]})]})]},e.sub))})]})}),(0,y.jsx)(p.Root,{className:`overflow-hidden border-tinyrack-border shadow-tinyrack-raised`,variant:`outlined`,children:(0,y.jsxs)(p.Content,{className:`flex flex-col items-start gap-tinyrack-md`,children:[(0,y.jsx)(_,{uiSize:`md`,variant:`neutral`,children:r(`admin.policy.title`)}),(0,y.jsx)(p.Title,{className:`text-tinyrack-xl`,children:r(`admin.policy.heading`)}),(0,y.jsx)(p.Description,{className:`text-tinyrack-sm`,children:r(`admin.policy.description`)}),(0,y.jsxs)(`div`,{className:`flex w-full flex-col gap-tinyrack-md`,children:[(0,y.jsx)(C,{label:r(`admin.metrics.configUsers`),value:x}),(0,y.jsx)(C,{label:r(`admin.metrics.databaseUsers`),value:S}),(0,y.jsx)(C,{label:r(`admin.policy.configReadonly`),value:r(`common.on`)})]})]})})]})]})}function C({label:e,value:n}){return(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-tinyrack-sm rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface-muted px-tinyrack-lg py-tinyrack-md`,children:[(0,y.jsx)(t,{color:`muted`,variant:`bodySm`,children:e}),(0,y.jsx)(_,{uiSize:`md`,variant:`neutral`,children:n})]})}export{b as component};
|
|
2
|
-
//# sourceMappingURL=admin-BPijkLw-.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"admin-BPijkLw-.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\"\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,2 +0,0 @@
|
|
|
1
|
-
import{n as e,q as t}from"./createLucideIcon-BPpAIXR_.js";import{A as n,j as r,t as i}from"./shell-header-bar-CjG5qvPg.js";var a=t();function o(){let{title:t,subtitle:n,iconUrl:i,backgroundUrl:o}=r();return(0,a.jsxs)(`div`,{className:`relative isolate z-0 col-span-full flex flex-col items-start justify-between gap-tinyrack-xs overflow-hidden border-tinyrack-border border-b-tinyrack-default bg-tinyrack-surface-muted px-tinyrack-lg py-tinyrack-md text-tinyrack-text md:col-span-4 md:gap-tinyrack-2xl md:border-e-tinyrack-default md:px-tinyrack-2xl md:py-tinyrack-2xl lg:col-span-5 md:[border-block-end-width:0]`,"data-theme":`tinyrack-dark`,children:[o&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(`div`,{"aria-hidden":!0,className:`absolute inset-0 z-0 [background-position:center] [background-size:cover]`,style:{backgroundImage:`url(${o})`}}),(0,a.jsx)(`div`,{"aria-hidden":!0,className:`absolute inset-0 z-0 bg-tinyrack-scrim`})]}),(0,a.jsxs)(`div`,{className:`relative z-tinyrack-content flex min-w-0 flex-row items-center gap-tinyrack-sm md:flex-col md:items-start md:gap-tinyrack-lg`,children:[i&&(0,a.jsx)(`img`,{alt:``,className:`size-tinyrack-2xl object-contain md:size-tinyrack-3xl`,src:i}),t&&(0,a.jsx)(e,{align:`start`,as:`h1`,className:`[--tr-text-font-size:var(--tinyrack-text-lg)] md:[--tr-text-font-size:var(--tinyrack-text-3xl)]`,weight:`heading`,children:t})]}),n&&(0,a.jsx)(e,{align:`start`,as:`p`,className:`relative z-tinyrack-content max-w-tinyrack-measure-xl truncate [--tr-text-font-size:var(--tinyrack-text-xs)] md:overflow-visible md:whitespace-normal md:[--tr-text-font-size:var(--tinyrack-text-lg)]`,color:`muted`,children:n})]})}var s={form:`max-w-tinyrack-measure-xl`,wide:`max-w-tinyrack-overlay-md`};function c({children:e,width:t=`form`}){return(0,a.jsxs)(`div`,{className:`grid min-h-dvh grid-cols-1 bg-tinyrack-surface md:grid-cols-12`,children:[(0,a.jsx)(n,{}),(0,a.jsx)(o,{}),(0,a.jsxs)(`div`,{className:`col-span-full flex min-w-0 flex-col md:col-span-8 lg:col-span-7`,children:[(0,a.jsx)(i,{}),(0,a.jsx)(`main`,{className:`flex flex-1 items-center justify-center px-tinyrack-lg py-tinyrack-xl`,children:(0,a.jsx)(`div`,{className:`auth-enter flex w-full flex-col gap-tinyrack-xl rounded-tinyrack-xl border border-tinyrack-border bg-tinyrack-surface p-tinyrack-xl md:border-0 md:bg-transparent md:p-0 ${s[t]}`,children:e})})]})]})}export{c as t};
|
|
2
|
-
//# sourceMappingURL=auth-layout-VtpryDof.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-layout-VtpryDof.js","names":[],"sources":["../../../frontend/src/features/layout/auth-brand-panel.tsx","../../../frontend/src/features/layout/auth-layout.tsx"],"sourcesContent":["import { TRText } from '@tinyrack/ui/components/text';\nimport { useBranding } from '#frontend/features/layout/use-branding.ts';\n\n/**\n * The deployment's identity, rendered once for the whole auth surface.\n *\n * There is a single instance in the DOM at every breakpoint: a full-height\n * inverse panel beside the form from `md:` up, and a compact banner strip\n * above it below that. Rendering it twice and hiding one would give the brand\n * title two heading nodes and the icon two `img` nodes, which both the e2e\n * assertions and assistive technology would read as duplicates.\n *\n * When the deployment has configured a product name, that name is the page's\n * `h1` and screen titles sit under it as `h2`. When it has not, the panel has\n * no heading and the screen title becomes the `h1` — see `AuthPageHeader`.\n *\n * Pinned to the dark theme rather than using the `inverse` tokens.\n * `--tinyrack-text-inverse` flips with the active theme, so in dark mode it\n * resolves to near-black — which is illegible over the always-dark scrim a\n * background image sits under. Scoping `data-theme` here makes every token\n * inside the panel resolve consistently, so the brand surface reads the same\n * in both app themes and the scrim always works.\n */\nexport function AuthBrandPanel() {\n const { title, subtitle, iconUrl, backgroundUrl } = useBranding();\n\n return (\n <div\n className=\"relative isolate z-0 col-span-full flex flex-col items-start justify-between gap-tinyrack-xs overflow-hidden border-tinyrack-border border-b-tinyrack-default bg-tinyrack-surface-muted px-tinyrack-lg py-tinyrack-md text-tinyrack-text md:col-span-4 md:gap-tinyrack-2xl md:border-e-tinyrack-default md:px-tinyrack-2xl md:py-tinyrack-2xl lg:col-span-5 md:[border-block-end-width:0]\"\n data-theme=\"tinyrack-dark\"\n >\n {backgroundUrl && (\n <>\n {/*\n Kept as an inline style rather than an arbitrary Tailwind class: the\n URL is runtime config, so it cannot be part of the CSS build.\n */}\n <div\n aria-hidden\n className=\"absolute inset-0 z-0 [background-position:center] [background-size:cover]\"\n style={{ backgroundImage: `url(${backgroundUrl})` }}\n />\n <div aria-hidden className=\"absolute inset-0 z-0 bg-tinyrack-scrim\" />\n </>\n )}\n\n <div className=\"relative z-tinyrack-content flex min-w-0 flex-row items-center gap-tinyrack-sm md:flex-col md:items-start md:gap-tinyrack-lg\">\n {iconUrl && (\n <img\n alt=\"\"\n className=\"size-tinyrack-2xl object-contain md:size-tinyrack-3xl\"\n src={iconUrl}\n />\n )}\n {/*\n Sized through `--tr-text-font-size`, the override hook TRText exposes,\n rather than a `text-*` utility: the component's own per-variant rule\n is more specific than a utility class, so a utility is ignored. Still\n token-only, and responsive because the mobile banner has far less\n room than the panel.\n */}\n {title && (\n <TRText\n align=\"start\"\n as=\"h1\"\n className=\"[--tr-text-font-size:var(--tinyrack-text-lg)] md:[--tr-text-font-size:var(--tinyrack-text-3xl)]\"\n weight=\"heading\"\n >\n {title}\n </TRText>\n )}\n </div>\n\n {/*\n Shown at every width — this is the deployment's own copy, so hiding it\n on phones would drop configured content. One line in the mobile banner,\n the full string beside the form. Sized through the component's override\n hook for the same reason as the title above.\n */}\n {subtitle && (\n <TRText\n align=\"start\"\n as=\"p\"\n className=\"relative z-tinyrack-content max-w-tinyrack-measure-xl truncate [--tr-text-font-size:var(--tinyrack-text-xs)] md:overflow-visible md:whitespace-normal md:[--tr-text-font-size:var(--tinyrack-text-lg)]\"\n color=\"muted\"\n >\n {subtitle}\n </TRText>\n )}\n </div>\n );\n}\n","import { Toaster } from '#frontend/components/ui/toaster.tsx';\nimport { AuthBrandPanel } from '#frontend/features/layout/auth-brand-panel.tsx';\nimport { ShellHeaderBar } from '#frontend/features/layout/shell-header-bar.tsx';\n\ntype AuthLayoutProps = {\n children: React.ReactNode;\n /**\n * `form` (default) fits a single column of fields. `wide` is for screens\n * that present a list to review before deciding — consent scopes, terms,\n * account selection, recovery codes.\n */\n width?: 'form' | 'wide';\n};\n\nconst widthClasses: Record<NonNullable<AuthLayoutProps['width']>, string> = {\n form: 'max-w-tinyrack-measure-xl',\n wide: 'max-w-tinyrack-overlay-md',\n};\n\n/**\n * The shell every auth screen sits in.\n *\n * Split canvas: the deployment's identity on the left, the task on the right.\n * The form is not in a card on desktop — hierarchy comes from the contrast\n * between the inverse brand panel and the canvas, so a card would only add a\n * box inside a box. Below `md:` the panel collapses to a banner and the form\n * does get a surface, because on a phone it would otherwise float unanchored.\n */\nexport function AuthLayout({ children, width = 'form' }: AuthLayoutProps) {\n return (\n <div className=\"grid min-h-dvh grid-cols-1 bg-tinyrack-surface md:grid-cols-12\">\n <Toaster />\n <AuthBrandPanel />\n <div className=\"col-span-full flex min-w-0 flex-col md:col-span-8 lg:col-span-7\">\n {/* No `brand`: AuthBrandPanel already owns the deployment's title. */}\n <ShellHeaderBar />\n <main className=\"flex flex-1 items-center justify-center px-tinyrack-lg py-tinyrack-xl\">\n {/*\n The stack owns vertical rhythm so screens compose as a flat list of\n blocks — header, alerts, form, footer — instead of each one\n hand-rolling `mb-4`/`mt-6` margins that drift apart over time.\n */}\n <div\n className={`auth-enter flex w-full flex-col gap-tinyrack-xl rounded-tinyrack-xl border border-tinyrack-border bg-tinyrack-surface p-tinyrack-xl md:border-0 md:bg-transparent md:p-0 ${widthClasses[width]}`}\n >\n {children}\n </div>\n </main>\n </div>\n </div>\n );\n}\n"],"mappings":"qIAuBA,SAAgB,GAAiB,CAC/B,GAAM,CAAE,QAAO,WAAU,UAAS,iBAAkB,EAAY,EAEhE,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,UAAU,4XACV,aAAW,yBAFb,CAIG,IACC,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAKE,EAAA,EAAA,IAAA,CAAC,MAAD,CACE,cAAA,GACA,UAAU,4EACV,MAAO,CAAE,gBAAiB,OAAO,EAAc,EAAG,CACnD,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,cAAA,GAAY,UAAU,wCAA0C,CAAA,CACrE,CAAA,CAAA,GAGJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,wIAAf,CACG,IACC,EAAA,EAAA,IAAA,CAAC,MAAD,CACE,IAAI,GACJ,UAAU,wDACV,IAAK,CACN,CAAA,EASF,IACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAM,QACN,GAAG,KACH,UAAU,kGACV,OAAO,mBAEN,CACK,CAAA,CAEP,IAQJ,IACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAM,QACN,GAAG,IACH,UAAU,yMACV,MAAM,iBAEL,CACK,CAAA,CAEP,GAET,CC7EA,IAAM,EAAsE,CAC1E,KAAM,4BACN,KAAM,2BACR,EAWA,SAAgB,EAAW,CAAE,WAAU,QAAQ,QAA2B,CACxE,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,0EAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,CAAA,GACV,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,CAAA,GACjB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,2EAAf,EAEE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,CAAA,GACjB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,kFAMd,EAAA,EAAA,IAAA,CAAC,MAAD,CACE,UAAW,4KAA4K,EAAa,KAEnM,UACE,CAAA,CACD,CAAA,CACH,GACF,GAET"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-page-header-CIn2E4zI.js","names":[],"sources":["../../../frontend/src/components/auth/auth-page-header.tsx"],"sourcesContent":["import { TRText } from '@tinyrack/ui/components/text';\nimport { useBranding } from '#frontend/features/layout/use-branding.ts';\n\ntype AuthPageHeaderProps = {\n title: string;\n subtitle?: string;\n /** Small label above the title — wizard progress, flow context. */\n eyebrow?: React.ReactNode;\n /** Centre for terminal states (success, error) where there is no form to scan. */\n align?: 'start' | 'center';\n};\n\n/**\n * Titles the current screen.\n *\n * Heading level follows the brand panel: when the deployment has configured a\n * product name that name is the page's `h1`, so this is an `h2` beneath it.\n * With no branding there is no other heading, so this becomes the `h1` rather\n * than leaving the page starting at level 2.\n *\n * Left-aligned by default. Centred auth copy reads as a consumer sign-up;\n * aligning it with the fields below reads as a console and gives the eye one\n * vertical line to follow into the form.\n *\n * Carries no margin — spacing is the caller's, so it composes into a stack.\n */\nexport function AuthPageHeader({\n title,\n subtitle,\n eyebrow,\n align = 'start',\n}: AuthPageHeaderProps) {\n const { title: brandTitle } = useBranding();\n const headingTag = brandTitle ? 'h2' : 'h1';\n\n return (\n <div\n className={`flex flex-col gap-tinyrack-xs ${align === 'center' ? 'items-center text-center' : 'items-start text-start'}`}\n >\n {eyebrow}\n <TRText align={align} as={headingTag} variant=\"headingLg\">\n {title}\n </TRText>\n {subtitle && (\n <TRText align={align} as=\"p\" color=\"muted\" variant=\"body\">\n {subtitle}\n </TRText>\n )}\n </div>\n );\n}\n"],"mappings":"uHA0BA,SAAgB,EAAe,CAC7B,QACA,WACA,UACA,QAAQ,SACc,CACtB,GAAM,CAAE,MAAO,GAAe,EAAY,EAG1C,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,UAAW,iCAAiC,IAAU,SAAW,2BAA6B,oCADhG,CAGG,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAe,QAAO,GAPP,EAAa,KAAO,KAOG,QAAQ,qBAC3C,CACK,CAAA,EACP,IACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAe,QAAO,GAAG,IAAI,MAAM,QAAQ,QAAQ,gBAChD,CACK,CAAA,CAEP,GAET"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e,n as t,q as n,t as r}from"./createLucideIcon-BPpAIXR_.js";import{tt as i}from"./shell-header-bar-CjG5qvPg.js";import{t as a}from"./shield-check-D_p8H0ni.js";import{B as o,D as s,P as c}from"./index-CS23Ozt6.js";import{t as l}from"./badge-CsOfUji0.js";var u=r(`globe`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20`,key:`13o1zl`}],[`path`,{d:`M2 12h20`,key:`9i4pu4`}]]),d=n();function f({search:e,className:t=``}){return c(e)?(0,d.jsx)(p,{className:t,search:e}):null}function p({search:n,className:r}){let{t:c}=e(),{data:f}=i(s(n));return(0,d.jsx)(o.Root,{"aria-label":c(`authorizationContext.label`),className:r,"data-testid":`authorization-context`,padding:`lg`,render:(0,d.jsx)(`section`,{}),variant:`outlined`,children:(0,d.jsxs)(o.Content,{className:`flex flex-col gap-tinyrack-sm`,children:[(0,d.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[(0,d.jsx)(a,{"aria-hidden":!0,className:`size-tinyrack-lg shrink-0 text-tinyrack-info`}),(0,d.jsx)(t,{variant:`body`,weight:`medium`,children:c(`authorizationContext.title`,{app:f.client.name})})]}),(0,d.jsxs)(`div`,{className:`flex min-w-0 items-center gap-tinyrack-xs`,children:[(0,d.jsx)(u,{"aria-hidden":!0,className:`size-tinyrack-lg shrink-0 text-tinyrack-text-muted`}),(0,d.jsx)(t,{color:`muted`,truncate:!0,variant:`caption`,children:c(`authorizationContext.redirect`,{origin:f.redirect_origin})})]}),(0,d.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-xs`,children:[(0,d.jsx)(t,{color:`muted`,variant:`caption`,weight:`medium`,children:c(`authorizationContext.permissions`)}),f.scopes.length>0?(0,d.jsx)(`ul`,{className:`flex flex-wrap gap-tinyrack-xs`,children:f.scopes.map(e=>(0,d.jsx)(`li`,{children:(0,d.jsx)(l,{uiSize:`md`,variant:`neutral`,children:c(`consent.scope.${e.name}`,{defaultValue:e.description})})},e.name))}):(0,d.jsx)(t,{color:`muted`,variant:`caption`,children:c(`authorizationContext.noScopes`)})]})]})})}export{f as t};
|
|
2
|
-
//# sourceMappingURL=authorization-context-banner-SOuBHWIb.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authorization-context-banner-SOuBHWIb.js","names":[],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/globe.mjs","../../../frontend/src/components/auth/authorization-context-banner.tsx"],"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 [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", key: \"13o1zl\" }],\n [\"path\", { d: \"M2 12h20\", key: \"9i4pu4\" }]\n];\nconst Globe = createLucideIcon(\"globe\", __iconNode);\n\nexport { __iconNode, Globe as default };\n//# sourceMappingURL=globe.mjs.map\n","import { useSuspenseQuery } from '@tanstack/react-query';\nimport { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRCard } from '@tinyrack/ui/components/card';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { GlobeIcon, ShieldCheckIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport {\n type AuthorizationContextSearch,\n hasAuthorizationContext,\n type OAuthSearch,\n} from '#frontend/libs/oauth-search.ts';\nimport { getAuthorizationContextQueryOptions } from '#frontend/queries/authorization-context.ts';\n\ntype AuthorizationContextBannerProps = {\n search: OAuthSearch;\n className?: string;\n};\n\nexport function AuthorizationContextBanner({\n search,\n className = '',\n}: AuthorizationContextBannerProps) {\n if (!hasAuthorizationContext(search)) {\n return null;\n }\n\n return <AuthorizationContextContent className={className} search={search} />;\n}\n\nfunction AuthorizationContextContent({\n search,\n className,\n}: {\n search: AuthorizationContextSearch;\n className: string;\n}) {\n const { t } = useTranslation();\n const { data } = useSuspenseQuery(\n getAuthorizationContextQueryOptions(search),\n );\n\n return (\n <TRCard.Root\n aria-label={t('authorizationContext.label')}\n className={className}\n data-testid=\"authorization-context\"\n padding=\"lg\"\n render={<section />}\n variant=\"outlined\"\n >\n <TRCard.Content className=\"flex flex-col gap-tinyrack-sm\">\n <div className=\"flex items-center gap-tinyrack-sm\">\n <ShieldCheckIcon\n aria-hidden\n className=\"size-tinyrack-lg shrink-0 text-tinyrack-info\"\n />\n <TRText variant=\"body\" weight=\"medium\">\n {t('authorizationContext.title', { app: data.client.name })}\n </TRText>\n </div>\n\n <div className=\"flex min-w-0 items-center gap-tinyrack-xs\">\n <GlobeIcon\n aria-hidden\n className=\"size-tinyrack-lg shrink-0 text-tinyrack-text-muted\"\n />\n <TRText color=\"muted\" truncate variant=\"caption\">\n {t('authorizationContext.redirect', {\n origin: data.redirect_origin,\n })}\n </TRText>\n </div>\n\n <div className=\"flex flex-col gap-tinyrack-xs\">\n <TRText color=\"muted\" variant=\"caption\" weight=\"medium\">\n {t('authorizationContext.permissions')}\n </TRText>\n {data.scopes.length > 0 ? (\n <ul className=\"flex flex-wrap gap-tinyrack-xs\">\n {data.scopes.map((scope) => (\n <li key={scope.name}>\n <TRBadge uiSize=\"md\" variant=\"neutral\">\n {t(`consent.scope.${scope.name}`, {\n defaultValue: scope.description,\n })}\n </TRBadge>\n </li>\n ))}\n </ul>\n ) : (\n <TRText color=\"muted\" variant=\"caption\">\n {t('authorizationContext.noScopes')}\n </TRText>\n )}\n </div>\n </TRCard.Content>\n </TRCard.Root>\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"yQAcA,IAAM,EAAQ,EAAiB,QAAS,CAJtC,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,QAAS,CAAC,EACzD,CAAC,OAAQ,CAAE,EAAG,kDAAmD,IAAK,QAAS,CAAC,EAChF,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,CAEH,CAAU,QCIlD,SAAgB,EAA2B,CACzC,SACA,YAAY,IACsB,CAKlC,OAJK,EAAwB,CAAM,GAI5B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAwC,YAAmB,QAAS,CAAA,EAHlE,IAIX,CAEA,SAAS,EAA4B,CACnC,SACA,aAIC,CACD,GAAM,CAAE,KAAM,EAAe,EACvB,CAAE,QAAS,EACf,EAAoC,CAAM,CAC5C,EAEA,OACE,EAAA,EAAA,IAAA,CAAC,EAAO,KAAR,CACE,aAAY,EAAE,4BAA4B,EAC/B,YACX,cAAY,wBACZ,QAAQ,KACR,QAAQ,EAAA,EAAA,IAAA,CAAC,UAAD,CAAU,CAAA,EAClB,QAAQ,qBAER,EAAA,EAAA,KAAA,CAAC,EAAO,QAAR,CAAgB,UAAU,yCAA1B,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,6CAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,cAAA,GACA,UAAU,8CACX,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,OAAO,OAAO,kBAC3B,EAAE,6BAA8B,CAAE,IAAK,EAAK,OAAO,IAAK,CAAC,CACpD,CAAA,CACL,KAEL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,qDAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,cAAA,GACA,UAAU,oDACX,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAM,QAAQ,SAAA,GAAS,QAAQ,mBACpC,EAAE,gCAAiC,CAClC,OAAQ,EAAK,eACf,CAAC,CACK,CAAA,CACL,KAEL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,yCAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAM,QAAQ,QAAQ,UAAU,OAAO,kBAC5C,EAAE,kCAAkC,CAC/B,CAAA,EACP,EAAK,OAAO,OAAS,GACpB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,0CACX,EAAK,OAAO,IAAK,IAChB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,OAAO,KAAK,QAAQ,mBAC1B,EAAE,iBAAiB,EAAM,OAAQ,CAChC,aAAc,EAAM,WACtB,CAAC,CACM,CAAA,CACP,EANK,EAAM,IAMX,CACL,CACC,CAAA,GAEJ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAM,QAAQ,QAAQ,mBAC3B,EAAE,+BAA+B,CAC5B,CAAA,CAEP,GACS,GACL,CAAA,CAEjB"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{J as e,U as t,Z as n,i as r,n as i,q as a,r as o,s,t as c}from"./createLucideIcon-BPpAIXR_.js";import{On as l,Sr as u,i as d,n as f,r as p,t as m}from"./config-DTQCUlfZ.js";import{t as h}from"./mutationOptions-DyYFUbyn.js";import{t as g}from"./useMutation-BWZ0G4Td.js";import{A as _,D as v,t as y,tt as b}from"./shell-header-bar-CjG5qvPg.js";import{t as x}from"./useQuery-Ckxjmvtl.js";import{a as S,i as C,n as w,r as T,t as E}from"./use-totp-setup-BbS3XcZA.js";import{t as D}from"./auth-field-DD8kvl--.js";import{t as O}from"./fingerprint-pattern-DP62Vk8x.js";import{t as k}from"./key-round-CdvHb8vT.js";import{i as A}from"./provider-logos-u1YURWQr.js";import{n as ee,t as te}from"./logout-B5T52P8u.js";import{t as j}from"./shield-check-D_p8H0ni.js";import{t as M}from"./trash-2-DZdKBLvC.js";import{t as N}from"./triangle-alert-CqNn0kPs.js";import{t as P}from"./zod-C87S6Tec.js";import{B as F,C as ne,R as I,S as L,T as re,w as R,x as ie,z}from"./index-CS23Ozt6.js";import{t as ae}from"./badge-CsOfUji0.js";import{t as oe}from"./auth-page-header-CIn2E4zI.js";import{t as B}from"./alert-leqyvHOp.js";import{t as se}from"./initial-avatar-CtuDUz_W.js";import{t as V}from"./promise-OpBtq8tG.js";import{n as H,t as U}from"./modal-BDQFucjz.js";import{a as W,i as G,n as K,r as q}from"./passkey-J1qnYp9A.js";import{r as J,t as Y}from"./standard-schema-e8gtSzGE.js";import{n as ce,r as le}from"./totp-BNZ904Zm.js";var ue=c(`cloud`,[[`path`,{d:`M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z`,key:`p7xjir`}]]),de=c(`link-2-off`,[[`path`,{d:`M9 17H7A5 5 0 0 1 7 7`,key:`10o201`}],[`path`,{d:`M15 7h2a5 5 0 0 1 4 8`,key:`1d3206`}],[`line`,{x1:`8`,x2:`12`,y1:`12`,y2:`12`,key:`rvw6j4`}],[`line`,{x1:`2`,x2:`22`,y1:`2`,y2:`22`,key:`a6p6uj`}]]),fe=c(`pencil`,[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]),pe=c(`settings`,[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),me=c(`smartphone`,[[`rect`,{width:`14`,height:`20`,x:`5`,y:`2`,rx:`2`,ry:`2`,key:`1yt0o3`}],[`path`,{d:`M12 18h.01`,key:`mhygvu`}]]),X=n(e(),1),Z=a();function he({isConfigManaged:e,isDeletionEnabled:t,onDeleteClick:n}){let{t:a}=r();return t?(0,Z.jsxs)(F.Root,{className:`border-tinyrack-danger-border bg-tinyrack-danger-surface`,variant:`outlined`,children:[(0,Z.jsxs)(F.Header,{className:`border-tinyrack-danger-border border-b-tinyrack-default px-tinyrack-lg py-tinyrack-md`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[(0,Z.jsx)(N,{"aria-hidden":!0,className:`size-tinyrack-lg text-tinyrack-danger`}),(0,Z.jsx)(F.Title,{className:`text-tinyrack-danger`,children:a(`profile.dangerZone.title`)})]}),(0,Z.jsx)(F.Description,{children:a(`profile.dangerZone.description`)})]}),(0,Z.jsx)(F.Content,{className:`px-tinyrack-lg py-tinyrack-md`,children:(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-tinyrack-lg`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col gap-tinyrack-3xs`,children:[(0,Z.jsx)(i,{as:`p`,variant:`bodySm`,weight:`medium`,children:a(`profile.deleteAccount.title`)}),(0,Z.jsx)(i,{as:`p`,color:`muted`,variant:`caption`,children:a(e?`profile.deleteAccount.configManaged`:`profile.deleteAccount.description`)})]}),(0,Z.jsxs)(s,{appearance:`outline`,"data-testid":`profile-delete-account`,disabled:e,intent:`danger`,onClick:n,type:`button`,uiSize:`sm`,children:[(0,Z.jsx)(M,{"aria-hidden":!0,className:`size-tinyrack-lg`}),a(`profile.deleteAccount.button`)]})]})})]}):null}function Q({icon:e,active:t,title:n,status:r,note:a,actions:o}){let s;return s=(0,X.isValidElement)(e)?e:(0,Z.jsx)(e,{"aria-hidden":!0,className:`size-tinyrack-lg ${t?`text-tinyrack-success`:`text-tinyrack-text-muted`}`}),(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-tinyrack-lg p-tinyrack-lg`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-tinyrack-md`,children:[(0,Z.jsx)(`div`,{className:`flex size-9 shrink-0 items-center justify-center rounded-tinyrack-md ${t?`bg-tinyrack-success-surface`:`bg-tinyrack-surface-muted`}`,children:s}),(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col gap-tinyrack-3xs`,children:[(0,Z.jsx)(i,{as:`div`,variant:`bodySm`,weight:`medium`,children:n}),(0,Z.jsx)(i,{as:`div`,color:`muted`,variant:`caption`,children:r}),a]})]}),o&&(0,Z.jsx)(`div`,{className:`flex shrink-0 flex-wrap justify-end gap-tinyrack-xs`,children:o})]})}function ge({providers:e,unlinkingProvider:t,getAuthorizeUrl:n,onUnlinkRequest:i}){let{t:a}=r();return e.length===0?null:(0,Z.jsxs)(F.Root,{variant:`outlined`,children:[(0,Z.jsxs)(F.Header,{className:`border-tinyrack-border border-b-tinyrack-default px-tinyrack-lg py-tinyrack-md`,children:[(0,Z.jsx)(F.Title,{children:a(`profile.linkedAccounts.title`)}),(0,Z.jsx)(F.Description,{children:a(`profile.linkedAccounts.description`)})]}),(0,Z.jsx)(F.Content,{className:`divide-y divide-tinyrack-border p-0`,children:e.map(e=>(0,Z.jsx)(Q,{actions:e.linked?(0,Z.jsx)(s,{appearance:`ghost`,intent:`danger`,loading:t===e.id,loadingLabel:a(`profile.linkedAccounts.unlinking`),onClick:()=>i(e),type:`button`,uiSize:`sm`,children:t===e.id?void 0:a(`profile.linkedAccounts.unlink`)}):(0,Z.jsx)(z,{appearance:`outline`,intent:`neutral`,render:(0,Z.jsx)(`a`,{href:n(e.id,`link`,`/profile`)}),uiSize:`sm`,children:a(`profile.linkedAccounts.link`)}),active:e.linked,icon:(0,Z.jsx)(A,{className:`size-tinyrack-lg`,iconUrl:e.icon_url,providerId:e.id}),status:e.linked?a(`profile.linkedAccounts.connected`):a(`profile.linkedAccounts.notConnected`),title:e.display_name},e.id))})]})}function _e({passkeyCount:e,onOpenModal:t}){let{t:n}=r(),i=e>0;return(0,Z.jsx)(Q,{actions:(0,Z.jsx)(s,{appearance:`ghost`,intent:`primary`,onClick:()=>t(i?`manage`:`setup`),type:`button`,uiSize:`sm`,children:n(i?`profile.passkey.manage`:`profile.passkey.add`)}),active:i,icon:O,status:i?n(`profile.passkey.status.enabled`,{count:e}):n(`profile.passkey.status.disabled`),title:n(`profile.passkey.title`)})}function ve({hasPassword:e,hasLinkedOAuth:t,isConfigManaged:n,hasSecondFactorOnly:a,onOpenModal:o}){let{t:c}=r();return(0,Z.jsx)(Q,{actions:n?void 0:e?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(s,{appearance:`ghost`,"data-testid":`profile-password-change`,intent:`primary`,onClick:()=>o(`change`),type:`button`,uiSize:`sm`,children:c(`profile.password.change`)}),t?(0,Z.jsx)(s,{appearance:`ghost`,"data-testid":`profile-password-remove`,intent:`danger`,onClick:()=>o(`remove`),type:`button`,uiSize:`sm`,children:c(`profile.password.remove`)}):null,!t&&a&&(0,Z.jsxs)(v.Root,{children:[(0,Z.jsx)(v.Trigger,{render:(0,Z.jsx)(s,{appearance:`ghost`,disabled:!0,type:`button`,uiSize:`sm`,children:c(`profile.password.remove`)})}),(0,Z.jsx)(v.Portal,{children:(0,Z.jsx)(v.Positioner,{children:(0,Z.jsx)(v.Popup,{className:`max-w-tinyrack-measure-lg rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface p-tinyrack-md text-tinyrack-text text-tinyrack-xs shadow-tinyrack-overlay`,children:(0,Z.jsxs)(`div`,{className:`flex items-start gap-tinyrack-sm`,children:[(0,Z.jsx)(S,{"aria-hidden":!0,className:`size-tinyrack-lg shrink-0 text-tinyrack-warning`}),(0,Z.jsx)(`div`,{children:c(`profile.password.removeDisabledReason`)})]})})})})]})]}):(0,Z.jsx)(s,{appearance:`ghost`,"data-testid":`profile-password-set`,intent:`primary`,onClick:()=>o(`set`),type:`button`,uiSize:`sm`,children:c(`profile.password.set`)}),active:e,icon:k,note:n?(0,Z.jsxs)(i,{as:`div`,className:`flex items-center gap-tinyrack-xs`,color:`muted`,variant:`caption`,children:[(0,Z.jsx)(pe,{"aria-hidden":!0,className:`size-tinyrack-md shrink-0`}),(0,Z.jsx)(`span`,{children:c(`profile.password.configManaged`)})]}):void 0,status:c(e?`profile.password.status.set`:`profile.password.status.notSet`),title:c(`profile.password.title`)})}function ye({totpEnabled:e,recoveryCodesMissing:t,onOpenModal:n}){let{t:i}=r();return(0,Z.jsx)(Q,{actions:e?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(s,{appearance:`ghost`,"data-testid":`profile-totp-regenerate`,intent:`primary`,onClick:()=>n(`regenerate`),type:`button`,uiSize:`sm`,children:i(`profile.totp.regenerate`)}),(0,Z.jsx)(s,{appearance:`ghost`,"data-testid":`profile-totp-disable`,intent:`danger`,onClick:()=>n(`disable`),type:`button`,uiSize:`sm`,children:i(`profile.totp.disable`)})]}):(0,Z.jsx)(s,{appearance:`ghost`,"data-testid":`profile-totp-enable`,intent:`primary`,onClick:()=>n(`setup`),type:`button`,uiSize:`sm`,children:i(`profile.totp.enable`)}),active:e,icon:j,status:i(e?t?`profile.totp.status.recoveryCodesMissing`:`profile.totp.status.enabled`:`profile.totp.status.disabled`),title:i(`profile.totp.title`)})}var be={error:I,warning:N,info:S};function $({variant:e,children:t}){return(0,Z.jsx)(B,{"data-testid":`alert-banner-${e}`,icon:be[e],type:e,children:t})}function xe({isOpen:e,onClose:t,providerName:n,isPending:i,onConfirm:a}){let{t:o}=r(),[c,l]=(0,X.useState)(null),u=()=>{i||(l(null),t())};return(0,Z.jsx)(U,{description:o(`profile.linkedAccounts.unlinkModal.description`,{provider:n}),icon:de,isOpen:e,onClose:u,preventClose:i,title:o(`profile.linkedAccounts.unlinkModal.title`),variant:`destructive`,children:(0,Z.jsxs)(`div`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,children:[(0,Z.jsx)($,{variant:`warning`,children:o(`profile.linkedAccounts.unlinkModal.warning`,{provider:n})}),c&&(0,Z.jsx)($,{variant:`error`,children:c}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`unlink-oauth-cancel`,disabled:i,intent:`neutral`,onClick:u,type:`button`,uiSize:`sm`,children:o(`profile.linkedAccounts.unlinkModal.cancel`)}),(0,Z.jsx)(s,{"data-testid":`unlink-oauth-unlink`,disabled:i,intent:`danger`,loading:i,loadingLabel:o(`profile.linkedAccounts.unlinking`),onClick:async()=>{l(null);try{await a(),u()}catch{l(o(`profile.linkedAccounts.unlinkError`))}},type:`button`,uiSize:`sm`,children:o(`profile.linkedAccounts.unlink`)})]})]})})}function Se({label:e,value:t}){return(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-tinyrack-lg px-tinyrack-lg py-tinyrack-md`,children:[(0,Z.jsx)(i,{className:`shrink-0`,color:`muted`,variant:`caption`,children:e}),(0,Z.jsx)(i,{truncate:!0,variant:`bodySm`,weight:`medium`,children:t})]})}function Ce({user:e}){let{t}=r();return(0,Z.jsxs)(F.Root,{variant:`outlined`,children:[(0,Z.jsxs)(F.Header,{className:`border-tinyrack-border border-b-tinyrack-default px-tinyrack-lg py-tinyrack-md`,children:[(0,Z.jsx)(F.Title,{children:t(`profile.account.title`)}),(0,Z.jsx)(F.Description,{children:t(`profile.account.description`)})]}),(0,Z.jsxs)(F.Content,{className:`divide-y divide-tinyrack-border p-0`,children:[(0,Z.jsx)(Se,{label:t(`profile.id.label`),value:e.sub}),(0,Z.jsx)(Se,{label:t(`profile.email.label`),value:e.email})]})]})}function we({children:e,headerActions:t}){return(0,Z.jsxs)(`div`,{className:`flex min-h-dvh flex-col bg-tinyrack-surface`,children:[(0,Z.jsx)(_,{}),(0,Z.jsx)(y,{actions:t,brand:!0}),(0,Z.jsx)(`main`,{className:`flex flex-1 justify-center px-tinyrack-lg py-tinyrack-xl`,children:(0,Z.jsx)(`div`,{className:`auth-enter flex w-full max-w-tinyrack-overlay-md flex-col gap-tinyrack-xl`,children:e})})]})}var Te=h({mutationFn:async e=>d(await p.api.user.password.$post({json:e}))}),Ee=h({mutationFn:async e=>d(await p.api.user.password.$put({json:e}))}),De=h({mutationFn:async e=>d(await p.api.user.password.$delete({json:e}))});function Oe({isOpen:e,onClose:t}){let{t:n}=r(),i=u(),{data:a}=b(m),c=a.auth.password.policy,l=J({resolver:Y((0,X.useMemo)(()=>P.object({currentPassword:P.string().min(1,n(`validation.password.required`)),newPassword:P.string().min(c.min_length,n(`validation.password.min`,{count:c.min_length})).max(c.max_length,n(`validation.password.max`,{count:c.max_length})),confirmPassword:P.string()}).refine(e=>e.newPassword===e.confirmPassword,{message:n(`validation.confirmPassword.mismatch`),path:[`confirmPassword`]}),[c.max_length,c.min_length,n])),defaultValues:{currentPassword:``,newPassword:``,confirmPassword:``}}),d=g({...Ee,onSuccess:()=>{i.invalidateQueries({queryKey:L.queryKey}),f()}}),f=()=>{l.reset(),t()},p=l.handleSubmit(async e=>{try{await d.mutateAsync({current_password:e.currentPassword,new_password:e.newPassword})}catch(e){e instanceof o&&e.code===`INVALID_CURRENT_PASSWORD`?l.setError(`currentPassword`,{message:n(`profile.password.changeModal.invalidCurrent`)}):l.setError(`root`,{message:n(`profile.password.changeModal.error`)})}});return(0,Z.jsx)(U,{description:n(`profile.password.changeModal.description`),icon:k,isOpen:e,onClose:f,title:n(`profile.password.changeModal.title`),children:(0,Z.jsxs)(`form`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,onSubmit:p,children:[(0,Z.jsx)(D,{error:l.formState.errors.currentPassword,errorTestId:`change-password-error-currentPassword`,id:`current-password`,label:n(`profile.password.changeModal.currentPassword`),placeholder:n(`profile.password.changeModal.currentPasswordPlaceholder`),...l.register(`currentPassword`),type:`password`}),(0,Z.jsx)(D,{error:l.formState.errors.newPassword,errorTestId:`change-password-error-newPassword`,id:`new-password-change`,label:n(`profile.password.changeModal.newPassword`),placeholder:n(`profile.password.changeModal.newPasswordPlaceholder`),...l.register(`newPassword`),type:`password`}),(0,Z.jsx)(D,{error:l.formState.errors.confirmPassword,errorTestId:`change-password-error-confirmPassword`,id:`confirm-password-change`,label:n(`profile.password.changeModal.confirmPassword`),placeholder:n(`profile.password.changeModal.confirmPasswordPlaceholder`),...l.register(`confirmPassword`),type:`password`}),l.formState.errors.root&&(0,Z.jsx)($,{variant:`error`,children:l.formState.errors.root.message}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`change-password-cancel`,disabled:d.isPending,intent:`neutral`,onClick:f,type:`button`,uiSize:`sm`,children:n(`profile.password.changeModal.cancel`)}),(0,Z.jsx)(s,{"data-testid":`change-password-submit`,disabled:d.isPending,intent:`primary`,loading:d.isPending,loadingLabel:n(`profile.password.changeModal.submitting`),type:`submit`,uiSize:`sm`,children:d.isPending?void 0:n(`profile.password.changeModal.submit`)})]})]})})}var ke=h({mutationFn:async()=>d(await p.api.user.$delete())});function Ae({isOpen:e,onClose:t,retentionDays:n}){let{t:i}=r(),a=l(),o=u(),c=J({resolver:Y((0,X.useMemo)(()=>P.object({confirmation:P.string().refine(e=>e.toLowerCase()===i(`profile.deleteAccount.modal.confirmPlaceholder`).toLowerCase(),{message:i(`validation.confirmText.mismatch`)})}),[i])),defaultValues:{confirmation:``}}),d=g({...ke,onSuccess:async()=>{o.setQueryData(L.queryKey,{user:null}),await V(),a.navigate({to:`/login`})}}),f=()=>{d.isPending||(c.reset(),t())},p=c.handleSubmit(async()=>{try{await d.mutateAsync()}catch{c.setError(`root`,{message:i(`profile.deleteAccount.error`)})}});return(0,Z.jsx)(U,{icon:M,isOpen:e,onClose:f,preventClose:d.isPending,title:i(`profile.deleteAccount.modal.title`),variant:`destructive`,children:(0,Z.jsxs)(`form`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,onSubmit:p,children:[(0,Z.jsx)($,{variant:`error`,children:(0,Z.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-xs`,children:[(0,Z.jsx)(`p`,{children:i(`profile.deleteAccount.modal.description`,{days:n})}),(0,Z.jsx)(`p`,{className:`text-tinyrack-xs opacity-tinyrack-hover`,children:i(`profile.deleteAccount.modal.warning`)})]})}),(0,Z.jsx)(D,{autoComplete:`off`,error:c.formState.errors.confirmation,errorTestId:`delete-account-error`,id:`delete-confirmation`,label:i(`profile.deleteAccount.modal.confirmLabel`),placeholder:i(`profile.deleteAccount.modal.confirmPlaceholder`),...c.register(`confirmation`),type:`text`}),c.formState.errors.root&&(0,Z.jsx)($,{variant:`error`,children:c.formState.errors.root.message}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`delete-account-cancel`,disabled:d.isPending,intent:`neutral`,onClick:f,type:`button`,uiSize:`sm`,children:i(`profile.deleteAccount.modal.cancel`)}),(0,Z.jsx)(s,{"data-testid":`delete-account-submit`,disabled:d.isPending,intent:`danger`,loading:d.isPending,loadingLabel:i(`profile.deleteAccount.modal.confirming`),type:`submit`,uiSize:`sm`,children:d.isPending?void 0:i(`profile.deleteAccount.modal.confirm`)})]})]})})}function je({isOpen:e,onClose:t}){let{t:n}=r(),i=u(),a=J({resolver:Y((0,X.useMemo)(()=>P.object({code:P.string().length(6,n(`validation.totp.length`)).regex(/^\d{6}$/,n(`validation.totp.digits`))}),[n])),defaultValues:{code:``}}),c=g({...ce,onSuccess:()=>{i.invalidateQueries({queryKey:L.queryKey}),l()}}),l=()=>{a.reset(),t()},d=a.handleSubmit(async e=>{try{await c.mutateAsync({code:e.code})}catch(e){if(e instanceof o&&e.code===`CANNOT_REMOVE_LAST_SECOND_FACTOR`){a.setError(`code`,{message:n(`profile.totp.disableModal.cannotRemoveLastSecondFactor`)});return}a.setError(`code`,{message:n(`profile.totp.disableModal.error`)})}});return(0,Z.jsx)(U,{description:n(`profile.totp.disableModal.description`),icon:j,isOpen:e,onClose:l,title:n(`profile.totp.disableModal.title`),variant:`destructive`,children:(0,Z.jsxs)(`form`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,onSubmit:d,children:[(0,Z.jsx)($,{variant:`warning`,children:n(`profile.totp.disableModal.warning`)}),(0,Z.jsx)(D,{autoComplete:`one-time-code`,error:a.formState.errors.code,errorTestId:`disable-totp-error`,id:`disable-totp-code`,inputMode:`numeric`,label:n(`profile.totp.disableModal.codeLabel`),maxLength:6,pattern:`[0-9]*`,placeholder:`000000`,...a.register(`code`),type:`text`}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`disable-totp-cancel`,disabled:c.isPending,intent:`neutral`,onClick:l,type:`button`,uiSize:`sm`,children:n(`profile.totp.disableModal.cancel`)}),(0,Z.jsx)(s,{"data-testid":`disable-totp-submit`,disabled:c.isPending,intent:`danger`,loading:c.isPending,loadingLabel:n(`profile.totp.disableModal.disabling`),type:`submit`,uiSize:`sm`,children:c.isPending?void 0:n(`profile.totp.disableModal.disable`)})]})]})})}function Me({isOpen:e,onClose:n,onAddNew:i}){let{t:a}=r(),c=u(),[l,d]=(0,X.useState)(null),[p,m]=(0,X.useState)(null),[h,_]=(0,X.useState)(null),[v,y]=(0,X.useState)(null),{data:b,isLoading:S}=x({...q,enabled:e}),C=g({...K,onSuccess:()=>{c.invalidateQueries({queryKey:f.passkeys()}),c.invalidateQueries({queryKey:L.queryKey})},onSettled:()=>{m(null)}}),w=(0,X.useCallback)(()=>{d(null),m(null),_(null),y(null),n()},[n]),T=e=>{_(e.id),y(null)},E=()=>{_(null),y(null)},D=async e=>{m(e.id),_(null);try{await C.mutateAsync({id:e.id})}catch(e){if(e instanceof o&&e.code===`CANNOT_REMOVE_LAST_SECOND_FACTOR`){y(a(`profile.passkey.manageModal.cannotRemoveLastSecondFactor`));return}y(a(`profile.passkey.manageModal.deleteError`))}},k=e=>new Date(e).toLocaleDateString(void 0,{year:`numeric`,month:`short`,day:`numeric`}),A=b?.passkeys||[];return(0,Z.jsxs)(U,{icon:O,isOpen:e,onClose:w,size:`lg`,title:a(`profile.passkey.manageModal.title`),children:[(0,Z.jsxs)(`div`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-sm`,children:[v&&(0,Z.jsx)($,{variant:`error`,children:v}),S&&(0,Z.jsx)(`div`,{className:`flex justify-center py-tinyrack-xl`,children:(0,Z.jsx)(t,{uiSize:`md`})}),!S&&A.length===0&&(0,Z.jsx)(`div`,{className:`py-tinyrack-xl text-center text-tinyrack-sm text-tinyrack-text-muted`,"data-testid":`passkeys-empty`,children:(0,Z.jsx)(`p`,{children:a(`profile.passkey.manageModal.noPasskeys`)})}),!S&&A.length>0&&(0,Z.jsx)(`div`,{className:`flex flex-col gap-tinyrack-sm`,children:A.map(e=>(0,Z.jsx)(Ne,{formatDate:k,isConfirmingDelete:h===e.id,isDeleting:p===e.id,isEditing:l?.id===e.id,onCancelDelete:E,onCancelEdit:()=>d(null),onConfirmDelete:()=>D(e),onEdit:()=>d(e),onRequestDelete:()=>T(e),passkey:e},e.id))})]}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`manage-passkeys-close`,intent:`neutral`,onClick:w,type:`button`,uiSize:`sm`,children:a(`profile.passkey.manageModal.close`)}),(0,Z.jsx)(s,{"data-testid":`manage-passkeys-add-new`,intent:`primary`,onClick:()=>{w(),i()},type:`button`,uiSize:`sm`,children:a(`profile.passkey.manageModal.addNew`)})]})]})}function Ne({passkey:e,isDeleting:t,isEditing:n,isConfirmingDelete:i,onEdit:a,onCancelEdit:o,onRequestDelete:c,onConfirmDelete:l,onCancelDelete:d,formatDate:p}){let{t:m}=r(),h=u(),_=J({resolver:Y((0,X.useMemo)(()=>P.object({name:P.string().min(1,m(`validation.passkey.name.required`)).max(100,m(`validation.passkey.name.max`))}),[m])),defaultValues:{name:e.name||``}}),v=g({...W,onSuccess:()=>{h.invalidateQueries({queryKey:f.passkeys()}),o()}}),y=_.handleSubmit(async t=>{try{await v.mutateAsync({id:e.id,name:t.name})}catch{_.setError(`name`,{message:m(`profile.passkey.manageModal.renameError`)})}});return n?(0,Z.jsxs)(`form`,{className:`flex flex-col gap-tinyrack-xs rounded-tinyrack-md bg-tinyrack-surface-muted p-tinyrack-sm`,onSubmit:y,children:[(0,Z.jsx)(D,{"data-testid":`passkey-rename-input`,error:_.formState.errors.name,errorTestId:`passkey-rename-error`,hideLabel:!0,label:m(`profile.passkey.manageModal.nameLabel`),placeholder:m(`profile.passkey.manageModal.namePlaceholder`),..._.register(`name`),type:`text`}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-tinyrack-xs`,children:[(0,Z.jsx)(s,{appearance:`ghost`,disabled:v.isPending,onClick:()=>{_.reset(),o()},type:`button`,uiSize:`sm`,children:m(`profile.passkey.manageModal.cancelEdit`)}),(0,Z.jsx)(s,{disabled:v.isPending,intent:`primary`,type:`submit`,uiSize:`sm`,children:v.isPending?m(`profile.passkey.manageModal.saving`):m(`profile.passkey.manageModal.save`)})]})]}):i?(0,Z.jsxs)(`div`,{className:`flex items-center justify-between rounded-tinyrack-md border border-tinyrack-danger-border bg-tinyrack-danger-surface p-tinyrack-sm text-tinyrack-on-danger`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[(0,Z.jsx)(M,{className:`size-tinyrack-lg`}),(0,Z.jsx)(`span`,{className:`text-tinyrack-xs`,children:m(`profile.passkey.manageModal.deleteConfirmInline`)})]}),(0,Z.jsxs)(`div`,{className:`flex gap-tinyrack-xs`,children:[(0,Z.jsx)(s,{appearance:`ghost`,onClick:d,type:`button`,uiSize:`sm`,children:m(`profile.passkey.manageModal.cancelEdit`)}),(0,Z.jsx)(s,{intent:`danger`,onClick:l,type:`button`,uiSize:`sm`,children:m(`profile.passkey.manageModal.delete`)})]})]}):(0,Z.jsxs)(`div`,{className:`flex items-center justify-between rounded-tinyrack-md bg-tinyrack-surface-muted p-tinyrack-sm`,"data-testid":`passkey-item`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[e.device_type===`multiDevice`?(0,Z.jsx)(ue,{className:`size-tinyrack-lg text-tinyrack-primary`}):(0,Z.jsx)(me,{className:`size-tinyrack-lg text-tinyrack-primary`}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`font-tinyrack-medium text-tinyrack-xs`,children:e.name||m(`profile.passkey.manageModal.unnamedPasskey`)}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-xs text-tinyrack-text-muted text-tinyrack-xs`,children:[(0,Z.jsx)(`span`,{children:m(`profile.passkey.manageModal.createdAt`,{date:p(e.created_at)})}),e.backed_up&&(0,Z.jsx)(ae,{uiSize:`md`,variant:`success`,children:m(`profile.passkey.manageModal.backedUp`)})]})]})]}),(0,Z.jsxs)(`div`,{className:`flex gap-tinyrack-xs`,children:[(0,Z.jsx)(s,{appearance:`ghost`,"aria-label":m(`profile.passkey.manageModal.rename`),onClick:a,type:`button`,uiSize:`sm`,children:(0,Z.jsx)(fe,{className:`size-tinyrack-lg`})}),(0,Z.jsx)(s,{appearance:`ghost`,"aria-label":m(`profile.passkey.manageModal.delete`),disabled:t,intent:`danger`,loading:t,onClick:c,type:`button`,uiSize:`sm`,children:t?void 0:(0,Z.jsx)(M,{className:`size-tinyrack-lg`})})]})]})}function Pe({isOpen:e,onClose:t}){let{t:n}=r(),i=l(),a=u(),{data:s}=b(m),[c,d]=(0,X.useState)(`verify`),[f,p]=(0,X.useState)(null),[h,_]=(0,X.useState)(null),v=g({...le,onSuccess:async e=>{p(e),d(`recovery`),await a.invalidateQueries({queryKey:L.queryKey})}}),y=(0,X.useCallback)(()=>{d(`verify`),p(null),_(null),v.reset()},[v]),x=(0,X.useCallback)(()=>{y(),t()},[t,y]),S=(0,X.useCallback)(async e=>{_(null);try{await v.mutateAsync({code:e})}catch(e){if(e instanceof o){if(e.code===`INVALID_TOTP_CODE`)throw e;if(e.code===`UNAUTHORIZED`){a.setQueryData(L.queryKey,{user:null}),await V(),i.navigate({to:`/login`});return}if(e.code===`TOTP_NOT_ENABLED`||e.code===`VALIDATION_ERROR`){await a.invalidateQueries({queryKey:L.queryKey}),x();return}}_(n(`profile.totp.regenerateModal.unexpectedError`))}},[x,v,a,i,n]);return s.auth.password.totp.enabled?(0,Z.jsx)(U,{description:n(c===`verify`?`profile.totp.regenerateModal.description`:`profile.totp.regenerateModal.recoveryDescription`),icon:j,isOpen:e,onClose:x,preventClose:c===`recovery`,size:`sm`,title:n(c===`verify`?`profile.totp.regenerateModal.title`:`profile.totp.regenerateModal.recoveryTitle`),children:c===`verify`?(0,Z.jsxs)(`div`,{className:`mt-tinyrack-lg`,children:[h&&(0,Z.jsx)(`div`,{className:`mb-tinyrack-md`,children:(0,Z.jsx)($,{variant:`error`,children:h})}),(0,Z.jsx)(T,{invalidMessage:n(`profile.totp.regenerateModal.error`),isPending:v.isPending,onSubmit:S,pendingText:n(`profile.totp.regenerateModal.submitting`),submitLabel:n(`profile.totp.regenerateModal.submit`)})]}):(0,Z.jsx)(`div`,{className:`mt-tinyrack-lg`,children:(0,Z.jsx)(C,{onConfirm:x,recoveryCodes:f?.recovery_codes??[]})})}):null}function Fe({isOpen:e,onClose:t}){let{t:n}=r(),i=u(),a=J({resolver:Y((0,X.useMemo)(()=>P.object({currentPassword:P.string().min(1,n(`validation.password.required`))}),[n])),defaultValues:{currentPassword:``}}),c=g({...De,onSuccess:()=>{i.invalidateQueries({queryKey:L.queryKey}),l()}}),l=()=>{a.reset(),t()},d=a.handleSubmit(async e=>{try{await c.mutateAsync({current_password:e.currentPassword})}catch(e){if(e instanceof o){if(e.code===`INVALID_CURRENT_PASSWORD`){a.setError(`currentPassword`,{message:n(`profile.password.removeModal.invalidCurrent`)});return}if(e.code===`CANNOT_REMOVE_LAST_AUTH_METHOD`){a.setError(`root`,{message:n(`profile.password.removeModal.noOAuth`)});return}if(e.code===`CANNOT_REMOVE_PASSWORD_WITH_SECOND_FACTOR_ONLY`){a.setError(`root`,{message:n(`profile.password.removeModal.noOAuthWith2FA`)});return}}a.setError(`root`,{message:n(`profile.password.removeModal.error`)})}});return(0,Z.jsx)(U,{description:n(`profile.password.removeModal.description`),icon:k,isOpen:e,onClose:l,title:n(`profile.password.removeModal.title`),variant:`destructive`,children:(0,Z.jsxs)(`form`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,onSubmit:d,children:[(0,Z.jsx)(D,{error:a.formState.errors.currentPassword,errorTestId:`remove-password-error`,id:`current-password-remove`,label:n(`profile.password.removeModal.currentPassword`),placeholder:n(`profile.password.removeModal.currentPasswordPlaceholder`),...a.register(`currentPassword`),type:`password`}),a.formState.errors.root&&(0,Z.jsx)($,{variant:`error`,children:a.formState.errors.root.message}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`remove-password-cancel`,disabled:c.isPending,intent:`neutral`,onClick:l,type:`button`,uiSize:`sm`,children:n(`profile.password.removeModal.cancel`)}),(0,Z.jsx)(s,{"data-testid":`remove-password-submit`,disabled:c.isPending,intent:`danger`,loading:c.isPending,loadingLabel:n(`profile.password.removeModal.submitting`),type:`submit`,uiSize:`sm`,children:c.isPending?void 0:n(`profile.password.removeModal.submit`)})]})]})})}function Ie({isOpen:e,onClose:t}){let{t:n}=r(),i=u(),{data:a}=b(m),o=a.auth.password.policy,c=J({resolver:Y((0,X.useMemo)(()=>P.object({password:P.string().min(o.min_length,n(`validation.password.min`,{count:o.min_length})).max(o.max_length,n(`validation.password.max`,{count:o.max_length})),confirmPassword:P.string()}).refine(e=>e.password===e.confirmPassword,{message:n(`validation.confirmPassword.mismatch`),path:[`confirmPassword`]}),[o.max_length,o.min_length,n])),defaultValues:{password:``,confirmPassword:``}}),l=g({...Te,onSuccess:()=>{i.invalidateQueries({queryKey:L.queryKey}),d()}}),d=()=>{c.reset(),t()},f=c.handleSubmit(async e=>{try{await l.mutateAsync({password:e.password})}catch{c.setError(`root`,{message:n(`profile.password.setModal.error`)})}});return(0,Z.jsx)(U,{description:n(`profile.password.setModal.description`),icon:k,isOpen:e,onClose:d,title:n(`profile.password.setModal.title`),children:(0,Z.jsxs)(`form`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,onSubmit:f,children:[(0,Z.jsx)(D,{error:c.formState.errors.password,errorTestId:`set-password-error-password`,id:`new-password`,label:n(`profile.password.setModal.newPassword`),placeholder:n(`profile.password.setModal.newPasswordPlaceholder`),...c.register(`password`),type:`password`}),(0,Z.jsx)(D,{error:c.formState.errors.confirmPassword,errorTestId:`set-password-error-confirmPassword`,id:`confirm-password`,label:n(`profile.password.setModal.confirmPassword`),placeholder:n(`profile.password.setModal.confirmPasswordPlaceholder`),...c.register(`confirmPassword`),type:`password`}),c.formState.errors.root&&(0,Z.jsx)($,{variant:`error`,children:c.formState.errors.root.message}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`set-password-cancel`,disabled:l.isPending,intent:`neutral`,onClick:d,type:`button`,uiSize:`sm`,children:n(`profile.password.setModal.cancel`)}),(0,Z.jsx)(s,{"data-testid":`set-password-submit`,disabled:l.isPending,intent:`primary`,loading:l.isPending,loadingLabel:n(`profile.password.setModal.submitting`),type:`submit`,uiSize:`sm`,children:l.isPending?void 0:n(`profile.password.setModal.submit`)})]})]})})}function Le({isOpen:e,onClose:n,isRequired:i=!1,canSwitchToTotp:a=!1,onSwitchToTotp:o}){let{t:c}=r(),l=u(),[d,p]=(0,X.useState)(`name`),[m,h]=(0,X.useState)(null),_=J({resolver:Y((0,X.useMemo)(()=>P.object({name:P.string().max(100,c(`validation.passkey.name.max`)).optional().transform(e=>e?.trim()||void 0)}),[c])),defaultValues:{name:``}}),v=g({...G,onSuccess:()=>{l.invalidateQueries({queryKey:f.passkeys()}),l.invalidateQueries({queryKey:L.queryKey}),y()},onError:e=>{p(`name`),e.name===`NotAllowedError`?h(c(`profile.passkey.setupModal.cancelled`)):h(c(`profile.passkey.setupModal.error`))}}),y=(0,X.useCallback)(()=>{_.reset(),p(`name`),h(null),n()},[_,n]),b=_.handleSubmit(async e=>{p(`register`),h(null);try{await v.mutateAsync({name:e.name})}catch{}}),x=v.isPending;return(0,Z.jsxs)(U,{description:i?c(`profile.passkey.setupModal.requiredDescription`):void 0,icon:O,isOpen:e,onClose:y,preventClose:i,size:`sm`,title:c(`profile.passkey.setupModal.title`),children:[d===`name`&&(0,Z.jsxs)(`form`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,onSubmit:b,children:[(0,Z.jsx)(`p`,{className:`text-tinyrack-text-muted text-tinyrack-xs`,children:c(`profile.passkey.setupModal.description`)}),m&&(0,Z.jsx)($,{variant:`error`,children:m}),(0,Z.jsx)(D,{error:_.formState.errors.name,errorTestId:`setup-passkey-error`,hint:c(`profile.passkey.setupModal.nameHint`),id:`passkey-name`,label:c(`profile.passkey.setupModal.nameLabel`),placeholder:c(`profile.passkey.setupModal.namePlaceholder`),..._.register(`name`),type:`text`}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`setup-passkey-cancel`,intent:`neutral`,onClick:y,type:`button`,uiSize:`sm`,children:c(`profile.passkey.setupModal.cancel`)}),(0,Z.jsx)(s,{"data-testid":`setup-passkey-continue`,intent:`primary`,type:`submit`,uiSize:`sm`,children:c(`profile.passkey.setupModal.continue`)})]}),a&&o&&(0,Z.jsx)(`p`,{className:`mt-tinyrack-sm text-center text-tinyrack-xs`,children:(0,Z.jsx)(s,{appearance:`ghost`,intent:`primary`,onClick:o,type:`button`,uiSize:`sm`,children:c(`profile.passkey.setupModal.switchToTotp`)})})]}),d===`register`&&(0,Z.jsxs)(`div`,{className:`mt-tinyrack-lg`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col items-center gap-tinyrack-md py-tinyrack-xl`,"data-testid":`setup-passkey-loading`,children:[(0,Z.jsx)(t,{uiSize:`md`}),(0,Z.jsx)(`p`,{className:`text-center text-tinyrack-text-muted text-tinyrack-xs`,children:c(`profile.passkey.setupModal.waitingForDevice`)})]}),(0,Z.jsx)(H,{children:(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`setup-passkey-cancel`,disabled:x,intent:`neutral`,onClick:y,type:`button`,uiSize:`sm`,children:c(`profile.passkey.setupModal.cancel`)})})]})]})}function Re({isOpen:e,onClose:n,isRequired:i=!1,canSwitchToPasskey:a=!1,onSwitchToPasskey:o}){let{t:c}=r(),{step:l,setupData:u,recoveryCodes:d,isSetupPending:f,isVerifyPending:p,isConfirmPending:m,startSetup:h,verify:g,goToVerify:_,goToQr:v,confirmRecoveryCodes:y,reset:b}=E({autoStart:!1,onConfirmSuccess:()=>{b(),n()}}),x=(0,X.useCallback)(()=>{b(),n()},[n,b]),S=(0,X.useCallback)(()=>{!u&&!f&&h()},[u,f,h]);e&&!u&&!f&&l!==`error`&&S();let D=(0,X.useCallback)(async e=>{await g(e)},[g]),O=c(l===`recovery`?`setupTotp.recoveryCodes.title`:`profile.totp.setupModal.title`);return(0,Z.jsxs)(U,{description:i?c(`profile.totp.setupModal.requiredDescription`):void 0,icon:j,isOpen:e,onClose:x,preventClose:i||l===`recovery`,size:`sm`,title:O,children:[f&&(0,Z.jsx)(`div`,{className:`flex justify-center py-tinyrack-xl`,"data-testid":`setup-totp-loading`,children:(0,Z.jsx)(t,{uiSize:`md`})}),l===`error`&&(0,Z.jsxs)(`div`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,children:[(0,Z.jsx)($,{variant:`error`,children:c(`profile.totp.setupModal.setupError`)}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,intent:`neutral`,onClick:x,type:`button`,uiSize:`sm`,children:c(`profile.totp.setupModal.cancel`)}),(0,Z.jsx)(s,{intent:`primary`,onClick:h,type:`button`,uiSize:`sm`,children:c(`profile.totp.setupModal.retry`)})]})]}),u&&l===`qr`&&(0,Z.jsx)(`div`,{className:`mt-tinyrack-lg`,children:(0,Z.jsx)(w,{additionalActions:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(H,{children:(0,Z.jsx)(s,{appearance:`outline`,intent:`neutral`,onClick:x,type:`button`,uiSize:`sm`,children:c(`profile.totp.setupModal.cancel`)})}),a&&o&&(0,Z.jsx)(`p`,{className:`mt-tinyrack-sm text-center text-tinyrack-xs`,children:(0,Z.jsx)(s,{appearance:`ghost`,intent:`primary`,onClick:o,type:`button`,uiSize:`sm`,children:c(`profile.totp.setupModal.switchToPasskey`)})})]}),onNext:_,setupData:u})}),u&&l===`verify`&&(0,Z.jsx)(`div`,{className:`mt-tinyrack-lg`,children:(0,Z.jsx)(T,{isPending:p,onBack:v,onSubmit:D})}),l===`recovery`&&d.length>0&&(0,Z.jsx)(`div`,{className:`mt-tinyrack-lg`,children:(0,Z.jsx)(C,{isLoading:m,onConfirm:y,recoveryCodes:d})})]})}var ze={access_denied:`oauth.error.accessDenied`,temporarily_unavailable:`oauth.error.temporarilyUnavailable`,server_error:`oauth.error.serverError`};function Be(){let{t:e}=r(),t=l(),n=u(),a=ie.useSearch().oauth_error,o=a?e(ze[a]??`oauth.error.failed`):void 0,[c,d]=(0,X.useState)(null),[f,p]=(0,X.useState)(null),[h,_]=(0,X.useState)(null),[v,y]=(0,X.useState)(null),[x,S]=(0,X.useState)(null),[C,w]=(0,X.useState)(!1),{data:T}=b(L),{data:E}=b(R),{data:D}=b(m),O=g({...te,onSuccess:async()=>{n.setQueryData(L.queryKey,{user:null}),await V(),t.navigate({to:`/login`})},onSettled:()=>{n.invalidateQueries({queryKey:L.queryKey})}}),k=g({...re,onSuccess:()=>{n.invalidateQueries({queryKey:R.queryKey})},onSettled:()=>{d(null)}}),A=async()=>{f&&(d(f.id),await k.mutateAsync(f.id))};if(!T.user)return null;let j=T.user,M=E.available_providers,N=M.some(e=>e.linked),P=j.managed_by===`config`,z=D.auth.password,ae=D.auth.passkey,H=z.totp.enabled,U=ae.enabled,W=D.account_deletion.enabled,G=D.account_deletion.retention,K=(()=>{let e=G.match(/^(\d+)([dmy])$/);if(!e)return 30;let t=parseInt(e[1],10);switch(e[2]){case`d`:return t;case`m`:return t*30;case`y`:return t*365;default:return 30}})(),q=!P&&H,J=!P&&U,Y=M.length>0;return(0,Z.jsxs)(we,{headerActions:(0,Z.jsx)(s,{appearance:`ghost`,"aria-label":e(`profile.logout`),"data-testid":`profile-logout`,disabled:O.isPending,loading:O.isPending,onClick:()=>O.mutate(),type:`button`,uiSize:`sm`,children:O.isPending?void 0:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(ee,{"aria-hidden":!0,className:`size-tinyrack-lg`}),(0,Z.jsx)(`span`,{className:`hidden sm:inline`,children:e(`profile.logout`)})]})}),children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-lg`,children:[(0,Z.jsx)(se,{email:j.email,size:`lg`}),(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-tinyrack-3xs`,children:[(0,Z.jsx)(oe,{title:e(`profile.title`)}),(0,Z.jsx)(i,{as:`p`,color:`muted`,"data-testid":`profile-user-email`,truncate:!0,variant:`bodySm`,children:j.email})]})]}),o&&(0,Z.jsx)(B,{icon:I,type:`error`,children:o}),j&&(0,Z.jsx)(Ce,{user:j}),(0,Z.jsxs)(F.Root,{variant:`outlined`,children:[(0,Z.jsxs)(F.Header,{className:`border-tinyrack-border border-b-tinyrack-default px-tinyrack-lg py-tinyrack-md`,children:[(0,Z.jsx)(F.Title,{children:e(`profile.security.title`)}),(0,Z.jsx)(F.Description,{children:e(`profile.security.description`)})]}),q&&j.totp_recovery_codes_missing&&(0,Z.jsx)(`div`,{className:`border-tinyrack-border border-b-tinyrack-default px-tinyrack-lg py-tinyrack-md`,"data-testid":`profile-totp-recovery-warning`,children:(0,Z.jsx)(B,{icon:I,type:`warning`,children:e(`profile.totp.recoveryCodesMissing`)})}),(0,Z.jsxs)(F.Content,{className:`divide-y divide-tinyrack-border p-0`,children:[(0,Z.jsx)(ve,{hasLinkedOAuth:N,hasPassword:j.has_password,hasSecondFactorOnly:j.has_password&&!N&&(j.totp_registered||j.passkey_count>0),isConfigManaged:P,onOpenModal:_}),q&&(0,Z.jsx)(ye,{onOpenModal:y,recoveryCodesMissing:j.totp_recovery_codes_missing,totpEnabled:j.totp_registered}),J&&(0,Z.jsx)(_e,{onOpenModal:S,passkeyCount:j.passkey_count})]})]}),Y&&(0,Z.jsx)(ge,{getAuthorizeUrl:ne,onUnlinkRequest:e=>p({id:e.id,name:e.display_name}),providers:M,unlinkingProvider:c}),(0,Z.jsx)(he,{isConfigManaged:P,isDeletionEnabled:W,onDeleteClick:()=>w(!0)}),(0,Z.jsx)(Ie,{isOpen:h===`set`,onClose:()=>_(null)}),(0,Z.jsx)(Oe,{isOpen:h===`change`,onClose:()=>_(null)}),(0,Z.jsx)(Fe,{isOpen:h===`remove`,onClose:()=>_(null)}),(0,Z.jsx)(Re,{isOpen:v===`setup`,onClose:()=>y(null)}),(0,Z.jsx)(je,{isOpen:v===`disable`,onClose:()=>y(null)}),(0,Z.jsx)(Pe,{isOpen:v===`regenerate`,onClose:()=>y(null)}),(0,Z.jsx)(Le,{isOpen:x===`setup`,onClose:()=>S(null)}),(0,Z.jsx)(Me,{isOpen:x===`manage`,onAddNew:()=>S(`setup`),onClose:()=>S(null)}),(0,Z.jsx)(xe,{isOpen:f!==null,isPending:k.isPending,onClose:()=>p(null),onConfirm:A,providerName:f?.name??``}),(0,Z.jsx)(Ae,{isOpen:C,onClose:()=>w(!1),retentionDays:K})]})}export{Be as component};
|
|
2
|
-
//# sourceMappingURL=profile-BcjsVYOx.js.map
|