@atlasauth/angular 0.1.3 → 0.2.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.
@@ -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/components/attempt-flow.component.ts","../../src/lib/components/flow-controller.ts","../../src/lib/components/sign-in.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 FAPI origin. Empty string (the default) means same-origin —\n * requests go to `/v1/...` on the app's own host.\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\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 {\n /** A prebuilt theme to start from. */\n baseTheme?: keyof typeof THEMES;\n variables?: DesignTokens;\n elements?: Partial<Record<ElementKey, string>>;\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 * §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.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\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\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 TokenCache,\n getProviderToken as fetchProviderToken,\n msUntilRefresh,\n readExpiry,\n readRedirectResult,\n stripRedirectParams,\n type ProviderToken,\n} from '@atlasauth/js';\nimport { evaluate, type ProtectCondition } from '@atlasauth/authz';\nimport { ATLAS_OPTIONS } from './atlas.config';\nimport { cssVariables, resolveTokens, type Appearance } 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 private readonly catalog: Catalog;\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 this.baseUrl = options.frontendApi ?? '';\n this.doFetch = options.fetchImpl ?? ((...args: Parameters<typeof fetch>) => fetch(...args));\n\n this.catalog = options.localization ? withFallback(options.localization) : EN_US;\n\n this.fapiClient = new FapiClient({\n publishableKey: this.publishableKey,\n baseUrl: this.baseUrl,\n fetchImpl: this.doFetch,\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 void this.boot();\n }\n }\n\n ngOnDestroy(): void {\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 /** 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 /** A fresh {@link FapiClient} for driving a sign-in/sign-up flow. */\n createFapiClient(): FapiClient {\n return new FapiClient({ publishableKey: this.publishableKey, baseUrl: this.baseUrl });\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 /** Revoke the current session server-side and drop all local auth state. */\n async signOut(): Promise<void> {\n const current = this.cache.peek();\n if (current) {\n await this.call(`/v1/client/sessions/${current.sessionId}/revoke`, {\n method: 'POST',\n }).catch(() => undefined);\n }\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 /**\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 if (!body.session || !body.user) {\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 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 result = readRedirectResult(window.location.search);\n\n if (result?.ticket) {\n 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 }\n if (result) {\n window.history.replaceState({}, document.title, stripRedirectParams(window.location.href));\n }\n await this.reload();\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 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 /** §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 {\n Directive,\n ElementRef,\n OnInit,\n Renderer2,\n RendererStyleFlags2,\n inject,\n} from '@angular/core';\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@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\n ngOnInit(): void {\n this.renderer.addClass(this.el.nativeElement, 'atlas-root');\n const vars = this.atlas.appearanceVariables();\n for (const [name, value] of Object.entries(vars)) {\n // DashCase so a `--atlas-*` custom property is written verbatim, not camelCased.\n this.renderer.setStyle(this.el.nativeElement, name, value, RendererStyleFlags2.DashCase);\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n inject,\n} from '@angular/core';\nimport { nextStep, type AttemptView, type FieldError } from '@atlasauth/js';\nimport { AtlasService } from '../atlas.service';\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 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\">{{ error.message }}</p>\n }\n\n <form (submit)=\"onSubmit($event)\">\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 [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')\">{{ error.message }}</span>\n }\n </label>\n } @else {\n <p>{{ t(f.labelKey) }}</p>\n }\n }\n\n @if (showSubmit()) {\n <button [class]=\"cls('formButtonPrimary', 'atlas-button')\" [disabled]=\"busy\" type=\"submit\">\n {{ t('signIn.submit') }}\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 /** Emits the collected field values when the form is submitted. */\n @Output() submitFlow = new EventEmitter<Record<string, string>>();\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 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 showSubmit(): boolean {\n const kind = this.step().kind;\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 return [{ kind: 'input', name: 'password', labelKey: 'signIn.passwordLabel', type: 'password' }];\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 '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 advance,\n flowFromPending,\n initialFlow,\n pollAttempt,\n shouldKeepPolling,\n type FlowState,\n} from '@atlasauth/js';\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 */\nexport class AtlasFlowController {\n readonly state: WritableSignal<FlowState>;\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n private readonly client: FapiClient,\n private readonly reload: () => Promise<void>,\n pending: { id: string; status: string } | null,\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 }\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 next = await advance(this.client, this.state(), values);\n this.state.set(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.state.set(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 — call from the component's `ngOnDestroy`. */\n destroy(): void {\n this.stopPolling();\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 { 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/>`.\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 (submitFlow)=\"flow.submit($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 );\n\n ngOnInit(): void {\n // If seeded from a pending attempt that is already pollable, start polling.\n this.flow.syncPolling();\n }\n\n ngOnDestroy(): void {\n this.flow.destroy();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnDestroy,\n inject,\n} from '@angular/core';\nimport { AtlasService } from '../atlas.service';\nimport { AttemptFlowComponent } from './attempt-flow.component';\nimport { AtlasFlowController } from './flow-controller';\n\n/**\n * `<atlas-sign-up>` — the full, server-driven sign-up flow. The Angular peer of\n * React's `<SignUp/>`. It shares the exact flow engine with `<atlas-sign-in>`;\n * only the title differs, 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],\n template: `\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 `,\n})\nexport class SignUpComponent implements 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 );\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 { 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 * 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/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/components/attempt-flow.component.ts","../../src/lib/components/flow-controller.ts","../../src/lib/components/sign-in.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 FAPI origin. Empty string (the default) means same-origin —\n * requests go to `/v1/...` on the app's own host.\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.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\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\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 TokenCache,\n getProviderToken as fetchProviderToken,\n msUntilRefresh,\n readExpiry,\n readRedirectResult,\n stripRedirectParams,\n type ProviderToken,\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 private readonly catalog: Catalog;\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 this.baseUrl = options.frontendApi ?? '';\n this.doFetch = options.fetchImpl ?? ((...args: Parameters<typeof fetch>) => fetch(...args));\n\n this.catalog = options.localization ? withFallback(options.localization) : EN_US;\n\n this.fapiClient = new FapiClient({\n publishableKey: this.publishableKey,\n baseUrl: this.baseUrl,\n fetchImpl: this.doFetch,\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 void this.boot();\n }\n }\n\n ngOnDestroy(): void {\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 /** 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({ publishableKey: this.publishableKey, baseUrl: this.baseUrl });\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 /** Revoke the current session server-side and drop all local auth state. */\n async signOut(): Promise<void> {\n const current = this.cache.peek();\n if (current) {\n await this.call(`/v1/client/sessions/${current.sessionId}/revoke`, {\n method: 'POST',\n }).catch(() => undefined);\n }\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 /**\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 if (!body.session || !body.user) {\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 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 result = readRedirectResult(window.location.search);\n\n if (result?.ticket) {\n 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 }\n if (result) {\n window.history.replaceState({}, document.title, stripRedirectParams(window.location.href));\n }\n await this.reload();\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 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 /** §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 {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n inject,\n} from '@angular/core';\nimport { nextStep, type AttemptView, type FieldError } from '@atlasauth/js';\nimport { AtlasService } from '../atlas.service';\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 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\">{{ error.message }}</p>\n }\n\n <form (submit)=\"onSubmit($event)\">\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 [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')\">{{ error.message }}</span>\n }\n </label>\n } @else {\n <p>{{ t(f.labelKey) }}</p>\n }\n }\n\n @if (showSubmit()) {\n <button [class]=\"cls('formButtonPrimary', 'atlas-button')\" [disabled]=\"busy\" type=\"submit\">\n {{ t('signIn.submit') }}\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 /** Emits the collected field values when the form is submitted. */\n @Output() submitFlow = new EventEmitter<Record<string, string>>();\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 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 showSubmit(): boolean {\n const kind = this.step().kind;\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 return [{ kind: 'input', name: 'password', labelKey: 'signIn.passwordLabel', type: 'password' }];\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 '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 advance,\n flowFromPending,\n initialFlow,\n pollAttempt,\n shouldKeepPolling,\n type FlowState,\n} from '@atlasauth/js';\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 */\nexport class AtlasFlowController {\n readonly state: WritableSignal<FlowState>;\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n private readonly client: FapiClient,\n private readonly reload: () => Promise<void>,\n pending: { id: string; status: string } | null,\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 }\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 next = await advance(this.client, this.state(), values);\n this.state.set(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.state.set(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 — call from the component's `ngOnDestroy`. */\n destroy(): void {\n this.stopPolling();\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 { 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/>`.\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 (submitFlow)=\"flow.submit($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 );\n\n ngOnInit(): void {\n // If seeded from a pending attempt that is already pollable, start polling.\n this.flow.syncPolling();\n }\n\n ngOnDestroy(): void {\n this.flow.destroy();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnDestroy,\n inject,\n} from '@angular/core';\nimport { AtlasService } from '../atlas.service';\nimport { AttemptFlowComponent } from './attempt-flow.component';\nimport { AtlasFlowController } from './flow-controller';\n\n/**\n * `<atlas-sign-up>` — the full, server-driven sign-up flow. The Angular peer of\n * React's `<SignUp/>`. It shares the exact flow engine with `<atlas-sign-in>`;\n * only the title differs, 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],\n template: `\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 `,\n})\nexport class SignUpComponent implements 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 );\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 { 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 * 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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"}
@@ -17,6 +17,9 @@
17
17
  * replacement is a support burden where every override starts by rebuilding the
