@atlasauth/angular 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/esm2022/lib/atlas.config.mjs +1 -1
- package/dist/esm2022/lib/atlas.service.mjs +50 -9
- package/dist/esm2022/lib/components/flow-controller.mjs +9 -4
- package/dist/esm2022/lib/i18n.mjs +7 -1
- package/dist/esm2022/lib/version.mjs +4 -0
- package/dist/esm2022/public-api.mjs +4 -1
- package/dist/fesm2022/atlasauth-angular.mjs +67 -12
- package/dist/fesm2022/atlasauth-angular.mjs.map +1 -1
- package/dist/lib/atlas.config.d.ts +8 -0
- package/dist/lib/atlas.service.d.ts +16 -2
- package/dist/lib/version.d.ts +4 -0
- package/dist/public-api.d.ts +3 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atlasauth-angular.mjs","sources":["../../src/lib/atlas.config.ts","../../src/lib/appearance.ts","../../src/lib/i18n.ts","../../src/lib/atlas.service.ts","../../src/lib/directives/toggle.directive.ts","../../src/lib/directives/signed-in.directive.ts","../../src/lib/directives/signed-out.directive.ts","../../src/lib/directives/loading.directive.ts","../../src/lib/directives/loaded.directive.ts","../../src/lib/directives/protect.directive.ts","../../src/lib/directives/atlas-root.directive.ts","../../src/lib/directives/captcha-slot.directive.ts","../../src/lib/components/attempt-flow.component.ts","../../src/lib/components/flow-controller.ts","../../src/lib/components/sign-in.component.ts","../../src/lib/components/sign-up-form.component.ts","../../src/lib/components/sign-up.component.ts","../../src/lib/components/user-button.component.ts","../../src/lib/components/organization-switcher.component.ts","../../src/lib/components/user-profile.component.ts","../../src/lib/components/organization-profile.component.ts","../../src/lib/atlas.ui.ts","../../src/lib/provide-atlas.ts","../../src/lib/guards/atlas.guard.ts","../../src/lib/protect.ts","../../src/lib/types.ts","../../src/lib/fapi.ts","../../src/public-api.ts","../../src/atlasauth-angular.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport type { Appearance } from './appearance';\nimport type { Catalog } from './i18n';\n\n/**\n * Configuration for the Atlas Angular SDK — the Angular analogue of the props\n * passed to React's `<AtlasProvider>`.\n */\nexport interface AtlasOptions {\n /** The instance's publishable key (`pk_…`). Required. */\n publishableKey: string;\n /**\n * The instance's Frontend API: an absolute URL such as\n * `\"https://auth.example.com\"`, or `\"same-origin\"` / a path such as `\"/atlas\"`\n * behind a reverse proxy on the app's own origin (requests then go to\n * `/v1/...` on the app's host). Required at runtime — `AtlasService` throws an\n * `AtlasConfigError` (`FRONTEND_API_REQUIRED` / `FRONTEND_API_INVALID`) when\n * it is missing or malformed. Optional in the type only so existing call sites\n * keep compiling.\n */\n frontendApi?: string;\n /** Design tokens + per-element class overrides. See {@link Appearance}. */\n appearance?: Appearance;\n /** A localization catalog merged over `en-US`. */\n localization?: Catalog;\n /**\n * A `fetch` implementation to use instead of the global one — handy for SSR\n * or tests. Defaults to `globalThis.fetch`.\n */\n fetchImpl?: typeof fetch;\n}\n\n/**\n * DI token carrying the resolved {@link AtlasOptions}. Populated by\n * {@link provideAtlas} (standalone) or {@link AtlasModule.forRoot} (NgModule)\n * and read by {@link AtlasService}. Applications rarely inject this directly.\n */\nexport const ATLAS_OPTIONS = new InjectionToken<AtlasOptions>('ATLAS_OPTIONS');\n","/**\n * §10.3 theming.\n *\n * \"appearance prop: design tokens (colors, radius, font, spacing) + per-element\n * class overrides (elements: { formButtonPrimary: \"…\" }). No iframe — components\n * render in the host DOM so Tailwind/CSS just works.\"\n *\n * Rendering in the host DOM is the decision everything else follows from. An\n * iframe would isolate styles perfectly and be unusable: it cannot be sized to\n * its content reliably, it breaks password managers, it breaks autofill, and a\n * Tailwind class the customer writes has no effect inside it. Sharing the DOM\n * means the customer's CSS reaches our markup, which is exactly what they want\n * and what makes an override system necessary rather than decorative.\n *\n * Element classes are APPENDED to ours, never replacing them. A customer adding\n * `className=\"rounded-xl\"` wants a rounder button, not an unstyled one — and\n * replacement is a support burden where every override starts by rebuilding the\n * component's base styles from scratch.\n */\n\nimport {\n renderDesignAppearance,\n type AppearanceRender,\n type DesignAppearance,\n type DesignWarn,\n type InstanceDesign,\n} from '@atlasauth/design/runtime';\n\nexport { instanceDesignFrom } from '@atlasauth/design/runtime';\nexport type { AppearanceRender, AtlasDesign, InstanceDesign, PresetId } from '@atlasauth/design/runtime';\n\nexport interface DesignTokens {\n colorPrimary?: string;\n colorText?: string;\n colorBackground?: string;\n colorDanger?: string;\n colorBorder?: string;\n borderRadius?: string;\n fontFamily?: string;\n spacingUnit?: string;\n}\n\n/** Every element a customer may target. Named for what it IS, not where it sits. */\nexport type ElementKey =\n | 'root'\n | 'card'\n | 'headerTitle'\n | 'headerSubtitle'\n | 'formField'\n | 'formFieldLabel'\n | 'formFieldInput'\n | 'formFieldError'\n | 'formButtonPrimary'\n | 'formButtonSecondary'\n | 'socialButton'\n | 'dividerText'\n | 'footerAction'\n | 'avatar'\n | 'menu'\n | 'menuItem'\n | 'badge';\n\nexport interface Appearance extends DesignAppearance {\n /** A prebuilt token theme to start from (pre-design-system themes). */\n baseTheme?: keyof typeof THEMES;\n /**\n * Legacy design tokens. Without a design they set the `--atlas-*` variables\n * exactly as before; with one they map onto it.\n */\n variables?: DesignTokens;\n elements?: Partial<Record<ElementKey, string>>;\n // From DesignAppearance:\n // preset?: PresetId a design preset (replaces the dashboard design as the base)\n // design?: AtlasDesign structured overrides, highest precedence\n // instanceDesign?: boolean apply the dashboard design automatically (default true)\n}\n\nexport const DEFAULT_TOKENS: Required<DesignTokens> = {\n colorPrimary: '#5b5bd6',\n colorText: '#1c1c1f',\n colorBackground: '#ffffff',\n colorDanger: '#d64545',\n colorBorder: '#e4e4e9',\n borderRadius: '8px',\n fontFamily: 'ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif',\n spacingUnit: '4px',\n};\n\n/**\n * §10.3: \"prebuilt themes shipped (default, dark, neobrutalist as a demo of the\n * override system)\". Neobrutalist exists to prove the token set is expressive\n * enough for a theme that looks nothing like the default — a theming system\n * that only produces tasteful variations of itself is not a theming system.\n */\nexport const THEMES = {\n default: DEFAULT_TOKENS,\n dark: {\n ...DEFAULT_TOKENS,\n colorText: '#e6e9ef',\n colorBackground: '#14171c',\n colorBorder: '#242932',\n colorPrimary: '#6ea8fe',\n },\n neobrutalist: {\n ...DEFAULT_TOKENS,\n colorPrimary: '#ffe600',\n colorText: '#000000',\n colorBackground: '#ffffff',\n colorBorder: '#000000',\n borderRadius: '0px',\n fontFamily: '\"Courier New\", ui-monospace, monospace',\n },\n} as const satisfies Record<string, Required<DesignTokens>>;\n\n/**\n * Resolve tokens: defaults, then the base theme, then explicit variables.\n *\n * Later wins, and `undefined` never overwrites. A customer setting one variable\n * on the dark theme expects the other eleven to stay dark, not silently revert\n * to the light defaults.\n */\nexport function resolveTokens(appearance?: Appearance): Required<DesignTokens> {\n const base = appearance?.baseTheme ? THEMES[appearance.baseTheme] : DEFAULT_TOKENS;\n const overrides = appearance?.variables ?? {};\n\n const resolved = { ...DEFAULT_TOKENS, ...base };\n for (const [key, value] of Object.entries(overrides)) {\n if (value !== undefined) resolved[key as keyof DesignTokens] = value;\n }\n return resolved;\n}\n\n/** Tokens as CSS custom properties, for the host DOM to inherit. */\nexport function cssVariables(tokens: Required<DesignTokens>): Record<string, string> {\n const vars: Record<string, string> = {};\n for (const [key, value] of Object.entries(tokens)) {\n // camelCase → --atlas-kebab-case, which is what a customer writes in CSS.\n vars[`--atlas-${key.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`)}`] = value;\n }\n return vars;\n}\n\n/**\n * Combine our base class with the customer's override.\n *\n * Appended, never replaced — a customer adding `rounded-xl` wants a rounder\n * button, not an unstyled one. Theirs comes last so it wins on equal\n * specificity, which is the behaviour anyone writing Tailwind expects.\n */\nexport function classFor(\n element: ElementKey,\n appearance: Appearance | undefined,\n base: string,\n): string {\n const override = appearance?.elements?.[element];\n return override ? `${base} ${override}` : base;\n}\n\n// ---- the design system ---------------------------------------------------------\n\n/**\n * The legacy tokens the developer chose EXPLICITLY: a non-default `baseTheme`\n * plus `variables`. Only these map onto a design — the token defaults must not\n * overwrite the dashboard design.\n */\nexport function explicitTokens(appearance?: Appearance): DesignTokens {\n const out: DesignTokens = {};\n if (appearance?.baseTheme && appearance.baseTheme !== 'default') {\n Object.assign(out, THEMES[appearance.baseTheme]);\n }\n for (const [key, value] of Object.entries(appearance?.variables ?? {})) {\n if (value !== undefined) out[key as keyof DesignTokens] = value;\n }\n return out;\n}\n\n/**\n * Turn an `appearance` (+ the instance's dashboard design from the Frontend\n * API) into root attributes and a stylesheet — the same semantics as\n * `@atlasauth/react`. Precedence, lowest first: dashboard design < `preset` <\n * `variables` (and a non-default `baseTheme`) < `design`. Without a dashboard\n * design and without `preset`/`design`, the output is exactly the\n * pre-design-system one: the token variables, no stylesheet, no attributes.\n */\nexport function renderAppearance(\n appearance: Appearance | undefined,\n instanceDesign: InstanceDesign | null | undefined,\n options: { frontendApi?: string; warn?: DesignWarn } = {},\n): AppearanceRender {\n return renderDesignAppearance(appearance, instanceDesign, {\n tokens: explicitTokens(appearance),\n legacyStyle: () => cssVariables(resolveTokens(appearance)),\n frontendApi: options.frontendApi,\n warn: options.warn,\n });\n}\n","/**\n * §10.3: \"Every string passes through an i18n catalog; en-US ships, catalog\n * format documented for community locales.\"\n *\n * A flat key-to-string map rather than nested objects, because nesting looks\n * tidier and makes a missing key a runtime crash on `undefined.of.a.chain`\n * rather than a visible fallback.\n *\n * A missing key renders the KEY, not an empty string. A blank button is a bug\n * nobody can report; a button reading `signIn.submit` is one anyone can.\n */\n\nexport type Catalog = Record<string, string>;\n\nexport const EN_US: Catalog = {\n 'signIn.title': 'Sign in',\n 'signIn.subtitle': 'to continue to {application}',\n 'signIn.identifierLabel': 'Email address',\n 'signIn.passwordLabel': 'Password',\n 'signIn.submit': 'Continue',\n 'signIn.forgotPassword': 'Forgot password?',\n 'signIn.noAccount': 'No account?',\n 'signIn.signUpLink': 'Sign up',\n 'signIn.orDivider': 'or',\n 'signIn.socialButton': 'Continue with {provider}',\n 'signIn.emailCodeLabel': 'Verification code',\n 'signIn.useEmailCode': 'Email me a code',\n 'signIn.codeSentTo': 'We sent a code to {email}. Enter it below.',\n 'signIn.resendCode': 'Resend code',\n 'signIn.magicLinkSent': 'Check your email for a sign-in link.',\n 'signIn.checkOtherTab': 'You can close this tab — you are signed in where you started.',\n\n 'signUp.title': 'Create your account',\n 'signUp.submit': 'Continue',\n 'signUp.haveAccount': 'Already have an account?',\n 'signUp.signInLink': 'Sign in',\n 'signUp.emailLabel': 'Email address',\n 'signUp.passwordLabel': 'Password',\n 'signUp.optionalField': '{label} (optional)',\n 'signUp.selectPlaceholder': 'Select…',\n 'signUp.consentAgree': 'I agree to the',\n 'signUp.consentNotice': 'By continuing you agree to the',\n 'signUp.terms': 'Terms of Service',\n 'signUp.privacy': 'Privacy Policy',\n 'signUp.and': 'and',\n // = EMAIL_UNAVAILABLE_MESSAGE from @atlasauth/js.\n 'signUp.emailUnavailable':\n \"This app can't send email right now. Try another sign-in method or contact the app owner.\",\n\n 'captcha.prompt': 'Complete the security check to continue.',\n 'captcha.required': 'Please complete the security check, then try again.',\n 'captcha.failed': \"The security check didn't pass. Please try again.\",\n\n 'mfa.title': 'Two-step verification',\n 'mfa.subtitle': 'Enter the code from your authenticator app.',\n 'mfa.codeLabel': 'Code',\n 'mfa.enrollFirstCodeLabel': 'Code from your authenticator app',\n 'mfa.enrollSecondCodeLabel': 'The next code it shows',\n 'mfa.usePasskey': 'Use a passkey instead',\n 'mfa.useBackupCode': 'Use a recovery code',\n 'mfa.submit': 'Verify',\n\n 'reset.title': 'Reset your password',\n 'reset.submit': 'Send reset code',\n 'reset.newPasswordLabel': 'New password',\n\n 'userButton.manageAccount': 'Manage account',\n 'userButton.signOut': 'Sign out',\n 'userButton.signOutAll': 'Sign out of all devices',\n\n 'userProfile.title': 'Account',\n 'userProfile.profileSection': 'Profile',\n 'userProfile.emailsSection': 'Email addresses',\n 'userProfile.securitySection': 'Security',\n 'userProfile.devicesSection': 'Active devices',\n 'userProfile.dangerSection': 'Danger zone',\n 'userProfile.addEmail': 'Add an email address',\n 'userProfile.makePrimary': 'Make primary',\n 'userProfile.unverified': 'Unverified',\n 'userProfile.revokeDevice': 'Sign out',\n 'userProfile.deleteAccount': 'Delete account',\n\n 'organization.switcher': 'Switch organization',\n 'organization.personal': 'Personal account',\n 'organization.members': 'Members',\n 'organization.invite': 'Invite member',\n 'organization.roleLabel': 'Role',\n\n 'error.generic': 'Something went wrong. Please try again.',\n 'error.network': 'We could not reach the server. Check your connection.',\n\n // Server errors, by the stable `reason` the Frontend API sends. Shown instead\n // of the server's `message` (see `localizedErrorMessage` in @atlasauth/js).\n 'error.form_password_incorrect': 'Those credentials are incorrect.',\n 'error.form_code_incorrect': 'That code is incorrect.',\n 'error.form_code_already_used': 'That code has already been used. Wait for a new one.',\n 'error.form_code_expired': 'That code has expired. Request a new one.',\n 'error.form_code_max_attempts': 'Too many incorrect codes. Request a new code.',\n 'error.form_link_invalid': 'That sign-in link is invalid or has already been used.',\n 'error.form_identifier_not_found': \"We couldn't find an account with those details.\",\n 'error.form_identifier_exists': \"There's already an account for this email. Sign in with {methods}.\",\n 'error.form_password_pwned': 'This password has appeared in a known data breach. Please choose a different one.',\n 'error.form_password_too_short': 'Password must be at least {min_length} characters.',\n 'error.form_password_too_long': 'Password must be at most {max_length} characters.',\n 'error.form_password_requires_uppercase': 'Password must contain an uppercase letter.',\n 'error.form_password_requires_lowercase': 'Password must contain a lowercase letter.',\n 'error.form_password_requires_number': 'Password must contain a number.',\n 'error.form_password_requires_symbol': 'Password must contain a symbol.',\n 'error.form_password_not_allowed': 'That password is not allowed. Choose a different one.',\n 'error.form_password_contains_identifier': 'Password must not contain your email or username.',\n 'error.form_password_same_as_current': 'Your new password must be different from your current one.',\n 'error.form_password_reused': 'Your new password must not match any of your last {history_count} passwords.',\n 'error.password_expired': 'Your password has expired. Reset it to continue.',\n 'error.email_not_verified': 'Your email address is not verified yet. Verify it before signing in with your password.',\n 'error.sign_in_token_invalid': 'That sign-in token is invalid or has expired.',\n 'error.too_many_attempts': 'Too many failed attempts. Try again later.',\n 'error.too_many_requests': 'Too many requests. Please try again later.',\n 'error.captcha_required': 'Please complete the security check, then try again.',\n 'error.captcha_failed': \"The security check didn't pass. Please try again.\",\n 'error.captcha_unavailable': 'The security check is unavailable right now. Please try again later.',\n 'error.email_delivery_unavailable': \"This app can't send email right now. Try another sign-in method or contact the app owner.\",\n 'error.strategy_disabled': 'This sign-in method is not available for this app.',\n 'error.sign_up_restricted': 'Sign-up on this app is by invitation only.',\n 'error.waitlisted': \"You're on the waitlist. We'll email you when a place opens up.\",\n 'error.identifier_not_allowed': 'This email or phone number is not allowed on this app.',\n 'error.disposable_email_blocked': 'Sign-up with a disposable or temporary email address is not allowed.',\n 'error.sso_required': 'This organization requires signing in through single sign-on.',\n 'error.sign_ins_disabled': 'Sign-ins are temporarily disabled.',\n 'error.sign_ups_disabled': 'Sign-ups are temporarily disabled.',\n 'error.high_risk_blocked': 'This sign-in was blocked because it looked unusual.',\n 'error.sms_region_blocked': 'Text messages are not available for this phone number.',\n};\n\n/**\n * Look up a key and interpolate `{placeholders}`.\n *\n * An unknown placeholder is left visible for the same reason a missing key is:\n * `Continue with {provider}` in the UI is a bug report waiting to be filed,\n * whereas `Continue with ` is one nobody notices until a customer does.\n */\nexport function translate(\n catalog: Catalog,\n key: string,\n variables: Record<string, string> = {},\n): string {\n const template = catalog[key] ?? EN_US[key] ?? key;\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => variables[name] ?? match);\n}\n\n/** Merge a community locale over en-US so a partial translation still renders. */\nexport function withFallback(locale: Catalog): Catalog {\n return { ...EN_US, ...locale };\n}\n","import {\n Injectable,\n OnDestroy,\n PLATFORM_ID,\n Signal,\n computed,\n inject,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject, Observable, combineLatest } from 'rxjs';\nimport { distinctUntilChanged, map } from 'rxjs/operators';\nimport {\n FapiClient,\n SignOutGuard,\n catalogLocale,\n localizedErrorMessage,\n type ErrorLike,\n TokenCache,\n closeOAuthPopupAfterSignIn,\n completeOAuthPopupLanding,\n getProviderToken as fetchProviderToken,\n mapOAuthPopupPayload,\n msUntilRefresh,\n readExpiry,\n readRedirectResult,\n resolveFrontendApi,\n stripRedirectParams,\n type ProviderToken,\n type RedirectResult,\n type SignOutOptions,\n type SignOutResult,\n} from '@atlasauth/js';\nimport { evaluate, type ProtectCondition } from '@atlasauth/authz';\nimport { ATLAS_OPTIONS } from './atlas.config';\nimport {\n cssVariables,\n instanceDesignFrom,\n renderAppearance,\n resolveTokens,\n type Appearance,\n type AppearanceRender,\n type InstanceDesign,\n} from './appearance';\nimport { EN_US, withFallback, type Catalog } from './i18n';\nimport type {\n AtlasOrganizationMembership,\n AtlasSession,\n AtlasUser,\n AuthStatus,\n SessionClaims,\n} from './types';\n\n/**\n * `AtlasService` — the Angular peer of React's `<AtlasProvider>` + hooks.\n *\n * It holds exactly one thing that matters in memory: the short-lived JWT, in a\n * {@link TokenCache}. Not localStorage, not a cookie this code writes — the\n * refresh token is HttpOnly so browser script never touches it, and the JWT\n * lives only as long as the tab. Anything persisted would survive the tab and\n * become the first thing an XSS reads.\n *\n * Reactive auth state is exposed two ways so callers can pick their idiom:\n * - RxJS observables (`user$`, `session$`, `isSignedIn$`, …) — the primary API,\n * the analogue of the React hooks' return values.\n * - Angular signals (`user`, `session`, `isSignedIn`, …) — the same values as\n * `Signal<T>`, for templates and `computed()`.\n *\n * The imperative methods (`signOut`, `getToken`, `getProviderToken`,\n * `setActiveOrganization`, `reload`) mirror the actions the hooks return.\n */\n@Injectable({ providedIn: 'root' })\nexport class AtlasService implements OnDestroy {\n private readonly options = inject(ATLAS_OPTIONS);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n private readonly baseUrl: string;\n private readonly publishableKey: string;\n private readonly doFetch: typeof fetch;\n\n private readonly cache = new TokenCache();\n private readonly fapiClient: FapiClient;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * The sessions this browser signed out of (tombstones in localStorage, per\n * Frontend API origin), the revoke and its background re-tries. Every reload /\n * refresh asks it before adopting a session, so a sign-out the server never\n * confirmed is not undone by the still-valid refresh cookie.\n */\n private readonly guard: SignOutGuard;\n private stopWatchingSignOut: (() => void) | null = null;\n\n private readonly catalog: Catalog;\n /** The language layer of `catalog` (the `localization` bundle alone; `EN_US` when none). */\n private readonly errorCatalog: Catalog;\n /** Sent to the Frontend API as `Accept-Language`: the `localization` bundle's `locale` tag. */\n private readonly requestLocale: string | undefined;\n\n /**\n * A sign-in attempt handed back by an OAuth redirect that still needs a second\n * factor (no session was issued). Null in the ordinary case; the `<atlas-sign-in>`\n * flow seeds itself from this so the user resumes at the 2FA step. Captured\n * once, synchronously, at construction — before any flow component reads it.\n */\n readonly pendingAttempt: { id: string; status: string } | null;\n\n // --- Reactive state (source of truth) ---------------------------------------\n\n private readonly _status = new BehaviorSubject<AuthStatus>('loading');\n private readonly _user = new BehaviorSubject<AtlasUser | null>(null);\n private readonly _session = new BehaviorSubject<AtlasSession | null>(null);\n private readonly _claims = new BehaviorSubject<SessionClaims | null>(null);\n private readonly _memberships = new BehaviorSubject<AtlasOrganizationMembership[]>([]);\n\n /** The three-state auth lifecycle: `loading` → `signed_in` | `signed_out`. */\n readonly status$: Observable<AuthStatus> = this._status.asObservable();\n readonly user$: Observable<AtlasUser | null> = this._user.asObservable();\n readonly session$: Observable<AtlasSession | null> = this._session.asObservable();\n readonly claims$: Observable<SessionClaims | null> = this._claims.asObservable();\n readonly memberships$: Observable<AtlasOrganizationMembership[]> =\n this._memberships.asObservable();\n\n /**\n * True once the SDK has finished its first boot. Distinguishing \"still loading\"\n * from \"signed out\" is what lets a template avoid the flash of a sign-in form\n * on every page load.\n */\n readonly isLoaded$: Observable<boolean> = this.status$.pipe(\n map((s) => s !== 'loading'),\n distinctUntilChanged(),\n );\n\n readonly isSignedIn$: Observable<boolean> = this.status$.pipe(\n map((s) => s === 'signed_in'),\n distinctUntilChanged(),\n );\n\n /** The active organization membership, derived from the token's `org_id` claim. */\n readonly organization$: Observable<AtlasOrganizationMembership | null> = combineLatest([\n this._memberships,\n this._claims,\n ]).pipe(\n map(\n ([memberships, claims]) =>\n memberships.find((m) => m.organization.id === claims?.org_id) ?? null,\n ),\n );\n\n // --- Signal mirror ----------------------------------------------------------\n\n readonly status: Signal<AuthStatus> = toSignal(this.status$, { initialValue: 'loading' });\n readonly user: Signal<AtlasUser | null> = toSignal(this.user$, { initialValue: null });\n readonly session: Signal<AtlasSession | null> = toSignal(this.session$, { initialValue: null });\n readonly claims: Signal<SessionClaims | null> = toSignal(this.claims$, { initialValue: null });\n readonly memberships: Signal<AtlasOrganizationMembership[]> = toSignal(this.memberships$, {\n initialValue: [] as AtlasOrganizationMembership[],\n });\n readonly isLoaded: Signal<boolean> = computed(() => this.status() !== 'loading');\n readonly isSignedIn: Signal<boolean> = computed(() => this.status() === 'signed_in');\n readonly organization: Signal<AtlasOrganizationMembership | null> = computed(() => {\n const orgId = this.claims()?.org_id;\n return this.memberships().find((m) => m.organization.id === orgId) ?? null;\n });\n\n constructor() {\n const options = this.options;\n this.publishableKey = options.publishableKey;\n // Throws an `AtlasConfigError` on a missing/invalid value rather than quietly\n // sending every request to a relative path on the app's origin.\n this.baseUrl = resolveFrontendApi(options.frontendApi, {\n component: 'provideAtlas() / AtlasModule.forRoot()',\n });\n this.doFetch = options.fetchImpl ?? ((...args: Parameters<typeof fetch>) => fetch(...args));\n\n this.catalog = options.localization ? withFallback(options.localization) : EN_US;\n this.errorCatalog = options.localization ?? EN_US;\n this.requestLocale = catalogLocale(options.localization);\n\n this.fapiClient = new FapiClient({\n publishableKey: this.publishableKey,\n baseUrl: this.baseUrl,\n fetchImpl: this.doFetch,\n locale: this.requestLocale,\n });\n\n this.guard = new SignOutGuard({\n request: (path, init) => this.call(path, init),\n frontendApi: this.baseUrl,\n });\n\n // Captured synchronously (not in an async init) so it is available before any\n // flow component reads it: a needs_second_factor redirect carries a status but\n // no ticket, and that is what the 2FA resume seeds from.\n this.pendingAttempt = this.isBrowser ? this.readPendingAttempt() : null;\n\n // Boot once, browser only. On the server there is no cookie jar to read a\n // session from, so we leave the state at `loading` and let hydration boot it.\n if (this.isBrowser) {\n // Another tab signed out of THIS session (its tombstone reached the shared\n // store): drop the token and re-check, which then refuses the session.\n this.stopWatchingSignOut = this.guard.watch(\n () => this.cache.peek()?.sessionId ?? this._session.value?.id,\n () => {\n this.cache.clear();\n void this.reload();\n },\n );\n void this.boot();\n }\n }\n\n ngOnDestroy(): void {\n this.stopWatchingSignOut?.();\n this.stopWatchingSignOut = null;\n this.guard.dispose();\n this.clearRefreshTimer();\n this._status.complete();\n this._user.complete();\n this._session.complete();\n this._claims.complete();\n this._memberships.complete();\n }\n\n // --- Configuration accessors ------------------------------------------------\n\n get appearance(): Appearance | undefined {\n return this.options.appearance;\n }\n\n get localization(): Catalog {\n return this.catalog;\n }\n\n get frontendApi(): string {\n return this.baseUrl;\n }\n\n /** The `Accept-Language` sent to the Frontend API: the `localization` bundle's `locale` tag, if any. */\n get locale(): string | undefined {\n return this.requestLocale;\n }\n\n /**\n * The text to show for a server error, in the app's language: the catalog's\n * `error.<reason>` (looked up in the `localization` bundle, or `EN_US` when\n * none is set), else the server's message, else `error.generic`.\n */\n errorText(error: ErrorLike | string | null | undefined): string {\n return localizedErrorMessage(error, this.errorCatalog, this.catalog);\n }\n\n /** The catalog server errors are looked up in (see {@link errorText}). */\n get errorLocalization(): Catalog {\n return this.errorCatalog;\n }\n\n /** Tokens as CSS custom properties, for a host element to inherit. */\n appearanceVariables(): Record<string, string> {\n return cssVariables(resolveTokens(this.options.appearance));\n }\n\n /**\n * The full appearance render for a root element: inline variables, the\n * `data-atlas-*` attributes and the design stylesheet. Pass the dashboard\n * design (from {@link loadInstanceDesign}) to layer code overrides on it —\n * the same semantics as `@atlasauth/react`.\n */\n appearanceRender(instanceDesign?: InstanceDesign | null): AppearanceRender {\n return renderAppearance(this.options.appearance, instanceDesign ?? null, {\n frontendApi: this.baseUrl,\n });\n }\n\n /**\n * The design configured in the Atlas dashboard (`GET /v1/appearance`), or null\n * when there is none, it cannot be read, or the app opted out with\n * `appearance.instanceDesign: false`.\n */\n async loadInstanceDesign(): Promise<InstanceDesign | null> {\n if (this.options.appearance?.instanceDesign === false) return null;\n try {\n const response = await this.call('/v1/appearance');\n return response.ok ? instanceDesignFrom(await response.json()) : null;\n } catch {\n return null;\n }\n }\n\n /** A fresh {@link FapiClient} for driving a sign-in/sign-up flow. */\n createFapiClient(): FapiClient {\n return new FapiClient({\n publishableKey: this.publishableKey,\n baseUrl: this.baseUrl,\n locale: this.requestLocale,\n });\n }\n\n // --- Imperative API (mirrors the React hooks' actions) ----------------------\n\n /**\n * The current session's JWT, always fresh: if the cached token is within 5s of\n * expiry it is refreshed first rather than handed over. Null when signed out.\n */\n async getToken(): Promise<string | null> {\n const usable = this.cache.get(5_000);\n if (usable) return usable.jwt;\n\n await this.refresh();\n return this.cache.get(5_000)?.jwt ?? null;\n }\n\n /**\n * The signed-in user's OWN live access token at a connected provider (Google,\n * GitHub, …), so the app can call that provider's API from the browser. Null\n * when there is no usable token — no linked account, or the provider granted /\n * kept none. The server refreshes a stale token on read; the refresh token is\n * never exposed.\n */\n getProviderToken(provider: string): Promise<ProviderToken | null> {\n return fetchProviderToken(this.fapiClient, provider);\n }\n\n /** Imperative `has()` — the same evaluation `*atlasProtect` renders on. */\n has(condition: ProtectCondition): boolean {\n return evaluate(this._claims.value, condition).allowed;\n }\n\n /**\n * Revoke the current session server-side and drop all local auth state.\n *\n * The session id is remembered before the revoke (a tombstone shared by every\n * tab), so a reload, a token refresh, a sibling tab or a tab opened later never\n * re-adopts it — even when the revoke failed (it is retried once, then again in\n * the background) and the refresh cookie is still valid. Resolves\n * `{ revoked, activeSessionId? }`; with `{ strict: true }` an unconfirmed revoke\n * rejects with a `SignOutError` instead (after the local sign-out). A parked\n * session the server promoted on revoke is adopted. Front-channel logout runs\n * unless `{ frontchannel: false }`.\n */\n async signOut(options: SignOutOptions = {}): Promise<SignOutResult> {\n // With no cached token the guard finds the cookie session itself\n // (GET /v1/client), so a missing JWT never skips the revoke.\n const sessionId = this.cache.peek()?.sessionId ?? this._session.value?.id ?? null;\n const attempt = await this.guard.revoke(sessionId, options);\n this.clearLocalState();\n if (this.guard.promoted(attempt)) await this.reload();\n return this.guard.settle(attempt, options);\n }\n\n /**\n * Switch the active organization (or `null` for the personal account). The\n * new token carries the new org claims, so the app's permission checks update\n * without a re-login.\n */\n async setActiveOrganization(organizationId: string | null): Promise<void> {\n const current = this.cache.peek();\n if (!current) return;\n\n const response = await this.call(`/v1/client/sessions/${current.sessionId}/touch`, {\n method: 'POST',\n body: JSON.stringify({ active_organization_id: organizationId }),\n });\n if (!response.ok) return;\n\n const body = (await response.json()) as { jwt: string };\n this.applyToken(body.jwt, current.sessionId);\n await this.reload();\n }\n\n /** Re-read `/v1/client`: refresh user, session, memberships and status. */\n async reload(): Promise<void> {\n try {\n const response = await this.call('/v1/client');\n if (!response.ok) throw new Error('boot failed');\n\n const body = (await response.json()) as {\n session: AtlasSession | null;\n user: AtlasUser | null;\n jwt?: string;\n organization_memberships?: AtlasOrganizationMembership[];\n };\n\n // A session this browser signed out of is never re-adopted from the\n // refresh cookie; the guard re-tries its revoke in the background.\n if (!body.session || !body.user || this.guard.refuse(body.session.id)) {\n this.clearLocalState();\n return;\n }\n\n this._user.next(body.user);\n this._session.next(body.session);\n this._memberships.next(body.organization_memberships ?? []);\n if (body.jwt) this.applyToken(body.jwt, body.session.id);\n this._status.next('signed_in');\n this.scheduleRefresh();\n } catch {\n // A failed boot is NOT signed-out. Rendering a sign-in form because the\n // network hiccuped throws away a perfectly good session and forces a\n // needless re-authentication. Only promote loading → signed_out.\n if (this._status.value === 'loading') this._status.next('signed_out');\n }\n }\n\n // --- Internals --------------------------------------------------------------\n\n /**\n * §6.3 step 3: complete a redirect-based sign-in, then boot. An OAuth or\n * hosted-page flow lands back with a one-time ticket in the URL; exchange it\n * for cookies, scrub the URL so a reload cannot replay it, THEN read the\n * session. A redirect carrying only a status (a second factor is still owed)\n * has no ticket, so nothing is exchanged and the app boots signed-out.\n */\n private async boot(): Promise<void> {\n const fromUrl = readRedirectResult(window.location.search);\n let result: RedirectResult | null = fromUrl;\n\n // §oauth popup mode: this page may be the landing of a sign-in popup whose\n // opener a Cross-Origin-Opener-Policy severed (`#atlas_popup_result=…`).\n // The result is relayed to the opener, which redeems the ticket, and this\n // window closes. If no opener takes it (its tab is gone), finish here like\n // a redirect.\n const landing = await completeOAuthPopupLanding().catch(() => null);\n if (landing && !landing.delivered) {\n const outcome = mapOAuthPopupPayload(landing.payload);\n if (outcome?.ticket && outcome.attemptId) {\n result = { attemptId: outcome.attemptId, ticket: outcome.ticket };\n } else if (outcome?.continuationUrl) {\n // A second factor / connect step / provider error: the redirect flow's page.\n window.location.replace(outcome.continuationUrl);\n return;\n }\n }\n\n let exchanged = false;\n if (result?.ticket) {\n const response = await this.call('/v1/client/tickets/exchange', {\n method: 'POST',\n body: JSON.stringify({ attempt_id: result.attemptId, ticket: result.ticket }),\n }).catch(() => undefined);\n exchanged = !!response?.ok;\n }\n if (fromUrl) {\n window.history.replaceState({}, document.title, stripRedirectParams(window.location.href));\n }\n await this.reload();\n // Signed in inside the Atlas popup (the redirect flow ran in it): hand back\n // to the waiting opener and close. A no-op in an ordinary tab.\n if (exchanged) void closeOAuthPopupAfterSignIn();\n }\n\n private readPendingAttempt(): { id: string; status: string } | null {\n const result = readRedirectResult(window.location.search);\n return result?.status && !result.ticket\n ? { id: result.attemptId, status: result.status }\n : null;\n }\n\n private call(path: string, init?: RequestInit): Promise<Response> {\n return this.doFetch(`${this.baseUrl}${path}`, {\n ...init,\n // Cookies carry the session; a request without this is indistinguishable\n // from being signed out.\n credentials: 'include',\n headers: {\n 'x-publishable-key': this.publishableKey,\n ...(init?.body ? { 'content-type': 'application/json' } : {}),\n ...init?.headers,\n },\n });\n }\n\n private applyToken(jwt: string, sessionId: string): void {\n // An in-flight refresh must not resurrect a session signed out meanwhile.\n if (this.guard.isSignedOut(sessionId)) return;\n const expiresAt = readExpiry(jwt);\n if (!expiresAt) return;\n\n this.cache.set({ jwt, expiresAt, sessionId });\n this._claims.next(decodeClaims(jwt));\n }\n\n private async refresh(): Promise<void> {\n const current = this.cache.peek();\n if (!current) return;\n\n try {\n const response = await this.call(`/v1/client/sessions/${current.sessionId}/tokens`, {\n method: 'POST',\n });\n if (!response.ok) throw new Error('refresh failed');\n\n const body = (await response.json()) as { jwt: string; session_id: string };\n this.applyToken(body.jwt, body.session_id);\n this.scheduleRefresh();\n } catch {\n // The session may genuinely be gone. Re-boot rather than guess.\n await this.reload();\n }\n }\n\n private clearLocalState(): void {\n this.clearRefreshTimer();\n this.cache.clear();\n this._status.next('signed_out');\n this._user.next(null);\n this._session.next(null);\n this._claims.next(null);\n this._memberships.next([]);\n }\n\n /** §7.4: proactive, jittered refresh scheduled from the token's own expiry. */\n private scheduleRefresh(): void {\n this.clearRefreshTimer();\n if (this._status.value !== 'signed_in') return;\n\n const token = this.cache.peek();\n if (!token) return;\n\n const delay = msUntilRefresh({ token, now: Date.now() });\n this.refreshTimer = setTimeout(() => void this.refresh(), delay);\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n}\n\n/** Decode a JWT payload without verifying it — a scheduling/UI hint only. */\nfunction decodeClaims(jwt: string): SessionClaims | null {\n const parts = jwt.split('.');\n if (parts.length !== 3) return null;\n try {\n return JSON.parse(\n atob(parts[1]!.replace(/-/g, '+').replace(/_/g, '/')),\n ) as SessionClaims;\n } catch {\n return null;\n }\n}\n","import {\n Directive,\n OnDestroy,\n OnInit,\n TemplateRef,\n ViewContainerRef,\n inject,\n} from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { AtlasService } from '../atlas.service';\n\n/**\n * Shared machinery for the boolean structural directives (`*atlasSignedIn`,\n * `*atlasSignedOut`, `*atlasLoading`, `*atlasLoaded`). A subclass names the\n * stream to gate on; this base mounts the embedded view exactly when that stream\n * is true and tears it down otherwise, mirroring how the React `<SignedIn>` /\n * `<SignedOut>` components render `children` or `null`.\n */\n@Directive()\nexport abstract class AtlasToggleDirective implements OnInit, OnDestroy {\n protected readonly atlas = inject(AtlasService);\n private readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n private readonly viewContainer = inject(ViewContainerRef);\n private sub?: Subscription;\n private shown = false;\n\n /** The stream whose truthiness controls whether the template renders. */\n protected abstract source(): Observable<boolean>;\n\n ngOnInit(): void {\n this.sub = this.source()\n .pipe(distinctUntilChanged())\n .subscribe((show) => this.render(show));\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n }\n\n private render(show: boolean): void {\n if (show && !this.shown) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.shown = true;\n } else if (!show && this.shown) {\n this.viewContainer.clear();\n this.shown = false;\n }\n }\n}\n","import { Directive } from '@angular/core';\nimport { Observable, combineLatest } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { AtlasToggleDirective } from './toggle.directive';\n\n/**\n * `*atlasSignedIn` — render the template only when the SDK has loaded AND the\n * user is signed in. The Angular peer of React's `<SignedIn>`. Renders nothing\n * while loading, so no signed-in UI flashes before boot completes.\n *\n * ```html\n * <div *atlasSignedIn>Welcome back</div>\n * ```\n */\n@Directive({\n selector: '[atlasSignedIn]',\n standalone: true,\n})\nexport class AtlasSignedInDirective extends AtlasToggleDirective {\n protected override source(): Observable<boolean> {\n return combineLatest([this.atlas.isLoaded$, this.atlas.isSignedIn$]).pipe(\n map(([loaded, signedIn]) => loaded && signedIn),\n );\n }\n}\n","import { Directive } from '@angular/core';\nimport { Observable, combineLatest } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { AtlasToggleDirective } from './toggle.directive';\n\n/**\n * `*atlasSignedOut` — render the template only when the SDK has loaded AND the\n * user is signed out. The Angular peer of React's `<SignedOut>`. Renders nothing\n * while loading, the symmetric partner of `*atlasSignedIn`.\n *\n * ```html\n * <atlas-sign-in *atlasSignedOut></atlas-sign-in>\n * ```\n */\n@Directive({\n selector: '[atlasSignedOut]',\n standalone: true,\n})\nexport class AtlasSignedOutDirective extends AtlasToggleDirective {\n protected override source(): Observable<boolean> {\n return combineLatest([this.atlas.isLoaded$, this.atlas.isSignedIn$]).pipe(\n map(([loaded, signedIn]) => loaded && !signedIn),\n );\n }\n}\n","import { Directive } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { AtlasToggleDirective } from './toggle.directive';\n\n/**\n * `*atlasLoading` — render the template only while the SDK is still booting. The\n * Angular peer of React's `<AtlasLoading>`; show a spinner here.\n */\n@Directive({\n selector: '[atlasLoading]',\n standalone: true,\n})\nexport class AtlasLoadingDirective extends AtlasToggleDirective {\n protected override source(): Observable<boolean> {\n return this.atlas.isLoaded$.pipe(map((loaded) => !loaded));\n }\n}\n","import { Directive } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { AtlasToggleDirective } from './toggle.directive';\n\n/**\n * `*atlasLoaded` — render the template only once the SDK has finished booting.\n * The Angular peer of React's `<AtlasLoaded>`, the symmetric partner of\n * `*atlasLoading`.\n */\n@Directive({\n selector: '[atlasLoaded]',\n standalone: true,\n})\nexport class AtlasLoadedDirective extends AtlasToggleDirective {\n protected override source(): Observable<boolean> {\n return this.atlas.isLoaded$;\n }\n}\n","import {\n Directive,\n Input,\n OnDestroy,\n OnInit,\n TemplateRef,\n ViewContainerRef,\n inject,\n} from '@angular/core';\nimport { BehaviorSubject, Subscription, combineLatest } from 'rxjs';\nimport { AtlasService } from '../atlas.service';\nimport { evaluate, type ProtectCondition } from '@atlasauth/authz';\n\n/**\n * `*atlasProtect` — render the template only when the active organization role\n * satisfies a {@link ProtectCondition}. The Angular peer of React's\n * `<Protect permission=\"…\">`.\n *\n * A RENDERING helper, never an authorization boundary: anyone can flip the\n * condition in devtools. The server checking the same permission is what\n * actually stops them — this directive's only job is to avoid showing a control\n * that would fail.\n *\n * ```html\n * <button *atlasProtect=\"{ permission: 'org:sys_memberships:manage' }\">Invite</button>\n *\n * <!-- with a fallback (identical microsyntax to *ngIf … else) -->\n * <div *atlasProtect=\"{ role: 'admin' }; else denied\">Admin tools</div>\n * <ng-template #denied>You lack access.</ng-template>\n * ```\n *\n * An empty condition (`*atlasProtect`) means simply \"signed in\".\n */\n@Directive({\n selector: '[atlasProtect]',\n standalone: true,\n})\nexport class AtlasProtectDirective implements OnInit, OnDestroy {\n private readonly atlas = inject(AtlasService);\n private readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n private readonly viewContainer = inject(ViewContainerRef);\n\n private readonly condition$ = new BehaviorSubject<ProtectCondition>({});\n private elseTemplate: TemplateRef<unknown> | null = null;\n private sub?: Subscription;\n private rendered: 'main' | 'else' | 'none' = 'none';\n\n /** The condition to evaluate. An empty/omitted value means \"signed in\". */\n @Input()\n set atlasProtect(condition: ProtectCondition | '' | null | undefined) {\n this.condition$.next(condition || {});\n }\n\n /** Template rendered when the condition is not met (the `else` branch). */\n @Input()\n set atlasProtectElse(template: TemplateRef<unknown> | null) {\n this.elseTemplate = template;\n // Re-render against the current state so a late-bound else takes effect.\n this.condition$.next(this.condition$.value);\n }\n\n ngOnInit(): void {\n this.sub = combineLatest([this.atlas.status$, this.atlas.claims$, this.condition$]).subscribe(\n ([status, claims, condition]) => {\n if (status === 'loading') {\n this.show('none');\n return;\n }\n this.show(evaluate(claims, condition).allowed ? 'main' : 'else');\n },\n );\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n }\n\n private show(which: 'main' | 'else' | 'none'): void {\n if (which === this.rendered) return;\n this.viewContainer.clear();\n\n if (which === 'main') {\n this.viewContainer.createEmbeddedView(this.templateRef);\n } else if (which === 'else' && this.elseTemplate) {\n this.viewContainer.createEmbeddedView(this.elseTemplate);\n }\n this.rendered = which;\n }\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { Directive, ElementRef, OnInit, PLATFORM_ID, Renderer2, inject } from '@angular/core';\nimport { applyAppearanceToDom } from '@atlasauth/design/runtime';\nimport { AtlasService } from '../atlas.service';\n\n/**\n * `atlasRoot` — apply the resolved appearance design tokens as `--atlas-*` CSS\n * custom properties (and the `atlas-root` class) onto its host element, so the\n * Atlas components rendered inside inherit them.\n *\n * React does this with the wrapping `<div className=\"atlas-root\" style={…}>`\n * inside `<AtlasProvider>`. Angular has no single wrapping element, so a\n * consumer opts in by putting `atlasRoot` on whatever element encloses the\n * Atlas UI (commonly the app root):\n *\n * ```html\n * <div atlasRoot>\n * <router-outlet></router-outlet>\n * </div>\n * ```\n *\n * With a design (a code-level `appearance.preset` / `appearance.design`, or\n * the dashboard design, fetched in the browser) the host also gets the stable\n * `data-atlas-*` attributes and the design stylesheet is added to `<head>` once.\n */\n@Directive({\n selector: '[atlasRoot]',\n standalone: true,\n})\nexport class AtlasRootDirective implements OnInit {\n private readonly atlas = inject(AtlasService);\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly renderer = inject(Renderer2);\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n\n ngOnInit(): void {\n const host = this.el.nativeElement;\n this.renderer.addClass(host, 'atlas-root');\n // Custom properties via `style.setProperty` (written verbatim, never camelCased).\n let applied = applyAppearanceToDom(this.document, host, this.atlas.appearanceRender());\n if (!isPlatformBrowser(this.platformId)) return;\n void this.atlas.loadInstanceDesign().then((design) => {\n if (!design) return;\n applied = applyAppearanceToDom(this.document, host, this.atlas.appearanceRender(design), applied);\n });\n }\n}\n","import { Directive, ElementRef, Input, OnDestroy, OnInit, inject } from '@angular/core';\nimport type { CaptchaController } from '@atlasauth/js';\n\n/**\n * `[atlasCaptchaSlot]=\"controller\"` — the element a flow's captcha widget draws\n * into (see `createCaptchaController` in `@atlasauth/js`). Attaches the\n * controller to the host element while it is rendered and detaches it (removing\n * the widget) when it goes away.\n */\n@Directive({\n selector: '[atlasCaptchaSlot]',\n standalone: true,\n})\nexport class AtlasCaptchaSlotDirective implements OnInit, OnDestroy {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private current: CaptchaController | null = null;\n private initialized = false;\n\n @Input('atlasCaptchaSlot') set controller(next: CaptchaController | null) {\n if (next === this.current) return;\n if (this.initialized) this.current?.attach(null);\n this.current = next;\n if (this.initialized) this.current?.attach(this.host.nativeElement);\n }\n\n ngOnInit(): void {\n this.initialized = true;\n this.current?.attach(this.host.nativeElement);\n }\n\n ngOnDestroy(): void {\n this.current?.attach(null);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n inject,\n} from '@angular/core';\nimport {\n localizedErrorMessage,\n nextStep,\n type AttemptView,\n type CaptchaController,\n type FieldError,\n} from '@atlasauth/js';\nimport { AtlasService } from '../atlas.service';\nimport { AtlasCaptchaSlotDirective } from '../directives/captcha-slot.directive';\nimport { classFor, type ElementKey } from '../appearance';\nimport { translate } from '../i18n';\n\n/**\n * One rendered row of the flow. A uniform shape (rather than a discriminated\n * union) so the template accesses only fields that always exist — no reliance on\n * template control-flow narrowing of a loop variable, which varies by Angular\n * minor. For a `message` row, `labelKey` carries the message's i18n key.\n */\ninterface StepField {\n kind: 'input' | 'message';\n name: string;\n labelKey: string;\n type: string;\n}\n\n/**\n * The server-driven flow shell, shared by `<atlas-sign-in>` and\n * `<atlas-sign-up>`. The Angular peer of React's internal `AttemptFlow`.\n *\n * It contains NO decision about what comes next: it renders whatever `status`\n * the server returned, mapped through `nextStep` from `@atlasauth/js` (the same\n * exhaustive mapping the React SDK uses), so adding a step is a server change\n * and an out-of-date client degrades to a visible \"please update\" message rather\n * than a blank screen.\n */\n@Component({\n selector: 'atlas-attempt-flow',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AtlasCaptchaSlotDirective],\n template: `\n <div [class]=\"cls('card', 'atlas-card')\">\n <h1 [class]=\"cls('headerTitle', 'atlas-title')\">{{ t(titleKey) }}</h1>\n\n @for (error of formErrors(); track error.code) {\n <p [class]=\"cls('formFieldError', 'atlas-error')\" role=\"alert\">{{ errorText(error) }}</p>\n }\n\n <form (submit)=\"onSubmit($event)\">\n @if (codeSentText(); as sentText) {\n <p class=\"atlas-text\" data-atlas-code-sent=\"\">{{ sentText }}</p>\n }\n @for (f of fields(); track $index) {\n @if (f.kind === 'input') {\n <label class=\"atlas-field\">\n <span>{{ t(f.labelKey) }}</span>\n <input\n [class]=\"cls('formFieldInput', 'atlas-input')\"\n [type]=\"f.type\"\n [attr.name]=\"f.name\"\n [value]=\"values[f.name] ?? ''\"\n (input)=\"setValue(f.name, $any($event.target).value)\"\n />\n @for (error of fieldErrorsFor(f.name); track error.code) {\n <span [class]=\"cls('formFieldError', 'atlas-error')\">{{ errorText(error) }}</span>\n }\n </label>\n } @else {\n <p>{{ t(f.labelKey) }}</p>\n }\n }\n\n @if (showCaptcha()) {\n <div class=\"atlas-captcha\" data-atlas-captcha=\"\" [atlasCaptchaSlot]=\"captcha\"></div>\n }\n\n @if (showSubmit()) {\n <button [class]=\"cls('formButtonPrimary', 'atlas-button')\" [disabled]=\"busy\" type=\"submit\">\n {{ t('signIn.submit') }}\n </button>\n }\n\n @if (showEmailCodeOption()) {\n <button\n [class]=\"cls('formButtonSecondary', 'atlas-button-secondary')\"\n [disabled]=\"busy\"\n type=\"button\"\n [attr.data-strategy]=\"preparedFactor === 'email_code' ? null : 'email_code'\"\n [attr.data-atlas-resend]=\"preparedFactor === 'email_code' ? '' : null\"\n (click)=\"chooseFactor.emit('email_code')\"\n >\n {{ t(preparedFactor === 'email_code' ? 'signIn.resendCode' : 'signIn.useEmailCode') }}\n </button>\n }\n </form>\n </div>\n `,\n})\nexport class AttemptFlowComponent {\n private readonly atlas = inject(AtlasService);\n\n @Input() attempt: AttemptView | null = null;\n @Input() busy = false;\n @Input() errors: FieldError[] = [];\n @Input() titleKey = 'signIn.title';\n /**\n * The sign-in captcha, drawn above the submit button on the identifier step\n * (an always-on sign-in captcha) and on the challenge step the server demands\n * with `needs_captcha`. Null when the flow draws none.\n */\n @Input() captcha: CaptchaController | null = null;\n /**\n * The first factors to offer on the `needs_first_factor` step — pass\n * `AtlasFlowController.firstFactors()`, which drops email code / link while the\n * app cannot deliver email. Null uses the server's list as-is.\n */\n @Input() firstFactors: string[] | null = null;\n /** The first factor already sent (`AtlasFlowController.preparedFactor()`): its code is collected. */\n @Input() preparedFactor: string | null = null;\n\n /** Emits the collected field values when the form is submitted. */\n @Output() submitFlow = new EventEmitter<Record<string, string>>();\n /** Emits when the user picks a first factor the server must send first (an emailed code). */\n @Output() chooseFactor = new EventEmitter<'email_code'>();\n\n protected values: Record<string, string> = {};\n\n protected t(key: string, vars?: Record<string, string>): string {\n return translate(this.atlas.localization, key, vars);\n }\n\n /** A server error in the app's language (`error.<reason>`, else the server's message). */\n protected errorText(error: FieldError): string {\n // `errorLocalization` is read defensively: a stand-in service may lack it.\n const layer = (this.atlas as { errorLocalization?: Record<string, string> }).errorLocalization;\n return localizedErrorMessage(error, layer ?? this.atlas.localization, this.atlas.localization);\n }\n\n protected cls(key: ElementKey, base: string): string {\n return classFor(key, this.atlas.appearance, base);\n }\n\n protected setValue(name: string, value: string): void {\n this.values = { ...this.values, [name]: value };\n }\n\n protected onSubmit(event: Event): void {\n event.preventDefault();\n this.submitFlow.emit(this.values);\n }\n\n protected formErrors(): FieldError[] {\n return this.errors.filter((error) => !error.param);\n }\n\n protected fieldErrorsFor(name: string): FieldError[] {\n return this.errors.filter((error) => error.param === name);\n }\n\n private step() {\n return this.attempt ? nextStep(this.attempt) : ({ kind: 'collect_identifier' } as const);\n }\n\n protected showCaptcha(): boolean {\n const kind = this.step().kind;\n return !!this.captcha && (kind === 'collect_identifier' || kind === 'collect_captcha');\n }\n\n /** The first factors on offer at a `needs_first_factor` step (empty on any other). */\n private offered(): string[] {\n const step = this.step();\n if (step.kind !== 'collect_first_factor') return [];\n return this.firstFactors ?? step.strategies;\n }\n\n protected showEmailCodeOption(): boolean {\n // Before the code is sent: the choice (or the retry of a failed automatic\n // send). After: \"Resend code\".\n return this.offered().includes('email_code');\n }\n\n /** The \"we sent a code to …\" line on the code step. */\n protected codeSentText(): string | null {\n if (this.step().kind !== 'collect_first_factor' || this.preparedFactor !== 'email_code') return null;\n return this.t('signIn.codeSentTo', { email: this.attempt?.identifier ?? '' });\n }\n\n protected showSubmit(): boolean {\n const kind = this.step().kind;\n // Nothing to submit on a first-factor step that only offers an emailed code\n // until that code is sent.\n if (kind === 'collect_first_factor') return this.fields().length > 0;\n return kind !== 'done' && kind !== 'await_oauth';\n }\n\n protected fields(): StepField[] {\n const step = this.step();\n switch (step.kind) {\n case 'collect_identifier':\n return [{ kind: 'input', name: 'identifier', labelKey: 'signIn.identifierLabel', type: 'email' }];\n case 'collect_first_factor': {\n if (this.preparedFactor === 'email_code') {\n return [{ kind: 'input', name: 'code', labelKey: 'signIn.emailCodeLabel', type: 'text' }];\n }\n // The password field unless the only offer is an emailed code (chosen\n // with the button below the form).\n const offered = this.offered();\n return offered.includes('email_code') && !offered.includes('password')\n ? []\n : [{ kind: 'input', name: 'password', labelKey: 'signIn.passwordLabel', type: 'password' }];\n }\n case 'collect_second_factor':\n return [{ kind: 'input', name: 'code', labelKey: 'mfa.codeLabel', type: 'text' }];\n case 'enroll_second_factor':\n // Two consecutive codes (§5.6): a phone with a fast clock fails here\n // rather than on every sign-in afterwards.\n return [\n { kind: 'input', name: 'code', labelKey: 'mfa.enrollFirstCodeLabel', type: 'text' },\n { kind: 'input', name: 'secondCode', labelKey: 'mfa.enrollSecondCodeLabel', type: 'text' },\n ];\n case 'collect_email_code':\n return [{ kind: 'input', name: 'code', labelKey: 'signIn.emailCodeLabel', type: 'text' }];\n case 'collect_new_password':\n return [{ kind: 'input', name: 'password', labelKey: 'reset.newPasswordLabel', type: 'password' }];\n case 'collect_captcha':\n // §5 the server withheld the attempt until a captcha clears. Solving the\n // widget resubmits the identifier on its own; the button retries.\n return [msg('captcha.prompt')];\n case 'await_oauth':\n return [msg('signIn.magicLinkSent')];\n case 'done':\n return [msg('signIn.checkOtherTab')];\n case 'restart':\n return [msg('error.generic')];\n default:\n // A status this SDK version does not know. An honest message beats a\n // blank login box the user cannot act on.\n return [msg('error.generic')];\n }\n }\n}\n\n/** A read-only message row: `labelKey` holds the i18n key of the text to show. */\nfunction msg(labelKey: string): StepField {\n return { kind: 'message', name: '', labelKey, type: 'text' };\n}\n","import { WritableSignal, signal } from '@angular/core';\nimport {\n FapiClient,\n advanceWithCaptcha,\n createCaptchaController,\n createSignUp,\n fetchInstanceSettings,\n flowNeedsCaptcha,\n signInCaptchaOptions,\n flowFromPending,\n initialFlow,\n nextStep,\n offeredFirstFactors,\n pollAttempt,\n prepareFactor,\n planFirstFactor,\n shouldKeepPolling,\n type CaptchaController,\n type FlowState,\n type InstanceSettings,\n} from '@atlasauth/js';\nimport { EN_US, translate } from '../i18n';\n\n/**\n * The server-driven sign-in / sign-up engine, shared by `<atlas-sign-in>` and\n * `<atlas-sign-up>` — the Angular counterpart of React's `useFlow` hook.\n *\n * It owns no decision about what comes next: every status comes back from the\n * server via `advance`, and this controller only posts whatever the current step\n * needs and re-renders the returned status. State lives in a signal so templates\n * update whether the app runs zoned or zoneless.\n *\n * `<atlas-sign-up>` starts the attempt with {@link create}\n * (`POST /v1/client/sign_ups`); the emailed-code step then runs through the same\n * {@link submit}. Both flows draw the instance's captcha (from\n * {@link loadSettings}) when it is required.\n */\nexport class AtlasFlowController {\n readonly state: WritableSignal<FlowState>;\n /**\n * The instance's public sign-in / sign-up settings (captcha, sign-up fields,\n * legal consent) from `GET /v1/appearance`; null until {@link loadSettings}\n * resolves, or when the server could not be reached.\n */\n readonly settings = signal<InstanceSettings | null>(null);\n /** The sign-in captcha (identifier step / `needs_captcha` challenge). */\n readonly captcha: CaptchaController = createCaptchaController();\n /** The sign-up captcha (the create-account step). */\n readonly signUpCaptcha: CaptchaController = createCaptchaController();\n /** Whether {@link captcha} currently draws a widget (for templates). */\n readonly captchaDrawn = signal(false);\n /** Whether {@link signUpCaptcha} currently draws a widget (for templates). */\n readonly signUpCaptchaDrawn = signal(false);\n /**\n * The first factor the server was asked to send ({@link prepare}) on the\n * current `needs_first_factor` step — the form then collects its code. Null\n * otherwise.\n */\n readonly preparedFactor = signal<'email_code' | null>(null);\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n private identifier = '';\n\n constructor(\n private readonly client: FapiClient,\n private readonly reload: () => Promise<void>,\n pending: { id: string; status: string } | null,\n /** Resolves the captcha messages' catalog keys. Defaults to en-US. */\n private readonly t: (key: string) => string = (key) => translate(EN_US, key),\n ) {\n // Seeded from a redirect that came back mid-flow (e.g. OAuth needing a second\n // factor) so the user resumes at the demanded step instead of starting over.\n this.state = signal<FlowState>(pending ? flowFromPending(pending) : initialFlow);\n this.syncCaptcha();\n }\n\n /** Fetch the instance's public settings and draw whatever captcha they require. */\n async loadSettings(): Promise<void> {\n const loaded = await fetchInstanceSettings(this.client);\n if (loaded) {\n this.settings.set(loaded);\n this.syncCaptcha();\n }\n }\n\n /**\n * The first factors to offer on a `needs_first_factor` step: the server's list\n * without email code / link while the app cannot deliver email\n * (`settings.emailDelivery.available === false`). Empty on any other step.\n */\n firstFactors(): string[] {\n const attempt = this.state().attempt;\n const step = attempt ? nextStep(attempt) : null;\n return step?.kind === 'collect_first_factor'\n ? offeredFirstFactors(step.strategies, this.settings()?.emailDelivery)\n : [];\n }\n\n /**\n * True when email + password sign-up cannot complete because the app cannot\n * send the verification email (`settings.emailDelivery.passwordSignUp === false`):\n * `<atlas-sign-up>` shows the \"can't send email\" notice instead of the form.\n */\n signUpEmailUnavailable(): boolean {\n return this.settings()?.emailDelivery.passwordSignUp === false;\n }\n\n /** False when a password reset email cannot be delivered — hide \"Forgot password?\". */\n passwordResetAvailable(): boolean {\n return this.settings()?.emailDelivery.passwordReset !== false;\n }\n\n /**\n * Ask the server to email a sign-in code for the current `needs_first_factor`\n * step (`POST …/prepare_first_factor`); the form then collects the code, which\n * {@link submit} posts as the `email_code` strategy.\n */\n async prepare(strategy: 'email_code'): Promise<void> {\n if (!this.firstFactors().includes(strategy)) return;\n this.state.update((current) => ({ ...current, busy: true, errors: [] }));\n const next = await prepareFactor(this.client, this.state(), strategy);\n this.setState(next);\n if (!next.errors.length) this.preparedFactor.set(strategy);\n }\n\n /** Keep both captchas in step with the settings and the flow's current step. */\n private syncCaptcha(): void {\n const settings = this.settings();\n const state = this.state();\n this.captcha.configure(\n signInCaptchaOptions(settings?.captchaFlows.signIn, state, () => void this.submit({})),\n );\n const signUpFlow = settings?.captchaFlows.signUp;\n this.signUpCaptcha.configure({\n flow: signUpFlow,\n active: !state.attempt && flowNeedsCaptcha(signUpFlow),\n });\n this.captchaDrawn.set(this.captcha.needed);\n this.signUpCaptchaDrawn.set(this.signUpCaptcha.needed);\n }\n\n private setState(next: FlowState): void {\n this.state.set(next);\n // A prepared factor belongs to the first-factor step it was sent for.\n if (next.attempt?.status !== 'needs_first_factor') this.preparedFactor.set(null);\n this.syncCaptcha();\n this.autoSend();\n }\n\n private autoSentFor: string | null = null;\n /**\n * With no password on offer, email the code as soon as the server asks for a\n * first factor — once per attempt, so a failed send waits for the user's retry\n * (the \"Email me a code\" button) instead of looping.\n */\n private autoSend(): void {\n const id = this.state().attempt?.id ?? null;\n if (!id || this.autoSentFor === id || this.preparedFactor()) return;\n if (planFirstFactor(this.firstFactors()).autoSend !== 'email_code') return;\n this.autoSentFor = id;\n void this.prepare('email_code');\n }\n\n /**\n * Advance the flow with the values the user typed. On completion, exchange the\n * one-time ticket for cookies over a same-origin request (FAPI is cross-origin\n * and cannot set the cookie on its own response), then re-boot so the rest of\n * the app sees a signed-in user.\n */\n async submit(values: Record<string, string>): Promise<void> {\n this.state.update((current) => ({ ...current, busy: true, errors: [] }));\n\n const out = await advanceWithCaptcha(this.client, this.state(), values, {\n captcha: this.captcha,\n identifier: this.identifier,\n t: this.t,\n });\n this.identifier = out.identifier;\n await this.finish(out.state);\n }\n\n /**\n * Create an account (`POST /v1/client/sign_ups`) from a create-account form's\n * values — email, password and any configured sign-up fields — carrying the\n * sign-up captcha's token when the instance requires one. The emailed code is\n * then posted with {@link submit}.\n */\n async create(values: Record<string, string>, consent = true): Promise<void> {\n this.state.update((current) => ({ ...current, busy: true, errors: [] }));\n const next = await createSignUp(this.client, values, {\n consent,\n captcha: this.signUpCaptcha,\n t: this.t,\n });\n await this.finish(next);\n }\n\n private async finish(next: FlowState): Promise<void> {\n this.setState(next);\n\n if (next.attempt?.status === 'complete') {\n if (next.ticket) {\n await this.client.post('/v1/client/tickets/exchange', {\n attempt_id: (next.attempt as { id?: string }).id,\n ticket: next.ticket,\n });\n }\n await this.reload();\n } else {\n // A magic-link step may now be pollable (a link opened on another device).\n this.syncPolling();\n }\n }\n\n /** Start/stop the §5.3 magic-link poll to match the current state. */\n syncPolling(): void {\n if (shouldKeepPolling(this.state())) {\n this.startPolling();\n } else {\n this.stopPolling();\n }\n }\n\n private startPolling(): void {\n if (this.pollTimer) return;\n this.pollTimer = setInterval(() => {\n void (async () => {\n const { state: next, ticket } = await pollAttempt(this.client, this.state());\n this.setState(next);\n if (!ticket || !next.attempt) return;\n\n // The ticket is exchanged by a normal request, so no session token ever\n // appears in a URL.\n await this.client.post('/v1/client/tickets/exchange', {\n attempt_id: (next.attempt as { id?: string }).id,\n ticket,\n });\n await this.reload();\n this.stopPolling();\n })();\n }, 2_000);\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n }\n\n /** Release the poll timer and the captcha widgets — call from the component's `ngOnDestroy`. */\n destroy(): void {\n this.stopPolling();\n this.captcha.destroy();\n this.signUpCaptcha.destroy();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnDestroy,\n OnInit,\n inject,\n} from '@angular/core';\nimport { AtlasService } from '../atlas.service';\nimport { translate } from '../i18n';\nimport { AttemptFlowComponent } from './attempt-flow.component';\nimport { AtlasFlowController } from './flow-controller';\n\n/**\n * `<atlas-sign-in>` — the full, multi-step sign-in flow driven entirely by the\n * server-side attempt status. The Angular peer of React's `<SignIn/>`. Draws the\n * instance's sign-in captcha when it is required (always-on, or a\n * `needs_captcha` challenge).\n *\n * ```html\n * <atlas-sign-in *atlasSignedOut afterUrl=\"/dashboard\"></atlas-sign-in>\n * ```\n */\n@Component({\n selector: 'atlas-sign-in',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AttemptFlowComponent],\n template: `\n <atlas-attempt-flow\n [attempt]=\"flow.state().attempt\"\n [busy]=\"flow.state().busy\"\n [errors]=\"flow.state().errors\"\n titleKey=\"signIn.title\"\n [captcha]=\"flow.captchaDrawn() ? flow.captcha : null\"\n [firstFactors]=\"flow.firstFactors()\"\n [preparedFactor]=\"flow.preparedFactor()\"\n (submitFlow)=\"flow.submit($event)\"\n (chooseFactor)=\"flow.prepare($event)\"\n ></atlas-attempt-flow>\n `,\n})\nexport class SignInComponent implements OnInit, OnDestroy {\n private readonly atlas = inject(AtlasService);\n\n /** Where to send the user once the flow completes. Reserved for host routing. */\n @Input() afterUrl?: string;\n\n protected readonly flow = new AtlasFlowController(\n this.atlas.createFapiClient(),\n () => this.atlas.reload(),\n // Resume mid-flow if an OAuth redirect came back owing a second factor.\n this.atlas.pendingAttempt,\n (key) => translate(this.atlas.localization, key),\n );\n\n ngOnInit(): void {\n // If seeded from a pending attempt that is already pollable, start polling.\n this.flow.syncPolling();\n // §5 the instance's captcha settings (switching captcha on in the dashboard\n // draws it here with no code change) and email delivery (no emailed-code\n // option while the app cannot send email).\n if (typeof window !== 'undefined') void this.flow.loadSettings();\n }\n\n ngOnDestroy(): void {\n this.flow.destroy();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n inject,\n} from '@angular/core';\nimport {\n localizedErrorMessage,\n type CaptchaController,\n type FieldError,\n type InstanceSettings,\n type PublicSignUpField,\n} from '@atlasauth/js';\nimport { AtlasService } from '../atlas.service';\nimport { classFor, type ElementKey } from '../appearance';\nimport { translate } from '../i18n';\nimport { AtlasCaptchaSlotDirective } from '../directives/captcha-slot.directive';\n\n/** What the create-account form emits: the values typed plus the consent tick. */\nexport interface SignUpFormSubmit {\n values: Record<string, string>;\n consent: boolean;\n}\n\n/**\n * The create-account step of `<atlas-sign-up>`: the instance's configured extra\n * fields, email + password, the legal-consent row and — when the instance\n * requires one on sign-up — the captcha widget. Values live on the component so\n * a refused submit never clears them. When the app cannot send the verification\n * email (`settings.emailDelivery.passwordSignUp === false`) it shows the\n * `signUp.emailUnavailable` notice instead of the form.\n */\n@Component({\n selector: 'atlas-sign-up-form',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AtlasCaptchaSlotDirective],\n template: `\n <div [class]=\"cls('card', 'atlas-card')\">\n <h1 [class]=\"cls('headerTitle', 'atlas-title')\">{{ t('signUp.title') }}</h1>\n\n @if (emailUnavailable()) {\n <!-- The app cannot send the verification email, so an email + password\n sign-up could never complete: say so instead of offering the form. -->\n <p [class]=\"cls('formFieldError', 'atlas-error')\" role=\"alert\" data-atlas-email-unavailable=\"\">\n {{ t('signUp.emailUnavailable') }}\n </p>\n } @else {\n @for (error of formErrors(); track error.code) {\n <p [class]=\"cls('formFieldError', 'atlas-error')\" role=\"alert\">{{ errorText(error) }}</p>\n }\n\n <form (submit)=\"onSubmit($event)\">\n @for (f of fields(); track f.key) {\n @if (f.type === 'radio' || f.type === 'multiselect') {\n <div [class]=\"cls('formField', 'atlas-field')\">\n <span [class]=\"cls('formFieldLabel', 'atlas-field-label')\">{{ label(f) }}</span>\n <span class=\"atlas-choices\">\n @for (o of f.options; track o) {\n <label class=\"atlas-choice\">\n <input\n [type]=\"f.type === 'radio' ? 'radio' : 'checkbox'\"\n [attr.name]=\"f.key\"\n [value]=\"o\"\n [checked]=\"picked(f.key).includes(o)\"\n (change)=\"toggle(f, o, $any($event.target).checked)\"\n />\n {{ o }}\n </label>\n }\n </span>\n @for (error of fieldErrorsFor(f.key); track error.code) {\n <span [class]=\"cls('formFieldError', 'atlas-error')\">{{ errorText(error) }}</span>\n }\n </div>\n } @else {\n <label [class]=\"cls('formField', 'atlas-field')\">\n <span [class]=\"cls('formFieldLabel', 'atlas-field-label')\">{{ label(f) }}</span>\n @if (f.type === 'checkbox') {\n <input\n type=\"checkbox\"\n [attr.name]=\"f.key\"\n [checked]=\"values[f.key] === 'true'\"\n (change)=\"setValue(f.key, $any($event.target).checked ? 'true' : '')\"\n />\n } @else if (f.type === 'select') {\n <select\n [class]=\"cls('formFieldInput', 'atlas-input')\"\n [attr.name]=\"f.key\"\n [value]=\"values[f.key] ?? ''\"\n [required]=\"f.required\"\n (change)=\"setValue(f.key, $any($event.target).value)\"\n >\n <option value=\"\">{{ f.placeholder ?? t('signUp.selectPlaceholder') }}</option>\n @for (o of f.options; track o) {\n <option [value]=\"o\">{{ o }}</option>\n }\n </select>\n } @else if (f.type === 'textarea') {\n <textarea\n [class]=\"cls('formFieldInput', 'atlas-input')\"\n [attr.name]=\"f.key\"\n rows=\"3\"\n [value]=\"values[f.key] ?? ''\"\n [required]=\"f.required\"\n [attr.placeholder]=\"f.placeholder\"\n (input)=\"setValue(f.key, $any($event.target).value)\"\n ></textarea>\n } @else {\n <input\n [class]=\"cls('formFieldInput', 'atlas-input')\"\n [type]=\"inputType(f)\"\n [attr.name]=\"f.key\"\n [value]=\"values[f.key] ?? ''\"\n [required]=\"f.required\"\n [attr.placeholder]=\"f.placeholder\"\n (input)=\"setValue(f.key, $any($event.target).value)\"\n />\n }\n @for (error of fieldErrorsFor(f.key); track error.code) {\n <span [class]=\"cls('formFieldError', 'atlas-error')\">{{ errorText(error) }}</span>\n }\n </label>\n }\n }\n\n <label [class]=\"cls('formField', 'atlas-field')\">\n <span [class]=\"cls('formFieldLabel', 'atlas-field-label')\">{{ t('signUp.emailLabel') }}</span>\n <input\n [class]=\"cls('formFieldInput', 'atlas-input')\"\n type=\"email\"\n name=\"email\"\n autocomplete=\"email\"\n required\n [value]=\"values['email'] ?? ''\"\n (input)=\"setValue('email', $any($event.target).value)\"\n />\n @for (error of fieldErrorsFor('email'); track error.code) {\n <span [class]=\"cls('formFieldError', 'atlas-error')\">{{ errorText(error) }}</span>\n }\n </label>\n\n <label [class]=\"cls('formField', 'atlas-field')\">\n <span [class]=\"cls('formFieldLabel', 'atlas-field-label')\">{{ t('signUp.passwordLabel') }}</span>\n <input\n [class]=\"cls('formFieldInput', 'atlas-input')\"\n type=\"password\"\n name=\"password\"\n autocomplete=\"new-password\"\n required\n [value]=\"values['password'] ?? ''\"\n (input)=\"setValue('password', $any($event.target).value)\"\n />\n @for (error of fieldErrorsFor('password'); track error.code) {\n <span [class]=\"cls('formFieldError', 'atlas-error')\">{{ errorText(error) }}</span>\n }\n </label>\n\n @if (showLegal()) {\n <label [class]=\"cls('formField', 'atlas-consent')\">\n @if (settings?.legal?.required) {\n <input\n type=\"checkbox\"\n name=\"consent\"\n [checked]=\"agreed\"\n (change)=\"agreed = $any($event.target).checked\"\n />\n }\n <span class=\"atlas-text\">\n {{ t(settings?.legal?.required ? 'signUp.consentAgree' : 'signUp.consentNotice') }}\n @if (settings?.legal?.termsUrl; as terms) {\n <a class=\"atlas-link\" [href]=\"terms\" target=\"_blank\" rel=\"noopener noreferrer\">{{ t('signUp.terms') }}</a>\n }\n @if (settings?.legal?.termsUrl && settings?.legal?.privacyUrl) {\n {{ t('signUp.and') }}\n }\n @if (settings?.legal?.privacyUrl; as privacy) {\n <a class=\"atlas-link\" [href]=\"privacy\" target=\"_blank\" rel=\"noopener noreferrer\">{{ t('signUp.privacy') }}</a>\n }.\n </span>\n @for (error of fieldErrorsFor('consent'); track error.code) {\n <span [class]=\"cls('formFieldError', 'atlas-error')\">{{ errorText(error) }}</span>\n }\n </label>\n }\n\n @if (captcha) {\n <div class=\"atlas-captcha\" data-atlas-captcha=\"\" [atlasCaptchaSlot]=\"captcha\"></div>\n }\n\n <button\n [class]=\"cls('formButtonPrimary', 'atlas-button')\"\n [disabled]=\"busy || !consentOk()\"\n type=\"submit\"\n >\n {{ t('signUp.submit') }}\n </button>\n </form>\n }\n </div>\n `,\n})\nexport class SignUpFormComponent {\n private readonly atlas = inject(AtlasService);\n\n @Input() settings: InstanceSettings | null = null;\n @Input() busy = false;\n @Input() errors: FieldError[] = [];\n @Input() captcha: CaptchaController | null = null;\n\n /** Emits the typed values and the consent tick when the form is submitted. */\n @Output() submitSignUp = new EventEmitter<SignUpFormSubmit>();\n\n protected values: Record<string, string> = {};\n protected agreed = false;\n\n protected t(key: string, vars?: Record<string, string>): string {\n return translate(this.atlas.localization, key, vars);\n }\n\n /** A server error in the app's language (`error.<reason>`, else the server's message). */\n protected errorText(error: FieldError): string {\n // `errorLocalization` is read defensively: a stand-in service may lack it.\n const layer = (this.atlas as { errorLocalization?: Record<string, string> }).errorLocalization;\n return localizedErrorMessage(error, layer ?? this.atlas.localization, this.atlas.localization);\n }\n\n protected cls(key: ElementKey, base: string): string {\n return classFor(key, this.atlas.appearance, base);\n }\n\n protected setValue(name: string, value: string): void {\n this.values = { ...this.values, [name]: value };\n }\n\n /** Email + password sign-up cannot complete: the app cannot send the verification email. */\n protected emailUnavailable(): boolean {\n return this.settings?.emailDelivery?.passwordSignUp === false;\n }\n\n protected fields(): PublicSignUpField[] {\n return this.settings?.signUpFields ?? [];\n }\n\n protected label(f: PublicSignUpField): string {\n return f.required ? f.label : this.t('signUp.optionalField', { label: f.label });\n }\n\n protected inputType(f: PublicSignUpField): string {\n return ['email', 'tel', 'url', 'number', 'date'].includes(f.type) ? f.type : 'text';\n }\n\n /** Same encoding as React, the embed widget and the hosted page: one value,\n * or a comma-joined list for multiselect. */\n protected picked(key: string): string[] {\n const value = this.values[key];\n return value ? value.split(', ') : [];\n }\n\n protected toggle(f: PublicSignUpField, option: string, on: boolean): void {\n if (f.type === 'radio') {\n this.setValue(f.key, option);\n return;\n }\n const current = this.picked(f.key);\n this.setValue(f.key, (on ? [...current, option] : current.filter((p) => p !== option)).join(', '));\n }\n\n protected showLegal(): boolean {\n const legal = this.settings?.legal;\n return !!legal && (!!legal.termsUrl || !!legal.privacyUrl);\n }\n\n protected consentOk(): boolean {\n return !this.settings?.legal?.required || this.agreed;\n }\n\n protected formErrors(): FieldError[] {\n return this.errors.filter((error) => !error.param);\n }\n\n protected fieldErrorsFor(name: string): FieldError[] {\n return this.errors.filter((error) => error.param === name);\n }\n\n protected onSubmit(event: Event): void {\n event.preventDefault();\n if (this.emailUnavailable() || !this.consentOk()) return;\n this.submitSignUp.emit({\n values: { ...this.values },\n consent: this.settings?.legal?.required ? this.agreed : true,\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnDestroy,\n OnInit,\n inject,\n} from '@angular/core';\nimport { AtlasService } from '../atlas.service';\nimport { translate } from '../i18n';\nimport { AttemptFlowComponent } from './attempt-flow.component';\nimport { SignUpFormComponent } from './sign-up-form.component';\nimport { AtlasFlowController } from './flow-controller';\n\n/**\n * `<atlas-sign-up>` — creates an account. The Angular peer of React's\n * `<SignUp/>`. The first step is the create-account form (the instance's\n * configured fields, email, password, legal consent and — when required — the\n * captcha), which POSTs `/v1/client/sign_ups`; from there it shares the flow\n * engine with `<atlas-sign-in>` (the emailed-code step, then the ticket\n * exchange), because the sequence of steps is decided by the server.\n *\n * ```html\n * <atlas-sign-up *atlasSignedOut></atlas-sign-up>\n * ```\n */\n@Component({\n selector: 'atlas-sign-up',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AttemptFlowComponent, SignUpFormComponent],\n template: `\n @if (flow.state().attempt) {\n <atlas-attempt-flow\n [attempt]=\"flow.state().attempt\"\n [busy]=\"flow.state().busy\"\n [errors]=\"flow.state().errors\"\n titleKey=\"signUp.title\"\n (submitFlow)=\"flow.submit($event)\"\n ></atlas-attempt-flow>\n } @else {\n <atlas-sign-up-form\n [settings]=\"flow.settings()\"\n [busy]=\"flow.state().busy\"\n [errors]=\"flow.state().errors\"\n [captcha]=\"flow.signUpCaptchaDrawn() ? flow.signUpCaptcha : null\"\n (submitSignUp)=\"flow.create($event.values, $event.consent)\"\n ></atlas-sign-up-form>\n }\n `,\n})\nexport class SignUpComponent implements OnInit, OnDestroy {\n private readonly atlas = inject(AtlasService);\n\n /** Where to send the user once the flow completes. Reserved for host routing. */\n @Input() afterUrl?: string;\n\n protected readonly flow = new AtlasFlowController(\n this.atlas.createFapiClient(),\n () => this.atlas.reload(),\n this.atlas.pendingAttempt,\n (key) => translate(this.atlas.localization, key),\n );\n\n ngOnInit(): void {\n // §5 the instance's sign-up fields, consent policy and captcha settings.\n if (typeof window !== 'undefined') void this.flow.loadSettings();\n }\n\n ngOnDestroy(): void {\n this.flow.destroy();\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { AtlasService } from '../atlas.service';\nimport { classFor, type ElementKey } from '../appearance';\nimport { translate } from '../i18n';\n\n/**\n * `<atlas-user-button>` — the signed-in user's avatar with a drop-down that can\n * sign them out. The Angular peer of React's `<UserButton/>`. Renders nothing\n * when there is no user.\n */\n@Component({\n selector: 'atlas-user-button',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (atlas.user(); as user) {\n <div class=\"atlas-user-button\">\n <button\n [class]=\"cls('avatar', 'atlas-avatar')\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"toggle()\"\n >\n @if (user.image_url) {\n <img [src]=\"user.image_url\" alt=\"\" />\n } @else {\n <span>{{ label().slice(0, 1) }}</span>\n }\n </button>\n\n @if (open()) {\n <div [class]=\"cls('menu', 'atlas-menu')\" role=\"menu\">\n <span [class]=\"cls('menuItem', 'atlas-menu-item')\">{{ label() }}</span>\n <button [class]=\"cls('menuItem', 'atlas-menu-item')\" (click)=\"signOut()\">\n {{ t('userButton.signOut') }}\n </button>\n </div>\n }\n </div>\n }\n `,\n})\nexport class UserButtonComponent {\n protected readonly atlas = inject(AtlasService);\n protected readonly open = signal(false);\n\n protected readonly label = computed(() => {\n const user = this.atlas.user();\n if (!user) return '';\n return [user.first_name, user.last_name].filter(Boolean).join(' ') || user.username || '';\n });\n\n protected t(key: string): string {\n return translate(this.atlas.localization, key);\n }\n\n protected cls(key: ElementKey, base: string): string {\n return classFor(key, this.atlas.appearance, base);\n }\n\n protected toggle(): void {\n this.open.update((o) => !o);\n }\n\n protected signOut(): void {\n void this.atlas.signOut();\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { AtlasService } from '../atlas.service';\nimport { classFor, type ElementKey } from '../appearance';\nimport { translate } from '../i18n';\n\n/**\n * `<atlas-organization-switcher>` — switch the active organization (or the\n * personal account). The Angular peer of React's `<OrganizationSwitcher/>`.\n */\n@Component({\n selector: 'atlas-organization-switcher',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div [class]=\"cls('menu', 'atlas-menu')\">\n <button [class]=\"cls('menuItem', 'atlas-menu-item')\" (click)=\"setActive(null)\">\n {{ t('organization.personal') }}\n </button>\n @for (membership of atlas.memberships(); track membership.organization.id) {\n <button\n [class]=\"cls('menuItem', 'atlas-menu-item')\"\n [disabled]=\"membership.organization.id === atlas.organization()?.organization?.id\"\n (click)=\"setActive(membership.organization.id)\"\n >\n {{ membership.organization.name }}\n </button>\n }\n </div>\n `,\n})\nexport class OrganizationSwitcherComponent {\n protected readonly atlas = inject(AtlasService);\n\n protected t(key: string): string {\n return translate(this.atlas.localization, key);\n }\n\n protected cls(key: ElementKey, base: string): string {\n return classFor(key, this.atlas.appearance, base);\n }\n\n protected setActive(organizationId: string | null): void {\n void this.atlas.setActiveOrganization(organizationId);\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { AtlasService } from '../atlas.service';\nimport { classFor, type ElementKey } from '../appearance';\nimport { translate } from '../i18n';\n\n/**\n * `<atlas-user-profile>` — the signed-in user's account surface (emails,\n * security). The Angular peer of React's `<UserProfile/>`. Renders nothing when\n * there is no user.\n */\n@Component({\n selector: 'atlas-user-profile',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (atlas.user(); as user) {\n <div [class]=\"cls('card', 'atlas-card')\">\n <h1>{{ t('userProfile.title') }}</h1>\n\n <section>\n <h2>{{ t('userProfile.emailsSection') }}</h2>\n <ul>\n @for (email of user.email_addresses ?? []; track email.id) {\n <li>\n {{ email.email_address }}\n @if (!email.verified) {\n <em> — {{ t('userProfile.unverified') }}</em>\n }\n </li>\n }\n </ul>\n </section>\n\n <section>\n <h2>{{ t('userProfile.securitySection') }}</h2>\n <p>{{ user.mfa_enabled ? '2FA on' : '2FA off' }}</p>\n </section>\n </div>\n }\n `,\n})\nexport class UserProfileComponent {\n protected readonly atlas = inject(AtlasService);\n\n protected t(key: string): string {\n return translate(this.atlas.localization, key);\n }\n\n protected cls(key: ElementKey, base: string): string {\n return classFor(key, this.atlas.appearance, base);\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { AtlasService } from '../atlas.service';\nimport { AtlasProtectDirective } from '../directives/protect.directive';\nimport { classFor, type ElementKey } from '../appearance';\nimport { translate } from '../i18n';\n\n/**\n * `<atlas-organization-profile>` — the active organization's surface. The\n * Angular peer of React's `<OrganizationProfile/>`. Management controls are\n * gated on the ACTIVE org role via `*atlasProtect`, matching the server's rule\n * rather than duplicating a looser one. Renders nothing with no active org.\n */\n@Component({\n selector: 'atlas-organization-profile',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AtlasProtectDirective],\n template: `\n @if (atlas.organization(); as membership) {\n <div [class]=\"cls('card', 'atlas-card')\">\n <h1>{{ membership.organization.name }}</h1>\n <p>{{ t('organization.roleLabel') }}: {{ membership.role }}</p>\n\n <button *atlasProtect=\"{ permission: 'org:sys_memberships:manage' }\">\n {{ t('organization.invite') }}\n </button>\n </div>\n }\n `,\n})\nexport class OrganizationProfileComponent {\n protected readonly atlas = inject(AtlasService);\n\n protected t(key: string): string {\n return translate(this.atlas.localization, key);\n }\n\n protected cls(key: ElementKey, base: string): string {\n return classFor(key, this.atlas.appearance, base);\n }\n}\n","import { AtlasSignedInDirective } from './directives/signed-in.directive';\nimport { AtlasSignedOutDirective } from './directives/signed-out.directive';\nimport { AtlasLoadingDirective } from './directives/loading.directive';\nimport { AtlasLoadedDirective } from './directives/loaded.directive';\nimport { AtlasProtectDirective } from './directives/protect.directive';\nimport { AtlasRootDirective } from './directives/atlas-root.directive';\nimport { SignInComponent } from './components/sign-in.component';\nimport { SignUpComponent } from './components/sign-up.component';\nimport { UserButtonComponent } from './components/user-button.component';\nimport { OrganizationSwitcherComponent } from './components/organization-switcher.component';\nimport { UserProfileComponent } from './components/user-profile.component';\nimport { OrganizationProfileComponent } from './components/organization-profile.component';\n\n/**\n * Every standalone directive and component the SDK ships. Import the array in a\n * standalone component's `imports`, or rely on `AtlasModule` re-exporting it for\n * NgModule-based apps:\n *\n * ```ts\n * @Component({ standalone: true, imports: [...ATLAS_UI], template: '…' })\n * ```\n */\nexport const ATLAS_UI = [\n AtlasSignedInDirective,\n AtlasSignedOutDirective,\n AtlasLoadingDirective,\n AtlasLoadedDirective,\n AtlasProtectDirective,\n AtlasRootDirective,\n SignInComponent,\n SignUpComponent,\n UserButtonComponent,\n OrganizationSwitcherComponent,\n UserProfileComponent,\n OrganizationProfileComponent,\n] as const;\n","import {\n ENVIRONMENT_INITIALIZER,\n EnvironmentProviders,\n ModuleWithProviders,\n NgModule,\n Provider,\n inject,\n makeEnvironmentProviders,\n} from '@angular/core';\nimport { ATLAS_OPTIONS, type AtlasOptions } from './atlas.config';\nimport { AtlasService } from './atlas.service';\nimport { ATLAS_UI } from './atlas.ui';\n\n/**\n * Standalone-provider entry point (Angular 17+). Register Atlas once at the\n * application root — the direct analogue of wrapping the tree in React's\n * `<AtlasProvider publishableKey>`:\n *\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideAtlas({ publishableKey: 'pk_test_…' }),\n * provideRouter(routes),\n * ],\n * });\n * ```\n *\n * The returned providers make {@link AtlasService} injectable and eagerly\n * construct it, so the SDK begins its first boot (redirect-completion + session\n * read) as soon as the app starts — matching the React provider mounting on the\n * first render.\n */\nexport function provideAtlas(options: AtlasOptions): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: ATLAS_OPTIONS, useValue: options },\n AtlasService,\n {\n // Eagerly instantiate AtlasService so its boot runs at startup rather than\n // lazily on first injection — the equivalent of the provider mounting.\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => {\n inject(AtlasService);\n },\n },\n ]);\n}\n\n/**\n * NgModule entry point for apps not yet on the standalone bootstrap. Import\n * `AtlasModule.forRoot({ publishableKey })` once in the root module; feature\n * modules import `AtlasModule` (no args) to use the directives/components.\n */\n@NgModule({\n // Standalone directives/components are re-exported so NgModule consumers get\n // them just by importing AtlasModule, the way they would with a classic module.\n imports: [...ATLAS_UI],\n exports: [...ATLAS_UI],\n})\nexport class AtlasModule {\n static forRoot(options: AtlasOptions): ModuleWithProviders<AtlasModule> {\n const providers: Provider[] = [\n { provide: ATLAS_OPTIONS, useValue: options },\n AtlasService,\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => {\n inject(AtlasService);\n },\n },\n ];\n return { ngModule: AtlasModule, providers };\n }\n}\n","import { inject } from '@angular/core';\nimport {\n CanActivateChildFn,\n CanActivateFn,\n Router,\n type UrlTree,\n} from '@angular/router';\nimport { firstValueFrom } from 'rxjs';\nimport { filter, take } from 'rxjs/operators';\nimport { evaluate, type ProtectCondition } from '@atlasauth/authz';\nimport { AtlasService } from '../atlas.service';\n\nexport interface AtlasGuardOptions extends ProtectCondition {\n /**\n * Where to send a user who fails the check. When set, the guard returns a\n * `UrlTree` (a redirect); when omitted it simply returns `false` and the\n * navigation is cancelled. A common value is your sign-in route.\n */\n redirectTo?: string;\n /**\n * When true, append the attempted URL as a `redirect_url` query param on the\n * `redirectTo` target, so the sign-in page can send the user back afterwards.\n * Ignored unless `redirectTo` is set. Defaults to true.\n */\n preserveReturnUrl?: boolean;\n}\n\n/**\n * Route guard factory that gates a route on session — and optionally on a\n * permission/role. The Angular peer of using `<SignedIn>` / `<Protect>` to fence\n * a page, expressed as a `CanActivateFn`.\n *\n * ```ts\n * export const routes: Routes = [\n * { path: 'dashboard', canActivate: [atlasGuard({ redirectTo: '/sign-in' })], ... },\n * {\n * path: 'admin',\n * canActivate: [atlasGuard({ permission: 'org:admin', redirectTo: '/' })],\n * ...\n * },\n * ];\n * ```\n *\n * The guard first waits for the SDK to finish booting, so a hard refresh onto a\n * protected URL does not bounce to sign-in before the session has been read.\n * Like the components, this is UX, not security: the server enforces the same\n * checks on every request.\n */\nexport function atlasGuard(options: AtlasGuardOptions = {}): CanActivateFn {\n const { redirectTo, preserveReturnUrl = true, ...condition } = options;\n\n return async (_route, state): Promise<boolean | UrlTree> => {\n const atlas = inject(AtlasService);\n const router = inject(Router);\n\n // Wait for boot to settle so we judge against a real answer, not `loading`.\n await firstValueFrom(\n atlas.status$.pipe(\n filter((s) => s !== 'loading'),\n take(1),\n ),\n );\n\n const allowed = evaluate(atlas.claims(), condition as ProtectCondition).allowed;\n if (allowed) return true;\n\n if (redirectTo) {\n return router.createUrlTree([redirectTo], {\n queryParams: preserveReturnUrl ? { redirect_url: state.url } : undefined,\n });\n }\n return false;\n };\n}\n\n/**\n * The `CanActivateChild` form of {@link atlasGuard}, for gating a whole child\n * route subtree with one declaration.\n */\nexport function atlasChildGuard(options: AtlasGuardOptions = {}): CanActivateChildFn {\n const guard = atlasGuard(options);\n return (route, state) => guard(route, state);\n}\n","/**\n * Conditional-rendering authorization primitive — re-exported unchanged from\n * `@atlasauth/authz`, the ONE evaluator every Atlas SDK shares. `*atlasProtect` in\n * this package and `<Protect>` in `@atlasauth/react` therefore judge a condition\n * identically, and the server checking the same permission is what actually\n * stops a request; these helpers only decide what a user is shown.\n */\nexport {\n type ProtectCondition,\n type ProtectOutcome,\n type ProtectReason,\n evaluate,\n hasFromClaims,\n} from '@atlasauth/authz';\n","/**\n * Public data shapes, mirrored 1:1 from `@atlasauth/react`'s `types.ts` so an app\n * can move between the React and Angular SDKs without re-typing its models.\n */\n\nexport interface SessionClaims {\n sub: string;\n sid: string;\n exp: number;\n org_id?: string;\n org_slug?: string;\n org_role?: string;\n org_permissions?: string[];\n mfa?: boolean;\n [claim: string]: unknown;\n}\n\nexport interface AtlasUser {\n id: string;\n first_name: string | null;\n last_name: string | null;\n username: string | null;\n image_url: string | null;\n public_metadata: Record<string, unknown>;\n unsafe_metadata: Record<string, unknown>;\n mfa_enabled: boolean;\n has_password: boolean;\n email_addresses?: Array<{\n id: string;\n email_address: string;\n verified: boolean;\n primary: boolean;\n }>;\n}\n\nexport interface AtlasOrganizationMembership {\n role: string;\n organization: {\n id: string;\n name: string;\n slug: string;\n image_url: string | null;\n };\n}\n\nexport interface AtlasSession {\n id: string;\n status: string;\n last_active_organization_id: string | null;\n}\n\n/** The three-state auth lifecycle, identical to the React provider's. */\nexport type AuthStatus = 'loading' | 'signed_in' | 'signed_out';\n","/**\n * The FAPI client and the server-driven sign-in flow driver live in `@atlasauth/js`\n * — the pure, framework-agnostic browser flow. This thin re-export lets the\n * Angular components, guards and services resolve the driver from one place, so\n * the Angular `<atlas-sign-in>` and the React `<SignIn/>` drive the exact same\n * endpoints and cannot diverge in what the server sees.\n */\nexport {\n FapiClient,\n advance,\n prepareFactor,\n pollAttempt,\n shouldKeepPolling,\n requestForStep,\n flowFromPending,\n initialFlow,\n getProviderToken,\n type FapiClientOptions,\n type FapiResponse,\n type FlowState,\n type ProviderToken,\n} from '@atlasauth/js';\n","/**\n * `@atlasauth/angular` — the official Angular SDK for Atlas, the Angular peer of\n * `@atlasauth/react`. Public surface.\n */\n\n// Configuration + DI\nexport { ATLAS_OPTIONS, type AtlasOptions } from './lib/atlas.config';\nexport { provideAtlas, AtlasModule } from './lib/provide-atlas';\n\n// Core service (the AtlasProvider + hooks equivalent)\nexport { AtlasService } from './lib/atlas.service';\n\n// Structural directives + the theming host directive\nexport { AtlasSignedInDirective } from './lib/directives/signed-in.directive';\nexport { AtlasSignedOutDirective } from './lib/directives/signed-out.directive';\nexport { AtlasLoadingDirective } from './lib/directives/loading.directive';\nexport { AtlasLoadedDirective } from './lib/directives/loaded.directive';\nexport { AtlasProtectDirective } from './lib/directives/protect.directive';\nexport { AtlasRootDirective } from './lib/directives/atlas-root.directive';\n\n// Components\nexport { SignInComponent } from './lib/components/sign-in.component';\nexport { SignUpComponent } from './lib/components/sign-up.component';\nexport { UserButtonComponent } from './lib/components/user-button.component';\nexport { OrganizationSwitcherComponent } from './lib/components/organization-switcher.component';\nexport { UserProfileComponent } from './lib/components/user-profile.component';\nexport { OrganizationProfileComponent } from './lib/components/organization-profile.component';\nexport { AttemptFlowComponent } from './lib/components/attempt-flow.component';\nexport {\n SignUpFormComponent,\n type SignUpFormSubmit,\n} from './lib/components/sign-up-form.component';\nexport { AtlasCaptchaSlotDirective } from './lib/directives/captcha-slot.directive';\nexport { AtlasFlowController } from './lib/components/flow-controller';\nexport { ATLAS_UI } from './lib/atlas.ui';\n\n// Route guards\nexport {\n atlasGuard,\n atlasChildGuard,\n type AtlasGuardOptions,\n} from './lib/guards/atlas.guard';\n\n// Theming, i18n, authorization, data shapes, FAPI re-exports\nexport * from './lib/appearance';\nexport * from './lib/i18n';\nexport * from './lib/protect';\nexport * from './lib/types';\nexport * from './lib/fapi';\n\n// The instance's public sign-in / sign-up settings the prebuilt forms read\n// (`AtlasFlowController.settings`), and the captcha types they render.\nexport type {\n InstanceSettings,\n PublicSignUpField,\n CaptchaController,\n CaptchaFlowKey,\n CaptchaWidgetMode,\n FlowCaptcha,\n EmailDelivery,\n SignOutOptions,\n SignOutResult,\n} from '@atlasauth/js';\n\n// `AtlasService.signOut()` resolves a `SignOutResult`; `{ strict: true }`\n// rejects with a `SignOutError` when the revoke was never confirmed.\nexport { SignOutError } from '@atlasauth/js';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["fetchProviderToken","i1.AtlasSignedInDirective","i2.AtlasSignedOutDirective","i3.AtlasLoadingDirective","i4.AtlasLoadedDirective","i5.AtlasProtectDirective","i6.AtlasRootDirective","i7.SignInComponent","i8.SignUpComponent","i9.UserButtonComponent","i10.OrganizationSwitcherComponent","i11.UserProfileComponent","i12.OrganizationProfileComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"atlasauth-angular.mjs","sources":["../../src/lib/atlas.config.ts","../../src/lib/appearance.ts","../../src/lib/i18n.ts","../../src/lib/version.ts","../../src/lib/atlas.service.ts","../../src/lib/directives/toggle.directive.ts","../../src/lib/directives/signed-in.directive.ts","../../src/lib/directives/signed-out.directive.ts","../../src/lib/directives/loading.directive.ts","../../src/lib/directives/loaded.directive.ts","../../src/lib/directives/protect.directive.ts","../../src/lib/directives/atlas-root.directive.ts","../../src/lib/directives/captcha-slot.directive.ts","../../src/lib/components/attempt-flow.component.ts","../../src/lib/components/flow-controller.ts","../../src/lib/components/sign-in.component.ts","../../src/lib/components/sign-up-form.component.ts","../../src/lib/components/sign-up.component.ts","../../src/lib/components/user-button.component.ts","../../src/lib/components/organization-switcher.component.ts","../../src/lib/components/user-profile.component.ts","../../src/lib/components/organization-profile.component.ts","../../src/lib/atlas.ui.ts","../../src/lib/provide-atlas.ts","../../src/lib/guards/atlas.guard.ts","../../src/lib/protect.ts","../../src/lib/types.ts","../../src/lib/fapi.ts","../../src/public-api.ts","../../src/atlasauth-angular.ts"],"sourcesContent":["import type { SignOutEvent } from '@atlasauth/js';\nimport { InjectionToken } from '@angular/core';\nimport type { Appearance } from './appearance';\nimport type { Catalog } from './i18n';\n\n/**\n * Configuration for the Atlas Angular SDK — the Angular analogue of the props\n * passed to React's `<AtlasProvider>`.\n */\nexport interface AtlasOptions {\n /** The instance's publishable key (`pk_…`). Required. */\n publishableKey: string;\n /**\n * The instance's Frontend API: an absolute URL such as\n * `\"https://auth.example.com\"`, or `\"same-origin\"` / a path such as `\"/atlas\"`\n * behind a reverse proxy on the app's own origin (requests then go to\n * `/v1/...` on the app's host). Required at runtime — `AtlasService` throws an\n * `AtlasConfigError` (`FRONTEND_API_REQUIRED` / `FRONTEND_API_INVALID`) when\n * it is missing or malformed. Optional in the type only so existing call sites\n * keep compiling.\n */\n frontendApi?: string;\n /** Design tokens + per-element class overrides. See {@link Appearance}. */\n appearance?: Appearance;\n /** A localization catalog merged over `en-US`. */\n localization?: Catalog;\n /**\n * A `fetch` implementation to use instead of the global one — handy for SSR\n * or tests. Defaults to `globalThis.fetch`.\n */\n fetchImpl?: typeof fetch;\n /**\n * Called once each time a signed-in user becomes signed out, on every path:\n * `reason` is `user`, `other_tab`, `session_expired`, `revoked` (ended\n * elsewhere, seen on the next refresh) or `unknown`. See also\n * `AtlasService.signOut$`.\n */\n onSignOut?: (event: SignOutEvent) => void;\n}\n\n/**\n * DI token carrying the resolved {@link AtlasOptions}. Populated by\n * {@link provideAtlas} (standalone) or {@link AtlasModule.forRoot} (NgModule)\n * and read by {@link AtlasService}. Applications rarely inject this directly.\n */\nexport const ATLAS_OPTIONS = new InjectionToken<AtlasOptions>('ATLAS_OPTIONS');\n","/**\n * §10.3 theming.\n *\n * \"appearance prop: design tokens (colors, radius, font, spacing) + per-element\n * class overrides (elements: { formButtonPrimary: \"…\" }). No iframe — components\n * render in the host DOM so Tailwind/CSS just works.\"\n *\n * Rendering in the host DOM is the decision everything else follows from. An\n * iframe would isolate styles perfectly and be unusable: it cannot be sized to\n * its content reliably, it breaks password managers, it breaks autofill, and a\n * Tailwind class the customer writes has no effect inside it. Sharing the DOM\n * means the customer's CSS reaches our markup, which is exactly what they want\n * and what makes an override system necessary rather than decorative.\n *\n * Element classes are APPENDED to ours, never replacing them. A customer adding\n * `className=\"rounded-xl\"` wants a rounder button, not an unstyled one — and\n * replacement is a support burden where every override starts by rebuilding the\n * component's base styles from scratch.\n */\n\nimport {\n renderDesignAppearance,\n type AppearanceRender,\n type DesignAppearance,\n type DesignWarn,\n type InstanceDesign,\n} from '@atlasauth/design/runtime';\n\nexport { instanceDesignFrom } from '@atlasauth/design/runtime';\nexport type { AppearanceRender, AtlasDesign, InstanceDesign, PresetId } from '@atlasauth/design/runtime';\n\nexport interface DesignTokens {\n colorPrimary?: string;\n colorText?: string;\n colorBackground?: string;\n colorDanger?: string;\n colorBorder?: string;\n borderRadius?: string;\n fontFamily?: string;\n spacingUnit?: string;\n}\n\n/** Every element a customer may target. Named for what it IS, not where it sits. */\nexport type ElementKey =\n | 'root'\n | 'card'\n | 'headerTitle'\n | 'headerSubtitle'\n | 'formField'\n | 'formFieldLabel'\n | 'formFieldInput'\n | 'formFieldError'\n | 'formButtonPrimary'\n | 'formButtonSecondary'\n | 'socialButton'\n | 'dividerText'\n | 'footerAction'\n | 'avatar'\n | 'menu'\n | 'menuItem'\n | 'badge';\n\nexport interface Appearance extends DesignAppearance {\n /** A prebuilt token theme to start from (pre-design-system themes). */\n baseTheme?: keyof typeof THEMES;\n /**\n * Legacy design tokens. Without a design they set the `--atlas-*` variables\n * exactly as before; with one they map onto it.\n */\n variables?: DesignTokens;\n elements?: Partial<Record<ElementKey, string>>;\n // From DesignAppearance:\n // preset?: PresetId a design preset (replaces the dashboard design as the base)\n // design?: AtlasDesign structured overrides, highest precedence\n // instanceDesign?: boolean apply the dashboard design automatically (default true)\n}\n\nexport const DEFAULT_TOKENS: Required<DesignTokens> = {\n colorPrimary: '#5b5bd6',\n colorText: '#1c1c1f',\n colorBackground: '#ffffff',\n colorDanger: '#d64545',\n colorBorder: '#e4e4e9',\n borderRadius: '8px',\n fontFamily: 'ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif',\n spacingUnit: '4px',\n};\n\n/**\n * §10.3: \"prebuilt themes shipped (default, dark, neobrutalist as a demo of the\n * override system)\". Neobrutalist exists to prove the token set is expressive\n * enough for a theme that looks nothing like the default — a theming system\n * that only produces tasteful variations of itself is not a theming system.\n */\nexport const THEMES = {\n default: DEFAULT_TOKENS,\n dark: {\n ...DEFAULT_TOKENS,\n colorText: '#e6e9ef',\n colorBackground: '#14171c',\n colorBorder: '#242932',\n colorPrimary: '#6ea8fe',\n },\n neobrutalist: {\n ...DEFAULT_TOKENS,\n colorPrimary: '#ffe600',\n colorText: '#000000',\n colorBackground: '#ffffff',\n colorBorder: '#000000',\n borderRadius: '0px',\n fontFamily: '\"Courier New\", ui-monospace, monospace',\n },\n} as const satisfies Record<string, Required<DesignTokens>>;\n\n/**\n * Resolve tokens: defaults, then the base theme, then explicit variables.\n *\n * Later wins, and `undefined` never overwrites. A customer setting one variable\n * on the dark theme expects the other eleven to stay dark, not silently revert\n * to the light defaults.\n */\nexport function resolveTokens(appearance?: Appearance): Required<DesignTokens> {\n const base = appearance?.baseTheme ? THEMES[appearance.baseTheme] : DEFAULT_TOKENS;\n const overrides = appearance?.variables ?? {};\n\n const resolved = { ...DEFAULT_TOKENS, ...base };\n for (const [key, value] of Object.entries(overrides)) {\n if (value !== undefined) resolved[key as keyof DesignTokens] = value;\n }\n return resolved;\n}\n\n/** Tokens as CSS custom properties, for the host DOM to inherit. */\nexport function cssVariables(tokens: Required<DesignTokens>): Record<string, string> {\n const vars: Record<string, string> = {};\n for (const [key, value] of Object.entries(tokens)) {\n // camelCase → --atlas-kebab-case, which is what a customer writes in CSS.\n vars[`--atlas-${key.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`)}`] = value;\n }\n return vars;\n}\n\n/**\n * Combine our base class with the customer's override.\n *\n * Appended, never replaced — a customer adding `rounded-xl` wants a rounder\n * button, not an unstyled one. Theirs comes last so it wins on equal\n * specificity, which is the behaviour anyone writing Tailwind expects.\n */\nexport function classFor(\n element: ElementKey,\n appearance: Appearance | undefined,\n base: string,\n): string {\n const override = appearance?.elements?.[element];\n return override ? `${base} ${override}` : base;\n}\n\n// ---- the design system ---------------------------------------------------------\n\n/**\n * The legacy tokens the developer chose EXPLICITLY: a non-default `baseTheme`\n * plus `variables`. Only these map onto a design — the token defaults must not\n * overwrite the dashboard design.\n */\nexport function explicitTokens(appearance?: Appearance): DesignTokens {\n const out: DesignTokens = {};\n if (appearance?.baseTheme && appearance.baseTheme !== 'default') {\n Object.assign(out, THEMES[appearance.baseTheme]);\n }\n for (const [key, value] of Object.entries(appearance?.variables ?? {})) {\n if (value !== undefined) out[key as keyof DesignTokens] = value;\n }\n return out;\n}\n\n/**\n * Turn an `appearance` (+ the instance's dashboard design from the Frontend\n * API) into root attributes and a stylesheet — the same semantics as\n * `@atlasauth/react`. Precedence, lowest first: dashboard design < `preset` <\n * `variables` (and a non-default `baseTheme`) < `design`. Without a dashboard\n * design and without `preset`/`design`, the output is exactly the\n * pre-design-system one: the token variables, no stylesheet, no attributes.\n */\nexport function renderAppearance(\n appearance: Appearance | undefined,\n instanceDesign: InstanceDesign | null | undefined,\n options: { frontendApi?: string; warn?: DesignWarn } = {},\n): AppearanceRender {\n return renderDesignAppearance(appearance, instanceDesign, {\n tokens: explicitTokens(appearance),\n legacyStyle: () => cssVariables(resolveTokens(appearance)),\n frontendApi: options.frontendApi,\n warn: options.warn,\n });\n}\n","/**\n * §10.3: \"Every string passes through an i18n catalog; en-US ships, catalog\n * format documented for community locales.\"\n *\n * A flat key-to-string map rather than nested objects, because nesting looks\n * tidier and makes a missing key a runtime crash on `undefined.of.a.chain`\n * rather than a visible fallback.\n *\n * A missing key renders the KEY, not an empty string. A blank button is a bug\n * nobody can report; a button reading `signIn.submit` is one anyone can.\n */\n\nexport type Catalog = Record<string, string>;\n\nexport const EN_US: Catalog = {\n 'signIn.title': 'Sign in',\n 'signIn.subtitle': 'to continue to {application}',\n 'signIn.identifierLabel': 'Email address',\n 'signIn.passwordLabel': 'Password',\n 'signIn.submit': 'Continue',\n 'signIn.forgotPassword': 'Forgot password?',\n 'signIn.noAccount': 'No account?',\n 'signIn.signUpLink': 'Sign up',\n 'signIn.orDivider': 'or',\n 'signIn.socialButton': 'Continue with {provider}',\n 'signIn.emailCodeLabel': 'Verification code',\n 'signIn.useEmailCode': 'Email me a code',\n 'signIn.codeSentTo': 'We sent a code to {email}. Enter it below.',\n 'signIn.resendCode': 'Resend code',\n 'signIn.magicLinkSent': 'Check your email for a sign-in link.',\n 'signIn.checkOtherTab': 'You can close this tab — you are signed in where you started.',\n\n 'signUp.title': 'Create your account',\n 'signUp.submit': 'Continue',\n 'signUp.haveAccount': 'Already have an account?',\n 'signUp.signInLink': 'Sign in',\n 'signUp.emailLabel': 'Email address',\n 'signUp.passwordLabel': 'Password',\n 'signUp.optionalField': '{label} (optional)',\n 'signUp.selectPlaceholder': 'Select…',\n 'signUp.consentAgree': 'I agree to the',\n 'signUp.consentNotice': 'By continuing you agree to the',\n 'signUp.terms': 'Terms of Service',\n 'signUp.privacy': 'Privacy Policy',\n 'signUp.and': 'and',\n // = EMAIL_UNAVAILABLE_MESSAGE from @atlasauth/js.\n 'signUp.emailUnavailable':\n \"This app can't send email right now. Try another sign-in method or contact the app owner.\",\n\n 'captcha.prompt': 'Complete the security check to continue.',\n 'captcha.required': 'Please complete the security check, then try again.',\n 'captcha.failed': \"The security check didn't pass. Please try again.\",\n 'captcha.checking': 'Checking your browser…',\n 'captcha.verified': 'Security check complete.',\n 'captcha.puzzlePrompt': \"Select every picture that shows the same shape as this one. Colour and size don't matter.\",\n 'captcha.puzzleConfirm': 'Confirm',\n 'captcha.puzzleTile': 'Picture {n}',\n 'captcha.puzzleAlternative': \"Can't do the picture check? Use a longer automatic check instead.\",\n\n 'mfa.title': 'Two-step verification',\n 'mfa.subtitle': 'Enter the code from your authenticator app.',\n 'mfa.codeLabel': 'Code',\n 'mfa.enrollFirstCodeLabel': 'Code from your authenticator app',\n 'mfa.enrollSecondCodeLabel': 'The next code it shows',\n 'mfa.usePasskey': 'Use a passkey instead',\n 'mfa.useBackupCode': 'Use a recovery code',\n 'mfa.submit': 'Verify',\n\n 'reset.title': 'Reset your password',\n 'reset.submit': 'Send reset code',\n 'reset.newPasswordLabel': 'New password',\n\n 'userButton.manageAccount': 'Manage account',\n 'userButton.signOut': 'Sign out',\n 'userButton.signOutAll': 'Sign out of all devices',\n\n 'userProfile.title': 'Account',\n 'userProfile.profileSection': 'Profile',\n 'userProfile.emailsSection': 'Email addresses',\n 'userProfile.securitySection': 'Security',\n 'userProfile.devicesSection': 'Active devices',\n 'userProfile.dangerSection': 'Danger zone',\n 'userProfile.addEmail': 'Add an email address',\n 'userProfile.makePrimary': 'Make primary',\n 'userProfile.unverified': 'Unverified',\n 'userProfile.revokeDevice': 'Sign out',\n 'userProfile.deleteAccount': 'Delete account',\n\n 'organization.switcher': 'Switch organization',\n 'organization.personal': 'Personal account',\n 'organization.members': 'Members',\n 'organization.invite': 'Invite member',\n 'organization.roleLabel': 'Role',\n\n 'error.generic': 'Something went wrong. Please try again.',\n 'error.network': 'We could not reach the server. Check your connection.',\n\n // Server errors, by the stable `reason` the Frontend API sends. Shown instead\n // of the server's `message` (see `localizedErrorMessage` in @atlasauth/js).\n 'error.form_password_incorrect': 'Those credentials are incorrect.',\n 'error.form_code_incorrect': 'That code is incorrect.',\n 'error.form_code_already_used': 'That code has already been used. Wait for a new one.',\n 'error.form_code_expired': 'That code has expired. Request a new one.',\n 'error.form_code_max_attempts': 'Too many incorrect codes. Request a new code.',\n 'error.form_link_invalid': 'That sign-in link is invalid or has already been used.',\n 'error.form_identifier_not_found': \"We couldn't find an account with those details.\",\n 'error.form_identifier_exists': \"There's already an account for this email. Sign in with {methods}.\",\n 'error.form_password_pwned': 'This password has appeared in a known data breach. Please choose a different one.',\n 'error.form_password_too_short': 'Password must be at least {min_length} characters.',\n 'error.form_password_too_long': 'Password must be at most {max_length} characters.',\n 'error.form_password_requires_uppercase': 'Password must contain an uppercase letter.',\n 'error.form_password_requires_lowercase': 'Password must contain a lowercase letter.',\n 'error.form_password_requires_number': 'Password must contain a number.',\n 'error.form_password_requires_symbol': 'Password must contain a symbol.',\n 'error.form_password_not_allowed': 'That password is not allowed. Choose a different one.',\n 'error.form_password_contains_identifier': 'Password must not contain your email or username.',\n 'error.form_password_same_as_current': 'Your new password must be different from your current one.',\n 'error.form_password_reused': 'Your new password must not match any of your last {history_count} passwords.',\n 'error.password_expired': 'Your password has expired. Reset it to continue.',\n 'error.email_not_verified': 'Your email address is not verified yet. Verify it before signing in with your password.',\n 'error.sign_in_token_invalid': 'That sign-in token is invalid or has expired.',\n 'error.too_many_attempts': 'Too many failed attempts. Try again later.',\n 'error.too_many_requests': 'Too many requests. Please try again later.',\n 'error.captcha_required': 'Please complete the security check, then try again.',\n 'error.captcha_failed': \"The security check didn't pass. Please try again.\",\n 'error.captcha_unavailable': 'The security check is unavailable right now. Please try again later.',\n 'error.email_delivery_unavailable': \"This app can't send email right now. Try another sign-in method or contact the app owner.\",\n 'error.strategy_disabled': 'This sign-in method is not available for this app.',\n 'error.sign_up_restricted': 'Sign-up on this app is by invitation only.',\n 'error.waitlisted': \"You're on the waitlist. We'll email you when a place opens up.\",\n 'error.identifier_not_allowed': 'This email or phone number is not allowed on this app.',\n 'error.disposable_email_blocked': 'Sign-up with a disposable or temporary email address is not allowed.',\n 'error.sso_required': 'This organization requires signing in through single sign-on.',\n 'error.sign_ins_disabled': 'Sign-ins are temporarily disabled.',\n 'error.sign_ups_disabled': 'Sign-ups are temporarily disabled.',\n 'error.high_risk_blocked': 'This sign-in was blocked because it looked unusual.',\n 'error.sms_region_blocked': 'Text messages are not available for this phone number.',\n};\n\n/**\n * Look up a key and interpolate `{placeholders}`.\n *\n * An unknown placeholder is left visible for the same reason a missing key is:\n * `Continue with {provider}` in the UI is a bug report waiting to be filed,\n * whereas `Continue with ` is one nobody notices until a customer does.\n */\nexport function translate(\n catalog: Catalog,\n key: string,\n variables: Record<string, string> = {},\n): string {\n const template = catalog[key] ?? EN_US[key] ?? key;\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => variables[name] ?? match);\n}\n\n/** Merge a community locale over en-US so a partial translation still renders. */\nexport function withFallback(locale: Catalog): Catalog {\n return { ...EN_US, ...locale };\n}\n","import type { AtlasSdkInfo } from '@atlasauth/js';\n\n/** This package's version, sent as `X-Atlas-SDK` (kept in step with package.json by a test). */\nexport const ATLAS_ANGULAR_VERSION = '0.6.0';\nexport const ATLAS_ANGULAR_SDK: AtlasSdkInfo = { name: '@atlasauth/angular', version: ATLAS_ANGULAR_VERSION };\n","import {\n Injectable,\n OnDestroy,\n PLATFORM_ID,\n Signal,\n computed,\n inject,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject, Observable, Subject, combineLatest } from 'rxjs';\nimport { distinctUntilChanged, map } from 'rxjs/operators';\nimport {\n FapiClient,\n SignOutGuard,\n catalogLocale,\n localizedErrorMessage,\n type ErrorLike,\n TokenCache,\n closeOAuthPopupAfterSignIn,\n completeOAuthPopupLanding,\n getProviderToken as fetchProviderToken,\n mapOAuthPopupPayload,\n msUntilRefresh,\n readExpiry,\n readRedirectResult,\n resolveFrontendApi,\n stripRedirectParams,\n type ProviderToken,\n type RedirectResult,\n type SignOutOptions,\n type SignOutResult,\n SDK_HEADER,\n SignOutNotifier,\n getTemplateToken,\n reportSdkAdvisory,\n sdkHeaderValue,\n signOutReasonFromClient,\n type SignOutEvent,\n type SignOutListener,\n type SignOutReason,\n} from '@atlasauth/js';\nimport { evaluate, type ProtectCondition } from '@atlasauth/authz';\nimport { ATLAS_OPTIONS } from './atlas.config';\nimport {\n cssVariables,\n instanceDesignFrom,\n renderAppearance,\n resolveTokens,\n type Appearance,\n type AppearanceRender,\n type InstanceDesign,\n} from './appearance';\nimport { EN_US, withFallback, type Catalog } from './i18n';\nimport type {\n AtlasOrganizationMembership,\n AtlasSession,\n AtlasUser,\n AuthStatus,\n SessionClaims,\n} from './types';\nimport { ATLAS_ANGULAR_SDK } from './version';\n\n/**\n * `AtlasService` — the Angular peer of React's `<AtlasProvider>` + hooks.\n *\n * It holds exactly one thing that matters in memory: the short-lived JWT, in a\n * {@link TokenCache}. Not localStorage, not a cookie this code writes — the\n * refresh token is HttpOnly so browser script never touches it, and the JWT\n * lives only as long as the tab. Anything persisted would survive the tab and\n * become the first thing an XSS reads.\n *\n * Reactive auth state is exposed two ways so callers can pick their idiom:\n * - RxJS observables (`user$`, `session$`, `isSignedIn$`, …) — the primary API,\n * the analogue of the React hooks' return values.\n * - Angular signals (`user`, `session`, `isSignedIn`, …) — the same values as\n * `Signal<T>`, for templates and `computed()`.\n *\n * The imperative methods (`signOut`, `getToken`, `getProviderToken`,\n * `setActiveOrganization`, `reload`) mirror the actions the hooks return.\n */\n@Injectable({ providedIn: 'root' })\nexport class AtlasService implements OnDestroy {\n private readonly options = inject(ATLAS_OPTIONS);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n private readonly baseUrl: string;\n private readonly publishableKey: string;\n private readonly doFetch: typeof fetch;\n\n private readonly cache = new TokenCache();\n private readonly fapiClient: FapiClient;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * The sessions this browser signed out of (tombstones in localStorage, per\n * Frontend API origin), the revoke and its background re-tries. Every reload /\n * refresh asks it before adopting a session, so a sign-out the server never\n * confirmed is not undone by the still-valid refresh cookie.\n */\n private readonly guard: SignOutGuard;\n private stopWatchingSignOut: (() => void) | null = null;\n\n private readonly catalog: Catalog;\n /** The language layer of `catalog` (the `localization` bundle alone; `EN_US` when none). */\n private readonly errorCatalog: Catalog;\n /** Sent to the Frontend API as `Accept-Language`: the `localization` bundle's `locale` tag. */\n private readonly requestLocale: string | undefined;\n\n /**\n * A sign-in attempt handed back by an OAuth redirect that still needs a second\n * factor (no session was issued). Null in the ordinary case; the `<atlas-sign-in>`\n * flow seeds itself from this so the user resumes at the 2FA step. Captured\n * once, synchronously, at construction — before any flow component reads it.\n */\n readonly pendingAttempt: { id: string; status: string } | null;\n\n // --- Reactive state (source of truth) ---------------------------------------\n\n private readonly _status = new BehaviorSubject<AuthStatus>('loading');\n private readonly _user = new BehaviorSubject<AtlasUser | null>(null);\n private readonly _session = new BehaviorSubject<AtlasSession | null>(null);\n private readonly _claims = new BehaviorSubject<SessionClaims | null>(null);\n private readonly _memberships = new BehaviorSubject<AtlasOrganizationMembership[]>([]);\n // ATL-S-30 sign-out events, on every path.\n private readonly notifier = new SignOutNotifier();\n private readonly _signOut = new Subject<SignOutEvent>();\n /**\n * Emits once each time a signed-in user becomes signed out: `reason` is\n * `user`, `other_tab`, `session_expired`, `revoked` (ended elsewhere, seen on\n * the next token refresh) or `unknown`. The place to reset an embedded\n * third party (a chat widget). Also dispatched as `atlas:signout` on `window`.\n */\n readonly signOut$: Observable<SignOutEvent> = this._signOut.asObservable();\n\n /** The three-state auth lifecycle: `loading` → `signed_in` | `signed_out`. */\n readonly status$: Observable<AuthStatus> = this._status.asObservable();\n readonly user$: Observable<AtlasUser | null> = this._user.asObservable();\n readonly session$: Observable<AtlasSession | null> = this._session.asObservable();\n readonly claims$: Observable<SessionClaims | null> = this._claims.asObservable();\n readonly memberships$: Observable<AtlasOrganizationMembership[]> =\n this._memberships.asObservable();\n\n /**\n * True once the SDK has finished its first boot. Distinguishing \"still loading\"\n * from \"signed out\" is what lets a template avoid the flash of a sign-in form\n * on every page load.\n */\n readonly isLoaded$: Observable<boolean> = this.status$.pipe(\n map((s) => s !== 'loading'),\n distinctUntilChanged(),\n );\n\n readonly isSignedIn$: Observable<boolean> = this.status$.pipe(\n map((s) => s === 'signed_in'),\n distinctUntilChanged(),\n );\n\n /** The active organization membership, derived from the token's `org_id` claim. */\n readonly organization$: Observable<AtlasOrganizationMembership | null> = combineLatest([\n this._memberships,\n this._claims,\n ]).pipe(\n map(\n ([memberships, claims]) =>\n memberships.find((m) => m.organization.id === claims?.org_id) ?? null,\n ),\n );\n\n // --- Signal mirror ----------------------------------------------------------\n\n readonly status: Signal<AuthStatus> = toSignal(this.status$, { initialValue: 'loading' });\n readonly user: Signal<AtlasUser | null> = toSignal(this.user$, { initialValue: null });\n readonly session: Signal<AtlasSession | null> = toSignal(this.session$, { initialValue: null });\n readonly claims: Signal<SessionClaims | null> = toSignal(this.claims$, { initialValue: null });\n readonly memberships: Signal<AtlasOrganizationMembership[]> = toSignal(this.memberships$, {\n initialValue: [] as AtlasOrganizationMembership[],\n });\n readonly isLoaded: Signal<boolean> = computed(() => this.status() !== 'loading');\n readonly isSignedIn: Signal<boolean> = computed(() => this.status() === 'signed_in');\n readonly organization: Signal<AtlasOrganizationMembership | null> = computed(() => {\n const orgId = this.claims()?.org_id;\n return this.memberships().find((m) => m.organization.id === orgId) ?? null;\n });\n\n constructor() {\n const options = this.options;\n this.publishableKey = options.publishableKey;\n // Throws an `AtlasConfigError` on a missing/invalid value rather than quietly\n // sending every request to a relative path on the app's origin.\n this.baseUrl = resolveFrontendApi(options.frontendApi, {\n component: 'provideAtlas() / AtlasModule.forRoot()',\n });\n this.doFetch = options.fetchImpl ?? ((...args: Parameters<typeof fetch>) => fetch(...args));\n\n this.catalog = options.localization ? withFallback(options.localization) : EN_US;\n this.errorCatalog = options.localization ?? EN_US;\n this.requestLocale = catalogLocale(options.localization);\n\n this.fapiClient = new FapiClient({\n publishableKey: this.publishableKey,\n baseUrl: this.baseUrl,\n fetchImpl: this.doFetch,\n locale: this.requestLocale,\n sdk: ATLAS_ANGULAR_SDK,\n });\n\n this.notifier.subscribe((event) => this._signOut.next(event));\n if (options.onSignOut) this.notifier.subscribe(options.onSignOut);\n\n this.guard = new SignOutGuard({\n request: (path, init) => this.call(path, init),\n frontendApi: this.baseUrl,\n });\n\n // Captured synchronously (not in an async init) so it is available before any\n // flow component reads it: a needs_second_factor redirect carries a status but\n // no ticket, and that is what the 2FA resume seeds from.\n this.pendingAttempt = this.isBrowser ? this.readPendingAttempt() : null;\n\n // Boot once, browser only. On the server there is no cookie jar to read a\n // session from, so we leave the state at `loading` and let hydration boot it.\n if (this.isBrowser) {\n // Another tab signed out of THIS session (its tombstone reached the shared\n // store): drop the token and re-check, which then refuses the session.\n this.stopWatchingSignOut = this.guard.watch(\n () => this.cache.peek()?.sessionId ?? this._session.value?.id,\n () => {\n this.notifier.expect('other_tab');\n this.cache.clear();\n void this.reload();\n },\n );\n void this.boot();\n }\n }\n\n ngOnDestroy(): void {\n this.stopWatchingSignOut?.();\n this.stopWatchingSignOut = null;\n this.guard.dispose();\n this.clearRefreshTimer();\n this._status.complete();\n this._user.complete();\n this._session.complete();\n this._claims.complete();\n this._memberships.complete();\n this._signOut.complete();\n }\n\n // --- Configuration accessors ------------------------------------------------\n\n get appearance(): Appearance | undefined {\n return this.options.appearance;\n }\n\n get localization(): Catalog {\n return this.catalog;\n }\n\n get frontendApi(): string {\n return this.baseUrl;\n }\n\n /** The `Accept-Language` sent to the Frontend API: the `localization` bundle's `locale` tag, if any. */\n get locale(): string | undefined {\n return this.requestLocale;\n }\n\n /**\n * The text to show for a server error, in the app's language: the catalog's\n * `error.<reason>` (looked up in the `localization` bundle, or `EN_US` when\n * none is set), else the server's message, else `error.generic`.\n */\n errorText(error: ErrorLike | string | null | undefined): string {\n return localizedErrorMessage(error, this.errorCatalog, this.catalog);\n }\n\n /** The catalog server errors are looked up in (see {@link errorText}). */\n get errorLocalization(): Catalog {\n return this.errorCatalog;\n }\n\n /** Tokens as CSS custom properties, for a host element to inherit. */\n appearanceVariables(): Record<string, string> {\n return cssVariables(resolveTokens(this.options.appearance));\n }\n\n /**\n * The full appearance render for a root element: inline variables, the\n * `data-atlas-*` attributes and the design stylesheet. Pass the dashboard\n * design (from {@link loadInstanceDesign}) to layer code overrides on it —\n * the same semantics as `@atlasauth/react`.\n */\n appearanceRender(instanceDesign?: InstanceDesign | null): AppearanceRender {\n return renderAppearance(this.options.appearance, instanceDesign ?? null, {\n frontendApi: this.baseUrl,\n });\n }\n\n /**\n * The design configured in the Atlas dashboard (`GET /v1/appearance`), or null\n * when there is none, it cannot be read, or the app opted out with\n * `appearance.instanceDesign: false`.\n */\n async loadInstanceDesign(): Promise<InstanceDesign | null> {\n if (this.options.appearance?.instanceDesign === false) return null;\n try {\n const response = await this.call('/v1/appearance');\n return response.ok ? instanceDesignFrom(await response.json()) : null;\n } catch {\n return null;\n }\n }\n\n /** A fresh {@link FapiClient} for driving a sign-in/sign-up flow. */\n createFapiClient(): FapiClient {\n return new FapiClient({\n publishableKey: this.publishableKey,\n baseUrl: this.baseUrl,\n locale: this.requestLocale,\n sdk: ATLAS_ANGULAR_SDK,\n });\n }\n\n // --- Imperative API (mirrors the React hooks' actions) ----------------------\n\n /**\n * The current session's JWT, always fresh: if the cached token is within 5s of\n * expiry it is refreshed first rather than handed over. Null when signed out.\n */\n /** The session JWT; with `{ template }` a short-lived named-template token (e.g. `'chatly'`). */\n async getToken(options?: { template?: string }): Promise<string | null> {\n if (options?.template) {\n const sessionId = this.cache.peek()?.sessionId ?? this._session.value?.id ?? null;\n return sessionId ? ((await getTemplateToken(this.fapiClient, sessionId, options.template))?.jwt ?? null) : null;\n }\n const usable = this.cache.get(5_000);\n if (usable) return usable.jwt;\n\n await this.refresh();\n return this.cache.get(5_000)?.jwt ?? null;\n }\n\n /**\n * The signed-in user's OWN live access token at a connected provider (Google,\n * GitHub, …), so the app can call that provider's API from the browser. Null\n * when there is no usable token — no linked account, or the provider granted /\n * kept none. The server refreshes a stale token on read; the refresh token is\n * never exposed.\n */\n /** Listen for sign-out on every path (see {@link signOut$}); returns the unsubscribe. */\n onSignOut(listener: SignOutListener): () => void {\n return this.notifier.subscribe(listener);\n }\n\n getProviderToken(provider: string): Promise<ProviderToken | null> {\n return fetchProviderToken(this.fapiClient, provider);\n }\n\n /** Imperative `has()` — the same evaluation `*atlasProtect` renders on. */\n has(condition: ProtectCondition): boolean {\n return evaluate(this._claims.value, condition).allowed;\n }\n\n /**\n * Revoke the current session server-side and drop all local auth state.\n *\n * The session id is remembered before the revoke (a tombstone shared by every\n * tab), so a reload, a token refresh, a sibling tab or a tab opened later never\n * re-adopts it — even when the revoke failed (it is retried once, then again in\n * the background) and the refresh cookie is still valid. Resolves\n * `{ revoked, activeSessionId? }`; with `{ strict: true }` an unconfirmed revoke\n * rejects with a `SignOutError` instead (after the local sign-out). A parked\n * session the server promoted on revoke is adopted. Front-channel logout runs\n * unless `{ frontchannel: false }`.\n */\n async signOut(options: SignOutOptions = {}): Promise<SignOutResult> {\n // With no cached token the guard finds the cookie session itself\n // (GET /v1/client), so a missing JWT never skips the revoke.\n const sessionId = this.cache.peek()?.sessionId ?? this._session.value?.id ?? null;\n this.notifier.expect('user');\n const attempt = await this.guard.revoke(sessionId, options);\n this.clearLocalState('user');\n if (this.guard.promoted(attempt)) await this.reload();\n return this.guard.settle(attempt, options);\n }\n\n /**\n * Switch the active organization (or `null` for the personal account). The\n * new token carries the new org claims, so the app's permission checks update\n * without a re-login.\n */\n async setActiveOrganization(organizationId: string | null): Promise<void> {\n const current = this.cache.peek();\n if (!current) return;\n\n const response = await this.call(`/v1/client/sessions/${current.sessionId}/touch`, {\n method: 'POST',\n body: JSON.stringify({ active_organization_id: organizationId }),\n });\n if (!response.ok) return;\n\n const body = (await response.json()) as { jwt: string };\n this.applyToken(body.jwt, current.sessionId);\n await this.reload();\n }\n\n /** Re-read `/v1/client`: refresh user, session, memberships and status. */\n async reload(): Promise<void> {\n try {\n const response = await this.call('/v1/client');\n if (!response.ok) throw new Error('boot failed');\n\n const body = (await response.json()) as {\n session: AtlasSession | null;\n user: AtlasUser | null;\n jwt?: string;\n organization_memberships?: AtlasOrganizationMembership[];\n };\n\n // A session this browser signed out of is never re-adopted from the\n // refresh cookie; the guard re-tries its revoke in the background.\n if (!body.session || !body.user || this.guard.refuse(body.session.id)) {\n this.clearLocalState(body.session ? 'other_tab' : signOutReasonFromClient(body));\n return;\n }\n this.notifier.clear();\n\n this._user.next(body.user);\n this._session.next(body.session);\n this._memberships.next(body.organization_memberships ?? []);\n if (body.jwt) this.applyToken(body.jwt, body.session.id);\n this._status.next('signed_in');\n this.scheduleRefresh();\n } catch {\n // A failed boot is NOT signed-out. Rendering a sign-in form because the\n // network hiccuped throws away a perfectly good session and forces a\n // needless re-authentication. Only promote loading → signed_out.\n if (this._status.value === 'loading') this._status.next('signed_out');\n }\n }\n\n // --- Internals --------------------------------------------------------------\n\n /**\n * §6.3 step 3: complete a redirect-based sign-in, then boot. An OAuth or\n * hosted-page flow lands back with a one-time ticket in the URL; exchange it\n * for cookies, scrub the URL so a reload cannot replay it, THEN read the\n * session. A redirect carrying only a status (a second factor is still owed)\n * has no ticket, so nothing is exchanged and the app boots signed-out.\n */\n private async boot(): Promise<void> {\n const fromUrl = readRedirectResult(window.location.search);\n let result: RedirectResult | null = fromUrl;\n\n // §oauth popup mode: this page may be the landing of a sign-in popup whose\n // opener a Cross-Origin-Opener-Policy severed (`#atlas_popup_result=…`).\n // The result is relayed to the opener, which redeems the ticket, and this\n // window closes. If no opener takes it (its tab is gone), finish here like\n // a redirect.\n const landing = await completeOAuthPopupLanding().catch(() => null);\n if (landing && !landing.delivered) {\n const outcome = mapOAuthPopupPayload(landing.payload);\n if (outcome?.ticket && outcome.attemptId) {\n result = { attemptId: outcome.attemptId, ticket: outcome.ticket };\n } else if (outcome?.continuationUrl) {\n // A second factor / connect step / provider error: the redirect flow's page.\n window.location.replace(outcome.continuationUrl);\n return;\n }\n }\n\n let exchanged = false;\n if (result?.ticket) {\n const response = await this.call('/v1/client/tickets/exchange', {\n method: 'POST',\n body: JSON.stringify({ attempt_id: result.attemptId, ticket: result.ticket }),\n }).catch(() => undefined);\n exchanged = !!response?.ok;\n }\n if (fromUrl) {\n window.history.replaceState({}, document.title, stripRedirectParams(window.location.href));\n }\n await this.reload();\n // Signed in inside the Atlas popup (the redirect flow ran in it): hand back\n // to the waiting opener and close. A no-op in an ordinary tab.\n if (exchanged) void closeOAuthPopupAfterSignIn();\n }\n\n private readPendingAttempt(): { id: string; status: string } | null {\n const result = readRedirectResult(window.location.search);\n return result?.status && !result.ticket\n ? { id: result.attemptId, status: result.status }\n : null;\n }\n\n private async call(path: string, init?: RequestInit): Promise<Response> {\n const response = await this.doFetch(`${this.baseUrl}${path}`, {\n ...init,\n // Cookies carry the session; a request without this is indistinguishable\n // from being signed out.\n credentials: 'include',\n headers: {\n 'x-publishable-key': this.publishableKey,\n // Names this SDK so the Frontend API can flag a version with a known bug.\n [SDK_HEADER]: sdkHeaderValue(ATLAS_ANGULAR_SDK),\n ...(init?.body ? { 'content-type': 'application/json' } : {}),\n ...init?.headers,\n },\n });\n reportSdkAdvisory(response, ATLAS_ANGULAR_SDK);\n return response;\n }\n\n private applyToken(jwt: string, sessionId: string): void {\n // An in-flight refresh must not resurrect a session signed out meanwhile.\n if (this.guard.isSignedOut(sessionId)) return;\n const expiresAt = readExpiry(jwt);\n if (!expiresAt) return;\n\n this.cache.set({ jwt, expiresAt, sessionId });\n this._claims.next(decodeClaims(jwt));\n }\n\n private async refresh(): Promise<void> {\n const current = this.cache.peek();\n if (!current) return;\n\n try {\n const response = await this.call(`/v1/client/sessions/${current.sessionId}/tokens`, {\n method: 'POST',\n });\n if (!response.ok) throw new Error('refresh failed');\n\n const body = (await response.json()) as { jwt: string; session_id: string };\n this.applyToken(body.jwt, body.session_id);\n this.scheduleRefresh();\n } catch {\n // The session may genuinely be gone. Re-boot rather than guess.\n await this.reload();\n }\n }\n\n private clearLocalState(reason?: SignOutReason): void {\n // A signed-in → signed-out transition tells the sign-out listeners why.\n const ended =\n this._status.value === 'signed_in'\n ? (this._session.value?.id ?? this.cache.peek()?.sessionId ?? null)\n : undefined;\n this.clearRefreshTimer();\n this.cache.clear();\n this._status.next('signed_out');\n this._user.next(null);\n this._session.next(null);\n this._claims.next(null);\n this._memberships.next([]);\n if (ended !== undefined) this.notifier.signedOut(ended, reason);\n else this.notifier.clear();\n }\n\n /** §7.4: proactive, jittered refresh scheduled from the token's own expiry. */\n private scheduleRefresh(): void {\n this.clearRefreshTimer();\n if (this._status.value !== 'signed_in') return;\n\n const token = this.cache.peek();\n if (!token) return;\n\n const delay = msUntilRefresh({ token, now: Date.now() });\n this.refreshTimer = setTimeout(() => void this.refresh(), delay);\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n}\n\n/** Decode a JWT payload without verifying it — a scheduling/UI hint only. */\nfunction decodeClaims(jwt: string): SessionClaims | null {\n const parts = jwt.split('.');\n if (parts.length !== 3) return null;\n try {\n return JSON.parse(\n atob(parts[1]!.replace(/-/g, '+').replace(/_/g, '/')),\n ) as SessionClaims;\n } catch {\n return null;\n }\n}\n","import {\n Directive,\n OnDestroy,\n OnInit,\n TemplateRef,\n ViewContainerRef,\n inject,\n} from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { AtlasService } from '../atlas.service';\n\n/**\n * Shared machinery for the boolean structural directives (`*atlasSignedIn`,\n * `*atlasSignedOut`, `*atlasLoading`, `*atlasLoaded`). A subclass names the\n * stream to gate on; this base mounts the embedded view exactly when that stream\n * is true and tears it down otherwise, mirroring how the React `<SignedIn>` /\n * `<SignedOut>` components render `children` or `null`.\n */\n@Directive()\nexport abstract class AtlasToggleDirective implements OnInit, OnDestroy {\n protected readonly atlas = inject(AtlasService);\n private readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n private readonly viewContainer = inject(ViewContainerRef);\n private sub?: Subscription;\n private shown = false;\n\n /** The stream whose truthiness controls whether the template renders. */\n protected abstract source(): Observable<boolean>;\n\n ngOnInit(): void {\n this.sub = this.source()\n .pipe(distinctUntilChanged())\n .subscribe((show) => this.render(show));\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n }\n\n private render(show: boolean): void {\n if (show && !this.shown) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.shown = true;\n } else if (!show && this.shown) {\n this.viewContainer.clear();\n this.shown = false;\n }\n }\n}\n","import { Directive } from '@angular/core';\nimport { Observable, combineLatest } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { AtlasToggleDirective } from './toggle.directive';\n\n/**\n * `*atlasSignedIn` — render the template only when the SDK has loaded AND the\n * user is signed in. The Angular peer of React's `<SignedIn>`. Renders nothing\n * while loading, so no signed-in UI flashes before boot completes.\n *\n * ```html\n * <div *atlasSignedIn>Welcome back</div>\n * ```\n */\n@Directive({\n selector: '[atlasSignedIn]',\n standalone: true,\n})\nexport class AtlasSignedInDirective extends AtlasToggleDirective {\n protected override source(): Observable<boolean> {\n return combineLatest([this.atlas.isLoaded$, this.atlas.isSignedIn$]).pipe(\n map(([loaded, signedIn]) => loaded && signedIn),\n );\n }\n}\n","import { Directive } from '@angular/core';\nimport { Observable, combineLatest } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { AtlasToggleDirective } from './toggle.directive';\n\n/**\n * `*atlasSignedOut` — render the template only when the SDK has loaded AND the\n * user is signed out. The Angular peer of React's `<SignedOut>`. Renders nothing\n * while loading, the symmetric partner of `*atlasSignedIn`.\n *\n * ```html\n * <atlas-sign-in *atlasSignedOut></atlas-sign-in>\n * ```\n */\n@Directive({\n selector: '[atlasSignedOut]',\n standalone: true,\n})\nexport class AtlasSignedOutDirective extends AtlasToggleDirective {\n protected override source(): Observable<boolean> {\n return combineLatest([this.atlas.isLoaded$, this.atlas.isSignedIn$]).pipe(\n map(([loaded, signedIn]) => loaded && !signedIn),\n );\n }\n}\n","import { Directive } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { AtlasToggleDirective } from './toggle.directive';\n\n/**\n * `*atlasLoading` — render the template only while the SDK is still booting. The\n * Angular peer of React's `<AtlasLoading>`; show a spinner here.\n */\n@Directive({\n selector: '[atlasLoading]',\n standalone: true,\n})\nexport class AtlasLoadingDirective extends AtlasToggleDirective {\n protected override source(): Observable<boolean> {\n return this.atlas.isLoaded$.pipe(map((loaded) => !loaded));\n }\n}\n","import { Directive } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { AtlasToggleDirective } from './toggle.directive';\n\n/**\n * `*atlasLoaded` — render the template only once the SDK has finished booting.\n * The Angular peer of React's `<AtlasLoaded>`, the symmetric partner of\n * `*atlasLoading`.\n */\n@Directive({\n selector: '[atlasLoaded]',\n standalone: true,\n})\nexport class AtlasLoadedDirective extends AtlasToggleDirective {\n protected override source(): Observable<boolean> {\n return this.atlas.isLoaded$;\n }\n}\n","import {\n Directive,\n Input,\n OnDestroy,\n OnInit,\n TemplateRef,\n ViewContainerRef,\n inject,\n} from '@angular/core';\nimport { BehaviorSubject, Subscription, combineLatest } from 'rxjs';\nimport { AtlasService } from '../atlas.service';\nimport { evaluate, type ProtectCondition } from '@atlasauth/authz';\n\n/**\n * `*atlasProtect` — render the template only when the active organization role\n * satisfies a {@link ProtectCondition}. The Angular peer of React's\n * `<Protect permission=\"…\">`.\n *\n * A RENDERING helper, never an authorization boundary: anyone can flip the\n * condition in devtools. The server checking the same permission is what\n * actually stops them — this directive's only job is to avoid showing a control\n * that would fail.\n *\n * ```html\n * <button *atlasProtect=\"{ permission: 'org:sys_memberships:manage' }\">Invite</button>\n *\n * <!-- with a fallback (identical microsyntax to *ngIf … else) -->\n * <div *atlasProtect=\"{ role: 'admin' }; else denied\">Admin tools</div>\n * <ng-template #denied>You lack access.</ng-template>\n * ```\n *\n * An empty condition (`*atlasProtect`) means simply \"signed in\".\n */\n@Directive({\n selector: '[atlasProtect]',\n standalone: true,\n})\nexport class AtlasProtectDirective implements OnInit, OnDestroy {\n private readonly atlas = inject(AtlasService);\n private readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n private readonly viewContainer = inject(ViewContainerRef);\n\n private readonly condition$ = new BehaviorSubject<ProtectCondition>({});\n private elseTemplate: TemplateRef<unknown> | null = null;\n private sub?: Subscription;\n private rendered: 'main' | 'else' | 'none' = 'none';\n\n /** The condition to evaluate. An empty/omitted value means \"signed in\". */\n @Input()\n set atlasProtect(condition: ProtectCondition | '' | null | undefined) {\n this.condition$.next(condition || {});\n }\n\n /** Template rendered when the condition is not met (the `else` branch). */\n @Input()\n set atlasProtectElse(template: TemplateRef<unknown> | null) {\n this.elseTemplate = template;\n // Re-render against the current state so a late-bound else takes effect.\n this.condition$.next(this.condition$.value);\n }\n\n ngOnInit(): void {\n this.sub = combineLatest([this.atlas.status$, this.atlas.claims$, this.condition$]).subscribe(\n ([status, claims, condition]) => {\n if (status === 'loading') {\n this.show('none');\n return;\n }\n this.show(evaluate(claims, condition).allowed ? 'main' : 'else');\n },\n );\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n }\n\n private show(which: 'main' | 'else' | 'none'): void {\n if (which === this.rendered) return;\n this.viewContainer.clear();\n\n if (which === 'main') {\n this.viewContainer.createEmbeddedView(this.templateRef);\n } else if (which === 'else' && this.elseTemplate) {\n this.viewContainer.createEmbeddedView(this.elseTemplate);\n }\n this.rendered = which;\n }\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { Directive, ElementRef, OnInit, PLATFORM_ID, Renderer2, inject } from '@angular/core';\nimport { applyAppearanceToDom } from '@atlasauth/design/runtime';\nimport { AtlasService } from '../atlas.service';\n\n/**\n * `atlasRoot` — apply the resolved appearance design tokens as `--atlas-*` CSS\n * custom properties (and the `atlas-root` class) onto its host element, so the\n * Atlas components rendered inside inherit them.\n *\n * React does this with the wrapping `<div className=\"atlas-root\" style={…}>`\n * inside `<AtlasProvider>`. Angular has no single wrapping element, so a\n * consumer opts in by putting `atlasRoot` on whatever element encloses the\n * Atlas UI (commonly the app root):\n *\n * ```html\n * <div atlasRoot>\n * <router-outlet></router-outlet>\n * </div>\n * ```\n *\n * With a design (a code-level `appearance.preset` / `appearance.design`, or\n * the dashboard design, fetched in the browser) the host also gets the stable\n * `data-atlas-*` attributes and the design stylesheet is added to `<head>` once.\n */\n@Directive({\n selector: '[atlasRoot]',\n standalone: true,\n})\nexport class AtlasRootDirective implements OnInit {\n private readonly atlas = inject(AtlasService);\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly renderer = inject(Renderer2);\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n\n ngOnInit(): void {\n const host = this.el.nativeElement;\n this.renderer.addClass(host, 'atlas-root');\n // Custom properties via `style.setProperty` (written verbatim, never camelCased).\n let applied = applyAppearanceToDom(this.document, host, this.atlas.appearanceRender());\n if (!isPlatformBrowser(this.platformId)) return;\n void this.atlas.loadInstanceDesign().then((design) => {\n if (!design) return;\n applied = applyAppearanceToDom(this.document, host, this.atlas.appearanceRender(design), applied);\n });\n }\n}\n","import { Directive, ElementRef, Input, OnDestroy, OnInit, inject } from '@angular/core';\nimport type { CaptchaController } from '@atlasauth/js';\n\n/**\n * `[atlasCaptchaSlot]=\"controller\"` — the element a flow's captcha widget draws\n * into (see `createCaptchaController` in `@atlasauth/js`). Attaches the\n * controller to the host element while it is rendered and detaches it (removing\n * the widget) when it goes away.\n */\n@Directive({\n selector: '[atlasCaptchaSlot]',\n standalone: true,\n})\nexport class AtlasCaptchaSlotDirective implements OnInit, OnDestroy {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private current: CaptchaController | null = null;\n private initialized = false;\n\n @Input('atlasCaptchaSlot') set controller(next: CaptchaController | null) {\n if (next === this.current) return;\n if (this.initialized) this.current?.attach(null);\n this.current = next;\n if (this.initialized) this.current?.attach(this.host.nativeElement);\n }\n\n ngOnInit(): void {\n this.initialized = true;\n this.current?.attach(this.host.nativeElement);\n }\n\n ngOnDestroy(): void {\n this.current?.attach(null);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n inject,\n} from '@angular/core';\nimport {\n localizedErrorMessage,\n nextStep,\n type AttemptView,\n type CaptchaController,\n type FieldError,\n} from '@atlasauth/js';\nimport { AtlasService } from '../atlas.service';\nimport { AtlasCaptchaSlotDirective } from '../directives/captcha-slot.directive';\nimport { classFor, type ElementKey } from '../appearance';\nimport { translate } from '../i18n';\n\n/**\n * One rendered row of the flow. A uniform shape (rather than a discriminated\n * union) so the template accesses only fields that always exist — no reliance on\n * template control-flow narrowing of a loop variable, which varies by Angular\n * minor. For a `message` row, `labelKey` carries the message's i18n key.\n */\ninterface StepField {\n kind: 'input' | 'message';\n name: string;\n labelKey: string;\n type: string;\n}\n\n/**\n * The server-driven flow shell, shared by `<atlas-sign-in>` and\n * `<atlas-sign-up>`. The Angular peer of React's internal `AttemptFlow`.\n *\n * It contains NO decision about what comes next: it renders whatever `status`\n * the server returned, mapped through `nextStep` from `@atlasauth/js` (the same\n * exhaustive mapping the React SDK uses), so adding a step is a server change\n * and an out-of-date client degrades to a visible \"please update\" message rather\n * than a blank screen.\n */\n@Component({\n selector: 'atlas-attempt-flow',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AtlasCaptchaSlotDirective],\n template: `\n <div [class]=\"cls('card', 'atlas-card')\">\n <h1 [class]=\"cls('headerTitle', 'atlas-title')\">{{ t(titleKey) }}</h1>\n\n @for (error of formErrors(); track error.code) {\n <p [class]=\"cls('formFieldError', 'atlas-error')\" role=\"alert\">{{ errorText(error) }}</p>\n }\n\n <form (submit)=\"onSubmit($event)\">\n @if (codeSentText(); as sentText) {\n <p class=\"atlas-text\" data-atlas-code-sent=\"\">{{ sentText }}</p>\n }\n @for (f of fields(); track $index) {\n @if (f.kind === 'input') {\n <label class=\"atlas-field\">\n <span>{{ t(f.labelKey) }}</span>\n <input\n [class]=\"cls('formFieldInput', 'atlas-input')\"\n [type]=\"f.type\"\n [attr.name]=\"f.name\"\n [value]=\"values[f.name] ?? ''\"\n (input)=\"setValue(f.name, $any($event.target).value)\"\n />\n @for (error of fieldErrorsFor(f.name); track error.code) {\n <span [class]=\"cls('formFieldError', 'atlas-error')\">{{ errorText(error) }}</span>\n }\n </label>\n } @else {\n <p>{{ t(f.labelKey) }}</p>\n }\n }\n\n @if (showCaptcha()) {\n <div class=\"atlas-captcha\" data-atlas-captcha=\"\" [atlasCaptchaSlot]=\"captcha\"></div>\n }\n\n @if (showSubmit()) {\n <button [class]=\"cls('formButtonPrimary', 'atlas-button')\" [disabled]=\"busy\" type=\"submit\">\n {{ t('signIn.submit') }}\n </button>\n }\n\n @if (showEmailCodeOption()) {\n <button\n [class]=\"cls('formButtonSecondary', 'atlas-button-secondary')\"\n [disabled]=\"busy\"\n type=\"button\"\n [attr.data-strategy]=\"preparedFactor === 'email_code' ? null : 'email_code'\"\n [attr.data-atlas-resend]=\"preparedFactor === 'email_code' ? '' : null\"\n (click)=\"chooseFactor.emit('email_code')\"\n >\n {{ t(preparedFactor === 'email_code' ? 'signIn.resendCode' : 'signIn.useEmailCode') }}\n </button>\n }\n </form>\n </div>\n `,\n})\nexport class AttemptFlowComponent {\n private readonly atlas = inject(AtlasService);\n\n @Input() attempt: AttemptView | null = null;\n @Input() busy = false;\n @Input() errors: FieldError[] = [];\n @Input() titleKey = 'signIn.title';\n /**\n * The sign-in captcha, drawn above the submit button on the identifier step\n * (an always-on sign-in captcha) and on the challenge step the server demands\n * with `needs_captcha`. Null when the flow draws none.\n */\n @Input() captcha: CaptchaController | null = null;\n /**\n * The first factors to offer on the `needs_first_factor` step — pass\n * `AtlasFlowController.firstFactors()`, which drops email code / link while the\n * app cannot deliver email. Null uses the server's list as-is.\n */\n @Input() firstFactors: string[] | null = null;\n /** The first factor already sent (`AtlasFlowController.preparedFactor()`): its code is collected. */\n @Input() preparedFactor: string | null = null;\n\n /** Emits the collected field values when the form is submitted. */\n @Output() submitFlow = new EventEmitter<Record<string, string>>();\n /** Emits when the user picks a first factor the server must send first (an emailed code). */\n @Output() chooseFactor = new EventEmitter<'email_code'>();\n\n protected values: Record<string, string> = {};\n\n protected t(key: string, vars?: Record<string, string>): string {\n return translate(this.atlas.localization, key, vars);\n }\n\n /** A server error in the app's language (`error.<reason>`, else the server's message). */\n protected errorText(error: FieldError): string {\n // `errorLocalization` is read defensively: a stand-in service may lack it.\n const layer = (this.atlas as { errorLocalization?: Record<string, string> }).errorLocalization;\n return localizedErrorMessage(error, layer ?? this.atlas.localization, this.atlas.localization);\n }\n\n protected cls(key: ElementKey, base: string): string {\n return classFor(key, this.atlas.appearance, base);\n }\n\n protected setValue(name: string, value: string): void {\n this.values = { ...this.values, [name]: value };\n }\n\n protected onSubmit(event: Event): void {\n event.preventDefault();\n this.submitFlow.emit(this.values);\n }\n\n protected formErrors(): FieldError[] {\n return this.errors.filter((error) => !error.param);\n }\n\n protected fieldErrorsFor(name: string): FieldError[] {\n return this.errors.filter((error) => error.param === name);\n }\n\n private step() {\n return this.attempt ? nextStep(this.attempt) : ({ kind: 'collect_identifier' } as const);\n }\n\n protected showCaptcha(): boolean {\n const kind = this.step().kind;\n return !!this.captcha && (kind === 'collect_identifier' || kind === 'collect_captcha');\n }\n\n /** The first factors on offer at a `needs_first_factor` step (empty on any other). */\n private offered(): string[] {\n const step = this.step();\n if (step.kind !== 'collect_first_factor') return [];\n return this.firstFactors ?? step.strategies;\n }\n\n protected showEmailCodeOption(): boolean {\n // Before the code is sent: the choice (or the retry of a failed automatic\n // send). After: \"Resend code\".\n return this.offered().includes('email_code');\n }\n\n /** The \"we sent a code to …\" line on the code step. */\n protected codeSentText(): string | null {\n if (this.step().kind !== 'collect_first_factor' || this.preparedFactor !== 'email_code') return null;\n return this.t('signIn.codeSentTo', { email: this.attempt?.identifier ?? '' });\n }\n\n protected showSubmit(): boolean {\n const kind = this.step().kind;\n // Nothing to submit on a first-factor step that only offers an emailed code\n // until that code is sent.\n if (kind === 'collect_first_factor') return this.fields().length > 0;\n return kind !== 'done' && kind !== 'await_oauth';\n }\n\n protected fields(): StepField[] {\n const step = this.step();\n switch (step.kind) {\n case 'collect_identifier':\n return [{ kind: 'input', name: 'identifier', labelKey: 'signIn.identifierLabel', type: 'email' }];\n case 'collect_first_factor': {\n if (this.preparedFactor === 'email_code') {\n return [{ kind: 'input', name: 'code', labelKey: 'signIn.emailCodeLabel', type: 'text' }];\n }\n // The password field unless the only offer is an emailed code (chosen\n // with the button below the form).\n const offered = this.offered();\n return offered.includes('email_code') && !offered.includes('password')\n ? []\n : [{ kind: 'input', name: 'password', labelKey: 'signIn.passwordLabel', type: 'password' }];\n }\n case 'collect_second_factor':\n return [{ kind: 'input', name: 'code', labelKey: 'mfa.codeLabel', type: 'text' }];\n case 'enroll_second_factor':\n // Two consecutive codes (§5.6): a phone with a fast clock fails here\n // rather than on every sign-in afterwards.\n return [\n { kind: 'input', name: 'code', labelKey: 'mfa.enrollFirstCodeLabel', type: 'text' },\n { kind: 'input', name: 'secondCode', labelKey: 'mfa.enrollSecondCodeLabel', type: 'text' },\n ];\n case 'collect_email_code':\n return [{ kind: 'input', name: 'code', labelKey: 'signIn.emailCodeLabel', type: 'text' }];\n case 'collect_new_password':\n return [{ kind: 'input', name: 'password', labelKey: 'reset.newPasswordLabel', type: 'password' }];\n case 'collect_captcha':\n // §5 the server withheld the attempt until a captcha clears. Solving the\n // widget resubmits the identifier on its own; the button retries.\n return [msg('captcha.prompt')];\n case 'await_oauth':\n return [msg('signIn.magicLinkSent')];\n case 'done':\n return [msg('signIn.checkOtherTab')];\n case 'restart':\n return [msg('error.generic')];\n default:\n // A status this SDK version does not know. An honest message beats a\n // blank login box the user cannot act on.\n return [msg('error.generic')];\n }\n }\n}\n\n/** A read-only message row: `labelKey` holds the i18n key of the text to show. */\nfunction msg(labelKey: string): StepField {\n return { kind: 'message', name: '', labelKey, type: 'text' };\n}\n","import { WritableSignal, signal } from '@angular/core';\nimport {\n FapiClient,\n advanceWithCaptcha,\n atlasCaptchaLabels,\n createCaptchaController,\n createSignUp,\n fetchInstanceSettings,\n flowNeedsCaptcha,\n signInCaptchaOptions,\n flowFromPending,\n initialFlow,\n nextStep,\n offeredFirstFactors,\n pollAttempt,\n prepareFactor,\n planFirstFactor,\n shouldKeepPolling,\n type CaptchaController,\n type FlowState,\n type InstanceSettings,\n} from '@atlasauth/js';\nimport { EN_US, translate } from '../i18n';\n\n/**\n * The server-driven sign-in / sign-up engine, shared by `<atlas-sign-in>` and\n * `<atlas-sign-up>` — the Angular counterpart of React's `useFlow` hook.\n *\n * It owns no decision about what comes next: every status comes back from the\n * server via `advance`, and this controller only posts whatever the current step\n * needs and re-renders the returned status. State lives in a signal so templates\n * update whether the app runs zoned or zoneless.\n *\n * `<atlas-sign-up>` starts the attempt with {@link create}\n * (`POST /v1/client/sign_ups`); the emailed-code step then runs through the same\n * {@link submit}. Both flows draw the instance's captcha (from\n * {@link loadSettings}) when it is required.\n */\nexport class AtlasFlowController {\n readonly state: WritableSignal<FlowState>;\n /**\n * The instance's public sign-in / sign-up settings (captcha, sign-up fields,\n * legal consent) from `GET /v1/appearance`; null until {@link loadSettings}\n * resolves, or when the server could not be reached.\n */\n readonly settings = signal<InstanceSettings | null>(null);\n /** The sign-in captcha (identifier step / `needs_captcha` challenge). */\n readonly captcha: CaptchaController = createCaptchaController(undefined, {\n // The Atlas captcha's words follow the form's catalog (read when drawn).\n atlasLabels: () => atlasCaptchaLabels(this.t),\n });\n /** The sign-up captcha (the create-account step). */\n readonly signUpCaptcha: CaptchaController = createCaptchaController(undefined, {\n atlasLabels: () => atlasCaptchaLabels(this.t),\n });\n /** Whether {@link captcha} currently draws a widget (for templates). */\n readonly captchaDrawn = signal(false);\n /** Whether {@link signUpCaptcha} currently draws a widget (for templates). */\n readonly signUpCaptchaDrawn = signal(false);\n /**\n * The first factor the server was asked to send ({@link prepare}) on the\n * current `needs_first_factor` step — the form then collects its code. Null\n * otherwise.\n */\n readonly preparedFactor = signal<'email_code' | null>(null);\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n private identifier = '';\n\n constructor(\n private readonly client: FapiClient,\n private readonly reload: () => Promise<void>,\n pending: { id: string; status: string } | null,\n /** Resolves the captcha messages' catalog keys. Defaults to en-US. */\n private readonly t: (key: string) => string = (key) => translate(EN_US, key),\n ) {\n // Seeded from a redirect that came back mid-flow (e.g. OAuth needing a second\n // factor) so the user resumes at the demanded step instead of starting over.\n this.state = signal<FlowState>(pending ? flowFromPending(pending) : initialFlow);\n this.syncCaptcha();\n }\n\n /** Fetch the instance's public settings and draw whatever captcha they require. */\n async loadSettings(): Promise<void> {\n const loaded = await fetchInstanceSettings(this.client);\n if (loaded) {\n this.settings.set(loaded);\n this.syncCaptcha();\n }\n }\n\n /**\n * The first factors to offer on a `needs_first_factor` step: the server's list\n * without email code / link while the app cannot deliver email\n * (`settings.emailDelivery.available === false`). Empty on any other step.\n */\n firstFactors(): string[] {\n const attempt = this.state().attempt;\n const step = attempt ? nextStep(attempt) : null;\n return step?.kind === 'collect_first_factor'\n ? offeredFirstFactors(step.strategies, this.settings()?.emailDelivery)\n : [];\n }\n\n /**\n * True when email + password sign-up cannot complete because the app cannot\n * send the verification email (`settings.emailDelivery.passwordSignUp === false`):\n * `<atlas-sign-up>` shows the \"can't send email\" notice instead of the form.\n */\n signUpEmailUnavailable(): boolean {\n return this.settings()?.emailDelivery.passwordSignUp === false;\n }\n\n /** False when a password reset email cannot be delivered — hide \"Forgot password?\". */\n passwordResetAvailable(): boolean {\n return this.settings()?.emailDelivery.passwordReset !== false;\n }\n\n /**\n * Ask the server to email a sign-in code for the current `needs_first_factor`\n * step (`POST …/prepare_first_factor`); the form then collects the code, which\n * {@link submit} posts as the `email_code` strategy.\n */\n async prepare(strategy: 'email_code'): Promise<void> {\n if (!this.firstFactors().includes(strategy)) return;\n this.state.update((current) => ({ ...current, busy: true, errors: [] }));\n const next = await prepareFactor(this.client, this.state(), strategy);\n this.setState(next);\n if (!next.errors.length) this.preparedFactor.set(strategy);\n }\n\n /** Keep both captchas in step with the settings and the flow's current step. */\n private syncCaptcha(): void {\n const settings = this.settings();\n const state = this.state();\n this.captcha.configure(\n signInCaptchaOptions(settings?.captchaFlows.signIn, state, () => void this.submit({})),\n );\n const signUpFlow = settings?.captchaFlows.signUp;\n this.signUpCaptcha.configure({\n flow: signUpFlow,\n active: !state.attempt && flowNeedsCaptcha(signUpFlow),\n });\n this.captchaDrawn.set(this.captcha.needed);\n this.signUpCaptchaDrawn.set(this.signUpCaptcha.needed);\n }\n\n private setState(next: FlowState): void {\n this.state.set(next);\n // A prepared factor belongs to the first-factor step it was sent for.\n if (next.attempt?.status !== 'needs_first_factor') this.preparedFactor.set(null);\n this.syncCaptcha();\n this.autoSend();\n }\n\n private autoSentFor: string | null = null;\n /**\n * With no password on offer, email the code as soon as the server asks for a\n * first factor — once per attempt, so a failed send waits for the user's retry\n * (the \"Email me a code\" button) instead of looping.\n */\n private autoSend(): void {\n const id = this.state().attempt?.id ?? null;\n if (!id || this.autoSentFor === id || this.preparedFactor()) return;\n if (planFirstFactor(this.firstFactors()).autoSend !== 'email_code') return;\n this.autoSentFor = id;\n void this.prepare('email_code');\n }\n\n /**\n * Advance the flow with the values the user typed. On completion, exchange the\n * one-time ticket for cookies over a same-origin request (FAPI is cross-origin\n * and cannot set the cookie on its own response), then re-boot so the rest of\n * the app sees a signed-in user.\n */\n async submit(values: Record<string, string>): Promise<void> {\n this.state.update((current) => ({ ...current, busy: true, errors: [] }));\n\n const out = await advanceWithCaptcha(this.client, this.state(), values, {\n captcha: this.captcha,\n identifier: this.identifier,\n t: this.t,\n });\n this.identifier = out.identifier;\n await this.finish(out.state);\n }\n\n /**\n * Create an account (`POST /v1/client/sign_ups`) from a create-account form's\n * values — email, password and any configured sign-up fields — carrying the\n * sign-up captcha's token when the instance requires one. The emailed code is\n * then posted with {@link submit}.\n */\n async create(values: Record<string, string>, consent = true): Promise<void> {\n this.state.update((current) => ({ ...current, busy: true, errors: [] }));\n const next = await createSignUp(this.client, values, {\n consent,\n captcha: this.signUpCaptcha,\n t: this.t,\n });\n await this.finish(next);\n }\n\n private async finish(next: FlowState): Promise<void> {\n this.setState(next);\n\n if (next.attempt?.status === 'complete') {\n if (next.ticket) {\n await this.client.post('/v1/client/tickets/exchange', {\n attempt_id: (next.attempt as { id?: string }).id,\n ticket: next.ticket,\n });\n }\n await this.reload();\n } else {\n // A magic-link step may now be pollable (a link opened on another device).\n this.syncPolling();\n }\n }\n\n /** Start/stop the §5.3 magic-link poll to match the current state. */\n syncPolling(): void {\n if (shouldKeepPolling(this.state())) {\n this.startPolling();\n } else {\n this.stopPolling();\n }\n }\n\n private startPolling(): void {\n if (this.pollTimer) return;\n this.pollTimer = setInterval(() => {\n void (async () => {\n const { state: next, ticket } = await pollAttempt(this.client, this.state());\n this.setState(next);\n if (!ticket || !next.attempt) return;\n\n // The ticket is exchanged by a normal request, so no session token ever\n // appears in a URL.\n await this.client.post('/v1/client/tickets/exchange', {\n attempt_id: (next.attempt as { id?: string }).id,\n ticket,\n });\n await this.reload();\n this.stopPolling();\n })();\n }, 2_000);\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n }\n\n /** Release the poll timer and the captcha widgets — call from the component's `ngOnDestroy`. */\n destroy(): void {\n this.stopPolling();\n this.captcha.destroy();\n this.signUpCaptcha.destroy();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnDestroy,\n OnInit,\n inject,\n} from '@angular/core';\nimport { AtlasService } from '../atlas.service';\nimport { translate } from '../i18n';\nimport { AttemptFlowComponent } from './attempt-flow.component';\nimport { AtlasFlowController } from './flow-controller';\n\n/**\n * `<atlas-sign-in>` — the full, multi-step sign-in flow driven entirely by the\n * server-side attempt status. The Angular peer of React's `<SignIn/>`. Draws the\n * instance's sign-in captcha when it is required (always-on, or a\n * `needs_captcha` challenge).\n *\n * ```html\n * <atlas-sign-in *atlasSignedOut afterUrl=\"/dashboard\"></atlas-sign-in>\n * ```\n */\n@Component({\n selector: 'atlas-sign-in',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AttemptFlowComponent],\n template: `\n <atlas-attempt-flow\n [attempt]=\"flow.state().attempt\"\n [busy]=\"flow.state().busy\"\n [errors]=\"flow.state().errors\"\n titleKey=\"signIn.title\"\n [captcha]=\"flow.captchaDrawn() ? flow.captcha : null\"\n [firstFactors]=\"flow.firstFactors()\"\n [preparedFactor]=\"flow.preparedFactor()\"\n (submitFlow)=\"flow.submit($event)\"\n (chooseFactor)=\"flow.prepare($event)\"\n ></atlas-attempt-flow>\n `,\n})\nexport class SignInComponent implements OnInit, OnDestroy {\n private readonly atlas = inject(AtlasService);\n\n /** Where to send the user once the flow completes. Reserved for host routing. */\n @Input() afterUrl?: string;\n\n protected readonly flow = new AtlasFlowController(\n this.atlas.createFapiClient(),\n () => this.atlas.reload(),\n // Resume mid-flow if an OAuth redirect came back owing a second factor.\n this.atlas.pendingAttempt,\n (key) => translate(this.atlas.localization, key),\n );\n\n ngOnInit(): void {\n // If seeded from a pending attempt that is already pollable, start polling.\n this.flow.syncPolling();\n // §5 the instance's captcha settings (switching captcha on in the dashboard\n // draws it here with no code change) and email delivery (no emailed-code\n // option while the app cannot send email).\n if (typeof window !== 'undefined') void this.flow.loadSettings();\n }\n\n ngOnDestroy(): void {\n this.flow.destroy();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n inject,\n} from '@angular/core';\nimport {\n localizedErrorMessage,\n type CaptchaController,\n type FieldError,\n type InstanceSettings,\n type PublicSignUpField,\n} from '@atlasauth/js';\nimport { AtlasService } from '../atlas.service';\nimport { classFor, type ElementKey } from '../appearance';\nimport { translate } from '../i18n';\nimport { AtlasCaptchaSlotDirective } from '../directives/captcha-slot.directive';\n\n/** What the create-account form emits: the values typed plus the consent tick. */\nexport interface SignUpFormSubmit {\n values: Record<string, string>;\n consent: boolean;\n}\n\n/**\n * The create-account step of `<atlas-sign-up>`: the instance's configured extra\n * fields, email + password, the legal-consent row and — when the instance\n * requires one on sign-up — the captcha widget. Values live on the component so\n * a refused submit never clears them. When the app cannot send the verification\n * email (`settings.emailDelivery.passwordSignUp === false`) it shows the\n * `signUp.emailUnavailable` notice instead of the form.\n */\n@Component({\n selector: 'atlas-sign-up-form',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AtlasCaptchaSlotDirective],\n template: `\n <div [class]=\"cls('card', 'atlas-card')\">\n <h1 [class]=\"cls('headerTitle', 'atlas-title')\">{{ t('signUp.title') }}</h1>\n\n @if (emailUnavailable()) {\n <!-- The app cannot send the verification email, so an email + password\n sign-up could never complete: say so instead of offering the form. -->\n <p [class]=\"cls('formFieldError', 'atlas-error')\" role=\"alert\" data-atlas-email-unavailable=\"\">\n {{ t('signUp.emailUnavailable') }}\n </p>\n } @else {\n @for (error of formErrors(); track error.code) {\n <p [class]=\"cls('formFieldError', 'atlas-error')\" role=\"alert\">{{ errorText(error) }}</p>\n }\n\n <form (submit)=\"onSubmit($event)\">\n @for (f of fields(); track f.key) {\n @if (f.type === 'radio' || f.type === 'multiselect') {\n <div [class]=\"cls('formField', 'atlas-field')\">\n <span [class]=\"cls('formFieldLabel', 'atlas-field-label')\">{{ label(f) }}</span>\n <span class=\"atlas-choices\">\n @for (o of f.options; track o) {\n <label class=\"atlas-choice\">\n <input\n [type]=\"f.type === 'radio' ? 'radio' : 'checkbox'\"\n [attr.name]=\"f.key\"\n [value]=\"o\"\n [checked]=\"picked(f.key).includes(o)\"\n (change)=\"toggle(f, o, $any($event.target).checked)\"\n />\n {{ o }}\n </label>\n }\n </span>\n @for (error of fieldErrorsFor(f.key); track error.code) {\n <span [class]=\"cls('formFieldError', 'atlas-error')\">{{ errorText(error) }}</span>\n }\n </div>\n } @else {\n <label [class]=\"cls('formField', 'atlas-field')\">\n <span [class]=\"cls('formFieldLabel', 'atlas-field-label')\">{{ label(f) }}</span>\n @if (f.type === 'checkbox') {\n <input\n type=\"checkbox\"\n [attr.name]=\"f.key\"\n [checked]=\"values[f.key] === 'true'\"\n (change)=\"setValue(f.key, $any($event.target).checked ? 'true' : '')\"\n />\n } @else if (f.type === 'select') {\n <select\n [class]=\"cls('formFieldInput', 'atlas-input')\"\n [attr.name]=\"f.key\"\n [value]=\"values[f.key] ?? ''\"\n [required]=\"f.required\"\n (change)=\"setValue(f.key, $any($event.target).value)\"\n >\n <option value=\"\">{{ f.placeholder ?? t('signUp.selectPlaceholder') }}</option>\n @for (o of f.options; track o) {\n <option [value]=\"o\">{{ o }}</option>\n }\n </select>\n } @else if (f.type === 'textarea') {\n <textarea\n [class]=\"cls('formFieldInput', 'atlas-input')\"\n [attr.name]=\"f.key\"\n rows=\"3\"\n [value]=\"values[f.key] ?? ''\"\n [required]=\"f.required\"\n [attr.placeholder]=\"f.placeholder\"\n (input)=\"setValue(f.key, $any($event.target).value)\"\n ></textarea>\n } @else {\n <input\n [class]=\"cls('formFieldInput', 'atlas-input')\"\n [type]=\"inputType(f)\"\n [attr.name]=\"f.key\"\n [value]=\"values[f.key] ?? ''\"\n [required]=\"f.required\"\n [attr.placeholder]=\"f.placeholder\"\n (input)=\"setValue(f.key, $any($event.target).value)\"\n />\n }\n @for (error of fieldErrorsFor(f.key); track error.code) {\n <span [class]=\"cls('formFieldError', 'atlas-error')\">{{ errorText(error) }}</span>\n }\n </label>\n }\n }\n\n <label [class]=\"cls('formField', 'atlas-field')\">\n <span [class]=\"cls('formFieldLabel', 'atlas-field-label')\">{{ t('signUp.emailLabel') }}</span>\n <input\n [class]=\"cls('formFieldInput', 'atlas-input')\"\n type=\"email\"\n name=\"email\"\n autocomplete=\"email\"\n required\n [value]=\"values['email'] ?? ''\"\n (input)=\"setValue('email', $any($event.target).value)\"\n />\n @for (error of fieldErrorsFor('email'); track error.code) {\n <span [class]=\"cls('formFieldError', 'atlas-error')\">{{ errorText(error) }}</span>\n }\n </label>\n\n <label [class]=\"cls('formField', 'atlas-field')\">\n <span [class]=\"cls('formFieldLabel', 'atlas-field-label')\">{{ t('signUp.passwordLabel') }}</span>\n <input\n [class]=\"cls('formFieldInput', 'atlas-input')\"\n type=\"password\"\n name=\"password\"\n autocomplete=\"new-password\"\n required\n [value]=\"values['password'] ?? ''\"\n (input)=\"setValue('password', $any($event.target).value)\"\n />\n @for (error of fieldErrorsFor('password'); track error.code) {\n <span [class]=\"cls('formFieldError', 'atlas-error')\">{{ errorText(error) }}</span>\n }\n </label>\n\n @if (showLegal()) {\n <label [class]=\"cls('formField', 'atlas-consent')\">\n @if (settings?.legal?.required) {\n <input\n type=\"checkbox\"\n name=\"consent\"\n [checked]=\"agreed\"\n (change)=\"agreed = $any($event.target).checked\"\n />\n }\n <span class=\"atlas-text\">\n {{ t(settings?.legal?.required ? 'signUp.consentAgree' : 'signUp.consentNotice') }}\n @if (settings?.legal?.termsUrl; as terms) {\n <a class=\"atlas-link\" [href]=\"terms\" target=\"_blank\" rel=\"noopener noreferrer\">{{ t('signUp.terms') }}</a>\n }\n @if (settings?.legal?.termsUrl && settings?.legal?.privacyUrl) {\n {{ t('signUp.and') }}\n }\n @if (settings?.legal?.privacyUrl; as privacy) {\n <a class=\"atlas-link\" [href]=\"privacy\" target=\"_blank\" rel=\"noopener noreferrer\">{{ t('signUp.privacy') }}</a>\n }.\n </span>\n @for (error of fieldErrorsFor('consent'); track error.code) {\n <span [class]=\"cls('formFieldError', 'atlas-error')\">{{ errorText(error) }}</span>\n }\n </label>\n }\n\n @if (captcha) {\n <div class=\"atlas-captcha\" data-atlas-captcha=\"\" [atlasCaptchaSlot]=\"captcha\"></div>\n }\n\n <button\n [class]=\"cls('formButtonPrimary', 'atlas-button')\"\n [disabled]=\"busy || !consentOk()\"\n type=\"submit\"\n >\n {{ t('signUp.submit') }}\n </button>\n </form>\n }\n </div>\n `,\n})\nexport class SignUpFormComponent {\n private readonly atlas = inject(AtlasService);\n\n @Input() settings: InstanceSettings | null = null;\n @Input() busy = false;\n @Input() errors: FieldError[] = [];\n @Input() captcha: CaptchaController | null = null;\n\n /** Emits the typed values and the consent tick when the form is submitted. */\n @Output() submitSignUp = new EventEmitter<SignUpFormSubmit>();\n\n protected values: Record<string, string> = {};\n protected agreed = false;\n\n protected t(key: string, vars?: Record<string, string>): string {\n return translate(this.atlas.localization, key, vars);\n }\n\n /** A server error in the app's language (`error.<reason>`, else the server's message). */\n protected errorText(error: FieldError): string {\n // `errorLocalization` is read defensively: a stand-in service may lack it.\n const layer = (this.atlas as { errorLocalization?: Record<string, string> }).errorLocalization;\n return localizedErrorMessage(error, layer ?? this.atlas.localization, this.atlas.localization);\n }\n\n protected cls(key: ElementKey, base: string): string {\n return classFor(key, this.atlas.appearance, base);\n }\n\n protected setValue(name: string, value: string): void {\n this.values = { ...this.values, [name]: value };\n }\n\n /** Email + password sign-up cannot complete: the app cannot send the verification email. */\n protected emailUnavailable(): boolean {\n return this.settings?.emailDelivery?.passwordSignUp === false;\n }\n\n protected fields(): PublicSignUpField[] {\n return this.settings?.signUpFields ?? [];\n }\n\n protected label(f: PublicSignUpField): string {\n return f.required ? f.label : this.t('signUp.optionalField', { label: f.label });\n }\n\n protected inputType(f: PublicSignUpField): string {\n return ['email', 'tel', 'url', 'number', 'date'].includes(f.type) ? f.type : 'text';\n }\n\n /** Same encoding as React, the embed widget and the hosted page: one value,\n * or a comma-joined list for multiselect. */\n protected picked(key: string): string[] {\n const value = this.values[key];\n return value ? value.split(', ') : [];\n }\n\n protected toggle(f: PublicSignUpField, option: string, on: boolean): void {\n if (f.type === 'radio') {\n this.setValue(f.key, option);\n return;\n }\n const current = this.picked(f.key);\n this.setValue(f.key, (on ? [...current, option] : current.filter((p) => p !== option)).join(', '));\n }\n\n protected showLegal(): boolean {\n const legal = this.settings?.legal;\n return !!legal && (!!legal.termsUrl || !!legal.privacyUrl);\n }\n\n protected consentOk(): boolean {\n return !this.settings?.legal?.required || this.agreed;\n }\n\n protected formErrors(): FieldError[] {\n return this.errors.filter((error) => !error.param);\n }\n\n protected fieldErrorsFor(name: string): FieldError[] {\n return this.errors.filter((error) => error.param === name);\n }\n\n protected onSubmit(event: Event): void {\n event.preventDefault();\n if (this.emailUnavailable() || !this.consentOk()) return;\n this.submitSignUp.emit({\n values: { ...this.values },\n consent: this.settings?.legal?.required ? this.agreed : true,\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnDestroy,\n OnInit,\n inject,\n} from '@angular/core';\nimport { AtlasService } from '../atlas.service';\nimport { translate } from '../i18n';\nimport { AttemptFlowComponent } from './attempt-flow.component';\nimport { SignUpFormComponent } from './sign-up-form.component';\nimport { AtlasFlowController } from './flow-controller';\n\n/**\n * `<atlas-sign-up>` — creates an account. The Angular peer of React's\n * `<SignUp/>`. The first step is the create-account form (the instance's\n * configured fields, email, password, legal consent and — when required — the\n * captcha), which POSTs `/v1/client/sign_ups`; from there it shares the flow\n * engine with `<atlas-sign-in>` (the emailed-code step, then the ticket\n * exchange), because the sequence of steps is decided by the server.\n *\n * ```html\n * <atlas-sign-up *atlasSignedOut></atlas-sign-up>\n * ```\n */\n@Component({\n selector: 'atlas-sign-up',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AttemptFlowComponent, SignUpFormComponent],\n template: `\n @if (flow.state().attempt) {\n <atlas-attempt-flow\n [attempt]=\"flow.state().attempt\"\n [busy]=\"flow.state().busy\"\n [errors]=\"flow.state().errors\"\n titleKey=\"signUp.title\"\n (submitFlow)=\"flow.submit($event)\"\n ></atlas-attempt-flow>\n } @else {\n <atlas-sign-up-form\n [settings]=\"flow.settings()\"\n [busy]=\"flow.state().busy\"\n [errors]=\"flow.state().errors\"\n [captcha]=\"flow.signUpCaptchaDrawn() ? flow.signUpCaptcha : null\"\n (submitSignUp)=\"flow.create($event.values, $event.consent)\"\n ></atlas-sign-up-form>\n }\n `,\n})\nexport class SignUpComponent implements OnInit, OnDestroy {\n private readonly atlas = inject(AtlasService);\n\n /** Where to send the user once the flow completes. Reserved for host routing. */\n @Input() afterUrl?: string;\n\n protected readonly flow = new AtlasFlowController(\n this.atlas.createFapiClient(),\n () => this.atlas.reload(),\n this.atlas.pendingAttempt,\n (key) => translate(this.atlas.localization, key),\n );\n\n ngOnInit(): void {\n // §5 the instance's sign-up fields, consent policy and captcha settings.\n if (typeof window !== 'undefined') void this.flow.loadSettings();\n }\n\n ngOnDestroy(): void {\n this.flow.destroy();\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { AtlasService } from '../atlas.service';\nimport { classFor, type ElementKey } from '../appearance';\nimport { translate } from '../i18n';\n\n/**\n * `<atlas-user-button>` — the signed-in user's avatar with a drop-down that can\n * sign them out. The Angular peer of React's `<UserButton/>`. Renders nothing\n * when there is no user.\n */\n@Component({\n selector: 'atlas-user-button',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (atlas.user(); as user) {\n <div class=\"atlas-user-button\">\n <button\n [class]=\"cls('avatar', 'atlas-avatar')\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"toggle()\"\n >\n @if (user.image_url) {\n <img [src]=\"user.image_url\" alt=\"\" />\n } @else {\n <span>{{ label().slice(0, 1) }}</span>\n }\n </button>\n\n @if (open()) {\n <div [class]=\"cls('menu', 'atlas-menu')\" role=\"menu\">\n <span [class]=\"cls('menuItem', 'atlas-menu-item')\">{{ label() }}</span>\n <button [class]=\"cls('menuItem', 'atlas-menu-item')\" (click)=\"signOut()\">\n {{ t('userButton.signOut') }}\n </button>\n </div>\n }\n </div>\n }\n `,\n})\nexport class UserButtonComponent {\n protected readonly atlas = inject(AtlasService);\n protected readonly open = signal(false);\n\n protected readonly label = computed(() => {\n const user = this.atlas.user();\n if (!user) return '';\n return [user.first_name, user.last_name].filter(Boolean).join(' ') || user.username || '';\n });\n\n protected t(key: string): string {\n return translate(this.atlas.localization, key);\n }\n\n protected cls(key: ElementKey, base: string): string {\n return classFor(key, this.atlas.appearance, base);\n }\n\n protected toggle(): void {\n this.open.update((o) => !o);\n }\n\n protected signOut(): void {\n void this.atlas.signOut();\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { AtlasService } from '../atlas.service';\nimport { classFor, type ElementKey } from '../appearance';\nimport { translate } from '../i18n';\n\n/**\n * `<atlas-organization-switcher>` — switch the active organization (or the\n * personal account). The Angular peer of React's `<OrganizationSwitcher/>`.\n */\n@Component({\n selector: 'atlas-organization-switcher',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div [class]=\"cls('menu', 'atlas-menu')\">\n <button [class]=\"cls('menuItem', 'atlas-menu-item')\" (click)=\"setActive(null)\">\n {{ t('organization.personal') }}\n </button>\n @for (membership of atlas.memberships(); track membership.organization.id) {\n <button\n [class]=\"cls('menuItem', 'atlas-menu-item')\"\n [disabled]=\"membership.organization.id === atlas.organization()?.organization?.id\"\n (click)=\"setActive(membership.organization.id)\"\n >\n {{ membership.organization.name }}\n </button>\n }\n </div>\n `,\n})\nexport class OrganizationSwitcherComponent {\n protected readonly atlas = inject(AtlasService);\n\n protected t(key: string): string {\n return translate(this.atlas.localization, key);\n }\n\n protected cls(key: ElementKey, base: string): string {\n return classFor(key, this.atlas.appearance, base);\n }\n\n protected setActive(organizationId: string | null): void {\n void this.atlas.setActiveOrganization(organizationId);\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { AtlasService } from '../atlas.service';\nimport { classFor, type ElementKey } from '../appearance';\nimport { translate } from '../i18n';\n\n/**\n * `<atlas-user-profile>` — the signed-in user's account surface (emails,\n * security). The Angular peer of React's `<UserProfile/>`. Renders nothing when\n * there is no user.\n */\n@Component({\n selector: 'atlas-user-profile',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (atlas.user(); as user) {\n <div [class]=\"cls('card', 'atlas-card')\">\n <h1>{{ t('userProfile.title') }}</h1>\n\n <section>\n <h2>{{ t('userProfile.emailsSection') }}</h2>\n <ul>\n @for (email of user.email_addresses ?? []; track email.id) {\n <li>\n {{ email.email_address }}\n @if (!email.verified) {\n <em> — {{ t('userProfile.unverified') }}</em>\n }\n </li>\n }\n </ul>\n </section>\n\n <section>\n <h2>{{ t('userProfile.securitySection') }}</h2>\n <p>{{ user.mfa_enabled ? '2FA on' : '2FA off' }}</p>\n </section>\n </div>\n }\n `,\n})\nexport class UserProfileComponent {\n protected readonly atlas = inject(AtlasService);\n\n protected t(key: string): string {\n return translate(this.atlas.localization, key);\n }\n\n protected cls(key: ElementKey, base: string): string {\n return classFor(key, this.atlas.appearance, base);\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { AtlasService } from '../atlas.service';\nimport { AtlasProtectDirective } from '../directives/protect.directive';\nimport { classFor, type ElementKey } from '../appearance';\nimport { translate } from '../i18n';\n\n/**\n * `<atlas-organization-profile>` — the active organization's surface. The\n * Angular peer of React's `<OrganizationProfile/>`. Management controls are\n * gated on the ACTIVE org role via `*atlasProtect`, matching the server's rule\n * rather than duplicating a looser one. Renders nothing with no active org.\n */\n@Component({\n selector: 'atlas-organization-profile',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AtlasProtectDirective],\n template: `\n @if (atlas.organization(); as membership) {\n <div [class]=\"cls('card', 'atlas-card')\">\n <h1>{{ membership.organization.name }}</h1>\n <p>{{ t('organization.roleLabel') }}: {{ membership.role }}</p>\n\n <button *atlasProtect=\"{ permission: 'org:sys_memberships:manage' }\">\n {{ t('organization.invite') }}\n </button>\n </div>\n }\n `,\n})\nexport class OrganizationProfileComponent {\n protected readonly atlas = inject(AtlasService);\n\n protected t(key: string): string {\n return translate(this.atlas.localization, key);\n }\n\n protected cls(key: ElementKey, base: string): string {\n return classFor(key, this.atlas.appearance, base);\n }\n}\n","import { AtlasSignedInDirective } from './directives/signed-in.directive';\nimport { AtlasSignedOutDirective } from './directives/signed-out.directive';\nimport { AtlasLoadingDirective } from './directives/loading.directive';\nimport { AtlasLoadedDirective } from './directives/loaded.directive';\nimport { AtlasProtectDirective } from './directives/protect.directive';\nimport { AtlasRootDirective } from './directives/atlas-root.directive';\nimport { SignInComponent } from './components/sign-in.component';\nimport { SignUpComponent } from './components/sign-up.component';\nimport { UserButtonComponent } from './components/user-button.component';\nimport { OrganizationSwitcherComponent } from './components/organization-switcher.component';\nimport { UserProfileComponent } from './components/user-profile.component';\nimport { OrganizationProfileComponent } from './components/organization-profile.component';\n\n/**\n * Every standalone directive and component the SDK ships. Import the array in a\n * standalone component's `imports`, or rely on `AtlasModule` re-exporting it for\n * NgModule-based apps:\n *\n * ```ts\n * @Component({ standalone: true, imports: [...ATLAS_UI], template: '…' })\n * ```\n */\nexport const ATLAS_UI = [\n AtlasSignedInDirective,\n AtlasSignedOutDirective,\n AtlasLoadingDirective,\n AtlasLoadedDirective,\n AtlasProtectDirective,\n AtlasRootDirective,\n SignInComponent,\n SignUpComponent,\n UserButtonComponent,\n OrganizationSwitcherComponent,\n UserProfileComponent,\n OrganizationProfileComponent,\n] as const;\n","import {\n ENVIRONMENT_INITIALIZER,\n EnvironmentProviders,\n ModuleWithProviders,\n NgModule,\n Provider,\n inject,\n makeEnvironmentProviders,\n} from '@angular/core';\nimport { ATLAS_OPTIONS, type AtlasOptions } from './atlas.config';\nimport { AtlasService } from './atlas.service';\nimport { ATLAS_UI } from './atlas.ui';\n\n/**\n * Standalone-provider entry point (Angular 17+). Register Atlas once at the\n * application root — the direct analogue of wrapping the tree in React's\n * `<AtlasProvider publishableKey>`:\n *\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideAtlas({ publishableKey: 'pk_test_…' }),\n * provideRouter(routes),\n * ],\n * });\n * ```\n *\n * The returned providers make {@link AtlasService} injectable and eagerly\n * construct it, so the SDK begins its first boot (redirect-completion + session\n * read) as soon as the app starts — matching the React provider mounting on the\n * first render.\n */\nexport function provideAtlas(options: AtlasOptions): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: ATLAS_OPTIONS, useValue: options },\n AtlasService,\n {\n // Eagerly instantiate AtlasService so its boot runs at startup rather than\n // lazily on first injection — the equivalent of the provider mounting.\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => {\n inject(AtlasService);\n },\n },\n ]);\n}\n\n/**\n * NgModule entry point for apps not yet on the standalone bootstrap. Import\n * `AtlasModule.forRoot({ publishableKey })` once in the root module; feature\n * modules import `AtlasModule` (no args) to use the directives/components.\n */\n@NgModule({\n // Standalone directives/components are re-exported so NgModule consumers get\n // them just by importing AtlasModule, the way they would with a classic module.\n imports: [...ATLAS_UI],\n exports: [...ATLAS_UI],\n})\nexport class AtlasModule {\n static forRoot(options: AtlasOptions): ModuleWithProviders<AtlasModule> {\n const providers: Provider[] = [\n { provide: ATLAS_OPTIONS, useValue: options },\n AtlasService,\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => {\n inject(AtlasService);\n },\n },\n ];\n return { ngModule: AtlasModule, providers };\n }\n}\n","import { inject } from '@angular/core';\nimport {\n CanActivateChildFn,\n CanActivateFn,\n Router,\n type UrlTree,\n} from '@angular/router';\nimport { firstValueFrom } from 'rxjs';\nimport { filter, take } from 'rxjs/operators';\nimport { evaluate, type ProtectCondition } from '@atlasauth/authz';\nimport { AtlasService } from '../atlas.service';\n\nexport interface AtlasGuardOptions extends ProtectCondition {\n /**\n * Where to send a user who fails the check. When set, the guard returns a\n * `UrlTree` (a redirect); when omitted it simply returns `false` and the\n * navigation is cancelled. A common value is your sign-in route.\n */\n redirectTo?: string;\n /**\n * When true, append the attempted URL as a `redirect_url` query param on the\n * `redirectTo` target, so the sign-in page can send the user back afterwards.\n * Ignored unless `redirectTo` is set. Defaults to true.\n */\n preserveReturnUrl?: boolean;\n}\n\n/**\n * Route guard factory that gates a route on session — and optionally on a\n * permission/role. The Angular peer of using `<SignedIn>` / `<Protect>` to fence\n * a page, expressed as a `CanActivateFn`.\n *\n * ```ts\n * export const routes: Routes = [\n * { path: 'dashboard', canActivate: [atlasGuard({ redirectTo: '/sign-in' })], ... },\n * {\n * path: 'admin',\n * canActivate: [atlasGuard({ permission: 'org:admin', redirectTo: '/' })],\n * ...\n * },\n * ];\n * ```\n *\n * The guard first waits for the SDK to finish booting, so a hard refresh onto a\n * protected URL does not bounce to sign-in before the session has been read.\n * Like the components, this is UX, not security: the server enforces the same\n * checks on every request.\n */\nexport function atlasGuard(options: AtlasGuardOptions = {}): CanActivateFn {\n const { redirectTo, preserveReturnUrl = true, ...condition } = options;\n\n return async (_route, state): Promise<boolean | UrlTree> => {\n const atlas = inject(AtlasService);\n const router = inject(Router);\n\n // Wait for boot to settle so we judge against a real answer, not `loading`.\n await firstValueFrom(\n atlas.status$.pipe(\n filter((s) => s !== 'loading'),\n take(1),\n ),\n );\n\n const allowed = evaluate(atlas.claims(), condition as ProtectCondition).allowed;\n if (allowed) return true;\n\n if (redirectTo) {\n return router.createUrlTree([redirectTo], {\n queryParams: preserveReturnUrl ? { redirect_url: state.url } : undefined,\n });\n }\n return false;\n };\n}\n\n/**\n * The `CanActivateChild` form of {@link atlasGuard}, for gating a whole child\n * route subtree with one declaration.\n */\nexport function atlasChildGuard(options: AtlasGuardOptions = {}): CanActivateChildFn {\n const guard = atlasGuard(options);\n return (route, state) => guard(route, state);\n}\n","/**\n * Conditional-rendering authorization primitive — re-exported unchanged from\n * `@atlasauth/authz`, the ONE evaluator every Atlas SDK shares. `*atlasProtect` in\n * this package and `<Protect>` in `@atlasauth/react` therefore judge a condition\n * identically, and the server checking the same permission is what actually\n * stops a request; these helpers only decide what a user is shown.\n */\nexport {\n type ProtectCondition,\n type ProtectOutcome,\n type ProtectReason,\n evaluate,\n hasFromClaims,\n} from '@atlasauth/authz';\n","/**\n * Public data shapes, mirrored 1:1 from `@atlasauth/react`'s `types.ts` so an app\n * can move between the React and Angular SDKs without re-typing its models.\n */\n\nexport interface SessionClaims {\n sub: string;\n sid: string;\n exp: number;\n org_id?: string;\n org_slug?: string;\n org_role?: string;\n org_permissions?: string[];\n mfa?: boolean;\n [claim: string]: unknown;\n}\n\nexport interface AtlasUser {\n id: string;\n first_name: string | null;\n last_name: string | null;\n username: string | null;\n image_url: string | null;\n public_metadata: Record<string, unknown>;\n unsafe_metadata: Record<string, unknown>;\n mfa_enabled: boolean;\n has_password: boolean;\n email_addresses?: Array<{\n id: string;\n email_address: string;\n verified: boolean;\n primary: boolean;\n }>;\n}\n\nexport interface AtlasOrganizationMembership {\n role: string;\n organization: {\n id: string;\n name: string;\n slug: string;\n image_url: string | null;\n };\n}\n\nexport interface AtlasSession {\n id: string;\n status: string;\n last_active_organization_id: string | null;\n}\n\n/** The three-state auth lifecycle, identical to the React provider's. */\nexport type AuthStatus = 'loading' | 'signed_in' | 'signed_out';\n","/**\n * The FAPI client and the server-driven sign-in flow driver live in `@atlasauth/js`\n * — the pure, framework-agnostic browser flow. This thin re-export lets the\n * Angular components, guards and services resolve the driver from one place, so\n * the Angular `<atlas-sign-in>` and the React `<SignIn/>` drive the exact same\n * endpoints and cannot diverge in what the server sees.\n */\nexport {\n FapiClient,\n advance,\n prepareFactor,\n pollAttempt,\n shouldKeepPolling,\n requestForStep,\n flowFromPending,\n initialFlow,\n getProviderToken,\n type FapiClientOptions,\n type FapiResponse,\n type FlowState,\n type ProviderToken,\n} from '@atlasauth/js';\n","/**\n * `@atlasauth/angular` — the official Angular SDK for Atlas, the Angular peer of\n * `@atlasauth/react`. Public surface.\n */\n\n// Configuration + DI\nexport { ATLAS_OPTIONS, type AtlasOptions } from './lib/atlas.config';\nexport { provideAtlas, AtlasModule } from './lib/provide-atlas';\n\n// Core service (the AtlasProvider + hooks equivalent)\nexport { AtlasService } from './lib/atlas.service';\n\n// Structural directives + the theming host directive\nexport { AtlasSignedInDirective } from './lib/directives/signed-in.directive';\nexport { AtlasSignedOutDirective } from './lib/directives/signed-out.directive';\nexport { AtlasLoadingDirective } from './lib/directives/loading.directive';\nexport { AtlasLoadedDirective } from './lib/directives/loaded.directive';\nexport { AtlasProtectDirective } from './lib/directives/protect.directive';\nexport { AtlasRootDirective } from './lib/directives/atlas-root.directive';\n\n// Components\nexport { SignInComponent } from './lib/components/sign-in.component';\nexport { SignUpComponent } from './lib/components/sign-up.component';\nexport { UserButtonComponent } from './lib/components/user-button.component';\nexport { OrganizationSwitcherComponent } from './lib/components/organization-switcher.component';\nexport { UserProfileComponent } from './lib/components/user-profile.component';\nexport { OrganizationProfileComponent } from './lib/components/organization-profile.component';\nexport { AttemptFlowComponent } from './lib/components/attempt-flow.component';\nexport {\n SignUpFormComponent,\n type SignUpFormSubmit,\n} from './lib/components/sign-up-form.component';\nexport { AtlasCaptchaSlotDirective } from './lib/directives/captcha-slot.directive';\nexport { AtlasFlowController } from './lib/components/flow-controller';\nexport { ATLAS_UI } from './lib/atlas.ui';\n\n// Route guards\nexport {\n atlasGuard,\n atlasChildGuard,\n type AtlasGuardOptions,\n} from './lib/guards/atlas.guard';\n\n// Theming, i18n, authorization, data shapes, FAPI re-exports\nexport * from './lib/appearance';\nexport * from './lib/i18n';\nexport * from './lib/protect';\nexport * from './lib/types';\nexport * from './lib/fapi';\n\n// The instance's public sign-in / sign-up settings the prebuilt forms read\n// (`AtlasFlowController.settings`), and the captcha types they render.\nexport type {\n InstanceSettings,\n PublicSignUpField,\n CaptchaController,\n CaptchaFlowKey,\n CaptchaWidgetMode,\n FlowCaptcha,\n EmailDelivery,\n SignOutOptions,\n SignOutResult,\n} from '@atlasauth/js';\n\n// `AtlasService.signOut()` resolves a `SignOutResult`; `{ strict: true }`\n// rejects with a `SignOutError` when the revoke was never confirmed.\nexport { SignOutError } from '@atlasauth/js';\n\n// `onSignOut({ reason })` event types + the `atlas:signout` window event; this SDK's version.\nexport { SIGN_OUT_EVENT, onAtlasSignOut } from '@atlasauth/js';\nexport type { SignOutEvent, SignOutReason } from '@atlasauth/js';\nexport { ATLAS_ANGULAR_SDK, ATLAS_ANGULAR_VERSION } from './lib/version';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["fetchProviderToken","i1.AtlasSignedInDirective","i2.AtlasSignedOutDirective","i3.AtlasLoadingDirective","i4.AtlasLoadedDirective","i5.AtlasProtectDirective","i6.AtlasRootDirective","i7.SignInComponent","i8.SignUpComponent","i9.UserButtonComponent","i10.OrganizationSwitcherComponent","i11.UserProfileComponent","i12.OrganizationProfileComponent"],"mappings":"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"}
|