@cauthyhq/react 0.0.0-stage → 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react.tsx","../src/organizations.ts","../src/headless.ts","../src/user-button.tsx","../src/organizations-view.tsx","../src/components.tsx","../src/index.ts"],"sourcesContent":["// React: who is signed in, in the browser.\n//\n// <CauthyProvider> // once, at the root\n// <App />\n// </CauthyProvider>\n//\n// const { session, status, signIn, signOut } = useSession()\n//\n// The browser never holds a token: it asks the application's own server\n// (`/api/auth/session`), which answers who is signed in and their\n// organizations. The session store of @cauthyhq/js keeps it current: it asks\n// again a little before the session expires and when the window comes back\n// into view.\n\nimport { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, type CSSProperties, type ReactNode } from 'react'\nimport { createSessionStore, errorFrom, UNAVAILABLE, type AuthClient, type AuthError, type PublicSession, type SessionStore } from '@cauthyhq/js'\nimport { themeVariables, type CauthyTheme } from '@cauthyhq/js/theme'\n\nexport interface SessionContext {\n /** The signed-in person and their organizations, or null. */\n session: PublicSession | null\n status: 'loading' | 'authenticated' | 'unauthenticated'\n /** Sends the browser to sign in, and back to `returnTo` (default: where it is now). */\n signIn(options?: { returnTo?: string; locale?: string; prompt?: 'login' }): void\n /** Signs out of this application and of Cauthy in this browser. */\n signOut(): void\n /** Asks the server again who is signed in. */\n refresh(): Promise<PublicSession | null>\n /** Where the person looks after their account: password, second step, passkeys. */\n accountUrl(returnTo?: string): string\n /** Where the server mounted the routes. */\n basePath: string\n}\n\nexport interface CauthyProviderProps {\n children: ReactNode\n /**\n * Where the server mounted the routes. Default: `/api/auth`. Fixed for the\n * life of the provider: it is the session store's address, so a different\n * one means another store, with the session asked again and every flow\n * started over. To move it, remount the provider (`key={basePath}`).\n */\n basePath?: string\n /**\n * The session the server already read while rendering (SSR): the first\n * paint is then right, with no \"loading\". `null` means \"nobody\"; leave it\n * out when the server did not look.\n */\n initialSession?: PublicSession | null\n /**\n * The language the person reads, for what Cauthy mails them from\n * `useAuth()` and the ready-made forms (a sign-in link, a new password, a\n * confirmation): a tag like `es` or `es-CO`, or a function that answers it\n * when the person can change it. Default: the page's own (`<html lang>`),\n * else the browser's.\n */\n locale?: string | (() => string | undefined)\n /**\n * The application's own look for every ready-made part, over the one set in\n * Cauthy's dashboard: colours, corners, typeface. An application built with\n * stackmyth passes its tokens: `theme={themeFromStackmyth(css).theme}`.\n */\n theme?: CauthyTheme\n /** The fetch the routes are called with. Default: the page's own. */\n fetch?: typeof fetch\n /** Called once when the server does not say `Cauthy-Protocol: 1`. Default: one console warning. */\n onProtocolMismatch?: (seen: string | null) => void\n}\n\n// A layout effect in the browser, where it runs before anything the commit\n// set off; on the server nothing is committed, and an effect is the same no-op.\nconst useIsomorphicLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect\n\nconst StoreCtx = createContext<SessionStore | null>(null)\n// What became of each request the store sent: a hook whose client call answers\n// only data (an empty list, say) learns here whether the server refused it.\ntype Outcome = (path: string, error: AuthError | null) => void\nconst OutcomesCtx = createContext<Set<Outcome> | null>(null)\nconst ThemeCtx = createContext<CauthyTheme | undefined>(undefined)\n\nexport function CauthyProvider({ children, basePath = '/api/auth', initialSession, locale, theme, fetch, onProtocolMismatch }: CauthyProviderProps) {\n // The latest of each, read when a request goes out: a new language or fetch\n // reaches the next request without making the store again. Taken once the\n // render is committed: a render React throws away (a transition that never\n // finished) changes nothing.\n const latest = useRef({ locale, fetch, onProtocolMismatch })\n useIsomorphicLayoutEffect(() => {\n latest.current = { locale, fetch, onProtocolMismatch }\n })\n const readLocale = useCallback(() => {\n const l = latest.current.locale\n return typeof l === 'function' ? l() : l\n }, [])\n // What the server rendered with seeds the store once; later renders do not reset it.\n const first = useRef(initialSession)\n const handsMismatch = useRef(onProtocolMismatch !== undefined)\n const [outcomes] = useState(() => new Set<Outcome>())\n const store = useMemo(\n () => createSessionStore({\n basePath,\n initialSession: first.current,\n locale: readLocale,\n fetch: async (...args: Parameters<typeof globalThis.fetch>) => {\n const [input] = args\n const path = (typeof input === 'string' ? input : input instanceof URL ? input.href : input.url).split('?')[0]\n try {\n const res = await (latest.current.fetch ?? globalThis.fetch)(...args)\n if (outcomes.size > 0) {\n const error = res.ok ? null : errorFrom(res.status, await res.clone().json().catch(() => null))\n for (const o of [...outcomes]) o(path, error)\n }\n return res\n } catch (e) {\n for (const o of [...outcomes]) o(path, UNAVAILABLE)\n throw e\n }\n },\n ...(handsMismatch.current ? { onProtocolMismatch: (seen: string | null) => latest.current.onProtocolMismatch?.(seen) } : {}),\n }),\n [basePath, readLocale, outcomes],\n )\n // The provider listens for as long as it is mounted: the session is asked\n // for and kept current even before a part reads it.\n useEffect(() => store.subscribe(() => {}), [store])\n return (\n <StoreCtx.Provider value={store}>\n <OutcomesCtx.Provider value={outcomes}>\n <ThemeCtx.Provider value={theme}>{children}</ThemeCtx.Provider>\n </OutcomesCtx.Provider>\n </StoreCtx.Provider>\n )\n}\n\n/** The store under the nearest provider. For this package's own parts. */\nexport function useSessionStore(): SessionStore {\n const store = useContext(StoreCtx)\n if (store === null) throw new Error('@cauthyhq/react: useSession needs <CauthyProvider> above it')\n return store\n}\n\n/**\n * Runs `call` and answers what it answered, with the error of the last\n * request it sent to `route` (a path under basePath), or null when that went\n * through. For this package's own parts.\n */\nexport function useRequestOutcome(): <R>(route: string, call: () => Promise<R>) => Promise<{ value: R; error: AuthError | null }> {\n const outcomes = useContext(OutcomesCtx)\n const store = useSessionStore()\n return useCallback(async (route, call) => {\n let error: AuthError | null = null\n const hear: Outcome = (path, e) => { if (path === `${store.basePath}${route}`) error = e }\n outcomes?.add(hear)\n try {\n return { value: await call(), error }\n } finally {\n outcomes?.delete(hear)\n }\n }, [outcomes, store])\n}\n\n/** The provider's `theme`, or undefined. For this package's own parts. */\nexport function useProviderTheme(): CauthyTheme | undefined {\n return useContext(ThemeCtx)\n}\n\n/** The provider's `theme` as the variables styles.css reads, or undefined. For this package's own parts. */\nexport function useThemeVariables(): CSSProperties | undefined {\n const theme = useContext(ThemeCtx)\n return useMemo(() => (theme ? (themeVariables(theme) as CSSProperties) : undefined), [theme])\n}\n\nexport function useSession(): SessionContext {\n const store = useSessionStore()\n const state = useSyncExternalStore(store.subscribe, store.get, store.get)\n return useMemo(\n () => ({ session: state.session, status: state.status, refresh: store.refresh, signIn: store.signIn, signOut: store.signOut, accountUrl: store.accountUrl, basePath: store.basePath }),\n [state, store],\n )\n}\n\n/**\n * The application's own sign-in screens: the functions a form calls.\n *\n * const { signIn, signUp, forgotPassword, signOut, session } = useAuth()\n * const r = await signIn.email({ email, password })\n *\n * They are `createAuthClient()`'s, and what is on screen follows them: after\n * a sign-in or a sign-out, `session` is the new one with no reload.\n */\nexport function useAuth(): AuthClient & Pick<SessionContext, 'session' | 'status' | 'refresh'> {\n const store = useSessionStore()\n const { session, status, refresh } = useSession()\n return useMemo(() => ({ ...store.auth, session, status, refresh }), [store, session, status, refresh])\n}\n","// The signed-in person's organizations, with what their role lets them do,\n// kept current: every change made through this hook asks for the list again.\n//\n// const { organizations, loading, rename } = useOrganizations()\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { AuthError, OrganizationSeat, OrganizationsClient } from '@cauthyhq/js'\nimport { useAuth, useRequestOutcome } from './react'\n\nexport interface UseOrganizations extends OrganizationsClient {\n /** The person's organizations; empty while loading or signed out. */\n organizations: OrganizationSeat[]\n loading: boolean\n /** Why the last list could not be had, or null: an empty list with no error is a person in no organization. */\n error: AuthError | null\n /** Asks for the list again. */\n reload(): Promise<void>\n}\n\nexport function useOrganizations(options: { system?: string } = {}): UseOrganizations {\n const auth = useAuth()\n const client = auth.organizations\n const who = auth.session?.user.id ?? null\n const system = options.system\n const [list, setList] = useState<OrganizationSeat[]>([])\n const [loading, setLoading] = useState(who !== null)\n const [error, setError] = useState<AuthError | null>(null)\n const outcome = useRequestOutcome()\n // A later ask wins over an earlier one still on its way.\n const asked = useRef(0)\n\n const reload = useCallback(async () => {\n const n = ++asked.current\n if (who === null) {\n setList([])\n setError(null)\n setLoading(false)\n return\n }\n setLoading(true)\n const { value: seats, error: failed } = await outcome('/me/organizations', () => client.list(system))\n if (n !== asked.current) return\n setList(seats)\n setError(failed)\n setLoading(false)\n }, [client, who, system, outcome])\n\n useEffect(() => {\n void reload()\n }, [reload])\n\n return useMemo<UseOrganizations>(() => {\n const after = async <R,>(running: Promise<R>): Promise<R> => {\n const r = await running\n await reload()\n return r\n }\n return {\n ...client,\n organizations: list,\n loading,\n error,\n reload,\n add: (id, f) => after(client.add(id, f)),\n setRole: (id, userId, role) => after(client.setRole(id, userId, role)),\n remove: (id, userId) => after(client.remove(id, userId)),\n rename: (id, name) => after(client.rename(id, name)),\n archive: (id) => after(client.archive(id)),\n delete: (id) => after(client.delete(id)),\n }\n }, [client, list, loading, error, reload])\n}\n","// The sign-in with no ready-made form: the flow of @cauthyhq/js in React's\n// terms. The page draws what it likes for each step; the server's `next`\n// decides the step.\n//\n// const flow = useSignInFlow()\n// if (flow.step.name === 'mfa') return <CodeForm onCode={flow.code} />\n\nimport { useMemo, useSyncExternalStore } from 'react'\nimport { createSignInFlow, type FlowState, type SignInFlow } from '@cauthyhq/js'\nimport { useSessionStore } from './react'\n\nexport function useSignInFlow(): SignInFlow & FlowState {\n // One flow per mounted form and store. The store's functions are the same\n // on every render, so the session changing does not restart it; a new store\n // (the provider given another mount point) does.\n const store = useSessionStore()\n const flow = useMemo(() => createSignInFlow(store.auth), [store])\n const state = useSyncExternalStore(flow.subscribe, flow.get, flow.get)\n return useMemo(() => ({ ...flow, ...state }), [flow, state])\n}\n","// Who is signed in, as a button with their initials and a menu: their name\n// and address, \"Manage account\", \"Sign out\". Nobody signed in: \"Sign in\".\n//\n// <UserButton accountHref=\"/account\" signInHref=\"/sign-in\" />\n//\n// The menu follows the WAI-ARIA menu button pattern: Enter, Space or\n// ArrowDown opens it on its first item; ArrowUp, ArrowDown, Home and End move;\n// Escape closes it and gives the focus back to the button.\n\nimport { useEffect, useId, useRef, useState, type KeyboardEvent, type ReactNode } from 'react'\nimport { useAuth, useSession, useThemeVariables } from './react'\n\nexport interface UserButtonTexts {\n signIn: string\n /** The button's accessible name; `{name}` is the person's. */\n menu: string\n manageAccount: string\n signOut: string\n}\n\nconst TEXTS: Record<'en' | 'es', UserButtonTexts> = {\n en: { signIn: 'Sign in', menu: 'Account menu for {name}', manageAccount: 'Manage account', signOut: 'Sign out' },\n es: { signIn: 'Entrar', menu: 'Menú de la cuenta de {name}', manageAccount: 'Administrar la cuenta', signOut: 'Cerrar sesión' },\n}\n\ntype Part = 'root' | 'trigger' | 'avatar' | 'menu' | 'identity' | 'item'\n\nexport interface UserButtonProps {\n /** The language of the built-in words. Default: `en`. */\n locale?: 'en' | 'es'\n texts?: Partial<UserButtonTexts>\n /** Where \"Manage account\" goes: the application's own account page. Default: Cauthy's hosted one. */\n accountHref?: string\n /** Where \"Sign in\" goes: the application's own sign-in page. Default: Cauthy's hosted one. */\n signInHref?: string\n /** Called once signed out, instead of going to `/`. */\n onSignOut?: () => void\n /** More entries for the menu, after \"Manage account\". Give each `role=\"menuitem\"` and `tabIndex={-1}`. */\n children?: ReactNode\n /** No look at all: no `data-cauthy`, no class names but the ones given. */\n unstyled?: boolean\n classNames?: Partial<Record<Part, string>>\n}\n\n/** Two letters for a person: the first and last word of the name, else the address's first letter. */\nexport function initialsOf(name: string, email: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean)\n const first = (w: string) => Array.from(w)[0] ?? ''\n if (words.length >= 2) return (first(words[0]) + first(words[words.length - 1])).toUpperCase()\n if (words.length === 1) return Array.from(words[0]).slice(0, 2).join('').toUpperCase()\n return (first(email.trim()) || '?').toUpperCase()\n}\n\nexport function UserButton(props: UserButtonProps) {\n const { session, status, signIn, signOut: hostedSignOut, accountUrl } = useSession()\n const auth = useAuth()\n const look = useThemeVariables()\n const t: UserButtonTexts = { ...TEXTS[props.locale ?? 'en'], ...props.texts }\n const cx = (part: Part) => props.classNames?.[part] ?? (props.unstyled ? undefined : `cauthy-user-${part}`)\n const root = props.unstyled ? {} : { 'data-cauthy': '', style: look }\n const [open, setOpen] = useState(false)\n const [leaving, setLeaving] = useState(false)\n const menuId = useId()\n const trigger = useRef<HTMLButtonElement | null>(null)\n const menu = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n if (!open) return\n menu.current?.querySelector<HTMLElement>('[role=\"menuitem\"]')?.focus()\n const outside = (e: MouseEvent) => {\n const target = e.target as Node\n if (!menu.current?.contains(target) && !trigger.current?.contains(target)) setOpen(false)\n }\n document.addEventListener('mousedown', outside)\n return () => document.removeEventListener('mousedown', outside)\n }, [open])\n\n if (status !== 'authenticated' || session === null) {\n const waiting = status === 'loading'\n return (\n <div className={cx('root')} {...root}>\n {props.signInHref && !waiting\n ? <a className={cx('trigger')} href={props.signInHref}>{t.signIn}</a>\n : <button type=\"button\" className={cx('trigger')} disabled={waiting} aria-busy={waiting || undefined} onClick={() => signIn()}>{t.signIn}</button>}\n </div>\n )\n }\n\n const name = session.user.name || session.user.email\n const close = (focus: boolean) => {\n setOpen(false)\n if (focus) trigger.current?.focus()\n }\n const items = () => [...(menu.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? [])]\n const onMenuKey = (e: KeyboardEvent) => {\n const list = items()\n const at = list.indexOf(document.activeElement as HTMLElement)\n const go = (i: number) => {\n e.preventDefault()\n list[(i + list.length) % list.length]?.focus()\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n close(true)\n } else if (e.key === 'ArrowDown') go(at + 1)\n else if (e.key === 'ArrowUp') go(at - 1)\n else if (e.key === 'Home') go(0)\n else if (e.key === 'End') go(list.length - 1)\n else if (e.key === 'Tab') close(false)\n }\n const signOut = async () => {\n setLeaving(true)\n const r = await auth.signOut()\n // A backend that serves only Cauthy's hosted pages has no own sign-out: its /logout does it.\n if (!r.ok && r.error.code === 'not_configured') return hostedSignOut()\n setLeaving(false)\n if (!r.ok) return\n setOpen(false)\n if (props.onSignOut) props.onSignOut()\n else window.location.assign('/')\n }\n\n return (\n <div className={cx('root')} {...root}>\n <button\n ref={trigger}\n type=\"button\"\n className={cx('trigger')}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? menuId : undefined}\n aria-label={t.menu.replace('{name}', name)}\n onClick={() => setOpen((o) => !o)}\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n setOpen(true)\n }\n }}\n >\n <span className={cx('avatar')} aria-hidden=\"true\">{initialsOf(session.user.name, session.user.email)}</span>\n </button>\n {open && (\n <div ref={menu} id={menuId} role=\"menu\" aria-label={name} className={cx('menu')} onKeyDown={onMenuKey}>\n <div className={cx('identity')} role=\"presentation\">\n <strong>{session.user.name}</strong>\n <span>{session.user.email}</span>\n </div>\n <a role=\"menuitem\" tabIndex={-1} className={cx('item')} href={props.accountHref ?? accountUrl()}>{t.manageAccount}</a>\n {props.children}\n <button role=\"menuitem\" tabIndex={-1} type=\"button\" className={cx('item')} disabled={leaving} aria-busy={leaving || undefined} onClick={() => void signOut()}>{t.signOut}</button>\n </div>\n )}\n </div>\n )\n}\n","// The signed-in person's organizations: a list to pick one from, and the\n// people of the one picked (<OrganizationMembers />), with what the person's\n// role lets them do there. The application that keeps an \"active\n// organization\" hears each pick through `onSelect`.\n//\n// <Organizations system=\"acme-crm\" onSelect={(o) => setActive(o.id)} />\n\nimport { useId, useState } from 'react'\nimport type { OrganizationSeat } from '@cauthyhq/js'\nimport { OrganizationMembers, type OrganizationMembersProps } from './components'\nimport { useOrganizations } from './organizations'\nimport { useThemeVariables } from './react'\n\nconst TEXTS = {\n en: { title: 'Your organizations', none: 'You do not belong to any organization yet.', loading: 'Loading your organizations…', failed: 'Your organizations could not be loaded.', retry: 'Try again' },\n es: { title: 'Tus organizaciones', none: 'Todavía no perteneces a ninguna organización.', loading: 'Cargando tus organizaciones…', failed: 'No se pudieron cargar tus organizaciones.', retry: 'Intentar de nuevo' },\n}\n\ntype ListPart = 'organizations' | 'organizationList' | 'organization' | 'organizationRole' | 'retry'\n\nexport interface OrganizationsProps extends Omit<OrganizationMembersProps, 'organizationId'> {\n /** Only one system's organizations. */\n system?: string\n /** The one shown first. Default: the first of the list. */\n defaultOrganizationId?: string\n /** Called when the person picks one. */\n onSelect?: (organization: OrganizationSeat) => void\n /** Show the people of the one picked. Default: true. */\n showMembers?: boolean\n /** A class for each part of the list; the members part takes `classNames`. */\n listClassNames?: Partial<Record<ListPart, string>>\n}\n\nexport function Organizations(props: OrganizationsProps) {\n const { system, defaultOrganizationId, onSelect, showMembers, listClassNames, ...members } = props\n const { organizations, loading, error, reload } = useOrganizations({ system })\n const [picked, setPicked] = useState<string | null>(defaultOrganizationId ?? null)\n const heading = useId()\n const look = useThemeVariables()\n const t = TEXTS[props.locale ?? 'en']\n const cx = (part: ListPart | 'heading' | 'notice' | 'error') =>\n listClassNames?.[part as ListPart] ?? (props.unstyled ? undefined : `cauthy-${part}`)\n const root = props.unstyled ? {} : { 'data-cauthy': '', style: look }\n const current = organizations.find((o) => o.id === picked) ?? organizations[0] ?? null\n\n if (loading && organizations.length === 0) {\n return <section className={cx('organizations')} {...root} aria-busy=\"true\"><p className={cx('notice')} role=\"status\">{t.loading}</p></section>\n }\n // A list that could not be had is not an empty one: say so, and offer to ask again.\n if (error && organizations.length === 0) {\n return (\n <section className={cx('organizations')} {...root} aria-busy={loading || undefined}>\n <p className={cx('error')} role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">{t.failed}</p>\n <button type=\"button\" className={cx('retry')} disabled={loading} onClick={() => void reload()}>{t.retry}</button>\n </section>\n )\n }\n if (organizations.length === 0) {\n return <section className={cx('organizations')} {...root}><p className={cx('notice')}>{t.none}</p></section>\n }\n return (\n <section className={cx('organizations')} {...root} aria-labelledby={heading}>\n <h2 id={heading} className={cx('heading')}>{t.title}</h2>\n <ul className={cx('organizationList')}>\n {organizations.map((o) => (\n <li key={o.id}>\n <button\n type=\"button\"\n className={cx('organization')}\n aria-current={o.id === current?.id ? 'true' : undefined}\n onClick={() => {\n setPicked(o.id)\n onSelect?.(o)\n }}\n >\n <span>{o.name}</span>\n <span className={cx('organizationRole')}>{o.role}</span>\n </button>\n </li>\n ))}\n </ul>\n {showMembers !== false && current && <OrganizationMembers key={current.id} {...members} organizationId={current.id} />}\n </section>\n )\n}\n","// The sign-in screens, ready to use.\n//\n// <SignIn onSuccess={() => navigate('/')} />\n// <SignUp locale=\"es\" />\n// <ForgotPassword />\n//\n// They are plain forms — a label, an input, a button. Import\n// `@cauthyhq/react/styles.css` once and they are drawn with the colours, corners and\n// typeface a person set for the workspace in Cauthy's dashboard, the same as\n// Cauthy's own sign-in page. Or give them the application's own button and\n// input (`components`), or a class for each part (`classNames`), and pass\n// `unstyled` to leave all of that out. Everything they do is `useAuth()`: an\n// application that wants another form writes it with the same functions.\n\nimport { Fragment, useCallback, useEffect, useId, useRef, useState, useSyncExternalStore, type ComponentType, type CSSProperties, type FormEvent, type ReactNode } from 'react'\nimport { canUsePasskeys, checkEmail, checkName, checkNewPassword, checkPassword, createAuthClient, passwordProblems, describePasswordPolicy, explainPasswordProblems, MIN_PASSWORD, type PasswordPolicy, type Account as AccountDetails, type AccountSession, type AuthError, type ConnectedAgent, type AuthMethods, type Invitation, type LinkedIdentity, type OrganizationPerson, type OrganizationRoleChoice, type OrganizationSeat, type Passkey, type PendingLegal, type SecondStep, type SSOConnection } from '@cauthyhq/js'\nimport { useAuth, useProviderTheme, useSession, useSessionStore } from './react'\nimport { themeVariables, type CauthyTheme, type ThemeFont } from '@cauthyhq/js/theme'\nimport { checkOrganization } from '@cauthyhq/js'\n\n/** Every sentence the forms show. Give any of them to change it. */\nexport interface AuthTexts {\n email: string\n password: string\n name: string\n code: string\n signIn: string\n signUp: string\n continueWith: string // \"Continue with\" + the provider's name\n orWithEmail: string\n /** The sign-in's box to stay signed in, shown when the application's client allows it. */\n keepSignedIn: string\n forgotPassword: string\n noAccount: string\n createAccount: string\n /** The label of the company's name, asked when the application's system makes an organization per sign-up. */\n company: string\n /** The legal box: \"I have read and accept\" + \"the Terms of Service\" + \"and\" + \"the Privacy Policy\", linked. */\n iAccept: string\n and: string\n termsOfService: string\n privacyPolicy: string\n haveAccount: string\n sendLink: string\n linkSent: string\n codeHelp: string\n /** The second step when it is a phone only. */\n codeHelpPhone: string\n /** The second step by email (the account has no factor): \"{to}\" is the address, masked. */\n codeHelpEmail: string\n sendEmailAgain: string\n /** \"{to}\" is the phone, masked. */\n sendCodeSms: string\n sendCodeWhatsapp: string\n codeSent: string\n /** The second step approved on the phone; \"{n}\" is the number to pick. */\n pushSend: string\n pushPick: string\n pushWaiting: string\n // The phone on the account screen.\n phone: string\n phoneHelp: string\n phoneOn: string // \"{to}\": the phone, masked\n phoneOff: string\n addPhone: string\n removePhone: string\n bySms: string\n byWhatsapp: string\n /** The label of the channel phone codes go by, where the application draws it as a select. */\n channel: string\n verify: string\n checkEmail: string\n backToSignIn: string\n emailMeALink: string\n /** The sign-in link's own step: what it does, its send button, the way back. */\n linkHelp: string\n sendMeTheLink: string\n back: string\n usePasskey: string\n codeFromMail: string\n signInLinkSent: string\n newPassword: string\n savePassword: string\n passwordChanged: string\n confirming: string\n emailConfirmed: string\n // <AcceptInvite />: the page an invitation opens.\n invitedTo: string // \"{workspace}\" is replaced\n invitedToOrganization: string // \"{organization}\" and \"{workspace}\" are replaced\n invitedAs: string // \"{email}\" is replaced\n choosePassword: string\n acceptInvite: string\n openingInvitation: string\n invitationInvalid: string\n // The account screen.\n profile: string\n save: string\n saved: string\n currentPassword: string\n changePassword: string\n passwordChangedHere: string\n secondStep: string\n secondStepOn: string\n secondStepOff: string\n turnOn: string\n turnOff: string\n addToApp: string // above the secret to add to an authenticator app\n openInApp: string\n qrAlt: string\n recoveryCodes: string\n newRecoveryCodes: string\n keepCodes: string\n /** Beside recovery codes just made: copy them all, or save them as a text file. */\n copyCodes: string\n downloadCodes: string\n codesCopied: string\n /** Said when the browser would not copy: the codes stay on screen to select. */\n codesNotCopied: string\n /** The action that opens the form of a part already set (the name). */\n change: string\n /** The password part, when the account has one. */\n passwordSet: string\n /** Opens the form that adds another passkey, once the account has one. */\n addAnotherPasskey: string\n passkeys: string\n managePasskeys: string\n passkeysHelp: string\n noPasskeys: string\n passkeyName: string\n /** @deprecated Unused since 0.19.0: the account screen offers `addPasskeyDevice` and `addSecurityKey`. */\n addPasskey: string\n addPasskeyDevice: string\n addSecurityKey: string\n passkeyKinds: Record<'security_key' | 'synced' | 'device', string>\n removePasskey: string\n passkeyAdded: string\n passkeyUnnamed: string\n sessions: string\n signOutEverywhere: string\n agents: string\n agentsHelp: string\n disconnect: string\n anAgent: string\n unknownDevice: string\n emailAddress: string\n newEmail: string\n changeEmail: string\n emailSent: string // after asking: \"{email}\" is replaced\n linkedAccounts: string\n noLinkedAccounts: string\n linkWith: string // + the provider's name\n unlink: string\n linked: string // after coming back linked\n ssoOnly: string // the address signs in through its company alone\n // <OrganizationMembers />: the people of the person's organization.\n members: string\n membersHidden: string\n organizationMissing: string\n memberYou: string\n memberInvited: string\n memberManager: string\n memberRole: string\n memberAdd: string\n memberAdded: string // \"{email}\" is replaced\n memberRemove: string\n memberRemoveConfirm: string // \"{who}\" is replaced\n memberLeave: string\n memberLeaveConfirm: string // \"{org}\" is replaced\n memberInviteAgain: string\n memberInvitationSent: string\n // The organization itself, for a member whose role may change it.\n organization: string\n organizationRename: string\n organizationRenamed: string // \"{name}\" is replaced\n organizationArchive: string\n organizationArchiveConfirm: string // \"{org}\" is replaced\n organizationArchived: string // \"{org}\" is replaced\n organizationDelete: string\n organizationDeleteConfirm: string // \"{org}\" is replaced\n organizationDeleted: string // \"{org}\" is replaced\n yes: string\n cancel: string\n // <PendingTerms />: documents a signed-in person still owes.\n termsChanged: string\n termsChangedHelp: string // followed by the documents, linked\n acceptTerms: string\n /** By error code; one missing shows what the server said. */\n errors: Record<string, string>\n}\n\nconst TEXTS: Record<'en' | 'es', AuthTexts> = {\n en: {\n email: 'Email', password: 'Password', name: 'Name', company: \"Your company's name\", code: 'Code', signIn: 'Sign in', signUp: 'Create account',\n continueWith: 'Continue with', orWithEmail: 'or with your email', keepSignedIn: 'Keep me signed in', forgotPassword: 'Forgot your password?',\n noAccount: 'No account yet?', createAccount: 'Create one', haveAccount: 'Already have an account?',\n iAccept: 'I have read and accept', and: 'and', termsOfService: 'the Terms of Service', privacyPolicy: 'the Privacy Policy',\n sendLink: 'Send the link', linkSent: 'If that address has an account, a link to choose a new password is on its way.',\n codeHelp: 'Enter the code from your authenticator app, or a recovery code.', verify: 'Verify',\n codeHelpPhone: 'We send a code to your phone. Ask for it, then type it here, or use a recovery code.',\n codeHelpEmail: 'We sent a code to {to}. Type it here.', sendEmailAgain: 'Send the code again',\n sendCodeSms: 'Send a code by SMS to {to}', sendCodeWhatsapp: 'Send a code by WhatsApp to {to}', codeSent: 'We sent a code to {to}. Type it here.',\n pushSend: 'Approve on my phone', pushPick: 'On your phone, pick {n}', pushWaiting: 'We sent a notification to your phone. Open it and pick this number.',\n phone: 'Phone, with its country code', phoneHelp: 'Get your codes by SMS or WhatsApp instead of an app.', phoneOn: 'Codes go to {to}.',\n phoneOff: 'No phone yet.', addPhone: 'Add phone', removePhone: 'Remove phone', bySms: 'SMS', byWhatsapp: 'WhatsApp', channel: 'Send codes by',\n checkEmail: 'Almost there: open the link we sent to confirm your address — it signs you in.', backToSignIn: 'Back to sign in',\n emailMeALink: 'Email me a sign-in link', linkHelp: 'We will email you a link that signs you in, no password needed.', sendMeTheLink: 'Send me the link', back: 'Back', usePasskey: 'Sign in with a passkey', codeFromMail: 'Reading it on another device? Enter the code from the email.', signInLinkSent: 'If that address has an account, a link to sign in is on its way.',\n newPassword: 'New password', savePassword: 'Save the password', passwordChanged: 'Your password was changed. You can sign in with it now.',\n confirming: 'Confirming your address…', emailConfirmed: 'Your address is confirmed. You can sign in now.',\n invitedTo: \"You've been invited to {workspace}\", invitedToOrganization: \"You've been invited to {organization} on {workspace}\",\n invitedAs: 'You will sign in as {email}.', choosePassword: 'Choose a password', acceptInvite: 'Accept and sign in',\n openingInvitation: 'Opening your invitation…', invitationInvalid: 'This invitation is not valid: it was already used, or it has expired. Ask whoever invited you to send it again.',\n profile: 'Profile', save: 'Save', saved: 'Saved.', currentPassword: 'Current password', changePassword: 'Change password',\n passwordChangedHere: 'Your password was changed. Every other session of your account was signed out.',\n secondStep: 'Second step', secondStepOn: 'On: signing in also asks for a code from your authenticator app.', secondStepOff: 'Off: signing in asks only for your password.',\n turnOn: 'Turn on', turnOff: 'Turn off', addToApp: 'Scan this code with your authenticator app, or add the key below by hand, then enter the code it shows.', openInApp: 'Open in an authenticator app', qrAlt: 'QR code to add this account to an authenticator app',\n recoveryCodes: 'Recovery codes', newRecoveryCodes: 'New recovery codes', keepCodes: 'Keep these codes somewhere safe. Each works once, and they are not shown again.',\n copyCodes: 'Copy all', downloadCodes: 'Download .txt', codesCopied: 'The codes were copied.', codesNotCopied: 'The codes could not be copied. Select them and copy them by hand.',\n change: 'Change', passwordSet: 'Your account has a password.', addAnotherPasskey: 'Add a passkey',\n passkeys: 'Passkeys', managePasskeys: 'Add or remove a passkey',\n passkeysHelp: 'Sign in with your fingerprint, your face or your device\\'s lock, without a password.', noPasskeys: 'No passkey yet.',\n passkeyName: 'A name for this device (optional)', addPasskey: 'Add a passkey on this device', removePasskey: 'Remove',\n addPasskeyDevice: 'Add this device (fingerprint or face)', addSecurityKey: 'Add a security key',\n passkeyKinds: { security_key: 'Security key', synced: 'Synced across your devices', device: 'On this device only' },\n passkeyAdded: 'The passkey was added. Next time, sign in with it.', passkeyUnnamed: 'Passkey', sessions: 'Where you are signed in', signOutEverywhere: 'Sign out everywhere',\n agents: 'AI agents', agentsHelp: 'Agents you allowed to act for you. Disconnect one and it loses its access within minutes.', disconnect: 'Disconnect', anAgent: 'An AI agent', unknownDevice: 'Unknown device',\n emailAddress: 'Email address', newEmail: 'New email address', changeEmail: 'Change email',\n emailSent: 'We sent a link to {email}. Your address changes once you open it.',\n linkedAccounts: 'Linked accounts', noLinkedAccounts: 'No account is linked.', linkWith: 'Link', unlink: 'Unlink', linked: 'The account was linked.',\n ssoOnly: 'Your company signs you in to this account.',\n members: 'Members', membersHidden: 'Your role here does not let you see the members.', organizationMissing: 'You do not belong to this organization.',\n memberYou: 'you', memberInvited: 'invited', memberManager: 'manages members', memberRole: 'Role', memberAdd: 'Add member',\n memberAdded: '{email} is a member now.', memberRemove: 'Remove', memberRemoveConfirm: 'Remove {who}?', memberLeave: 'Leave',\n memberLeaveConfirm: 'Leave {org}? You will need an invitation to come back.', memberInviteAgain: 'Send the invitation again',\n memberInvitationSent: 'The invitation is on its way.',\n organization: 'Organization', organizationRename: 'Rename', organizationRenamed: 'The organization is now called {name}.',\n organizationArchive: 'Archive', organizationArchiveConfirm: 'Archive {org}? Its members will no longer reach it, and only the workspace can restore it.',\n organizationArchived: '{org} was archived.', organizationDelete: 'Delete organization',\n organizationDeleteConfirm: 'Delete {org} for good? Its members lose it and this cannot be undone.', organizationDeleted: '{org} was deleted.',\n yes: 'Yes', cancel: 'Cancel',\n termsChanged: 'Our terms changed', termsChangedHelp: 'To go on, read and accept', acceptTerms: 'Accept',\n errors: {\n not_allowed: 'Your role in this organization does not allow that.', last_manager: 'Somebody else must manage the members first: give that role to another member.',\n last_owner: 'An organization keeps at least one owner: make another member owner first.', organization_not_found: 'That organization no longer exists.',\n member_exists: 'That person already belongs to the organization; their role was not changed. Change it in the list instead.',\n already_member: 'That person already belongs to the organization. Change their role instead.', unknown_role: 'Choose one of the roles offered.',\n user_not_active: 'That account is disabled.',\n required: 'This is required.', invalid_email: 'That does not look like an email address.', too_short: `Use at least ${MIN_PASSWORD} characters.`,\n invalid_credentials: 'The address or the password is not right.', unavailable: 'Sign-in is unavailable right now. Try again in a moment.',\n state_mismatch: 'That sign-in could not be completed. Try again.', cancelled: 'The sign-in was cancelled.',\n email_taken: 'That address already has an account.', email_unchanged: 'That is already your address.',\n last_sign_in_method: 'Add a password or link another account first: it is your only way to sign in.',\n identity_already_linked: 'That account is linked to someone else.', manual_linking_disabled: 'Linking accounts is turned off for this workspace.',\n invalid_token: 'This link is not valid, or it has expired. Ask for a new one.', invalid_code: 'That code is not right, or it has expired.', wrong_password: 'The current password is not right.', step_up_required: 'Enter your current password.', weak_password: 'Choose a stronger password.', unauthenticated: 'Sign in first.',\n phone_refused: 'The code could not be sent to that number.', too_many_codes: 'Enough codes were sent. Use the last one, or sign in again.', phone_unavailable: 'Codes cannot be sent that way here.', phone_already_set: 'Remove the phone you have first.', phone_codes_unavailable: 'Codes cannot be sent right now. Try again in a moment.',\n captcha_required: 'Complete the check that you are not a bot, then try again.', captcha_failed: 'The check that you are not a bot did not pass. Try it again.',\n passkey_failed: 'The passkey could not be used. Try again, or sign in another way.', passkey_exists: 'This device already has a passkey for your account.', passkey_unavailable: 'Passkeys cannot be used here.',\n sso_required: 'This address signs in through its company.', sso_not_found: 'No company sign-in answers for this address.',\n sso_failed: 'The sign-in with your company could not be completed. Try again.', sso_unavailable: 'Your company\\'s sign-in cannot be reached right now. Try again in a moment.',\n invalid_assertion: 'Your company\\'s answer could not be checked. Try again.', provisioning_disabled: 'Your company\\'s sign-in worked, but this workspace has no account for you. Ask its admin to add you.',\n connection_inactive: 'Your company\\'s sign-in is turned off for this workspace.', invalid_grant: 'That sign-in expired. Try again.',\n password_disabled: 'This workspace does not sign in with a password. Use one of the other ways.', passkeys_disabled: 'Passkeys are turned off for this workspace.',\n },\n },\n es: {\n email: 'Correo', password: 'Contraseña', name: 'Nombre', company: 'Nombre de tu empresa', code: 'Código', signIn: 'Entrar', signUp: 'Crear cuenta',\n continueWith: 'Continuar con', orWithEmail: 'o con tu correo', keepSignedIn: 'Mantener la sesión abierta', forgotPassword: '¿Olvidaste tu contraseña?',\n noAccount: '¿No tienes cuenta?', createAccount: 'Crear una', haveAccount: '¿Ya tienes cuenta?',\n iAccept: 'He leído y acepto', and: 'y', termsOfService: 'los Términos del servicio', privacyPolicy: 'la Política de privacidad',\n sendLink: 'Enviar el enlace', linkSent: 'Si ese correo tiene una cuenta, ya va en camino un enlace para elegir una contraseña nueva.',\n codeHelp: 'Escribe el código de tu aplicación de autenticación, o un código de recuperación.', verify: 'Verificar',\n codeHelpPhone: 'Te enviamos un código a tu teléfono. Pídelo y escríbelo aquí, o usa un código de recuperación.',\n codeHelpEmail: 'Te enviamos un código a {to}. Escríbelo aquí.', sendEmailAgain: 'Enviar el código de nuevo',\n sendCodeSms: 'Enviar un código por SMS a {to}', sendCodeWhatsapp: 'Enviar un código por WhatsApp a {to}', codeSent: 'Te enviamos un código a {to}. Escríbelo aquí.',\n pushSend: 'Aprobar en mi teléfono', pushPick: 'En tu teléfono, elige el {n}', pushWaiting: 'Enviamos una notificación a tu teléfono. Ábrela y elige este número.',\n phone: 'Teléfono, con su código de país', phoneHelp: 'Recibe tus códigos por SMS o WhatsApp en vez de una app.', phoneOn: 'Los códigos van a {to}.',\n phoneOff: 'Todavía no tienes un teléfono.', addPhone: 'Agregar teléfono', removePhone: 'Quitar teléfono', bySms: 'SMS', byWhatsapp: 'WhatsApp', channel: 'Enviar los códigos por',\n checkEmail: 'Casi listo: abre el enlace que te enviamos para confirmar tu correo; te deja adentro.', backToSignIn: 'Volver a entrar',\n emailMeALink: 'Envíame un enlace para entrar', linkHelp: 'Te enviamos un enlace al correo que te deja entrar, sin contraseña.', sendMeTheLink: 'Envíame el enlace', back: 'Volver', usePasskey: 'Entrar con una llave de acceso', codeFromMail: '¿Lo estás leyendo en otro dispositivo? Escribe el código que trae el correo.', signInLinkSent: 'Si ese correo tiene una cuenta, ya va en camino un enlace para entrar.',\n newPassword: 'Contraseña nueva', savePassword: 'Guardar la contraseña', passwordChanged: 'Tu contraseña se cambió. Ya puedes entrar con ella.',\n confirming: 'Confirmando tu correo…', emailConfirmed: 'Tu correo quedó confirmado. Ya puedes entrar.',\n invitedTo: 'Te invitaron a {workspace}', invitedToOrganization: 'Te invitaron a {organization} en {workspace}',\n invitedAs: 'Vas a entrar como {email}.', choosePassword: 'Elige una contraseña', acceptInvite: 'Aceptar y entrar',\n openingInvitation: 'Abriendo tu invitación…', invitationInvalid: 'Esta invitación no es válida: ya se usó o venció. Pídele a quien te invitó que te la envíe de nuevo.',\n profile: 'Perfil', save: 'Guardar', saved: 'Guardado.', currentPassword: 'Contraseña actual', changePassword: 'Cambiar contraseña',\n passwordChangedHere: 'Tu contraseña se cambió. Se cerraron todas las demás sesiones de tu cuenta.',\n secondStep: 'Segundo paso', secondStepOn: 'Activo: al entrar también se pide un código de tu aplicación de autenticación.', secondStepOff: 'Inactivo: al entrar solo se pide tu contraseña.',\n turnOn: 'Activar', turnOff: 'Desactivar', addToApp: 'Escanea este código con tu aplicación de autenticación, o agrega a mano la clave de abajo, y escribe el código que muestra.', openInApp: 'Abrir en una aplicación de autenticación', qrAlt: 'Código QR para agregar esta cuenta a una aplicación de autenticación',\n recoveryCodes: 'Códigos de recuperación', newRecoveryCodes: 'Nuevos códigos de recuperación', keepCodes: 'Guarda estos códigos en un lugar seguro. Cada uno sirve una vez y no se vuelven a mostrar.',\n copyCodes: 'Copiar todos', downloadCodes: 'Descargar .txt', codesCopied: 'Los códigos quedaron copiados.', codesNotCopied: 'No se pudieron copiar los códigos. Selecciónalos y cópialos a mano.',\n change: 'Cambiar', passwordSet: 'Tu cuenta tiene contraseña.', addAnotherPasskey: 'Agregar una llave de acceso',\n passkeys: 'Llaves de acceso', managePasskeys: 'Agregar o quitar una llave de acceso',\n passkeysHelp: 'Entra con tu huella, tu rostro o el bloqueo de tu dispositivo, sin contraseña.', noPasskeys: 'Todavía no tienes llaves de acceso.',\n passkeyName: 'Un nombre para este dispositivo (opcional)', addPasskey: 'Agregar una llave en este dispositivo', removePasskey: 'Quitar',\n addPasskeyDevice: 'Agregar este dispositivo (huella o rostro)', addSecurityKey: 'Agregar una llave física',\n passkeyKinds: { security_key: 'Llave física', synced: 'Sincronizada entre tus dispositivos', device: 'Solo en un dispositivo' },\n passkeyAdded: 'La llave de acceso quedó agregada. La próxima vez, entra con ella.', passkeyUnnamed: 'Llave de acceso', sessions: 'Dónde tienes la sesión abierta', signOutEverywhere: 'Cerrar sesión en todas partes',\n agents: 'Agentes de IA', agentsHelp: 'Los agentes a los que permitiste actuar por ti. Si desconectas uno, pierde el acceso en pocos minutos.', disconnect: 'Desconectar', anAgent: 'Un agente de IA', unknownDevice: 'Dispositivo desconocido',\n emailAddress: 'Correo', newEmail: 'Correo nuevo', changeEmail: 'Cambiar el correo',\n emailSent: 'Enviamos un enlace a {email}. Tu correo cambia cuando lo abras.',\n linkedAccounts: 'Cuentas vinculadas', noLinkedAccounts: 'No hay cuentas vinculadas.', linkWith: 'Vincular', unlink: 'Desvincular', linked: 'La cuenta quedó vinculada.',\n ssoOnly: 'A esta cuenta entras con el inicio de sesión de tu empresa.',\n members: 'Miembros', membersHidden: 'Tu rol aquí no te deja ver los miembros.', organizationMissing: 'No perteneces a esta organización.',\n memberYou: 'tú', memberInvited: 'invitado', memberManager: 'administra los miembros', memberRole: 'Rol', memberAdd: 'Agregar miembro',\n memberAdded: '{email} ya es miembro.', memberRemove: 'Quitar', memberRemoveConfirm: '¿Quitar a {who}?', memberLeave: 'Salir',\n memberLeaveConfirm: '¿Salir de {org}? Necesitarás una invitación para volver.', memberInviteAgain: 'Enviar la invitación de nuevo',\n memberInvitationSent: 'La invitación va en camino.',\n organization: 'Organización', organizationRename: 'Cambiar nombre', organizationRenamed: 'La organización ahora se llama {name}.',\n organizationArchive: 'Archivar', organizationArchiveConfirm: '¿Archivar {org}? Sus miembros ya no podrán entrar y solo el espacio de trabajo puede restaurarla.',\n organizationArchived: '{org} quedó archivada.', organizationDelete: 'Eliminar organización',\n organizationDeleteConfirm: '¿Eliminar {org} para siempre? Sus miembros la pierden y no se puede deshacer.', organizationDeleted: '{org} quedó eliminada.',\n yes: 'Sí', cancel: 'Cancelar',\n termsChanged: 'Nuestros términos cambiaron', termsChangedHelp: 'Para seguir, lee y acepta', acceptTerms: 'Aceptar',\n errors: {\n not_allowed: 'Tu rol en esta organización no permite eso.', last_manager: 'Primero alguien más debe administrar los miembros: dale ese rol a otro miembro.',\n last_owner: 'Una organización conserva al menos un propietario: primero haz propietario a otro miembro.', organization_not_found: 'Esa organización ya no existe.',\n member_exists: 'Esa persona ya pertenece a la organización; su rol no cambió. Cámbialo en la lista.',\n already_member: 'Esa persona ya pertenece a la organización. Cambia su rol.', unknown_role: 'Escoge uno de los roles ofrecidos.',\n user_not_active: 'Esa cuenta está desactivada.',\n required: 'Este dato es obligatorio.', invalid_email: 'Eso no parece un correo.', too_short: `Usa al menos ${MIN_PASSWORD} caracteres.`,\n invalid_credentials: 'El correo o la contraseña no son correctos.', unavailable: 'No se puede entrar en este momento. Intenta de nuevo en un momento.',\n state_mismatch: 'No se pudo completar el ingreso. Intenta de nuevo.', cancelled: 'El ingreso se canceló.',\n email_taken: 'Ese correo ya tiene una cuenta.', email_unchanged: 'Ese ya es tu correo.',\n last_sign_in_method: 'Primero agrega una contraseña o vincula otra cuenta: es tu única forma de entrar.',\n identity_already_linked: 'Esa cuenta está vinculada a otra persona.', manual_linking_disabled: 'Vincular cuentas está desactivado en este workspace.',\n invalid_token: 'Este enlace no es válido o ya venció. Pide uno nuevo.', invalid_code: 'Ese código no es correcto o ya venció.', wrong_password: 'La contraseña actual no es correcta.', step_up_required: 'Escribe tu contraseña actual.', weak_password: 'Elige una contraseña más fuerte.', unauthenticated: 'Inicia sesión primero.',\n phone_refused: 'No se pudo enviar el código a ese número.', too_many_codes: 'Ya se enviaron suficientes códigos. Usa el último o vuelve a entrar.', phone_unavailable: 'Aquí no se pueden enviar códigos de esa forma.', phone_already_set: 'Primero quita el teléfono que tienes.', phone_codes_unavailable: 'Ahora no se pueden enviar códigos. Inténtalo en un momento.',\n captcha_required: 'Completa la verificación de que no eres un robot y vuelve a intentarlo.', captcha_failed: 'La verificación de que no eres un robot no pasó. Inténtalo de nuevo.',\n passkey_failed: 'No se pudo usar la llave de acceso. Intenta de nuevo o entra de otra forma.', passkey_exists: 'Este dispositivo ya tiene una llave de acceso de tu cuenta.', passkey_unavailable: 'Aquí no se pueden usar llaves de acceso.',\n sso_required: 'Este correo entra con el inicio de sesión de su empresa.', sso_not_found: 'Ninguna empresa usa inicio de sesión propio con este correo.',\n sso_failed: 'No se pudo completar el ingreso con tu empresa. Intenta de nuevo.', sso_unavailable: 'Ahora no se puede llegar al inicio de sesión de tu empresa. Intenta en un momento.',\n invalid_assertion: 'No se pudo verificar la respuesta de tu empresa. Intenta de nuevo.', provisioning_disabled: 'El ingreso con tu empresa funcionó, pero este workspace no tiene una cuenta para ti. Pídele a su admin que te agregue.',\n connection_inactive: 'El inicio de sesión de tu empresa está apagado en este workspace.', invalid_grant: 'Ese ingreso venció. Intenta de nuevo.',\n password_disabled: 'En este workspace no se entra con contraseña. Usa una de las otras formas.', passkeys_disabled: 'Las llaves de acceso están desactivadas en este workspace.',\n },\n },\n}\n\ntype Slot = 'form' | 'field' | 'label' | 'input' | 'button' | 'providerButton' | 'providerIcon' | 'link' | 'error' | 'fieldError' | 'hint' | 'notice' | 'pending' | 'separator' | 'footer' | 'check' | 'account' | 'section' | 'heading' | 'secret' | 'qr' | 'codes' | 'sessions' | 'session'\n\nexport interface AuthFormProps {\n /** The language of the built-in sentences. Default: `en`. */\n locale?: 'en' | 'es'\n /** Sentences of the application's own, over the built-in ones. */\n texts?: Partial<Omit<AuthTexts, 'errors'>> & { errors?: Record<string, string> }\n /**\n * Called once the person is signed in, instead of going to `returnTo`. The\n * form stays busy (its button loading, every control disabled) until it\n * leaves the page. When the application keeps the form on screen while it\n * moves on (a router's navigation, loading the session), return a Promise:\n * the form waits for it, then is free again if it is still shown.\n */\n onSuccess?: () => void | Promise<unknown>\n /** Where to go after signing in, and where a provider returns to. Default: `/`. */\n returnTo?: string\n /**\n * `<SignIn />`: a sign-in link sent to an address with no account makes\n * one when it is used (if the workspace accepts new accounts), so this one\n * screen signs people in and up alike. Default: off.\n */\n createAccounts?: boolean\n /** Paths of the application's other screens, for the links between them. */\n links?: { signIn?: string; signUp?: string; forgotPassword?: string }\n /** A class for each part the form renders. A part given one is left to it by `styles.css`. */\n classNames?: Partial<Record<Slot, string>>\n /**\n * No look of Cauthy's at all: `styles.css` leaves the form alone and the\n * workspace's colours are not read. For a form drawn wholly with the\n * application's own `components` or `classNames`.\n */\n unstyled?: boolean\n /**\n * Take the colours, corners and typeface a person set for the workspace in\n * Cauthy's dashboard. Default: true. False keeps `styles.css`'s own, and\n * whatever `--cauthy-*` variables the application sets.\n */\n workspaceLook?: boolean\n /**\n * The application's own parts, to draw the form with: its form layout,\n * button, input, checkbox, select, field, text, badge, link, divider, alert\n * and confirmation. A part not given is drawn as before; with every part given\n * and `unstyled`, the form adds no element that carries a look of its own.\n */\n components?: AuthComponents\n}\n\n/**\n * What the application's button is given: what a `<button>` would be, and\n * what kind of button it is. `primary` sends the form; `secondary` is any\n * other action (a provider, a passkey, a sign-in link, cancel, send again);\n * `danger` removes, leaves, deletes, disconnects or turns something off.\n * `loading` is true on the one button whose action is under way; every\n * button is `disabled` meanwhile. Draw a spinner (or the like) on the button\n * while `loading` is true, and keep its label: after a sign-in it stays true\n * until the page is left, so the person sees the work go on.\n */\nexport interface AuthButtonProps {\n type: 'submit' | 'button'; disabled?: boolean; className?: string; onClick?: () => void; children: ReactNode\n variant?: 'primary' | 'secondary' | 'danger'\n loading?: boolean\n}\n\n/**\n * What the application's form layout is given: every element the forms put\n * around their parts — a whole form, each step of it, each part of the\n * account and members screens — so its own stack lays them out. `as` says\n * which element it stands for: a `form` sends with `onSubmit` (render a\n * `<form>` with it for Enter to submit), a `div` only groups.\n */\nexport interface AuthFormLayoutProps {\n as: 'form' | 'div'\n onSubmit?: (e: FormEvent) => void\n noValidate?: boolean\n 'aria-busy'?: boolean\n className?: string\n /**\n * Which part of `<Account />` or `<OrganizationMembers />` this is, for an\n * application that draws each as a card: an `AccountSection`\n * (`profile`, `passkeys`…), or `members`, `add-member`, `organization`\n * and `rename` (the form inside `organization`). Not set on a whole form.\n */\n section?: string\n children: ReactNode\n}\n\n/** What the application's input is given: what an `<input>` would be. */\nexport interface AuthInputProps {\n id: string; name: string; type: string; value: string; autoComplete?: string; required?: boolean; disabled?: boolean; className?: string\n 'aria-invalid'?: boolean; 'aria-describedby'?: string; onChange: (e: { target: { value: string } }) => void\n}\n\n/** A box to tick: the legal documents and each consent of a sign-up. `children` is its label. */\nexport interface AuthCheckboxProps {\n id: string; name: string; checked: boolean; required?: boolean; disabled?: boolean; className?: string\n onChange: (checked: boolean) => void; children: ReactNode\n}\n\n/** One choice of a few: a member's role, the channel of phone codes. Without a visible label it carries `aria-label`. */\nexport interface AuthSelectProps {\n id: string; name: string; value: string; options: { value: string; label: string }[]; disabled?: boolean; className?: string\n 'aria-label'?: string; onChange: (value: string) => void\n}\n\n/**\n * A label, its control (`children`) and what is said under it. The control's\n * `aria-describedby` names `${id}-hint` and `${id}-error`: give the help and\n * the error those ids for a screen reader to read them with it.\n */\nexport interface AuthFieldProps {\n id: string; label: ReactNode; children: ReactNode\n /** Beside the label: \"Forgot your password?\". */\n aside?: ReactNode\n /** What the field takes (a new password's rule). Not given while there is an error. */\n help?: ReactNode\n error?: ReactNode\n required?: boolean; className?: string\n}\n\n/** A sentence of the form: help, a state, the footer (`size: 'sm'`), a section's heading (`as: 'h2'`). */\nexport interface AuthTextProps { as?: 'p' | 'span' | 'h2'; tone?: 'muted' | 'danger' | 'success'; size?: 'sm' | 'md' | 'lg'; children: ReactNode }\n\n/** A short mark beside a name: \"you\", \"invited\", a role, a passkey's kind. */\nexport interface AuthBadgeProps { tone?: 'neutral' | 'success' | 'warning' | 'danger'; children: ReactNode }\n\n/** A link: to another screen, or a legal document (`newTab`). */\nexport interface AuthLinkProps { href?: string; onClick?: () => void; newTab?: boolean; children: ReactNode }\n\n/** The line between the providers and the address: \"or with your email\". */\nexport interface AuthDividerProps { label?: ReactNode }\n\n/**\n * What went wrong (`danger`), what was done (`success`) or what to know\n * (`info`). The built-in one is announced: `role=\"alert\"` for danger,\n * `role=\"status\"` otherwise; the application's should be too.\n */\nexport interface AuthAlertProps { tone: 'danger' | 'info' | 'success'; children: ReactNode }\n\n/** What a confirmation asks: removing a member, leaving, archiving or deleting the organization. */\nexport interface AuthConfirmOptions { title: string; body?: string; confirmLabel: string; cancelLabel: string; danger?: boolean }\n\n/** The parts a form may be drawn with. See `AuthFormProps.components`. */\nexport interface AuthComponents {\n /**\n * Every element around the form's parts: the form itself, each step, each\n * part of the account and members screens. Not given: the `form`, `div` or\n * `section` the forms have always drawn.\n */\n Form?: ComponentType<AuthFormLayoutProps>\n Button?: ComponentType<AuthButtonProps>\n Input?: ComponentType<AuthInputProps>\n Checkbox?: ComponentType<AuthCheckboxProps>\n Select?: ComponentType<AuthSelectProps>\n Field?: ComponentType<AuthFieldProps>\n Text?: ComponentType<AuthTextProps>\n Badge?: ComponentType<AuthBadgeProps>\n Link?: ComponentType<AuthLinkProps>\n Divider?: ComponentType<AuthDividerProps>\n Alert?: ComponentType<AuthAlertProps>\n /**\n * Asks before something that cannot be undone, and answers whether to go\n * on: the application's own dialog. Not given: the question shows inline,\n * with a yes and a cancel button. Never the browser's own dialog.\n */\n Confirm?: (options: AuthConfirmOptions) => Promise<boolean>\n}\n\n// Declared once: a component made anew on every render would be a different\n// input each time, and the one being typed in would lose its place.\n// The kind of a button is for the application's own button. The plain one\n// says it is under way with a spinner before its label, drawn by styles.css.\nconst PlainButton: ComponentType<AuthButtonProps> = ({ variant: _variant, loading, children, ...p }) => (\n <button {...p} aria-busy={loading || undefined}>{loading && <Spinner />}{children}</button>\n)\n// With `unstyled` no stylesheet draws a spinner: the icon draws and turns itself.\nconst UnstyledButton: ComponentType<AuthButtonProps> = ({ variant: _variant, loading, children, ...p }) => (\n <button {...p} aria-busy={loading || undefined}>{loading && <><Spinner plain />{' '}</>}{children}</button>\n)\n\n/**\n * Work under way, as an icon and never as words: the application may be in\n * any language. Styled, it is the ring styles.css draws (still under\n * `prefers-reduced-motion`). Unstyled, no stylesheet is there, so it is an SVG\n * that turns by itself (SMIL), and stands still when the person asked for less\n * motion. The button or form around it says `aria-busy`; the icon is hidden\n * from screen readers.\n */\nfunction Spinner({ plain }: { plain?: boolean }) {\n if (!plain) return <span className=\"cauthy-spinner\" aria-hidden=\"true\" />\n return <SpinnerIcon />\n}\n\nconst LESS_MOTION = '(prefers-reduced-motion: reduce)'\n\nfunction watchMotion(changed: () => void): () => void {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return () => {}\n const query = window.matchMedia(LESS_MOTION)\n query.addEventListener?.('change', changed)\n return () => query.removeEventListener?.('change', changed)\n}\n// A browser that cannot say has no preference to honour.\nconst stillHere = () => typeof window.matchMedia === 'function' && window.matchMedia(LESS_MOTION).matches\n// The server cannot know: its page draws the icon still, and the browser\n// sets it turning once it is there.\nconst stillOnServer = () => true\n\nfunction SpinnerIcon() {\n const still = useSyncExternalStore(watchMotion, stillHere, stillOnServer)\n return (\n <svg className=\"cauthy-spinner-icon\" width=\"1em\" height=\"1em\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"2\" />\n <path d=\"M14.5 8A6.5 6.5 0 0 0 8 1.5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n {!still && <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 8 8\" to=\"360 8 8\" dur=\"0.7s\" repeatCount=\"indefinite\" />}\n </path>\n </svg>\n )\n}\nconst PlainInput: ComponentType<AuthInputProps> = (p) => <input {...p} />\n\n// The workspace's look, read once per page and per mount point of the routes.\nconst looks = new Map<string, Promise<CauthyTheme | null>>()\n\n// A typeface is loaded from where the workspace's look says, once per page.\nconst loaded = new Set<string>()\nfunction loadFonts(fonts: ThemeFont[] | undefined) {\n if (typeof document === 'undefined' || typeof FontFace === 'undefined') return\n for (const f of fonts ?? []) {\n const key = `${f.family}|${f.url}|${f.weight ?? ''}|${f.style ?? ''}`\n // The same checks Cauthy's pages make: a plain family name, an https .woff2.\n if (loaded.has(key) || !/^[A-Za-z0-9][A-Za-z0-9 _-]*$/.test(f.family) || !/^https:\\/\\/[^\\s\"'()]+\\.woff2$/i.test(f.url)) continue\n loaded.add(key)\n const face = new FontFace(f.family, `url(\"${f.url}\") format(\"woff2\")`, { weight: String(f.weight ?? '400'), style: f.style === 'italic' ? 'italic' : 'normal', display: 'swap' })\n void face.load().then((ready) => document.fonts.add(ready), () => loaded.delete(key))\n }\n}\n\n/**\n * What the outermost element of a form carries: the mark `styles.css` styles\n * (`data-cauthy`) and the look as its variables: the workspace's from Cauthy's\n * dashboard, with the application's own (<CauthyProvider theme>) laid over it.\n */\nfunction useRoot(props: { unstyled?: boolean; workspaceLook?: boolean }): { 'data-cauthy'?: ''; style?: CSSProperties } {\n const { basePath } = useSession()\n // The provider's own client: its fetch and its protocol check apply to the look too.\n const store = useSessionStore()\n // The application's own look, given to <CauthyProvider theme>: what it sets wins, the rest is the workspace's.\n const given = useProviderTheme()\n const [workspace, setWorkspace] = useState<CauthyTheme | null>(null)\n const wanted = !props.unstyled && props.workspaceLook !== false\n useEffect(() => {\n if (!props.unstyled && given) loadFonts(given.fonts)\n }, [given, props.unstyled])\n useEffect(() => {\n if (!wanted) return\n let live = true\n let look = looks.get(basePath)\n if (!look) {\n look = store.auth.look()\n looks.set(basePath, look)\n }\n void look.then((theme) => {\n if (!live || !theme) return\n setWorkspace(theme)\n loadFonts(theme.fonts)\n })\n return () => { live = false }\n }, [basePath, store, wanted])\n if (props.unstyled) return {}\n const shown = wanted ? workspace : null\n return { 'data-cauthy': '', style: themeVariables({ ...shown, ...given }) as CSSProperties }\n}\n\n/** Cloudflare Turnstile, as much of it as the forms use. */\ninterface TurnstileApi {\n render(el: HTMLElement, options: Record<string, unknown>): string\n reset(id: string): void\n remove(id: string): void\n}\n\nlet turnstileScript: Promise<TurnstileApi> | null = null\n\nfunction loadTurnstile(): Promise<TurnstileApi> {\n const ready = () => (window as unknown as { turnstile?: TurnstileApi }).turnstile\n if (ready()) return Promise.resolve(ready()!)\n turnstileScript ??= new Promise<TurnstileApi>((resolve, reject) => {\n const script = document.createElement('script')\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit'\n script.async = true\n script.onload = () => (ready() ? resolve(ready()!) : reject(new Error('turnstile did not load')))\n script.onerror = () => {\n turnstileScript = null\n reject(new Error('turnstile did not load'))\n }\n document.head.appendChild(script)\n })\n return turnstileScript\n}\n\n/**\n * The workspace's Turnstile challenge, when it asks for one: the widget to put\n * in the form, the answer to send with it, and `renew` for after a submit\n * (an answer is good once). Without a site key it draws nothing.\n */\nfunction useChallenge(siteKey: string | undefined, locale: string | undefined) {\n const box = useRef<HTMLDivElement | null>(null)\n const widget = useRef<{ api: TurnstileApi; id: string } | null>(null)\n const [token, setToken] = useState('')\n useEffect(() => {\n if (!siteKey || !box.current) return\n let gone = false\n void loadTurnstile().then((api) => {\n if (gone || !box.current) return\n const id = api.render(box.current, {\n sitekey: siteKey, language: locale ?? 'auto', size: 'flexible',\n callback: (t: string) => setToken(t), 'expired-callback': () => setToken(''), 'error-callback': () => setToken(''),\n })\n widget.current = { api, id }\n }).catch(() => {})\n return () => {\n gone = true\n if (widget.current) widget.current.api.remove(widget.current.id)\n widget.current = null\n }\n }, [siteKey, locale])\n const renew = () => {\n setToken('')\n if (widget.current) widget.current.api.reset(widget.current.id)\n }\n const node = siteKey ? <div ref={box} className=\"cauthy-challenge\" /> : null\n return { node, token: token || undefined, renew }\n}\n\n/** What the workspace offers, for a form that does not read it otherwise. */\nfunction useMethods(auth: ReturnType<typeof useAuth>) {\n const [methods, setMethods] = useState<AuthMethods | null>(null)\n useEffect(() => {\n void auth.methods().then(setMethods)\n // Once: what the workspace offers does not change while the form is open.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n return methods\n}\n\n/** A path of this site, or nothing: never sends the browser elsewhere. */\nfunction sitePath(to: string | null | undefined): string | undefined {\n return to && to.startsWith('/') && !to.startsWith('//') && !to.includes('\\\\') ? to : undefined\n}\n\n/**\n * Where to go once signed in: a path of this site, or an address on this\n * site's own origin. `returnTo` is the application's, but a page may fill it\n * from its query string, so another origin is never followed.\n */\nfunction sameOrigin(to: string | null | undefined): string | undefined {\n const path = sitePath(to)\n if (path || !to) return path\n try {\n const url = new URL(to)\n return url.origin === window.location.origin ? url.pathname + url.search + url.hash : undefined\n } catch {\n return undefined\n }\n}\n\n/** Whether what a callback answered is a Promise to wait for. */\nfunction isPending(v: unknown): v is PromiseLike<unknown> {\n return typeof (v as PromiseLike<unknown> | null)?.then === 'function'\n}\n\n/**\n * Exported for the tests: the package does not export it. `waiting`: the\n * form is not ready yet (what the workspace offers is on its way), so every\n * control waits. `part`: a part of a screen whose look is the screen's.\n */\nexport function useForm(props: AuthFormProps, opts: { waiting?: boolean; part?: boolean } = {}) {\n const t: AuthTexts = { ...TEXTS[props.locale ?? 'en'], ...props.texts, errors: { ...TEXTS[props.locale ?? 'en'].errors, ...props.texts?.errors } }\n const cx = (slot: Slot) => props.classNames?.[slot] ?? `cauthy-${slot}`\n // The class the application gave a part, alone: an application's own part\n // is not handed Cauthy's class names.\n const own = (slot: Slot) => props.classNames?.[slot]\n const C: AuthComponents = props.components ?? {}\n const Button = C.Button ?? (props.unstyled ? UnstyledButton : PlainButton)\n const Input = C.Input ?? PlainInput\n const [error, setOnlyError] = useState<AuthError | null>(null)\n // Every field the form found wrong before sending, in the order they are\n // drawn; `round` moves the focus to the first one again on each try.\n const [problems, setProblems] = useState<{ list: AuthError[]; round: number }>({ list: [], round: 0 })\n // What the server said replaces what the form found.\n const setError = useCallback((e: AuthError | null) => {\n setOnlyError(e)\n setProblems((p) => (p.list.length === 0 ? p : { list: [], round: p.round }))\n }, [])\n /**\n * Checks every field at once, in the order they are drawn: each one wrong\n * shows its error, and the first is focused. True when all can be sent.\n */\n const check = (...found: (AuthError | null | undefined | false)[]): boolean => {\n const list = found.filter((e): e is AuthError => Boolean(e))\n setOnlyError(null)\n setProblems((p) => ({ list, round: list.length > 0 ? p.round + 1 : p.round }))\n return list.length === 0\n }\n /** The error of one field: what the form found, or what the server said. */\n const fieldError = (name: string): AuthError | null => problems.list.find((e) => e.field === name) ?? (error?.field === name ? error : null)\n /** Whether this field is the one to focus after a try, and the try's number. */\n const firstWrong = (name: string): number => (problems.list[0]?.field === name ? problems.round : 0)\n // The action under way, by the key of its button: `true` is the form's own\n // submit. Every button waits while one runs; only its own says it loads.\n const [acting, setActing] = useState<string | null>(null)\n const busy = acting !== null || opts.waiting === true\n const setBusy = useCallback((on: boolean | string) => setActing(on === false ? null : on === true ? SUBMIT : on), [])\n const loading = (key: string = SUBMIT) => acting === key\n // Whether the form is still shown: a wait that ends after it left has nothing to free.\n const shown = useRef(true)\n useEffect(() => {\n shown.current = true\n // Back to a page the browser kept (back-forward cache): the form it left\n // waiting is free again.\n const back = (e: PageTransitionEvent) => { if (e.persisted) setActing(null) }\n window.addEventListener('pageshow', back)\n return () => {\n shown.current = false\n window.removeEventListener('pageshow', back)\n }\n }, [])\n /**\n * After an action that leaves the form: it stays busy until the page is\n * left. When `after` is a Promise (the application's own way on), until it\n * settles, and then it is free again if it is still shown.\n */\n const hold = (after: unknown) => {\n if (!isPending(after)) return\n const free = () => { if (shown.current) setActing(null) }\n after.then(free, free)\n }\n /** What went wrong: the form is free again, and says it. */\n const fail = (e: AuthError) => {\n setActing(null)\n setError(e)\n }\n // The workspace's password rule, once methods() said it: what a refused\n // new password is told, rule by rule.\n const [policy, setPolicy] = useState<PasswordPolicy | undefined>(undefined)\n const locale = props.locale ?? 'en'\n const say = (e: AuthError) => {\n if (props.texts?.errors?.[e.code] === undefined && isPasswordRule(e)) return explainPasswordProblems(e.reasons ?? [e.code], policy, locale)\n return t.errors[e.code] ?? e.message\n }\n /** What a new password must be, for under its field. */\n const passwordRule = describePasswordPolicy(policy, locale)\n // `to`: where a sign-in link or code says to go, over `returnTo`. Signed\n // in: the form stays busy, its pressed button loading (the submit when none\n // was, as after a passkey from the autofill), until the page is left or the\n // application's `onSuccess` settles.\n const done = (to?: string) => {\n setActing((a) => a ?? SUBMIT)\n if (props.onSuccess) hold(props.onSuccess())\n else window.location.assign(sitePath(to) ?? sameOrigin(props.returnTo) ?? '/')\n }\n const root = useRoot(opts.part ? { ...props, unstyled: true } : props)\n const plain = props.unstyled === true\n return { t, cx, own, C, Button, Input, error, setError, fail, check, fieldError, firstWrong, busy, setBusy, loading, hold, say, done, root, plain, policy, setPolicy, passwordRule }\n}\n\n/** The key of the form's own submit, for `setBusy` and `loading`. */\nconst SUBMIT = 'submit'\n\ntype Form = ReturnType<typeof useForm>\n\n/**\n * An element around the form's parts: the application's `Form` when it gave\n * one, otherwise the very element the forms have always drawn. `root` is the\n * outermost one's mark and look; with the application's own `Form` and a\n * look to wear, they go on a plain `div` around it, for `styles.css` to find.\n */\nfunction Wrap(p: {\n f: Form; as: 'form' | 'div' | 'section'; slot?: Slot; root?: ReturnType<typeof useRoot>; section?: string\n onSubmit?: (e: FormEvent) => void; noValidate?: boolean; busy?: boolean; children?: ReactNode\n}) {\n const { Form: OwnForm } = p.f.C\n // Busy while an action runs, or as the caller says (a step still opening).\n const busy = p.busy ?? (p.f.busy || undefined)\n if (OwnForm) {\n const own = (\n <OwnForm as={p.as === 'form' ? 'form' : 'div'} onSubmit={p.onSubmit} noValidate={p.noValidate} aria-busy={busy}\n className={p.slot ? p.f.own(p.slot) : undefined} section={p.section}>{p.children}</OwnForm>\n )\n return p.root?.['data-cauthy'] !== undefined ? <div {...p.root}>{own}</div> : own\n }\n const Tag = p.as\n // A form still opening, with nothing to show yet, says it is on its way.\n const children = p.busy && p.children === undefined ? <Pending f={p.f} /> : p.children\n return <Tag className={p.slot ? p.f.cx(p.slot) : undefined} {...p.root} onSubmit={p.onSubmit} noValidate={p.noValidate} aria-busy={busy}>{children}</Tag>\n}\n\n/**\n * Where a form waits before it can show anything: the spinner alone, no words,\n * centred by styles.css. The form around it says `aria-busy`. The\n * application's own `Form` is told `aria-busy` and draws its own.\n */\nfunction Pending({ f }: { f: Form }) {\n return <div className={f.cx('pending')}><Spinner plain={f.plain} /></div>\n}\n\n// The parts every form draws with: the application's own when it gave one,\n// otherwise the element the forms have always drawn, so nothing changes for\n// an application that gives none.\n\n/** A sentence the form says: help, a state. */\nfunction Note({ f, children, footer }: { f: Form; children: ReactNode; footer?: boolean }) {\n const { Text } = f.C\n if (Text) return <Text as=\"p\" tone=\"muted\" size={footer ? 'sm' : 'md'}>{children}</Text>\n return <p className={f.cx(footer ? 'footer' : 'notice')}>{children}</p>\n}\n\n/** A part's heading. */\nfunction Heading({ f, children }: { f: Form; children: ReactNode }) {\n const { Text } = f.C\n if (Text) return <Text as=\"h2\" size=\"lg\">{children}</Text>\n return <h2 className={f.cx('heading')}>{children}</h2>\n}\n\n/** What went wrong, or what was done: announced. */\nfunction Say({ f, tone, children }: { f: Form; tone: AuthAlertProps['tone']; children: ReactNode }) {\n const { Alert } = f.C\n if (Alert) return <Alert tone={tone}>{children}</Alert>\n // Announced as they appear: assertive for what went wrong, polite for the rest.\n if (tone === 'danger') return <p role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\" className={f.cx('error')}>{children}</p>\n return <p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" className={f.cx('notice')}>{children}</p>\n}\n\n/** \"or with your email\", between the providers and the address. */\nfunction Or({ f, children }: { f: Form; children: ReactNode }) {\n const { Divider } = f.C\n if (Divider) return <Divider label={children} />\n return <p className={f.cx('separator')}>{children}</p>\n}\n\nfunction A({ f, href, newTab, children }: { f: Form; href?: string; newTab?: boolean; children: ReactNode }) {\n const { Link } = f.C\n if (Link) return <Link href={href} newTab={newTab}>{children}</Link>\n return <a className={f.cx('link')} href={href} target={newTab ? '_blank' : undefined} rel={newTab ? 'noopener' : undefined}>{children}</a>\n}\n\n/** A mark beside a name; without the application's badge, the words as they always read. */\nfunction Tag({ f, tone, children, plain }: { f: Form; tone?: AuthBadgeProps['tone']; children: ReactNode; plain: ReactNode }) {\n const { Badge } = f.C\n if (Badge) return <>{' '}<Badge tone={tone}>{children}</Badge></>\n return <>{plain}</>\n}\n\nfunction Check(p: { f: Form; name: string; checked: boolean; required?: boolean; onChange: (checked: boolean) => void; children: ReactNode }) {\n const id = useId()\n const { f } = p\n const { Checkbox } = f.C\n if (Checkbox) {\n return <Checkbox id={id} name={p.name} checked={p.checked} required={p.required} disabled={f.busy} className={f.own('check')} onChange={p.onChange}>{p.children}</Checkbox>\n }\n return (\n <label className={f.cx('check')}>\n <input type=\"checkbox\" name={p.name} checked={p.checked} required={p.required} disabled={f.busy} onChange={(e) => p.onChange(e.target.checked)} />\n <span>{p.children}</span>\n </label>\n )\n}\n\nfunction Pick(p: { f: Form; id?: string; name: string; value: string; options: { value: string; label: string }[]; disabled?: boolean; label?: string; onChange: (value: string) => void }) {\n const made = useId()\n const id = p.id ?? made\n const { f } = p\n const { Select } = f.C\n // Every control waits while an action runs.\n const disabled = p.disabled || f.busy\n if (Select) {\n return <Select id={id} name={p.name} value={p.value} options={p.options} disabled={disabled} aria-label={p.label} className={f.own('input')} onChange={p.onChange} />\n }\n return (\n <select id={id} name={p.name} aria-label={p.label} className={f.cx('input')} value={p.value} disabled={disabled} onChange={(e) => p.onChange(e.target.value)}>\n {p.options.map((o) => <option key={o.value} value={o.value}>{o.label}</option>)}\n </select>\n )\n}\n\n/** A label around a control that is not a text input: a role to give. */\nfunction Labelled({ f, id, label, children }: { f: Form; id: string; label: string; children: ReactNode }) {\n const { Field: OwnField } = f.C\n if (OwnField) return <OwnField id={id} label={label} className={f.own('field')}>{children}</OwnField>\n return (\n <label className={f.cx('field')}>\n <span className={f.cx('label')}>{label}</span>\n {children}\n </label>\n )\n}\n\n/** \"the Terms of Service and the Privacy Policy\", each linked, opening apart. */\nfunction Documents({ f, documents }: { f: Form; documents: { kind: string; url: string }[] }) {\n return (\n <>\n {documents.map((d, i) => (\n <span key={d.kind}>\n {i > 0 && <>{f.t.and} </>}\n <A f={f} href={d.url} newTab>{d.kind === 'terms' ? f.t.termsOfService : f.t.privacyPolicy}</A>{' '}\n </span>\n ))}\n </>\n )\n}\n\nconst PASSWORD_RULES = ['needs_lowercase', 'needs_uppercase', 'needs_digit', 'needs_symbol', 'needs_classes', 'breached']\n\n/** A new password refused by a rule of the workspace's policy, here or by Cauthy. */\nfunction isPasswordRule(e: AuthError): boolean {\n if (e.code === 'weak_password' || PASSWORD_RULES.includes(e.code)) return true\n return (e.code === 'too_short' || e.code === 'too_long') && (e.field === 'password' || e.field === 'newPassword')\n}\n\n/**\n * A new password the workspace's rule refuses, as the form says it: every\n * rule it fails, under the field it was typed in.\n */\nfunction newPasswordProblem(value: string, policy: PasswordPolicy | undefined, field: 'password' | 'newPassword' = 'password'): AuthError | null {\n const bad = checkNewPassword(value, policy)\n if (!bad) return null\n return { code: bad.code, message: bad.message, field, ...(bad.code === 'required' ? {} : { reasons: passwordProblems(value, policy) }) }\n}\n\n/** The workspace's password rule, into a form, once methods() has said it. */\nfunction usePasswordPolicy(f: ReturnType<typeof useForm>, methods: AuthMethods | null) {\n const { setPolicy } = f\n useEffect(() => {\n if (methods?.password) setPolicy(methods.password)\n }, [methods, setPolicy])\n}\n\nfunction Field(p: {\n f: ReturnType<typeof useForm>; name: 'email' | 'password' | 'newPassword' | 'name' | 'code' | 'phone' | 'organization'; type: string; label: string; value: string\n autoComplete: string; required?: boolean; onChange: (v: string) => void; aside?: ReactNode\n /** A line under the field saying what it takes (a new password's rule). */\n hint?: string\n}) {\n const id = useId()\n const { f } = p\n const bad = f.fieldError(p.name)\n // The first field found wrong takes the focus, on every try.\n const focus = f.firstWrong(p.name)\n useEffect(() => {\n if (focus > 0 && typeof document !== 'undefined') document.getElementById(id)?.focus()\n }, [focus, id])\n const described = [bad ? `${id}-error` : '', p.hint ? `${id}-hint` : ''].filter(Boolean).join(' ')\n const input = (\n <f.Input id={id} name={p.name} type={p.type} value={p.value} autoComplete={p.autoComplete} required={p.required} disabled={f.busy} className={f.cx('input')}\n aria-invalid={bad ? true : undefined} aria-describedby={described || undefined} onChange={(e) => p.onChange(e.target.value)} />\n )\n const { Field: OwnField } = f.C\n if (OwnField) {\n return (\n <OwnField id={id} label={p.label} aside={p.aside} help={p.hint && !bad ? p.hint : undefined} error={bad ? f.say(bad) : undefined}\n required={p.required} className={f.own('field')}>{input}</OwnField>\n )\n }\n return (\n <div className={f.cx('field')}>\n <label className={f.cx('label')} htmlFor={id}>{p.label}{p.aside}</label>\n {input}\n {p.hint && !bad && <span id={`${id}-hint`} className={f.cx('hint')}>{p.hint}</span>}\n {/* Read with the field (aria-describedby) when the focus lands on the first wrong one; the form's own alert is the live region. */}\n {bad && <span id={`${id}-error`} className={f.cx('fieldError')}>{f.say(bad)}</span>}\n </div>\n )\n}\n\n/** The error a provider's trip came back with, read once from the address. */\nfunction returnedError(): AuthError | null {\n if (typeof window === 'undefined') return null\n const code = new URLSearchParams(window.location.search).get('auth_error')\n return code ? { code, message: 'That sign-in could not be completed. Try again.' } : null\n}\n\n/**\n * The token a mailed link opened this page with, taken out of the address so\n * it is not left in the history or sent on as a referrer.\n */\nfunction takeToken(name: string): string | null {\n if (typeof window === 'undefined') return null\n const url = new URL(window.location.href)\n const token = url.searchParams.get(name)\n if (token === null) return null\n url.searchParams.delete(name)\n window.history.replaceState(window.history.state, '', url.pathname + url.search + url.hash)\n return token\n}\n\n/**\n * Runs `open` once with the token this page was opened with, or with null.\n * Once per page, even where React runs an effect twice while developing: the\n * token is taken out of the address the first time and a link works once.\n */\nfunction useMailedToken(name: string, open: (token: string | null) => void): void {\n const opened = useRef(false)\n useEffect(() => {\n if (opened.current) return\n opened.current = true\n open(takeToken(name))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n}\n\n/**\n * The second step of a sign-in, once Cauthy asked for it: the code of the\n * authenticator app, a code sent to the phone or the email, or a push\n * approved on the phone. `<SignIn />` and `<AcceptInvite />` both end here.\n */\nfunction SecondStepForm(p: { f: ReturnType<typeof useForm>; auth: ReturnType<typeof useAuth> }) {\n const { f, auth } = p\n const [code, setCode] = useState('')\n // The ways the account takes the step, and where a code went.\n const [phoneWay, setPhoneWay] = useState<{ totp: boolean; phone: { number: string; channel: string } | null; push: { devices: number } | null; email: { to: string } | null } | null>(null)\n const [phoneSent, setPhoneSent] = useState('')\n useEffect(() => {\n void auth.signIn.mfaMethods().then((r) => { if (r.ok) setPhoneWay({ totp: r.totp, phone: r.phone, push: r.push, email: r.email }) })\n // Once: asked when the step opens.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n // The second step by email: the code went with the first step; another can be asked for.\n const sendEmail = async () => {\n f.setBusy('email')\n f.setError(null)\n const r = await auth.signIn.mfaSendEmail()\n f.setBusy(false)\n if (!r.ok) return f.setError(r.error)\n setPhoneSent(r.sentTo)\n }\n // The second step approved on the phone: the number to pick, while the page listens.\n const [pushNumber, setPushNumber] = useState(0)\n const pushWait = useRef<AbortController | null>(null)\n useEffect(() => () => pushWait.current?.abort(), [])\n const sendPush = async () => {\n f.setBusy('push')\n f.setError(null)\n const r = await auth.signIn.mfaPush()\n f.setBusy(false)\n if (!r.ok) return f.setError(r.error)\n setPushNumber(r.number)\n pushWait.current?.abort()\n const ctl = new AbortController()\n pushWait.current = ctl\n const done = await auth.signIn.mfaPushWait({ signal: ctl.signal })\n if (ctl.signal.aborted) return\n setPushNumber(0)\n if (!done.ok) return f.setError(done.error)\n // Approved: its button says the sign-in goes on, until the page is left.\n f.setBusy('push')\n f.done()\n }\n const sendCode = async () => {\n f.setBusy('phone')\n f.setError(null)\n const r = await auth.signIn.mfaSendCode()\n f.setBusy(false)\n if (!r.ok) return f.setError(r.error)\n setPhoneSent(r.sentTo)\n }\n const submit = async (e: FormEvent) => {\n e.preventDefault()\n f.setBusy(true)\n f.setError(null)\n const r = await auth.signIn.mfa({ code })\n // Signed in: the form stays busy until it leaves (see `done`).\n if (!r.ok) return f.fail(r.error)\n f.done()\n }\n const general = f.error && !f.error.field ? f.error : null\n const to = phoneWay?.phone?.number ?? ''\n return (\n <Wrap f={f} as=\"form\" slot=\"form\" root={f.root} onSubmit={submit} noValidate>\n <Note f={f}>{phoneSent ? f.t.codeSent.replace('{to}', phoneSent) : phoneWay?.email ? f.t.codeHelpEmail.replace('{to}', phoneWay.email.to) : phoneWay?.phone && !phoneWay.totp ? f.t.codeHelpPhone : f.t.codeHelp}</Note>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n {phoneWay?.email && (\n <f.Button type=\"button\" variant=\"secondary\" loading={f.loading('email')} disabled={f.busy} className={f.cx('providerButton')} onClick={() => void sendEmail()}>{f.t.sendEmailAgain}</f.Button>\n )}\n {pushNumber > 0 ? (f.C.Text ? (\n // The application's text: the number to pick drawn large, by its own rules.\n <div role=\"status\" aria-live=\"polite\">\n <f.C.Text as=\"p\">{f.t.pushPick.replace('{n}', String(pushNumber))}</f.C.Text>\n <f.C.Text as=\"p\" size=\"lg\">{pushNumber}</f.C.Text>\n <f.C.Text as=\"p\" tone=\"muted\">{f.t.pushWaiting}</f.C.Text>\n </div>\n ) : (\n <div className={f.cx('notice')} role=\"status\" aria-live=\"polite\">\n <p>{f.t.pushPick.replace('{n}', String(pushNumber))}</p>\n <p style={{ fontSize: 48, fontWeight: 700, margin: '4px 0', textAlign: 'center' }}>{pushNumber}</p>\n <p>{f.t.pushWaiting}</p>\n </div>\n )) : phoneWay?.push && (\n <f.Button type=\"button\" variant=\"secondary\" loading={f.loading('push')} disabled={f.busy} className={f.cx('button')} onClick={() => void sendPush()}>{f.t.pushSend}</f.Button>\n )}\n {phoneWay?.phone && (\n <f.Button type=\"button\" variant=\"secondary\" loading={f.loading('phone')} disabled={f.busy} className={f.cx('providerButton')} onClick={() => void sendCode()}>\n {(phoneWay.phone.channel === 'whatsapp' ? f.t.sendCodeWhatsapp : f.t.sendCodeSms).replace('{to}', to)}\n </f.Button>\n )}\n <Field f={f} name=\"code\" type=\"text\" label={f.t.code} value={code} autoComplete=\"one-time-code\" required onChange={setCode} />\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.verify}</f.Button>\n </Wrap>\n )\n}\n\n/**\n * \"Continue with …\", one button per provider the workspace turned on, each\n * with the provider's logo when Cauthy serves one. The logo says nothing a\n * screen reader needs: the button's words name the provider.\n */\nexport function ProviderButtons(p: { f: ReturnType<typeof useForm>; providers: AuthMethods['providers']; onPick: (id: string) => void }) {\n const { f } = p\n // On the way to the provider: the button pressed loads, and the form waits\n // until the page is left.\n const pick = (id: string) => {\n f.setBusy(`provider:${id}`)\n p.onPick(id)\n }\n return (\n <>\n {p.providers.map((provider) => (\n <f.Button key={provider.id} type=\"button\" variant=\"secondary\" loading={f.loading(`provider:${provider.id}`)} disabled={f.busy} className={f.cx('providerButton')} onClick={() => pick(provider.id)}>\n {provider.iconUrl && <img src={provider.iconUrl} alt=\"\" width={18} height={18} className={f.cx('providerIcon')} />}\n {f.t.continueWith} {provider.name}\n </f.Button>\n ))}\n </>\n )\n}\n\n/**\n * What `<SignIn />` offers, from what the workspace turned on: the password\n * (and with it \"forgot your password\"), the address (asked for the password,\n * a sign-in link, or finding the person's company) and the passkey button.\n * Until `methods()` answers, the usual form: a password and an address.\n */\nexport function signInOffers(methods: AuthMethods | null): { password: boolean; email: boolean; passkey: boolean } {\n const password = methods?.passwordSignIn !== false\n return { password, email: password || methods?.magicLink === true || methods?.sso === true, passkey: methods?.passkey === true }\n}\n\nexport function SignIn(props: AuthFormProps) {\n const auth = useAuth()\n const [methods, setMethods] = useState<AuthMethods | null>(null)\n // Until the workspace says what it offers, the form shows but waits: nothing\n // to press or type that the answer could still change.\n const f = useForm(props, { waiting: methods === null })\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [code, setCode] = useState('')\n // \"Keep me signed in\": offered when the client allows it; the ref is for the autofill, which starts before it is ticked.\n const [remember, setRemember] = useState(false)\n const rememberNow = useRef(false)\n rememberNow.current = remember && methods?.persistentSessions === true\n // 'link': the sign-in link's own step, opened from the quick ways in.\n const [step, setStep] = useState<'password' | 'link' | 'code' | 'opening' | 'sent'>('password')\n const challenge = useChallenge(methods?.captchaSiteKey, props.locale)\n const offers = signInOffers(methods)\n // A workspace that turned the password off: no password field, no \"forgot\n // your password\". Until methods() answers, the form is the usual one.\n const passwordOn = offers.password\n // The passkeys offered in the email field's autofill, while the form waits.\n const autofill = useRef<AbortController | null>(null)\n const [offer, setOffer] = useState(0)\n // The person's company, when the address typed is one of its domains.\n const [company, setCompany] = useState<SSOConnection | null>(null)\n useEffect(() => {\n if (!methods?.sso || checkEmail(email) !== null) return setCompany(null)\n let current = true\n const t = setTimeout(() => {\n void auth.signIn.ssoDiscover({ email }).then((r) => { if (current) setCompany(r.ok && r.status === 'found' ? r.connection : null) })\n }, 350)\n return () => { current = false; clearTimeout(t) }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [email, methods])\n const toCompany = () => {\n autofill.current?.abort()\n f.setBusy('sso')\n auth.signIn.sso({ email }, { returnTo: props.returnTo, remember: rememberNow.current })\n }\n\n useEffect(() => {\n void auth.methods().then(setMethods)\n const back = returnedError()\n if (back) f.setError(back)\n // Once: what the workspace offers does not change while the form is open.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // Opened from a sign-in link: the token signs the person in.\n useMailedToken('ml_token', (token) => {\n if (!token) return\n setStep('opening')\n // The link carries where the person was going (`return_to`) and whether to stay signed in (`remember`).\n const query = new URLSearchParams(window.location.search)\n void auth.signIn.magicLinkVerify({ token, remember: query.get('remember') === '1' }).then((r) => {\n if (r.ok) return f.done(query.get('return_to') ?? undefined)\n f.setError(r.error)\n setStep('password')\n })\n })\n\n useEffect(() => {\n if (step !== 'password' || !methods?.passkeyHere) return\n const ctl = new AbortController()\n autofill.current = ctl\n void auth.signIn.passkeyAutofill({ signal: ctl.signal, remember: () => rememberNow.current }).then((r) => {\n if (ctl.signal.aborted) return\n if (r.ok) return f.done()\n if (r.error.code === 'cancelled') return // nothing to offer here\n f.setError(r.error)\n // A passkey that failed: offer them again, for another try.\n if (r.error.code === 'passkey_failed' || r.error.code === 'step_expired') setOffer((n) => n + 1)\n })\n return () => ctl.abort()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [step, methods, offer])\n\n const submit = async (e: FormEvent) => {\n e.preventDefault()\n autofill.current?.abort()\n // An address its company holds to SSO has nothing else to send.\n if (step === 'password' && company?.enforced) {\n f.setError(null)\n return toCompany()\n }\n // The sign-in link's own step: the link, unless the company holds the address.\n if (step === 'link') {\n if (company?.enforced) return toCompany()\n if (f.check(checkEmail(email))) return sendLink()\n return\n }\n // No password to send: the address asks for a link, when the workspace mails them.\n if (step === 'password' && !passwordOn) {\n if (company) return toCompany()\n if (methods?.magicLink && f.check(checkEmail(email))) return sendLink()\n return\n }\n // Every field the step shows, checked at once.\n if (step === 'password' && !f.check(checkEmail(email), checkPassword(password))) return\n f.setBusy(true)\n f.setError(null)\n const r = step === 'sent' ? await auth.signIn.emailCode({ code }) : await auth.signIn.email({ email, password, captchaToken: challenge.token, remember: rememberNow.current })\n if (step === 'password') challenge.renew()\n if (!r.ok && r.error.code === 'sso_required') return toCompany()\n if (!r.ok) {\n setOffer((n) => n + 1)\n return f.fail(r.error)\n }\n if (r.status === 'mfa_required') {\n // The password has done its work: the second step needs only a code.\n setPassword('')\n f.setBusy(false)\n return setStep('code')\n }\n f.done('returnTo' in r && typeof r.returnTo === 'string' ? r.returnTo : undefined)\n }\n const usePasskey = async () => {\n // The browser asks for one passkey at a time.\n autofill.current?.abort()\n f.setBusy('passkey')\n f.setError(null)\n const r = await auth.signIn.passkey({ returnTo: props.returnTo, locale: props.locale, email, remember: rememberNow.current })\n // On its way to Cauthy's page, or signed in: the form waits until it leaves.\n if (r.ok && r.status === 'redirected') return\n if (r.ok) return f.done()\n f.setBusy(false)\n setOffer((n) => n + 1)\n // The person closed the browser's prompt: nothing to say.\n if (r.error.code !== 'cancelled') f.setError(r.error)\n }\n const sendLink = async () => {\n autofill.current?.abort()\n f.setBusy('link')\n f.setError(null)\n const r = await auth.signIn.magicLink({ email, captchaToken: challenge.token, create: props.createAccounts, returnTo: props.returnTo, remember: rememberNow.current })\n f.setBusy(false)\n challenge.renew()\n if (!r.ok && r.error.code === 'sso_required') return toCompany()\n if (!r.ok) return f.setError(r.error)\n setStep('sent')\n }\n // The sign-in link's step, with the address typed so far.\n const openLink = () => {\n autofill.current?.abort()\n f.setError(null)\n setStep('link')\n }\n const general = f.error && !f.error.field ? f.error : null\n const asksEmail = offers.email\n\n if (step === 'opening') return <Wrap f={f} as=\"div\" slot=\"form\" root={f.root} busy />\n if (step === 'sent') {\n return (\n <Wrap f={f} as=\"form\" slot=\"form\" root={f.root} onSubmit={submit} noValidate>\n <Note f={f}>{f.t.signInLinkSent}</Note>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <Note f={f}>{f.t.codeFromMail}</Note>\n <Field f={f} name=\"code\" type=\"text\" label={f.t.code} value={code} autoComplete=\"one-time-code\" required onChange={setCode} />\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.verify}</f.Button>\n </Wrap>\n )\n }\n if (step === 'code') return <SecondStepForm f={f} auth={auth} />\n // The sign-in link, asked from the quick ways in: the address (the one\n // typed in the form, if any) and the button that sends it.\n if (step === 'link') {\n return (\n <Wrap f={f} as=\"form\" slot=\"form\" root={f.root} onSubmit={submit} noValidate>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <Note f={f}>{f.t.linkHelp}</Note>\n <Field f={f} name=\"email\" type=\"email\" label={f.t.email} value={email} autoComplete=\"username\" required onChange={setEmail} />\n {challenge.node}\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading('link')} disabled={f.busy} className={f.cx('button')}>{f.t.sendMeTheLink}</f.Button>\n <f.Button type=\"button\" variant=\"secondary\" disabled={f.busy} className={f.cx('providerButton')} onClick={() => { f.setError(null); setStep('password') }}>{f.t.back}</f.Button>\n </Wrap>\n )\n }\n // The quick ways in come first: the passkey, the providers, the sign-in\n // link (opening its own step). Then \"or\", and the address and password.\n // Without the password, the address below is the sign-in link's.\n const quickLink = methods?.magicLink === true && passwordOn\n const keep = methods?.persistentSessions === true && (\n <Check f={f} name=\"remember\" checked={remember} onChange={setRemember}>{f.t.keepSignedIn}</Check>\n )\n const quick = offers.passkey || (methods?.providers.length ?? 0) > 0 || quickLink\n return (\n <Wrap f={f} as=\"form\" slot=\"form\" root={f.root} onSubmit={submit} noValidate>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n {/* Once, above every way in: ticked before a provider or the passkey is chosen, it counts. */}\n {keep}\n {offers.passkey && (\n <f.Button type=\"button\" variant=\"secondary\" loading={f.loading('passkey')} disabled={f.busy} className={f.cx('providerButton')} onClick={() => void usePasskey()}>{f.t.usePasskey}</f.Button>\n )}\n <ProviderButtons f={f} providers={methods?.providers ?? []} onPick={(id) => auth.signIn.social(id, { returnTo: props.returnTo, remember: rememberNow.current })} />\n {quickLink && (\n <f.Button type=\"button\" variant=\"secondary\" disabled={f.busy} className={f.cx('providerButton')} onClick={openLink}>{f.t.emailMeALink}</f.Button>\n )}\n {asksEmail && quick && <Or f={f}>{f.t.orWithEmail}</Or>}\n {asksEmail && (\n <Field f={f} name=\"email\" type=\"email\" label={f.t.email} value={email} autoComplete={methods?.passkeyHere ? 'username webauthn' : 'username'} required onChange={setEmail} />\n )}\n {company && (\n <f.Button type=\"button\" variant={company.enforced ? 'primary' : 'secondary'} loading={f.loading('sso')} disabled={f.busy} className={f.cx(company.enforced ? 'button' : 'providerButton')} onClick={toCompany}>\n {f.t.continueWith} {company.name}\n </f.Button>\n )}\n {company?.enforced && <Note f={f}>{f.t.ssoOnly}</Note>}\n {!company?.enforced && passwordOn && (\n <>\n <Field f={f} name=\"password\" type=\"password\" label={f.t.password} value={password} autoComplete=\"current-password\" required onChange={setPassword}\n aside={props.links?.forgotPassword ? <A f={f} href={props.links.forgotPassword}>{f.t.forgotPassword}</A> : undefined} />\n {challenge.node}\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.signIn}</f.Button>\n </>\n )}\n {/* Without the password, the address asks for the sign-in link. */}\n {!company?.enforced && !passwordOn && methods?.magicLink && (\n <>\n {challenge.node}\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading('link')} disabled={f.busy} className={f.cx('button')}>{f.t.sendMeTheLink}</f.Button>\n </>\n )}\n {methods?.signUp !== false && props.links?.signUp && (\n <Note f={f} footer>{f.t.noAccount} <A f={f} href={props.links.signUp}>{f.t.createAccount}</A></Note>\n )}\n </Wrap>\n )\n}\n\nexport interface GoogleOneTapProps {\n /** Where to go once signed in. Without it (and without `onSuccess`), the page stays and its session updates. */\n returnTo?: string\n /** Called once signed in, instead of going to `returnTo`. */\n onSuccess?: () => void\n /** The prompt's words: sign in (default), sign up, or use the application. */\n context?: 'signin' | 'signup' | 'use'\n /** Whether the person asked to stay signed in, read when they tap. */\n remember?: () => boolean\n}\n\n/**\n * Google One Tap: put it on any page, and a person who is not signed in sees\n * Google's prompt with the Google account the browser has; one tap signs them\n * in. It draws nothing of its own, and shows nothing to somebody signed in or\n * where the workspace has no Google sign-in.\n */\nexport function GoogleOneTap(props: GoogleOneTapProps) {\n const auth = useAuth()\n const unauthenticated = auth.status === 'unauthenticated'\n useEffect(() => {\n if (!unauthenticated) return\n const ctl = new AbortController()\n void auth.signIn.googleOneTap({ signal: ctl.signal, context: props.context, remember: props.remember }).then((r) => {\n if (!r.ok || ctl.signal.aborted) return\n if (props.onSuccess) props.onSuccess()\n else {\n const to = sameOrigin(props.returnTo)\n if (to) window.location.assign(to)\n }\n })\n return () => ctl.abort()\n // Once per signed-out visit: the prompt is not shown again on every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [unauthenticated])\n return null\n}\n\nexport function SignUp(props: AuthFormProps) {\n const auth = useAuth()\n const f = useForm(props)\n const [name, setName] = useState('')\n const [organization, setOrganization] = useState('')\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [sent, setSent] = useState(false)\n const methods = useMethods(auth)\n usePasswordPolicy(f, methods)\n const challenge = useChallenge(methods?.captchaSiteKey, props.locale)\n // The law's boxes: the documents accepted, and each consent asked.\n const [acceptLegal, setAcceptLegal] = useState(false)\n const [consents, setConsents] = useState<Record<string, boolean>>({})\n const legal = methods?.legal\n\n const guest = auth.session?.user.isAnonymous === true\n const submit = async (e: FormEvent) => {\n e.preventDefault()\n // Every field at once, in the order they are drawn.\n const asksCompany = methods?.organization?.ask === true\n if (!f.check(\n asksCompany && checkOrganization(organization, methods?.organization?.required === true),\n checkName(name), checkEmail(email), newPasswordProblem(password, f.policy),\n )) return\n f.setBusy(true)\n f.setError(null)\n // A guest signing up becomes the account they were using: same id.\n const r = guest\n ? await auth.account.upgrade({ name, email, password })\n : await auth.signUp.email({ name, email, password, ...(methods?.organization?.ask ? { organization } : {}),\n ...(legal ? { acceptLegal, consents } : {}), captchaToken: challenge.token })\n challenge.renew()\n if (!r.ok) return f.fail(r.error)\n if (r.status === 'verification_required') {\n f.setBusy(false)\n return setSent(true)\n }\n f.done()\n }\n const general = f.error && !f.error.field ? f.error : null\n // A workspace that turned the password off makes accounts through its\n // providers only. Not offered to a guest becoming an account (the provider\n // would sign them in as another), nor where the sign-up must name its\n // company: a provider has no field for it.\n const passwordOn = methods?.passwordSignIn !== false\n const providers = guest || methods?.organization?.required ? [] : (methods?.providers ?? [])\n\n if (sent) {\n return (\n <Wrap f={f} as=\"div\" slot=\"form\" root={f.root}>\n <Note f={f}>{f.t.checkEmail}</Note>\n {props.links?.signIn && <A f={f} href={props.links.signIn}>{f.t.backToSignIn}</A>}\n </Wrap>\n )\n }\n // Until the workspace says what it asks (a company's name, the password,\n // the legal boxes), the form waits: its fields would move as they came.\n if (methods === null) return <Wrap f={f} as=\"div\" slot=\"form\" root={f.root} busy />\n const footer = props.links?.signIn && <Note f={f} footer>{f.t.haveAccount} <A f={f} href={props.links.signIn}>{f.t.signIn}</A></Note>\n if (!passwordOn) {\n return (\n <Wrap f={f} as=\"div\" slot=\"form\" root={f.root}>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <ProviderButtons f={f} providers={providers} onPick={(id) => auth.signIn.social(id, { returnTo: props.returnTo })} />\n {footer}\n </Wrap>\n )\n }\n return (\n <Wrap f={f} as=\"form\" slot=\"form\" root={f.root} onSubmit={submit} noValidate>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <ProviderButtons f={f} providers={providers} onPick={(id) => auth.signIn.social(id, { returnTo: props.returnTo })} />\n {providers.length > 0 && <Or f={f}>{f.t.orWithEmail}</Or>}\n {methods.organization?.ask && (\n <Field f={f} name=\"organization\" type=\"text\" label={f.t.company} value={organization} autoComplete=\"organization\" required={methods.organization.required} onChange={setOrganization} />\n )}\n <Field f={f} name=\"name\" type=\"text\" label={f.t.name} value={name} autoComplete=\"name\" onChange={setName} />\n <Field f={f} name=\"email\" type=\"email\" label={f.t.email} value={email} autoComplete=\"username\" required onChange={setEmail} />\n <Field f={f} name=\"password\" type=\"password\" label={f.t.password} value={password} autoComplete=\"new-password\" required onChange={setPassword} hint={f.passwordRule} />\n {legal && legal.documents.length > 0 && (\n <Check f={f} name=\"acceptLegal\" checked={acceptLegal} required onChange={setAcceptLegal}>\n {f.t.iAccept}{' '}\n <Documents f={f} documents={legal.documents} />\n </Check>\n )}\n {legal?.consentPurposes.map((p) => (\n <Check key={p.key} f={f} name={`consent_${p.key}`} checked={consents[p.key] === true} required={p.required} onChange={(on) => setConsents({ ...consents, [p.key]: on })}>\n {p.label}\n </Check>\n ))}\n {challenge.node}\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.signUp}</f.Button>\n {footer}\n </Wrap>\n )\n}\n\nexport function ForgotPassword(props: AuthFormProps) {\n const auth = useAuth()\n const f = useForm(props)\n const [email, setEmail] = useState('')\n const [sent, setSent] = useState(false)\n const challenge = useChallenge(useMethods(auth)?.captchaSiteKey, props.locale)\n\n const submit = async (e: FormEvent) => {\n e.preventDefault()\n f.setBusy(true)\n f.setError(null)\n const r = await auth.forgotPassword({ email, captchaToken: challenge.token })\n f.setBusy(false)\n challenge.renew()\n if (!r.ok) return f.setError(r.error)\n setSent(true)\n }\n const general = f.error && !f.error.field ? f.error : null\n\n if (sent) {\n return (\n <Wrap f={f} as=\"div\" slot=\"form\" root={f.root}>\n <Note f={f}>{f.t.linkSent}</Note>\n {props.links?.signIn && <A f={f} href={props.links.signIn}>{f.t.backToSignIn}</A>}\n </Wrap>\n )\n }\n return (\n <Wrap f={f} as=\"form\" slot=\"form\" root={f.root} onSubmit={submit} noValidate>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <Field f={f} name=\"email\" type=\"email\" label={f.t.email} value={email} autoComplete=\"username\" required onChange={setEmail} />\n {challenge.node}\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.sendLink}</f.Button>\n {props.links?.signIn && <Note f={f} footer><A f={f} href={props.links.signIn}>{f.t.backToSignIn}</A></Note>}\n </Wrap>\n )\n}\n\n/** The page a \"choose a new password\" link opens: `pages.resetPassword`. */\nexport function ResetPassword(props: AuthFormProps) {\n const auth = useAuth()\n const f = useForm(props)\n const [token, setToken] = useState<string | null>(null)\n const [password, setPassword] = useState('')\n const [changed, setChanged] = useState(false)\n usePasswordPolicy(f, useMethods(auth))\n\n useMailedToken('token', (t) => {\n setToken(t ?? '')\n if (!t) f.setError({ code: 'invalid_token', message: 'This link is not valid, or it has expired.' })\n })\n\n const submit = async (e: FormEvent) => {\n e.preventDefault()\n f.setBusy(true)\n f.setError(null)\n const r = await auth.resetPassword({ token: token ?? '', password })\n f.setBusy(false)\n if (!r.ok) return f.setError(r.error)\n setChanged(true)\n }\n const general = f.error && !f.error.field ? f.error : null\n const back = props.links?.signIn && <A f={f} href={props.links.signIn}>{f.t.backToSignIn}</A>\n\n if (changed) {\n return (\n <Wrap f={f} as=\"div\" slot=\"form\" root={f.root}>\n <Note f={f}>{f.t.passwordChanged}</Note>\n {back}\n </Wrap>\n )\n }\n if (token === '') {\n return (\n <Wrap f={f} as=\"div\" slot=\"form\" root={f.root}>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n {props.links?.forgotPassword && <A f={f} href={props.links.forgotPassword}>{f.t.forgotPassword}</A>}\n </Wrap>\n )\n }\n return (\n <Wrap f={f} as=\"form\" slot=\"form\" root={f.root} onSubmit={submit} noValidate>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <Field f={f} name=\"password\" type=\"password\" label={f.t.newPassword} value={password} autoComplete=\"new-password\" required onChange={setPassword} hint={f.passwordRule} />\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy || token === null} className={f.cx('button')}>{f.t.savePassword}</f.Button>\n </Wrap>\n )\n}\n\n/** The page a \"confirm your address\" link opens: `pages.verifyEmail`. It confirms as it opens. */\nexport function VerifyEmail(props: AuthFormProps) {\n const auth = useAuth()\n const f = useForm(props)\n const [state, setState] = useState<'confirming' | 'confirmed' | 'failed'>('confirming')\n\n useMailedToken('token', (token) => {\n if (!token) {\n f.setError({ code: 'invalid_token', message: 'This link is not valid, or it has expired.' })\n return setState('failed')\n }\n void auth.verifyEmail({ token }).then((r) => {\n // Signed in from the link: on to the application, nothing more to type.\n if (r.ok && r.status === 'signed_in') return f.done()\n if (r.ok) return setState('confirmed')\n f.setError(r.error)\n setState('failed')\n })\n })\n\n return (\n <Wrap f={f} as=\"div\" slot=\"form\" root={f.root} busy={state === 'confirming'}>\n {state === 'confirming' && <Note f={f}>{f.t.confirming}</Note>}\n {state === 'confirmed' && <Note f={f}>{f.t.emailConfirmed}</Note>}\n {state === 'failed' && f.error && <Say f={f} tone=\"danger\">{f.say(f.error)}</Say>}\n {state !== 'confirming' && props.links?.signIn && <A f={f} href={props.links.signIn}>{f.t.backToSignIn}</A>}\n </Wrap>\n )\n}\n\n/**\n * The page an invitation opens: `pages.acceptInvite`. It says who is invited\n * to what, asks for a password under the workspace's policy, signs the person\n * in (with the second step, when their account owes one) and goes on to\n * `returnTo`. The invitation is good until it is accepted: reading it, or a\n * password refused, does not spend it.\n */\n/** What `<AcceptInvite />` tells the application once the invitation is accepted. */\nexport type AcceptInviteEvent = { kind: 'invitation.accepted'; email: string; organization?: string }\n\nexport interface AcceptInviteProps extends AuthFormProps {\n /** Called once the invitation is accepted, before the second step when the account owes one. */\n onSaved?: (event: AcceptInviteEvent) => void\n}\n\nexport function AcceptInvite(props: AcceptInviteProps) {\n const auth = useAuth()\n const f = useForm(props)\n const [token, setToken] = useState('')\n const [invitation, setInvitation] = useState<Invitation | null>(null)\n const [state, setState] = useState<'opening' | 'ready' | 'invalid' | 'code'>('opening')\n const [password, setPassword] = useState('')\n usePasswordPolicy(f, useMethods(auth))\n\n useMailedToken('token', (t) => {\n if (!t) return setState('invalid')\n setToken(t)\n void auth.invitation(t).then((r) => {\n if (r.ok) {\n setInvitation(r.invitation)\n return setState('ready')\n }\n // A spent or unknown invitation says so; anything else, what it was.\n if (r.error.code !== 'invalid_token') f.setError(r.error)\n setState('invalid')\n })\n })\n\n const submit = async (e: FormEvent) => {\n e.preventDefault()\n f.setBusy(true)\n f.setError(null)\n const r = await auth.acceptInvitation(token, password)\n if (!r.ok) {\n f.setBusy(false)\n if (r.error.code === 'invalid_token') return setState('invalid')\n return f.setError(r.error)\n }\n props.onSaved?.({ kind: 'invitation.accepted', email: invitation?.email ?? '', ...(invitation?.organization ? { organization: invitation.organization } : {}) })\n if (r.status === 'mfa_required') {\n f.setBusy(false)\n return setState('code')\n }\n f.done()\n }\n const general = f.error && !f.error.field ? f.error : null\n const back = props.links?.signIn && <A f={f} href={props.links.signIn}>{f.t.backToSignIn}</A>\n\n if (state === 'opening') {\n return (\n <Wrap f={f} as=\"div\" slot=\"form\" root={f.root} busy>\n <Note f={f}>{f.t.openingInvitation}</Note>\n </Wrap>\n )\n }\n if (state === 'invalid') {\n return (\n <Wrap f={f} as=\"div\" slot=\"form\" root={f.root}>\n <Say f={f} tone=\"danger\">{general ? f.say(general) : f.t.invitationInvalid}</Say>\n {back}\n </Wrap>\n )\n }\n if (state === 'code') return <SecondStepForm f={f} auth={auth} />\n const workspace = invitation?.workspace ?? ''\n const heading = invitation?.organization\n ? f.t.invitedToOrganization.replace('{organization}', invitation.organization).replace('{workspace}', workspace)\n : f.t.invitedTo.replace('{workspace}', workspace)\n return (\n <Wrap f={f} as=\"form\" slot=\"form\" root={f.root} onSubmit={submit} noValidate>\n <Heading f={f}>{heading}</Heading>\n <Note f={f}>{f.t.invitedAs.replace('{email}', invitation?.email ?? '')}</Note>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n {/* The address, for the browser's password manager to keep the new password under. */}\n <input type=\"email\" name=\"username\" autoComplete=\"username\" value={invitation?.email ?? ''} readOnly hidden />\n <Field f={f} name=\"password\" type=\"password\" label={f.t.choosePassword} value={password} autoComplete=\"new-password\" required onChange={setPassword} hint={f.passwordRule} />\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.acceptInvite}</f.Button>\n </Wrap>\n )\n}\n\nexport interface PendingTermsProps extends Omit<AuthFormProps, 'links' | 'returnTo' | 'createAccounts'> {\n /**\n * Called once the person accepted. Nothing else happens: the application\n * decides what follows. A Promise keeps the button loading until it settles.\n */\n onSuccess?: () => void | Promise<unknown>\n}\n\n/**\n * The legal documents the signed-in person still owes (a new version of the\n * terms, say), linked, with the action that accepts them. It shows nothing\n * while it reads them, when nothing is owed, and once they are accepted.\n * Nothing stops the person meanwhile: the application decides what waits.\n */\nexport function PendingTerms(props: PendingTermsProps) {\n const auth = useAuth()\n const f = useForm(props)\n const [owed, setOwed] = useState<PendingLegal[] | null>(null)\n useEffect(() => {\n void auth.account.legal().then((r) => setOwed(r.ok ? r.pending : []))\n // Once: what is owed is read when the page opens.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n if (!owed || owed.length === 0) return null\n const accept = async () => {\n f.setBusy(true)\n f.setError(null)\n const r = await auth.account.acceptLegal({ kinds: owed.map((d) => d.kind) })\n if (!r.ok) return f.fail(r.error)\n // The application's own way on, when it waits for it: the button loads until then.\n const after = props.onSuccess?.()\n if (isPending(after)) await Promise.resolve(after).catch(() => undefined)\n f.setBusy(false)\n setOwed([])\n }\n return (\n <Wrap f={f} as=\"div\" slot=\"form\" root={f.root}>\n <Heading f={f}>{f.t.termsChanged}</Heading>\n <Note f={f}>{f.t.termsChangedHelp}{' '}<Documents f={f} documents={owed} /></Note>\n {f.error && <Say f={f} tone=\"danger\">{f.say(f.error)}</Say>}\n <f.Button type=\"button\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')} onClick={() => void accept()}>{f.t.acceptTerms}</f.Button>\n </Wrap>\n )\n}\n\n/** The parts of `<Account />`, by name: what `sections` lists. */\nexport type AccountSection = 'profile' | 'email' | 'password' | 'linked' | 'secondStep' | 'phone' | 'passkeys' | 'agents' | 'sessions'\n\nconst ACCOUNT_SECTIONS: AccountSection[] = ['profile', 'email', 'password', 'linked', 'secondStep', 'phone', 'passkeys', 'agents', 'sessions']\n\n/**\n * What `<Account />` tells the application after each change it saved, for\n * the application's own toast or its own data to follow.\n */\nexport type AccountEvent =\n | { kind: 'profile.saved'; name: string }\n | { kind: 'email.change_requested'; email: string }\n | { kind: 'password.changed' }\n | { kind: 'identity.linked'; provider: string }\n | { kind: 'identity.unlinked'; provider: string }\n | { kind: 'mfa.enabled' }\n | { kind: 'mfa.disabled' }\n | { kind: 'recovery_codes.regenerated' }\n | { kind: 'phone.added'; channel: 'sms' | 'whatsapp' }\n | { kind: 'phone.removed' }\n | { kind: 'passkey.added'; id: string }\n | { kind: 'passkey.removed'; id: string }\n | { kind: 'agent.disconnected'; id: string }\n | { kind: 'sessions.ended' }\n\nexport interface AccountProps extends Omit<AuthFormProps, 'links' | 'returnTo' | 'onSuccess'> {\n /** Called after \"sign out everywhere\". Default: go to `/`. A Promise keeps the button loading until it settles. */\n onSignedOut?: () => void | Promise<unknown>\n /** The moment of a session, as the application writes dates. Default: the browser's own way, in the reader's time zone. */\n formatDate?: (iso: string) => string\n /**\n * The parts shown, in this order. Default: all of them, as listed in\n * `AccountSection`. A part with nothing to show (the password of an account\n * without one, agents when none is connected) stays out either way.\n */\n sections?: AccountSection[]\n /** Called after every change saved, with what changed. */\n onSaved?: (event: AccountEvent) => void\n}\n\n/** One part of the account screen: its own form, its own error, its own \"saved\". */\nfunction useSection(props: AccountProps) {\n // The look is the account screen's, around every part: not read again here.\n const f = useForm(props, { part: true })\n const [done, setDone] = useState<string | null>(null)\n // `key`: the button the action belongs to, the one that says it loads.\n // `leaves`: done, the action leaves the page; the part stays busy (see `hold`).\n const run = async <T extends { ok: boolean }>(action: () => Promise<T>, key: string = SUBMIT, leaves = false): Promise<T> => {\n f.setBusy(key)\n f.setError(null)\n setDone(null)\n const r = await action()\n if (!r.ok) f.fail((r as unknown as { error: AuthError }).error)\n else if (!leaves) f.setBusy(false)\n return r\n }\n const general = f.error && !f.error.field ? f.error : null\n return { f, done, setDone, run, general }\n}\n\n/**\n * The signed-in person's account, in the application: their name, their\n * password, the second step, and where they are signed in. Each part saves on\n * its own. Like the other forms, it carries no styles.\n */\nexport function Account(props: AccountProps) {\n const auth = useAuth()\n const { accountUrl } = useSession()\n const f = useForm(props)\n const [account, setAccount] = useState<AccountDetails | null>(null)\n\n useEffect(() => {\n void auth.account.get().then(setAccount)\n // Once: the account is read when the screen opens, and after each change below.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n if (account === null) return <Wrap f={f} as=\"div\" slot=\"account\" root={f.root} busy />\n const when = props.formatDate ?? ((iso: string) => new Date(iso).toLocaleString())\n const mfa = (mfaEnabled: boolean) => setAccount({ ...account, mfaEnabled })\n const part = (section: AccountSection): ReactNode => {\n switch (section) {\n case 'profile': return <ProfilePart props={props} account={account} onSaved={setAccount} />\n case 'email': return <EmailPart props={props} account={account} />\n case 'password': return account.hasPassword ? <PasswordPart props={props} /> : null\n case 'linked': return <LinkedPart props={props} />\n case 'secondStep': return <SecondStepPart props={props} account={account} onChanged={mfa} />\n case 'phone': return <PhonePart props={props} account={account} onChanged={mfa} />\n case 'passkeys': return <PasskeysPart props={props} account={account} accountUrl={accountUrl()} when={when} />\n case 'agents': return <AgentsPart props={props} when={when} />\n case 'sessions': return <SessionsPart props={props} when={when} />\n }\n }\n\n return (\n <Wrap f={f} as=\"div\" slot=\"account\" root={f.root}>\n {(props.sections ?? ACCOUNT_SECTIONS).map((section) => <Fragment key={section}>{part(section)}</Fragment>)}\n </Wrap>\n )\n}\n\n/** What each part of the account screen takes, shown on its own: `<Account />`'s props but `sections`. */\nexport type AccountPartProps = Omit<AccountProps, 'sections'>\n\n// Each part of the account screen on its own, for an application that puts\n// them on separate cards. Each reads the account it shows.\n\n/** The person's name. */\nexport function AccountProfile(props: AccountPartProps) { return <Account {...props} sections={['profile']} /> }\n/** Changing the address: a link goes to the new one. */\nexport function AccountEmail(props: AccountPartProps) { return <Account {...props} sections={['email']} /> }\n/** Changing the password, for an account that has one. */\nexport function AccountPassword(props: AccountPartProps) { return <Account {...props} sections={['password']} /> }\n/** The providers the account signs in with. */\nexport function AccountLinked(props: AccountPartProps) { return <Account {...props} sections={['linked']} /> }\n/** The second step with an authenticator app, and the recovery codes. */\nexport function AccountSecondStep(props: AccountPartProps) { return <Account {...props} sections={['secondStep']} /> }\n/** The phone codes go to, where the workspace sends them. */\nexport function AccountPhone(props: AccountPartProps) { return <Account {...props} sections={['phone']} /> }\n/** The account's passkeys. */\nexport function AccountPasskeys(props: AccountPartProps) { return <Account {...props} sections={['passkeys']} /> }\n/** The AI agents the person connected, when there is one. */\nexport function AccountAgents(props: AccountPartProps) { return <Account {...props} sections={['agents']} /> }\n/** Where the person is signed in, and \"sign out everywhere\". */\nexport function AccountSessions(props: AccountPartProps) { return <Account {...props} sections={['sessions']} /> }\n\n/** An action `<OrganizationMembers hide={...} />` never offers. */\nexport type OrganizationMembersAction = 'archive' | 'delete' | 'rename' | 'leave'\n\n/**\n * What `<OrganizationMembers />` tells the application after each change it\n * saved, for the application's own toast or its own data to follow.\n */\nexport type OrganizationMembersEvent =\n | { kind: 'member.added'; organizationId: string; userId: string; email: string; role: string }\n | { kind: 'member.role_changed'; organizationId: string; userId: string; role: string; previousRole: string }\n | { kind: 'member.removed'; organizationId: string; userId: string }\n | { kind: 'member.left'; organizationId: string; userId: string }\n | { kind: 'member.invited_again'; organizationId: string; userId: string }\n | { kind: 'organization.renamed'; organizationId: string; name: string }\n | { kind: 'organization.archived'; organizationId: string }\n | { kind: 'organization.deleted'; organizationId: string }\n\nexport interface OrganizationMembersProps extends Omit<AuthFormProps, 'links' | 'returnTo' | 'onSuccess' | 'createAccounts'> {\n /** The organization, by the id Cauthy gave it. */\n organizationId: string\n /** The moment of a membership, as the application writes dates. Default: the browser's own way. */\n formatDate?: (iso: string) => string\n /**\n * The roles offered when adding a member or changing one's role: those for\n * which it answers true. A member already holding another role keeps it,\n * and it shows. Default: every role the person may give.\n */\n roles?: (role: string, choice: OrganizationRoleChoice) => boolean\n /** Actions never offered, whatever the person's role allows. */\n hide?: OrganizationMembersAction[]\n /** A role's name wherever one shows: a member's, the role choices, adding one. Default: the name the catalog gives it. */\n roleLabel?: (choice: OrganizationRoleChoice) => string\n /** Called after every change saved, with what changed. */\n onSaved?: (event: OrganizationMembersEvent) => void\n}\n\n/** The role Cauthy keeps in every catalog: only its holders give it, or change and remove those who hold it. */\nconst OWNER = 'owner'\n\n/**\n * What the signed-in person may do to one member, by their own seat: the\n * buttons <OrganizationMembers /> shows. Cauthy refuses the rest anyway; this\n * only keeps from offering it.\n */\nexport function memberActions(seat: OrganizationSeat, m: OrganizationPerson): { changeRole: boolean; remove: boolean; inviteAgain: boolean } {\n // An owner is changed or removed by another owner alone.\n const reachable = m.role !== OWNER || seat.role === OWNER\n return {\n changeRole: seat.can.manageMembers && reachable,\n // Leaving is anybody's; removing somebody else is cauthy:members:remove.\n remove: m.you || (seat.can.removeMembers && reachable),\n inviteAgain: seat.can.manageMembers && m.invited,\n }\n}\n\n/**\n * The roles the person may give: the owner role only by an owner, and of\n * those, the ones the application's `only` lets through.\n */\nexport function rolesToGive(seat: OrganizationSeat, roles: OrganizationRoleChoice[], only?: (role: string, choice: OrganizationRoleChoice) => boolean): OrganizationRoleChoice[] {\n const mine = seat.role === OWNER ? roles : roles.filter((c) => c.role !== OWNER)\n return only ? mine.filter((c) => only(c.role, c)) : mine\n}\n\n/**\n * The people of one of the signed-in person's organizations, administered\n * from the application. What it offers follows the person's role in the\n * system's catalog: cauthy:members read lists the people; manage adds them by\n * address (one with no account is invited), changes their role and sends an\n * invitation again; remove removes them. Anybody may leave. Only an owner\n * gives the owner role or changes an owner. cauthy:organization update,\n * archive and delete rename the organization, archive it, delete it. Cauthy\n * checks each change with the person's own session; the application\n * authorizes nothing. Like the other forms, it carries no styles.\n */\nexport function OrganizationMembers(props: OrganizationMembersProps) {\n const auth = useAuth()\n // The mark styles.css draws is the screen's; each part below is unstyled inside it, as in <Account />.\n const { root } = useForm(props as AccountProps)\n const { f, done, setDone, run } = useSection(props as AccountProps)\n // A refusal about the address or the new name shows under its field; any\n // other — a role, the last owner, a power the person lacks — above the list.\n const problem = f.error && f.error.field !== 'email' && f.error.field !== 'name' ? f.error : null\n const [seat, setSeat] = useState<OrganizationSeat | null | undefined>(undefined)\n const [members, setMembers] = useState<OrganizationPerson[] | null>(null)\n const [roles, setRoles] = useState<OrganizationRoleChoice[]>([])\n const [email, setEmail] = useState('')\n const [role, setRole] = useState('')\n const [name, setName] = useState('')\n const [asking, setAsking] = useState<string | null>(null) // the member a removal waits on, or 'archive' / 'delete'\n // The forms of what is already set open on their action: adding a member\n // (once somebody besides the person belongs) and renaming.\n const [adding, setAdding] = useState(false)\n const [renamingOpen, setRenamingOpen] = useState(false)\n // Said once the organization is archived or deleted: there is nothing left to show.\n const [gone, setGone] = useState<string | null>(null)\n const id = props.organizationId\n const when = props.formatDate ?? ((iso: string) => new Date(iso).toLocaleDateString())\n const hidden = (action: OrganizationMembersAction) => props.hide?.includes(action) === true\n const saved = (event: OrganizationMembersEvent) => props.onSaved?.(event)\n\n const load = async () => {\n const [list, people, choices] = await Promise.all([auth.organizations.list(), auth.organizations.members(id), auth.organizations.roles(id)])\n const mine = list.find((o) => o.id === id) ?? null\n setSeat(mine)\n if (mine) setName(mine.name)\n setMembers(people)\n setRoles(choices ?? [])\n const offered = mine ? rolesToGive(mine, choices ?? [], props.roles) : []\n if (offered.length > 0 && !offered.some((c) => c.role === role)) setRole(offered[0].role)\n }\n useEffect(() => {\n void load()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id])\n\n if (gone !== null) return <Wrap f={f} as=\"div\" slot=\"account\" root={root}><Say f={f} tone=\"success\">{gone}</Say></Wrap>\n if (seat === undefined) return <Wrap f={f} as=\"div\" slot=\"account\" root={root} busy />\n if (seat === null) return <Wrap f={f} as=\"div\" slot=\"account\" root={root}><Note f={f}>{f.t.organizationMissing}</Note></Wrap>\n const manage = seat.can.manageMembers\n const giveable = rolesToGive(seat, roles, props.roles)\n const roleName = (c: OrganizationRoleChoice) => props.roleLabel?.(c) || c.name || c.role\n const label = (r: string) => {\n const c = roles.find((x) => x.role === r)\n return c ? roleName(c) : r\n }\n\n const add = async (e: FormEvent) => {\n e.preventDefault()\n if (!f.check(checkEmail(email))) return\n const r = await run(() => auth.organizations.add(id, { email, role, locale: props.locale }), 'add')\n if (!r.ok) return\n setEmail('')\n setAdding(false)\n setDone(f.t.memberAdded.replace('{email}', r.member.email))\n saved({ kind: 'member.added', organizationId: id, userId: r.member.userId, email: r.member.email, role: r.member.role || role })\n await load()\n }\n const change = async (m: OrganizationPerson, next: string) => {\n const r = await run(() => auth.organizations.setRole(id, m.userId, next), `role:${m.userId}`)\n if (!r.ok) return\n saved({ kind: 'member.role_changed', organizationId: id, userId: m.userId, role: next, previousRole: m.role })\n await load()\n }\n const remove = async (m: OrganizationPerson) => {\n setAsking(null)\n const r = await run(() => auth.organizations.remove(id, m.userId), `remove:${m.userId}`)\n if (!r.ok) return\n saved({ kind: m.you ? 'member.left' : 'member.removed', organizationId: id, userId: m.userId })\n // Leaving: the organization is no longer the person's to see.\n if (m.you) setSeat(null)\n else await load()\n }\n const inviteAgain = async (m: OrganizationPerson) => {\n const r = await run(() => auth.organizations.inviteAgain(id, m.userId, { locale: props.locale }), `invite:${m.userId}`)\n if (!r.ok) return\n setDone(f.t.memberInvitationSent)\n saved({ kind: 'member.invited_again', organizationId: id, userId: m.userId })\n }\n const rename = async (e: FormEvent) => {\n e.preventDefault()\n const r = await run(() => auth.organizations.rename(id, name), 'rename')\n if (!r.ok) return\n setSeat(r.organization)\n setName(r.organization.name)\n setRenamingOpen(false)\n setDone(f.t.organizationRenamed.replace('{name}', r.organization.name))\n saved({ kind: 'organization.renamed', organizationId: id, name: r.organization.name })\n }\n const close = async (how: 'archive' | 'delete') => {\n setAsking(null)\n const r = await run<{ ok: boolean }>(() => (how === 'archive' ? auth.organizations.archive(id) : auth.organizations.delete(id)), how)\n if (!r.ok) return\n setGone((how === 'archive' ? f.t.organizationArchived : f.t.organizationDeleted).replace('{org}', seat.name))\n saved({ kind: how === 'archive' ? 'organization.archived' : 'organization.deleted', organizationId: id })\n }\n // Before what cannot be undone: the application's own dialog when it gave\n // one, otherwise the question inline, where the button was.\n const ask = (key: string, title: string, question: string, yes: () => void) => {\n const { Confirm } = f.C\n if (!Confirm) return setAsking(key)\n void Confirm({ title, body: question, confirmLabel: title, cancelLabel: f.t.cancel, danger: true }).then((ok) => { if (ok) yes() })\n }\n const confirming = (text: string, label: string, yes: () => void) => (\n <span role=\"group\" aria-label={label}>\n <span>{text}</span>{' '}\n <f.Button type=\"button\" variant=\"danger\" disabled={f.busy} className={f.cx('providerButton')} onClick={yes}>{f.t.yes}</f.Button>\n <f.Button type=\"button\" variant=\"secondary\" disabled={f.busy} className={f.cx('providerButton')} onClick={() => setAsking(null)}>{f.t.cancel}</f.Button>\n </span>\n )\n const leaveQuestion = f.t.memberLeaveConfirm.replace('{org}', seat.name)\n const archiveQuestion = f.t.organizationArchiveConfirm.replace('{org}', seat.name)\n const deleteQuestion = f.t.organizationDeleteConfirm.replace('{org}', seat.name)\n const archiving = seat.can.archive && !hidden('archive')\n const deleting = seat.can.delete && !hidden('delete')\n const renaming = seat.can.update && !hidden('rename')\n // Nobody but the person yet: the form to add the first member shows as it is.\n const alone = members !== null && members.every((m) => m.you)\n const addOpen = adding || alone\n const open = (form: 'add' | 'rename') => {\n setDone(null)\n f.setError(null)\n if (form === 'add') setAdding(true)\n else setRenamingOpen(true)\n }\n const cancelAdd = () => {\n setEmail('')\n f.setError(null)\n setAdding(false)\n }\n const cancelRename = () => {\n setName(seat.name)\n f.setError(null)\n setRenamingOpen(false)\n }\n\n return (\n <Wrap f={f} as=\"div\" slot=\"account\" root={root}>\n <Wrap f={f} as=\"section\" slot=\"section\" section=\"members\">\n <Heading f={f}>{f.t.members} · {seat.name}</Heading>\n {problem && <Say f={f} tone=\"danger\">{f.say(problem)}</Say>}\n {members === null ? (\n <>\n <Note f={f}>{f.t.membersHidden}</Note>\n {/* Whoever cannot see the people may still leave. */}\n {auth.session && !hidden('leave') && (asking === auth.session.user.id\n ? confirming(leaveQuestion, f.t.memberLeave, () => void remove({ userId: auth.session!.user.id, you: true } as OrganizationPerson))\n : <f.Button type=\"button\" variant=\"danger\" loading={f.loading(`remove:${auth.session.user.id}`)} disabled={f.busy} className={f.cx('providerButton')}\n onClick={() => ask(auth.session!.user.id, f.t.memberLeave, leaveQuestion, () => void remove({ userId: auth.session!.user.id, you: true } as OrganizationPerson))}>{f.t.memberLeave}</f.Button>)}\n </>\n ) : (\n <ul className={f.cx('sessions')}>\n {members.map((m) => {\n const who = m.name || m.email\n const may = memberActions(seat, m)\n const removable = may.remove && !(m.you && hidden('leave'))\n const question = m.you ? leaveQuestion : f.t.memberRemoveConfirm.replace('{who}', who)\n const action = m.you ? f.t.memberLeave : f.t.memberRemove\n // The member's own role stays listed, even one the person may not give.\n const choices = giveable.some((c) => c.role === m.role) ? giveable : [...roles.filter((c) => c.role === m.role), ...giveable]\n return (\n <li key={m.userId} className={f.cx('session')}>\n <span>\n {who}{m.name ? ` · ${m.email}` : ''}\n {m.you && <Tag f={f} plain={` (${f.t.memberYou})`}>{f.t.memberYou}</Tag>}\n {f.C.Badge ? (\n <>\n {m.invited && <Tag f={f} tone=\"warning\" plain=\"\">{f.t.memberInvited}</Tag>}\n {m.manager && <Tag f={f} tone=\"success\" plain=\"\">{f.t.memberManager}</Tag>}\n </>\n ) : `${m.invited ? ` · ${f.t.memberInvited}` : ''}${m.manager ? ` · ${f.t.memberManager}` : ''}`}\n {' · '}{when(m.since)}\n </span>{' '}\n {may.changeRole && giveable.length > 0 ? (\n <Pick f={f} name={`role_${m.userId}`} label={`${f.t.memberRole}: ${who}`} value={m.role} disabled={f.busy}\n options={choices.map((c) => ({ value: c.role, label: roleName(c) }))} onChange={(next) => void change(m, next)} />\n ) : f.C.Badge ? <f.C.Badge tone=\"neutral\">{label(m.role)}</f.C.Badge> : <span>{label(m.role)}</span>}{' '}\n {asking === m.userId ? (\n confirming(question, action, () => void remove(m))\n ) : (\n <>\n {may.inviteAgain && <f.Button type=\"button\" variant=\"secondary\" loading={f.loading(`invite:${m.userId}`)} disabled={f.busy} className={f.cx('providerButton')} onClick={() => void inviteAgain(m)}>{f.t.memberInviteAgain}</f.Button>}\n {removable && <f.Button type=\"button\" variant=\"danger\" loading={f.loading(`remove:${m.userId}`)} disabled={f.busy} className={f.cx('providerButton')} onClick={() => ask(m.userId, action, question, () => void remove(m))}>{action}</f.Button>}\n </>\n )}\n </li>\n )\n })}\n </ul>\n )}\n {done && <Say f={f} tone=\"success\">{done}</Say>}\n </Wrap>\n {manage && giveable.length > 0 && (addOpen ? (\n <Wrap f={f} as=\"form\" slot=\"section\" section=\"add-member\" onSubmit={add} noValidate>\n <Heading f={f}>{f.t.memberAdd}</Heading>\n <Field f={f} name=\"email\" type=\"email\" label={f.t.email} value={email} autoComplete=\"off\" required onChange={setEmail} />\n <AddRole f={f} value={role} options={giveable.map((c) => ({ value: c.role, label: roleName(c) }))} onChange={setRole} />\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading('add')} disabled={f.busy} className={f.cx('button')}>{f.t.memberAdd}</f.Button>\n {!alone && <Cancel f={f} onClick={cancelAdd} />}\n </Wrap>\n ) : (\n <Wrap f={f} as=\"div\" slot=\"section\" section=\"add-member\">\n <f.Button type=\"button\" variant=\"secondary\" disabled={f.busy} className={f.cx('providerButton')} onClick={() => open('add')}>{f.t.memberAdd}</f.Button>\n </Wrap>\n ))}\n {(renaming || archiving || deleting) && (\n <Wrap f={f} as=\"section\" slot=\"section\" section=\"organization\">\n <Heading f={f}>{f.t.organization}</Heading>\n {renaming && (renamingOpen ? (\n <Wrap f={f} as=\"form\" section=\"rename\" onSubmit={rename} noValidate>\n <Field f={f} name=\"name\" type=\"text\" label={f.t.name} value={name} autoComplete=\"organization\" required onChange={setName} />\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading('rename')} disabled={f.busy} className={f.cx('button')}>{f.t.organizationRename}</f.Button>\n <Cancel f={f} onClick={cancelRename} />\n </Wrap>\n ) : (\n <>\n <Note f={f}>{seat.name}</Note>\n <f.Button type=\"button\" variant=\"secondary\" disabled={f.busy} className={f.cx('providerButton')} onClick={() => open('rename')}>{f.t.organizationRename}</f.Button>\n </>\n ))}\n {asking === 'archive' ? confirming(archiveQuestion, f.t.organizationArchive, () => void close('archive'))\n : asking === 'delete' ? confirming(deleteQuestion, f.t.organizationDelete, () => void close('delete'))\n : (\n <>\n {archiving && <f.Button type=\"button\" variant=\"danger\" loading={f.loading('archive')} disabled={f.busy} className={f.cx('providerButton')} onClick={() => ask('archive', f.t.organizationArchive, archiveQuestion, () => void close('archive'))}>{f.t.organizationArchive}</f.Button>}\n {deleting && <f.Button type=\"button\" variant=\"danger\" loading={f.loading('delete')} disabled={f.busy} className={f.cx('providerButton')} onClick={() => ask('delete', f.t.organizationDelete, deleteQuestion, () => void close('delete'))}>{f.t.organizationDelete}</f.Button>}\n </>\n )}\n </Wrap>\n )}\n </Wrap>\n )\n}\n\n/** The role a new member gets, labelled like the address above it. */\nfunction AddRole({ f, value, options, onChange }: { f: Form; value: string; options: { value: string; label: string }[]; onChange: (role: string) => void }) {\n const id = useId()\n return (\n <Labelled f={f} id={id} label={f.t.memberRole}>\n <Pick f={f} id={id} name=\"role\" value={value} options={options} onChange={onChange} />\n </Labelled>\n )\n}\n\n/**\n * The account's passkeys: made and removed on this page. A page that cannot\n * use the workspace's passkeys links to Cauthy's account page instead.\n */\nfunction PasskeysPart({ props, account, accountUrl, when }: { props: AccountProps; account: AccountDetails; accountUrl: string; when: (iso: string) => string }) {\n const auth = useAuth()\n const { f, done, setDone, run, general } = useSection(props)\n const [here, setHere] = useState<boolean | null>(null)\n const [list, setList] = useState<Passkey[]>([])\n const [name, setName] = useState('')\n const [password, setPassword] = useState('')\n // With a passkey already there, the form to add another opens on \"Add a passkey\".\n const [adding, setAdding] = useState(false)\n useEffect(() => {\n void auth.methods().then((m) => {\n const can = m.passkeyHere && canUsePasskeys()\n setHere(can)\n if (can) void auth.account.passkeys().then(setList)\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n if (here === null) return null\n if (!here) {\n return (\n <Wrap f={f} as=\"section\" slot=\"section\" section=\"passkeys\">\n <Heading f={f}>{f.t.passkeys}</Heading>\n <A f={f} href={accountUrl}>{f.t.managePasskeys}</A>\n </Wrap>\n )\n }\n const add = async (e: FormEvent | null, kind: 'device' | 'security_key' = 'device') => {\n e?.preventDefault()\n if (account.hasPassword && !f.check(checkPassword(password))) return\n const r = await run(() => auth.account.addPasskey({ name, password, kind }), kind === 'security_key' ? 'security_key' : SUBMIT)\n if (!r.ok) {\n // The person closed the browser's prompt: nothing to say.\n if (r.error.code === 'cancelled') f.setError(null)\n return\n }\n setList([...list, r.passkey])\n setName('')\n setPassword('')\n setAdding(false)\n setDone(f.t.passkeyAdded)\n props.onSaved?.({ kind: 'passkey.added', id: r.passkey.id })\n }\n const remove = async (id: string) => {\n const r = await run(() => auth.account.removePasskey(id), `remove:${id}`)\n if (!r.ok) return\n setList(list.filter((p) => p.id !== id))\n props.onSaved?.({ kind: 'passkey.removed', id })\n }\n const cancel = () => {\n setName('')\n setPassword('')\n f.setError(null)\n setAdding(false)\n }\n const listed = list.length === 0 ? <Note f={f}>{f.t.noPasskeys}</Note> : (\n <ul className={f.cx('sessions')}>\n {list.map((p) => (\n <li key={p.id} className={f.cx('session')}>\n {p.name || f.t.passkeyUnnamed}\n {p.kind !== 'unknown' && <Tag f={f} plain={` · ${f.t.passkeyKinds[p.kind]}`}>{f.t.passkeyKinds[p.kind]}</Tag>} · {when(p.createdAt)}{' '}\n <f.Button type=\"button\" variant=\"danger\" loading={f.loading(`remove:${p.id}`)} disabled={f.busy} className={f.cx('providerButton')} onClick={() => void remove(p.id)}>{f.t.removePasskey}</f.Button>\n </li>\n ))}\n </ul>\n )\n // Passkeys already there: the list, and the action that opens the form.\n if (list.length > 0 && !adding) {\n return (\n <Wrap f={f} as=\"div\" slot=\"section\" section=\"passkeys\">\n <Heading f={f}>{f.t.passkeys}</Heading>\n <Note f={f}>{f.t.passkeysHelp}</Note>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n {listed}\n <f.Button type=\"button\" variant=\"secondary\" disabled={f.busy} className={f.cx('providerButton')} onClick={() => { setDone(null); f.setError(null); setAdding(true) }}>{f.t.addAnotherPasskey}</f.Button>\n {done && <Say f={f} tone=\"success\">{done}</Say>}\n </Wrap>\n )\n }\n return (\n <Wrap f={f} as=\"form\" slot=\"section\" section=\"passkeys\" onSubmit={add} noValidate>\n <Heading f={f}>{f.t.passkeys}</Heading>\n <Note f={f}>{f.t.passkeysHelp}</Note>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n {listed}\n <Field f={f} name=\"name\" type=\"text\" label={f.t.passkeyName} value={name} autoComplete=\"off\" onChange={setName} />\n {account.hasPassword && (\n <Field f={f} name=\"password\" type=\"password\" label={f.t.currentPassword} value={password} autoComplete=\"current-password\" required onChange={setPassword} />\n )}\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.addPasskeyDevice}</f.Button>\n <f.Button type=\"button\" variant=\"secondary\" loading={f.loading('security_key')} disabled={f.busy} className={f.cx('providerButton')} onClick={() => void add(null, 'security_key')}>{f.t.addSecurityKey}</f.Button>\n {list.length > 0 && <Cancel f={f} onClick={cancel} />}\n {done && <Say f={f} tone=\"success\">{done}</Say>}\n </Wrap>\n )\n}\n\n/** Back from a part's form to what is set, with nothing sent. */\nfunction Cancel({ f, onClick }: { f: Form; onClick: () => void }) {\n return <f.Button type=\"button\" variant=\"secondary\" disabled={f.busy} className={f.cx('providerButton')} onClick={onClick}>{f.t.cancel}</f.Button>\n}\n\n/**\n * Recovery codes just made, with \"Copy all\" and \"Download .txt\". The codes go\n * to the clipboard or to a file the person saves: never to a log, and never\n * to the browser's storage.\n */\nfunction RecoveryCodes({ f, codes }: { f: Form; codes: string[] }) {\n const [copied, setCopied] = useState<boolean | null>(null)\n useEffect(() => setCopied(null), [codes])\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(codes.join('\\n'))\n setCopied(true)\n } catch {\n // No clipboard here, or the browser refused it: the codes stay on screen to select.\n setCopied(false)\n }\n }\n const download = () => {\n const file = new Blob([`${f.t.recoveryCodes}\\n\\n${codes.join('\\n')}\\n`], { type: 'text/plain;charset=utf-8' })\n const url = URL.createObjectURL(file)\n const a = document.createElement('a')\n a.href = url\n a.download = 'recovery-codes.txt'\n document.body.appendChild(a)\n a.click()\n a.remove()\n // Freed once the browser took the file.\n setTimeout(() => URL.revokeObjectURL(url), 0)\n }\n return (\n <>\n <Note f={f}>{f.t.keepCodes}</Note>\n <ul className={f.cx('codes')}>{codes.map((c) => <li key={c}><code>{c}</code></li>)}</ul>\n <f.Button type=\"button\" variant=\"secondary\" className={f.cx('providerButton')} onClick={() => void copy()}>{f.t.copyCodes}</f.Button>\n <f.Button type=\"button\" variant=\"secondary\" className={f.cx('providerButton')} onClick={download}>{f.t.downloadCodes}</f.Button>\n {copied === true && <Say f={f} tone=\"success\">{f.t.codesCopied}</Say>}\n {copied === false && <Say f={f} tone=\"danger\">{f.t.codesNotCopied}</Say>}\n </>\n )\n}\n\nfunction ProfilePart({ props, account, onSaved }: { props: AccountProps; account: AccountDetails; onSaved: (a: AccountDetails) => void }) {\n const auth = useAuth()\n const { f, done, setDone, run, general } = useSection(props)\n const [name, setName] = useState(account.name)\n // A name already set shows as it is; its form opens with \"Change\".\n const [editing, setEditing] = useState(account.name.trim() === '')\n const submit = async (e: FormEvent) => {\n e.preventDefault()\n const r = await run(() => auth.account.update({ name }))\n if (!r.ok) return\n onSaved(r.account)\n setName(r.account.name)\n setEditing(r.account.name.trim() === '')\n setDone(f.t.saved)\n props.onSaved?.({ kind: 'profile.saved', name: r.account.name })\n }\n const cancel = () => {\n setName(account.name)\n f.setError(null)\n setEditing(false)\n }\n if (!editing) {\n return (\n <Wrap f={f} as=\"div\" slot=\"section\" section=\"profile\">\n <Heading f={f}>{f.t.profile}</Heading>\n <Note f={f}>{account.name}</Note>\n <Note f={f}>{account.email}</Note>\n <f.Button type=\"button\" variant=\"secondary\" disabled={f.busy} className={f.cx('providerButton')} onClick={() => { setDone(null); setEditing(true) }}>{f.t.change}</f.Button>\n {done && <Say f={f} tone=\"success\">{done}</Say>}\n </Wrap>\n )\n }\n return (\n <Wrap f={f} as=\"form\" slot=\"section\" section=\"profile\" onSubmit={submit} noValidate>\n <Heading f={f}>{f.t.profile}</Heading>\n <Note f={f}>{account.email}</Note>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <Field f={f} name=\"name\" type=\"text\" label={f.t.name} value={name} autoComplete=\"name\" onChange={setName} />\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.save}</f.Button>\n {account.name.trim() !== '' && <Cancel f={f} onClick={cancel} />}\n {done && <Say f={f} tone=\"success\">{done}</Say>}\n </Wrap>\n )\n}\n\n// The address is always set: it shows, and its form opens with \"Change email\".\nfunction EmailPart({ props, account }: { props: AccountProps; account: AccountDetails }) {\n const auth = useAuth()\n const { f, done, setDone, run, general } = useSection(props)\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [editing, setEditing] = useState(false)\n const submit = async (e: FormEvent) => {\n e.preventDefault()\n if (!f.check(checkEmail(email), account.hasPassword && checkPassword(password))) return\n const r = await run(() => auth.account.changeEmail({ email, password }))\n if (!r.ok) return\n setEmail('')\n setPassword('')\n setEditing(false)\n setDone(f.t.emailSent.replace('{email}', r.email))\n props.onSaved?.({ kind: 'email.change_requested', email: r.email })\n }\n const cancel = () => {\n setEmail('')\n setPassword('')\n f.setError(null)\n setEditing(false)\n }\n if (!editing) {\n return (\n <Wrap f={f} as=\"div\" slot=\"section\" section=\"email\">\n <Heading f={f}>{f.t.emailAddress}</Heading>\n <Note f={f}>{account.email}</Note>\n <f.Button type=\"button\" variant=\"secondary\" disabled={f.busy} className={f.cx('providerButton')} onClick={() => { setDone(null); setEditing(true) }}>{f.t.changeEmail}</f.Button>\n {done && <Say f={f} tone=\"success\">{done}</Say>}\n </Wrap>\n )\n }\n return (\n <Wrap f={f} as=\"form\" slot=\"section\" section=\"email\" onSubmit={submit} noValidate>\n <Heading f={f}>{f.t.emailAddress}</Heading>\n <Note f={f}>{account.email}</Note>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <Field f={f} name=\"email\" type=\"email\" label={f.t.newEmail} value={email} autoComplete=\"email\" required onChange={setEmail} />\n {account.hasPassword && (\n <Field f={f} name=\"password\" type=\"password\" label={f.t.currentPassword} value={password} autoComplete=\"current-password\" required onChange={setPassword} />\n )}\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.changeEmail}</f.Button>\n <Cancel f={f} onClick={cancel} />\n </Wrap>\n )\n}\n\n/** The providers the account signs in with, and the ones the workspace offers to link. */\nfunction LinkedPart({ props }: { props: AccountProps }) {\n const auth = useAuth()\n const { f, run, general } = useSection(props)\n const [linked, setLinked] = useState<LinkedIdentity[] | null>(null)\n const [offered, setOffered] = useState<{ id: string; name: string }[]>([])\n const [came, setCame] = useState<string | null>(null)\n useEffect(() => {\n void auth.account.identities().then(setLinked)\n void auth.methods().then((m) => setOffered(m.providers))\n // Back from a provider: say how it went, once.\n const back = typeof window === 'undefined' ? null : new URLSearchParams(window.location.search)\n const provider = back?.get('linked')\n if (provider) {\n setCame(provider)\n props.onSaved?.({ kind: 'identity.linked', provider })\n }\n else if (back?.get('auth_error')) f.setError({ code: back.get('auth_error') as string, message: 'That account could not be linked. Try again.' })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n if (linked === null) return null\n const name = (id: string) => offered.find((p) => p.id === id)?.name ?? id\n const unlink = async (provider: string) => {\n const r = await run(() => auth.account.unlink(provider), `unlink:${provider}`)\n if (!r.ok) return\n setLinked(linked.filter((x) => x.provider !== provider))\n props.onSaved?.({ kind: 'identity.unlinked', provider })\n }\n const here = typeof window === 'undefined' ? undefined : window.location.pathname\n return (\n <Wrap f={f} as=\"section\" slot=\"section\" section=\"linked\">\n <Heading f={f}>{f.t.linkedAccounts}</Heading>\n {came && <Say f={f} tone=\"success\">{f.t.linked}</Say>}\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n {linked.length === 0 ? <Note f={f}>{f.t.noLinkedAccounts}</Note> : (\n <ul className={f.cx('sessions')}>\n {linked.map((x) => (\n <li key={x.provider} className={f.cx('session')}>\n {name(x.provider)}{x.email ? ` · ${x.email}` : ''}{' '}\n <f.Button type=\"button\" variant=\"danger\" loading={f.loading(`unlink:${x.provider}`)} disabled={f.busy} className={f.cx('providerButton')} onClick={() => void unlink(x.provider)}>{f.t.unlink}</f.Button>\n </li>\n ))}\n </ul>\n )}\n {offered.filter((p) => !linked.some((x) => x.provider === p.id)).map((p) => (\n <f.Button key={p.id} type=\"button\" variant=\"secondary\" loading={f.loading(`link:${p.id}`)} disabled={f.busy} className={f.cx('providerButton')}\n onClick={() => { f.setBusy(`link:${p.id}`); auth.account.link(p.id, { returnTo: here }) }}>{f.t.linkWith} {p.name}</f.Button>\n ))}\n </Wrap>\n )\n}\n\n// Shown only for an account with a password: it says so, and its form opens with \"Change password\".\nfunction PasswordPart({ props }: { props: AccountProps }) {\n const auth = useAuth()\n const { f, done, setDone, run, general } = useSection(props)\n const [password, setPassword] = useState('')\n const [newPassword, setNewPassword] = useState('')\n const [editing, setEditing] = useState(false)\n usePasswordPolicy(f, useMethods(auth))\n const submit = async (e: FormEvent) => {\n e.preventDefault()\n if (!f.check(checkPassword(password), newPasswordProblem(newPassword, f.policy, 'newPassword'))) return\n const r = await run(() => auth.account.changePassword({ password, newPassword }))\n if (!r.ok) return\n setPassword('')\n setNewPassword('')\n setEditing(false)\n setDone(f.t.passwordChangedHere)\n props.onSaved?.({ kind: 'password.changed' })\n }\n const cancel = () => {\n setPassword('')\n setNewPassword('')\n f.setError(null)\n setEditing(false)\n }\n if (!editing) {\n return (\n <Wrap f={f} as=\"div\" slot=\"section\" section=\"password\">\n <Heading f={f}>{f.t.password}</Heading>\n <Note f={f}>{f.t.passwordSet}</Note>\n <f.Button type=\"button\" variant=\"secondary\" disabled={f.busy} className={f.cx('providerButton')} onClick={() => { setDone(null); setEditing(true) }}>{f.t.changePassword}</f.Button>\n {done && <Say f={f} tone=\"success\">{done}</Say>}\n </Wrap>\n )\n }\n return (\n <Wrap f={f} as=\"form\" slot=\"section\" section=\"password\" onSubmit={submit} noValidate>\n <Heading f={f}>{f.t.password}</Heading>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <Field f={f} name=\"password\" type=\"password\" label={f.t.currentPassword} value={password} autoComplete=\"current-password\" required onChange={setPassword} />\n <Field f={f} name=\"newPassword\" type=\"password\" label={f.t.newPassword} value={newPassword} autoComplete=\"new-password\" required onChange={setNewPassword} hint={f.passwordRule} />\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.changePassword}</f.Button>\n <Cancel f={f} onClick={cancel} />\n </Wrap>\n )\n}\n\n// Off: the steps that turn it on. On: what is on, with \"Turn off\" and \"New\n// recovery codes\"; each asks for the current password only once pressed.\nfunction SecondStepPart({ props, account, onChanged }: { props: AccountProps; account: AccountDetails; onChanged: (on: boolean) => void }) {\n const auth = useAuth()\n const { f, run, general } = useSection(props)\n const [password, setPassword] = useState('')\n const [code, setCode] = useState('')\n const [setup, setSetup] = useState<{ secret: string; otpauthUri: string; qr: string } | null>(null)\n const [codes, setCodes] = useState<string[] | null>(null)\n // The action pressed while the second step is on, waiting for the password.\n const [asking, setAsking] = useState<'off' | 'codes' | null>(null)\n\n const start = async (e: FormEvent) => {\n e.preventDefault()\n const r = await run(() => auth.account.mfa.setup({ password }))\n if (r.ok) setSetup({ secret: r.secret, otpauthUri: r.otpauthUri, qr: r.qr ?? '' })\n }\n const confirm = async (e: FormEvent) => {\n e.preventDefault()\n const r = await run(() => auth.account.mfa.verify({ code }))\n if (!r.ok) return\n setSetup(null)\n setCode('')\n setPassword('')\n setCodes(r.recoveryCodes)\n onChanged(true)\n props.onSaved?.({ kind: 'mfa.enabled' })\n }\n const turnOff = async (key: string) => {\n const r = await run(() => auth.account.mfa.disable({ password }), key)\n if (!r.ok) return\n setPassword('')\n setAsking(null)\n setCodes(null)\n onChanged(false)\n props.onSaved?.({ kind: 'mfa.disabled' })\n }\n const renew = async (key: string) => {\n const r = await run(() => auth.account.mfa.recoveryCodes({ password }), key)\n if (!r.ok) return\n setPassword('')\n setAsking(null)\n setCodes(r.recoveryCodes)\n props.onSaved?.({ kind: 'recovery_codes.regenerated' })\n }\n // An account without a password has nothing to ask: the action runs at once.\n const press = (what: 'off' | 'codes') => {\n f.setError(null)\n if (!account.hasPassword) return void (what === 'off' ? turnOff(what) : renew(what))\n setPassword('')\n setCodes(null)\n setAsking(what)\n }\n const cancel = () => {\n setPassword('')\n f.setError(null)\n setAsking(null)\n }\n const passwordField = account.hasPassword && (\n <Field f={f} name=\"password\" type=\"password\" label={f.t.currentPassword} value={password} autoComplete=\"current-password\" required onChange={setPassword} />\n )\n\n if (setup) {\n return (\n <Wrap f={f} as=\"form\" slot=\"section\" section=\"secondStep\" onSubmit={confirm} noValidate>\n <Heading f={f}>{f.t.secondStep}</Heading>\n <Note f={f}>{f.t.addToApp}</Note>\n {setup.qr && <img className={f.cx('qr')} src={setup.qr} width={220} height={220} alt={f.t.qrAlt} />}\n <code className={f.cx('secret')}>{setup.secret}</code>\n <A f={f} href={setup.otpauthUri}>{f.t.openInApp}</A>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <Field f={f} name=\"code\" type=\"text\" label={f.t.code} value={code} autoComplete=\"one-time-code\" required onChange={setCode} />\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.verify}</f.Button>\n </Wrap>\n )\n }\n if (!account.mfaEnabled) {\n return (\n <Wrap f={f} as=\"form\" slot=\"section\" section=\"secondStep\" onSubmit={start} noValidate>\n <Heading f={f}>{f.t.secondStep}</Heading>\n <Note f={f}>{f.t.secondStepOff}</Note>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n {passwordField}\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.turnOn}</f.Button>\n </Wrap>\n )\n }\n if (asking) {\n const submit = (e: FormEvent) => {\n e.preventDefault()\n void (asking === 'off' ? turnOff(SUBMIT) : renew(SUBMIT))\n }\n return (\n <Wrap f={f} as=\"form\" slot=\"section\" section=\"secondStep\" onSubmit={submit} noValidate>\n <Heading f={f}>{f.t.secondStep}</Heading>\n <Note f={f}>{f.t.secondStepOn}</Note>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n {passwordField}\n <f.Button type=\"submit\" variant={asking === 'off' ? 'danger' : 'primary'} loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{asking === 'off' ? f.t.turnOff : f.t.newRecoveryCodes}</f.Button>\n <Cancel f={f} onClick={cancel} />\n </Wrap>\n )\n }\n return (\n <Wrap f={f} as=\"div\" slot=\"section\" section=\"secondStep\">\n <Heading f={f}>{f.t.secondStep}</Heading>\n <Note f={f}>{f.t.secondStepOn}</Note>\n {codes && <RecoveryCodes f={f} codes={codes} />}\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <f.Button type=\"button\" variant=\"danger\" loading={f.loading('off')} disabled={f.busy} className={f.cx('button')} onClick={() => press('off')}>{f.t.turnOff}</f.Button>\n <f.Button type=\"button\" variant=\"secondary\" loading={f.loading('codes')} disabled={f.busy} className={f.cx('providerButton')} onClick={() => press('codes')}>{f.t.newRecoveryCodes}</f.Button>\n </Wrap>\n )\n}\n\n// The phone as the second step, where the workspace sends codes to phones:\n// added with the password, proven with the code it receives. Once there, it\n// shows (masked, with its channel) and \"Remove phone\" asks for the password.\nfunction PhonePart({ props, account, onChanged }: { props: AccountProps; account: AccountDetails; onChanged: (on: boolean) => void }) {\n const auth = useAuth()\n const { f, run, general } = useSection(props)\n const [ways, setWays] = useState<SecondStep | null>(null)\n const [number, setNumber] = useState('')\n const [channel, setChannel] = useState<'sms' | 'whatsapp'>('sms')\n const [password, setPassword] = useState('')\n const [code, setCode] = useState('')\n const [sentTo, setSentTo] = useState('')\n const [codes, setCodes] = useState<string[] | null>(null)\n const [removing, setRemoving] = useState(false)\n const load = () => auth.account.mfa.factors().then((w) => {\n setWays(w)\n if (w && w.phoneChannels.length > 0 && !w.phoneChannels.includes(channel)) setChannel(w.phoneChannels[0] as 'sms' | 'whatsapp')\n })\n useEffect(() => {\n void load()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n if (!ways || ways.phoneChannels.length === 0) return null\n\n const add = async (e: FormEvent) => {\n e.preventDefault()\n const r = await run(() => auth.account.mfa.addPhone({ phone: number, channel, password }))\n if (r.ok) setSentTo(r.sentTo)\n }\n const confirm = async (e: FormEvent) => {\n e.preventDefault()\n const r = await run(() => auth.account.mfa.verifyPhone({ code }))\n if (!r.ok) return\n setSentTo('')\n setCode('')\n setPassword('')\n setNumber('')\n if (r.recoveryCodes.length > 0) setCodes(r.recoveryCodes)\n onChanged(true)\n props.onSaved?.({ kind: 'phone.added', channel })\n await load()\n }\n const remove = async (key: string) => {\n const r = await run(() => auth.account.mfa.removePhone({ password }), key)\n if (!r.ok) return\n setPassword('')\n setRemoving(false)\n setCodes(null)\n await load()\n const left = await auth.account.mfa.factors()\n onChanged(Boolean(left?.totp))\n props.onSaved?.({ kind: 'phone.removed' })\n }\n // An account without a password has nothing to ask: the phone goes at once.\n const press = () => {\n f.setError(null)\n if (!account.hasPassword) return void remove('remove')\n setPassword('')\n setRemoving(true)\n }\n const cancel = () => {\n setPassword('')\n f.setError(null)\n setRemoving(false)\n }\n const passwordField = account.hasPassword && (\n <Field f={f} name=\"password\" type=\"password\" label={f.t.currentPassword} value={password} autoComplete=\"current-password\" required onChange={setPassword} />\n )\n if (sentTo) {\n return (\n <Wrap f={f} as=\"form\" slot=\"section\" section=\"phone\" onSubmit={confirm} noValidate>\n <Heading f={f}>{f.t.phone}</Heading>\n <Note f={f}>{f.t.codeSent.replace('{to}', sentTo)}</Note>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <Field f={f} name=\"code\" type=\"text\" label={f.t.code} value={code} autoComplete=\"one-time-code\" required onChange={setCode} />\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.verify}</f.Button>\n </Wrap>\n )\n }\n if (ways.phone) {\n const by = ways.phone.channel === 'whatsapp' ? f.t.byWhatsapp : ways.phone.channel === 'sms' ? f.t.bySms : ''\n const on = (\n <Note f={f}>\n {f.t.phoneOn.replace('{to}', ways.phone.number)}\n {by && <Tag f={f} plain={` · ${by}`}>{by}</Tag>}\n </Note>\n )\n if (removing) {\n return (\n <Wrap f={f} as=\"form\" slot=\"section\" section=\"phone\" onSubmit={(e) => { e.preventDefault(); void remove(SUBMIT) }} noValidate>\n <Heading f={f}>{f.t.phone}</Heading>\n {on}\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n {passwordField}\n <f.Button type=\"submit\" variant=\"danger\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.removePhone}</f.Button>\n <Cancel f={f} onClick={cancel} />\n </Wrap>\n )\n }\n return (\n <Wrap f={f} as=\"div\" slot=\"section\" section=\"phone\">\n <Heading f={f}>{f.t.phone}</Heading>\n {on}\n {codes && <RecoveryCodes f={f} codes={codes} />}\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <f.Button type=\"button\" variant=\"danger\" loading={f.loading('remove')} disabled={f.busy} className={f.cx('button')} onClick={press}>{f.t.removePhone}</f.Button>\n </Wrap>\n )\n }\n return (\n <Wrap f={f} as=\"form\" slot=\"section\" section=\"phone\" onSubmit={add} noValidate>\n <Heading f={f}>{f.t.phone}</Heading>\n <Note f={f}>{`${f.t.phoneOff} ${f.t.phoneHelp}`}</Note>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <Field f={f} name=\"phone\" type=\"tel\" label={f.t.phone} value={number} autoComplete=\"tel\" required onChange={setNumber} />\n {ways.phoneChannels.length > 1 && f.C.Select && (\n <ChannelPick f={f} value={channel} channels={ways.phoneChannels as ('sms' | 'whatsapp')[]} onChange={setChannel} />\n )}\n {ways.phoneChannels.length > 1 && !f.C.Select && (\n <div className={f.cx('field')} role=\"radiogroup\">\n {(ways.phoneChannels as ('sms' | 'whatsapp')[]).map((c) => (\n <label key={c} className={f.cx('label')}>\n <input type=\"radio\" name=\"channel\" value={c} checked={channel === c} disabled={f.busy} onChange={() => setChannel(c)} /> {c === 'whatsapp' ? f.t.byWhatsapp : f.t.bySms}\n </label>\n ))}\n </div>\n )}\n {passwordField}\n <f.Button type=\"submit\" variant=\"primary\" loading={f.loading()} disabled={f.busy} className={f.cx('button')}>{f.t.addPhone}</f.Button>\n </Wrap>\n )\n}\n\n/** The AI agents the person connected. Shown only when there is one. */\nfunction AgentsPart({ props, when }: { props: AccountProps; when: (iso: string) => string }) {\n const auth = useAuth()\n const { f, run, general } = useSection(props)\n const [list, setList] = useState<ConnectedAgent[]>([])\n useEffect(() => {\n void auth.account.agents().then(setList)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n if (list.length === 0) return null\n const disconnect = async (id: string) => {\n const r = await run(() => auth.account.disconnectAgent(id), `disconnect:${id}`)\n if (!r.ok) return\n setList(list.filter((a) => a.id !== id))\n props.onSaved?.({ kind: 'agent.disconnected', id })\n }\n return (\n <Wrap f={f} as=\"section\" slot=\"section\" section=\"agents\">\n <Heading f={f}>{f.t.agents}</Heading>\n <Note f={f}>{f.t.agentsHelp}</Note>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <ul className={f.cx('sessions')}>\n {list.map((a) => (\n <li key={a.id} className={f.cx('session')}>\n {a.name || f.t.anAgent}{a.redirectHost ? ` (${a.redirectHost})` : ''} → {a.resource.name}\n {a.scopes.length > 0 ? ` · ${a.scopes.map((s) => s.description || s.name).join(', ')}` : ''} · {when(a.lastUsedAt)}{' '}\n <f.Button type=\"button\" variant=\"danger\" loading={f.loading(`disconnect:${a.id}`)} disabled={f.busy} className={f.cx('providerButton')} onClick={() => void disconnect(a.id)}>{f.t.disconnect}</f.Button>\n </li>\n ))}\n </ul>\n </Wrap>\n )\n}\n\n/** Where the person is signed in, and \"sign out everywhere\". */\nfunction SessionsPart({ props, when }: { props: AccountProps; when: (iso: string) => string }) {\n const auth = useAuth()\n const { f, run, general } = useSection(props)\n const [sessions, setSessions] = useState<AccountSession[]>([])\n useEffect(() => {\n void auth.account.sessions().then(setSessions)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n const end = async () => {\n const r = await run(() => auth.account.signOutEverywhere(), SUBMIT, true)\n if (!r.ok) return\n props.onSaved?.({ kind: 'sessions.ended' })\n // Signed out: the button loads until the page is left, or the application's own way on settles.\n if (props.onSignedOut) f.hold(props.onSignedOut())\n else window.location.assign('/')\n }\n return (\n <Wrap f={f} as=\"section\" slot=\"section\" section=\"sessions\">\n <Heading f={f}>{f.t.sessions}</Heading>\n <ul className={f.cx('sessions')}>\n {sessions.map((s, i) => (\n <li key={i} className={f.cx('session')}>{s.device || f.t.unknownDevice} · {s.ip} · {when(s.createdAt)}</li>\n ))}\n </ul>\n {general && <Say f={f} tone=\"danger\">{f.say(general)}</Say>}\n <f.Button type=\"button\" variant=\"danger\" loading={f.loading()} disabled={f.busy} className={f.cx('button')} onClick={() => void end()}>{f.t.signOutEverywhere}</f.Button>\n </Wrap>\n )\n}\n\n/** The channel phone codes go by, with the application's select. */\nfunction ChannelPick({ f, value, channels, onChange }: { f: Form; value: 'sms' | 'whatsapp'; channels: ('sms' | 'whatsapp')[]; onChange: (c: 'sms' | 'whatsapp') => void }) {\n const id = useId()\n return (\n <Labelled f={f} id={id} label={f.t.channel}>\n <Pick f={f} id={id} name=\"channel\" value={value} options={channels.map((c) => ({ value: c, label: c === 'whatsapp' ? f.t.byWhatsapp : f.t.bySms }))}\n onChange={(c) => onChange(c as 'sms' | 'whatsapp')} />\n </Labelled>\n )\n}\n","// @cauthyhq/react: Cauthy for React. Hooks over the session store of\n// @cauthyhq/js, headless parts, and ready-made ones in a default theme\n// (`import '@cauthyhq/react/styles.css'`).\n\nexport { CauthyProvider, useAuth, useSession, type CauthyProviderProps, type SessionContext } from './react'\nexport { useOrganizations, type UseOrganizations } from './organizations'\nexport { useSignInFlow } from './headless'\nexport { initialsOf, UserButton, type UserButtonProps, type UserButtonTexts } from './user-button'\nexport { Organizations, type OrganizationsProps } from './organizations-view'\nexport {\n AcceptInvite, Account, AccountAgents, AccountEmail, AccountLinked, AccountPasskeys, AccountPassword, AccountPhone, AccountProfile, AccountSecondStep, AccountSessions,\n ForgotPassword, GoogleOneTap, OrganizationMembers, PendingTerms, ResetPassword, SignIn, SignUp, VerifyEmail,\n type AcceptInviteEvent, type AcceptInviteProps, type AccountEvent, type AccountPartProps, type AccountProps, type AccountSection,\n type OrganizationMembersAction, type OrganizationMembersEvent, type OrganizationMembersProps, type PendingTermsProps,\n type AuthAlertProps, type AuthBadgeProps, type AuthButtonProps, type AuthCheckboxProps, type AuthComponents, type AuthConfirmOptions, type AuthDividerProps,\n type AuthFieldProps, type AuthFormLayoutProps, type AuthFormProps, type AuthInputProps, type AuthLinkProps, type AuthSelectProps, type AuthTextProps, type AuthTexts, type GoogleOneTapProps,\n} from './components'\nexport {\n can, canAutofillPasskeys, canUsePasskeys, createAuthClient, createSessionStore, createSignInFlow, definePolicy, unwrap, CauthyError,\n type Account as AccountDetails, type AccountClient, type AccountSession, type AuthClient, type AuthError, type AuthMethods, type AuthResult,\n type ConnectedAgent, type FlowState, type FlowStep, type Invitation, type JsonValue, type LinkedIdentity, type NextStep,\n type OrganizationPerson, type OrganizationRoleChoice, type OrganizationSeat, type OrganizationsClient, type Passkey, type PasskeyKind,\n type PendingLegal, type PermissionOf, type Policy, type PublicSession, type RoleOf, type SecondStep, type SessionOrganization,\n type SessionUser, type SignInFlow, type SSOConnection,\n} from '@cauthyhq/js'\nexport { themeFromCss, themeFromStackmyth, themeVariables, tokensFromStackmyth, type CauthyTheme } from '@cauthyhq/js/theme'\n"],"mappings":"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","names":["useCallback","useEffect","useMemo","useRef","useState","useState","useRef","useCallback","useEffect","useMemo","useMemo","useSyncExternalStore","useMemo","useSyncExternalStore","useEffect","useRef","useState","jsx","useState","useRef","useEffect","useId","useState","useCallback","useEffect","useId","useRef","useState","useSyncExternalStore","themeVariables","Fragment","jsx","jsxs","TEXTS","useSyncExternalStore","useState","useEffect","useRef","useCallback","Tag","useId","label","can","jsx","jsxs","TEXTS","useState","useId","canUsePasskeys","createAuthClient","createSessionStore","createSignInFlow","themeVariables"]}