18
18
  * component's base styles from scratch.
19
19
  */
20
+ import { type AppearanceRender, type DesignAppearance, type DesignWarn, type InstanceDesign } from '@atlasauth/design/runtime';
21
+ export { instanceDesignFrom } from '@atlasauth/design/runtime';
22
+ export type { AppearanceRender, AtlasDesign, InstanceDesign, PresetId } from '@atlasauth/design/runtime';
20
23
  export interface DesignTokens {
21
24
  colorPrimary?: string;
22
25
  colorText?: string;
@@ -29,9 +32,13 @@ export interface DesignTokens {
29
32
  }
30
33
  /** Every element a customer may target. Named for what it IS, not where it sits. */
31
34
  export type ElementKey = 'root' | 'card' | 'headerTitle' | 'headerSubtitle' | 'formField' | 'formFieldLabel' | 'formFieldInput' | 'formFieldError' | 'formButtonPrimary' | 'formButtonSecondary' | 'socialButton' | 'dividerText' | 'footerAction' | 'avatar' | 'menu' | 'menuItem' | 'badge';
32
- export interface Appearance {
33
- /** A prebuilt theme to start from. */
35
+ export interface Appearance extends DesignAppearance {
36
+ /** A prebuilt token theme to start from (pre-design-system themes). */
34
37
  baseTheme?: keyof typeof THEMES;
38
+ /**
39
+ * Legacy design tokens. Without a design they set the `--atlas-*` variables
40
+ * exactly as before; with one they map onto it.
41
+ */
35
42
  variables?: DesignTokens;
36
43
  elements?: Partial<Record<ElementKey, string>>;
37
44
  }
@@ -83,3 +90,21 @@ export declare function cssVariables(tokens: Required<DesignTokens>): Record<str
83
90
  * specificity, which is the behaviour anyone writing Tailwind expects.
84
91
  */
85
92
  export declare function classFor(element: ElementKey, appearance: Appearance | undefined, base: string): string;
93
+ /**
94
+ * The legacy tokens the developer chose EXPLICITLY: a non-default `baseTheme`
95
+ * plus `variables`. Only these map onto a design — the token defaults must not
96
+ * overwrite the dashboard design.
97
+ */
98
+ export declare function explicitTokens(appearance?: Appearance): DesignTokens;
99
+ /**
100
+ * Turn an `appearance` (+ the instance's dashboard design from the Frontend
101
+ * API) into root attributes and a stylesheet — the same semantics as
102
+ * `@atlasauth/react`. Precedence, lowest first: dashboard design < `preset` <
103
+ * `variables` (and a non-default `baseTheme`) < `design`. Without a dashboard
104
+ * design and without `preset`/`design`, the output is exactly the
105
+ * pre-design-system one: the token variables, no stylesheet, no attributes.
106
+ */
107
+ export declare function renderAppearance(appearance: Appearance | undefined, instanceDesign: InstanceDesign | null | undefined, options?: {
108
+ frontendApi?: string;
109
+ warn?: DesignWarn;
110
+ }): AppearanceRender;
@@ -2,7 +2,7 @@ import { OnDestroy, Signal } from '@angular/core';
2
2
  import { Observable } from 'rxjs';
3
3
  import { FapiClient, type ProviderToken } from '@atlasauth/js';
4
4
  import { type ProtectCondition } from '@atlasauth/authz';
5
- import { type Appearance } from './appearance';
5
+ import { type Appearance, type AppearanceRender, type InstanceDesign } from './appearance';
6
6
  import { type Catalog } from './i18n';
7
7
  import type { AtlasOrganizationMembership, AtlasSession, AtlasUser, AuthStatus, SessionClaims } from './types';
8
8
  import * as i0 from "@angular/core";
@@ -80,6 +80,19 @@ export declare class AtlasService implements OnDestroy {
80
80
  get frontendApi(): string;
81
81
  /** Tokens as CSS custom properties, for a host element to inherit. */
82
82
  appearanceVariables(): Record<string, string>;
83
+ /**
84
+ * The full appearance render for a root element: inline variables, the
85
+ * `data-atlas-*` attributes and the design stylesheet. Pass the dashboard
86
+ * design (from {@link loadInstanceDesign}) to layer code overrides on it —
87
+ * the same semantics as `@atlasauth/react`.
88
+ */
89
+ appearanceRender(instanceDesign?: InstanceDesign | null): AppearanceRender;
90
+ /**
91
+ * The design configured in the Atlas dashboard (`GET /v1/appearance`), or null
92
+ * when there is none, it cannot be read, or the app opted out with
93
+ * `appearance.instanceDesign: false`.
94
+ */
95
+ loadInstanceDesign(): Promise<InstanceDesign | null>;
83
96
  /** A fresh {@link FapiClient} for driving a sign-in/sign-up flow. */
84
97
  createFapiClient(): FapiClient;
85
98
  /**