@mohamedatia/fly-design-system 2.9.0 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/mohamedatia-fly-design-system.mjs +109 -2
- package/fesm2022/mohamedatia-fly-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/types/mohamedatia-fly-design-system.d.ts +66 -1
- package/types/mohamedatia-fly-design-system.d.ts.map +1 -1
- package/mohamedatia-fly-design-system-2.9.0.tgz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mohamedatia-fly-design-system.mjs","sources":["../../../projects/design-system/src/lib/models/window.model.ts","../../../projects/design-system/src/lib/models/share-panel.model.ts","../../../projects/design-system/src/lib/models/audience.model.ts","../../../projects/design-system/src/lib/services/auth.service.ts","../../../projects/design-system/src/lib/services/i18n.service.ts","../../../projects/design-system/src/lib/services/fly-theme.service.ts","../../../projects/design-system/src/lib/services/window-manager.service.ts","../../../projects/design-system/src/lib/services/fly-remote-router.types.ts","../../../projects/design-system/src/lib/services/fly-remote-router.service.ts","../../../projects/design-system/src/lib/services/source-app-resolver.service.ts","../../../projects/design-system/src/lib/services/fly-remote-styles.ts","../../../projects/design-system/src/lib/components/fly-remote-router-outlet/fly-remote-router-outlet.component.ts","../../../projects/design-system/src/lib/pipes/translate.pipe.ts","../../../projects/design-system/src/lib/services/auth.service.mock.ts","../../../projects/design-system/src/lib/components/context-menu/context-menu.component.ts","../../../projects/design-system/src/lib/components/context-menu/context-menu.component.html","../../../projects/design-system/src/lib/components/message-box/message-box.service.ts","../../../projects/design-system/src/lib/components/message-box/message-box.component.ts","../../../projects/design-system/src/lib/components/message-box/message-box.component.html","../../../projects/design-system/src/lib/components/share-panel/share-panel.component.ts","../../../projects/design-system/src/lib/components/share-panel/share-panel.component.html","../../../projects/design-system/src/lib/components/audience-builder/audience-builder.component.ts","../../../projects/design-system/src/lib/components/audience-builder/audience-builder.component.html","../../../projects/design-system/src/lib/components/block-ui/block-ui.component.ts","../../../projects/design-system/src/lib/components/block-ui/block-ui.component.html","../../../projects/design-system/src/lib/components/image-upload/fly-image-upload.component.ts","../../../projects/design-system/src/lib/components/file-upload/fly-file-upload.component.ts","../../../projects/design-system/src/lib/services/agent-input/agent-command-registry.service.ts","../../../projects/design-system/src/lib/services/agent-input/agent-drop-registry.service.ts","../../../projects/design-system/src/lib/models/agent-input.model.ts","../../../projects/design-system/src/lib/utils/agent-payload-guards.ts","../../../projects/design-system/src/lib/directives/fly-agent-draggable.directive.ts","../../../projects/design-system/src/lib/models/fly-locale-catalog.ts","../../../projects/design-system/src/public-api.ts","../../../projects/design-system/src/mohamedatia-fly-design-system.ts"],"sourcesContent":["import { InjectionToken, Signal, Type } from '@angular/core';\n\nexport type WindowState = 'normal' | 'minimized' | 'maximized';\n\nexport interface ChildWindowData {\n childComponent: Type<unknown>;\n [key: string]: unknown;\n}\n\nexport interface WindowInstance {\n id: string;\n appId: string;\n title: string;\n icon: string;\n iconBg: string;\n state: WindowState;\n position: { x: number; y: number };\n size: { width: number; height: number };\n zIndex: number;\n isFocused: boolean;\n isClosing?: boolean;\n isMinimizing?: boolean;\n isRestoring?: boolean;\n isMaximizing?: boolean;\n isUnmaximizing?: boolean;\n parentWindowId?: string;\n childData?: ChildWindowData;\n /** Populated when remote `loadComponent()` fails (e.g. federation). */\n remoteLoadError?: string;\n /** When true, the shell draws a block overlay over `.window-content` (see `FlyBlockUiComponent`). */\n contentUiBlocked?: boolean;\n /** i18n key for block overlay label; shell defaults to `common.loading` when unset. */\n contentUiBlockMessageKey?: string;\n}\n\nexport const WINDOW_DATA = new InjectionToken<WindowInstance>('WINDOW_DATA');\n\n/**\n * Payload delivered to a window when it is launched (or re-launched) via a deep link.\n * Both fields are nullable: a normal dock click yields `route: null`, `params: null`.\n * `version` starts at 1 for the first launch and increments on every subsequent\n * re-launch of the same window so listeners can dedupe on `version` changes.\n */\nexport interface LaunchContext {\n readonly route: string | null;\n readonly params: Readonly<Record<string, unknown>> | null;\n readonly version: number;\n}\n\n/**\n * Per-window injection token carrying the active `LaunchContext` as a signal.\n *\n * **Shell-internal.** The shell uses this to track per-window deep-link state across\n * dock launches. **Federated remotes must not consume it** — Native Federation can\n * split the `InjectionToken` instance across the host and remote bundles, in which\n * case `inject(LAUNCH_CONTEXT)` in the remote returns `null` regardless of host\n * provisioning. Remotes subscribe to deep links via the federation-safe surfaces\n * instead: `FLYOS_LAUNCH_EVENT` (window CustomEvent) plus the\n * `__FLYOS_PENDING_LAUNCHES__` registry on `globalThis`. See\n * <c>skills/cross-app-deep-linking.md</c>.\n */\nexport const LAUNCH_CONTEXT = new InjectionToken<Signal<LaunchContext | null>>('LAUNCH_CONTEXT');\n\n/**\n * Detail payload of the <c>flyos:launch</c> window CustomEvent. The shell\n * dispatches one event per launch; remotes use this contract to navigate to the\n * requested route. Mirrored to <see cref=\"FlyosPendingLaunchesGlobalKey\"/> so a\n * remote that mounts AFTER the dispatch can still drain the most recent launch.\n */\nexport interface FlyLaunchEventDetail {\n /** The id used to look up the app in the shell registry (post-canonicalization). */\n readonly appId: string;\n /** The launch payload — same shape the shell stores on the per-window signal. */\n readonly ctx: LaunchContext;\n}\n\n/**\n * Name of the window CustomEvent the shell dispatches per launch.\n *\n * Listeners run on `window` and receive a <c>CustomEvent<FlyLaunchEventDetail></c>.\n * Always filter by `detail.appId` — every remote sees every launch.\n */\nexport const FLYOS_LAUNCH_EVENT = 'flyos:launch';\n\n/**\n * `globalThis` key for the pending-launches registry. Map<appId, LaunchContext>.\n *\n * The shell writes the latest launch for each app and the corresponding remote\n * **drains** the entry on first mount (i.e. reads then deletes). This covers the\n * first-launch race where the event fires before the remote's listener attaches.\n * Subsequent re-launches into the already-mounted remote arrive via the event.\n */\nexport const FlyosPendingLaunchesGlobalKey = '__FLYOS_PENDING_LAUNCHES__' as const;\n\n/** Type of the `globalThis[FlyosPendingLaunchesGlobalKey]` registry. */\nexport type FlyosPendingLaunches = Record<string, LaunchContext>;\n","/**\n * Generic share / ACL panel models — hosts map domain DTOs to these shapes.\n *\n * v2.0.0: introduces the {@link SharePrincipal} discriminated union to replace the v1\n * \"set-which-is-set\" discriminator on {@link SharePermissionEntry} (`grantedToUserId` /\n * `grantedToOuId` / `grantedToAppId`). The new shape compiles invalid combinations away\n * (a permission row carries exactly one principal, never overlapping ids) and reserves\n * a `role` kind for the planned apps-chart role-as-principal flow.\n */\n\n/**\n * Discriminated principal that owns a share permission row. Hosts translate domain DTO\n * fields into one of these variants.\n *\n * The `role` variant is reserved for a follow-up enabling the Apps-chart role-as-principal\n * flow end-to-end (frontend looks up the role-OU UUID; backend's PermissionResolver must\n * enumerate the user's full OU set including computed-from-role memberships). Until that\n * runtime work lands, hosts SHOULD NOT emit `role` principals.\n */\nexport type SharePrincipal =\n | UserPrincipal\n | RolePrincipal\n | OuPrincipal\n | AppEveryonePrincipal;\n\nexport interface UserPrincipal {\n kind: 'user';\n /** Tenant-scoped user id. */\n userId: string;\n /** Display name resolved by the host (e.g. \"Jane Doe\"). Falls back to a Guid prefix. */\n displayName?: string;\n /** Optional email — surfaced as a secondary line on the row when set. */\n email?: string;\n}\n\nexport interface RolePrincipal {\n kind: 'role';\n /** Owning app id (e.g. `circles`). Roles are unique within an app, not globally. */\n appId: string;\n /** Stable role key within that app (e.g. `ffo`, `viewer`). */\n roleKey: string;\n displayName?: string;\n}\n\nexport interface OuPrincipal {\n kind: 'ou';\n ouId: string;\n /** Chart context for stable display labels. Null = the Default Company chart. */\n chartId?: string | null;\n displayName?: string;\n}\n\nexport interface AppEveryonePrincipal {\n kind: 'app-everyone';\n /** App id whose user population this grant targets. `*` = every tenant user. */\n appId: string;\n displayName?: string;\n}\n\n/** Principal-kind discriminator strings — re-exported for hosts that build menus dynamically. */\nexport type SharePrincipalKind = SharePrincipal['kind'];\n\n/**\n * One row of the share-panel permissions list. v2.0 carries a {@link SharePrincipal}\n * discriminated union instead of the v1 `grantedToUserId` / `grantedToOuId` / `grantedToAppId`\n * fields. See the file header for migration notes.\n */\nexport interface SharePermissionEntry {\n id: string;\n principal: SharePrincipal;\n level: string;\n isInherited?: boolean;\n /**\n * When true, this row is a deny grant — visually distinct, revokes access for the\n * principal regardless of any matching allow grant. Backed by the ACL semantic in\n * Files Manager (`FilePermission.IsDeny`) and Notes (`NoteShareLevel.Deny`).\n * Hosts that do not support deny grants may omit this field entirely.\n */\n isDeny?: boolean;\n}\n\nexport interface ShareUserResult {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n}\n\nexport interface ShareOuNode {\n id: string;\n displayName: string;\n /** 0 = root. When set, share panel indents rows for hierarchy. */\n depth?: number;\n}\n\n/** Option for OU tree source: `id` null = default/official org chart. */\nexport interface ShareOrgChartOption {\n id: string | null;\n name: string;\n /**\n * Stable system-chart key used by hosts that want to pre-select a specific platform-managed\n * chart (e.g. `'apps'`, `'default-company'`). Custom charts have no system key. Wired through\n * `defaultChartSystemKey` on share-panel / audience-builder so the host doesn't need to know\n * the tenant-specific Guid up front.\n */\n systemKey?: string | null;\n}\n\n/**\n * Stable identifiers for platform-managed system charts. Hosts that don't recognise the\n * value just fall through to the default selection — these constants are advisory.\n */\nexport const SHARE_ORG_CHART_SYSTEM_KEY_DEFAULT = 'default-company';\nexport const SHARE_ORG_CHART_SYSTEM_KEY_APPS = 'apps';\n\nexport interface SharePanelLevelOption {\n value: string;\n labelKey: string;\n}\n","/**\n * Canonical {@link AudienceFilter} TypeScript model — wire-compatible byte-for-byte with the\n * C# `Fly.Shared.Core.Audience.AudienceFilter` polymorphic record. The discriminator field is\n * `kind` and matches the values declared in `AudienceTerm.cs`'s `[JsonDerivedType]` attributes:\n * `users`, `roles`, `ou`, `app-everyone`, `chart`, `preset`.\n *\n * Resolution semantics (server-side, see `AudienceFilter.cs`):\n * 1. Each include term is expanded to a user-id set; sets are unioned.\n * 2. Each exclude term is expanded; the union of excludes is subtracted.\n * 3. Inactive users are filtered when {@link AudienceOptions.excludeInactiveUsers} is true.\n *\n * **Empty `includes` resolves to the empty set — never \"everyone\".** To target every user in a\n * tenant, emit an explicit {@link AppEveryoneTerm} or {@link ChartTerm}; this matches the\n * defensive backend default and prevents a UI bug from broadcasting tenant-wide.\n */\nexport interface AudienceFilter {\n /** At least one term required server-side; an empty array resolves to zero recipients. */\n includes: AudienceTerm[];\n /** Optional. Subtracted from the include union. */\n excludes?: AudienceTerm[];\n /** Optional resolver options. Server applies defaults when omitted. */\n options?: AudienceOptions;\n}\n\n/** Tagged union of the six supported audience term kinds. */\nexport type AudienceTerm =\n | UsersTerm\n | RolesTerm\n | OuTerm\n | AppEveryoneTerm\n | ChartTerm\n | PresetTerm;\n\nexport type AudienceTermKind = AudienceTerm['kind'];\n\n/** Discriminator string values — re-exported so hosts can build kind menus dynamically. */\nexport const AUDIENCE_TERM_KINDS = [\n 'users',\n 'roles',\n 'ou',\n 'app-everyone',\n 'chart',\n 'preset',\n] as const satisfies readonly AudienceTermKind[];\n\n/**\n * Runtime values for {@link AudiencePresetKind}. Hosts iterate this when surfacing a\n * preset picker; the type union mirrors this list 1:1.\n */\nexport const AUDIENCE_PRESETS = [\n 'self',\n 'ou-managers',\n 'direct-reports',\n] as const satisfies readonly AudiencePresetKind[];\n\n/** Explicit user ids. Capped server-side at {@link AUDIENCE_LIMITS.maxUserIdsPerTerm}. */\nexport interface UsersTerm {\n kind: 'users';\n /** Tenant-scoped user ids. */\n userIds: string[];\n}\n\n/**\n * Users holding any of the named roles in a single owning app. Roles are matched by\n * `(appId, key)` and filtered to active rows by the manifest spec — deprecated roles never\n * expand into the audience. RoleKeys are unique within an app, not globally.\n */\nexport interface RolesTerm {\n kind: 'roles';\n /** The role's owning app id (e.g. `circles`). */\n appId: string;\n /** Role keys within that app (e.g. `[\"ffo\", \"ops\"]`). */\n roleKeys: string[];\n}\n\n/**\n * Members of one or more OUs. `chartId` null = the Default Company chart; non-null targets\n * an alternative chart (including the Apps Chart). When `includeDescendants` is true, members\n * of all descendant OUs are included (resolved server-side via a recursive CTE).\n *\n * `includeDescendants` is required (not optional) so the wire round-trip is unambiguous: a\n * stored term that was previously emitted with `false` deserialises identically to one emitted\n * fresh, and the backend never has to choose between \"missing\" and \"explicit false\". Builders\n * MUST emit a definite boolean.\n */\nexport interface OuTerm {\n kind: 'ou';\n ouIds: string[];\n /**\n * Chart context for descendant traversal; null = default tree by parent id. Use `null`\n * (never `undefined`) to keep wire shape symmetric with C# `Guid?` deserialization.\n */\n chartId: string | null;\n includeDescendants: boolean;\n}\n\n/**\n * \"All users of this app in this tenant\" — semantically the Apps Chart app-root OU. Resolved\n * from `UserRole` rows joined to active roles owned by the app, never from a materialized\n * member list. `appId === '*'` means every tenant user.\n */\nexport interface AppEveryoneTerm {\n kind: 'app-everyone';\n appId: string;\n}\n\n/**\n * \"Every user placed somewhere in this chart\". For the Default Company chart this is every\n * user with at least one OU membership.\n */\nexport interface ChartTerm {\n kind: 'chart';\n chartId: string;\n}\n\n/**\n * Named platform preset evaluated against an anchor user. Anchor is typically the request\n * initiator (`Self`) or a referenced user (e.g. delegate's manager).\n */\nexport interface PresetTerm {\n kind: 'preset';\n preset: AudiencePresetKind;\n anchorUserId: string;\n}\n\n/**\n * Supported audience presets. Kept intentionally small — wire matches C# `JsonStringEnumMemberName`.\n */\nexport type AudiencePresetKind = 'self' | 'ou-managers' | 'direct-reports';\n\nexport interface AudienceOptions {\n /** When true (default), users with `IsActive=false` are filtered out. */\n excludeInactiveUsers?: boolean;\n /** Caller-supplied ceiling. Server clamps to {@link AUDIENCE_LIMITS.maxResolvedUsers}. */\n hardCap?: number;\n}\n\n/**\n * Hard caps mirrored from `AudienceLimits.cs`. Hosts use these for client-side validation\n * before submit — backend re-validates regardless. Keep these in sync with the C# constants.\n */\nexport const AUDIENCE_LIMITS = {\n maxTermsPerFilter: 64,\n maxUserIdsPerTerm: 500,\n maxRoleKeysPerTerm: 64,\n maxOuIdsPerTerm: 32,\n maxResolvedUsers: 10_000,\n} as const;\n","import { Injectable, computed, signal } from '@angular/core';\nimport { User } from '../models/user.model';\n\ninterface AuthSession {\n user: User;\n accessToken: string;\n expiresAt: number;\n}\n\n/**\n * Shared AuthService for Business Apps.\n *\n * This is a **read-only signal store** — Business Apps inject it to read the\n * current user and access token. The FlyOS shell populates it after PKCE login\n * and silent refresh. Business Apps must never call setSession() directly.\n *\n * When running as a Module Federation remote, the shell and the Business App\n * share this singleton via the `@mohamedatia/fly-design-system` shared mapping\n * in federation.config.js — so the shell's populated instance is the same\n * object the Business App reads.\n *\n * When running standalone (without the shell), call initFromToken() with a\n * JWT stored in localStorage to hydrate the user.\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthService {\n private _session = signal<AuthSession | null>(null);\n\n readonly currentUser = computed(() => this._session()?.user ?? null);\n readonly accessToken = computed(() => this._session()?.accessToken ?? null);\n readonly isAuthenticated = computed(() => {\n const s = this._session();\n return s !== null && s.expiresAt > Date.now();\n });\n\n /**\n * No-op when running as a Module Federation remote — the shell has already\n * initialised the session before the remote bootstraps. Business Apps call\n * this in their APP_INITIALIZER so the same code works in both standalone\n * and embedded modes without branching.\n */\n async init(): Promise<void> {}\n\n /**\n * Called by the shell after a successful login or silent refresh.\n * Business Apps should not call this directly.\n */\n setSession(user: User, accessToken: string, expiresAt: number): void {\n this._session.set({ user, accessToken, expiresAt });\n }\n\n /** Clears the in-memory session (called by the shell on logout). */\n clearSession(): void {\n this._session.set(null);\n }\n\n /**\n * Standalone mode: parse a JWT from localStorage and hydrate the user.\n * Pass the storage key your app uses; embedded remotes typically set this in `APP_INITIALIZER`.\n */\n initFromToken(storageKey = 'circles_token'): void {\n const token = localStorage.getItem(storageKey);\n if (!token) return;\n try {\n const base64 = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/');\n const payload = JSON.parse(decodeURIComponent(\n atob(base64).split('').map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join('')\n )) as Record<string, unknown>;\n\n const rawRole = payload['role'];\n const roles = Array.isArray(rawRole) ? rawRole as string[] : rawRole ? [rawRole as string] : [];\n const rawApps = payload['apps'];\n const apps = Array.isArray(rawApps) ? rawApps as string[] : rawApps ? [rawApps as string] : [];\n const name = (payload['name'] as string) ?? '';\n const nameParts = name.split(' ');\n\n const user: User = {\n id: (payload['sub'] as string) ?? '',\n tenantId: (payload['tenant_id'] as string) ?? (payload['tid'] as string) ?? null,\n email: (payload['email'] as string) ?? '',\n fullName: name,\n firstName: nameParts[0] ?? '',\n lastName: nameParts.slice(1).join(' '),\n preferredLocale: (payload['locale'] as string) ?? 'en',\n roles,\n apps,\n ou: payload['ou'] as string | undefined,\n };\n\n const expiresAt = ((payload['exp'] as number) ?? 0) * 1000;\n this.setSession(user, token, expiresAt);\n } catch {\n // Invalid token — stay unauthenticated\n }\n }\n}\n","import { Injectable, computed, signal, inject, ErrorHandler } from '@angular/core';\n\n/** Locales that use RTL layout for `dir` and DS `isRtl` / `direction`. */\nexport const RTL_LOCALE_SET: ReadonlySet<string> = new Set(['ar', 'ur']);\n\nexport function isRtlLocale(lang: string): boolean {\n return RTL_LOCALE_SET.has(lang);\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Accepts flat or nested JSON objects; nested keys become dot paths. Rejects arrays and non-string leaves. */\nfunction normalizeLocaleJson(raw: unknown): Record<string, string> {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n throw new Error('Locale bundle must be a JSON object');\n }\n const out: Record<string, string> = {};\n const walk = (obj: Record<string, unknown>, prefix: string): void => {\n for (const [k, v] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${k}` : k;\n if (typeof v === 'string') {\n out[path] = v;\n } else if (v !== null && typeof v === 'object' && !Array.isArray(v)) {\n walk(v as Record<string, unknown>, path);\n } else {\n throw new Error(`Locale bundle invalid value at \"${path}\" (expected string or nested object)`);\n }\n }\n };\n walk(raw as Record<string, unknown>, '');\n return out;\n}\n\n/** Options for loading a remote or standalone locale JSON bundle. */\nexport interface LoadBundleOptions {\n /** Stable id (e.g. app id from manifest); later loads replace this bundle only. */\n id: string;\n /** Base URL ending with `/`, e.g. `https://app.example.com/locale/` or `/my-remote/locale/` */\n baseUrl: string;\n lang: string;\n /** When aborted, failures are ignored (e.g. superseded language load). */\n signal?: AbortSignal;\n /**\n * When true, fetch/parse failures are not reported via Angular `ErrorHandler`.\n * Use for optional remote locale bundles (e.g. federated apps that may be offline).\n */\n silent?: boolean;\n}\n\n/**\n * Shared I18nService for the shell and Business Apps.\n *\n * **Merge order** (later keys win): shell layer → remote bundles in registration order.\n *\n * - Shell: `setShellTranslations()` after loading `locale/{lang}.json` and API overrides.\n * - Remotes: `loadBundle()` per manifest `localeBaseUrl`.\n */\n@Injectable({ providedIn: 'root' })\nexport class I18nService {\n private readonly errorHandler = inject(ErrorHandler, { optional: true });\n\n private readonly _shell = signal<Record<string, string>>({});\n private readonly _bundles = signal<Record<string, Record<string, string>>>({});\n private readonly _bundleOrder = signal<string[]>([]);\n private readonly _locale = signal<string>('en');\n private readonly _version = signal(0);\n\n private readonly _merged = computed(() => {\n const shell = this._shell();\n const order = this._bundleOrder();\n const bundles = this._bundles();\n let out: Record<string, string> = { ...shell };\n for (const id of order) {\n const b = bundles[id];\n if (b) out = { ...out, ...b };\n }\n return out;\n });\n\n readonly locale = this._locale.asReadonly();\n readonly version = this._version.asReadonly();\n readonly isRtl = computed(() => isRtlLocale(this._locale()));\n readonly direction = computed(() => (isRtlLocale(this._locale()) ? 'rtl' : 'ltr'));\n\n private bump(): void {\n this._version.update((v) => v + 1);\n }\n\n /** Replace shell strings (desktop `locale/*.json` + `/api/i18n/desktop-shell/{lang}` merged by the shell). */\n setShellTranslations(data: Record<string, string>, lang: string): void {\n this._shell.set(data);\n this._locale.set(lang);\n this.bump();\n }\n\n setLanguage(lang: string): void {\n this._locale.set(lang);\n this.bump();\n }\n\n /**\n * Fetch `{baseUrl}{lang}.json` and store under `id`. New ids are appended to the merge order.\n * @returns whether the bundle was loaded successfully.\n */\n async loadBundle(opts: LoadBundleOptions): Promise<boolean> {\n const { id, baseUrl, lang, signal: abortSignal, silent } = opts;\n try {\n const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;\n const url = `${base}${lang}.json`;\n const resp = await fetch(url, { signal: abortSignal });\n if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n const data = normalizeLocaleJson(await resp.json());\n if (abortSignal?.aborted) return false;\n this._bundles.update((b) => ({ ...b, [id]: data }));\n this._bundleOrder.update((order) => (order.includes(id) ? order : [...order, id]));\n this._locale.set(lang);\n this.bump();\n return true;\n } catch (e) {\n if (abortSignal?.aborted) return false;\n if (!silent) this.errorHandler?.handleError(e);\n return false;\n }\n }\n\n removeBundle(id: string): void {\n this._bundles.update((b) => {\n const next = { ...b };\n delete next[id];\n return next;\n });\n this._bundleOrder.update((order) => order.filter((x) => x !== id));\n this.bump();\n }\n\n clearRemoteBundles(): void {\n this._bundles.set({});\n this._bundleOrder.set([]);\n this.bump();\n }\n\n t(key: string, params?: Record<string, string | number>): string {\n const val = this._merged()[key] ?? key;\n if (!params) return val;\n return Object.entries(params).reduce((result, [k, v]) => {\n const safe = escapeRegExp(k);\n return result.replace(new RegExp(`{{\\\\s*${safe}\\\\s*}}`, 'g'), String(v));\n }, val);\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Injectable, inject, PLATFORM_ID, signal } from '@angular/core';\n\n/** Single source of truth for persisted / API theme strings. */\nexport const FLY_THEME_MODE_IDS = ['light', 'dark'] as const;\n\nexport type FlyThemeMode = (typeof FLY_THEME_MODE_IDS)[number];\n\n/** Factory default: `dark` (opaque dark / `html.dark-theme`); shell i18n `settings.theme.dark`. Keep in sync with `UserSettings` defaults. */\nexport const DEFAULT_FLY_THEME_MODE: FlyThemeMode = 'dark';\n\n/** Coerce unknown values (localStorage, API) to a valid theme mode. */\nexport function normalizeFlyTheme(value: unknown): FlyThemeMode {\n if (typeof value === 'string' && (FLY_THEME_MODE_IDS as readonly string[]).includes(value)) {\n return value as FlyThemeMode;\n }\n return DEFAULT_FLY_THEME_MODE;\n}\n\n/**\n * Applies `html.light-theme` / `html.dark-theme` for DS SCSS.\n * Shell and standalone Business Apps use the same service (federation singleton when shared).\n */\n@Injectable({ providedIn: 'root' })\nexport class FlyThemeService {\n private readonly platformId = inject(PLATFORM_ID);\n\n readonly theme = signal<FlyThemeMode>(DEFAULT_FLY_THEME_MODE);\n\n applyTheme(mode: FlyThemeMode): void {\n this.theme.set(mode);\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const html = document.documentElement;\n html.classList.remove('light-theme', 'dark-theme');\n if (mode === 'dark') {\n html.classList.add('dark-theme');\n } else {\n html.classList.add('light-theme');\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\n/** Options for opening a child window. */\nexport interface OpenWindowOptions {\n /** Unique identifier for the window instance. */\n windowId: string;\n /** Display title shown in the window chrome. */\n title: string;\n /** Route path or URL to load inside the window. */\n route: string;\n /** Initial width in pixels. Defaults to 900. */\n width?: number;\n /** Initial height in pixels. Defaults to 600. */\n height?: number;\n /** Whether the window can be resized. Defaults to true. */\n resizable?: boolean;\n /** Whether the window can be maximised. Defaults to true. */\n maximizable?: boolean;\n /** Arbitrary data passed to the child window via WINDOW_DATA. */\n data?: unknown;\n}\n\n/**\n * Abstract interface for the WindowManager.\n * The FlyOS shell provides the concrete implementation; Business Apps\n * inject this token to open, close, and focus windows without depending\n * on the shell's internal implementation.\n */\nexport abstract class WindowManagerService {\n abstract openChildWindow(options: OpenWindowOptions): void;\n abstract closeWindow(windowId: string): void;\n abstract focusWindow(windowId: string): void;\n\n /**\n * Shell: increments per-window depth and shows content block UI.\n * Standalone / no host: no-op.\n */\n beginContentUiBlock(_windowId: string, _messageKey?: string): void {}\n\n /** Shell: decrements depth; clears block when depth reaches 0. Standalone: no-op. */\n endContentUiBlock(_windowId: string): void {}\n}\n\n/**\n * No-op fallback implementation used when running a Business App in\n * standalone mode (outside the FlyOS shell). Logs a warning instead of\n * throwing so standalone dev/test flows are not broken.\n */\n@Injectable()\nexport class StandaloneWindowManagerService extends WindowManagerService {\n openChildWindow(options: OpenWindowOptions): void {\n console.warn('[WindowManagerService] openChildWindow called in standalone mode — no shell available.', options);\n }\n\n closeWindow(windowId: string): void {\n console.warn('[WindowManagerService] closeWindow called in standalone mode — no shell available.', windowId);\n }\n\n focusWindow(windowId: string): void {\n console.warn('[WindowManagerService] focusWindow called in standalone mode — no shell available.', windowId);\n }\n}\n\n","import { InjectionToken, Type } from '@angular/core';\n\n/**\n * One row in a remote's route table. Mirrors Angular's `Route` interface but\n * pared down to what the FlyOS-embedded router actually supports — synchronous\n * component refs only (no `loadChildren`, no resolvers/guards).\n *\n * Patterns:\n * '' — matches an empty URL (\"/\")\n * 'signals' — exact static segment\n * 'signals/:id' — `:foo` captures any single segment into `params.foo`\n * 'signals/:id/edit' — mixed static + capture segments\n *\n * `data` is an opaque bag the consumer can read from `router.matchedRoute()?.data`.\n */\nexport interface FlyRemoteRoute {\n readonly path: string;\n readonly component: Type<unknown>;\n readonly data?: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Result of matching the current `segments` against a remote's route table.\n * `params` contains captured `:foo` segments — empty object for paths with no\n * captures.\n */\nexport interface FlyRemoteMatch {\n readonly route: FlyRemoteRoute;\n readonly params: Readonly<Record<string, string>>;\n}\n\n/**\n * Optional injection token a remote provides at its root to declare which routes\n * `<fly-remote-router-outlet>` should resolve. Provided WITHIN the remote (not\n * the shell), e.g.:\n *\n * ```ts\n * @Component({\n * providers: [\n * FlyRemoteRouter,\n * { provide: FLY_REMOTE_ROUTES, useValue: CIRCLES_ROUTES },\n * ],\n * })\n * export class CirclesComponent { }\n * ```\n *\n * If no routes are provided, `FlyRemoteRouter.matchedRoute()` is always `null`\n * and the outlet renders nothing — useful for remotes that don't need internal\n * routing.\n */\nexport const FLY_REMOTE_ROUTES = new InjectionToken<readonly FlyRemoteRoute[]>(\n 'FLY_REMOTE_ROUTES',\n);\n\n/**\n * Optional injection token a remote provides at its root to declare the shell\n * mount path prefix (e.g. `'/desktop'`). When set, `FlyRemoteRouter.segments()`\n * strips this prefix from `window.location.pathname` before matching routes.\n *\n * **Why this is needed:** In embedded mode the remote is loaded via\n * `NgComponentOutlet` inside the shell SPA. The shell's own Angular route may\n * leave `window.location.pathname` as `/desktop` (or any shell-level path).\n * Without stripping that prefix, `segments()` returns `['desktop']` which\n * matches none of the remote's Circles-internal routes (e.g. `''`, `'signals'`,\n * `'signals/:id'`), so `<fly-remote-router-outlet>` renders nothing.\n *\n * **Default behaviour (token absent):** `FlyRemoteRouter` initialises `_url`\n * to `'/'` in embedded mode, completely ignoring `window.location.pathname`.\n * This is safe because the shell does not push the remote's logical URL into\n * browser history — only `navigate()` / `navigateByUrl()` calls do.\n *\n * **Usage in a remote root component:**\n * ```ts\n * providers: [\n * FlyRemoteRouter,\n * { provide: FLY_REMOTE_ROUTES, useValue: MY_ROUTES },\n * { provide: FLY_REMOTE_BASE_PATH, useValue: '/desktop' },\n * ]\n * ```\n *\n * With `basePath = '/desktop'` and `window.location.pathname = '/desktop'`,\n * the stripped URL is `'/'` → `segments() = []` → matches the `''` default\n * route. With pathname `'/desktop/signals/abc'`, segments become\n * `['signals', 'abc']` → matches `'signals/:id'`.\n *\n * Available since design-system **2.7.2**.\n */\nexport const FLY_REMOTE_BASE_PATH = new InjectionToken<string>(\n 'FLY_REMOTE_BASE_PATH',\n);\n\n/**\n * Match a route's path pattern against URL segments. Returns the captured params\n * map on a successful match, or `null` if the pattern can't match. Empty path\n * matches only an empty segments array.\n *\n * Exported for unit testing — most consumers should rely on\n * `FlyRemoteRouter.matchedRoute()`.\n */\nexport function matchFlyRoutePattern(\n pattern: string,\n segments: readonly string[],\n): Record<string, string> | null {\n const patternSegments = pattern.split('/').filter(Boolean);\n if (patternSegments.length !== segments.length) return null;\n\n const params: Record<string, string> = {};\n for (let i = 0; i < patternSegments.length; i++) {\n const p = patternSegments[i];\n const s = segments[i];\n if (p.startsWith(':')) {\n params[p.slice(1)] = decodeURIComponent(s);\n } else if (p !== s) {\n return null;\n }\n }\n return params;\n}\n","import { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';\nimport {\n NavigationEnd,\n NavigationExtras,\n Router,\n} from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { WINDOW_DATA } from '../models/window.model';\nimport {\n FLY_REMOTE_BASE_PATH,\n FLY_REMOTE_ROUTES,\n FlyRemoteMatch,\n matchFlyRoutePattern,\n} from './fly-remote-router.types';\n\n/**\n * FlyOS standard navigation surface for Business / Supporting App remotes.\n *\n * Problem this solves\n * -------------------\n * A federated remote ships with its own Angular `Routes` table that works\n * perfectly in **standalone** mode (e.g. `http://localhost:7202/signals/:id`).\n * Once the same remote is mounted inside the FlyOS desktop shell via\n * `*ngComponentOutlet`, `inject(Router)` resolves to the **host shell's**\n * Router — which has no knowledge of `/signals/:id`. Calls like\n * `router.navigate(['/signals', id])` then silently no-op and the click\n * \"does nothing.\"\n *\n * The fix\n * -------\n * Inject `FlyRemoteRouter` instead of `Router`. It mirrors `Router.navigate` /\n * `Router.navigateByUrl` and:\n *\n * - **Standalone** (no `WINDOW_DATA`): delegates to the real Angular Router,\n * so the URL bar, browser back button, and `RouterLink` continue to work\n * exactly as before.\n * - **Embedded** (mounted in the shell via `WINDOW_DATA`): writes the target\n * URL to an internal signal (`url`, `segments`) and does **not** touch the\n * host's Router. The remote's root component watches the signal and renders\n * the right view (typically a `@switch` on the first segment, plus an inline\n * overlay for detail pages).\n *\n * Usage in a list page\n * --------------------\n * ```ts\n * private readonly router = inject(FlyRemoteRouter);\n *\n * openDetail(item: Signal): void {\n * this.router.navigate(['/signals', item.id]); // works in both modes\n * }\n * ```\n *\n * Usage in the remote's root component (embedded dispatcher)\n * ----------------------------------------------------------\n * ```ts\n * private readonly router = inject(FlyRemoteRouter);\n *\n * readonly view = computed(() => {\n * if (!this.router.isEmbedded) return null; // standalone: <router-outlet> handles it\n * const [head, id] = this.router.segments();\n * if (head === 'signals' && id) return { kind: 'signal-detail', id };\n * if (head === 'signals') return { kind: 'signals-list' };\n * return { kind: head ?? 'home' };\n * });\n * ```\n *\n * Notes\n * -----\n * - `WINDOW_DATA` is the canonical \"I am running inside the shell\" marker; the\n * shell provides it per window, and it is `null` everywhere else.\n * - `Router` is injected as `optional`. A remote that does not register a Router\n * (e.g. a tiny chromeless utility app) still gets a working `navigate` that\n * updates the `url` signal in embedded mode.\n */\n@Injectable({ providedIn: 'root' })\nexport class FlyRemoteRouter {\n private readonly windowData = inject(WINDOW_DATA, { optional: true });\n private readonly router = inject(Router, { optional: true });\n /**\n * Optional route table — if the remote provides `FLY_REMOTE_ROUTES`,\n * `matchedRoute` / `params` resolve against it. Unset means the consumer is\n * driving its own switch/template — `matchedRoute` stays `null`.\n */\n private readonly routes = inject(FLY_REMOTE_ROUTES, { optional: true }) ?? [];\n /**\n * Shell mount path prefix to strip from `window.location.pathname` when\n * deriving the initial URL in embedded mode. See `FLY_REMOTE_BASE_PATH` docs.\n *\n * When absent (the common case), the embedded router initialises `_url` to\n * `'/'` and ignores `window.location.pathname` entirely — correct because the\n * shell SPA never encodes the remote's logical route into the browser URL.\n */\n private readonly basePath = inject(FLY_REMOTE_BASE_PATH, { optional: true }) ?? null;\n\n /**\n * True when this remote is rendered inside the FlyOS desktop shell.\n *\n * Detection order:\n * 1. `WINDOW_DATA` is provided — the canonical signal, works when the\n * design-system module is genuinely shared via Native Federation's\n * `sharedMappings` and the InjectionToken identity matches.\n * 2. `globalThis.__FLYOS_SHELL__ === true` — set by the shell's `main.ts`\n * before `initFederation`. A plain JS global is shared across all\n * module instances in the same browser context, so this works even\n * when the InjectionToken splits between host and remote bundles\n * (a known Native Federation edge case).\n */\n readonly isEmbedded: boolean =\n this.windowData != null\n || (typeof globalThis !== 'undefined'\n && (globalThis as { __FLYOS_SHELL__?: boolean }).__FLYOS_SHELL__ === true);\n\n private readonly _url = signal<string>('/');\n\n /**\n * Current logical URL of the remote — `/signals/abc` etc.\n *\n * Standalone: mirrors `Router.url` and is updated on every `NavigationEnd`.\n * Embedded: updated by `navigate` / `navigateByUrl` only.\n */\n readonly url = this._url.asReadonly();\n\n /**\n * `url` parsed into path segments, e.g. `'/signals/abc'` → `['signals', 'abc']`.\n * Query string and hash are stripped. Empty segments removed.\n */\n readonly segments = computed<readonly string[]>(() => {\n const u = this._url();\n return u.split('?')[0].split('#')[0].split('/').filter(Boolean);\n });\n\n /**\n * First route from `FLY_REMOTE_ROUTES` whose pattern matches `segments()`,\n * paired with its captured params. `null` when no routes are registered or\n * none matches. Used by `<fly-remote-router-outlet>` to pick what to render.\n *\n * Match order: routes are tried in declaration order. Put more specific\n * patterns (e.g. `'signals/:id'`) before catch-alls.\n */\n readonly matchedRoute = computed<FlyRemoteMatch | null>(() => {\n const segs = this.segments();\n for (const route of this.routes) {\n const params = matchFlyRoutePattern(route.path, segs);\n if (params != null) return { route, params };\n }\n return null;\n });\n\n /**\n * Captured route params from the active route, e.g. `{ id: 'abc' }` for a\n * `'signals/:id'` match on `/signals/abc`. Empty object if no route matched\n * or the matched route has no captures.\n *\n * Components can read this directly:\n * ```ts\n * private readonly flyRouter = inject(FlyRemoteRouter);\n * readonly signalId = computed(() => this.flyRouter.params()['id'] ?? '');\n * ```\n */\n readonly params = computed<Readonly<Record<string, string>>>(() =>\n this.matchedRoute()?.params ?? {},\n );\n\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n if (!this.isEmbedded && this.router) {\n // Standalone: seed from Angular Router and track NavigationEnd events so\n // browser back/forward (which the host Router handles) keep segments() current.\n this._url.set(this.router.url);\n this.router.events\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (event instanceof NavigationEnd) {\n this._url.set(event.urlAfterRedirects);\n }\n });\n } else if (this.isEmbedded) {\n // Embedded: the shell SPA keeps its own route in window.location.pathname\n // (e.g. '/desktop') which is meaningless for the remote's route table.\n // Default: initialise to '/' so the remote's empty-path default route\n // matches on first render. When FLY_REMOTE_BASE_PATH is provided, strip\n // it from pathname first — useful if the shell does push a remote-aware\n // URL (e.g. '/desktop/signals/abc' with basePath '/desktop').\n if (typeof window !== 'undefined') {\n const rawPath = window.location.pathname || '/';\n const initialUrl = this._resolveEmbeddedInitialUrl(rawPath);\n this._url.set(initialUrl);\n\n // Listen for browser back/forward so segments() stays in sync with\n // history entries pushed by navigate() / navigateByUrl().\n const onPopState = (event: PopStateEvent): void => {\n const state = event.state as { flyRemoteUrl?: string } | null;\n // Prefer the URL we stashed in the history state; fall back to pathname.\n const url = state?.flyRemoteUrl ?? window.location.pathname ?? '/';\n this._url.set(url.startsWith('/') ? url : '/' + url);\n };\n\n window.addEventListener('popstate', onPopState);\n\n // Defensive cleanup — the service is providedIn: 'root' so this fires\n // only when the whole Angular app is destroyed, but it keeps things tidy.\n this.destroyRef.onDestroy(() => {\n window.removeEventListener('popstate', onPopState);\n });\n }\n }\n }\n\n /**\n * Navigate to a route, identified by an array of commands as you would pass\n * to Angular's `Router.navigate`. In embedded mode `extras` is ignored — the\n * shell owns history and query-param handling for the window's URL.\n */\n navigate(commands: readonly unknown[], extras?: NavigationExtras): Promise<boolean> {\n if (!this.isEmbedded && this.router) {\n // Standalone: Angular Router owns history — pushState semantics are the default.\n return this.router.navigate(commands as unknown[], extras);\n }\n const url = this.buildUrl(commands);\n this._pushEmbedded(url);\n return Promise.resolve(true);\n }\n\n /**\n * Navigate to a route given as a full URL string. Mirrors `Router.navigateByUrl`.\n */\n navigateByUrl(url: string, extras?: NavigationExtras): Promise<boolean> {\n if (!this.isEmbedded && this.router) {\n // Standalone: Angular Router owns history — pushState semantics are the default.\n return this.router.navigateByUrl(url, extras);\n }\n this._pushEmbedded(url.startsWith('/') ? url : '/' + url);\n return Promise.resolve(true);\n }\n\n /**\n * Convenience: pop the last two segments (the typical \"go back from detail\n * to list\" gesture). In standalone mode this falls through to `history.back()`\n * so the browser's back stack is respected.\n */\n back(): void {\n // Both modes: delegate to the browser's history stack. In embedded mode we\n // now push real history entries in navigate() / navigateByUrl(), so\n // history.back() triggers popstate and the listener updates segments().\n if (typeof history !== 'undefined') {\n history.back();\n }\n }\n\n /**\n * Resolve the logical URL to seed `_url` from on embedded initial load.\n *\n * - No basePath: always return `'/'`. The shell's SPA path (e.g. `/desktop`)\n * is irrelevant to the remote — `navigate()` is the only thing that should\n * move the remote's URL.\n * - basePath provided: strip it from `rawPath`. If rawPath starts with the\n * basePath, the remainder becomes the seed URL (normalised to start with\n * `'/'`). If it doesn't match (e.g. shell changed its own route), fall back\n * to `'/'` rather than surfacing shell-specific segments to the remote's\n * route table.\n */\n private _resolveEmbeddedInitialUrl(rawPath: string): string {\n if (!this.basePath) {\n // Default: ignore the shell's pathname, start at remote root.\n return '/';\n }\n const base = this.basePath.endsWith('/') ? this.basePath.slice(0, -1) : this.basePath;\n if (rawPath === base || rawPath === base + '/') {\n return '/';\n }\n if (rawPath.startsWith(base + '/')) {\n const remainder = rawPath.slice(base.length);\n return remainder.startsWith('/') ? remainder : '/' + remainder;\n }\n // Shell path doesn't begin with our basePath — fall through to root.\n return '/';\n }\n\n /**\n * In embedded mode: push a real browser history entry (so back/forward work)\n * and update the internal signal synchronously.\n *\n * The state object carries `flyRemoteUrl` so the popstate listener can\n * restore the exact URL without relying on window.location.pathname (which\n * could be the shell's route, not the remote's logical URL).\n */\n private _pushEmbedded(url: string): void {\n if (typeof history !== 'undefined') {\n history.pushState({ flyRemoteUrl: url }, '', url);\n }\n this._url.set(url);\n }\n\n private buildUrl(commands: readonly unknown[]): string {\n const parts = commands\n .map(c => (c == null ? '' : String(c)))\n .map(s => s.replace(/^\\/+|\\/+$/g, ''))\n .filter(Boolean);\n return '/' + parts.join('/');\n }\n}\n","import { InjectionToken, Injectable, inject } from '@angular/core';\n\n/**\n * Minimal adapter the shell (or any host) provides so design-system services can\n * look up apps without depending on `AppRegistryService` directly. Keeps the\n * design-system decoupled from shell internals — hosts wire this once at root.\n *\n * Shell wiring example:\n * ```ts\n * { provide: APP_LOOKUP, useFactory: () => {\n * const r = inject(AppRegistryService);\n * return { getById: id => { const a = r.getById(id); return a ? { id: a.id, name: a.name } : undefined; } };\n * } }\n * ```\n */\nexport interface AppLookupEntry {\n readonly id: string;\n readonly name: string;\n}\n\nexport interface AppLookup {\n getById(id: string): AppLookupEntry | undefined;\n}\n\nexport const APP_LOOKUP = new InjectionToken<AppLookup>('APP_LOOKUP');\n\n/**\n * Canonicalizes raw source-app identifiers and resolves display names.\n *\n * Problem this solves\n * -------------------\n * Backend services emit two different identifiers for the same app:\n * - JWT `client_id` (inter-service identity), e.g. `\"circles-service\"`.\n * - AppCatalog `id` (frontend identity), e.g. `\"circles\"`.\n *\n * Task rows, audit entries, notifications, etc. may carry either form depending\n * on which service wrote them and when. Every UI surface that renders the\n * source app needs the same canonicalization rule — without it, chips display\n * `\"circles-service\"` instead of the friendly `\"Circles\"`.\n *\n * Rule: try the raw id against the registry; if it misses and the id ends in\n * `-service`, retry with the suffix stripped. The first hit wins. Returns\n * `null` from `resolveId` when nothing matches, so callers can guard CTAs.\n */\n@Injectable({ providedIn: 'root' })\nexport class SourceAppResolver {\n private readonly lookup = inject(APP_LOOKUP, { optional: true });\n\n /** Returns the registry-resolvable canonical id, or `null` when neither form is registered. */\n resolveId(rawId: string | null | undefined): string | null {\n if (!rawId || !this.lookup) return null;\n if (this.lookup.getById(rawId)) return rawId;\n const canonical = rawId.replace(/-service$/, '');\n if (canonical !== rawId && this.lookup.getById(canonical)) return canonical;\n return null;\n }\n\n /**\n * Display name for the source app. Prefers the registry's localized name when\n * the id resolves; falls back to a title-cased canonical id (e.g.\n * `\"circles-service\"` → `\"Circles\"`) so chips never expose raw `-service`\n * client_ids even for apps not yet in the registry. Empty string for null/undefined.\n */\n resolveName(rawId: string | null | undefined): string {\n if (!rawId) return '';\n const id = this.resolveId(rawId);\n if (id) return this.lookup!.getById(id)!.name;\n const canonical = rawId.replace(/-service$/, '');\n return canonical.charAt(0).toUpperCase() + canonical.slice(1);\n }\n\n /** True when an open-in-source CTA is launchable: id resolves *and* there's a route. */\n canOpen(rawId: string | null | undefined, route: string | null | undefined): boolean {\n return this.resolveId(rawId) !== null && !!route;\n }\n}\n","/**\n * fly-remote-styles — Shell-layer CSS loader for Native Federation remotes.\n *\n * Problem\n * -------\n * Federated remotes only ship JS chunks via Native Federation — their global\n * `styles.css` (or its hashed equivalent) never loads in the shell, so any\n * global CSS selector (e.g. `.circles-overlay`) silently breaks in embedded\n * mode.\n *\n * Solution\n * --------\n * On first mount of each remote, the shell calls `loadRemoteStyles(appId,\n * remoteBaseUrl)`. This function:\n * 1. Derives the remote's `index.html` URL from `remoteBaseUrl`.\n * 2. Fetches it (one network round-trip per remote; browser-cached thereafter).\n * 3. Parses the HTML with DOMParser to extract the first\n * `<link rel=\"stylesheet\">` — the hashed production stylesheet\n * (e.g. `styles-ABC123.css`). This is Strategy (b): index.html discovery.\n * 4. Injects the stylesheet into `document.head` using one of two approaches\n * (see Injection approach below).\n *\n * Why strategy (b)?\n * -----------------\n * (a) Unhashed `styles.css` — requires remote build config changes (out of scope).\n * (b) Parse remote `index.html` — one tiny fetch per remote; browser caches it;\n * works today without any remote changes.\n * (c) `stylesUrl` in manifest/remoteEntry.json — cleanest long-term; requires\n * protocol change to every remote's CI pipeline (out of scope for Wave A1).\n *\n * Injection approach\n * ------------------\n * Preferred (Firefox 134+, Chrome 99+, Safari 17.2+):\n * `<link rel=\"stylesheet\" href=\"…\" crossorigin=\"anonymous\" layer=\"remote\">`\n *\n * The `layer` attribute on `<link>` is feature-detected once at module init via:\n * `'layer' in HTMLLinkElement.prototype`\n * If the attribute is supported, the shell injects a non-render-blocking `<link>`\n * element. The browser gets proper preload semantics and CORS headers flow through\n * the normal stylesheet pipeline.\n *\n * Fallback (browsers without `link[layer]` support):\n * `<style>@import url(\"…\") layer(remote);</style>`\n *\n * CSS Cascade Level 5: `@import url(\"…\") layer(remote)` is the ONLY valid way to\n * place an @import inside a named cascade layer when using the `<style>` approach.\n * The block-form `@layer remote { @import url(\"…\"); }` is INVALID CSS — the spec\n * forbids `@import` inside any block at-rule. Browsers silently drop such rules.\n *\n * Both code paths attach `data-fly-app` and `data-fly-href` attributes to the\n * injected element so idempotency checks work uniformly.\n *\n * Layer order declaration\n * -----------------------\n * A one-time `<style data-fly-layers>` element is prepended to `<head>` at module\n * init. It establishes the canonical layer order:\n * reset → designsystem → shell → remote → overrides\n * This guarantees that even if individual `@layer` blocks are injected in any\n * order at runtime, the cascade priority is always deterministic.\n *\n * CSP nonce propagation\n * ---------------------\n * If a `<meta name=\"csp-nonce\">` element is present, its content is read once at\n * module init and applied to every injected `<style>` or `<link>` element. If no\n * nonce meta is present, nothing is set (graceful degradation).\n *\n * URL validation\n * --------------\n * Discovered hrefs must be `http://`-, `https://`-, or `//`-prefixed. `javascript:`,\n * `data:`, and `blob:` are rejected outright. The href's origin must also match the\n * origin of `remoteBaseUrl` (same-origin as the remote), preventing a compromised\n * `index.html` from pointing at an attacker domain.\n *\n * Unload decision\n * ---------------\n * `unloadRemoteStyles` is exported for symmetry but should NOT be called on\n * normal window close. Keeping styles loaded across remounts avoids FOUC\n * flicker when the user reopens the same app. The stylesheet is a few KB; the\n * memory cost is negligible. Only call `unloadRemoteStyles` if you are certain\n * the remote will never be opened again in this session (e.g. licence revoke).\n *\n * Caveats\n * -------\n * - CORS: the remote's dev/prod server must serve `index.html` with a permissive\n * `Access-Control-Allow-Origin` header (or be same-origin via the YARP gateway).\n * The fetch uses `credentials: 'omit'` to avoid credential-carrying preflights.\n * - Fetch timeout: the index.html fetch is capped at 5 seconds. On timeout the\n * in-flight entry is cleared so a retry is possible on the next call.\n * - Race on rapid mount/unmount: if `loadRemoteStyles` is called a second time for\n * the same appId while the first fetch is still in-flight, the second call joins\n * the same in-flight Promise.\n * - Angular hashing: Angular's production build hashes the stylesheet filename.\n * DOMParser picks the first `<link rel=\"stylesheet\">` in `<head>`, which is the\n * single global stylesheet Angular emits. If a remote emits multiple stylesheets,\n * only the first is loaded — acceptable for Wave A1.\n */\n\n/**\n * Feature detection: does the browser support the `layer` attribute on\n * `<link>` elements? Probed once at module init.\n * Firefox 134+, Chrome 99+, Safari 17.2+ all ship this.\n */\nconst _linkLayerSupported: boolean =\n typeof HTMLLinkElement !== 'undefined' && 'layer' in HTMLLinkElement.prototype;\n\n/**\n * CSP nonce, read once from `<meta name=\"csp-nonce\">` at module init.\n * Applied to every injected `<style>` / `<link>` element. Null when absent.\n */\nconst _cspNonce: string | null =\n typeof document !== 'undefined'\n ? (document.querySelector<HTMLMetaElement>('meta[name=\"csp-nonce\"]')?.content ?? null)\n : null;\n\n/** In-flight fetch promises keyed by appId — prevents duplicate fetches. */\nconst _inFlight = new Map<string, Promise<string | null>>();\n\n// ---------------------------------------------------------------------------\n// Layer order — injected immediately at module init (synchronous, runs once).\n// ---------------------------------------------------------------------------\n(function _ensureLayerOrder(): void {\n if (typeof document === 'undefined') return; // SSR guard\n if (document.head.querySelector('style[data-fly-layers]')) return;\n\n const style = document.createElement('style');\n style.setAttribute('data-fly-layers', '');\n style.textContent = '@layer reset, designsystem, shell, remote, overrides;';\n if (_cspNonce) style.nonce = _cspNonce;\n // Prepend so this always precedes any other layer-bearing <style> blocks.\n document.head.insertBefore(style, document.head.firstChild);\n})();\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Discovers the hashed stylesheet href from the remote's `index.html`.\n * Applies a 5-second AbortController timeout. Clears `_inFlight` on abort so\n * a retry is possible. Returns `null` on any failure.\n */\nasync function _discoverStylesheetHref(appId: string, remoteBaseUrl: string): Promise<string | null> {\n const indexUrl = remoteBaseUrl.replace(/\\/$/, '') + '/index.html';\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n try {\n const res = await fetch(indexUrl, {\n credentials: 'omit',\n cache: 'default',\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n\n if (!res.ok) return null;\n const html = await res.text();\n const doc = new DOMParser().parseFromString(html, 'text/html');\n // Find the first stylesheet link in <head> — Angular emits exactly one.\n const link = doc.head.querySelector<HTMLLinkElement>('link[rel=\"stylesheet\"]');\n if (!link?.href) return null;\n // `link.href` from DOMParser resolves against `about:blank`. Use raw attribute.\n const rawHref = link.getAttribute('href') ?? '';\n if (!rawHref) return null;\n\n // Early-reject dangerous schemes before any URL resolution.\n // Without this guard, `javascript:alert(1)` would be rewritten to\n // `remoteBaseUrl/javascript:alert(1)` and silently pass origin validation.\n const rawLower = rawHref.toLowerCase();\n if (\n rawLower.startsWith('javascript:') ||\n rawLower.startsWith('data:') ||\n rawLower.startsWith('blob:')\n ) {\n console.warn(`[FlyOS] loadRemoteStyles: rejected unsafe stylesheet href \"${rawHref}\"`);\n return null;\n }\n\n // Resolve to absolute URL for origin validation.\n let resolvedHref: string;\n if (rawHref.startsWith('http://') || rawHref.startsWith('https://') || rawHref.startsWith('//')) {\n resolvedHref = rawHref;\n } else {\n resolvedHref = remoteBaseUrl.replace(/\\/$/, '') + '/' + rawHref.replace(/^\\//, '');\n }\n\n return _validateHref(resolvedHref, remoteBaseUrl);\n } catch {\n clearTimeout(timeoutId);\n // On abort or network error, clear in-flight so a retry is possible.\n _inFlight.delete(appId);\n return null;\n }\n}\n\n/**\n * Validates that a discovered href is safe to inject:\n * - Must be `http://`, `https://`, or `//`-prefixed (no `javascript:`, `data:`, `blob:`).\n * - Must share the same origin as `remoteBaseUrl`.\n *\n * Returns the href on success; logs a warning and returns `null` on failure.\n */\nfunction _validateHref(href: string, remoteBaseUrl: string): string | null {\n // Block dangerous schemes.\n const lower = href.toLowerCase();\n if (\n lower.startsWith('javascript:') ||\n lower.startsWith('data:') ||\n lower.startsWith('blob:')\n ) {\n console.warn(`[FlyOS] loadRemoteStyles: rejected unsafe stylesheet href \"${href}\"`);\n return null;\n }\n\n // Must be absolute (http/https/protocol-relative).\n if (\n !lower.startsWith('http://') &&\n !lower.startsWith('https://') &&\n !lower.startsWith('//')\n ) {\n console.warn(`[FlyOS] loadRemoteStyles: rejected non-absolute stylesheet href \"${href}\"`);\n return null;\n }\n\n // Origin must match remoteBaseUrl — prevents a compromised index.html from\n // redirecting styles at an attacker-controlled domain.\n try {\n const hrefOrigin = new URL(href.startsWith('//') ? 'https:' + href : href).origin;\n const remoteOrigin = new URL(remoteBaseUrl).origin;\n if (hrefOrigin !== remoteOrigin) {\n console.warn(\n `[FlyOS] loadRemoteStyles: rejected cross-origin stylesheet href \"${href}\" ` +\n `(expected origin \"${remoteOrigin}\", got \"${hrefOrigin}\")`\n );\n return null;\n }\n } catch {\n console.warn(`[FlyOS] loadRemoteStyles: could not parse href origin for \"${href}\"`);\n return null;\n }\n\n return href;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Injects the remote's stylesheet into `document.head`.\n *\n * @param appId - Stable identifier for the remote app (matches `DesktopApp.id`).\n * @param remoteBaseUrl - Base URL of the remote, e.g. `https://circles.example.com`\n * or `http://localhost:7202`. Must NOT include `/remoteEntry.json`.\n *\n * The call is idempotent:\n * - If an element with `data-fly-app=\"appId\"` whose `data-fly-href` matches the\n * discovered href already exists → no-op.\n * - If the href differs (hot upgrade) → existing element is replaced.\n * - If no stylesheet is found in `index.html` → no-op (logged as a warning).\n *\n * Injection shape (preferred — `link[layer]` supported):\n * <link rel=\"stylesheet\" data-fly-app=\"<appId>\" data-fly-href=\"<href>\"\n * href=\"<href>\" crossorigin=\"anonymous\" layer=\"remote\">\n *\n * Injection shape (fallback — `link[layer]` unsupported):\n * <style data-fly-app=\"<appId>\" data-fly-href=\"<href>\">\n * @import url(\"<href>\") layer(remote);\n * </style>\n *\n * The `data-fly-href` attribute stores the discovered href separately from the\n * element content so idempotency checks can compare the URL without parsing CSS.\n */\nexport async function loadRemoteStyles(appId: string, remoteBaseUrl: string): Promise<void> {\n if (typeof document === 'undefined') return; // SSR guard\n\n // Resolve relative remoteBaseUrl (e.g. '/circles-dev') against the current\n // page origin so all downstream URL operations (fetch, origin check) receive\n // an absolute URL. Absolute inputs are returned unchanged by new URL().\n const absoluteBase = new URL(remoteBaseUrl, location.href).href.replace(/\\/$/, '');\n\n // Kick off or join an in-flight fetch for this appId.\n // Note: _resolvedHref cache is intentionally absent — always re-discover so\n // the browser's HTTP cache handles cost (index.html is tiny) and hot-deploys\n // are picked up without a page reload.\n let fetchPromise = _inFlight.get(appId);\n if (!fetchPromise) {\n fetchPromise = _discoverStylesheetHref(appId, absoluteBase);\n _inFlight.set(appId, fetchPromise);\n }\n\n const href = await fetchPromise;\n _inFlight.delete(appId);\n\n if (!href) {\n console.warn(\n `[FlyOS] loadRemoteStyles: no stylesheet found in ${absoluteBase}/index.html for appId=\"${appId}\"`\n );\n return;\n }\n\n // Check both <link> and <style> selectors — handle upgrades from the old fallback path.\n const escapedId = CSS.escape(appId);\n const existing =\n document.head.querySelector<HTMLLinkElement | HTMLStyleElement>(\n `link[data-fly-app=\"${escapedId}\"], style[data-fly-app=\"${escapedId}\"]`\n );\n\n if (existing) {\n if (existing.getAttribute('data-fly-href') === href) return; // identical — no-op\n // Hot upgrade: remove old element (could be <link> or <style>) atomically.\n existing.remove();\n }\n\n if (_linkLayerSupported) {\n // Preferred path: non-render-blocking <link> with native layer= attribute.\n // Firefox 134+, Chrome 99+, Safari 17.2+ all support this.\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.setAttribute('data-fly-app', appId);\n link.setAttribute('data-fly-href', href);\n link.href = href;\n link.crossOrigin = 'anonymous';\n (link as unknown as Record<string, string>)['layer'] = 'remote';\n if (_cspNonce) link.nonce = _cspNonce;\n document.head.appendChild(link);\n } else {\n // Fallback path: <style> with @import layer(remote) for older browsers.\n // CSS Cascade Level 5: `@import url(\"…\") layer(remote)` is the only valid\n // way to place an @import inside a named cascade layer. Block-form\n // `@layer remote { @import … }` is invalid and silently dropped by browsers.\n const style = document.createElement('style');\n style.setAttribute('data-fly-app', appId);\n style.setAttribute('data-fly-href', href);\n style.textContent = `@import url(\"${href}\") layer(remote);`;\n if (_cspNonce) style.nonce = _cspNonce;\n document.head.appendChild(style);\n }\n}\n\n/**\n * Removes the injected stylesheet element (either `<link>` or `<style>`) for\n * `appId` from `document.head` and clears all internal state for this appId.\n *\n * NOTE: Prefer NOT calling this on normal window close — keeping styles loaded\n * prevents FOUC flicker when the user reopens the same app. Call only if you\n * are certain the remote will not be reopened in this session.\n */\nexport function unloadRemoteStyles(appId: string): void {\n if (typeof document === 'undefined') return; // SSR guard\n const escapedId = CSS.escape(appId);\n // Remove <link> element (preferred path) if present.\n document.head\n .querySelector(`link[data-fly-app=\"${escapedId}\"]`)\n ?.remove();\n // Remove <style> element (fallback path) if present.\n document.head\n .querySelector(`style[data-fly-app=\"${escapedId}\"]`)\n ?.remove();\n // Clear in-flight so a future call can retry.\n _inFlight.delete(appId);\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { FlyRemoteRouter } from '../../services/fly-remote-router.service';\n\n/**\n * Outlet for FlyOS-embedded routing. Renders the component associated with the\n * first matching route in the consumer's `FLY_REMOTE_ROUTES` table, reacting to\n * `FlyRemoteRouter.navigate(...)` calls.\n *\n * Use this **only in embedded mode**. Standalone remotes should keep their\n * `<router-outlet>` — `FlyRemoteRouter.navigate` delegates to Angular's Router\n * there, and this outlet would just shadow it.\n *\n * Recommended pattern in a remote's root component:\n * ```html\n * @if (router.isEmbedded) {\n * <fly-remote-router-outlet />\n * } @else {\n * <router-outlet />\n * }\n * ```\n *\n * Why both? Standalone keeps full Angular routing — query params, guards,\n * resolvers, lazy loading, RouterLink. Embedded gets a stripped-down\n * synchronous outlet that matches against the same route table the remote\n * declared via `FLY_REMOTE_ROUTES`. The same `router.navigate(['/foo', id])`\n * call works in both modes; only the rendering surface differs.\n *\n * Limitations vs. `<router-outlet>`:\n * - Synchronous components only (no `loadComponent` / `loadChildren`).\n * - No guards / resolvers / data resolution.\n * - No query-param / hash handling — only path segments.\n * - No `RouterLink` directive — use `(click)=\"router.navigate(...)\"`.\n *\n * Components rendered by this outlet read route params via `FlyRemoteRouter.params`:\n * ```ts\n * private readonly router = inject(FlyRemoteRouter);\n * readonly id = computed(() => this.router.params()['id'] ?? '');\n * ```\n */\n@Component({\n selector: 'fly-remote-router-outlet',\n standalone: true,\n imports: [NgComponentOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (matched(); as m) {\n <ng-container *ngComponentOutlet=\"m.route.component\" />\n }\n `,\n})\nexport class FlyRemoteRouterOutletComponent {\n private readonly router = inject(FlyRemoteRouter);\n\n /**\n * Read directly from FlyRemoteRouter so the outlet re-renders whenever the\n * URL changes (signal-based, OnPush-friendly).\n */\n readonly matched = this.router.matchedRoute;\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { I18nService } from '../services/i18n.service';\n\n/**\n * Translates a key using the shared I18nService.\n *\n * @example\n * {{ 'myApp.section.title' | translate }}\n * {{ 'myApp.items_count' | translate:{ n: count() } }}\n */\n@Pipe({\n name: 'translate',\n standalone: true,\n pure: false,\n})\nexport class TranslatePipe implements PipeTransform {\n private readonly i18n = inject(I18nService);\n\n transform(key: string, params?: Record<string, string | number>): string {\n // Read version so template CD re-runs when bundles load (merged translations updated).\n void this.i18n.version();\n return this.i18n.t(key, params);\n }\n}\n","import { Injectable, Signal, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { User } from '../models/user.model';\n\nexport interface MockAuthConfig {\n user: User;\n token?: string;\n loginRedirect?: string[];\n logoutRedirect?: string[];\n}\n\ninterface MockSession {\n accessToken: string;\n user: User;\n expiresAt: number;\n}\n\n/**\n * Shared mock AuthService base class for Business App developers.\n *\n * Extend this class in your app's `auth.service.mock.ts` and override\n * `getConfig()` to supply app-specific mock user data and navigation paths.\n * The subclass must be decorated with `@Injectable({ providedIn: 'root' })`\n * and exported as `AuthService` so Angular's `fileReplacements` swap works.\n *\n * @example\n * ```typescript\n * // src/app/core/services/auth.service.mock.ts\n * import { Injectable } from '@angular/core';\n * import { MockAuthService, type MockAuthConfig } from '@mohamedatia/fly-design-system';\n *\n * @Injectable({ providedIn: 'root' })\n * export class AuthService extends MockAuthService {\n * protected override getConfig(): MockAuthConfig {\n * return {\n * user: { id: 'dev-001', tenantId: 'dev-tenant', email: 'dev@example.com',\n * firstName: 'Dev', lastName: 'User', fullName: 'Dev User',\n * preferredLocale: 'en', roles: ['admin'], apps: ['my-app'] },\n * token: 'my-mock-token',\n * loginRedirect: ['/app'],\n * };\n * }\n * }\n * ```\n */\n@Injectable()\nexport class MockAuthService {\n private readonly router = inject(Router);\n\n protected readonly _session: ReturnType<typeof signal<MockSession | null>>;\n\n private readonly _config: MockAuthConfig;\n\n readonly isAuthenticated: Signal<boolean>;\n readonly currentUser: Signal<User | null>;\n readonly accessToken: Signal<string | null>;\n /** Always false in mock mode — 2FA is handled entirely by the STS. */\n readonly hasPendingTwoFactor: Signal<boolean>;\n /** Always false in mock mode — auth is pre-populated synchronously. */\n readonly initializing: Signal<boolean>;\n\n /**\n * Shell and guards may read this flag; real auth uses `localStorage` `fly_had_session`.\n * Default false — override in the app’s `auth.service.mock.ts` if needed.\n */\n get hadPriorSession(): boolean {\n return false;\n }\n\n constructor() {\n // All signal/computed calls are inside the constructor body so Angular's\n // injection context and ngDevMode are fully set up before they execute.\n this._config = this.getConfig();\n\n this._session = signal<MockSession | null>({\n accessToken: this._config.token ?? 'mock-token',\n user: this._config.user,\n expiresAt: Date.now() + 24 * 60 * 60 * 1000,\n });\n\n this.isAuthenticated = computed(() => {\n const s = this._session();\n return s !== null && s.expiresAt > Date.now();\n });\n\n this.currentUser = computed(() => this._session()?.user ?? null);\n this.accessToken = computed(() => this._session()?.accessToken ?? null);\n this.hasPendingTwoFactor = computed(() => false);\n this.initializing = signal(false).asReadonly();\n }\n\n /** Override in subclass to supply app-specific mock data. */\n protected getConfig(): MockAuthConfig {\n return {\n user: {\n id: 'mock-user-001',\n tenantId: 'mock-tenant-001',\n email: 'developer@fly.local',\n firstName: 'UI',\n lastName: 'Developer',\n fullName: 'UI Developer',\n preferredLocale: 'en',\n roles: ['admin'],\n apps: [],\n },\n };\n }\n\n async init(): Promise<void> {\n // Mock mode: already authenticated, nothing to initialize.\n }\n\n startLogin(): void {\n this.router.navigate(this._config.loginRedirect ?? ['/']);\n }\n\n handleCallback(_code: string, _state?: string): Observable<User> {\n return of(this._config.user);\n }\n\n async forceRefresh(): Promise<void> {\n // No-op in mock mode — token never expires.\n }\n\n patchSessionPreferredLocale(locale: string): void {\n const session = this._session();\n if (!session?.user) return;\n this._session.set({ ...session, user: { ...session.user, preferredLocale: locale } });\n }\n\n /** Parameter order matches the real AuthService: (user, accessToken, expiresAt). */\n setSession(_user: User, _accessToken: string, _expiresAt: number): void {\n // No-op in mock mode — session is hardcoded.\n }\n\n logout(): void {\n this._session.set(null);\n this.router.navigate(this._config.logoutRedirect ?? ['/']);\n }\n}\n","import {\n Component, input, output, HostListener, ViewChild, ElementRef,\n computed, signal, AfterViewInit, OnDestroy, ChangeDetectionStrategy, inject, DOCUMENT,\n} from '@angular/core';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\n\nexport interface ContextMenuItem {\n id: string;\n label: string;\n icon: string;\n}\n\nexport interface ContextMenuSection {\n label?: string;\n items: ContextMenuItem[];\n}\n\n@Component({\n selector: 'fly-context-menu',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: './context-menu.component.html',\n styleUrl: './context-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ContextMenuComponent implements AfterViewInit, OnDestroy {\n @ViewChild('contextMenu') private menuEl?: ElementRef<HTMLElement>;\n\n private readonly doc = inject(DOCUMENT);\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n\n x = input.required<number>();\n y = input.required<number>();\n sections = input.required<ContextMenuSection[]>();\n action = output<string>();\n closed = output<void>();\n\n private menuWidth = signal(0);\n private menuHeight = signal(0);\n\n private previouslyFocused: Element | null = null;\n\n // Resolved position: clamp to viewport so the menu never overflows an edge.\n // menuWidth/Height start at 0 so the first render places the menu at (x,y)\n // with no clamping; ngAfterViewInit measures the real size and updates the\n // signals, which re-evaluates this computed and repositions correctly.\n clampedPos = computed(() => {\n const vw = this.doc.defaultView?.innerWidth ?? 0;\n const vh = this.doc.defaultView?.innerHeight ?? 0;\n const w = this.menuWidth();\n const h = this.menuHeight();\n const x = this.x();\n const y = this.y();\n return {\n left: w > 0 ? Math.min(x, vw - w - 8) : x,\n top: h > 0 ? Math.min(y, vh - h - 8) : y,\n };\n });\n\n ngAfterViewInit(): void {\n // Portal: move host to <body> so position:fixed resolves against the true\n // viewport, not against any transformed/backdrop-filtered ancestor window.\n this.doc.body.appendChild(this.hostEl.nativeElement);\n\n // Measure after portal move so offsetWidth/Height are accurate.\n const el = this.menuEl?.nativeElement;\n if (el) {\n this.menuWidth.set(el.offsetWidth);\n this.menuHeight.set(el.offsetHeight);\n }\n\n this.previouslyFocused = document.activeElement;\n this.focusItem(0);\n }\n\n ngOnDestroy(): void {\n const el = this.hostEl.nativeElement;\n if (el.parentNode === this.doc.body) {\n this.doc.body.removeChild(el);\n }\n }\n\n onAction(id: string): void {\n this.action.emit(id);\n this.close();\n }\n\n @HostListener('document:mousedown', ['$event'])\n onClickOutside(event: MouseEvent): void {\n if (!this.menuEl?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n this.close();\n }\n\n @HostListener('document:contextmenu', ['$event'])\n onContextMenu(event: MouseEvent): void {\n if (!this.menuEl?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n const items = this.getMenuItems();\n if (!items.length) return;\n const focused = document.activeElement as HTMLElement;\n const idx = items.indexOf(focused);\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.focusItem(idx < items.length - 1 ? idx + 1 : 0);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.focusItem(idx > 0 ? idx - 1 : items.length - 1);\n } else if (event.key === 'Home') {\n event.preventDefault();\n this.focusItem(0);\n } else if (event.key === 'End') {\n event.preventDefault();\n this.focusItem(items.length - 1);\n }\n }\n\n private close(): void {\n this.restoreFocus();\n this.closed.emit();\n }\n\n private getMenuItems(): HTMLElement[] {\n return Array.from(\n this.menuEl?.nativeElement.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? [],\n );\n }\n\n private focusItem(index: number): void {\n const items = this.getMenuItems();\n items[index]?.focus();\n }\n\n private restoreFocus(): void {\n if (this.previouslyFocused instanceof HTMLElement) {\n this.previouslyFocused.focus();\n }\n this.previouslyFocused = null;\n }\n}\n","<div\n #contextMenu\n class=\"context-menu\"\n [style.left.px]=\"clampedPos().left\"\n [style.top.px]=\"clampedPos().top\"\n role=\"menu\"\n [attr.aria-label]=\"'shell.context_menu' | translate\">\n\n @for (section of sections(); track $index) {\n @if ($index > 0) {\n <div class=\"menu-divider\"></div>\n }\n @if (section.label) {\n <div class=\"menu-section-label\">{{ section.label }}</div>\n }\n @for (item of section.items; track item.id) {\n <button\n type=\"button\"\n class=\"vos-btn sm rect menu-item\"\n role=\"menuitem\"\n (click)=\"onAction(item.id)\">\n <i [class]=\"'pi ' + item.icon\" aria-hidden=\"true\"></i>\n <span>{{ item.label }}</span>\n </button>\n }\n }\n</div>\n","import { Injectable, inject, signal } from '@angular/core';\nimport { I18nService } from '../../services/i18n.service';\n\nexport enum MessageBoxButtons {\n OK,\n OKCancel,\n YesNo,\n YesNoCancel,\n RetryCancel,\n AbortRetryIgnore,\n}\n\nexport enum MessageBoxIcon {\n None,\n Information,\n Warning,\n Error,\n Question,\n}\n\nexport enum DialogResult {\n None,\n OK,\n Cancel,\n Yes,\n No,\n Retry,\n Abort,\n Ignore,\n}\n\nexport interface MessageBoxOptions {\n title: string;\n message: string;\n buttons?: MessageBoxButtons;\n icon?: MessageBoxIcon;\n}\n\n/**\n * Configuration for the \"Don't ask again\" checkbox rendered by\n * `showAcknowledged()`. The field is intentionally NOT part of the base\n * `MessageBoxOptions` so the type system enforces the rule\n * \"checkbox ⇒ caller MUST use `showAcknowledged()`\": the classic `show()`\n * entry point cannot accept this shape, eliminating the silent-discard\n * dark-pattern path where the user's choice was thrown away.\n */\nexport interface MessageBoxDontAskAgainConfig {\n /** i18n key for the checkbox label, e.g. 'agent.command.builtin.clear.dont_ask_again'. */\n labelKey: string;\n /** Initial checked state. Default false. */\n defaultChecked?: boolean;\n}\n\n/**\n * Options narrowed to those carrying a `dontAskAgain` config — the only shape\n * accepted by `showAcknowledged()`.\n */\nexport interface MessageBoxOptionsWithAcknowledgement extends MessageBoxOptions {\n dontAskAgain: MessageBoxDontAskAgainConfig;\n}\n\nexport interface MessageBoxButton {\n label: string;\n result: DialogResult;\n variant?: 'primary' | 'danger' | 'default';\n}\n\n/** Shape returned by `showAcknowledged()` — pairs the dialog result with the checkbox state. */\nexport interface DialogResultWithAcknowledgement {\n readonly result: DialogResult;\n readonly dontAskAgain: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MessageBoxService {\n private readonly i18n = inject(I18nService);\n\n readonly visible = signal(false);\n readonly title = signal('');\n readonly message = signal('');\n readonly icon = signal<MessageBoxIcon>(MessageBoxIcon.None);\n readonly buttons = signal<MessageBoxButton[]>([]);\n /**\n * Active \"Don't ask again\" config — populated only by `showAcknowledged()`.\n * `show()` callers cannot reach this signal because the type system rejects\n * `dontAskAgain` on the base `MessageBoxOptions`.\n */\n readonly dontAskAgain = signal<MessageBoxDontAskAgainConfig | undefined>(undefined);\n\n /**\n * Component-side checkbox state. The component (`MessageBoxComponent`) wires\n * its own signal to this one; the service explicitly re-seeds it on every\n * `_open()` so reusing a constant `options` literal across two opens does\n * NOT leak the previous user's checkbox state through signal `===` dedupe.\n * Exposed for the component to read/write; not for general callers.\n */\n readonly dontAskAgainChecked = signal(false);\n\n private resolver: ((value: DialogResultWithAcknowledgement) => void) | null = null;\n\n show(options: MessageBoxOptions): Promise<DialogResult> {\n return this._open(options).then((r) => r.result);\n }\n\n /**\n * Opens a message box with a \"Don't ask again\" checkbox and resolves to both\n * the dialog result and the checkbox state. Throws when `options.dontAskAgain`\n * is missing — the checkbox config is mandatory for this entry point. The\n * compile-time signature already guarantees presence; the runtime check is\n * defense-in-depth for callers that bypass the type system via `as never`.\n */\n showAcknowledged(\n options: MessageBoxOptionsWithAcknowledgement,\n ): Promise<DialogResultWithAcknowledgement> {\n if (!options.dontAskAgain) {\n throw new Error(\n 'MessageBoxService.showAcknowledged() requires options.dontAskAgain — use show() for plain dialogs.',\n );\n }\n return this._open(options);\n }\n\n resolve(result: DialogResult, dontAskAgain = false): void {\n this.visible.set(false);\n if (this.resolver) {\n this.resolver({ result, dontAskAgain });\n this.resolver = null;\n }\n }\n\n private _open(\n options: MessageBoxOptions | MessageBoxOptionsWithAcknowledgement,\n ): Promise<DialogResultWithAcknowledgement> {\n // Dismiss any pending dialog so its Promise resolves rather than leaking.\n if (this.resolver) {\n this.resolver({ result: DialogResult.None, dontAskAgain: false });\n this.resolver = null;\n }\n\n const daa =\n 'dontAskAgain' in options ? options.dontAskAgain : undefined;\n\n this.title.set(options.title);\n this.message.set(options.message);\n this.icon.set(options.icon ?? MessageBoxIcon.None);\n this.buttons.set(this.resolveButtons(options.buttons ?? MessageBoxButtons.OK));\n this.dontAskAgain.set(daa);\n // Explicit re-seed: signal `set` dedupes by `===`, so an `effect()` on\n // `dontAskAgain` would not re-fire when a caller passes the SAME options\n // literal twice. Set the checkbox state directly each open.\n this.dontAskAgainChecked.set(daa?.defaultChecked ?? false);\n this.visible.set(true);\n\n return new Promise<DialogResultWithAcknowledgement>((resolve) => {\n this.resolver = resolve;\n });\n }\n\n private resolveButtons(buttons: MessageBoxButtons): MessageBoxButton[] {\n const t = (key: string) => this.i18n.t(key);\n switch (buttons) {\n case MessageBoxButtons.OK:\n return [{ label: t('common.ok'), result: DialogResult.OK, variant: 'primary' }];\n\n case MessageBoxButtons.OKCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.ok'), result: DialogResult.OK, variant: 'primary' },\n ];\n\n case MessageBoxButtons.YesNo:\n return [\n { label: t('common.no'), result: DialogResult.No, variant: 'default' },\n { label: t('common.yes'), result: DialogResult.Yes, variant: 'primary' },\n ];\n\n case MessageBoxButtons.YesNoCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.no'), result: DialogResult.No, variant: 'default' },\n { label: t('common.yes'), result: DialogResult.Yes, variant: 'primary' },\n ];\n\n case MessageBoxButtons.RetryCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.retry'), result: DialogResult.Retry, variant: 'primary' },\n ];\n\n case MessageBoxButtons.AbortRetryIgnore:\n return [\n { label: t('common.abort'), result: DialogResult.Abort, variant: 'danger' },\n { label: t('common.retry'), result: DialogResult.Retry, variant: 'default' },\n { label: t('common.ignore'), result: DialogResult.Ignore, variant: 'default' },\n ];\n }\n }\n}\n","import {\n Component, inject, ChangeDetectionStrategy,\n HostListener, ElementRef, AfterViewInit, computed,\n} from '@angular/core';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport { MessageBoxService, MessageBoxIcon, DialogResult } from './message-box.service';\n\n@Component({\n selector: 'fly-message-box',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: './message-box.component.html',\n styleUrl: './message-box.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageBoxComponent implements AfterViewInit {\n service = inject(MessageBoxService);\n private elRef = inject(ElementRef);\n\n readonly MessageBoxIcon = MessageBoxIcon;\n readonly DialogResult = DialogResult;\n\n /** Mirror of the service's `dontAskAgain` config so the template can read it directly. */\n readonly dontAskAgainConfig = computed(() => this.service.dontAskAgain());\n /**\n * User-driven checkbox state, owned by the service and re-seeded on every\n * `_open()` so reusing a constant options literal cannot leak prior state.\n */\n readonly dontAskAgainChecked = this.service.dontAskAgainChecked;\n /**\n * Concatenated id list for the dialog's `aria-describedby`. Always includes\n * the message; appends the checkbox label id when the checkbox is rendered\n * so screen readers announce the checkbox as part of the description.\n */\n readonly ariaDescribedBy = computed(() =>\n this.dontAskAgainConfig() ? 'mb-message mb-dont-ask' : 'mb-message',\n );\n\n private previouslyFocused: Element | null = null;\n\n ngAfterViewInit(): void {\n // Store focus origin so we can restore it on close\n this.previouslyFocused = document.activeElement;\n this.focusPrimaryButton();\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.service.visible()) {\n this.service.resolve(DialogResult.Cancel, this.dontAskAgainChecked());\n this.restoreFocus();\n }\n }\n\n onBackdropClick(): void {\n this.service.resolve(DialogResult.Cancel, this.dontAskAgainChecked());\n this.restoreFocus();\n }\n\n onButtonClick(result: DialogResult): void {\n this.service.resolve(result, this.dontAskAgainChecked());\n this.restoreFocus();\n }\n\n onDontAskAgainToggle(ev: Event): void {\n const target = ev.target as HTMLInputElement | null;\n this.dontAskAgainChecked.set(!!target?.checked);\n }\n\n iconClass(): string {\n switch (this.service.icon()) {\n case MessageBoxIcon.Information: return 'pi pi-info-circle';\n case MessageBoxIcon.Warning: return 'pi pi-exclamation-triangle';\n case MessageBoxIcon.Error: return 'pi pi-times-circle';\n case MessageBoxIcon.Question: return 'pi pi-question-circle';\n default: return '';\n }\n }\n\n private focusPrimaryButton(): void {\n // Focus the primary (last) button, which is the default action\n const buttons = this.elRef.nativeElement.querySelectorAll('.mb-btn') as NodeListOf<HTMLButtonElement>;\n const last = buttons[buttons.length - 1];\n last?.focus();\n }\n\n private restoreFocus(): void {\n if (this.previouslyFocused instanceof HTMLElement) {\n this.previouslyFocused.focus();\n }\n this.previouslyFocused = null;\n }\n}\n","@if (service.visible()) {\n <div\n class=\"mb-backdrop\"\n (click)=\"onBackdropClick()\"\n role=\"presentation\">\n <div\n class=\"mb-dialog\"\n [class.mb-info]=\"service.icon() === MessageBoxIcon.Information\"\n [class.mb-warning]=\"service.icon() === MessageBoxIcon.Warning\"\n [class.mb-danger]=\"service.icon() === MessageBoxIcon.Error\"\n [class.mb-question]=\"service.icon() === MessageBoxIcon.Question\"\n (click)=\"$event.stopPropagation()\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"mb-title\"\n [attr.aria-describedby]=\"ariaDescribedBy()\">\n\n @if (iconClass()) {\n <div class=\"mb-icon-wrap\">\n <i [class]=\"iconClass() + ' mb-icon'\" aria-hidden=\"true\"></i>\n </div>\n }\n\n <div class=\"mb-title\" id=\"mb-title\">{{ service.title() }}</div>\n <div class=\"mb-message\" id=\"mb-message\">{{ service.message() }}</div>\n\n @if (dontAskAgainConfig(); as daa) {\n <label class=\"mb-dont-ask-again\">\n <input\n type=\"checkbox\"\n [checked]=\"dontAskAgainChecked()\"\n (change)=\"onDontAskAgainToggle($event)\" />\n <span id=\"mb-dont-ask\">{{ daa.labelKey | translate }}</span>\n </label>\n }\n\n <div class=\"mb-actions\">\n @for (btn of service.buttons(); track btn.result) {\n <button\n type=\"button\"\n class=\"vos-btn sm mb-btn\"\n [class.mb-btn--primary]=\"btn.variant === 'primary'\"\n [class.mb-btn--danger]=\"btn.variant === 'danger'\"\n (click)=\"onButtonClick(btn.result)\">\n {{ btn.label }}\n </button>\n }\n </div>\n\n </div>\n </div>\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n signal,\n inject,\n OnInit,\n DestroyRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport { I18nService } from '../../services/i18n.service';\nimport type {\n ShareOrgChartOption,\n ShareOuNode,\n SharePanelLevelOption,\n SharePermissionEntry,\n SharePrincipal,\n ShareUserResult,\n} from '../../models/share-panel.model';\n\n/** Default permission levels (file-style ACL). Hosts can override via `permissionLevels`. */\nexport const SHARE_PANEL_DEFAULT_FILE_LEVELS: SharePanelLevelOption[] = [\n { value: 'View', labelKey: 'files.share.level_view' },\n { value: 'Download', labelKey: 'files.share.level_download' },\n { value: 'Edit', labelKey: 'files.share.level_edit' },\n { value: 'FullControl', labelKey: 'files.share.level_full' },\n];\n\n@Component({\n selector: 'fly-share-panel',\n standalone: true,\n imports: [CommonModule, FormsModule, TranslatePipe],\n templateUrl: './share-panel.component.html',\n styleUrl: './share-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SharePanelComponent implements OnInit {\n /** Resource title shown in the header */\n @Input() targetName = '';\n\n /** i18n key for panel title */\n @Input() titleKey = 'files.share.title';\n\n /** Load current shares / permissions (host resolves display names when possible). */\n @Input({ required: true }) loadPermissions!: () => Observable<SharePermissionEntry[]>;\n\n @Input({ required: true }) searchUsers!: (query: string) => Observable<ShareUserResult[]>;\n\n /**\n * Load OU hierarchy for sharing. `chartId` is null for the default/official tree;\n * non-null for an alternative chart.\n */\n @Input({ required: true })\n loadOuTree!: (chartId: string | null) => Observable<ShareOuNode[]>;\n\n /** Chart selector options; first entry should be the default chart (`id: null`). */\n @Input({ required: true }) loadChartOptions!: () => Observable<ShareOrgChartOption[]>;\n\n /**\n * Initial chart selection. Resolution order:\n * <list type=\"number\">\n * <item>{@link defaultChartId} when explicitly provided (string or null).</item>\n * <item>First option matching {@link defaultChartSystemKey} (e.g. <c>'apps'</c>).</item>\n * <item>Host order — <c>options[0]?.id ?? null</c>.</item>\n * </list>\n */\n @Input() defaultChartSystemKey?: string | null;\n\n /** Hard-coded chart id to pre-select. Takes priority over {@link defaultChartSystemKey}. */\n @Input() defaultChartId?: string | null;\n\n /**\n * Labels from the default (official) OU tree for stable display names on OU grants\n * when the picker shows an alternative chart.\n */\n @Input({ required: true }) loadOuLabelMap!: () => Observable<Record<string, string>>;\n\n @Input({ required: true })\n grantToUser!: (userId: string, level: string, applyToChildren: boolean, isDeny: boolean) => Observable<void>;\n\n @Input({ required: true })\n grantToOu!: (ouId: string, level: string, applyToChildren: boolean, isDeny: boolean) => Observable<void>;\n\n @Input({ required: true }) updatePermission!: (id: string, level: string) => Observable<void>;\n\n @Input({ required: true }) revokePermission!: (id: string) => Observable<void>;\n\n /** When true, show “apply to children” (e.g. folders). */\n @Input() showApplyToChildren = false;\n\n /**\n * When true, surfaces an \"Add as deny\" toggle in the add-permission row and renders\n * existing deny grants with red styling. Hosts whose backend does not support deny\n * grants (legacy callers) leave this false and the panel hides all deny affordances.\n */\n @Input() supportsDeny = false;\n\n /** Override level dropdown options (e.g. notes: View / Edit only). */\n @Input() permissionLevels?: SharePanelLevelOption[];\n\n /** i18n key for wildcard app grant label */\n @Input() everyoneLabelKey = 'files.share.everyone';\n\n /**\n * Optional apps-chart role-OU index for the tenant. When supplied, the panel:\n * <list type=\"bullet\">\n * <item>Renders existing OU grants whose ouId matches a row as <c>RolePrincipal</c>\n * chips (\"FFO in Circles\") instead of opaque OU labels.</item>\n * <item>Surfaces an \"Add role\" picker that translates the picked role to its\n * role-OU UUID and dispatches via {@link grantToOu}. Backend stores it as a\n * plain OU grant; <see cref=\"PermissionResolver\"/> resolves at access time via\n * the user's effective OU set.</item>\n * </list>\n * Hosts that don't have access to the apps-chart (or don't want the role flow) omit\n * this input — OU grants then render as generic OU principals.\n */\n @Input() loadRoleOus?: () => Observable<RoleOuLookupRow[]>;\n\n @Output() close = new EventEmitter<void>();\n\n private destroyRef = inject(DestroyRef);\n private i18n = inject(I18nService);\n\n permissions = signal<SharePermissionEntry[]>([]);\n loading = signal(true);\n searchQuery = '';\n newLevel = '';\n applyToChildren = false;\n\n /** Apps-chart role-OU index, populated lazily when {@link loadRoleOus} is provided. */\n roleOus = signal<RoleOuLookupRow[]>([]);\n /** Map<ouId, role row> — derived from roleOus for O(1) lookup during rendering. */\n private readonly roleOusByOuId = signal<Record<string, RoleOuLookupRow>>({});\n\n /** Two-way bound to the role picker's filter input. */\n roleSearchQuery = '';\n /** True while the role picker section is expanded. */\n showRolePicker = signal(false);\n /**\n * Two-way bound to the \"Add as deny\" toggle. When true, the next user/OU pick is\n * persisted as a deny grant. Reset to false after each successful grant so the next\n * pick defaults back to allow.\n */\n addAsDeny = false;\n searchResults = signal<ShareUserResult[]>([]);\n ouTree = signal<ShareOuNode[]>([]);\n showOuPicker = signal(false);\n chartOptions = signal<ShareOrgChartOption[]>([]);\n selectedOrgChartId = signal<string | null>(null);\n /** Default-tree id → display name for permission rows (OU grants). */\n private readonly ouLabelById = signal<Record<string, string>>({});\n\n private searchTimeout: ReturnType<typeof setTimeout> | null = null;\n /** Emits after chart options load; further emissions on user chart changes (no initial null). */\n private readonly selectedChartId$ = new ReplaySubject<string | null>(1);\n\n ngOnInit(): void {\n const levels = this.levelOptions;\n this.newLevel = levels[0]?.value ?? 'View';\n this.refreshPermissions();\n\n // Load the role-OU lookup table once. Failures degrade gracefully — OU grants then\n // render as generic OU principals (the v1 behaviour) instead of Role chips.\n this.loadRoleOus?.()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (rows) => {\n this.roleOus.set(rows);\n const byId: Record<string, RoleOuLookupRow> = {};\n for (const r of rows) byId[r.ouId] = r;\n this.roleOusByOuId.set(byId);\n },\n error: () => {\n this.roleOus.set([]);\n this.roleOusByOuId.set({});\n },\n });\n\n this.loadOuLabelMap()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (m) => this.ouLabelById.set(m),\n error: () => this.ouLabelById.set({}),\n });\n\n this.selectedChartId$\n .pipe(\n switchMap((id) => this.loadOuTree(id)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe({\n next: (tree) => this.ouTree.set(tree),\n error: () => this.ouTree.set([]),\n });\n\n this.loadChartOptions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (opts) => {\n this.chartOptions.set(opts);\n const initial = this.resolveInitialChartId(opts);\n this.selectedOrgChartId.set(initial);\n this.selectedChartId$.next(initial);\n },\n error: () => {\n this.chartOptions.set([]);\n this.selectedOrgChartId.set(null);\n this.selectedChartId$.next(null);\n },\n });\n }\n\n /**\n * Picks the chart id to seed the OU picker with. Honours explicit\n * {@link defaultChartId} first (null is a valid id), then {@link defaultChartSystemKey},\n * then falls back to host order.\n */\n private resolveInitialChartId(opts: ShareOrgChartOption[]): string | null {\n if (this.defaultChartId !== undefined) {\n const exists = opts.some((o) => o.id === this.defaultChartId);\n return exists ? (this.defaultChartId as string | null) : (opts[0]?.id ?? null);\n }\n const key = this.defaultChartSystemKey;\n if (key) {\n const match = opts.find((o) => o.systemKey === key);\n if (match) return match.id;\n }\n return opts[0]?.id ?? null;\n }\n\n onOrgChartSelectChange(chartId: string | null): void {\n this.selectedOrgChartId.set(chartId);\n this.selectedChartId$.next(chartId);\n }\n\n get levelOptions(): SharePanelLevelOption[] {\n const p = this.permissionLevels;\n return p && p.length > 0 ? p : SHARE_PANEL_DEFAULT_FILE_LEVELS;\n }\n\n refreshPermissions(): void {\n this.loading.set(true);\n this.loadPermissions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (perms) => {\n this.permissions.set(perms);\n this.loading.set(false);\n },\n error: () => {\n this.permissions.set([]);\n this.loading.set(false);\n },\n });\n }\n\n onSearchInput(): void {\n if (this.searchTimeout) clearTimeout(this.searchTimeout);\n const query = this.searchQuery.trim();\n if (query.length < 2) {\n this.searchResults.set([]);\n return;\n }\n\n this.searchTimeout = setTimeout(() => {\n this.searchUsers(query)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (items) => this.searchResults.set(items),\n error: () => this.searchResults.set([]),\n });\n }, 300);\n }\n\n onGrantToUser(user: ShareUserResult): void {\n this.searchResults.set([]);\n this.searchQuery = '';\n const isDeny = this.supportsDeny && this.addAsDeny;\n this.grantToUser(user.id, this.newLevel, this.applyToChildren, isDeny)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n // Reset deny toggle after each successful grant so allow is the default for the\n // next pick. Preserves the level dropdown which is genuinely sticky.\n this.addAsDeny = false;\n this.refreshPermissions();\n },\n });\n }\n\n onGrantToOu(ou: ShareOuNode): void {\n const isDeny = this.supportsDeny && this.addAsDeny;\n this.grantToOu(ou.id, this.newLevel, this.applyToChildren, isDeny)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.addAsDeny = false;\n this.refreshPermissions();\n },\n });\n }\n\n /**\n * Add a role grant. Resolves to the role-OU UUID and dispatches via {@link grantToOu}\n * so the backend stores it as a plain OU grant; PermissionResolver matches it at access\n * time via the user's effective OU set (apps-chart computed-from-role membership).\n */\n onGrantToRole(role: RoleOuLookupRow): void {\n const isDeny = this.supportsDeny && this.addAsDeny;\n this.grantToOu(role.ouId, this.newLevel, this.applyToChildren, isDeny)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.addAsDeny = false;\n this.roleSearchQuery = '';\n this.refreshPermissions();\n },\n });\n }\n\n /** Filtered role list — empty query returns all roles, otherwise case-insensitive substring match. */\n filteredRoles(): RoleOuLookupRow[] {\n const q = this.roleSearchQuery.trim().toLowerCase();\n const all = this.roleOus();\n if (!q) return all;\n return all.filter(\n (r) =>\n r.displayName.toLowerCase().includes(q)\n || r.roleKey.toLowerCase().includes(q)\n || r.appId.toLowerCase().includes(q),\n );\n }\n\n onUpdateLevel(perm: SharePermissionEntry, level: string): void {\n this.updatePermission(perm.id, level)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n onRevokePermission(perm: SharePermissionEntry): void {\n this.revokePermission(perm.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n getPermIcon(perm: SharePermissionEntry): string {\n // Deny rows take a distinct icon regardless of principal kind so the operator can\n // scan a long permission list and immediately spot revocations.\n if (perm.isDeny) return 'pi pi-ban';\n // Reverse-translate: an OuPrincipal whose ouId matches a known role-OU should render\n // as a role chip, even though the host stored it as an OU grant.\n if (perm.principal.kind === 'ou' && this.roleOusByOuId()[perm.principal.ouId]) {\n return 'pi pi-id-card';\n }\n return SharePanelComponent.principalIcon(perm.principal);\n }\n\n /** Maps a principal kind to its display icon. Static so hosts can reuse for menus. */\n static principalIcon(principal: SharePrincipal): string {\n switch (principal.kind) {\n case 'user': return 'pi pi-user';\n case 'role': return 'pi pi-id-card';\n case 'ou': return 'pi pi-sitemap';\n case 'app-everyone': return 'pi pi-globe';\n }\n }\n\n /** Logical start padding for OU hierarchy (roots align with section padding). */\n ouIndentStartPx(ou: ShareOuNode): number {\n const d = ou.depth ?? 0;\n return 12 + d * 18;\n }\n\n getPermLabel(perm: SharePermissionEntry): string {\n const p = perm.principal;\n if (p.displayName?.trim()) return p.displayName.trim();\n switch (p.kind) {\n case 'user':\n return `${p.userId.substring(0, 8)}…`;\n case 'role':\n // Hosts SHOULD pre-resolve role display names — this branch is the\n // worst-case fallback for an unresolved key.\n return `${p.appId}:${p.roleKey}`;\n case 'ou': {\n // Reverse-translate: if this OU id matches a known apps-chart role-OU, render\n // as the semantic role label instead of the opaque OU name.\n const role = this.roleOusByOuId()[p.ouId];\n if (role) return role.displayName;\n\n const fromDefault = this.ouLabelById()[p.ouId];\n if (fromDefault) return fromDefault;\n const ou = this.ouTree().find((o) => o.id === p.ouId);\n if (ou) return ou.displayName;\n return `${p.ouId.substring(0, 8)}…`;\n }\n case 'app-everyone':\n return p.appId === '*' ? this.i18n.t(this.everyoneLabelKey) : p.appId;\n }\n }\n}\n\n/**\n * One row in the role-OU lookup table the share panel uses to render OU grants as Role\n * chips and to drive the \"Add role\" picker. Hosts source this from\n * <c>OrgStructureApiService.listRoleOus()</c> in the desktop shell.\n */\nexport interface RoleOuLookupRow {\n /** Apps-chart role-OU UUID — what backend stores in `grantedToOuId` / `sharedWithOuId`. */\n ouId: string;\n appId: string;\n roleKey: string;\n /** Display name resolved by the host (e.g. \"FFO\" or \"Future Foresight Officer\"). */\n displayName: string;\n}\n","<div class=\"fac-overlay\" (click)=\"close.emit()\">\n <div class=\"fac-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"fac-header\">\n <h3>{{ titleKey | translate }}</h3>\n <span class=\"fac-target-name\">{{ targetName }}</span>\n <button\n type=\"button\"\n class=\"fac-close\"\n (click)=\"close.emit()\"\n [attr.aria-label]=\"'files.share.close' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <div class=\"fac-add-section\">\n <div class=\"fac-search-row\">\n <input\n type=\"text\"\n class=\"fac-input\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n [placeholder]=\"'files.share.search_placeholder' | translate\"\n [attr.aria-label]=\"'files.share.search_users' | translate\"\n />\n <select class=\"fac-select\" [(ngModel)]=\"newLevel\">\n @for (opt of levelOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.labelKey | translate }}</option>\n }\n </select>\n </div>\n\n @if (searchResults().length > 0) {\n <div class=\"fac-search-results\">\n @for (result of searchResults(); track result.id) {\n <div class=\"fac-search-item\" (click)=\"onGrantToUser(result)\">\n <i class=\"pi pi-user\" aria-hidden=\"true\"></i>\n <span>{{ result.firstName }} {{ result.lastName }}</span>\n <span class=\"fac-email\">{{ result.email }}</span>\n </div>\n }\n </div>\n }\n\n @if (chartOptions().length > 0) {\n <div class=\"fac-chart-row\">\n <label for=\"fac-org-chart-select\" class=\"fac-section-label\">{{\n 'files.share.org_chart' | translate\n }}</label>\n <select\n id=\"fac-org-chart-select\"\n class=\"fac-select\"\n [ngModel]=\"selectedOrgChartId()\"\n (ngModelChange)=\"onOrgChartSelectChange($event)\">\n @for (opt of chartOptions(); track $index) {\n <option [ngValue]=\"opt.id\">{{ opt.name }}</option>\n }\n </select>\n </div>\n }\n\n @if (showOuPicker()) {\n <div class=\"fac-ou-section\">\n <div class=\"fac-section-label\">{{ 'files.share.share_with_ou' | translate }}</div>\n @for (ou of ouTree(); track ou.id) {\n <button\n type=\"button\"\n class=\"fac-ou-item\"\n [style.padding-inline-start.px]=\"ouIndentStartPx(ou)\"\n (click)=\"onGrantToOu(ou)\"\n [attr.aria-label]=\"('files.share.share_with_ou_named' | translate) + ' ' + ou.displayName\"\n >\n <i class=\"pi pi-sitemap\" aria-hidden=\"true\"></i>\n <span dir=\"auto\">{{ ou.displayName }}</span>\n </button>\n }\n </div>\n }\n\n @if (loadRoleOus && roleOus().length > 0) {\n <div class=\"fac-role-section\">\n <div class=\"fac-section-label\">{{ 'files.share.share_with_role' | translate }}</div>\n <input\n type=\"text\"\n class=\"fac-input\"\n [(ngModel)]=\"roleSearchQuery\"\n [placeholder]=\"'files.share.role_search_placeholder' | translate\"\n [attr.aria-label]=\"'files.share.search_roles' | translate\"\n [hidden]=\"!showRolePicker()\" />\n @if (showRolePicker()) {\n <div class=\"fac-role-list\">\n @for (role of filteredRoles(); track role.ouId) {\n <button\n type=\"button\"\n class=\"fac-role-item\"\n (click)=\"onGrantToRole(role)\"\n [attr.aria-label]=\"('files.share.share_with_role_named' | translate) + ' ' + role.displayName\">\n <i class=\"pi pi-id-card\" aria-hidden=\"true\"></i>\n <span dir=\"auto\">{{ role.displayName }}</span>\n <span class=\"fac-role-app\">{{ role.appId }}</span>\n </button>\n }\n @if (filteredRoles().length === 0) {\n <div class=\"fac-empty\">{{ 'files.share.no_roles_match' | translate }}</div>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"fac-toggle-row\">\n <button type=\"button\" class=\"fac-link\" (click)=\"showOuPicker.set(!showOuPicker())\">\n {{ showOuPicker() ? ('files.share.hide_ous' | translate) : ('files.share.show_ous' | translate) }}\n </button>\n @if (loadRoleOus && roleOus().length > 0) {\n <button type=\"button\" class=\"fac-link\" (click)=\"showRolePicker.set(!showRolePicker())\">\n {{ showRolePicker() ? ('files.share.hide_roles' | translate) : ('files.share.show_roles' | translate) }}\n </button>\n }\n @if (showApplyToChildren) {\n <label class=\"fac-checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"applyToChildren\" />\n {{ 'files.share.apply_children' | translate }}\n </label>\n }\n @if (supportsDeny) {\n <label class=\"fac-checkbox-label fac-deny-toggle\"\n [title]=\"'files.share.deny_help' | translate\">\n <input type=\"checkbox\" [(ngModel)]=\"addAsDeny\" />\n <i class=\"pi pi-ban\" aria-hidden=\"true\"></i>\n {{ 'files.share.add_as_deny' | translate }}\n </label>\n }\n </div>\n </div>\n\n <div class=\"fac-perms-section\">\n <div class=\"fac-section-label\">{{ 'files.share.current_permissions' | translate }}</div>\n @if (loading()) {\n <div class=\"fac-loading\"><i class=\"pi pi-spin pi-spinner\" aria-hidden=\"true\"></i></div>\n } @else if (permissions().length === 0) {\n <div class=\"fac-empty\">{{ 'files.share.no_permissions' | translate }}</div>\n } @else {\n @for (perm of permissions(); track perm.id) {\n <div class=\"fac-perm-row\" [class.fac-perm-row-deny]=\"perm.isDeny\">\n <div class=\"fac-perm-info\">\n <i [class]=\"getPermIcon(perm)\" aria-hidden=\"true\"></i>\n <span class=\"fac-perm-name\" dir=\"auto\">{{ getPermLabel(perm) }}</span>\n @if (perm.isDeny) {\n <span class=\"fac-badge deny\">{{ 'files.share.denied' | translate }}</span>\n }\n @if (perm.isInherited) {\n <span class=\"fac-badge inherited\">{{ 'files.share.inherited' | translate }}</span>\n }\n </div>\n <div class=\"fac-perm-actions\">\n @if (!perm.isDeny) {\n <select\n class=\"fac-select sm\"\n [ngModel]=\"perm.level\"\n (ngModelChange)=\"onUpdateLevel(perm, $event)\"\n [disabled]=\"perm.isInherited === true\"\n >\n @for (opt of levelOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.labelKey | translate }}</option>\n }\n </select>\n }\n <button\n type=\"button\"\n class=\"fac-icon-btn danger\"\n (click)=\"onRevokePermission(perm)\"\n [disabled]=\"perm.isInherited === true\"\n [title]=\"'files.share.revoke' | translate\"\n >\n <i class=\"pi pi-trash\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n EventEmitter,\n forwardRef,\n inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n signal,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n ControlValueAccessor,\n FormsModule,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n Validator,\n ValidatorFn,\n AbstractControl,\n ValidationErrors,\n} from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Observable, ReplaySubject, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, filter, switchMap } from 'rxjs/operators';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport { I18nService } from '../../services/i18n.service';\nimport {\n AppEveryoneTerm,\n AudienceFilter,\n AudienceTerm,\n AudienceTermKind,\n AUDIENCE_LIMITS,\n AUDIENCE_PRESETS,\n AudiencePresetKind,\n ChartTerm,\n OuTerm,\n PresetTerm,\n RolesTerm,\n UsersTerm,\n} from '../../models/audience.model';\nimport type {\n ShareOrgChartOption,\n ShareOuNode,\n ShareUserResult,\n} from '../../models/share-panel.model';\nimport type { RoleOuLookupRow } from '../share-panel/share-panel.component';\n\n/** Bucket the picker is currently editing. Exported so hosts can drive `editTarget` if needed. */\nexport type AudienceEditTarget = 'includes' | 'excludes';\n\n/**\n * Strongly-typed context for the term-card `<ng-template>`. Without an explicit interface\n * the template's `let-term` falls back to `any`, defeating the discriminated-union narrowing\n * inside `@switch (term.kind)`. The `track` expression on the parent `@for` reads\n * `target` and `index` through this same context shape.\n */\ninterface TermCardContext {\n $implicit: AudienceTerm;\n target: AudienceEditTarget;\n index: number;\n}\n\n/**\n * Generic builder for {@link AudienceFilter}. Accepts an initial value, emits both the\n * full filter and a validity flag on every change. Reuses the same callback shapes as\n * {@link SharePanelComponent} so a host already wiring the share panel can drop this in\n * with no extra plumbing.\n *\n * Compaction policy: when the operator picks the same kind multiple times, the component\n * merges into a single term where it's safe to do so:\n * <list type=\"bullet\">\n * <item><b>users</b>: dedupes user ids into one {@link UsersTerm}.</item>\n * <item><b>roles</b>: per `appId`, dedupes role keys into one {@link RolesTerm}.</item>\n * <item><b>ou</b>: per `(chartId, includeDescendants)`, dedupes OU ids into one {@link OuTerm}.</item>\n * <item><b>app-everyone / chart / preset</b>: idempotent per kind+key.</item>\n * </list>\n * This keeps the term count well below {@link AUDIENCE_LIMITS.maxTermsPerFilter} for typical\n * use, and matches how the backend resolver would have unioned them anyway.\n */\n@Component({\n selector: 'fly-audience-builder',\n standalone: true,\n imports: [CommonModule, FormsModule, TranslatePipe],\n templateUrl: './audience-builder.component.html',\n styleUrl: './audience-builder.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AudienceBuilderComponent),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => AudienceBuilderComponent),\n multi: true,\n },\n ],\n})\nexport class AudienceBuilderComponent\n implements OnInit, OnChanges, OnDestroy, ControlValueAccessor, Validator {\n /** Initial audience filter. Two-way: changes emit via {@link audienceChange}. */\n @Input() value: AudienceFilter | null | undefined = { includes: [] };\n\n /** Hide the Excludes section entirely (e.g. for simple \"send to\" pickers). */\n @Input() showExcludes = true;\n\n /**\n * Which term kinds are selectable. Defaults to all six. Hosts that don't have a\n * concept of `chart` or `preset` should narrow this down to keep the UI focused.\n */\n @Input() supportedKinds: readonly AudienceTermKind[] = [\n 'users',\n 'roles',\n 'ou',\n 'app-everyone',\n 'chart',\n 'preset',\n ];\n\n /**\n * Anchor user id used when adding a `preset` term. Typically `auth.currentUser().id`.\n * If null and the operator picks a preset, the term is rejected with an inline error.\n */\n @Input() selfUserId: string | null = null;\n\n /** App ids the host wants to expose as `app-everyone` options. */\n @Input() appEveryoneOptions: { appId: string; displayName: string }[] = [];\n\n // ── Picker callbacks (same shapes as SharePanelComponent) ────────────────────\n\n @Input({ required: true }) searchUsers!: (query: string) => Observable<ShareUserResult[]>;\n\n @Input({ required: true })\n loadOuTree!: (chartId: string | null) => Observable<ShareOuNode[]>;\n\n @Input({ required: true }) loadChartOptions!: () => Observable<ShareOrgChartOption[]>;\n\n /**\n * Initial chart selection for the OU picker. Resolution order:\n * <list type=\"number\">\n * <item>If <see cref=\"defaultChartId\"/> is explicitly provided (string or null), use it.</item>\n * <item>Else if <see cref=\"defaultChartSystemKey\"/> is set, pick the first option whose\n * <c>systemKey</c> matches (e.g. <c>'apps'</c> → the platform Apps chart).</item>\n * <item>Else fall back to <c>options[0]?.id ?? null</c> (host-defined default order).</item>\n * </list>\n * Hosts that already know the tenant-scoped chart Guid use {@link defaultChartId};\n * hosts that only know the semantic kind (typically <c>'apps'</c>) use\n * {@link defaultChartSystemKey}.\n */\n @Input() defaultChartSystemKey?: string | null;\n\n /**\n * Hard-coded chart id to pre-select. Takes priority over {@link defaultChartSystemKey}.\n * Use <c>null</c> to force the default/official chart (id null) even when other charts\n * are listed first.\n */\n @Input() defaultChartId?: string | null;\n\n /**\n * Optional apps-chart role-OU index. When supplied, the picker exposes a \"Roles\" tab\n * surfacing role chips; without it, that tab is hidden even if `'roles'` is in\n * {@link supportedKinds}.\n */\n @Input() loadRoleOus?: () => Observable<RoleOuLookupRow[]>;\n\n // ── Outputs ──────────────────────────────────────────────────────────────────\n\n /** Fires on every successful add/remove with the current filter. */\n @Output() audienceChange = new EventEmitter<AudienceFilter>();\n\n /**\n * True when {@link AudienceFilter.includes} is non-empty and the term count is within\n * {@link AUDIENCE_LIMITS.maxTermsPerFilter}. Hosts should disable submit when false.\n */\n @Output() validityChange = new EventEmitter<boolean>();\n\n // ── Internal state (signals; computed where derived) ─────────────────────────\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly i18n = inject(I18nService);\n\n readonly includes = signal<AudienceTerm[]>([]);\n readonly excludes = signal<AudienceTerm[]>([]);\n\n readonly editTarget = signal<AudienceEditTarget>('includes');\n readonly pickerOpen = signal(false);\n readonly activeKind = signal<AudienceTermKind>('users');\n\n // User picker — signal-backed so OnPush + computed re-evaluates correctly. Keystrokes go\n // through a debounced Subject + switchMap so a slow \"fo\" result can never overwrite a\n // fresh \"foobar\" result (the previous setTimeout-based path had this race).\n readonly userSearchQuery = signal('');\n readonly userSearchResults = signal<ShareUserResult[]>([]);\n private readonly userSearch$ = new Subject<string>();\n\n // Role picker.\n readonly roleOus = signal<RoleOuLookupRow[]>([]);\n readonly roleSearchQuery = signal('');\n /**\n * Filtered role list as a `computed` so the template doesn't re-call a method on every\n * change-detection cycle.\n */\n readonly filteredRoles = computed<RoleOuLookupRow[]>(() => {\n const q = this.roleSearchQuery().trim().toLowerCase();\n const all = this.roleOus();\n if (!q) return all;\n return all.filter(\n (r) =>\n r.displayName.toLowerCase().includes(q)\n || r.roleKey.toLowerCase().includes(q)\n || r.appId.toLowerCase().includes(q),\n );\n });\n\n // OU picker.\n readonly ouTree = signal<ShareOuNode[]>([]);\n readonly chartOptions = signal<ShareOrgChartOption[]>([]);\n readonly selectedChartId = signal<string | null>(null);\n readonly ouIncludeDescendants = signal(false);\n /**\n * Chart-term picker entries — filters out the null-id default chart since `ChartTerm`\n * requires a real Guid. Avoids the UX trap where clicking \"Default Company\" surfaces\n * an inline error.\n */\n readonly chartTermOptions = computed<ShareOrgChartOption[]>(() =>\n this.chartOptions().filter((c) => c.id !== null),\n );\n private readonly selectedChartId$ = new ReplaySubject<string | null>(1);\n\n // Preset options exposed from the model so the template stays in sync with new presets.\n readonly presetOptions = AUDIENCE_PRESETS;\n\n // Validation surface (inline errors).\n readonly errorKey = signal<string | null>(null);\n\n /** True when the host disabled this control (template-driven `[disabled]` or reactive). */\n readonly disabled = signal(false);\n\n // ── ControlValueAccessor + Validator wiring ──────────────────────────────────\n // These let hosts bind the component via `formControl` / `formControlName` /\n // `[(ngModel)]` instead of plumbing `[value]` + `(audienceChange)` manually. The\n // (audienceChange) / (validityChange) outputs still fire — Angular forms infrastructure\n // is purely additive and template-driven hosts continue to work unchanged.\n private onChange: (value: AudienceFilter) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n private onValidatorChange: () => void = () => undefined;\n\n // ── Lifecycle ────────────────────────────────────────────────────────────────\n\n ngOnInit(): void {\n // applyValue() seeds includes/excludes — defer the initial emit so we don't trigger\n // ExpressionChangedAfterItHasBeenChecked when a parent template binding observes\n // (audienceChange) / (validityChange) in the same change-detection cycle.\n this.applyValue(this.value, /* emitImmediate */ false);\n queueMicrotask(() => this.emitState());\n\n if (this.loadRoleOus) {\n this.loadRoleOus()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (rows) => this.roleOus.set(rows),\n error: () => this.roleOus.set([]),\n });\n }\n\n this.selectedChartId$\n .pipe(\n switchMap((id) => this.loadOuTree(id)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe({\n next: (tree) => this.ouTree.set(tree),\n error: () => this.ouTree.set([]),\n });\n\n // Debounced user search: 300ms idle → switchMap cancels any in-flight request when a\n // newer query arrives, killing the \"stale result overwrites fresh result\" race the old\n // setTimeout path had. `filter(q.length >= 2)` preserves the same UX gate.\n this.userSearch$\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n filter((q) => q.length >= 2),\n switchMap((q) => this.searchUsers(q)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe({\n next: (items) => this.userSearchResults.set(items),\n error: () => this.userSearchResults.set([]),\n });\n\n this.loadChartOptions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (opts) => {\n this.chartOptions.set(opts);\n const initial = this.resolveInitialChartId(opts);\n this.selectedChartId.set(initial);\n this.selectedChartId$.next(initial);\n },\n error: () => {\n this.chartOptions.set([]);\n this.selectedChartId.set(null);\n this.selectedChartId$.next(null);\n },\n });\n\n if (this.supportedKinds.length > 0 && !this.supportedKinds.includes(this.activeKind())) {\n this.activeKind.set(this.supportedKinds[0]);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Re-hydrate when the host swaps the filter wholesale (e.g. editing a different rule).\n // First-mount initialisation is handled by ngOnInit so we skip the initial assignment\n // here. Picker UI state is also reset so a stale search query / open picker from the\n // previous draft doesn't bleed into the new one.\n //\n // We do NOT emit (audienceChange) / onChange — the host already KNOWS the value it\n // pushed. Echoing back via the change callback can create a feedback loop with two-way\n // bindings and reactive forms. Validity, however, may genuinely change with the new\n // value — emit that signal explicitly via the form-validator hook + (validityChange).\n if (changes['value'] && !changes['value'].firstChange) {\n this.applyValue(this.value, /* emitImmediate */ false);\n this.closePicker();\n this.errorKey.set(null);\n this.emitValidityOnly();\n }\n }\n\n ngOnDestroy(): void {\n this.userSearch$.complete();\n }\n\n /**\n * Replaces the in-component state from an external value. Null-safe — if the host\n * passes <c>null</c> or <c>undefined</c> (e.g. while a parent signal is loading),\n * we treat it as an empty filter rather than crashing.\n */\n private applyValue(v: AudienceFilter | null | undefined, emitImmediate: boolean): void {\n this.includes.set([...(v?.includes ?? [])]);\n this.excludes.set([...(v?.excludes ?? [])]);\n if (emitImmediate) this.emitState();\n }\n\n // ── Picker open/close + tabs ─────────────────────────────────────────────────\n\n openPicker(target: AudienceEditTarget): void {\n if (this.disabled()) return;\n this.editTarget.set(target);\n this.pickerOpen.set(true);\n this.errorKey.set(null);\n }\n\n closePicker(): void {\n this.pickerOpen.set(false);\n this.userSearchQuery.set('');\n this.userSearchResults.set([]);\n this.roleSearchQuery.set('');\n }\n\n selectKind(kind: AudienceTermKind): void {\n this.activeKind.set(kind);\n this.errorKey.set(null);\n }\n\n // ── User picker ──────────────────────────────────────────────────────────────\n\n onUserSearchInput(): void {\n const q = this.userSearchQuery().trim();\n if (q.length < 2) {\n this.userSearchResults.set([]);\n // Push the short query into the stream so distinctUntilChanged resets when the user\n // shortens and re-lengthens the query (otherwise \"foo\" → \"f\" → \"foo\" is a no-op).\n this.userSearch$.next(q);\n return;\n }\n this.userSearch$.next(q);\n }\n\n pickUser(user: ShareUserResult): void {\n this.addToActiveBucket((existing) => this.upsertUsersTerm(existing, user.id));\n this.userSearchQuery.set('');\n this.userSearchResults.set([]);\n }\n\n // ── Role picker ──────────────────────────────────────────────────────────────\n\n pickRole(role: RoleOuLookupRow): void {\n this.addToActiveBucket((existing) => this.upsertRolesTerm(existing, role.appId, role.roleKey));\n this.roleSearchQuery.set('');\n }\n\n // ── OU picker ────────────────────────────────────────────────────────────────\n\n onChartChange(chartId: string | null): void {\n this.selectedChartId.set(chartId);\n this.selectedChartId$.next(chartId);\n }\n\n pickOu(ou: ShareOuNode): void {\n const chartId = this.selectedChartId();\n const includeDescendants = this.ouIncludeDescendants();\n this.addToActiveBucket((existing) =>\n this.upsertOuTerm(existing, ou.id, chartId, includeDescendants),\n );\n }\n\n ouIndentStartPx(ou: ShareOuNode): number {\n const d = ou.depth ?? 0;\n return 12 + d * 18;\n }\n\n /**\n * Picks the chart id to seed the OU picker with. Honours explicit {@link defaultChartId}\n * first (even when null, since null is a valid id meaning \"default chart\"), then\n * {@link defaultChartSystemKey}, then falls back to host order. Lookup uses\n * <see cref=\"hasOwnProperty\"/> on the input keys to distinguish \"host did not set this\n * input\" from \"host set it to null\" — Angular reflects an unset input as <c>undefined</c>.\n */\n private resolveInitialChartId(opts: ShareOrgChartOption[]): string | null {\n if (this.defaultChartId !== undefined) {\n const exists = opts.some((o) => o.id === this.defaultChartId);\n return exists ? (this.defaultChartId as string | null) : (opts[0]?.id ?? null);\n }\n const key = this.defaultChartSystemKey;\n if (key) {\n const match = opts.find((o) => o.systemKey === key);\n if (match) return match.id;\n }\n return opts[0]?.id ?? null;\n }\n\n // ── App-everyone picker ──────────────────────────────────────────────────────\n\n pickAppEveryone(appId: string): void {\n this.addToActiveBucket((existing) => this.upsertAppEveryoneTerm(existing, appId));\n }\n\n // ── Chart picker ─────────────────────────────────────────────────────────────\n\n pickChart(chartId: string | null): void {\n if (!chartId) {\n this.errorKey.set('audience.error.chart_id_required');\n return;\n }\n this.addToActiveBucket((existing) => this.upsertChartTerm(existing, chartId));\n }\n\n // ── Preset picker ────────────────────────────────────────────────────────────\n\n pickPreset(preset: AudiencePresetKind): void {\n if (!this.selfUserId) {\n this.errorKey.set('audience.error.self_user_required');\n return;\n }\n const anchor = this.selfUserId;\n this.addToActiveBucket((existing) => this.upsertPresetTerm(existing, preset, anchor));\n }\n\n // ── Term removal ─────────────────────────────────────────────────────────────\n\n removeTerm(target: AudienceEditTarget, index: number): void {\n if (this.disabled()) return;\n const list = target === 'includes' ? this.includes() : this.excludes();\n const next = list.filter((_, i) => i !== index);\n if (target === 'includes') this.includes.set(next);\n else this.excludes.set(next);\n this.emitState();\n }\n\n removeUserId(target: AudienceEditTarget, termIndex: number, userId: string): void {\n this.editTermAt(target, termIndex, (term) => {\n if (term.kind !== 'users') return term;\n const next = term.userIds.filter((id) => id !== userId);\n return next.length === 0 ? null : { ...term, userIds: next };\n });\n }\n\n removeRoleKey(target: AudienceEditTarget, termIndex: number, roleKey: string): void {\n this.editTermAt(target, termIndex, (term) => {\n if (term.kind !== 'roles') return term;\n const next = term.roleKeys.filter((k) => k !== roleKey);\n return next.length === 0 ? null : { ...term, roleKeys: next };\n });\n }\n\n removeOuId(target: AudienceEditTarget, termIndex: number, ouId: string): void {\n this.editTermAt(target, termIndex, (term) => {\n if (term.kind !== 'ou') return term;\n const next = term.ouIds.filter((id) => id !== ouId);\n return next.length === 0 ? null : { ...term, ouIds: next };\n });\n }\n\n // ── Public read API ──────────────────────────────────────────────────────────\n\n /** Returns the current filter snapshot — useful for hosts that want to peek without subscribing. */\n snapshot(): AudienceFilter {\n return this.buildFilter();\n }\n\n // ── ControlValueAccessor implementation ──────────────────────────────────────\n\n /**\n * Called by the forms infrastructure to push a new value into the control. Mirrors the\n * `[value]` setter path — re-uses `applyValue` so template-driven and reactive callers\n * converge on the same hydration code.\n */\n writeValue(value: AudienceFilter | null | undefined): void {\n this.applyValue(value, /* emitImmediate */ false);\n }\n\n registerOnChange(fn: (value: AudienceFilter) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n if (isDisabled) this.closePicker();\n }\n\n // ── Validator implementation ─────────────────────────────────────────────────\n\n /**\n * Aligns Angular's reactive-forms validity with the component's own `validityChange`\n * output. Returns `audienceRequired` when includes is empty (the canonical \"zero\n * recipients\" guard) and `audienceTooManyTerms` when over the per-filter cap.\n * <br>\n * The output-event path (<see cref=\"emitState\"/>) reuses this method so there is ONE\n * definition of \"valid\" — the classic \"two almost-identical validators drifted\" bug\n * cannot recur here.\n */\n validate(_: AbstractControl): ValidationErrors | null {\n return this.validateFilter(this.buildFilter());\n }\n\n private validateFilter(candidate: AudienceFilter): ValidationErrors | null {\n if (candidate.includes.length === 0) return { audienceRequired: true };\n const total = candidate.includes.length + (candidate.excludes?.length ?? 0);\n if (total > AUDIENCE_LIMITS.maxTermsPerFilter) {\n return { audienceTooManyTerms: { actual: total, max: AUDIENCE_LIMITS.maxTermsPerFilter } };\n }\n return null;\n }\n\n registerOnValidatorChange(fn: () => void): void {\n this.onValidatorChange = fn;\n }\n\n // ── Term display helpers ─────────────────────────────────────────────────────\n\n ouLabel(ouId: string): string {\n const match = this.ouTree().find((o) => o.id === ouId);\n return match?.displayName ?? `${ouId.substring(0, 8)}…`;\n }\n\n roleLabel(appId: string, roleKey: string): string {\n const match = this.roleOus().find((r) => r.appId === appId && r.roleKey === roleKey);\n return match?.displayName ?? `${appId}:${roleKey}`;\n }\n\n appLabel(appId: string): string {\n if (appId === '*') return this.i18n.t('audience.app_everyone_wildcard');\n const match = this.appEveryoneOptions.find((a) => a.appId === appId);\n return match?.displayName ?? appId;\n }\n\n chartLabel(chartId: string): string {\n const match = this.chartOptions().find((c) => c.id === chartId);\n return match?.name ?? `${chartId.substring(0, 8)}…`;\n }\n\n /**\n * Locale key for a term kind. Replaces hyphens with underscores so the JSON file uses\n * one consistent naming convention (`audience.kind_app_everyone`, not the hyphen variant).\n */\n kindLocaleKey(kind: AudienceTermKind): string {\n return `audience.kind_${kind.replace(/-/g, '_')}`;\n }\n\n /** Same convention as {@link kindLocaleKey} but for preset names. */\n presetLocaleKey(preset: AudiencePresetKind): string {\n return `audience.preset_${preset.replace(/-/g, '_')}`;\n }\n\n /** Picon icon CSS class for a term kind tab — kept here so the template stays declarative. */\n kindIconClass(kind: AudienceTermKind): string {\n switch (kind) {\n case 'users': return 'pi pi-user';\n case 'roles': return 'pi pi-id-card';\n case 'ou': return 'pi pi-sitemap';\n case 'app-everyone': return 'pi pi-globe';\n case 'chart': return 'pi pi-share-alt';\n case 'preset': return 'pi pi-star';\n }\n }\n\n // ── Internal helpers — upsert + state emission ───────────────────────────────\n\n private addToActiveBucket(upsert: (existing: AudienceTerm[]) => AudienceTerm[]): void {\n if (this.disabled()) return;\n const target = this.editTarget();\n const current = target === 'includes' ? this.includes() : this.excludes();\n const next = upsert(current);\n if (this.totalTermCount(next, target) > AUDIENCE_LIMITS.maxTermsPerFilter) {\n this.errorKey.set('audience.error.too_many_terms');\n return;\n }\n if (target === 'includes') this.includes.set(next);\n else this.excludes.set(next);\n this.errorKey.set(null);\n this.emitState();\n }\n\n private editTermAt(\n target: AudienceEditTarget,\n index: number,\n fn: (term: AudienceTerm) => AudienceTerm | null,\n ): void {\n if (this.disabled()) return;\n const list = target === 'includes' ? this.includes() : this.excludes();\n const term = list[index];\n if (!term) return;\n const replaced = fn(term);\n const next = replaced === null\n ? list.filter((_, i) => i !== index)\n : list.map((t, i) => (i === index ? replaced : t));\n if (target === 'includes') this.includes.set(next);\n else this.excludes.set(next);\n this.emitState();\n }\n\n private totalTermCount(replacement: AudienceTerm[], target: AudienceEditTarget): number {\n const inc = target === 'includes' ? replacement : this.includes();\n const exc = target === 'excludes' ? replacement : this.excludes();\n return inc.length + exc.length;\n }\n\n private upsertUsersTerm(existing: AudienceTerm[], userId: string): AudienceTerm[] {\n const idx = existing.findIndex((t) => t.kind === 'users');\n if (idx < 0) {\n const term: UsersTerm = { kind: 'users', userIds: [userId] };\n return [...existing, term];\n }\n const term = existing[idx] as UsersTerm;\n if (term.userIds.includes(userId)) return existing; // idempotent\n if (term.userIds.length >= AUDIENCE_LIMITS.maxUserIdsPerTerm) {\n this.errorKey.set('audience.error.too_many_users_per_term');\n return existing;\n }\n return existing.map((t, i) =>\n i === idx ? { ...term, userIds: [...term.userIds, userId] } : t,\n );\n }\n\n private upsertRolesTerm(\n existing: AudienceTerm[],\n appId: string,\n roleKey: string,\n ): AudienceTerm[] {\n const idx = existing.findIndex((t) => t.kind === 'roles' && t.appId === appId);\n if (idx < 0) {\n const term: RolesTerm = { kind: 'roles', appId, roleKeys: [roleKey] };\n return [...existing, term];\n }\n const term = existing[idx] as RolesTerm;\n if (term.roleKeys.includes(roleKey)) return existing;\n if (term.roleKeys.length >= AUDIENCE_LIMITS.maxRoleKeysPerTerm) {\n this.errorKey.set('audience.error.too_many_roles_per_term');\n return existing;\n }\n return existing.map((t, i) =>\n i === idx ? { ...term, roleKeys: [...term.roleKeys, roleKey] } : t,\n );\n }\n\n private upsertOuTerm(\n existing: AudienceTerm[],\n ouId: string,\n chartId: string | null,\n includeDescendants: boolean,\n ): AudienceTerm[] {\n const idx = existing.findIndex(\n (t) =>\n t.kind === 'ou'\n && t.chartId === chartId\n && t.includeDescendants === includeDescendants,\n );\n if (idx < 0) {\n const term: OuTerm = {\n kind: 'ou',\n ouIds: [ouId],\n chartId,\n includeDescendants,\n };\n return [...existing, term];\n }\n const term = existing[idx] as OuTerm;\n if (term.ouIds.includes(ouId)) return existing;\n if (term.ouIds.length >= AUDIENCE_LIMITS.maxOuIdsPerTerm) {\n this.errorKey.set('audience.error.too_many_ous_per_term');\n return existing;\n }\n return existing.map((t, i) =>\n i === idx ? { ...term, ouIds: [...term.ouIds, ouId] } : t,\n );\n }\n\n private upsertAppEveryoneTerm(existing: AudienceTerm[], appId: string): AudienceTerm[] {\n const exists = existing.some((t) => t.kind === 'app-everyone' && t.appId === appId);\n if (exists) return existing;\n const term: AppEveryoneTerm = { kind: 'app-everyone', appId };\n return [...existing, term];\n }\n\n private upsertChartTerm(existing: AudienceTerm[], chartId: string): AudienceTerm[] {\n const exists = existing.some((t) => t.kind === 'chart' && t.chartId === chartId);\n if (exists) return existing;\n const term: ChartTerm = { kind: 'chart', chartId };\n return [...existing, term];\n }\n\n private upsertPresetTerm(\n existing: AudienceTerm[],\n preset: AudiencePresetKind,\n anchorUserId: string,\n ): AudienceTerm[] {\n const exists = existing.some(\n (t) => t.kind === 'preset' && t.preset === preset && t.anchorUserId === anchorUserId,\n );\n if (exists) return existing;\n const term: PresetTerm = { kind: 'preset', preset, anchorUserId };\n return [...existing, term];\n }\n\n private buildFilter(): AudienceFilter {\n const inc = this.includes();\n const exc = this.excludes();\n return {\n includes: inc,\n ...(exc.length > 0 ? { excludes: exc } : {}),\n ...(this.value?.options ? { options: this.value.options } : {}),\n };\n }\n\n private emitState(): void {\n const filter = this.buildFilter();\n this.audienceChange.emit(filter);\n this.validityChange.emit(this.computeValidity(filter));\n // Forward to the forms infrastructure so reactive forms see the change.\n this.onChange(filter);\n this.onTouched();\n this.onValidatorChange();\n }\n\n /**\n * Emits ONLY the validity signal (component output + forms-validator hook). Used by\n * <see cref=\"ngOnChanges\"/> when the host pushes a new value: the host already knows the\n * value it sent, so re-firing onChange / audienceChange is redundant and risks feedback\n * loops with two-way bindings; but the validity flag may genuinely have flipped and the\n * host needs that to enable / disable submit.\n */\n private emitValidityOnly(): void {\n const filter = this.buildFilter();\n this.validityChange.emit(this.computeValidity(filter));\n this.onValidatorChange();\n }\n\n private computeValidity(candidate: AudienceFilter): boolean {\n // Single-source: delegate to validateFilter so the output flag and the form-validator\n // result agree by construction.\n return this.validateFilter(candidate) === null;\n }\n}\n\n/**\n * Re-export the typed template context so test code (and very advanced hosts that build\n * their own term cards) can refer to it without reaching into the component module.\n */\nexport type AudienceTermCardContext = TermCardContext;\n","<div class=\"fab-root\">\n\n <!-- Includes section -->\n <div class=\"fab-bucket\">\n <div class=\"fab-bucket-header\">\n <div class=\"fab-section-label\" id=\"fab-includes-label\">{{ 'audience.includes' | translate }}</div>\n <button\n type=\"button\"\n class=\"fab-add-btn\"\n (click)=\"openPicker('includes')\"\n [attr.aria-expanded]=\"pickerOpen() && editTarget() === 'includes'\"\n [attr.aria-controls]=\"pickerOpen() && editTarget() === 'includes' ? 'fab-picker-region' : null\"\n >\n <i class=\"pi pi-plus\" aria-hidden=\"true\"></i>\n {{ 'audience.add_term' | translate }}\n </button>\n </div>\n\n @if (includes().length === 0) {\n <div class=\"fab-empty\">{{ 'audience.includes_empty' | translate }}</div>\n } @else {\n <ul class=\"fab-term-list\" aria-labelledby=\"fab-includes-label\">\n @for (term of includes(); track term) {\n <li class=\"fab-term\">\n <ng-container\n *ngTemplateOutlet=\"termCard; context: { $implicit: term, target: 'includes', index: $index }\">\n </ng-container>\n </li>\n }\n </ul>\n }\n </div>\n\n <!-- Excludes section -->\n @if (showExcludes) {\n <div class=\"fab-bucket fab-bucket-exclude\">\n <div class=\"fab-bucket-header\">\n <div class=\"fab-section-label\" id=\"fab-excludes-label\">{{ 'audience.excludes' | translate }}</div>\n <button\n type=\"button\"\n class=\"fab-add-btn\"\n (click)=\"openPicker('excludes')\"\n [attr.aria-expanded]=\"pickerOpen() && editTarget() === 'excludes'\"\n [attr.aria-controls]=\"pickerOpen() && editTarget() === 'excludes' ? 'fab-picker-region' : null\"\n >\n <i class=\"pi pi-plus\" aria-hidden=\"true\"></i>\n {{ 'audience.add_term' | translate }}\n </button>\n </div>\n\n @if (excludes().length === 0) {\n <div class=\"fab-empty\">{{ 'audience.excludes_empty' | translate }}</div>\n } @else {\n <ul class=\"fab-term-list\" aria-labelledby=\"fab-excludes-label\">\n @for (term of excludes(); track term) {\n <li class=\"fab-term\">\n <ng-container\n *ngTemplateOutlet=\"termCard; context: { $implicit: term, target: 'excludes', index: $index }\">\n </ng-container>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n <!-- Inline picker (shared across includes/excludes; gated by pickerOpen) -->\n @if (pickerOpen()) {\n <div\n id=\"fab-picker-region\"\n class=\"fab-picker\"\n role=\"region\"\n [attr.aria-label]=\"(editTarget() === 'includes'\n ? ('audience.adding_to_includes' | translate)\n : ('audience.adding_to_excludes' | translate))\"\n >\n <div class=\"fab-picker-header\">\n <span class=\"fab-picker-target\">\n {{\n editTarget() === 'includes'\n ? ('audience.adding_to_includes' | translate)\n : ('audience.adding_to_excludes' | translate)\n }}\n </span>\n <button type=\"button\" class=\"fab-close\" (click)=\"closePicker()\" [attr.aria-label]=\"'audience.close' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Kind tabs -->\n <div class=\"fab-kind-tabs\" role=\"tablist\">\n @for (kind of supportedKinds; track kind) {\n <button\n type=\"button\"\n role=\"tab\"\n class=\"fab-kind-tab\"\n [id]=\"'fab-tab-' + kind\"\n [class.active]=\"activeKind() === kind\"\n [attr.aria-selected]=\"activeKind() === kind\"\n [attr.aria-controls]=\"'fab-tabpanel-' + kind\"\n (click)=\"selectKind(kind)\"\n >\n <i [class]=\"kindIconClass(kind)\" aria-hidden=\"true\"></i>\n <span>{{ kindLocaleKey(kind) | translate }}</span>\n </button>\n }\n </div>\n\n @if (errorKey()) {\n <div class=\"fab-inline-error\" role=\"alert\">\n <i class=\"pi pi-exclamation-triangle\" aria-hidden=\"true\"></i>\n {{ errorKey()! | translate }}\n </div>\n }\n\n <!-- Per-kind picker bodies -->\n <div\n class=\"fab-picker-body\"\n role=\"tabpanel\"\n [id]=\"'fab-tabpanel-' + activeKind()\"\n [attr.aria-labelledby]=\"'fab-tab-' + activeKind()\"\n >\n @switch (activeKind()) {\n\n @case ('users') {\n <input\n type=\"text\"\n class=\"fab-input\"\n [ngModel]=\"userSearchQuery()\"\n (ngModelChange)=\"userSearchQuery.set($event); onUserSearchInput()\"\n [placeholder]=\"'audience.search_users_placeholder' | translate\"\n [attr.aria-label]=\"'audience.search_users_placeholder' | translate\"\n />\n @if (userSearchResults().length > 0) {\n <div class=\"fab-result-list\" role=\"list\">\n @for (u of userSearchResults(); track u.id) {\n <button type=\"button\" role=\"listitem\" class=\"fab-result-item\" (click)=\"pickUser(u)\">\n <i class=\"pi pi-user\" aria-hidden=\"true\"></i>\n <span>{{ u.firstName }} {{ u.lastName }}</span>\n <span class=\"fab-result-secondary\">{{ u.email }}</span>\n </button>\n }\n </div>\n } @else if (userSearchQuery().length >= 2) {\n <div class=\"fab-empty\">{{ 'audience.no_users_match' | translate }}</div>\n }\n }\n\n @case ('roles') {\n @if (loadRoleOus && roleOus().length > 0) {\n <input\n type=\"text\"\n class=\"fab-input\"\n [ngModel]=\"roleSearchQuery()\"\n (ngModelChange)=\"roleSearchQuery.set($event)\"\n [placeholder]=\"'audience.search_roles_placeholder' | translate\"\n [attr.aria-label]=\"'audience.search_roles_placeholder' | translate\"\n />\n <div class=\"fab-result-list\" role=\"list\">\n @for (role of filteredRoles(); track role.ouId) {\n <button type=\"button\" role=\"listitem\" class=\"fab-result-item\" (click)=\"pickRole(role)\">\n <i class=\"pi pi-id-card\" aria-hidden=\"true\"></i>\n <span>{{ role.displayName }}</span>\n <span class=\"fab-result-secondary\">{{ role.appId }}</span>\n </button>\n }\n @if (filteredRoles().length === 0) {\n <div class=\"fab-empty\">{{ 'audience.no_roles_match' | translate }}</div>\n }\n </div>\n } @else {\n <div class=\"fab-empty\">{{ 'audience.roles_unavailable' | translate }}</div>\n }\n }\n\n @case ('ou') {\n @if (chartOptions().length > 0) {\n <label for=\"fab-chart-select\" class=\"fab-mini-label\">\n {{ 'audience.org_chart' | translate }}\n </label>\n <select\n id=\"fab-chart-select\"\n class=\"fab-select\"\n [ngModel]=\"selectedChartId()\"\n (ngModelChange)=\"onChartChange($event)\"\n >\n @for (opt of chartOptions(); track $index) {\n <option [ngValue]=\"opt.id\">{{ opt.name }}</option>\n }\n </select>\n }\n <label class=\"fab-checkbox-label\">\n <input\n type=\"checkbox\"\n [ngModel]=\"ouIncludeDescendants()\"\n (ngModelChange)=\"ouIncludeDescendants.set($event)\"\n />\n {{ 'audience.include_descendants' | translate }}\n </label>\n @if (ouTree().length === 0) {\n <div class=\"fab-empty\">{{ 'audience.ou_tree_empty' | translate }}</div>\n } @else {\n <div class=\"fab-result-list fab-ou-tree\" role=\"list\">\n @for (ou of ouTree(); track ou.id) {\n <button\n type=\"button\"\n role=\"listitem\"\n class=\"fab-result-item\"\n [style.padding-inline-start.px]=\"ouIndentStartPx(ou)\"\n (click)=\"pickOu(ou)\"\n >\n <i class=\"pi pi-sitemap\" aria-hidden=\"true\"></i>\n <span>{{ ou.displayName }}</span>\n </button>\n }\n </div>\n }\n }\n\n @case ('app-everyone') {\n @if (appEveryoneOptions.length === 0) {\n <div class=\"fab-empty\">{{ 'audience.app_everyone_empty' | translate }}</div>\n } @else {\n <div class=\"fab-result-list\" role=\"list\">\n @for (app of appEveryoneOptions; track app.appId) {\n <button type=\"button\" role=\"listitem\" class=\"fab-result-item\" (click)=\"pickAppEveryone(app.appId)\">\n <i class=\"pi pi-globe\" aria-hidden=\"true\"></i>\n <span>{{ app.displayName }}</span>\n <span class=\"fab-result-secondary\">{{ app.appId }}</span>\n </button>\n }\n </div>\n }\n }\n\n @case ('chart') {\n @if (chartTermOptions().length === 0) {\n <div class=\"fab-empty\">{{ 'audience.chart_options_empty' | translate }}</div>\n } @else {\n <div class=\"fab-result-list\" role=\"list\">\n @for (opt of chartTermOptions(); track opt.id) {\n <button type=\"button\" role=\"listitem\" class=\"fab-result-item\" (click)=\"pickChart(opt.id)\">\n <i class=\"pi pi-share-alt\" aria-hidden=\"true\"></i>\n <span>{{ opt.name }}</span>\n </button>\n }\n </div>\n }\n }\n\n @case ('preset') {\n <div class=\"fab-result-list\" role=\"list\">\n @for (p of presetOptions; track p) {\n <button type=\"button\" role=\"listitem\" class=\"fab-result-item\" (click)=\"pickPreset(p)\">\n <i class=\"pi pi-star\" aria-hidden=\"true\"></i>\n <span>{{ presetLocaleKey(p) | translate }}</span>\n </button>\n }\n </div>\n }\n }\n </div>\n </div>\n }\n\n</div>\n\n<!-- Reusable term card template, parameterised by target bucket + index for removal callbacks -->\n<ng-template #termCard let-term let-target=\"target\" let-index=\"index\">\n <div class=\"fab-term-card\" [class.fab-term-exclude]=\"target === 'excludes'\">\n\n @switch (term.kind) {\n @case ('users') {\n <div class=\"fab-term-head\">\n <i class=\"pi pi-user\" aria-hidden=\"true\"></i>\n <span class=\"fab-term-title\">\n {{ 'audience.term_users' | translate: { count: term.userIds.length } }}\n </span>\n <button type=\"button\" class=\"fab-icon-btn danger\" (click)=\"removeTerm(target, index)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"fab-term-chips\">\n @for (id of term.userIds; track id) {\n <span class=\"fab-chip\">\n <i class=\"pi pi-user\" aria-hidden=\"true\"></i>\n <span>{{ id.substring(0, 8) }}…</span>\n <button type=\"button\" class=\"fab-chip-x\" (click)=\"removeUserId(target, index, id)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </span>\n }\n </div>\n }\n\n @case ('roles') {\n <div class=\"fab-term-head\">\n <i class=\"pi pi-id-card\" aria-hidden=\"true\"></i>\n <span class=\"fab-term-title\">\n {{ 'audience.term_roles' | translate: { app: appLabel(term.appId), count: term.roleKeys.length } }}\n </span>\n <button type=\"button\" class=\"fab-icon-btn danger\" (click)=\"removeTerm(target, index)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"fab-term-chips\">\n @for (k of term.roleKeys; track k) {\n <span class=\"fab-chip\">\n <i class=\"pi pi-id-card\" aria-hidden=\"true\"></i>\n <span>{{ roleLabel(term.appId, k) }}</span>\n <button type=\"button\" class=\"fab-chip-x\" (click)=\"removeRoleKey(target, index, k)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </span>\n }\n </div>\n }\n\n @case ('ou') {\n <div class=\"fab-term-head\">\n <i class=\"pi pi-sitemap\" aria-hidden=\"true\"></i>\n <span class=\"fab-term-title\">\n {{ 'audience.term_ous' | translate: { count: term.ouIds.length } }}\n @if (term.includeDescendants) {\n <span class=\"fab-badge\">{{ 'audience.descendants_badge' | translate }}</span>\n }\n </span>\n <button type=\"button\" class=\"fab-icon-btn danger\" (click)=\"removeTerm(target, index)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"fab-term-chips\">\n @for (id of term.ouIds; track id) {\n <span class=\"fab-chip\">\n <i class=\"pi pi-sitemap\" aria-hidden=\"true\"></i>\n <span>{{ ouLabel(id) }}</span>\n <button type=\"button\" class=\"fab-chip-x\" (click)=\"removeOuId(target, index, id)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </span>\n }\n </div>\n }\n\n @case ('app-everyone') {\n <div class=\"fab-term-head\">\n <i class=\"pi pi-globe\" aria-hidden=\"true\"></i>\n <span class=\"fab-term-title\">\n {{ 'audience.term_app_everyone' | translate: { app: appLabel(term.appId) } }}\n </span>\n <button type=\"button\" class=\"fab-icon-btn danger\" (click)=\"removeTerm(target, index)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n @case ('chart') {\n <div class=\"fab-term-head\">\n <i class=\"pi pi-share-alt\" aria-hidden=\"true\"></i>\n <span class=\"fab-term-title\">\n {{ 'audience.term_chart' | translate: { chart: chartLabel(term.chartId) } }}\n </span>\n <button type=\"button\" class=\"fab-icon-btn danger\" (click)=\"removeTerm(target, index)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n @case ('preset') {\n <div class=\"fab-term-head\">\n <i class=\"pi pi-star\" aria-hidden=\"true\"></i>\n <span class=\"fab-term-title\">\n {{ presetLocaleKey(term.preset) | translate }}\n </span>\n <button type=\"button\" class=\"fab-icon-btn danger\" (click)=\"removeTerm(target, index)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n }\n </div>\n</ng-template>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\n\n/** Full-bleed loading overlay for window content (shell) or embedded hosts. */\n@Component({\n selector: 'fly-block-ui',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: './block-ui.component.html',\n styleUrl: './block-ui.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FlyBlockUiComponent {\n /** When false, the overlay is not rendered (host may use @if instead). */\n active = input.required<boolean>();\n\n /** i18n key for status text; empty uses `common.loading`. */\n messageKey = input('');\n\n readonly resolvedMessageKey = computed(() => {\n const k = this.messageKey()?.trim();\n return k && k.length > 0 ? k : 'common.loading';\n });\n}\n","@if (active()) {\n <div\n class=\"fly-block-ui\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n [attr.aria-label]=\"resolvedMessageKey() | translate\">\n <div class=\"fly-block-ui__card\">\n <i class=\"pi pi-spin pi-spinner fly-block-ui__spinner\" aria-hidden=\"true\"></i>\n <span class=\"fly-block-ui__text\">{{ resolvedMessageKey() | translate }}</span>\n </div>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport type { FlyFileInfo } from '../../models/file.model';\nimport Cropper from 'cropperjs';\n\n/**\n * Image upload component with built-in cropperjs cropping modal.\n *\n * Usage:\n * ```html\n * <fly-image-upload\n * [aspectRatio]=\"16/9\"\n * [currentImageId]=\"trend.coverImageId\"\n * sourceApp=\"circles\"\n * sourceEntityType=\"trend\"\n * (uploaded)=\"onImageUploaded($event)\"\n * (removed)=\"onImageRemoved()\"\n * />\n * ```\n */\n@Component({\n selector: 'fly-image-upload',\n standalone: true,\n imports: [TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"fly-image-upload\">\n @if (previewUrl()) {\n <div class=\"fly-image-upload__preview\">\n <img [src]=\"previewUrl()\" alt=\"\" class=\"fly-image-upload__img\" />\n <div class=\"fly-image-upload__overlay\">\n <button type=\"button\" class=\"fly-image-upload__action-btn\" (click)=\"triggerFileInput()\" [title]=\"'files.imageUpload.change' | translate\">\n <span class=\"pi pi-pencil\" aria-hidden=\"true\"></span>\n </button>\n <button type=\"button\" class=\"fly-image-upload__action-btn fly-image-upload__action-btn--danger\" (click)=\"removeImage()\" [title]=\"'files.imageUpload.remove' | translate\">\n <span class=\"pi pi-trash\" aria-hidden=\"true\"></span>\n </button>\n </div>\n </div>\n } @else {\n <button type=\"button\" class=\"fly-image-upload__dropzone\" (click)=\"triggerFileInput()\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event)\">\n @if (uploading()) {\n <span class=\"pi pi-spin pi-spinner fly-image-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-image-upload__label\">{{ 'files.imageUpload.uploading' | translate }}</span>\n } @else {\n <span class=\"pi pi-image fly-image-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-image-upload__label\">{{ 'files.imageUpload.placeholder' | translate }}</span>\n <span class=\"fly-image-upload__hint\">{{ sizeHint() }}</span>\n }\n </button>\n }\n\n @if (error()) {\n <div class=\"fly-image-upload__error\">{{ error() }}</div>\n }\n\n <input #fileInput type=\"file\" accept=\"image/*\" class=\"fly-image-upload__hidden\" (change)=\"onFileSelected($event)\" />\n\n @if (showCropper()) {\n <div class=\"fly-image-upload__crop-backdrop\" (click)=\"cancelCrop()\">\n <div class=\"fly-image-upload__crop-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"fly-image-upload__crop-header\">\n <h3>{{ 'files.imageUpload.crop' | translate }}</h3>\n </div>\n <div class=\"fly-image-upload__crop-body\">\n <img #cropImage [src]=\"rawImageUrl()\" alt=\"\" />\n </div>\n <div class=\"fly-image-upload__crop-footer\">\n <button type=\"button\" class=\"vos-btn sm platter\" (click)=\"cancelCrop()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"button\" class=\"vos-btn sm primary\" (click)=\"applyCrop()\">{{ 'files.imageUpload.apply' | translate }}</button>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [\n /* cropperjs v1 styles (MIT — Chen Fengyuan) */\n `.cropper-container{-webkit-touch-callout:none;direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:rgba(51,153,255,.75);overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:\" \";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC\")}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}`,\n `\n .fly-image-upload { display: flex; flex-direction: column; gap: 6px; }\n .fly-image-upload__hidden { display: none; }\n\n .fly-image-upload__dropzone {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 8px; padding: 24px; border: 2px dashed var(--separator-primary, #e5e7eb);\n border-radius: 12px; background: var(--fill-quaternary, #f9fafb); cursor: pointer;\n transition: border-color 0.15s, background 0.15s; min-height: 120px;\n }\n .fly-image-upload__dropzone:hover { border-color: var(--accent-primary, #0071e3); background: var(--fill-tertiary, #f3f4f6); }\n .fly-image-upload__icon { font-size: 28px; color: var(--label-tertiary, #9ca3af); }\n .fly-image-upload__label { font-size: 13px; color: var(--label-secondary, #6b7280); }\n .fly-image-upload__hint { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-image-upload__preview { position: relative; border-radius: 12px; overflow: hidden; }\n .fly-image-upload__img { display: block; width: 100%; max-height: 280px; object-fit: cover; border-radius: 12px; }\n .fly-image-upload__overlay {\n position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;\n gap: 12px; background: rgba(0,0,0,0.35); opacity: 0; transition: opacity 0.15s;\n }\n .fly-image-upload__preview:hover .fly-image-upload__overlay { opacity: 1; }\n .fly-image-upload__action-btn {\n width: 36px; height: 36px; border-radius: 50%; border: none; cursor: pointer;\n display: flex; align-items: center; justify-content: center;\n background: rgba(255,255,255,0.9); color: var(--label-primary, #1f2937); font-size: 14px;\n transition: background 0.15s;\n }\n .fly-image-upload__action-btn:hover { background: #fff; }\n .fly-image-upload__action-btn--danger:hover { background: #fee2e2; color: #dc2626; }\n\n .fly-image-upload__error { font-size: 12px; color: var(--system-red, #ef4444); }\n\n .fly-image-upload__crop-backdrop {\n position: fixed; inset: 0; z-index: 10000; display: flex; align-items: center; justify-content: center;\n background: rgba(0,0,0,0.6); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);\n }\n .fly-image-upload__crop-modal {\n background: var(--bg-primary, #fff); color: var(--label-primary, #1f2937);\n border-radius: 16px; overflow: hidden;\n max-width: 700px; width: 90vw; box-shadow: 0 20px 60px rgba(0,0,0,0.4);\n border: 1px solid var(--separator-primary, rgba(0,0,0,0.1));\n }\n .fly-image-upload__crop-header {\n padding: 16px 20px; border-bottom: 1px solid var(--separator-primary, #e5e7eb);\n background: var(--fill-quaternary, transparent);\n }\n .fly-image-upload__crop-header h3 {\n margin: 0; font-size: 16px; font-weight: 600; color: var(--label-primary, #1f2937);\n }\n .fly-image-upload__crop-body {\n max-height: 60vh; overflow: hidden; background: var(--fill-tertiary, #f3f4f6);\n }\n .fly-image-upload__crop-body img { display: block; max-width: 100%; }\n .fly-image-upload__crop-footer {\n display: flex; justify-content: flex-end; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--separator-primary, #e5e7eb);\n background: var(--fill-quaternary, transparent);\n }\n\n /* Dark theme */\n html.dark-theme .fly-image-upload__crop-modal {\n background: var(--bg-primary, #1c1c1e);\n border: 1px solid var(--separator-primary, rgba(255,255,255,0.1));\n }\n html.dark-theme .fly-image-upload__crop-body { background: var(--fill-tertiary, #2c2c2e); }\n `],\n})\nexport class FlyImageUploadComponent {\n private http = inject(HttpClient);\n private injector = inject(Injector);\n\n // ── Inputs ──\n aspectRatio = input(16 / 9);\n maxSizeBytes = input(5 * 1024 * 1024);\n currentImageId = input<string | null>(null);\n sourceApp = input('unknown');\n sourceEntityType = input<string | null>(null);\n sourceEntityId = input<string | null>(null);\n\n // ── Outputs ──\n uploaded = output<FlyFileInfo>();\n removed = output<void>();\n\n // ── State ──\n uploading = signal(false);\n error = signal<string | null>(null);\n showCropper = signal(false);\n rawImageUrl = signal<string>('');\n localBlob = signal<string | null>(null);\n\n fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n cropImage = viewChild<ElementRef<HTMLImageElement>>('cropImage');\n\n private cropper: Cropper | null = null;\n private selectedFile: File | null = null;\n\n /** Resolved preview URL — uses blob for local uploads, fetches authenticated for existing images */\n previewUrl = signal<string | null>(null);\n\n constructor() {\n // React to currentImageId changes — fetch authenticated blob\n effect((onCleanup) => {\n const local = this.localBlob();\n if (local) { this.previewUrl.set(local); return; }\n\n const id = this.currentImageId();\n if (!id) { this.previewUrl.set(null); return; }\n\n const sub = this.http.get(`/api/files/${id}/download`, { responseType: 'blob' }).subscribe({\n next: (blob) => this.previewUrl.set(URL.createObjectURL(blob)),\n error: () => this.previewUrl.set(null),\n });\n onCleanup(() => sub.unsubscribe());\n });\n }\n\n sizeHint = computed(() => {\n const mb = this.maxSizeBytes() / (1024 * 1024);\n return `Max ${mb}MB`;\n });\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n onDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n }\n\n onDrop(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n const file = e.dataTransfer?.files?.[0];\n if (file) this.processFile(file);\n }\n\n onFileSelected(e: Event): void {\n const input = e.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) this.processFile(file);\n input.value = '';\n }\n\n removeImage(): void {\n this.localBlob.set(null);\n this.previewUrl.set(null);\n this.error.set(null);\n this.removed.emit();\n }\n\n cancelCrop(): void {\n this.showCropper.set(false);\n this.destroyCropper();\n if (this.rawImageUrl()) URL.revokeObjectURL(this.rawImageUrl());\n this.rawImageUrl.set('');\n }\n\n applyCrop(): void {\n if (!this.cropper) return;\n const canvas = this.cropper.getCroppedCanvas({ maxWidth: 1920, maxHeight: 1080 });\n this.showCropper.set(false);\n this.destroyCropper();\n if (this.rawImageUrl()) URL.revokeObjectURL(this.rawImageUrl());\n this.rawImageUrl.set('');\n\n canvas.toBlob((blob) => {\n if (!blob) return;\n const fileName = this.selectedFile?.name ?? 'cropped-image.jpg';\n const file = new File([blob], fileName, { type: blob.type || 'image/jpeg' });\n this.uploadFile(file);\n }, 'image/jpeg', 0.9);\n }\n\n private processFile(file: File): void {\n this.error.set(null);\n\n if (!file.type.startsWith('image/')) {\n this.error.set('Only image files are allowed');\n return;\n }\n if (file.size > this.maxSizeBytes()) {\n const mb = this.maxSizeBytes() / (1024 * 1024);\n this.error.set(`File exceeds ${mb}MB limit`);\n return;\n }\n\n this.selectedFile = file;\n const url = URL.createObjectURL(file);\n this.rawImageUrl.set(url);\n this.showCropper.set(true);\n\n // Init cropperjs after the @if (showCropper()) block has rendered and\n // the #cropImage signal viewQuery is populated. setTimeout(0) used to\n // race here under Native Federation when fewer host CD passes happen\n // before the macrotask fires (cropImage() returned undefined and\n // initCropper bailed). afterNextRender is deterministic.\n afterNextRender(() => this.initCropper(), { injector: this.injector });\n }\n\n private initCropper(): void {\n this.destroyCropper();\n const imgEl = this.cropImage()?.nativeElement;\n if (!imgEl) return;\n this.cropper = new Cropper(imgEl, {\n aspectRatio: this.aspectRatio(),\n viewMode: 1,\n autoCropArea: 0.9,\n responsive: true,\n background: false,\n });\n }\n\n private destroyCropper(): void {\n this.cropper?.destroy();\n this.cropper = null;\n }\n\n private uploadFile(file: File): void {\n this.uploading.set(true);\n this.error.set(null);\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n formData.append('sourceApp', this.sourceApp());\n if (this.sourceEntityType()) formData.append('sourceEntityType', this.sourceEntityType()!);\n if (this.sourceEntityId()) formData.append('sourceEntityId', this.sourceEntityId()!);\n\n this.http.post<{ data: FlyFileInfo }>('/api/files/upload', formData).subscribe({\n next: (res) => {\n this.uploading.set(false);\n const info = res.data ?? (res as any);\n this.localBlob.set(URL.createObjectURL(file));\n this.uploaded.emit(info);\n },\n error: (err) => {\n this.uploading.set(false);\n this.error.set(err?.error?.message ?? 'Upload failed');\n },\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { HttpClient, HttpEventType } from '@angular/common/http';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport type { FlyFileInfo } from '../../models/file.model';\n\ninterface UploadSlot {\n file: File;\n progress: number; // 0–100\n status: 'uploading' | 'done' | 'error';\n info?: FlyFileInfo;\n error?: string;\n}\n\nconst FILE_ICONS: Record<string, string> = {\n 'application/pdf': 'pi-file-pdf',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'pi-file-word',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'pi-file-excel',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pi-file',\n 'image/': 'pi-image',\n 'video/': 'pi-video',\n 'audio/': 'pi-volume-up',\n};\n\nfunction iconForType(contentType: string): string {\n for (const [prefix, icon] of Object.entries(FILE_ICONS)) {\n if (contentType.startsWith(prefix)) return icon;\n }\n return 'pi-file';\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Multi-file upload with drag-drop, progress, and validation.\n *\n * Usage:\n * ```html\n * <fly-file-upload\n * [maxFiles]=\"5\"\n * [maxFileSizeBytes]=\"5242880\"\n * accept=\".pdf,.docx,.xlsx\"\n * [(files)]=\"trend.attachments\"\n * sourceApp=\"circles\"\n * sourceEntityType=\"trend\"\n * (filesChanged)=\"onAttachmentsChanged($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'fly-file-upload',\n standalone: true,\n imports: [TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"fly-file-upload\">\n @if (canAddMore()) {\n <div class=\"fly-file-upload__dropzone\"\n [class.fly-file-upload__dropzone--drag]=\"dragging()\"\n (click)=\"triggerFileInput()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <span class=\"pi pi-cloud-upload fly-file-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-file-upload__label\">{{ 'files.fileUpload.dropOrClick' | translate }}</span>\n <span class=\"fly-file-upload__hint\">{{ limitHint() }}</span>\n </div>\n }\n\n @if (error()) {\n <div class=\"fly-file-upload__error\">{{ error() }}</div>\n }\n\n @if (allSlots().length) {\n <ul class=\"fly-file-upload__list\">\n @for (slot of allSlots(); track slot.file.name + slot.file.size) {\n <li class=\"fly-file-upload__item\">\n <span class=\"pi {{ iconFor(slot) }} fly-file-upload__file-icon\" aria-hidden=\"true\"></span>\n <div class=\"fly-file-upload__file-info\">\n <span class=\"fly-file-upload__file-name\">{{ slot.file.name }}</span>\n <span class=\"fly-file-upload__file-size\">{{ formatFileSize(slot.file.size) }}</span>\n </div>\n @if (slot.status === 'uploading') {\n <div class=\"fly-file-upload__progress-track\">\n <div class=\"fly-file-upload__progress-fill\" [style.width.%]=\"slot.progress\"></div>\n </div>\n }\n @if (slot.status === 'error') {\n <span class=\"fly-file-upload__file-error\" [title]=\"slot.error ?? ''\">\n <span class=\"pi pi-exclamation-triangle\" aria-hidden=\"true\"></span>\n </span>\n }\n @if (slot.status === 'done') {\n <span class=\"pi pi-check-circle fly-file-upload__file-ok\" aria-hidden=\"true\"></span>\n }\n <button type=\"button\" class=\"fly-file-upload__remove-btn\" (click)=\"removeSlot(slot)\" [title]=\"'common.remove' | translate\">\n <span class=\"pi pi-times\" aria-hidden=\"true\"></span>\n </button>\n </li>\n }\n </ul>\n }\n\n @if (existingFiles().length && !allSlots().length) {\n <ul class=\"fly-file-upload__list\">\n @for (f of existingFiles(); track f.id) {\n <li class=\"fly-file-upload__item\">\n <span class=\"pi {{ iconForInfo(f) }} fly-file-upload__file-icon\" aria-hidden=\"true\"></span>\n <div class=\"fly-file-upload__file-info\">\n <span class=\"fly-file-upload__file-name\">{{ f.fileName }}</span>\n <span class=\"fly-file-upload__file-size\">{{ formatFileSize(f.sizeBytes) }}</span>\n </div>\n <span class=\"pi pi-check-circle fly-file-upload__file-ok\" aria-hidden=\"true\"></span>\n <button type=\"button\" class=\"fly-file-upload__remove-btn\" (click)=\"removeExisting(f)\" [title]=\"'common.remove' | translate\">\n <span class=\"pi pi-times\" aria-hidden=\"true\"></span>\n </button>\n </li>\n }\n </ul>\n }\n\n <input #fileInput type=\"file\" [accept]=\"accept()\" multiple class=\"fly-file-upload__hidden\" (change)=\"onFilesSelected($event)\" />\n </div>\n `,\n styles: [`\n .fly-file-upload { display: flex; flex-direction: column; gap: 8px; }\n .fly-file-upload__hidden { display: none; }\n\n .fly-file-upload__dropzone {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 6px; padding: 20px; border: 2px dashed var(--separator-primary, #e5e7eb);\n border-radius: 10px; background: var(--fill-quaternary, #f9fafb); cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n }\n .fly-file-upload__dropzone:hover,\n .fly-file-upload__dropzone--drag { border-color: var(--accent-primary, #0071e3); background: var(--fill-tertiary, #f3f4f6); }\n .fly-file-upload__icon { font-size: 24px; color: var(--label-tertiary, #9ca3af); }\n .fly-file-upload__label { font-size: 13px; color: var(--label-secondary, #6b7280); }\n .fly-file-upload__hint { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-file-upload__error { font-size: 12px; color: var(--system-red, #ef4444); padding: 4px 0; }\n\n .fly-file-upload__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }\n .fly-file-upload__item {\n display: flex; align-items: center; gap: 10px; padding: 8px 12px;\n border: 1px solid var(--separator-primary, #e5e7eb); border-radius: 8px;\n background: var(--fill-quaternary, #f9fafb); font-size: 13px;\n }\n .fly-file-upload__file-icon { font-size: 18px; color: var(--label-tertiary, #9ca3af); flex-shrink: 0; }\n .fly-file-upload__file-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }\n .fly-file-upload__file-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--label-primary, #1f2937); }\n .fly-file-upload__file-size { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-file-upload__progress-track { width: 60px; height: 4px; border-radius: 2px; background: var(--fill-tertiary, #e5e7eb); overflow: hidden; }\n .fly-file-upload__progress-fill { height: 100%; background: var(--accent-primary, #0071e3); border-radius: 2px; transition: width 0.2s; }\n\n .fly-file-upload__file-ok { color: var(--system-green, #22c55e); font-size: 14px; }\n .fly-file-upload__file-error { color: var(--system-red, #ef4444); font-size: 14px; }\n\n .fly-file-upload__remove-btn {\n background: none; border: none; cursor: pointer; color: var(--label-tertiary, #9ca3af);\n width: 24px; height: 24px; display: flex; align-items: center; justify-content: center;\n border-radius: 4px; transition: color 0.15s, background 0.15s; flex-shrink: 0;\n }\n .fly-file-upload__remove-btn:hover { color: var(--system-red, #ef4444); background: var(--fill-tertiary, #f3f4f6); }\n `],\n})\nexport class FlyFileUploadComponent {\n private http = inject(HttpClient);\n\n // ── Inputs ──\n maxFiles = input(5);\n maxFileSizeBytes = input(5 * 1024 * 1024);\n accept = input('');\n sourceApp = input('unknown');\n sourceEntityType = input<string | null>(null);\n sourceEntityId = input<string | null>(null);\n\n /** Optional: provide file IDs to auto-fetch metadata for pre-existing files (edit mode). */\n existingFileIds = input<string[] | null>(null);\n\n /** Two-way model for completed file metadata. */\n files = model<FlyFileInfo[]>([]);\n\n // ── Outputs ──\n filesChanged = output<FlyFileInfo[]>();\n\n // ── State ──\n error = signal<string | null>(null);\n dragging = signal(false);\n slots = signal<UploadSlot[]>([]);\n\n /** Pre-existing files loaded from the entity (before any new uploads this session). */\n existingFiles = signal<FlyFileInfo[]>([]);\n\n fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n constructor() {\n // Auto-fetch metadata for existing file IDs (edit mode)\n effect((onCleanup) => {\n const ids = this.existingFileIds();\n if (!ids?.length) return;\n\n const subs = ids.map(id =>\n this.http.get<{ data: FlyFileInfo }>(`/api/files/${id}`).subscribe({\n next: (res) => {\n const info = res.data ?? (res as any);\n if (info?.id) {\n this.existingFiles.update(list =>\n list.some(f => f.id === info.id) ? list : [...list, info]\n );\n this.files.update(list =>\n list.some(f => f.id === info.id) ? list : [...list, info]\n );\n }\n },\n })\n );\n onCleanup(() => subs.forEach(s => s.unsubscribe()));\n });\n }\n\n allSlots = computed(() => this.slots());\n\n canAddMore = computed(() => {\n const current = this.files().length + this.slots().filter(s => s.status === 'uploading').length;\n return current < this.maxFiles();\n });\n\n limitHint = computed(() => {\n const mb = this.maxFileSizeBytes() / (1024 * 1024);\n return `Max ${this.maxFiles()} files, ${mb}MB each`;\n });\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n onDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.dragging.set(true);\n }\n\n onDragLeave(e: DragEvent): void {\n e.preventDefault();\n this.dragging.set(false);\n }\n\n onDrop(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.dragging.set(false);\n const fileList = e.dataTransfer?.files;\n if (fileList) this.processFiles(Array.from(fileList));\n }\n\n onFilesSelected(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (input.files) this.processFiles(Array.from(input.files));\n input.value = '';\n }\n\n removeSlot(slot: UploadSlot): void {\n this.slots.update(s => s.filter(x => x !== slot));\n if (slot.info) {\n this.files.update(f => f.filter(x => x.id !== slot.info!.id));\n this.filesChanged.emit(this.files());\n }\n }\n\n removeExisting(f: FlyFileInfo): void {\n this.existingFiles.update(list => list.filter(x => x.id !== f.id));\n this.files.update(list => list.filter(x => x.id !== f.id));\n this.filesChanged.emit(this.files());\n }\n\n iconFor(slot: UploadSlot): string { return iconForType(slot.file.type); }\n iconForInfo(f: FlyFileInfo): string { return iconForType(f.contentType); }\n formatFileSize(bytes: number): string { return formatSize(bytes); }\n\n private processFiles(newFiles: File[]): void {\n this.error.set(null);\n const currentCount = this.files().length + this.slots().filter(s => s.status === 'uploading').length;\n const remaining = this.maxFiles() - currentCount;\n\n if (remaining <= 0) {\n this.error.set(`Maximum ${this.maxFiles()} files allowed`);\n return;\n }\n\n const toUpload = newFiles.slice(0, remaining);\n if (newFiles.length > remaining) {\n this.error.set(`Only ${remaining} more file(s) can be added`);\n }\n\n for (const file of toUpload) {\n if (file.size > this.maxFileSizeBytes()) {\n const mb = this.maxFileSizeBytes() / (1024 * 1024);\n this.error.set(`\"${file.name}\" exceeds ${mb}MB limit`);\n continue;\n }\n this.uploadFile(file);\n }\n }\n\n private uploadFile(file: File): void {\n const slot: UploadSlot = { file, progress: 0, status: 'uploading' };\n this.slots.update(s => [...s, slot]);\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n formData.append('sourceApp', this.sourceApp());\n if (this.sourceEntityType()) formData.append('sourceEntityType', this.sourceEntityType()!);\n if (this.sourceEntityId()) formData.append('sourceEntityId', this.sourceEntityId()!);\n\n this.http.post<{ data: FlyFileInfo }>('/api/files/upload', formData, {\n reportProgress: true,\n observe: 'events',\n }).subscribe({\n next: (event) => {\n if (event.type === HttpEventType.UploadProgress && event.total) {\n slot.progress = Math.round((event.loaded / event.total) * 100);\n this.slots.update(s => [...s]); // trigger signal change\n } else if (event.type === HttpEventType.Response) {\n const info = (event.body as any)?.data ?? event.body;\n slot.status = 'done';\n slot.progress = 100;\n slot.info = info;\n this.slots.update(s => [...s]);\n this.files.update(f => [...f, info]);\n this.filesChanged.emit(this.files());\n }\n },\n error: (err) => {\n slot.status = 'error';\n slot.error = err?.error?.message ?? 'Upload failed';\n this.slots.update(s => [...s]);\n },\n });\n }\n}\n","import { Injectable, Signal, computed, signal } from '@angular/core';\nimport type {\n AgentCommandHandle,\n AgentCommandRegistration,\n} from '../../models/agent-input.model';\n\n/**\n * Singleton registry of slash commands offered by the agent input palette.\n *\n * Lives in the DS so it crosses the federation boundary as a single instance via\n * `sharedMappings: ['@mohamedatia/fly-design-system']`. Federated remotes register\n * their commands at boot (and dispose on window close) without forking the shell.\n *\n * Storage is a signal store. `register` is O(1) for the unique-id case and O(n) when\n * replacing an existing id (filter then push). The append-then-replace strategy is\n * deliberate: registrations are rare (each one corresponds to a remote's app-init\n * effect), and the tradeoff buys us a stable id-collision contract — the *latest*\n * registration wins, and the previous handle's `dispose()` becomes a no-op rather\n * than removing the new entry.\n */\n@Injectable({ providedIn: 'root' })\nexport class AgentCommandRegistry {\n private readonly _commands = signal<readonly AgentCommandRegistration[]>([]);\n /** All currently-registered commands, in insertion order. */\n readonly all: Signal<readonly AgentCommandRegistration[]> = this._commands.asReadonly();\n\n /**\n * Returns a signal of commands whose scope is `'global'` OR whose `scope.appId` is in\n * the live app set. The signal recomputes when either the registry or `liveAppIds`\n * changes — pass a `Signal<ReadonlySet<string>>` from the host's app-registry service\n * for reactive filtering.\n */\n visible(liveAppIds: ReadonlySet<string> | Signal<ReadonlySet<string>>): Signal<readonly AgentCommandRegistration[]> {\n const liveSignal = isSignal<ReadonlySet<string>>(liveAppIds) ? liveAppIds : signal(liveAppIds).asReadonly();\n return computed(() => {\n const live = liveSignal();\n return this._commands().filter((cmd) => {\n if (cmd.scope === 'global') return true;\n return live.has(cmd.scope.appId);\n });\n });\n }\n\n /**\n * Register a single command. Returns a handle whose `dispose()` removes the row by\n * id. If the same id is later re-registered, the original handle's `dispose()`\n * becomes a no-op (the newer registration owns the row). Idempotent disposal.\n */\n register(cmd: AgentCommandRegistration): AgentCommandHandle {\n const generation = ++this._generation;\n this._commands.update((rows) => [...rows.filter((r) => r.id !== cmd.id), cmd]);\n this._owners.set(cmd.id, generation);\n return {\n dispose: () => {\n if (this._owners.get(cmd.id) === generation) {\n this._owners.delete(cmd.id);\n this._commands.update((rows) => rows.filter((r) => r.id !== cmd.id));\n }\n },\n };\n }\n\n /**\n * Bulk register. Rolls back on duplicate id within the input batch (throws before any\n * row lands). Cross-batch duplicates against existing rows follow the standard\n * \"latest wins\" rule and do NOT trigger rollback.\n *\n * Returns a handle whose `dispose()` tears down every row registered by this call.\n */\n registerAll(cmds: readonly AgentCommandRegistration[]): AgentCommandHandle {\n const seen = new Set<string>();\n for (const c of cmds) {\n if (seen.has(c.id)) {\n throw new Error(`AgentCommandRegistry.registerAll: duplicate id \"${c.id}\" in batch`);\n }\n seen.add(c.id);\n }\n const handles = cmds.map((c) => this.register(c));\n let disposed = false;\n return {\n dispose: () => {\n if (disposed) return;\n disposed = true;\n for (const h of handles) h.dispose();\n },\n };\n }\n\n /** Tear down by id. Idempotent. */\n unregister(id: string): void {\n if (this._owners.delete(id)) {\n this._commands.update((rows) => rows.filter((r) => r.id !== id));\n }\n }\n\n /** Monotonic counter; identifies which registration call currently owns each id. */\n private _generation = 0;\n /** id → generation. Used so a stale handle's `dispose()` is a no-op after replacement. */\n private readonly _owners = new Map<string, number>();\n}\n\n/** `isSignal` shim — narrows to either `Signal<T>` or a plain value. */\nfunction isSignal<T>(v: T | Signal<T>): v is Signal<T> {\n return typeof v === 'function';\n}\n","import { Injectable, Signal, Type, signal, type WritableSignal } from '@angular/core';\nimport type {\n AgentChipHostInputs,\n AgentCommandHandle,\n AgentDraggableItem,\n AgentDropRendererRegistration,\n} from '../../models/agent-input.model';\n\n/**\n * Singleton registry of chip-renderer components and keyboard-alternative draggable\n * items, keyed by `kind` and `appId`.\n *\n * Like {@link AgentCommandRegistry}, this lives in the DS so it crosses the federation\n * boundary as a single instance. Hosts (the shell `<fly-agent-input>`) lookup\n * renderers; remotes register them.\n *\n * Renderer lookup is `O(n)` over the registered list — the registry is small (one or\n * two entries per app) and lookups happen on drop, not per frame.\n *\n * Draggable storage is per-`appId` writable signal cached in a Map, so each `appId`\n * gets a stable {@link Signal} reference across reads (callers can `===`-compare).\n */\n@Injectable({ providedIn: 'root' })\nexport class AgentDropRegistry {\n private readonly _renderers = signal<readonly AgentDropRendererRegistration[]>([]);\n /** Per-appId writable store for draggables. Read-only mirror returned to callers. */\n private readonly _draggablesByApp = new Map<string, WritableSignal<readonly AgentDraggableItem[]>>();\n\n /**\n * Look up the chip-renderer component class for a `kind`. The newest registration for\n * a given `kind` wins, regardless of `appId` — we scan the list in reverse so a later\n * `register` call shadows an earlier one for the same `kind`.\n *\n * Returns `null` when no renderer is registered; the host falls back to a generic\n * `plainTextFallback` chip.\n */\n rendererFor(kind: string): Type<AgentChipHostInputs> | null {\n const list = this._renderers();\n for (let i = list.length - 1; i >= 0; i--) {\n if (list[i].kind === kind) return list[i].component as Type<AgentChipHostInputs>;\n }\n return null;\n }\n\n /**\n * Register a renderer for a `(kind, appId)` pair. Re-registering the same pair\n * replaces the prior entry; the disposal handle for the prior registration becomes\n * a no-op.\n *\n * Returns a {@link AgentCommandHandle} (re-used to keep the disposable shape uniform\n * across registries) whose `dispose()` removes this exact registration.\n */\n register<T = unknown>(reg: AgentDropRendererRegistration<T>): AgentCommandHandle {\n const generation = ++this._generation;\n const key = compositeKey(reg.kind, reg.appId);\n this._renderers.update((rows) => [\n ...rows.filter((r) => compositeKey(r.kind, r.appId) !== key),\n reg as AgentDropRendererRegistration,\n ]);\n this._owners.set(key, generation);\n return {\n dispose: () => {\n if (this._owners.get(key) === generation) {\n this._owners.delete(key);\n this._renderers.update((rows) => rows.filter((r) => compositeKey(r.kind, r.appId) !== key));\n }\n },\n };\n }\n\n /**\n * Apps publish their live \"draggable from focused window\" set so the keyboard\n * \"Attach from app…\" menu can offer them. Hosts call this each time the user-visible\n * draggable list changes; passing an empty array clears the entry for this `appId`.\n */\n publishDraggables(appId: string, items: readonly AgentDraggableItem[]): void {\n if (items.length === 0) {\n const existing = this._draggablesByApp.get(appId);\n if (existing) existing.set([]);\n return;\n }\n this.bucketFor(appId).set(items);\n }\n\n /**\n * Reactive read of the draggable set published for `appId`. Empty when none. The\n * returned signal is stable across calls (cached by `appId`), so consumers can use\n * it as a stable input to `computed()`.\n */\n draggablesFor(appId: string): Signal<readonly AgentDraggableItem[]> {\n return this.bucketFor(appId).asReadonly();\n }\n\n /** Lazy-init the per-appId writable bucket. Returns the writable handle for internal use. */\n private bucketFor(appId: string): WritableSignal<readonly AgentDraggableItem[]> {\n let bucket = this._draggablesByApp.get(appId);\n if (!bucket) {\n bucket = signal<readonly AgentDraggableItem[]>([]);\n this._draggablesByApp.set(appId, bucket);\n }\n return bucket;\n }\n\n private _generation = 0;\n private readonly _owners = new Map<string, number>();\n}\n\nfunction compositeKey(kind: string, appId: string): string {\n return `${kind}::${appId}`;\n}\n","import type { Type } from '@angular/core';\n\n/**\n * Agent input contracts.\n *\n * These types define the wire and DI surface for the new `<fly-agent-input>` orchestrator\n * (Phase 2+). Phase 1 ships only the contracts: payload envelope, command/drop registry\n * shapes, and chip-host inputs. The concrete components consume them later.\n *\n * Design rules:\n * - All fields are `readonly` — the registries store these in signal stores and we never\n * want a host mutating after registration. Hosts construct fresh objects to update.\n * - The discriminated kinds (`scope`, `mode`, `kind`) carry the entire variance — no\n * boolean flags. New variants extend the union without breaking existing consumers.\n * - The `Type<AgentChipHostInputs<T>>` shape is intentional: chip components declare\n * `payload`, `mode`, optional `onRemove` as Angular `input()` signals; the registry\n * wires them via `NgComponentOutlet` inputs in the consumer. The component reference\n * itself never leaks across the federation boundary by value — only by class identity.\n */\n\n/** Frozen MIME used by `flyAgentDraggable` and the drop-zone reader. Never change without a DS major. */\nexport const AGENT_DRAG_MIME = 'application/x-fly-agent-payload+json' as const;\n\n/** Frozen payload envelope version. Bump only with a published DS major. */\nexport const AGENT_PAYLOAD_VERSION = 1 as const;\n\n// ─── Commands ───────────────────────────────────────────────────────────────\n\n/**\n * Where a command surfaces. `'global'` = always offered. `{ appId }` = offered only when\n * the host's live `liveAppIds` set (passed to {@link AgentCommandRegistry.visible}) contains\n * that id. This lets a remote register its slash command at boot but only have it appear\n * in the palette while at least one of the remote's windows is open.\n */\nexport type AgentCommandScope = 'global' | { readonly appId: string };\n\n/**\n * A slash command offered by the agent input palette. Commands are deliberately shallow\n * descriptors — the host (shell) decides what happens on Send. The descriptor's role is\n * to make the palette row renderable (icon, label, kbd hint, app badge) and matchable\n * (id, aliases, drop-kind suggestions) without coupling DS to any business logic.\n */\nexport interface AgentCommand {\n /** Stable id, kebab-case. Becomes the slash text after `/`, e.g. `/analyze-trend`. */\n readonly id: string;\n /** i18n key for the visible label, e.g. `agent.command.analyze_trend.label`. */\n readonly labelKey: string;\n /** i18n key for an optional sublabel / description shown beneath the label. */\n readonly descriptionKey?: string;\n /** PrimeIcons class, e.g. `pi-chart-line`. */\n readonly icon?: string;\n /** App badge label key — appears as a small tag, e.g. `agent.command.app_badge.circles`. */\n readonly appBadgeKey?: string;\n /** Optional kbd hint i18n key. */\n readonly kbdHintKey?: string;\n /** When the command is keyword-matched against drop payload kinds, list those kinds here. */\n readonly suggestForDropKinds?: readonly string[];\n /** Extra match terms beyond id + label, used by the fuzzy filter. */\n readonly aliases?: readonly string[];\n /** When `'send'`, the command is inserted as a bound prefix and executed on Send. */\n readonly executeOn: 'send';\n /** Optional client-side gate. Return false to hide the command in this scope. */\n readonly isVisible?: () => boolean;\n}\n\n/** What hosts pass to {@link AgentCommandRegistry.register}. Adds the scope to {@link AgentCommand}. */\nexport interface AgentCommandRegistration extends AgentCommand {\n readonly scope: AgentCommandScope;\n}\n\n/** Disposable handle returned by {@link AgentCommandRegistry.register}. Idempotent `dispose()`. */\nexport interface AgentCommandHandle {\n dispose(): void;\n}\n\n// ─── Drag payloads ──────────────────────────────────────────────────────────\n\n/**\n * The wire envelope written to a `DataTransfer` by `flyAgentDraggable`. Renderers narrow\n * on `kind`; mismatches fall back to `plainTextFallback`.\n */\nexport interface AgentDragPayload<T = unknown> {\n /** Domain-stable kind, e.g. `circles.trend`. */\n readonly kind: string;\n /** Originating appId. Must match an entry in the host's app registry. */\n readonly appId: string;\n /** Frozen format version. Mismatch -> renderer falls back to text. */\n readonly version: typeof AGENT_PAYLOAD_VERSION;\n /** Domain object. Renderers narrow on `kind`. */\n readonly payload: T;\n /** Plain-text fallback written to the dataTransfer alongside the typed MIME. */\n readonly plainTextFallback: string;\n /** Optional command ids to highlight when this payload is dropped. */\n readonly suggestedCommandIds?: readonly string[];\n}\n\n/**\n * Where a chip is being rendered. `inline` = inside the input chip tray (removable);\n * `message` = embedded in a sent message bubble (not removable).\n */\nexport type AgentDropChipMode = 'inline' | 'message';\n\n/**\n * Public input shape for chip-renderer components. Components declare matching\n * `input()` signals; the registry wires them via `NgComponentOutlet`.\n */\nexport interface AgentChipHostInputs<T = unknown> {\n payload: AgentDragPayload<T>;\n mode: AgentDropChipMode;\n /** Called when the user clicks the chip's remove control (only in inline mode). */\n onRemove?: () => void;\n}\n\n/**\n * Keyboard-alternative draggable item. Hosts publish these via\n * {@link AgentDropRegistry.publishDraggables} so the \"Attach from app…\" menu can offer\n * them when pointer drag isn't available.\n */\nexport interface AgentDraggableItem<T = unknown> {\n /** Stable id within its app. Used as a list key in the kbd menu. */\n readonly id: string;\n readonly labelKey: string;\n readonly icon?: string;\n /** Builds the payload the moment the user picks the item. */\n build(): AgentDragPayload<T>;\n}\n\n/** Registry input shape for binding a chip-renderer component to a kind+appId pair. */\nexport interface AgentDropRendererRegistration<T = unknown> {\n readonly kind: string;\n readonly appId: string;\n readonly component: Type<AgentChipHostInputs<T>>;\n}\n\n// ─── Payload guards ─────────────────────────────────────────────────────────\n\n/**\n * Caps applied by {@link validateAgentPayload} / {@link trimAgentPayload}. The defaults\n * trade off \"fits comfortably in a single MQ frame\" against \"covers a richly-populated\n * trend or note card\". Hosts may pass a partial override.\n */\nexport interface AgentPayloadLimits {\n /** Cap on the JSON.stringify(envelope) byte length. Default 32 KB. */\n readonly maxJsonBytes: number;\n /** Cap on the plainTextFallback byte length. Default 8 KB. */\n readonly maxPlainTextFallbackBytes: number;\n /** Cap on any single string field inside payload (recursive). Default 4 KB. */\n readonly maxStringFieldBytes: number;\n}\n\nexport const DEFAULT_AGENT_PAYLOAD_LIMITS: AgentPayloadLimits = Object.freeze({\n maxJsonBytes: 32 * 1024,\n maxPlainTextFallbackBytes: 8 * 1024,\n maxStringFieldBytes: 4 * 1024,\n});\n\n/**\n * Stable failure reasons emitted by {@link validateAgentPayload}.\n * - `invalid_version` — `version` !== {@link AGENT_PAYLOAD_VERSION}.\n * - `invalid_kind` — `kind` is empty / not a string.\n * - `field_too_large` — a string field inside `payload` exceeds `maxStringFieldBytes`.\n * - `fallback_too_large` — `plainTextFallback` exceeds `maxPlainTextFallbackBytes`.\n * - `json_too_large` — the full JSON.stringify(envelope) exceeds `maxJsonBytes`.\n */\nexport type AgentPayloadValidationResult =\n | { readonly ok: true }\n | {\n readonly ok: false;\n readonly reason:\n | 'json_too_large'\n | 'fallback_too_large'\n | 'field_too_large'\n | 'invalid_version'\n | 'invalid_kind';\n /** Dotted property-access path to the offending field, e.g. `payload.title` or `payload.tags[2]`. NOT RFC 6901 JSON Pointer. */\n readonly fieldPath?: string;\n readonly actualBytes?: number;\n readonly limitBytes?: number;\n };\n","import {\n AGENT_PAYLOAD_VERSION,\n DEFAULT_AGENT_PAYLOAD_LIMITS,\n type AgentDragPayload,\n type AgentPayloadLimits,\n type AgentPayloadValidationResult,\n} from '../models/agent-input.model';\n\n/**\n * Pure utility helpers for agent drag payload size guarding.\n *\n * Used by `flyAgentDraggable` at `dragstart` (Phase 2) and by app pre-flight code that\n * wants a clean payload before constructing the directive input. No Angular DI, no\n * runtime side effects — safe to import from anywhere.\n *\n * Performance notes:\n * - The `TextEncoder` is lazily allocated and cached. The constructor runs once per\n * module instance even under federation (singleton DS).\n * - String trimming uses `Intl.Segmenter` when available (all evergreen browsers\n * including Safari 14.1+) so we cut on grapheme boundaries — emoji ZWJ sequences,\n * combining marks, regional indicator pairs all stay intact. Fallback is\n * UTF-16 code-unit slice, which is a graceful degradation: it can split a\n * surrogate pair, but the resulting JSON is still syntactically valid and\n * downstream renderers handle the replacement char.\n */\n\n/**\n * Thrown by {@link trimAgentPayload} when even a fully string-trimmed envelope still\n * exceeds `maxJsonBytes` (e.g. an envelope with thousands of nested empty objects /\n * array entries / property keys). Subclasses `RangeError` so callers using the standard\n * `instanceof RangeError` check still match, while exposing the structured fields\n * (`actualBytes`, `limitBytes`, `reason: 'json_too_large'`) needed for telemetry and\n * symmetric handling with {@link AgentPayloadValidationResult} failures.\n */\nexport class AgentPayloadOversizeError extends RangeError {\n readonly reason = 'json_too_large' as const;\n constructor(\n message: string,\n readonly actualBytes: number,\n readonly limitBytes: number,\n ) {\n super(message);\n this.name = 'AgentPayloadOversizeError';\n }\n}\n\n/** Cap on the dotted `fieldPath` string so a 10 MB property-key payload can't lock dev tools when `console.warn`d. */\nconst FIELD_PATH_MAX_CHARS = 256;\n\n/** Append a path segment, capping the result at {@link FIELD_PATH_MAX_CHARS} chars (with `…` marker). */\nfunction appendPath(base: string, segment: string): string {\n const next = base + segment;\n if (next.length <= FIELD_PATH_MAX_CHARS) return next;\n return next.slice(0, FIELD_PATH_MAX_CHARS - 1) + '…';\n}\n\nlet _cachedEncoder: TextEncoder | null = null;\nfunction getEncoder(): TextEncoder {\n return (_cachedEncoder ??= new TextEncoder());\n}\n\n/** UTF-8 byte length of `s`. Cheap; cached encoder. */\nexport function utf8ByteLength(s: string): number {\n return getEncoder().encode(s).length;\n}\n\n/**\n * Trim `input` so the UTF-8 byte length of the result is `<= maxBytes`. When trimming\n * occurs, append `ellipsis` (default `…`, U+2026) — its bytes are included in the cap.\n *\n * Idempotent: `trimAgentString(trimAgentString(s, n), n)` equals `trimAgentString(s, n)`.\n *\n * Edge cases:\n * - `maxBytes` shorter than the ellipsis itself returns an empty string.\n * - `Intl.Segmenter` (when present) ensures we never split a grapheme cluster.\n * - When the encoded length is already within the cap, returns `input` unchanged.\n */\nexport function trimAgentString(input: string, maxBytes: number, ellipsis = '…'): string {\n if (maxBytes <= 0) return '';\n const enc = getEncoder();\n const inputLen = enc.encode(input).length;\n if (inputLen <= maxBytes) return input;\n\n const ellipsisLen = enc.encode(ellipsis).length;\n if (maxBytes < ellipsisLen) return '';\n const budget = maxBytes - ellipsisLen;\n\n // Segmenter path: walk graphemes, accumulate until next would overflow.\n const segmenterCtor =\n typeof Intl !== 'undefined' && (Intl as unknown as { Segmenter?: typeof Intl.Segmenter }).Segmenter;\n if (segmenterCtor) {\n const segmenter = new segmenterCtor(undefined, { granularity: 'grapheme' });\n let used = 0;\n let acc = '';\n for (const seg of segmenter.segment(input)) {\n const segLen = enc.encode(seg.segment).length;\n if (used + segLen > budget) break;\n acc += seg.segment;\n used += segLen;\n }\n return acc + ellipsis;\n }\n\n // Fallback: code-unit slice; verify byte length and shrink until under budget.\n let cut = input.length;\n while (cut > 0 && enc.encode(input.slice(0, cut)).length > budget) {\n cut--;\n }\n return input.slice(0, cut) + ellipsis;\n}\n\n/**\n * Validate an {@link AgentDragPayload} against the supplied limits (or\n * {@link DEFAULT_AGENT_PAYLOAD_LIMITS} when omitted). Returns `{ ok: true }` or a\n * structured failure with the offending field path and byte counts.\n *\n * Order of checks (cheap → expensive):\n * 1. `version` matches the frozen {@link AGENT_PAYLOAD_VERSION}.\n * 2. `kind` is a non-empty string.\n * 3. `plainTextFallback` fits its cap.\n * 4. Every string in `payload` (recursively) fits the per-field cap.\n * 5. The full `JSON.stringify(envelope)` fits the JSON cap.\n *\n * The walker stops on the first oversize string field — the intent is to surface\n * actionable feedback, not enumerate every offender.\n */\nexport function validateAgentPayload(\n payload: AgentDragPayload<unknown>,\n limits?: Partial<AgentPayloadLimits>,\n): AgentPayloadValidationResult {\n const eff: AgentPayloadLimits = { ...DEFAULT_AGENT_PAYLOAD_LIMITS, ...(limits ?? {}) };\n\n if (payload.version !== AGENT_PAYLOAD_VERSION) {\n return { ok: false, reason: 'invalid_version' };\n }\n if (typeof payload.kind !== 'string' || payload.kind.length === 0) {\n return { ok: false, reason: 'invalid_kind' };\n }\n\n const fbBytes = utf8ByteLength(payload.plainTextFallback ?? '');\n if (fbBytes > eff.maxPlainTextFallbackBytes) {\n return {\n ok: false,\n reason: 'fallback_too_large',\n fieldPath: 'plainTextFallback',\n actualBytes: fbBytes,\n limitBytes: eff.maxPlainTextFallbackBytes,\n };\n }\n\n const fieldFailure = walkStringsForOverage(payload.payload, 'payload', eff.maxStringFieldBytes);\n if (fieldFailure) return fieldFailure;\n\n const json = safeStringify(payload);\n const jsonBytes = utf8ByteLength(json);\n if (jsonBytes > eff.maxJsonBytes) {\n return {\n ok: false,\n reason: 'json_too_large',\n actualBytes: jsonBytes,\n limitBytes: eff.maxJsonBytes,\n };\n }\n\n return { ok: true };\n}\n\n/**\n * Returns a NEW payload with all string fields trimmed to fit the per-field cap, the\n * `plainTextFallback` trimmed to its cap, and the full envelope re-checked against the\n * JSON cap. Idempotent — a second call against the trimmed result yields equal output.\n *\n * Throws {@link AgentPayloadOversizeError} only if even an empty trim couldn't shrink it\n * under the cap (e.g. an envelope with 1000+ nested empty objects). The error subclasses\n * `RangeError`, so legacy `instanceof RangeError` checks still match. Apps that hit this\n * should re-shape `payload` rather than call again.\n */\nexport function trimAgentPayload<T>(\n payload: AgentDragPayload<T>,\n limits?: Partial<AgentPayloadLimits>,\n): AgentDragPayload<T> {\n const eff: AgentPayloadLimits = { ...DEFAULT_AGENT_PAYLOAD_LIMITS, ...(limits ?? {}) };\n\n const trimmedFallback = trimAgentString(payload.plainTextFallback ?? '', eff.maxPlainTextFallbackBytes);\n const trimmedPayload = mapStrings(payload.payload, (s) => trimAgentString(s, eff.maxStringFieldBytes)) as T;\n\n const next: AgentDragPayload<T> = {\n ...payload,\n plainTextFallback: trimmedFallback,\n payload: trimmedPayload,\n };\n\n const jsonBytes = utf8ByteLength(safeStringify(next));\n if (jsonBytes > eff.maxJsonBytes) {\n throw new AgentPayloadOversizeError(\n `AgentDragPayload exceeds maxJsonBytes (${jsonBytes} > ${eff.maxJsonBytes}) after string trimming. Re-shape the payload.`,\n jsonBytes,\n eff.maxJsonBytes,\n );\n }\n return next;\n}\n\n// ─── Internal helpers ───────────────────────────────────────────────────────\n\n/**\n * Recursively walks `value`, returning the first string field that exceeds `maxBytes`\n * (as a structured failure). Returns `null` when every string fits.\n *\n * Path uses dotted property-access notation: `payload.body`, `payload.tags[2]`. Cycles\n * are detected via a WeakSet so attacker-crafted self-references don't loop forever.\n * Path strings are capped at {@link FIELD_PATH_MAX_CHARS} characters via {@link appendPath}\n * to prevent a malicious payload with multi-MB property keys from producing a multi-MB\n * `fieldPath` that locks up dev tools when logged.\n */\nfunction walkStringsForOverage(\n value: unknown,\n path: string,\n maxBytes: number,\n seen: WeakSet<object> = new WeakSet(),\n): AgentPayloadValidationResult | null {\n if (typeof value === 'string') {\n const bytes = utf8ByteLength(value);\n if (bytes > maxBytes) {\n return {\n ok: false,\n reason: 'field_too_large',\n fieldPath: path,\n actualBytes: bytes,\n limitBytes: maxBytes,\n };\n }\n return null;\n }\n if (value === null || typeof value !== 'object') return null;\n if (seen.has(value as object)) return null;\n seen.add(value as object);\n\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const r = walkStringsForOverage(value[i], appendPath(path, `[${i}]`), maxBytes, seen);\n if (r) return r;\n }\n return null;\n }\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n const r = walkStringsForOverage(v, appendPath(path, `.${k}`), maxBytes, seen);\n if (r) return r;\n }\n return null;\n}\n\n/**\n * Recursively maps every string leaf via `fn`, preserving object/array structure.\n * Cycles are short-circuited to `null` rather than throwing — the caller already\n * has a JSON.stringify cap that will catch any pathological input.\n */\nfunction mapStrings(value: unknown, fn: (s: string) => string, seen: WeakSet<object> = new WeakSet()): unknown {\n if (typeof value === 'string') return fn(value);\n if (value === null || typeof value !== 'object') return value;\n if (seen.has(value as object)) return null;\n seen.add(value as object);\n\n if (Array.isArray(value)) {\n return value.map((v) => mapStrings(v, fn, seen));\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = mapStrings(v, fn, seen);\n }\n return out;\n}\n\n/** `JSON.stringify` with a cycle-safe replacer — defends against attacker-crafted graphs. */\nfunction safeStringify(value: unknown): string {\n const seen = new WeakSet<object>();\n return JSON.stringify(value, (_k, v) => {\n if (v !== null && typeof v === 'object') {\n if (seen.has(v as object)) return '[Circular]';\n seen.add(v as object);\n }\n return v;\n });\n}\n","import { Directive, HostListener, inject, input } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport {\n AGENT_DRAG_MIME,\n type AgentDragPayload,\n} from '../models/agent-input.model';\nimport { validateAgentPayload } from '../utils/agent-payload-guards';\n\n/**\n * Strict whitelist for the ghost element id. Letter-led ASCII, allows word/hyphen/colon/dot,\n * capped at 128 chars. Anything else is rejected before reaching `getElementById` so a\n * future maintainer can't swap to `querySelector` and quietly reintroduce a CSS-injection\n * vector. (`getElementById` itself is string-equality-safe; the whitelist is defence-in-depth.)\n */\nconst GHOST_ID_PATTERN = /^[A-Za-z][\\w\\-:.]{0,127}$/;\n\n/**\n * Single canonical way to declare a drag source for the agent input.\n *\n * Apply on any element a remote wants to make draggable into the `<fly-agent-input>`:\n *\n * ```html\n * <article [flyAgentDraggable]=\"() => buildPayload(trend)\" flyAgentDraggableGhostId=\"trend-ghost\">…</article>\n * ```\n *\n * On `dragstart` the directive:\n * 1. Resolves the payload (calls the builder fn if supplied; otherwise reads the\n * static value).\n * 2. Validates against {@link DEFAULT_AGENT_PAYLOAD_LIMITS} via\n * {@link validateAgentPayload}. On failure it `console.warn`s with the structured\n * reason and writes ONLY the `text/plain` fallback — the receiver still sees a\n * legible drop, but the typed envelope is skipped so a misconfigured app can't\n * corrupt downstream consumers with an oversize payload.\n * 3. Writes the typed MIME (`application/x-fly-agent-payload+json`) plus the\n * `text/plain` fallback so non-Fly drop targets still get useful text.\n * 4. Sets `effectAllowed = 'copy'` (we never *move* domain objects across windows).\n * 5. When `flyAgentDraggableGhostId` resolves to an element in the DOM, calls\n * `setDragImage` to use that element as the drag preview; otherwise the browser\n * default applies.\n *\n * Notes:\n * - Builder form is preferred over static — it captures fresh state at `dragstart`,\n * not at directive init. A static `AgentDragPayload` is fine for items whose\n * domain object never changes after the row mounts.\n * - The directive sets `[attr.draggable]=\"true\"` so callers don't have to.\n */\n@Directive({\n selector: '[flyAgentDraggable]',\n standalone: true,\n host: {\n '[attr.draggable]': '\"true\"',\n },\n})\nexport class FlyAgentDraggableDirective<T = unknown> {\n /**\n * Either a static payload or a builder evaluated at `dragstart` (preferred — captures\n * fresh state). `input.required` so misuse fails at template compile time.\n */\n readonly flyAgentDraggable = input.required<AgentDragPayload<T> | (() => AgentDragPayload<T>)>();\n\n /**\n * Optional ghost element id (an existing element in the DOM whose snapshot becomes\n * the drag image). Falls back to the default browser drag image when absent or the\n * element can't be resolved.\n *\n * Must be a valid HTML id (ASCII, letter-led). `getElementById` is intentional —\n * do NOT swap to `querySelector` without re-introducing this whitelist.\n */\n readonly flyAgentDraggableGhostId = input<string | undefined>(undefined);\n\n private readonly doc = inject(DOCUMENT);\n\n @HostListener('dragstart', ['$event'])\n onDragStart(ev: DragEvent): void {\n const dt = ev.dataTransfer;\n if (!dt) return;\n\n const payload = this.resolvePayload();\n const validation = validateAgentPayload(payload);\n\n if (!validation.ok) {\n // eslint-disable-next-line no-console\n console.warn('[flyAgentDraggable] payload validation failed; degrading to text/plain', validation);\n dt.setData('text/plain', payload.plainTextFallback ?? '');\n dt.effectAllowed = 'copy';\n return;\n }\n\n dt.setData(AGENT_DRAG_MIME, JSON.stringify(payload));\n dt.setData('text/plain', payload.plainTextFallback ?? '');\n dt.effectAllowed = 'copy';\n\n const ghostId = this.flyAgentDraggableGhostId();\n if (ghostId) {\n if (!GHOST_ID_PATTERN.test(ghostId)) {\n // Don't echo the rejected id (caller-controlled, could be huge).\n // eslint-disable-next-line no-console\n console.warn('[flyAgentDraggable] ignoring ghost id', { reason: 'invalid_ghost_id' });\n } else {\n const ghost = this.doc.getElementById(ghostId);\n if (ghost) {\n // Center the drag image; ResizeObserver-aware sizing is left to the host element.\n dt.setDragImage(ghost, ghost.clientWidth / 2, ghost.clientHeight / 2);\n }\n }\n }\n }\n\n private resolvePayload(): AgentDragPayload<T> {\n const raw = this.flyAgentDraggable();\n return typeof raw === 'function' ? (raw as () => AgentDragPayload<T>)() : raw;\n }\n}\n","import type { FlyLocaleEntry } from './fly-locale-catalog.model';\n\n/**\n * Verbatim TypeScript port of the C# `LanguageDTO[] _AllLanguages` array supplied by\n * product. **31 entries**, in the canonical order. Three RTL flagged: `he-IL`, `ur-IN`,\n * `ar-AE`. Includes `cmn-Hant-TW` for Chinese and `ka-GE` for Georgian.\n *\n * The order matches the C# source byte-for-byte — do not re-sort. Downstream tests\n * (`fly-locale-catalog.spec.ts`) pin the count, the unique-key constraints, and the\n * RTL set; if you reorder or add an entry, those tests will guide the fix.\n *\n * The strings carry Cyrillic, Hebrew, Vietnamese, Thai, Indonesian, Bengali, Devanagari,\n * Urdu, Catalan, Polish, Korean, Russian, Japanese, Han, Turkish, Romanian, Norwegian,\n * Hungarian, Greek, Finnish, Danish, Dutch, Swedish, Portuguese, Italian, German,\n * Spanish, French, English, Arabic, and Georgian. The file is saved as UTF-8 without\n * BOM (matches every other locale file in the repo). The `…` (U+2026) ellipsis is\n * preserved verbatim.\n */\nexport const FLY_LOCALE_CATALOG: readonly FlyLocaleEntry[] = Object.freeze([\n {\n prefix: 'UK',\n dialect: 'uk-UA',\n englishName: 'Ukrainian',\n arabicName: 'الأوكرانية',\n nativeName: 'Українська',\n detected: 'Виявлена мова',\n searching: 'Шукаючи',\n elevating: 'Підняття до',\n translating: 'Переклад на',\n generatingAnswersForYou: 'Створення відповідей для вас...',\n learnMore: 'Дізнайтеся більше',\n waitingForResponseMsg: 'Будь ласка, наберіться терпіння, ми ще думаємо',\n isRtl: false,\n },\n {\n prefix: 'HE',\n dialect: 'he-IL',\n englishName: 'Hebrew',\n arabicName: 'العبرية',\n nativeName: 'עברית',\n detected: 'שפה מזוהה',\n searching: 'מחפש אחר',\n elevating: 'מרומם ל',\n translating: 'תרגום ל',\n generatingAnswersForYou: 'מייצר עבורך תשובות...',\n learnMore: 'למידע נוסף',\n waitingForResponseMsg: 'אנא התאזרו בסבלנות, אנחנו עדיין חושבים',\n isRtl: true,\n },\n {\n prefix: 'VI',\n dialect: 'vi-VN',\n englishName: 'Vietnamese',\n arabicName: 'الفيتنامية',\n nativeName: 'Tiếng Việt',\n detected: 'Ngôn ngữ được phát hiện',\n searching: 'Tìm kiếm',\n elevating: 'Nâng lên',\n translating: 'Dịch sang',\n generatingAnswersForYou: 'Đang tạo câu trả lời cho bạn...',\n learnMore: 'Tìm hiểu thêm',\n waitingForResponseMsg: 'Vui lòng kiên nhẫn, chúng tôi vẫn đang suy nghĩ',\n isRtl: false,\n },\n {\n prefix: 'TH',\n dialect: 'th-TH',\n englishName: 'Thai',\n arabicName: 'التايلاندية',\n nativeName: 'ไทย',\n detected: 'ภาษาที่ตรวจพบ',\n searching: 'ค้นหา',\n elevating: 'ยกระดับเป็น',\n translating: 'การแปล',\n generatingAnswersForYou: 'กำลังสร้างคำตอบให้กับคุณ...',\n learnMore: 'เรียนรู้เพิ่มเติม',\n waitingForResponseMsg: 'โปรดอดใจรอ, พวกเรายังคงกำลังคิดอยู่',\n isRtl: false,\n },\n {\n prefix: 'ID',\n dialect: 'id-ID',\n englishName: 'Indonesian',\n arabicName: 'الإندونيسية',\n nativeName: 'Bahasa Indonesia',\n detected: 'Bahasa yang terdeteksi',\n searching: 'Mencari',\n elevating: 'Meninggalkan ke',\n translating: 'Menerjemahkan ke',\n generatingAnswersForYou: 'Menghasilkan jawaban untuk Anda...',\n learnMore: 'Cari tahu lebih lanjut',\n waitingForResponseMsg: 'Harap bersabar, kami masih sedang berpikir',\n isRtl: false,\n },\n {\n prefix: 'BN',\n dialect: 'bn-BD',\n englishName: 'Bengali',\n arabicName: 'البنغالية',\n nativeName: 'বাংলা',\n detected: 'সনাক্ত করা ভাষা',\n searching: 'খুঁজছি',\n elevating: 'উন্নত',\n translating: 'অনুবাদ',\n generatingAnswersForYou: 'আপনার জন্য উত্তর তৈরি করা হচ্ছে...',\n learnMore: 'আরো জানুন',\n waitingForResponseMsg: 'অনুগ্রহ করে ধৈর্য ধরুন, আমরা এখনও চিন্তা করছি',\n isRtl: false,\n },\n {\n prefix: 'HI',\n dialect: 'hi-IN',\n englishName: 'Hindi',\n arabicName: 'الهندية',\n nativeName: 'हिन्दी',\n detected: 'पता चला भाषा',\n searching: 'के लिए खोज रहे हैं',\n elevating: 'के लिए ऊंचा',\n translating: 'अनुवाद करना',\n generatingAnswersForYou: 'आपके लिए उत्तर तैयार किया जा रहा है...',\n learnMore: 'और जानें',\n waitingForResponseMsg: 'कृपया धैर्य रखें, हम अभी सोच रहे हैं',\n isRtl: false,\n },\n {\n prefix: 'UR',\n dialect: 'ur-IN',\n englishName: 'Urdu',\n arabicName: 'الأردية',\n nativeName: 'اردو',\n detected: 'پتہ چلا زبان',\n searching: 'کے لیے تلاش',\n elevating: 'بلند کرنا',\n translating: 'ترجمہ کرنا',\n generatingAnswersForYou: 'آپ کے لیے جوابات تیار کیے جا رہے ہیں...',\n learnMore: 'مزید جانیں',\n waitingForResponseMsg: 'براہ کرم صبر کریں، ہم ابھی سوچ رہے ہیں۔',\n isRtl: true,\n },\n {\n prefix: 'CA',\n dialect: 'ca-ES',\n englishName: 'Catalan',\n arabicName: 'الكتالانية',\n nativeName: 'Català',\n detected: 'Idioma detectat',\n searching: 'Buscant',\n elevating: 'Elevant a',\n translating: 'Traduir a',\n generatingAnswersForYou: 'Generant respostes per a tu...',\n learnMore: 'Aprèn més',\n waitingForResponseMsg: 'Si us plau, tingueu paciència, encara estem pensant',\n isRtl: false,\n },\n {\n prefix: 'PL',\n dialect: 'pl-PL',\n englishName: 'Polish',\n arabicName: 'البولندية',\n nativeName: 'Polski',\n detected: 'Wykryty język',\n searching: 'Szukać',\n elevating: 'Podniesienie do',\n translating: 'Tłumaczenie na',\n generatingAnswersForYou: 'Generowanie odpowiedzi dla Ciebie...',\n learnMore: 'Dowiedz się więcej',\n waitingForResponseMsg: 'Proszę o cierpliwość, nadal myślimy',\n isRtl: false,\n },\n {\n prefix: 'KO',\n dialect: 'ko-KR',\n englishName: 'Korean',\n arabicName: 'الكورية',\n nativeName: '한국어',\n detected: '탐지 언어',\n searching: '검색',\n elevating: '상승',\n translating: '번역',\n generatingAnswersForYou: '답변을 생성하는 중...',\n learnMore: '더 알아보기',\n waitingForResponseMsg: '잠시만 기다려 주세요, 저희는 아직 생각 중입니다',\n isRtl: false,\n },\n {\n prefix: 'RU',\n dialect: 'ru-RU',\n englishName: 'Russian',\n arabicName: 'الروسية',\n nativeName: 'Русский',\n detected: 'Обнаруженный язык',\n searching: 'В поисках',\n elevating: 'Поднимаясь до',\n translating: 'Перевод',\n generatingAnswersForYou: 'Генерация ответов для вас...',\n learnMore: 'Узнать больше',\n waitingForResponseMsg: 'Пожалуйста, подождите, мы всё ещё думаем',\n isRtl: false,\n },\n {\n prefix: 'JA',\n dialect: 'ja-JP',\n englishName: 'Japanese',\n arabicName: 'اليابانية',\n nativeName: '日本語',\n detected: '検出言語',\n searching: '探している',\n elevating: '昇格',\n translating: '翻訳',\n generatingAnswersForYou: 'あなたのための答えを生成中...',\n learnMore: 'もっと詳しく',\n waitingForResponseMsg: '少々お待ちください、ただいま考え中です',\n isRtl: false,\n },\n {\n prefix: 'ZH',\n dialect: 'cmn-Hant-TW',\n englishName: 'Chinese',\n arabicName: 'الصينية',\n nativeName: '中文',\n detected: '检测语言',\n searching: '搜索',\n elevating: '提升到',\n translating: '翻译成',\n generatingAnswersForYou: '为您生成答案...',\n learnMore: '了解更多',\n waitingForResponseMsg: '请耐心等待,我们还在思考',\n isRtl: false,\n },\n {\n prefix: 'TR',\n dialect: 'tr-TR',\n englishName: 'Turkish',\n arabicName: 'التركية',\n nativeName: 'Türkçe',\n detected: 'Tespit edilen dil',\n searching: 'Arama',\n elevating: 'Yükseltme',\n translating: 'Çevirme',\n generatingAnswersForYou: 'Sizin için yanıtlar üretiliyor...',\n learnMore: 'Daha fazla bilgi edin',\n waitingForResponseMsg: 'Lütfen sabırlı olun, hâlâ düşünüyoruz',\n isRtl: false,\n },\n {\n prefix: 'RO',\n dialect: 'ro-RO',\n englishName: 'Romanian',\n arabicName: 'الرومانية',\n nativeName: 'Română',\n detected: 'Limba detectată',\n searching: 'Căutare de',\n elevating: 'Elevator la',\n translating: 'Traducerea în',\n generatingAnswersForYou: 'Generarea de răspunsuri pentru tine...',\n learnMore: 'Află mai multe',\n waitingForResponseMsg: 'Vă rugăm să aveți răbdare, încă ne gândim',\n isRtl: false,\n },\n {\n prefix: 'NO',\n dialect: 'nb-NO',\n englishName: 'Norwegian',\n arabicName: 'النرويجية',\n nativeName: 'Norsk',\n detected: 'Oppdaget språk',\n searching: 'Leter etter',\n elevating: 'Løfter til',\n translating: 'Oversette til',\n generatingAnswersForYou: 'Genererer svar for deg...',\n learnMore: 'Lær mer',\n waitingForResponseMsg: 'Vennligst vær tålmodig, vi tenker fortsatt',\n isRtl: false,\n },\n {\n prefix: 'HU',\n dialect: 'hu-HU',\n englishName: 'Hungarian',\n arabicName: 'الهنغارية',\n nativeName: 'Magyar',\n detected: 'Detektált nyelv',\n searching: 'Keresés-ra,-re',\n elevating: 'Felemelve',\n translating: 'Fordítás',\n generatingAnswersForYou: 'Válaszok generálása az Ön számára...',\n learnMore: 'Tudj meg többet',\n waitingForResponseMsg: 'Kérjük, legyen türelemmel, még gondolkodunk',\n isRtl: false,\n },\n {\n prefix: 'EL',\n dialect: 'el-GR',\n englishName: 'Greek',\n arabicName: 'اليونانية',\n nativeName: 'Ελληνικά',\n detected: 'Εντοπισμένη γλώσσα',\n searching: 'Ψάχνοντας για',\n elevating: 'Ανυψώ',\n translating: 'Μεταφράζοντας σε',\n generatingAnswersForYou: 'Δημιουργία απαντήσεων για εσάς...',\n learnMore: 'Μάθε περισσότερα',\n waitingForResponseMsg: 'Παρακαλώ περιμένετε με υπομονή, σκεφτόμαστε ακόμα',\n isRtl: false,\n },\n {\n prefix: 'FI',\n dialect: 'fi-FI',\n englishName: 'Finnish',\n arabicName: 'الفنلندية',\n nativeName: 'Suomi',\n detected: 'Havaittu kieli',\n searching: 'Etsimässä',\n elevating: 'Nousee jhk',\n translating: 'Kääntäen',\n generatingAnswersForYou: 'Luodaan vastauksia sinulle...',\n learnMore: 'Lue lisää',\n waitingForResponseMsg: 'Ole hyvä ja ole kärsivällinen, ajattelemme yhä',\n isRtl: false,\n },\n {\n prefix: 'DA',\n dialect: 'da-DK',\n englishName: 'Danish',\n arabicName: 'الدانماركية',\n nativeName: 'Dansk',\n detected: 'Opdaget sprog',\n searching: 'Leder efter',\n elevating: 'Hæve til',\n translating: 'Oversættelse til',\n generatingAnswersForYou: 'Generer svar til dig...',\n learnMore: 'Lær mere',\n waitingForResponseMsg: 'Vent venligst tålmodigt, vi tænker stadig',\n isRtl: false,\n },\n {\n prefix: 'NL',\n dialect: 'nl-NL',\n englishName: 'Dutch',\n arabicName: 'الهولندية',\n nativeName: 'Nederlands',\n detected: 'Gedetecteerde taal',\n searching: 'Op zoek naar',\n elevating: 'Verheffen tot',\n translating: 'Vertalen naar',\n generatingAnswersForYou: 'Antwoorden voor u genereren...',\n learnMore: 'Lees meer',\n waitingForResponseMsg: 'Gelieve geduld te hebben, we zijn nog aan het nadenken',\n isRtl: false,\n },\n {\n prefix: 'SV',\n dialect: 'sv-SE',\n englishName: 'Swedish',\n arabicName: 'السويدية',\n nativeName: 'Svenska',\n detected: 'Upptäckt språk',\n searching: 'Söker efter',\n elevating: 'Upphöjande till',\n translating: 'Översätta till',\n generatingAnswersForYou: 'Genererar svar åt dig...',\n learnMore: 'Läs mer',\n waitingForResponseMsg: 'Vänligen ha tålamod, vi tänker fortfarande',\n isRtl: false,\n },\n {\n prefix: 'PT',\n dialect: 'pt-PT',\n englishName: 'Portuguese',\n arabicName: 'البرتغالية',\n nativeName: 'Português',\n detected: 'Idioma detectado',\n searching: 'Procurando por',\n elevating: 'Elevando para',\n translating: 'Traduzindo para',\n generatingAnswersForYou: 'Gerando respostas para você...',\n learnMore: 'Saiba mais',\n waitingForResponseMsg: 'Por favor, tenha paciência, ainda estamos a pensar',\n isRtl: false,\n },\n {\n prefix: 'IT',\n dialect: 'it-IT',\n englishName: 'Italian',\n arabicName: 'الإيطالية',\n nativeName: 'Italiano',\n detected: 'Lingua rilevata',\n searching: 'Alla ricerca di',\n elevating: 'Elevare a',\n translating: 'Tradurre in',\n generatingAnswersForYou: 'Generazione di risposte per te...',\n learnMore: 'Scopri di più',\n waitingForResponseMsg: 'Per favore, abbi pazienza, stiamo ancora pensando',\n isRtl: false,\n },\n {\n prefix: 'DE',\n dialect: 'de-DE',\n englishName: 'German',\n arabicName: 'الألمانية',\n nativeName: 'Deutsch',\n detected: 'Erkannte Sprache',\n searching: 'Auf der Suche nach',\n elevating: 'Erhöhung zu',\n translating: 'Übersetzung auf',\n generatingAnswersForYou: 'Wir generieren Antworten für Sie...',\n learnMore: 'Erfahre mehr',\n waitingForResponseMsg: 'Bitte haben Sie Geduld, wir denken noch nach',\n isRtl: false,\n },\n {\n prefix: 'ES',\n dialect: 'es-AR',\n englishName: 'Spanish',\n arabicName: 'الأسبانية',\n nativeName: 'Español',\n detected: 'Idioma detectado',\n searching: 'Buscando',\n elevating: 'Elevando a',\n translating: 'Traduciendo a',\n generatingAnswersForYou: 'Generando respuestas para ti...',\n learnMore: 'Aprende más',\n waitingForResponseMsg: 'Por favor, ten paciencia, todavía estamos pensando',\n isRtl: false,\n },\n {\n prefix: 'FR',\n dialect: 'fr-FR',\n englishName: 'French',\n arabicName: 'الفرنسية',\n nativeName: 'Français',\n detected: 'Langue détectée',\n searching: 'À la recherche de',\n elevating: 'Élever à',\n translating: 'Traduire par',\n generatingAnswersForYou: 'Générer des réponses pour vous...',\n learnMore: 'En savoir plus',\n waitingForResponseMsg: 'Veuillez patienter, nous réfléchissons encore',\n isRtl: false,\n },\n {\n prefix: 'EN',\n dialect: 'en-US',\n englishName: 'English',\n arabicName: 'الإنجليزية',\n nativeName: 'English',\n detected: 'Detected language',\n searching: 'Searching for',\n elevating: 'Elevating to',\n translating: 'Translating to',\n generatingAnswersForYou: 'Generating answers for you...',\n learnMore: 'Learn more',\n waitingForResponseMsg: 'Please bear with us, we are still thinking',\n isRtl: false,\n },\n {\n prefix: 'AR',\n dialect: 'ar-AE',\n englishName: 'Arabic',\n arabicName: 'العربية',\n nativeName: 'العربية',\n detected: 'اللغة المكتشفة',\n searching: 'البحث عن',\n elevating: 'رفع إلى',\n translating: 'ترجمة إلى',\n generatingAnswersForYou: 'جارٍ إنشاء إجابات لك...',\n learnMore: 'تعرف على المزيد',\n waitingForResponseMsg: 'نرجو منك التحلّي بالصبر، نحن ما زلنا نفكر',\n isRtl: true,\n },\n {\n prefix: 'KA',\n dialect: 'ka-GE',\n englishName: 'Georgian',\n arabicName: 'الجورجية',\n nativeName: 'ქართული',\n detected: 'გამოვლენილი ენა',\n searching: 'ძიება',\n elevating: 'ამაღლება',\n translating: 'თარგმნა',\n generatingAnswersForYou: 'პასუხების გენერირება თქვენთვის...',\n learnMore: 'გაიგე მეტი',\n waitingForResponseMsg: 'გთხოვთ მოითმინოთ, ჯერ კიდევ ვფიქრობთ',\n isRtl: false,\n },\n]) as readonly FlyLocaleEntry[];\n\n/**\n * Lookup by BCP-47 dialect (e.g. `'ar-AE'`). Case-insensitive per BCP-47 §2.1.1\n * (subtags are case-insensitive on the wire) — accepts `'en-US'`, `'en-us'`,\n * `'EN-US'`, etc. all as the canonical EN entry. The catalog itself keeps its\n * canonical casing for display.\n *\n * Returns `undefined` when not found; callers decide whether to fall back to `'en-US'`.\n */\nexport function findLocaleByDialect(dialect: string): FlyLocaleEntry | undefined {\n if (typeof dialect !== 'string' || dialect.length === 0) return undefined;\n const lower = dialect.toLowerCase();\n return FLY_LOCALE_CATALOG.find((e) => e.dialect.toLowerCase() === lower);\n}\n\n/**\n * Lookup by short prefix (e.g. `'AR'`). Prefixes are unique in the catalog (asserted by tests).\n * Case-insensitive — accepts `'AR'`, `'ar'`, `'Ar'`. Catalog stores prefixes uppercase\n * for display.\n */\nexport function findLocaleByPrefix(prefix: string): FlyLocaleEntry | undefined {\n if (typeof prefix !== 'string' || prefix.length === 0) return undefined;\n const lower = prefix.toLowerCase();\n return FLY_LOCALE_CATALOG.find((e) => e.prefix.toLowerCase() === lower);\n}\n\n/**\n * Type-narrowing helper for entries flagged RTL.\n *\n * Named with the `Entry` suffix to avoid colliding with the existing\n * `isRtlLocale(lang: string)` from `i18n.service.ts`, which answers a different\n * question (is the *UI* locale code RTL?). Both helpers coexist in `public-api`.\n */\nexport function isRtlLocaleEntry(\n entry: FlyLocaleEntry,\n): entry is FlyLocaleEntry & { isRtl: true } {\n return entry.isRtl === true;\n}\n","/*\n * @mohamedatia/fly-design-system — Public API\n * https://www.npmjs.com/package/@mohamedatia/fly-design-system\n *\n * This is the single entry point for Business / Supporting App developers.\n * Import everything from '@mohamedatia/fly-design-system' — never from relative shell paths.\n *\n * NOTE: This package is published under @mohamedatia/fly-design-system until the @fly\n * npm org is created. It will be republished as @fly/design-system once available.\n *\n * v1.3.0: FlyThemeService (html theme classes), hardened I18nService (AbortSignal, ErrorHandler, RTL helpers).\n * v1.3.1: loadBundle normalizes locale JSON (flat or nested objects; rejects invalid leaves).\n * v1.3.2: loadBundle returns boolean; LoadBundleOptions.silent skips ErrorHandler on failure.\n * v1.3.7: MockAuthService base class + MockAuthConfig for Business App mock auth via fileReplacements.\n * User model extended with optional avatar, source, twoFactorEnabled, createdAt fields.\n * v1.3.8: AuthService.init() no-op added so Business Apps can call init() in APP_INITIALIZER\n * without branching between standalone and embedded modes.\n * v1.3.9: MockAuthService field initializers moved into constructor to fix ngDevMode ReferenceError\n * when the package is loaded in a production-mode bundle (no ngDevMode global defined).\n * v1.4.0: ContextMenuComponent (positioned menu, keyboard nav, focus management) moved from desktop\n * shell to design system. MessageBoxService + MessageBoxComponent added (Windows Forms-style\n * modal dialogs with localized button labels, focus management, and Escape key support).\n * MessageBoxButtons, MessageBoxIcon, DialogResult, MessageBoxOptions, MessageBoxButton exported.\n * v1.5.0: SharePanelComponent — generic share/ACL overlay; host supplies API callbacks and optional\n * permission level options (file ACL vs note-style View/Edit).\n * v1.6.0: SharePanelComponent — `loadOuTree(chartId: string | null)`; optional `loadChartOptions` for\n * default vs alternative org charts (OU grants still use real OU ids). `ShareOrgChartOption` exported.\n * v1.7.0: SharePanelComponent — `loadChartOptions` and `loadOuLabelMap` are required; chart tree loads after\n * options resolve (no spurious null fetch). `loadOuLabelMap` supplies default-tree labels for OU rows.\n * v1.8.0: `WindowInstance` optional `contentUiBlocked` / `contentUiBlockMessageKey`; `WindowManagerService`\n * `beginContentUiBlock` / `endContentUiBlock` default no-ops; `FlyBlockUiComponent` for shell window overlay.\n * v1.10.0: SharePanelComponent — `supportsDeny` input + `isDeny?` on `SharePermissionEntry`. Surfaces an\n * \"Add as deny\" toggle in the add-permission row and renders existing deny grants with red\n * accent + ban icon. `grantToUser` / `grantToOu` callbacks gain a fourth `isDeny: boolean`\n * parameter (additive — existing 3-arg callers won't compile until updated). New locale keys\n * `files.share.add_as_deny`, `files.share.deny_help`, `files.share.denied` (en/ar/fr/ur).\n * Backed by Files Manager `FilePermission.IsDeny` and Notes `NoteShareLevel.Deny`.\n * v2.0.0: BREAKING — `SharePermissionEntry` adopts the `SharePrincipal` discriminated union\n * (`{ kind: 'user' | 'role' | 'ou' | 'app-everyone', ... }`) instead of the v1\n * `grantedToUserId` / `grantedToOuId` / `grantedToAppId` set-which-is-set fields.\n * Hosts must translate domain DTOs to/from the new shape (see\n * `file-access-control.component.ts` and `notes.component.ts` for migration patterns).\n * The `role` kind is reserved for the planned apps-chart role-as-principal flow;\n * hosts should not emit it until the backend's `PermissionResolver` enumerates a\n * user's full OU set (direct + computed-from-role memberships).\n * v2.1.0: AudienceBuilderComponent — generic <fly-audience-builder> form-control for composing\n * a `Fly.Shared.Core.Audience.AudienceFilter`. TypeScript model (`AudienceFilter`,\n * `AudienceTerm` discriminated union, `AUDIENCE_LIMITS`) mirrors the C# polymorphic\n * shape byte-for-byte (`kind` discriminator: users/roles/ou/app-everyone/chart/preset).\n * Reuses share-panel callback shapes (searchUsers, loadOuTree, loadChartOptions,\n * loadRoleOus). Distinct from share-panel: emits `(audienceChange)` + `(validityChange)`\n * instead of auto-persisting; hosts save on submit. New `audience.*` locale namespace.\n * v2.3.0: Deep-link launch contract — `LAUNCH_CONTEXT` injection token + `LaunchContext`\n * type for federated remotes to receive a route + params payload when the host\n * opens (or re-opens) their window via a `?app=&route=¶ms=` URL on the shell.\n * Token resolves to `Signal<LaunchContext | null>`; `null` when no host provider.\n * Backed by `Fly.Shared.Core.Apps.IDeepLinkBuilder` for outbound URL generation.\n * v2.2.0: AudienceBuilderComponent now implements `ControlValueAccessor` + `Validator` so\n * hosts can bind via `formControl` / `formControlName` / `[(ngModel)]`. Existing\n * `[value]` + `(audienceChange)` + `(validityChange)` API still works (forms wiring\n * is purely additive). `AUDIENCE_PRESETS` const exported for hosts that build their\n * own preset pickers. `OuTerm.chartId` and `OuTerm.includeDescendants` are now\n * REQUIRED (no longer optional) so wire round-trips are deterministic — emit explicit\n * `null` / `boolean` rather than `undefined`. New `AudienceErrorCodes` mirror added.\n * v2.4.0: SharePanelComponent + AudienceBuilderComponent — `defaultChartSystemKey` and\n * `defaultChartId` inputs let hosts pre-select a specific chart in the OU picker\n * without knowing the tenant-scoped Guid. `ShareOrgChartOption` gains an optional\n * `systemKey` field so platform-managed charts (`'apps'`, `'default-company'`) are\n * identifiable across tenants. New `SHARE_ORG_CHART_SYSTEM_KEY_APPS` /\n * `SHARE_ORG_CHART_SYSTEM_KEY_DEFAULT` constants exported.\n * v2.5.0: Agent input contracts (Phase 1 of the `<fly-agent-input>` plan) — additive only.\n * `AgentCommandRegistry` + `AgentDropRegistry` (singletons via `providedIn: 'root'`,\n * shared across federation), `flyAgentDraggable` directive, payload-guard helpers\n * (`validateAgentPayload`, `trimAgentPayload`, `trimAgentString`, `utf8ByteLength`),\n * and the cross-cutting `FLY_LOCALE_CATALOG` (31 entries, frozen — verbatim port of\n * `Fly.Shared.Core.LanguageDTO[]`). Three RTL flagged: `he-IL`, `ur-IN`, `ar-AE`.\n * The catalog's RTL helper is exported as `isRtlLocaleEntry` to avoid colliding with\n * the existing `isRtlLocale(lang: string)` from `i18n.service.ts`.\n * No UI consumers yet — Phase 2 wires the registries into the shell input component.\n * v2.9.0: Federation-safe cross-app deep-linking contract. The shell publishes\n * every launch onto a `FLYOS_LAUNCH_EVENT` (`'flyos:launch'`) window\n * CustomEvent AND a `globalThis[FlyosPendingLaunchesGlobalKey]` registry,\n * both keyed by `appId`. New exports: `FLYOS_LAUNCH_EVENT`,\n * `FlyosPendingLaunchesGlobalKey`, `FlyLaunchEventDetail`,\n * `FlyosPendingLaunches`. `LAUNCH_CONTEXT` is now documented as\n * shell-internal — Native Federation can split the InjectionToken across\n * host/remote bundles, so federated remotes must consume the\n * event + registry surfaces. See `skills/cross-app-deep-linking.md`.\n * Also: new `SourceAppResolver` service + `APP_LOOKUP` adapter token,\n * centralising the canonicalization rule that strips `-service` from\n * JWT client_ids (`circles-service` → `circles`) so chips, banners,\n * and launchers stay consistent across the shell.\n * v2.5.1: New `MessageBoxService.showAcknowledged()` entry point returning\n * `DialogResultWithAcknowledgement` for \"Don't ask again\"-style flows.\n * The `dontAskAgain` config (`MessageBoxDontAskAgainConfig`) lives ONLY on\n * `MessageBoxOptionsWithAcknowledgement` — the base `MessageBoxOptions`\n * no longer carries it, so the type system enforces \"checkbox ⇒ caller\n * MUST use `showAcknowledged()`\" and eliminates the silent-discard path\n * on `show()`. Existing `show()` callers are unaffected. Case-insensitive\n * `findLocaleByDialect` / `findLocaleByPrefix` (BCP-47 §2.1.1). See\n * `.workflow/plans/agent-input-component.md` Phase 2b-1.\n * See docs/ExternalAppsGuide/03-frontend-app.md.\n */\n\n// ─── Models ──────────────────────────────────────────────────────────────────\nexport type { DesktopApp, DesktopAppKind } from './lib/models/app.model';\nexport type {\n WindowInstance,\n WindowState,\n ChildWindowData,\n LaunchContext,\n FlyLaunchEventDetail,\n FlyosPendingLaunches,\n} from './lib/models/window.model';\nexport {\n WINDOW_DATA,\n LAUNCH_CONTEXT,\n FLYOS_LAUNCH_EVENT,\n FlyosPendingLaunchesGlobalKey,\n} from './lib/models/window.model';\nexport type { User } from './lib/models/user.model';\n\nexport type {\n SharePermissionEntry,\n SharePrincipal,\n SharePrincipalKind,\n UserPrincipal,\n RolePrincipal,\n OuPrincipal,\n AppEveryonePrincipal,\n ShareUserResult,\n ShareOuNode,\n ShareOrgChartOption,\n SharePanelLevelOption,\n} from './lib/models/share-panel.model';\nexport {\n SHARE_ORG_CHART_SYSTEM_KEY_DEFAULT,\n SHARE_ORG_CHART_SYSTEM_KEY_APPS,\n} from './lib/models/share-panel.model';\n\n// ─── Audience Targeting ──────────────────────────────────────────────────────\nexport type {\n AudienceFilter,\n AudienceTerm,\n AudienceTermKind,\n UsersTerm,\n RolesTerm,\n OuTerm,\n AppEveryoneTerm,\n ChartTerm,\n PresetTerm,\n AudiencePresetKind,\n AudienceOptions,\n} from './lib/models/audience.model';\nexport {\n AUDIENCE_LIMITS,\n AUDIENCE_TERM_KINDS,\n AUDIENCE_PRESETS,\n} from './lib/models/audience.model';\n\n/**\n * Stable error codes returned by audience-aware backend endpoints. Mirror of\n * `Fly.Shared.Core.Audience.AudienceErrorCodes`. Compare on these strings, not on HTTP\n * status, so localized messages can change without breaking integrations.\n */\nexport const AUDIENCE_ERROR_CODES = {\n invalidFilter: 'INVALID_AUDIENCE_FILTER',\n audienceTooLarge: 'AUDIENCE_TOO_LARGE',\n resolverUnavailable: 'AUDIENCE_RESOLVER_UNAVAILABLE',\n invalidAudienceKind: 'INVALID_AUDIENCE_KIND',\n} as const;\nexport type AudienceErrorCode =\n (typeof AUDIENCE_ERROR_CODES)[keyof typeof AUDIENCE_ERROR_CODES];\n\nexport type { AudienceEditTarget } from './lib/components/audience-builder/audience-builder.component';\n\n// ─── Remote App Registration ─────────────────────────────────────────────────\nexport type { RemoteAppDef } from './lib/models/remote-app.model';\n\n// ─── Services ────────────────────────────────────────────────────────────────\nexport { AuthService } from './lib/services/auth.service';\nexport type { LoadBundleOptions } from './lib/services/i18n.service';\nexport { I18nService, RTL_LOCALE_SET, isRtlLocale } from './lib/services/i18n.service';\nexport {\n FlyThemeService,\n type FlyThemeMode,\n DEFAULT_FLY_THEME_MODE,\n FLY_THEME_MODE_IDS,\n normalizeFlyTheme,\n} from './lib/services/fly-theme.service';\nexport {\n WindowManagerService,\n StandaloneWindowManagerService,\n type OpenWindowOptions,\n} from './lib/services/window-manager.service';\nexport { FlyRemoteRouter } from './lib/services/fly-remote-router.service';\nexport {\n SourceAppResolver,\n APP_LOOKUP,\n type AppLookup,\n type AppLookupEntry,\n} from './lib/services/source-app-resolver.service';\nexport {\n loadRemoteStyles,\n unloadRemoteStyles,\n} from './lib/services/fly-remote-styles';\nexport {\n FLY_REMOTE_ROUTES,\n FLY_REMOTE_BASE_PATH,\n type FlyRemoteRoute,\n type FlyRemoteMatch,\n matchFlyRoutePattern,\n} from './lib/services/fly-remote-router.types';\nexport { FlyRemoteRouterOutletComponent } from './lib/components/fly-remote-router-outlet/fly-remote-router-outlet.component';\n\n// ─── Pipes ───────────────────────────────────────────────────────────────────\nexport { TranslatePipe } from './lib/pipes/translate.pipe';\n\n// ─── Mock Auth (for fileReplacements in dev/mock builds) ─────────────────────\nexport { MockAuthService, type MockAuthConfig } from './lib/services/auth.service.mock';\n\n// ─── Components ──────────────────────────────────────────────────────────────\nexport {\n ContextMenuComponent,\n type ContextMenuItem,\n type ContextMenuSection,\n} from './lib/components/context-menu/context-menu.component';\n\nexport {\n MessageBoxComponent,\n} from './lib/components/message-box/message-box.component';\n\nexport {\n MessageBoxService,\n MessageBoxButtons,\n MessageBoxIcon,\n DialogResult,\n type MessageBoxOptions,\n type MessageBoxOptionsWithAcknowledgement,\n type MessageBoxDontAskAgainConfig,\n type MessageBoxButton,\n type DialogResultWithAcknowledgement,\n} from './lib/components/message-box/message-box.service';\n\nexport {\n SharePanelComponent,\n SHARE_PANEL_DEFAULT_FILE_LEVELS,\n type RoleOuLookupRow,\n} from './lib/components/share-panel/share-panel.component';\n\nexport {\n AudienceBuilderComponent,\n} from './lib/components/audience-builder/audience-builder.component';\n\nexport { FlyBlockUiComponent } from './lib/components/block-ui/block-ui.component';\n\n// ─── File Upload Components ─────────────────────────────────────────────────\nexport type { FlyFileInfo } from './lib/models/file.model';\n\nexport { FlyImageUploadComponent } from './lib/components/image-upload/fly-image-upload.component';\n\nexport { FlyFileUploadComponent } from './lib/components/file-upload/fly-file-upload.component';\n\n// ─── Agent input — registries, directives, types (Phase 1) ──────────────────\nexport {\n AgentCommandRegistry,\n AgentDropRegistry,\n} from './lib/services/agent-input';\n\nexport { FlyAgentDraggableDirective } from './lib/directives/fly-agent-draggable.directive';\n\nexport {\n AGENT_DRAG_MIME,\n AGENT_PAYLOAD_VERSION,\n DEFAULT_AGENT_PAYLOAD_LIMITS,\n} from './lib/models/agent-input.model';\n\nexport type {\n AgentCommand,\n AgentCommandScope,\n AgentCommandHandle,\n AgentCommandRegistration,\n AgentDragPayload,\n AgentDropChipMode,\n AgentChipHostInputs,\n AgentDraggableItem,\n AgentDropRendererRegistration,\n AgentPayloadLimits,\n AgentPayloadValidationResult,\n} from './lib/models/agent-input.model';\n\nexport {\n utf8ByteLength,\n trimAgentString,\n trimAgentPayload,\n validateAgentPayload,\n AgentPayloadOversizeError,\n} from './lib/utils/agent-payload-guards';\n\n// ─── Cross-cutting locale catalog (dictation today, future translation feature) ──\nexport type { FlyLocaleEntry } from './lib/models/fly-locale-catalog.model';\nexport {\n FLY_LOCALE_CATALOG,\n findLocaleByDialect,\n findLocaleByPrefix,\n isRtlLocaleEntry,\n} from './lib/models/fly-locale-catalog';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","DOCUMENT"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mohamedatia-fly-design-system.mjs","sources":["../../../projects/design-system/src/lib/models/window.model.ts","../../../projects/design-system/src/lib/models/share-panel.model.ts","../../../projects/design-system/src/lib/models/audience.model.ts","../../../projects/design-system/src/lib/services/auth.service.ts","../../../projects/design-system/src/lib/services/i18n.service.ts","../../../projects/design-system/src/lib/services/fly-theme.service.ts","../../../projects/design-system/src/lib/services/window-manager.service.ts","../../../projects/design-system/src/lib/services/fly-remote-router.types.ts","../../../projects/design-system/src/lib/services/fly-remote-router.service.ts","../../../projects/design-system/src/lib/services/source-app-resolver.service.ts","../../../projects/design-system/src/lib/services/fly-remote-styles.ts","../../../projects/design-system/src/lib/components/fly-remote-router-outlet/fly-remote-router-outlet.component.ts","../../../projects/design-system/src/lib/pipes/translate.pipe.ts","../../../projects/design-system/src/lib/services/auth.service.mock.ts","../../../projects/design-system/src/lib/components/context-menu/context-menu.component.ts","../../../projects/design-system/src/lib/components/context-menu/context-menu.component.html","../../../projects/design-system/src/lib/components/message-box/message-box.service.ts","../../../projects/design-system/src/lib/components/message-box/message-box.component.ts","../../../projects/design-system/src/lib/components/message-box/message-box.component.html","../../../projects/design-system/src/lib/components/share-panel/share-panel.component.ts","../../../projects/design-system/src/lib/components/share-panel/share-panel.component.html","../../../projects/design-system/src/lib/components/audience-builder/audience-builder.component.ts","../../../projects/design-system/src/lib/components/audience-builder/audience-builder.component.html","../../../projects/design-system/src/lib/components/block-ui/block-ui.component.ts","../../../projects/design-system/src/lib/components/block-ui/block-ui.component.html","../../../projects/design-system/src/lib/components/image-upload/fly-image-upload.component.ts","../../../projects/design-system/src/lib/components/file-upload/fly-file-upload.component.ts","../../../projects/design-system/src/lib/services/agent-input/agent-command-registry.service.ts","../../../projects/design-system/src/lib/services/agent-input/agent-drop-registry.service.ts","../../../projects/design-system/src/lib/models/agent-input.model.ts","../../../projects/design-system/src/lib/utils/agent-payload-guards.ts","../../../projects/design-system/src/lib/directives/fly-agent-draggable.directive.ts","../../../projects/design-system/src/lib/directives/fly-secure-src.directive.ts","../../../projects/design-system/src/lib/models/fly-locale-catalog.ts","../../../projects/design-system/src/public-api.ts","../../../projects/design-system/src/mohamedatia-fly-design-system.ts"],"sourcesContent":["import { InjectionToken, Signal, Type } from '@angular/core';\n\nexport type WindowState = 'normal' | 'minimized' | 'maximized';\n\nexport interface ChildWindowData {\n childComponent: Type<unknown>;\n [key: string]: unknown;\n}\n\nexport interface WindowInstance {\n id: string;\n appId: string;\n title: string;\n icon: string;\n iconBg: string;\n state: WindowState;\n position: { x: number; y: number };\n size: { width: number; height: number };\n zIndex: number;\n isFocused: boolean;\n isClosing?: boolean;\n isMinimizing?: boolean;\n isRestoring?: boolean;\n isMaximizing?: boolean;\n isUnmaximizing?: boolean;\n parentWindowId?: string;\n childData?: ChildWindowData;\n /** Populated when remote `loadComponent()` fails (e.g. federation). */\n remoteLoadError?: string;\n /** When true, the shell draws a block overlay over `.window-content` (see `FlyBlockUiComponent`). */\n contentUiBlocked?: boolean;\n /** i18n key for block overlay label; shell defaults to `common.loading` when unset. */\n contentUiBlockMessageKey?: string;\n}\n\nexport const WINDOW_DATA = new InjectionToken<WindowInstance>('WINDOW_DATA');\n\n/**\n * Payload delivered to a window when it is launched (or re-launched) via a deep link.\n * Both fields are nullable: a normal dock click yields `route: null`, `params: null`.\n * `version` starts at 1 for the first launch and increments on every subsequent\n * re-launch of the same window so listeners can dedupe on `version` changes.\n */\nexport interface LaunchContext {\n readonly route: string | null;\n readonly params: Readonly<Record<string, unknown>> | null;\n readonly version: number;\n}\n\n/**\n * Per-window injection token carrying the active `LaunchContext` as a signal.\n *\n * **Shell-internal.** The shell uses this to track per-window deep-link state across\n * dock launches. **Federated remotes must not consume it** — Native Federation can\n * split the `InjectionToken` instance across the host and remote bundles, in which\n * case `inject(LAUNCH_CONTEXT)` in the remote returns `null` regardless of host\n * provisioning. Remotes subscribe to deep links via the federation-safe surfaces\n * instead: `FLYOS_LAUNCH_EVENT` (window CustomEvent) plus the\n * `__FLYOS_PENDING_LAUNCHES__` registry on `globalThis`. See\n * <c>skills/cross-app-deep-linking.md</c>.\n */\nexport const LAUNCH_CONTEXT = new InjectionToken<Signal<LaunchContext | null>>('LAUNCH_CONTEXT');\n\n/**\n * Detail payload of the <c>flyos:launch</c> window CustomEvent. The shell\n * dispatches one event per launch; remotes use this contract to navigate to the\n * requested route. Mirrored to <see cref=\"FlyosPendingLaunchesGlobalKey\"/> so a\n * remote that mounts AFTER the dispatch can still drain the most recent launch.\n */\nexport interface FlyLaunchEventDetail {\n /** The id used to look up the app in the shell registry (post-canonicalization). */\n readonly appId: string;\n /** The launch payload — same shape the shell stores on the per-window signal. */\n readonly ctx: LaunchContext;\n}\n\n/**\n * Name of the window CustomEvent the shell dispatches per launch.\n *\n * Listeners run on `window` and receive a <c>CustomEvent<FlyLaunchEventDetail></c>.\n * Always filter by `detail.appId` — every remote sees every launch.\n */\nexport const FLYOS_LAUNCH_EVENT = 'flyos:launch';\n\n/**\n * `globalThis` key for the pending-launches registry. Map<appId, LaunchContext>.\n *\n * The shell writes the latest launch for each app and the corresponding remote\n * **drains** the entry on first mount (i.e. reads then deletes). This covers the\n * first-launch race where the event fires before the remote's listener attaches.\n * Subsequent re-launches into the already-mounted remote arrive via the event.\n */\nexport const FlyosPendingLaunchesGlobalKey = '__FLYOS_PENDING_LAUNCHES__' as const;\n\n/** Type of the `globalThis[FlyosPendingLaunchesGlobalKey]` registry. */\nexport type FlyosPendingLaunches = Record<string, LaunchContext>;\n","/**\n * Generic share / ACL panel models — hosts map domain DTOs to these shapes.\n *\n * v2.0.0: introduces the {@link SharePrincipal} discriminated union to replace the v1\n * \"set-which-is-set\" discriminator on {@link SharePermissionEntry} (`grantedToUserId` /\n * `grantedToOuId` / `grantedToAppId`). The new shape compiles invalid combinations away\n * (a permission row carries exactly one principal, never overlapping ids) and reserves\n * a `role` kind for the planned apps-chart role-as-principal flow.\n */\n\n/**\n * Discriminated principal that owns a share permission row. Hosts translate domain DTO\n * fields into one of these variants.\n *\n * The `role` variant is reserved for a follow-up enabling the Apps-chart role-as-principal\n * flow end-to-end (frontend looks up the role-OU UUID; backend's PermissionResolver must\n * enumerate the user's full OU set including computed-from-role memberships). Until that\n * runtime work lands, hosts SHOULD NOT emit `role` principals.\n */\nexport type SharePrincipal =\n | UserPrincipal\n | RolePrincipal\n | OuPrincipal\n | AppEveryonePrincipal;\n\nexport interface UserPrincipal {\n kind: 'user';\n /** Tenant-scoped user id. */\n userId: string;\n /** Display name resolved by the host (e.g. \"Jane Doe\"). Falls back to a Guid prefix. */\n displayName?: string;\n /** Optional email — surfaced as a secondary line on the row when set. */\n email?: string;\n}\n\nexport interface RolePrincipal {\n kind: 'role';\n /** Owning app id (e.g. `circles`). Roles are unique within an app, not globally. */\n appId: string;\n /** Stable role key within that app (e.g. `ffo`, `viewer`). */\n roleKey: string;\n displayName?: string;\n}\n\nexport interface OuPrincipal {\n kind: 'ou';\n ouId: string;\n /** Chart context for stable display labels. Null = the Default Company chart. */\n chartId?: string | null;\n displayName?: string;\n}\n\nexport interface AppEveryonePrincipal {\n kind: 'app-everyone';\n /** App id whose user population this grant targets. `*` = every tenant user. */\n appId: string;\n displayName?: string;\n}\n\n/** Principal-kind discriminator strings — re-exported for hosts that build menus dynamically. */\nexport type SharePrincipalKind = SharePrincipal['kind'];\n\n/**\n * One row of the share-panel permissions list. v2.0 carries a {@link SharePrincipal}\n * discriminated union instead of the v1 `grantedToUserId` / `grantedToOuId` / `grantedToAppId`\n * fields. See the file header for migration notes.\n */\nexport interface SharePermissionEntry {\n id: string;\n principal: SharePrincipal;\n level: string;\n isInherited?: boolean;\n /**\n * When true, this row is a deny grant — visually distinct, revokes access for the\n * principal regardless of any matching allow grant. Backed by the ACL semantic in\n * Files Manager (`FilePermission.IsDeny`) and Notes (`NoteShareLevel.Deny`).\n * Hosts that do not support deny grants may omit this field entirely.\n */\n isDeny?: boolean;\n}\n\nexport interface ShareUserResult {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n}\n\nexport interface ShareOuNode {\n id: string;\n displayName: string;\n /** 0 = root. When set, share panel indents rows for hierarchy. */\n depth?: number;\n}\n\n/** Option for OU tree source: `id` null = default/official org chart. */\nexport interface ShareOrgChartOption {\n id: string | null;\n name: string;\n /**\n * Stable system-chart key used by hosts that want to pre-select a specific platform-managed\n * chart (e.g. `'apps'`, `'default-company'`). Custom charts have no system key. Wired through\n * `defaultChartSystemKey` on share-panel / audience-builder so the host doesn't need to know\n * the tenant-specific Guid up front.\n */\n systemKey?: string | null;\n}\n\n/**\n * Stable identifiers for platform-managed system charts. Hosts that don't recognise the\n * value just fall through to the default selection — these constants are advisory.\n */\nexport const SHARE_ORG_CHART_SYSTEM_KEY_DEFAULT = 'default-company';\nexport const SHARE_ORG_CHART_SYSTEM_KEY_APPS = 'apps';\n\nexport interface SharePanelLevelOption {\n value: string;\n labelKey: string;\n}\n","/**\n * Canonical {@link AudienceFilter} TypeScript model — wire-compatible byte-for-byte with the\n * C# `Fly.Shared.Core.Audience.AudienceFilter` polymorphic record. The discriminator field is\n * `kind` and matches the values declared in `AudienceTerm.cs`'s `[JsonDerivedType]` attributes:\n * `users`, `roles`, `ou`, `app-everyone`, `chart`, `preset`.\n *\n * Resolution semantics (server-side, see `AudienceFilter.cs`):\n * 1. Each include term is expanded to a user-id set; sets are unioned.\n * 2. Each exclude term is expanded; the union of excludes is subtracted.\n * 3. Inactive users are filtered when {@link AudienceOptions.excludeInactiveUsers} is true.\n *\n * **Empty `includes` resolves to the empty set — never \"everyone\".** To target every user in a\n * tenant, emit an explicit {@link AppEveryoneTerm} or {@link ChartTerm}; this matches the\n * defensive backend default and prevents a UI bug from broadcasting tenant-wide.\n */\nexport interface AudienceFilter {\n /** At least one term required server-side; an empty array resolves to zero recipients. */\n includes: AudienceTerm[];\n /** Optional. Subtracted from the include union. */\n excludes?: AudienceTerm[];\n /** Optional resolver options. Server applies defaults when omitted. */\n options?: AudienceOptions;\n}\n\n/** Tagged union of the six supported audience term kinds. */\nexport type AudienceTerm =\n | UsersTerm\n | RolesTerm\n | OuTerm\n | AppEveryoneTerm\n | ChartTerm\n | PresetTerm;\n\nexport type AudienceTermKind = AudienceTerm['kind'];\n\n/** Discriminator string values — re-exported so hosts can build kind menus dynamically. */\nexport const AUDIENCE_TERM_KINDS = [\n 'users',\n 'roles',\n 'ou',\n 'app-everyone',\n 'chart',\n 'preset',\n] as const satisfies readonly AudienceTermKind[];\n\n/**\n * Runtime values for {@link AudiencePresetKind}. Hosts iterate this when surfacing a\n * preset picker; the type union mirrors this list 1:1.\n */\nexport const AUDIENCE_PRESETS = [\n 'self',\n 'ou-managers',\n 'direct-reports',\n] as const satisfies readonly AudiencePresetKind[];\n\n/** Explicit user ids. Capped server-side at {@link AUDIENCE_LIMITS.maxUserIdsPerTerm}. */\nexport interface UsersTerm {\n kind: 'users';\n /** Tenant-scoped user ids. */\n userIds: string[];\n}\n\n/**\n * Users holding any of the named roles in a single owning app. Roles are matched by\n * `(appId, key)` and filtered to active rows by the manifest spec — deprecated roles never\n * expand into the audience. RoleKeys are unique within an app, not globally.\n */\nexport interface RolesTerm {\n kind: 'roles';\n /** The role's owning app id (e.g. `circles`). */\n appId: string;\n /** Role keys within that app (e.g. `[\"ffo\", \"ops\"]`). */\n roleKeys: string[];\n}\n\n/**\n * Members of one or more OUs. `chartId` null = the Default Company chart; non-null targets\n * an alternative chart (including the Apps Chart). When `includeDescendants` is true, members\n * of all descendant OUs are included (resolved server-side via a recursive CTE).\n *\n * `includeDescendants` is required (not optional) so the wire round-trip is unambiguous: a\n * stored term that was previously emitted with `false` deserialises identically to one emitted\n * fresh, and the backend never has to choose between \"missing\" and \"explicit false\". Builders\n * MUST emit a definite boolean.\n */\nexport interface OuTerm {\n kind: 'ou';\n ouIds: string[];\n /**\n * Chart context for descendant traversal; null = default tree by parent id. Use `null`\n * (never `undefined`) to keep wire shape symmetric with C# `Guid?` deserialization.\n */\n chartId: string | null;\n includeDescendants: boolean;\n}\n\n/**\n * \"All users of this app in this tenant\" — semantically the Apps Chart app-root OU. Resolved\n * from `UserRole` rows joined to active roles owned by the app, never from a materialized\n * member list. `appId === '*'` means every tenant user.\n */\nexport interface AppEveryoneTerm {\n kind: 'app-everyone';\n appId: string;\n}\n\n/**\n * \"Every user placed somewhere in this chart\". For the Default Company chart this is every\n * user with at least one OU membership.\n */\nexport interface ChartTerm {\n kind: 'chart';\n chartId: string;\n}\n\n/**\n * Named platform preset evaluated against an anchor user. Anchor is typically the request\n * initiator (`Self`) or a referenced user (e.g. delegate's manager).\n */\nexport interface PresetTerm {\n kind: 'preset';\n preset: AudiencePresetKind;\n anchorUserId: string;\n}\n\n/**\n * Supported audience presets. Kept intentionally small — wire matches C# `JsonStringEnumMemberName`.\n */\nexport type AudiencePresetKind = 'self' | 'ou-managers' | 'direct-reports';\n\nexport interface AudienceOptions {\n /** When true (default), users with `IsActive=false` are filtered out. */\n excludeInactiveUsers?: boolean;\n /** Caller-supplied ceiling. Server clamps to {@link AUDIENCE_LIMITS.maxResolvedUsers}. */\n hardCap?: number;\n}\n\n/**\n * Hard caps mirrored from `AudienceLimits.cs`. Hosts use these for client-side validation\n * before submit — backend re-validates regardless. Keep these in sync with the C# constants.\n */\nexport const AUDIENCE_LIMITS = {\n maxTermsPerFilter: 64,\n maxUserIdsPerTerm: 500,\n maxRoleKeysPerTerm: 64,\n maxOuIdsPerTerm: 32,\n maxResolvedUsers: 10_000,\n} as const;\n","import { Injectable, computed, signal } from '@angular/core';\nimport { User } from '../models/user.model';\n\ninterface AuthSession {\n user: User;\n accessToken: string;\n expiresAt: number;\n}\n\n/**\n * Shared AuthService for Business Apps.\n *\n * This is a **read-only signal store** — Business Apps inject it to read the\n * current user and access token. The FlyOS shell populates it after PKCE login\n * and silent refresh. Business Apps must never call setSession() directly.\n *\n * When running as a Module Federation remote, the shell and the Business App\n * share this singleton via the `@mohamedatia/fly-design-system` shared mapping\n * in federation.config.js — so the shell's populated instance is the same\n * object the Business App reads.\n *\n * When running standalone (without the shell), call initFromToken() with a\n * JWT stored in localStorage to hydrate the user.\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthService {\n private _session = signal<AuthSession | null>(null);\n\n readonly currentUser = computed(() => this._session()?.user ?? null);\n readonly accessToken = computed(() => this._session()?.accessToken ?? null);\n readonly isAuthenticated = computed(() => {\n const s = this._session();\n return s !== null && s.expiresAt > Date.now();\n });\n\n /**\n * No-op when running as a Module Federation remote — the shell has already\n * initialised the session before the remote bootstraps. Business Apps call\n * this in their APP_INITIALIZER so the same code works in both standalone\n * and embedded modes without branching.\n */\n async init(): Promise<void> {}\n\n /**\n * Called by the shell after a successful login or silent refresh.\n * Business Apps should not call this directly.\n */\n setSession(user: User, accessToken: string, expiresAt: number): void {\n this._session.set({ user, accessToken, expiresAt });\n }\n\n /** Clears the in-memory session (called by the shell on logout). */\n clearSession(): void {\n this._session.set(null);\n }\n\n /**\n * Standalone mode: parse a JWT from localStorage and hydrate the user.\n * Pass the storage key your app uses; embedded remotes typically set this in `APP_INITIALIZER`.\n */\n initFromToken(storageKey = 'circles_token'): void {\n const token = localStorage.getItem(storageKey);\n if (!token) return;\n try {\n const base64 = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/');\n const payload = JSON.parse(decodeURIComponent(\n atob(base64).split('').map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join('')\n )) as Record<string, unknown>;\n\n const rawRole = payload['role'];\n const roles = Array.isArray(rawRole) ? rawRole as string[] : rawRole ? [rawRole as string] : [];\n const rawApps = payload['apps'];\n const apps = Array.isArray(rawApps) ? rawApps as string[] : rawApps ? [rawApps as string] : [];\n const name = (payload['name'] as string) ?? '';\n const nameParts = name.split(' ');\n\n const user: User = {\n id: (payload['sub'] as string) ?? '',\n tenantId: (payload['tenant_id'] as string) ?? (payload['tid'] as string) ?? null,\n email: (payload['email'] as string) ?? '',\n fullName: name,\n firstName: nameParts[0] ?? '',\n lastName: nameParts.slice(1).join(' '),\n preferredLocale: (payload['locale'] as string) ?? 'en',\n roles,\n apps,\n ou: payload['ou'] as string | undefined,\n };\n\n const expiresAt = ((payload['exp'] as number) ?? 0) * 1000;\n this.setSession(user, token, expiresAt);\n } catch {\n // Invalid token — stay unauthenticated\n }\n }\n}\n","import { Injectable, computed, signal, inject, ErrorHandler } from '@angular/core';\n\n/** Locales that use RTL layout for `dir` and DS `isRtl` / `direction`. */\nexport const RTL_LOCALE_SET: ReadonlySet<string> = new Set(['ar', 'ur']);\n\nexport function isRtlLocale(lang: string): boolean {\n return RTL_LOCALE_SET.has(lang);\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Accepts flat or nested JSON objects; nested keys become dot paths. Rejects arrays and non-string leaves. */\nfunction normalizeLocaleJson(raw: unknown): Record<string, string> {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n throw new Error('Locale bundle must be a JSON object');\n }\n const out: Record<string, string> = {};\n const walk = (obj: Record<string, unknown>, prefix: string): void => {\n for (const [k, v] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${k}` : k;\n if (typeof v === 'string') {\n out[path] = v;\n } else if (v !== null && typeof v === 'object' && !Array.isArray(v)) {\n walk(v as Record<string, unknown>, path);\n } else {\n throw new Error(`Locale bundle invalid value at \"${path}\" (expected string or nested object)`);\n }\n }\n };\n walk(raw as Record<string, unknown>, '');\n return out;\n}\n\n/** Options for loading a remote or standalone locale JSON bundle. */\nexport interface LoadBundleOptions {\n /** Stable id (e.g. app id from manifest); later loads replace this bundle only. */\n id: string;\n /** Base URL ending with `/`, e.g. `https://app.example.com/locale/` or `/my-remote/locale/` */\n baseUrl: string;\n lang: string;\n /** When aborted, failures are ignored (e.g. superseded language load). */\n signal?: AbortSignal;\n /**\n * When true, fetch/parse failures are not reported via Angular `ErrorHandler`.\n * Use for optional remote locale bundles (e.g. federated apps that may be offline).\n */\n silent?: boolean;\n}\n\n/**\n * Shared I18nService for the shell and Business Apps.\n *\n * **Merge order** (later keys win): shell layer → remote bundles in registration order.\n *\n * - Shell: `setShellTranslations()` after loading `locale/{lang}.json` and API overrides.\n * - Remotes: `loadBundle()` per manifest `localeBaseUrl`.\n */\n@Injectable({ providedIn: 'root' })\nexport class I18nService {\n private readonly errorHandler = inject(ErrorHandler, { optional: true });\n\n private readonly _shell = signal<Record<string, string>>({});\n private readonly _bundles = signal<Record<string, Record<string, string>>>({});\n private readonly _bundleOrder = signal<string[]>([]);\n private readonly _locale = signal<string>('en');\n private readonly _version = signal(0);\n\n private readonly _merged = computed(() => {\n const shell = this._shell();\n const order = this._bundleOrder();\n const bundles = this._bundles();\n let out: Record<string, string> = { ...shell };\n for (const id of order) {\n const b = bundles[id];\n if (b) out = { ...out, ...b };\n }\n return out;\n });\n\n readonly locale = this._locale.asReadonly();\n readonly version = this._version.asReadonly();\n readonly isRtl = computed(() => isRtlLocale(this._locale()));\n readonly direction = computed(() => (isRtlLocale(this._locale()) ? 'rtl' : 'ltr'));\n\n private bump(): void {\n this._version.update((v) => v + 1);\n }\n\n /** Replace shell strings (desktop `locale/*.json` + `/api/i18n/desktop-shell/{lang}` merged by the shell). */\n setShellTranslations(data: Record<string, string>, lang: string): void {\n this._shell.set(data);\n this._locale.set(lang);\n this.bump();\n }\n\n setLanguage(lang: string): void {\n this._locale.set(lang);\n this.bump();\n }\n\n /**\n * Fetch `{baseUrl}{lang}.json` and store under `id`. New ids are appended to the merge order.\n * @returns whether the bundle was loaded successfully.\n */\n async loadBundle(opts: LoadBundleOptions): Promise<boolean> {\n const { id, baseUrl, lang, signal: abortSignal, silent } = opts;\n try {\n const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;\n const url = `${base}${lang}.json`;\n const resp = await fetch(url, { signal: abortSignal });\n if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n const data = normalizeLocaleJson(await resp.json());\n if (abortSignal?.aborted) return false;\n this._bundles.update((b) => ({ ...b, [id]: data }));\n this._bundleOrder.update((order) => (order.includes(id) ? order : [...order, id]));\n this._locale.set(lang);\n this.bump();\n return true;\n } catch (e) {\n if (abortSignal?.aborted) return false;\n if (!silent) this.errorHandler?.handleError(e);\n return false;\n }\n }\n\n removeBundle(id: string): void {\n this._bundles.update((b) => {\n const next = { ...b };\n delete next[id];\n return next;\n });\n this._bundleOrder.update((order) => order.filter((x) => x !== id));\n this.bump();\n }\n\n clearRemoteBundles(): void {\n this._bundles.set({});\n this._bundleOrder.set([]);\n this.bump();\n }\n\n t(key: string, params?: Record<string, string | number>): string {\n const val = this._merged()[key] ?? key;\n if (!params) return val;\n return Object.entries(params).reduce((result, [k, v]) => {\n const safe = escapeRegExp(k);\n return result.replace(new RegExp(`{{\\\\s*${safe}\\\\s*}}`, 'g'), String(v));\n }, val);\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Injectable, inject, PLATFORM_ID, signal } from '@angular/core';\n\n/** Single source of truth for persisted / API theme strings. */\nexport const FLY_THEME_MODE_IDS = ['light', 'dark'] as const;\n\nexport type FlyThemeMode = (typeof FLY_THEME_MODE_IDS)[number];\n\n/** Factory default: `dark` (opaque dark / `html.dark-theme`); shell i18n `settings.theme.dark`. Keep in sync with `UserSettings` defaults. */\nexport const DEFAULT_FLY_THEME_MODE: FlyThemeMode = 'dark';\n\n/** Coerce unknown values (localStorage, API) to a valid theme mode. */\nexport function normalizeFlyTheme(value: unknown): FlyThemeMode {\n if (typeof value === 'string' && (FLY_THEME_MODE_IDS as readonly string[]).includes(value)) {\n return value as FlyThemeMode;\n }\n return DEFAULT_FLY_THEME_MODE;\n}\n\n/**\n * Applies `html.light-theme` / `html.dark-theme` for DS SCSS.\n * Shell and standalone Business Apps use the same service (federation singleton when shared).\n */\n@Injectable({ providedIn: 'root' })\nexport class FlyThemeService {\n private readonly platformId = inject(PLATFORM_ID);\n\n readonly theme = signal<FlyThemeMode>(DEFAULT_FLY_THEME_MODE);\n\n applyTheme(mode: FlyThemeMode): void {\n this.theme.set(mode);\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const html = document.documentElement;\n html.classList.remove('light-theme', 'dark-theme');\n if (mode === 'dark') {\n html.classList.add('dark-theme');\n } else {\n html.classList.add('light-theme');\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\n/** Options for opening a child window. */\nexport interface OpenWindowOptions {\n /** Unique identifier for the window instance. */\n windowId: string;\n /** Display title shown in the window chrome. */\n title: string;\n /** Route path or URL to load inside the window. */\n route: string;\n /** Initial width in pixels. Defaults to 900. */\n width?: number;\n /** Initial height in pixels. Defaults to 600. */\n height?: number;\n /** Whether the window can be resized. Defaults to true. */\n resizable?: boolean;\n /** Whether the window can be maximised. Defaults to true. */\n maximizable?: boolean;\n /** Arbitrary data passed to the child window via WINDOW_DATA. */\n data?: unknown;\n}\n\n/**\n * Abstract interface for the WindowManager.\n * The FlyOS shell provides the concrete implementation; Business Apps\n * inject this token to open, close, and focus windows without depending\n * on the shell's internal implementation.\n */\nexport abstract class WindowManagerService {\n abstract openChildWindow(options: OpenWindowOptions): void;\n abstract closeWindow(windowId: string): void;\n abstract focusWindow(windowId: string): void;\n\n /**\n * Shell: increments per-window depth and shows content block UI.\n * Standalone / no host: no-op.\n */\n beginContentUiBlock(_windowId: string, _messageKey?: string): void {}\n\n /** Shell: decrements depth; clears block when depth reaches 0. Standalone: no-op. */\n endContentUiBlock(_windowId: string): void {}\n}\n\n/**\n * No-op fallback implementation used when running a Business App in\n * standalone mode (outside the FlyOS shell). Logs a warning instead of\n * throwing so standalone dev/test flows are not broken.\n */\n@Injectable()\nexport class StandaloneWindowManagerService extends WindowManagerService {\n openChildWindow(options: OpenWindowOptions): void {\n console.warn('[WindowManagerService] openChildWindow called in standalone mode — no shell available.', options);\n }\n\n closeWindow(windowId: string): void {\n console.warn('[WindowManagerService] closeWindow called in standalone mode — no shell available.', windowId);\n }\n\n focusWindow(windowId: string): void {\n console.warn('[WindowManagerService] focusWindow called in standalone mode — no shell available.', windowId);\n }\n}\n\n","import { InjectionToken, Type } from '@angular/core';\n\n/**\n * One row in a remote's route table. Mirrors Angular's `Route` interface but\n * pared down to what the FlyOS-embedded router actually supports — synchronous\n * component refs only (no `loadChildren`, no resolvers/guards).\n *\n * Patterns:\n * '' — matches an empty URL (\"/\")\n * 'signals' — exact static segment\n * 'signals/:id' — `:foo` captures any single segment into `params.foo`\n * 'signals/:id/edit' — mixed static + capture segments\n *\n * `data` is an opaque bag the consumer can read from `router.matchedRoute()?.data`.\n */\nexport interface FlyRemoteRoute {\n readonly path: string;\n readonly component: Type<unknown>;\n readonly data?: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Result of matching the current `segments` against a remote's route table.\n * `params` contains captured `:foo` segments — empty object for paths with no\n * captures.\n */\nexport interface FlyRemoteMatch {\n readonly route: FlyRemoteRoute;\n readonly params: Readonly<Record<string, string>>;\n}\n\n/**\n * Optional injection token a remote provides at its root to declare which routes\n * `<fly-remote-router-outlet>` should resolve. Provided WITHIN the remote (not\n * the shell), e.g.:\n *\n * ```ts\n * @Component({\n * providers: [\n * FlyRemoteRouter,\n * { provide: FLY_REMOTE_ROUTES, useValue: CIRCLES_ROUTES },\n * ],\n * })\n * export class CirclesComponent { }\n * ```\n *\n * If no routes are provided, `FlyRemoteRouter.matchedRoute()` is always `null`\n * and the outlet renders nothing — useful for remotes that don't need internal\n * routing.\n */\nexport const FLY_REMOTE_ROUTES = new InjectionToken<readonly FlyRemoteRoute[]>(\n 'FLY_REMOTE_ROUTES',\n);\n\n/**\n * Optional injection token a remote provides at its root to declare the shell\n * mount path prefix (e.g. `'/desktop'`). When set, `FlyRemoteRouter.segments()`\n * strips this prefix from `window.location.pathname` before matching routes.\n *\n * **Why this is needed:** In embedded mode the remote is loaded via\n * `NgComponentOutlet` inside the shell SPA. The shell's own Angular route may\n * leave `window.location.pathname` as `/desktop` (or any shell-level path).\n * Without stripping that prefix, `segments()` returns `['desktop']` which\n * matches none of the remote's Circles-internal routes (e.g. `''`, `'signals'`,\n * `'signals/:id'`), so `<fly-remote-router-outlet>` renders nothing.\n *\n * **Default behaviour (token absent):** `FlyRemoteRouter` initialises `_url`\n * to `'/'` in embedded mode, completely ignoring `window.location.pathname`.\n * This is safe because the shell does not push the remote's logical URL into\n * browser history — only `navigate()` / `navigateByUrl()` calls do.\n *\n * **Usage in a remote root component:**\n * ```ts\n * providers: [\n * FlyRemoteRouter,\n * { provide: FLY_REMOTE_ROUTES, useValue: MY_ROUTES },\n * { provide: FLY_REMOTE_BASE_PATH, useValue: '/desktop' },\n * ]\n * ```\n *\n * With `basePath = '/desktop'` and `window.location.pathname = '/desktop'`,\n * the stripped URL is `'/'` → `segments() = []` → matches the `''` default\n * route. With pathname `'/desktop/signals/abc'`, segments become\n * `['signals', 'abc']` → matches `'signals/:id'`.\n *\n * Available since design-system **2.7.2**.\n */\nexport const FLY_REMOTE_BASE_PATH = new InjectionToken<string>(\n 'FLY_REMOTE_BASE_PATH',\n);\n\n/**\n * Match a route's path pattern against URL segments. Returns the captured params\n * map on a successful match, or `null` if the pattern can't match. Empty path\n * matches only an empty segments array.\n *\n * Exported for unit testing — most consumers should rely on\n * `FlyRemoteRouter.matchedRoute()`.\n */\nexport function matchFlyRoutePattern(\n pattern: string,\n segments: readonly string[],\n): Record<string, string> | null {\n const patternSegments = pattern.split('/').filter(Boolean);\n if (patternSegments.length !== segments.length) return null;\n\n const params: Record<string, string> = {};\n for (let i = 0; i < patternSegments.length; i++) {\n const p = patternSegments[i];\n const s = segments[i];\n if (p.startsWith(':')) {\n params[p.slice(1)] = decodeURIComponent(s);\n } else if (p !== s) {\n return null;\n }\n }\n return params;\n}\n","import { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';\nimport {\n NavigationEnd,\n NavigationExtras,\n Router,\n} from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { WINDOW_DATA } from '../models/window.model';\nimport {\n FLY_REMOTE_BASE_PATH,\n FLY_REMOTE_ROUTES,\n FlyRemoteMatch,\n matchFlyRoutePattern,\n} from './fly-remote-router.types';\n\n/**\n * FlyOS standard navigation surface for Business / Supporting App remotes.\n *\n * Problem this solves\n * -------------------\n * A federated remote ships with its own Angular `Routes` table that works\n * perfectly in **standalone** mode (e.g. `http://localhost:7202/signals/:id`).\n * Once the same remote is mounted inside the FlyOS desktop shell via\n * `*ngComponentOutlet`, `inject(Router)` resolves to the **host shell's**\n * Router — which has no knowledge of `/signals/:id`. Calls like\n * `router.navigate(['/signals', id])` then silently no-op and the click\n * \"does nothing.\"\n *\n * The fix\n * -------\n * Inject `FlyRemoteRouter` instead of `Router`. It mirrors `Router.navigate` /\n * `Router.navigateByUrl` and:\n *\n * - **Standalone** (no `WINDOW_DATA`): delegates to the real Angular Router,\n * so the URL bar, browser back button, and `RouterLink` continue to work\n * exactly as before.\n * - **Embedded** (mounted in the shell via `WINDOW_DATA`): writes the target\n * URL to an internal signal (`url`, `segments`) and does **not** touch the\n * host's Router. The remote's root component watches the signal and renders\n * the right view (typically a `@switch` on the first segment, plus an inline\n * overlay for detail pages).\n *\n * Usage in a list page\n * --------------------\n * ```ts\n * private readonly router = inject(FlyRemoteRouter);\n *\n * openDetail(item: Signal): void {\n * this.router.navigate(['/signals', item.id]); // works in both modes\n * }\n * ```\n *\n * Usage in the remote's root component (embedded dispatcher)\n * ----------------------------------------------------------\n * ```ts\n * private readonly router = inject(FlyRemoteRouter);\n *\n * readonly view = computed(() => {\n * if (!this.router.isEmbedded) return null; // standalone: <router-outlet> handles it\n * const [head, id] = this.router.segments();\n * if (head === 'signals' && id) return { kind: 'signal-detail', id };\n * if (head === 'signals') return { kind: 'signals-list' };\n * return { kind: head ?? 'home' };\n * });\n * ```\n *\n * Notes\n * -----\n * - `WINDOW_DATA` is the canonical \"I am running inside the shell\" marker; the\n * shell provides it per window, and it is `null` everywhere else.\n * - `Router` is injected as `optional`. A remote that does not register a Router\n * (e.g. a tiny chromeless utility app) still gets a working `navigate` that\n * updates the `url` signal in embedded mode.\n */\n@Injectable({ providedIn: 'root' })\nexport class FlyRemoteRouter {\n private readonly windowData = inject(WINDOW_DATA, { optional: true });\n private readonly router = inject(Router, { optional: true });\n /**\n * Optional route table — if the remote provides `FLY_REMOTE_ROUTES`,\n * `matchedRoute` / `params` resolve against it. Unset means the consumer is\n * driving its own switch/template — `matchedRoute` stays `null`.\n */\n private readonly routes = inject(FLY_REMOTE_ROUTES, { optional: true }) ?? [];\n /**\n * Shell mount path prefix to strip from `window.location.pathname` when\n * deriving the initial URL in embedded mode. See `FLY_REMOTE_BASE_PATH` docs.\n *\n * When absent (the common case), the embedded router initialises `_url` to\n * `'/'` and ignores `window.location.pathname` entirely — correct because the\n * shell SPA never encodes the remote's logical route into the browser URL.\n */\n private readonly basePath = inject(FLY_REMOTE_BASE_PATH, { optional: true }) ?? null;\n\n /**\n * True when this remote is rendered inside the FlyOS desktop shell.\n *\n * Detection order:\n * 1. `WINDOW_DATA` is provided — the canonical signal, works when the\n * design-system module is genuinely shared via Native Federation's\n * `sharedMappings` and the InjectionToken identity matches.\n * 2. `globalThis.__FLYOS_SHELL__ === true` — set by the shell's `main.ts`\n * before `initFederation`. A plain JS global is shared across all\n * module instances in the same browser context, so this works even\n * when the InjectionToken splits between host and remote bundles\n * (a known Native Federation edge case).\n */\n readonly isEmbedded: boolean =\n this.windowData != null\n || (typeof globalThis !== 'undefined'\n && (globalThis as { __FLYOS_SHELL__?: boolean }).__FLYOS_SHELL__ === true);\n\n private readonly _url = signal<string>('/');\n\n /**\n * Current logical URL of the remote — `/signals/abc` etc.\n *\n * Standalone: mirrors `Router.url` and is updated on every `NavigationEnd`.\n * Embedded: updated by `navigate` / `navigateByUrl` only.\n */\n readonly url = this._url.asReadonly();\n\n /**\n * `url` parsed into path segments, e.g. `'/signals/abc'` → `['signals', 'abc']`.\n * Query string and hash are stripped. Empty segments removed.\n */\n readonly segments = computed<readonly string[]>(() => {\n const u = this._url();\n return u.split('?')[0].split('#')[0].split('/').filter(Boolean);\n });\n\n /**\n * First route from `FLY_REMOTE_ROUTES` whose pattern matches `segments()`,\n * paired with its captured params. `null` when no routes are registered or\n * none matches. Used by `<fly-remote-router-outlet>` to pick what to render.\n *\n * Match order: routes are tried in declaration order. Put more specific\n * patterns (e.g. `'signals/:id'`) before catch-alls.\n */\n readonly matchedRoute = computed<FlyRemoteMatch | null>(() => {\n const segs = this.segments();\n for (const route of this.routes) {\n const params = matchFlyRoutePattern(route.path, segs);\n if (params != null) return { route, params };\n }\n return null;\n });\n\n /**\n * Captured route params from the active route, e.g. `{ id: 'abc' }` for a\n * `'signals/:id'` match on `/signals/abc`. Empty object if no route matched\n * or the matched route has no captures.\n *\n * Components can read this directly:\n * ```ts\n * private readonly flyRouter = inject(FlyRemoteRouter);\n * readonly signalId = computed(() => this.flyRouter.params()['id'] ?? '');\n * ```\n */\n readonly params = computed<Readonly<Record<string, string>>>(() =>\n this.matchedRoute()?.params ?? {},\n );\n\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n if (!this.isEmbedded && this.router) {\n // Standalone: seed from Angular Router and track NavigationEnd events so\n // browser back/forward (which the host Router handles) keep segments() current.\n this._url.set(this.router.url);\n this.router.events\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (event instanceof NavigationEnd) {\n this._url.set(event.urlAfterRedirects);\n }\n });\n } else if (this.isEmbedded) {\n // Embedded: the shell SPA keeps its own route in window.location.pathname\n // (e.g. '/desktop') which is meaningless for the remote's route table.\n // Default: initialise to '/' so the remote's empty-path default route\n // matches on first render. When FLY_REMOTE_BASE_PATH is provided, strip\n // it from pathname first — useful if the shell does push a remote-aware\n // URL (e.g. '/desktop/signals/abc' with basePath '/desktop').\n if (typeof window !== 'undefined') {\n const rawPath = window.location.pathname || '/';\n const initialUrl = this._resolveEmbeddedInitialUrl(rawPath);\n this._url.set(initialUrl);\n\n // Listen for browser back/forward so segments() stays in sync with\n // history entries pushed by navigate() / navigateByUrl().\n const onPopState = (event: PopStateEvent): void => {\n const state = event.state as { flyRemoteUrl?: string } | null;\n // Prefer the URL we stashed in the history state; fall back to pathname.\n const url = state?.flyRemoteUrl ?? window.location.pathname ?? '/';\n this._url.set(url.startsWith('/') ? url : '/' + url);\n };\n\n window.addEventListener('popstate', onPopState);\n\n // Defensive cleanup — the service is providedIn: 'root' so this fires\n // only when the whole Angular app is destroyed, but it keeps things tidy.\n this.destroyRef.onDestroy(() => {\n window.removeEventListener('popstate', onPopState);\n });\n }\n }\n }\n\n /**\n * Navigate to a route, identified by an array of commands as you would pass\n * to Angular's `Router.navigate`. In embedded mode `extras` is ignored — the\n * shell owns history and query-param handling for the window's URL.\n */\n navigate(commands: readonly unknown[], extras?: NavigationExtras): Promise<boolean> {\n if (!this.isEmbedded && this.router) {\n // Standalone: Angular Router owns history — pushState semantics are the default.\n return this.router.navigate(commands as unknown[], extras);\n }\n const url = this.buildUrl(commands);\n this._pushEmbedded(url);\n return Promise.resolve(true);\n }\n\n /**\n * Navigate to a route given as a full URL string. Mirrors `Router.navigateByUrl`.\n */\n navigateByUrl(url: string, extras?: NavigationExtras): Promise<boolean> {\n if (!this.isEmbedded && this.router) {\n // Standalone: Angular Router owns history — pushState semantics are the default.\n return this.router.navigateByUrl(url, extras);\n }\n this._pushEmbedded(url.startsWith('/') ? url : '/' + url);\n return Promise.resolve(true);\n }\n\n /**\n * Convenience: pop the last two segments (the typical \"go back from detail\n * to list\" gesture). In standalone mode this falls through to `history.back()`\n * so the browser's back stack is respected.\n */\n back(): void {\n // Both modes: delegate to the browser's history stack. In embedded mode we\n // now push real history entries in navigate() / navigateByUrl(), so\n // history.back() triggers popstate and the listener updates segments().\n if (typeof history !== 'undefined') {\n history.back();\n }\n }\n\n /**\n * Resolve the logical URL to seed `_url` from on embedded initial load.\n *\n * - No basePath: always return `'/'`. The shell's SPA path (e.g. `/desktop`)\n * is irrelevant to the remote — `navigate()` is the only thing that should\n * move the remote's URL.\n * - basePath provided: strip it from `rawPath`. If rawPath starts with the\n * basePath, the remainder becomes the seed URL (normalised to start with\n * `'/'`). If it doesn't match (e.g. shell changed its own route), fall back\n * to `'/'` rather than surfacing shell-specific segments to the remote's\n * route table.\n */\n private _resolveEmbeddedInitialUrl(rawPath: string): string {\n if (!this.basePath) {\n // Default: ignore the shell's pathname, start at remote root.\n return '/';\n }\n const base = this.basePath.endsWith('/') ? this.basePath.slice(0, -1) : this.basePath;\n if (rawPath === base || rawPath === base + '/') {\n return '/';\n }\n if (rawPath.startsWith(base + '/')) {\n const remainder = rawPath.slice(base.length);\n return remainder.startsWith('/') ? remainder : '/' + remainder;\n }\n // Shell path doesn't begin with our basePath — fall through to root.\n return '/';\n }\n\n /**\n * In embedded mode: push a real browser history entry (so back/forward work)\n * and update the internal signal synchronously.\n *\n * The state object carries `flyRemoteUrl` so the popstate listener can\n * restore the exact URL without relying on window.location.pathname (which\n * could be the shell's route, not the remote's logical URL).\n */\n private _pushEmbedded(url: string): void {\n if (typeof history !== 'undefined') {\n history.pushState({ flyRemoteUrl: url }, '', url);\n }\n this._url.set(url);\n }\n\n private buildUrl(commands: readonly unknown[]): string {\n const parts = commands\n .map(c => (c == null ? '' : String(c)))\n .map(s => s.replace(/^\\/+|\\/+$/g, ''))\n .filter(Boolean);\n return '/' + parts.join('/');\n }\n}\n","import { InjectionToken, Injectable, inject } from '@angular/core';\n\n/**\n * Minimal adapter the shell (or any host) provides so design-system services can\n * look up apps without depending on `AppRegistryService` directly. Keeps the\n * design-system decoupled from shell internals — hosts wire this once at root.\n *\n * Shell wiring example:\n * ```ts\n * { provide: APP_LOOKUP, useFactory: () => {\n * const r = inject(AppRegistryService);\n * return { getById: id => { const a = r.getById(id); return a ? { id: a.id, name: a.name } : undefined; } };\n * } }\n * ```\n */\nexport interface AppLookupEntry {\n readonly id: string;\n readonly name: string;\n}\n\nexport interface AppLookup {\n getById(id: string): AppLookupEntry | undefined;\n}\n\nexport const APP_LOOKUP = new InjectionToken<AppLookup>('APP_LOOKUP');\n\n/**\n * Canonicalizes raw source-app identifiers and resolves display names.\n *\n * Problem this solves\n * -------------------\n * Backend services emit two different identifiers for the same app:\n * - JWT `client_id` (inter-service identity), e.g. `\"circles-service\"`.\n * - AppCatalog `id` (frontend identity), e.g. `\"circles\"`.\n *\n * Task rows, audit entries, notifications, etc. may carry either form depending\n * on which service wrote them and when. Every UI surface that renders the\n * source app needs the same canonicalization rule — without it, chips display\n * `\"circles-service\"` instead of the friendly `\"Circles\"`.\n *\n * Rule: try the raw id against the registry; if it misses and the id ends in\n * `-service`, retry with the suffix stripped. The first hit wins. Returns\n * `null` from `resolveId` when nothing matches, so callers can guard CTAs.\n */\n@Injectable({ providedIn: 'root' })\nexport class SourceAppResolver {\n private readonly lookup = inject(APP_LOOKUP, { optional: true });\n\n /** Returns the registry-resolvable canonical id, or `null` when neither form is registered. */\n resolveId(rawId: string | null | undefined): string | null {\n if (!rawId || !this.lookup) return null;\n if (this.lookup.getById(rawId)) return rawId;\n const canonical = rawId.replace(/-service$/, '');\n if (canonical !== rawId && this.lookup.getById(canonical)) return canonical;\n return null;\n }\n\n /**\n * Display name for the source app. Prefers the registry's localized name when\n * the id resolves; falls back to a title-cased canonical id (e.g.\n * `\"circles-service\"` → `\"Circles\"`) so chips never expose raw `-service`\n * client_ids even for apps not yet in the registry. Empty string for null/undefined.\n */\n resolveName(rawId: string | null | undefined): string {\n if (!rawId) return '';\n const id = this.resolveId(rawId);\n if (id) return this.lookup!.getById(id)!.name;\n const canonical = rawId.replace(/-service$/, '');\n return canonical.charAt(0).toUpperCase() + canonical.slice(1);\n }\n\n /** True when an open-in-source CTA is launchable: id resolves *and* there's a route. */\n canOpen(rawId: string | null | undefined, route: string | null | undefined): boolean {\n return this.resolveId(rawId) !== null && !!route;\n }\n}\n","/**\n * fly-remote-styles — Shell-layer CSS loader for Native Federation remotes.\n *\n * Problem\n * -------\n * Federated remotes only ship JS chunks via Native Federation — their global\n * `styles.css` (or its hashed equivalent) never loads in the shell, so any\n * global CSS selector (e.g. `.circles-overlay`) silently breaks in embedded\n * mode.\n *\n * Solution\n * --------\n * On first mount of each remote, the shell calls `loadRemoteStyles(appId,\n * remoteBaseUrl)`. This function:\n * 1. Derives the remote's `index.html` URL from `remoteBaseUrl`.\n * 2. Fetches it (one network round-trip per remote; browser-cached thereafter).\n * 3. Parses the HTML with DOMParser to extract the first\n * `<link rel=\"stylesheet\">` — the hashed production stylesheet\n * (e.g. `styles-ABC123.css`). This is Strategy (b): index.html discovery.\n * 4. Injects the stylesheet into `document.head` using one of two approaches\n * (see Injection approach below).\n *\n * Why strategy (b)?\n * -----------------\n * (a) Unhashed `styles.css` — requires remote build config changes (out of scope).\n * (b) Parse remote `index.html` — one tiny fetch per remote; browser caches it;\n * works today without any remote changes.\n * (c) `stylesUrl` in manifest/remoteEntry.json — cleanest long-term; requires\n * protocol change to every remote's CI pipeline (out of scope for Wave A1).\n *\n * Injection approach\n * ------------------\n * Preferred (Firefox 134+, Chrome 99+, Safari 17.2+):\n * `<link rel=\"stylesheet\" href=\"…\" crossorigin=\"anonymous\" layer=\"remote\">`\n *\n * The `layer` attribute on `<link>` is feature-detected once at module init via:\n * `'layer' in HTMLLinkElement.prototype`\n * If the attribute is supported, the shell injects a non-render-blocking `<link>`\n * element. The browser gets proper preload semantics and CORS headers flow through\n * the normal stylesheet pipeline.\n *\n * Fallback (browsers without `link[layer]` support):\n * `<style>@import url(\"…\") layer(remote);</style>`\n *\n * CSS Cascade Level 5: `@import url(\"…\") layer(remote)` is the ONLY valid way to\n * place an @import inside a named cascade layer when using the `<style>` approach.\n * The block-form `@layer remote { @import url(\"…\"); }` is INVALID CSS — the spec\n * forbids `@import` inside any block at-rule. Browsers silently drop such rules.\n *\n * Both code paths attach `data-fly-app` and `data-fly-href` attributes to the\n * injected element so idempotency checks work uniformly.\n *\n * Layer order declaration\n * -----------------------\n * A one-time `<style data-fly-layers>` element is prepended to `<head>` at module\n * init. It establishes the canonical layer order:\n * reset → designsystem → shell → remote → overrides\n * This guarantees that even if individual `@layer` blocks are injected in any\n * order at runtime, the cascade priority is always deterministic.\n *\n * CSP nonce propagation\n * ---------------------\n * If a `<meta name=\"csp-nonce\">` element is present, its content is read once at\n * module init and applied to every injected `<style>` or `<link>` element. If no\n * nonce meta is present, nothing is set (graceful degradation).\n *\n * URL validation\n * --------------\n * Discovered hrefs must be `http://`-, `https://`-, or `//`-prefixed. `javascript:`,\n * `data:`, and `blob:` are rejected outright. The href's origin must also match the\n * origin of `remoteBaseUrl` (same-origin as the remote), preventing a compromised\n * `index.html` from pointing at an attacker domain.\n *\n * Unload decision\n * ---------------\n * `unloadRemoteStyles` is exported for symmetry but should NOT be called on\n * normal window close. Keeping styles loaded across remounts avoids FOUC\n * flicker when the user reopens the same app. The stylesheet is a few KB; the\n * memory cost is negligible. Only call `unloadRemoteStyles` if you are certain\n * the remote will never be opened again in this session (e.g. licence revoke).\n *\n * Caveats\n * -------\n * - CORS: the remote's dev/prod server must serve `index.html` with a permissive\n * `Access-Control-Allow-Origin` header (or be same-origin via the YARP gateway).\n * The fetch uses `credentials: 'omit'` to avoid credential-carrying preflights.\n * - Fetch timeout: the index.html fetch is capped at 5 seconds. On timeout the\n * in-flight entry is cleared so a retry is possible on the next call.\n * - Race on rapid mount/unmount: if `loadRemoteStyles` is called a second time for\n * the same appId while the first fetch is still in-flight, the second call joins\n * the same in-flight Promise.\n * - Angular hashing: Angular's production build hashes the stylesheet filename.\n * DOMParser picks the first `<link rel=\"stylesheet\">` in `<head>`, which is the\n * single global stylesheet Angular emits. If a remote emits multiple stylesheets,\n * only the first is loaded — acceptable for Wave A1.\n */\n\n/**\n * Feature detection: does the browser support the `layer` attribute on\n * `<link>` elements? Probed once at module init.\n * Firefox 134+, Chrome 99+, Safari 17.2+ all ship this.\n */\nconst _linkLayerSupported: boolean =\n typeof HTMLLinkElement !== 'undefined' && 'layer' in HTMLLinkElement.prototype;\n\n/**\n * CSP nonce, read once from `<meta name=\"csp-nonce\">` at module init.\n * Applied to every injected `<style>` / `<link>` element. Null when absent.\n */\nconst _cspNonce: string | null =\n typeof document !== 'undefined'\n ? (document.querySelector<HTMLMetaElement>('meta[name=\"csp-nonce\"]')?.content ?? null)\n : null;\n\n/** In-flight fetch promises keyed by appId — prevents duplicate fetches. */\nconst _inFlight = new Map<string, Promise<string | null>>();\n\n// ---------------------------------------------------------------------------\n// Layer order — injected immediately at module init (synchronous, runs once).\n// ---------------------------------------------------------------------------\n(function _ensureLayerOrder(): void {\n if (typeof document === 'undefined') return; // SSR guard\n if (document.head.querySelector('style[data-fly-layers]')) return;\n\n const style = document.createElement('style');\n style.setAttribute('data-fly-layers', '');\n style.textContent = '@layer reset, designsystem, shell, remote, overrides;';\n if (_cspNonce) style.nonce = _cspNonce;\n // Prepend so this always precedes any other layer-bearing <style> blocks.\n document.head.insertBefore(style, document.head.firstChild);\n})();\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Discovers the hashed stylesheet href from the remote's `index.html`.\n * Applies a 5-second AbortController timeout. Clears `_inFlight` on abort so\n * a retry is possible. Returns `null` on any failure.\n */\nasync function _discoverStylesheetHref(appId: string, remoteBaseUrl: string): Promise<string | null> {\n const indexUrl = remoteBaseUrl.replace(/\\/$/, '') + '/index.html';\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n try {\n const res = await fetch(indexUrl, {\n credentials: 'omit',\n cache: 'default',\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n\n if (!res.ok) return null;\n const html = await res.text();\n const doc = new DOMParser().parseFromString(html, 'text/html');\n // Find the first stylesheet link in <head> — Angular emits exactly one.\n const link = doc.head.querySelector<HTMLLinkElement>('link[rel=\"stylesheet\"]');\n if (!link?.href) return null;\n // `link.href` from DOMParser resolves against `about:blank`. Use raw attribute.\n const rawHref = link.getAttribute('href') ?? '';\n if (!rawHref) return null;\n\n // Early-reject dangerous schemes before any URL resolution.\n // Without this guard, `javascript:alert(1)` would be rewritten to\n // `remoteBaseUrl/javascript:alert(1)` and silently pass origin validation.\n const rawLower = rawHref.toLowerCase();\n if (\n rawLower.startsWith('javascript:') ||\n rawLower.startsWith('data:') ||\n rawLower.startsWith('blob:')\n ) {\n console.warn(`[FlyOS] loadRemoteStyles: rejected unsafe stylesheet href \"${rawHref}\"`);\n return null;\n }\n\n // Resolve to absolute URL for origin validation.\n let resolvedHref: string;\n if (rawHref.startsWith('http://') || rawHref.startsWith('https://') || rawHref.startsWith('//')) {\n resolvedHref = rawHref;\n } else {\n resolvedHref = remoteBaseUrl.replace(/\\/$/, '') + '/' + rawHref.replace(/^\\//, '');\n }\n\n return _validateHref(resolvedHref, remoteBaseUrl);\n } catch {\n clearTimeout(timeoutId);\n // On abort or network error, clear in-flight so a retry is possible.\n _inFlight.delete(appId);\n return null;\n }\n}\n\n/**\n * Validates that a discovered href is safe to inject:\n * - Must be `http://`, `https://`, or `//`-prefixed (no `javascript:`, `data:`, `blob:`).\n * - Must share the same origin as `remoteBaseUrl`.\n *\n * Returns the href on success; logs a warning and returns `null` on failure.\n */\nfunction _validateHref(href: string, remoteBaseUrl: string): string | null {\n // Block dangerous schemes.\n const lower = href.toLowerCase();\n if (\n lower.startsWith('javascript:') ||\n lower.startsWith('data:') ||\n lower.startsWith('blob:')\n ) {\n console.warn(`[FlyOS] loadRemoteStyles: rejected unsafe stylesheet href \"${href}\"`);\n return null;\n }\n\n // Must be absolute (http/https/protocol-relative).\n if (\n !lower.startsWith('http://') &&\n !lower.startsWith('https://') &&\n !lower.startsWith('//')\n ) {\n console.warn(`[FlyOS] loadRemoteStyles: rejected non-absolute stylesheet href \"${href}\"`);\n return null;\n }\n\n // Origin must match remoteBaseUrl — prevents a compromised index.html from\n // redirecting styles at an attacker-controlled domain.\n try {\n const hrefOrigin = new URL(href.startsWith('//') ? 'https:' + href : href).origin;\n const remoteOrigin = new URL(remoteBaseUrl).origin;\n if (hrefOrigin !== remoteOrigin) {\n console.warn(\n `[FlyOS] loadRemoteStyles: rejected cross-origin stylesheet href \"${href}\" ` +\n `(expected origin \"${remoteOrigin}\", got \"${hrefOrigin}\")`\n );\n return null;\n }\n } catch {\n console.warn(`[FlyOS] loadRemoteStyles: could not parse href origin for \"${href}\"`);\n return null;\n }\n\n return href;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Injects the remote's stylesheet into `document.head`.\n *\n * @param appId - Stable identifier for the remote app (matches `DesktopApp.id`).\n * @param remoteBaseUrl - Base URL of the remote, e.g. `https://circles.example.com`\n * or `http://localhost:7202`. Must NOT include `/remoteEntry.json`.\n *\n * The call is idempotent:\n * - If an element with `data-fly-app=\"appId\"` whose `data-fly-href` matches the\n * discovered href already exists → no-op.\n * - If the href differs (hot upgrade) → existing element is replaced.\n * - If no stylesheet is found in `index.html` → no-op (logged as a warning).\n *\n * Injection shape (preferred — `link[layer]` supported):\n * <link rel=\"stylesheet\" data-fly-app=\"<appId>\" data-fly-href=\"<href>\"\n * href=\"<href>\" crossorigin=\"anonymous\" layer=\"remote\">\n *\n * Injection shape (fallback — `link[layer]` unsupported):\n * <style data-fly-app=\"<appId>\" data-fly-href=\"<href>\">\n * @import url(\"<href>\") layer(remote);\n * </style>\n *\n * The `data-fly-href` attribute stores the discovered href separately from the\n * element content so idempotency checks can compare the URL without parsing CSS.\n */\nexport async function loadRemoteStyles(appId: string, remoteBaseUrl: string): Promise<void> {\n if (typeof document === 'undefined') return; // SSR guard\n\n // Resolve relative remoteBaseUrl (e.g. '/circles-dev') against the current\n // page origin so all downstream URL operations (fetch, origin check) receive\n // an absolute URL. Absolute inputs are returned unchanged by new URL().\n const absoluteBase = new URL(remoteBaseUrl, location.href).href.replace(/\\/$/, '');\n\n // Kick off or join an in-flight fetch for this appId.\n // Note: _resolvedHref cache is intentionally absent — always re-discover so\n // the browser's HTTP cache handles cost (index.html is tiny) and hot-deploys\n // are picked up without a page reload.\n let fetchPromise = _inFlight.get(appId);\n if (!fetchPromise) {\n fetchPromise = _discoverStylesheetHref(appId, absoluteBase);\n _inFlight.set(appId, fetchPromise);\n }\n\n const href = await fetchPromise;\n _inFlight.delete(appId);\n\n if (!href) {\n console.warn(\n `[FlyOS] loadRemoteStyles: no stylesheet found in ${absoluteBase}/index.html for appId=\"${appId}\"`\n );\n return;\n }\n\n // Check both <link> and <style> selectors — handle upgrades from the old fallback path.\n const escapedId = CSS.escape(appId);\n const existing =\n document.head.querySelector<HTMLLinkElement | HTMLStyleElement>(\n `link[data-fly-app=\"${escapedId}\"], style[data-fly-app=\"${escapedId}\"]`\n );\n\n if (existing) {\n if (existing.getAttribute('data-fly-href') === href) return; // identical — no-op\n // Hot upgrade: remove old element (could be <link> or <style>) atomically.\n existing.remove();\n }\n\n if (_linkLayerSupported) {\n // Preferred path: non-render-blocking <link> with native layer= attribute.\n // Firefox 134+, Chrome 99+, Safari 17.2+ all support this.\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.setAttribute('data-fly-app', appId);\n link.setAttribute('data-fly-href', href);\n link.href = href;\n link.crossOrigin = 'anonymous';\n (link as unknown as Record<string, string>)['layer'] = 'remote';\n if (_cspNonce) link.nonce = _cspNonce;\n document.head.appendChild(link);\n } else {\n // Fallback path: <style> with @import layer(remote) for older browsers.\n // CSS Cascade Level 5: `@import url(\"…\") layer(remote)` is the only valid\n // way to place an @import inside a named cascade layer. Block-form\n // `@layer remote { @import … }` is invalid and silently dropped by browsers.\n const style = document.createElement('style');\n style.setAttribute('data-fly-app', appId);\n style.setAttribute('data-fly-href', href);\n style.textContent = `@import url(\"${href}\") layer(remote);`;\n if (_cspNonce) style.nonce = _cspNonce;\n document.head.appendChild(style);\n }\n}\n\n/**\n * Removes the injected stylesheet element (either `<link>` or `<style>`) for\n * `appId` from `document.head` and clears all internal state for this appId.\n *\n * NOTE: Prefer NOT calling this on normal window close — keeping styles loaded\n * prevents FOUC flicker when the user reopens the same app. Call only if you\n * are certain the remote will not be reopened in this session.\n */\nexport function unloadRemoteStyles(appId: string): void {\n if (typeof document === 'undefined') return; // SSR guard\n const escapedId = CSS.escape(appId);\n // Remove <link> element (preferred path) if present.\n document.head\n .querySelector(`link[data-fly-app=\"${escapedId}\"]`)\n ?.remove();\n // Remove <style> element (fallback path) if present.\n document.head\n .querySelector(`style[data-fly-app=\"${escapedId}\"]`)\n ?.remove();\n // Clear in-flight so a future call can retry.\n _inFlight.delete(appId);\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { FlyRemoteRouter } from '../../services/fly-remote-router.service';\n\n/**\n * Outlet for FlyOS-embedded routing. Renders the component associated with the\n * first matching route in the consumer's `FLY_REMOTE_ROUTES` table, reacting to\n * `FlyRemoteRouter.navigate(...)` calls.\n *\n * Use this **only in embedded mode**. Standalone remotes should keep their\n * `<router-outlet>` — `FlyRemoteRouter.navigate` delegates to Angular's Router\n * there, and this outlet would just shadow it.\n *\n * Recommended pattern in a remote's root component:\n * ```html\n * @if (router.isEmbedded) {\n * <fly-remote-router-outlet />\n * } @else {\n * <router-outlet />\n * }\n * ```\n *\n * Why both? Standalone keeps full Angular routing — query params, guards,\n * resolvers, lazy loading, RouterLink. Embedded gets a stripped-down\n * synchronous outlet that matches against the same route table the remote\n * declared via `FLY_REMOTE_ROUTES`. The same `router.navigate(['/foo', id])`\n * call works in both modes; only the rendering surface differs.\n *\n * Limitations vs. `<router-outlet>`:\n * - Synchronous components only (no `loadComponent` / `loadChildren`).\n * - No guards / resolvers / data resolution.\n * - No query-param / hash handling — only path segments.\n * - No `RouterLink` directive — use `(click)=\"router.navigate(...)\"`.\n *\n * Components rendered by this outlet read route params via `FlyRemoteRouter.params`:\n * ```ts\n * private readonly router = inject(FlyRemoteRouter);\n * readonly id = computed(() => this.router.params()['id'] ?? '');\n * ```\n */\n@Component({\n selector: 'fly-remote-router-outlet',\n standalone: true,\n imports: [NgComponentOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (matched(); as m) {\n <ng-container *ngComponentOutlet=\"m.route.component\" />\n }\n `,\n})\nexport class FlyRemoteRouterOutletComponent {\n private readonly router = inject(FlyRemoteRouter);\n\n /**\n * Read directly from FlyRemoteRouter so the outlet re-renders whenever the\n * URL changes (signal-based, OnPush-friendly).\n */\n readonly matched = this.router.matchedRoute;\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { I18nService } from '../services/i18n.service';\n\n/**\n * Translates a key using the shared I18nService.\n *\n * @example\n * {{ 'myApp.section.title' | translate }}\n * {{ 'myApp.items_count' | translate:{ n: count() } }}\n */\n@Pipe({\n name: 'translate',\n standalone: true,\n pure: false,\n})\nexport class TranslatePipe implements PipeTransform {\n private readonly i18n = inject(I18nService);\n\n transform(key: string, params?: Record<string, string | number>): string {\n // Read version so template CD re-runs when bundles load (merged translations updated).\n void this.i18n.version();\n return this.i18n.t(key, params);\n }\n}\n","import { Injectable, Signal, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { User } from '../models/user.model';\n\nexport interface MockAuthConfig {\n user: User;\n token?: string;\n loginRedirect?: string[];\n logoutRedirect?: string[];\n}\n\ninterface MockSession {\n accessToken: string;\n user: User;\n expiresAt: number;\n}\n\n/**\n * Shared mock AuthService base class for Business App developers.\n *\n * Extend this class in your app's `auth.service.mock.ts` and override\n * `getConfig()` to supply app-specific mock user data and navigation paths.\n * The subclass must be decorated with `@Injectable({ providedIn: 'root' })`\n * and exported as `AuthService` so Angular's `fileReplacements` swap works.\n *\n * @example\n * ```typescript\n * // src/app/core/services/auth.service.mock.ts\n * import { Injectable } from '@angular/core';\n * import { MockAuthService, type MockAuthConfig } from '@mohamedatia/fly-design-system';\n *\n * @Injectable({ providedIn: 'root' })\n * export class AuthService extends MockAuthService {\n * protected override getConfig(): MockAuthConfig {\n * return {\n * user: { id: 'dev-001', tenantId: 'dev-tenant', email: 'dev@example.com',\n * firstName: 'Dev', lastName: 'User', fullName: 'Dev User',\n * preferredLocale: 'en', roles: ['admin'], apps: ['my-app'] },\n * token: 'my-mock-token',\n * loginRedirect: ['/app'],\n * };\n * }\n * }\n * ```\n */\n@Injectable()\nexport class MockAuthService {\n private readonly router = inject(Router);\n\n protected readonly _session: ReturnType<typeof signal<MockSession | null>>;\n\n private readonly _config: MockAuthConfig;\n\n readonly isAuthenticated: Signal<boolean>;\n readonly currentUser: Signal<User | null>;\n readonly accessToken: Signal<string | null>;\n /** Always false in mock mode — 2FA is handled entirely by the STS. */\n readonly hasPendingTwoFactor: Signal<boolean>;\n /** Always false in mock mode — auth is pre-populated synchronously. */\n readonly initializing: Signal<boolean>;\n\n /**\n * Shell and guards may read this flag; real auth uses `localStorage` `fly_had_session`.\n * Default false — override in the app’s `auth.service.mock.ts` if needed.\n */\n get hadPriorSession(): boolean {\n return false;\n }\n\n constructor() {\n // All signal/computed calls are inside the constructor body so Angular's\n // injection context and ngDevMode are fully set up before they execute.\n this._config = this.getConfig();\n\n this._session = signal<MockSession | null>({\n accessToken: this._config.token ?? 'mock-token',\n user: this._config.user,\n expiresAt: Date.now() + 24 * 60 * 60 * 1000,\n });\n\n this.isAuthenticated = computed(() => {\n const s = this._session();\n return s !== null && s.expiresAt > Date.now();\n });\n\n this.currentUser = computed(() => this._session()?.user ?? null);\n this.accessToken = computed(() => this._session()?.accessToken ?? null);\n this.hasPendingTwoFactor = computed(() => false);\n this.initializing = signal(false).asReadonly();\n }\n\n /** Override in subclass to supply app-specific mock data. */\n protected getConfig(): MockAuthConfig {\n return {\n user: {\n id: 'mock-user-001',\n tenantId: 'mock-tenant-001',\n email: 'developer@fly.local',\n firstName: 'UI',\n lastName: 'Developer',\n fullName: 'UI Developer',\n preferredLocale: 'en',\n roles: ['admin'],\n apps: [],\n },\n };\n }\n\n async init(): Promise<void> {\n // Mock mode: already authenticated, nothing to initialize.\n }\n\n startLogin(): void {\n this.router.navigate(this._config.loginRedirect ?? ['/']);\n }\n\n handleCallback(_code: string, _state?: string): Observable<User> {\n return of(this._config.user);\n }\n\n async forceRefresh(): Promise<void> {\n // No-op in mock mode — token never expires.\n }\n\n patchSessionPreferredLocale(locale: string): void {\n const session = this._session();\n if (!session?.user) return;\n this._session.set({ ...session, user: { ...session.user, preferredLocale: locale } });\n }\n\n /** Parameter order matches the real AuthService: (user, accessToken, expiresAt). */\n setSession(_user: User, _accessToken: string, _expiresAt: number): void {\n // No-op in mock mode — session is hardcoded.\n }\n\n logout(): void {\n this._session.set(null);\n this.router.navigate(this._config.logoutRedirect ?? ['/']);\n }\n}\n","import {\n Component, input, output, HostListener, ViewChild, ElementRef,\n computed, signal, AfterViewInit, OnDestroy, ChangeDetectionStrategy, inject, DOCUMENT,\n} from '@angular/core';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\n\nexport interface ContextMenuItem {\n id: string;\n label: string;\n icon: string;\n}\n\nexport interface ContextMenuSection {\n label?: string;\n items: ContextMenuItem[];\n}\n\n@Component({\n selector: 'fly-context-menu',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: './context-menu.component.html',\n styleUrl: './context-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ContextMenuComponent implements AfterViewInit, OnDestroy {\n @ViewChild('contextMenu') private menuEl?: ElementRef<HTMLElement>;\n\n private readonly doc = inject(DOCUMENT);\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n\n x = input.required<number>();\n y = input.required<number>();\n sections = input.required<ContextMenuSection[]>();\n action = output<string>();\n closed = output<void>();\n\n private menuWidth = signal(0);\n private menuHeight = signal(0);\n\n private previouslyFocused: Element | null = null;\n\n // Resolved position: clamp to viewport so the menu never overflows an edge.\n // menuWidth/Height start at 0 so the first render places the menu at (x,y)\n // with no clamping; ngAfterViewInit measures the real size and updates the\n // signals, which re-evaluates this computed and repositions correctly.\n clampedPos = computed(() => {\n const vw = this.doc.defaultView?.innerWidth ?? 0;\n const vh = this.doc.defaultView?.innerHeight ?? 0;\n const w = this.menuWidth();\n const h = this.menuHeight();\n const x = this.x();\n const y = this.y();\n return {\n left: w > 0 ? Math.min(x, vw - w - 8) : x,\n top: h > 0 ? Math.min(y, vh - h - 8) : y,\n };\n });\n\n ngAfterViewInit(): void {\n // Portal: move host to <body> so position:fixed resolves against the true\n // viewport, not against any transformed/backdrop-filtered ancestor window.\n this.doc.body.appendChild(this.hostEl.nativeElement);\n\n // Measure after portal move so offsetWidth/Height are accurate.\n const el = this.menuEl?.nativeElement;\n if (el) {\n this.menuWidth.set(el.offsetWidth);\n this.menuHeight.set(el.offsetHeight);\n }\n\n this.previouslyFocused = document.activeElement;\n this.focusItem(0);\n }\n\n ngOnDestroy(): void {\n const el = this.hostEl.nativeElement;\n if (el.parentNode === this.doc.body) {\n this.doc.body.removeChild(el);\n }\n }\n\n onAction(id: string): void {\n this.action.emit(id);\n this.close();\n }\n\n @HostListener('document:mousedown', ['$event'])\n onClickOutside(event: MouseEvent): void {\n if (!this.menuEl?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n this.close();\n }\n\n @HostListener('document:contextmenu', ['$event'])\n onContextMenu(event: MouseEvent): void {\n if (!this.menuEl?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n const items = this.getMenuItems();\n if (!items.length) return;\n const focused = document.activeElement as HTMLElement;\n const idx = items.indexOf(focused);\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.focusItem(idx < items.length - 1 ? idx + 1 : 0);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.focusItem(idx > 0 ? idx - 1 : items.length - 1);\n } else if (event.key === 'Home') {\n event.preventDefault();\n this.focusItem(0);\n } else if (event.key === 'End') {\n event.preventDefault();\n this.focusItem(items.length - 1);\n }\n }\n\n private close(): void {\n this.restoreFocus();\n this.closed.emit();\n }\n\n private getMenuItems(): HTMLElement[] {\n return Array.from(\n this.menuEl?.nativeElement.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? [],\n );\n }\n\n private focusItem(index: number): void {\n const items = this.getMenuItems();\n items[index]?.focus();\n }\n\n private restoreFocus(): void {\n if (this.previouslyFocused instanceof HTMLElement) {\n this.previouslyFocused.focus();\n }\n this.previouslyFocused = null;\n }\n}\n","<div\n #contextMenu\n class=\"context-menu\"\n [style.left.px]=\"clampedPos().left\"\n [style.top.px]=\"clampedPos().top\"\n role=\"menu\"\n [attr.aria-label]=\"'shell.context_menu' | translate\">\n\n @for (section of sections(); track $index) {\n @if ($index > 0) {\n <div class=\"menu-divider\"></div>\n }\n @if (section.label) {\n <div class=\"menu-section-label\">{{ section.label }}</div>\n }\n @for (item of section.items; track item.id) {\n <button\n type=\"button\"\n class=\"vos-btn sm rect menu-item\"\n role=\"menuitem\"\n (click)=\"onAction(item.id)\">\n <i [class]=\"'pi ' + item.icon\" aria-hidden=\"true\"></i>\n <span>{{ item.label }}</span>\n </button>\n }\n }\n</div>\n","import { Injectable, inject, signal } from '@angular/core';\nimport { I18nService } from '../../services/i18n.service';\n\nexport enum MessageBoxButtons {\n OK,\n OKCancel,\n YesNo,\n YesNoCancel,\n RetryCancel,\n AbortRetryIgnore,\n}\n\nexport enum MessageBoxIcon {\n None,\n Information,\n Warning,\n Error,\n Question,\n}\n\nexport enum DialogResult {\n None,\n OK,\n Cancel,\n Yes,\n No,\n Retry,\n Abort,\n Ignore,\n}\n\nexport interface MessageBoxOptions {\n title: string;\n message: string;\n buttons?: MessageBoxButtons;\n icon?: MessageBoxIcon;\n}\n\n/**\n * Configuration for the \"Don't ask again\" checkbox rendered by\n * `showAcknowledged()`. The field is intentionally NOT part of the base\n * `MessageBoxOptions` so the type system enforces the rule\n * \"checkbox ⇒ caller MUST use `showAcknowledged()`\": the classic `show()`\n * entry point cannot accept this shape, eliminating the silent-discard\n * dark-pattern path where the user's choice was thrown away.\n */\nexport interface MessageBoxDontAskAgainConfig {\n /** i18n key for the checkbox label, e.g. 'agent.command.builtin.clear.dont_ask_again'. */\n labelKey: string;\n /** Initial checked state. Default false. */\n defaultChecked?: boolean;\n}\n\n/**\n * Options narrowed to those carrying a `dontAskAgain` config — the only shape\n * accepted by `showAcknowledged()`.\n */\nexport interface MessageBoxOptionsWithAcknowledgement extends MessageBoxOptions {\n dontAskAgain: MessageBoxDontAskAgainConfig;\n}\n\nexport interface MessageBoxButton {\n label: string;\n result: DialogResult;\n variant?: 'primary' | 'danger' | 'default';\n}\n\n/** Shape returned by `showAcknowledged()` — pairs the dialog result with the checkbox state. */\nexport interface DialogResultWithAcknowledgement {\n readonly result: DialogResult;\n readonly dontAskAgain: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MessageBoxService {\n private readonly i18n = inject(I18nService);\n\n readonly visible = signal(false);\n readonly title = signal('');\n readonly message = signal('');\n readonly icon = signal<MessageBoxIcon>(MessageBoxIcon.None);\n readonly buttons = signal<MessageBoxButton[]>([]);\n /**\n * Active \"Don't ask again\" config — populated only by `showAcknowledged()`.\n * `show()` callers cannot reach this signal because the type system rejects\n * `dontAskAgain` on the base `MessageBoxOptions`.\n */\n readonly dontAskAgain = signal<MessageBoxDontAskAgainConfig | undefined>(undefined);\n\n /**\n * Component-side checkbox state. The component (`MessageBoxComponent`) wires\n * its own signal to this one; the service explicitly re-seeds it on every\n * `_open()` so reusing a constant `options` literal across two opens does\n * NOT leak the previous user's checkbox state through signal `===` dedupe.\n * Exposed for the component to read/write; not for general callers.\n */\n readonly dontAskAgainChecked = signal(false);\n\n private resolver: ((value: DialogResultWithAcknowledgement) => void) | null = null;\n\n show(options: MessageBoxOptions): Promise<DialogResult> {\n return this._open(options).then((r) => r.result);\n }\n\n /**\n * Opens a message box with a \"Don't ask again\" checkbox and resolves to both\n * the dialog result and the checkbox state. Throws when `options.dontAskAgain`\n * is missing — the checkbox config is mandatory for this entry point. The\n * compile-time signature already guarantees presence; the runtime check is\n * defense-in-depth for callers that bypass the type system via `as never`.\n */\n showAcknowledged(\n options: MessageBoxOptionsWithAcknowledgement,\n ): Promise<DialogResultWithAcknowledgement> {\n if (!options.dontAskAgain) {\n throw new Error(\n 'MessageBoxService.showAcknowledged() requires options.dontAskAgain — use show() for plain dialogs.',\n );\n }\n return this._open(options);\n }\n\n resolve(result: DialogResult, dontAskAgain = false): void {\n this.visible.set(false);\n if (this.resolver) {\n this.resolver({ result, dontAskAgain });\n this.resolver = null;\n }\n }\n\n private _open(\n options: MessageBoxOptions | MessageBoxOptionsWithAcknowledgement,\n ): Promise<DialogResultWithAcknowledgement> {\n // Dismiss any pending dialog so its Promise resolves rather than leaking.\n if (this.resolver) {\n this.resolver({ result: DialogResult.None, dontAskAgain: false });\n this.resolver = null;\n }\n\n const daa =\n 'dontAskAgain' in options ? options.dontAskAgain : undefined;\n\n this.title.set(options.title);\n this.message.set(options.message);\n this.icon.set(options.icon ?? MessageBoxIcon.None);\n this.buttons.set(this.resolveButtons(options.buttons ?? MessageBoxButtons.OK));\n this.dontAskAgain.set(daa);\n // Explicit re-seed: signal `set` dedupes by `===`, so an `effect()` on\n // `dontAskAgain` would not re-fire when a caller passes the SAME options\n // literal twice. Set the checkbox state directly each open.\n this.dontAskAgainChecked.set(daa?.defaultChecked ?? false);\n this.visible.set(true);\n\n return new Promise<DialogResultWithAcknowledgement>((resolve) => {\n this.resolver = resolve;\n });\n }\n\n private resolveButtons(buttons: MessageBoxButtons): MessageBoxButton[] {\n const t = (key: string) => this.i18n.t(key);\n switch (buttons) {\n case MessageBoxButtons.OK:\n return [{ label: t('common.ok'), result: DialogResult.OK, variant: 'primary' }];\n\n case MessageBoxButtons.OKCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.ok'), result: DialogResult.OK, variant: 'primary' },\n ];\n\n case MessageBoxButtons.YesNo:\n return [\n { label: t('common.no'), result: DialogResult.No, variant: 'default' },\n { label: t('common.yes'), result: DialogResult.Yes, variant: 'primary' },\n ];\n\n case MessageBoxButtons.YesNoCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.no'), result: DialogResult.No, variant: 'default' },\n { label: t('common.yes'), result: DialogResult.Yes, variant: 'primary' },\n ];\n\n case MessageBoxButtons.RetryCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.retry'), result: DialogResult.Retry, variant: 'primary' },\n ];\n\n case MessageBoxButtons.AbortRetryIgnore:\n return [\n { label: t('common.abort'), result: DialogResult.Abort, variant: 'danger' },\n { label: t('common.retry'), result: DialogResult.Retry, variant: 'default' },\n { label: t('common.ignore'), result: DialogResult.Ignore, variant: 'default' },\n ];\n }\n }\n}\n","import {\n Component, inject, ChangeDetectionStrategy,\n HostListener, ElementRef, AfterViewInit, computed,\n} from '@angular/core';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport { MessageBoxService, MessageBoxIcon, DialogResult } from './message-box.service';\n\n@Component({\n selector: 'fly-message-box',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: './message-box.component.html',\n styleUrl: './message-box.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageBoxComponent implements AfterViewInit {\n service = inject(MessageBoxService);\n private elRef = inject(ElementRef);\n\n readonly MessageBoxIcon = MessageBoxIcon;\n readonly DialogResult = DialogResult;\n\n /** Mirror of the service's `dontAskAgain` config so the template can read it directly. */\n readonly dontAskAgainConfig = computed(() => this.service.dontAskAgain());\n /**\n * User-driven checkbox state, owned by the service and re-seeded on every\n * `_open()` so reusing a constant options literal cannot leak prior state.\n */\n readonly dontAskAgainChecked = this.service.dontAskAgainChecked;\n /**\n * Concatenated id list for the dialog's `aria-describedby`. Always includes\n * the message; appends the checkbox label id when the checkbox is rendered\n * so screen readers announce the checkbox as part of the description.\n */\n readonly ariaDescribedBy = computed(() =>\n this.dontAskAgainConfig() ? 'mb-message mb-dont-ask' : 'mb-message',\n );\n\n private previouslyFocused: Element | null = null;\n\n ngAfterViewInit(): void {\n // Store focus origin so we can restore it on close\n this.previouslyFocused = document.activeElement;\n this.focusPrimaryButton();\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.service.visible()) {\n this.service.resolve(DialogResult.Cancel, this.dontAskAgainChecked());\n this.restoreFocus();\n }\n }\n\n onBackdropClick(): void {\n this.service.resolve(DialogResult.Cancel, this.dontAskAgainChecked());\n this.restoreFocus();\n }\n\n onButtonClick(result: DialogResult): void {\n this.service.resolve(result, this.dontAskAgainChecked());\n this.restoreFocus();\n }\n\n onDontAskAgainToggle(ev: Event): void {\n const target = ev.target as HTMLInputElement | null;\n this.dontAskAgainChecked.set(!!target?.checked);\n }\n\n iconClass(): string {\n switch (this.service.icon()) {\n case MessageBoxIcon.Information: return 'pi pi-info-circle';\n case MessageBoxIcon.Warning: return 'pi pi-exclamation-triangle';\n case MessageBoxIcon.Error: return 'pi pi-times-circle';\n case MessageBoxIcon.Question: return 'pi pi-question-circle';\n default: return '';\n }\n }\n\n private focusPrimaryButton(): void {\n // Focus the primary (last) button, which is the default action\n const buttons = this.elRef.nativeElement.querySelectorAll('.mb-btn') as NodeListOf<HTMLButtonElement>;\n const last = buttons[buttons.length - 1];\n last?.focus();\n }\n\n private restoreFocus(): void {\n if (this.previouslyFocused instanceof HTMLElement) {\n this.previouslyFocused.focus();\n }\n this.previouslyFocused = null;\n }\n}\n","@if (service.visible()) {\n <div\n class=\"mb-backdrop\"\n (click)=\"onBackdropClick()\"\n role=\"presentation\">\n <div\n class=\"mb-dialog\"\n [class.mb-info]=\"service.icon() === MessageBoxIcon.Information\"\n [class.mb-warning]=\"service.icon() === MessageBoxIcon.Warning\"\n [class.mb-danger]=\"service.icon() === MessageBoxIcon.Error\"\n [class.mb-question]=\"service.icon() === MessageBoxIcon.Question\"\n (click)=\"$event.stopPropagation()\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"mb-title\"\n [attr.aria-describedby]=\"ariaDescribedBy()\">\n\n @if (iconClass()) {\n <div class=\"mb-icon-wrap\">\n <i [class]=\"iconClass() + ' mb-icon'\" aria-hidden=\"true\"></i>\n </div>\n }\n\n <div class=\"mb-title\" id=\"mb-title\">{{ service.title() }}</div>\n <div class=\"mb-message\" id=\"mb-message\">{{ service.message() }}</div>\n\n @if (dontAskAgainConfig(); as daa) {\n <label class=\"mb-dont-ask-again\">\n <input\n type=\"checkbox\"\n [checked]=\"dontAskAgainChecked()\"\n (change)=\"onDontAskAgainToggle($event)\" />\n <span id=\"mb-dont-ask\">{{ daa.labelKey | translate }}</span>\n </label>\n }\n\n <div class=\"mb-actions\">\n @for (btn of service.buttons(); track btn.result) {\n <button\n type=\"button\"\n class=\"vos-btn sm mb-btn\"\n [class.mb-btn--primary]=\"btn.variant === 'primary'\"\n [class.mb-btn--danger]=\"btn.variant === 'danger'\"\n (click)=\"onButtonClick(btn.result)\">\n {{ btn.label }}\n </button>\n }\n </div>\n\n </div>\n </div>\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n signal,\n inject,\n OnInit,\n DestroyRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport { I18nService } from '../../services/i18n.service';\nimport type {\n ShareOrgChartOption,\n ShareOuNode,\n SharePanelLevelOption,\n SharePermissionEntry,\n SharePrincipal,\n ShareUserResult,\n} from '../../models/share-panel.model';\n\n/** Default permission levels (file-style ACL). Hosts can override via `permissionLevels`. */\nexport const SHARE_PANEL_DEFAULT_FILE_LEVELS: SharePanelLevelOption[] = [\n { value: 'View', labelKey: 'files.share.level_view' },\n { value: 'Download', labelKey: 'files.share.level_download' },\n { value: 'Edit', labelKey: 'files.share.level_edit' },\n { value: 'FullControl', labelKey: 'files.share.level_full' },\n];\n\n@Component({\n selector: 'fly-share-panel',\n standalone: true,\n imports: [CommonModule, FormsModule, TranslatePipe],\n templateUrl: './share-panel.component.html',\n styleUrl: './share-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SharePanelComponent implements OnInit {\n /** Resource title shown in the header */\n @Input() targetName = '';\n\n /** i18n key for panel title */\n @Input() titleKey = 'files.share.title';\n\n /** Load current shares / permissions (host resolves display names when possible). */\n @Input({ required: true }) loadPermissions!: () => Observable<SharePermissionEntry[]>;\n\n @Input({ required: true }) searchUsers!: (query: string) => Observable<ShareUserResult[]>;\n\n /**\n * Load OU hierarchy for sharing. `chartId` is null for the default/official tree;\n * non-null for an alternative chart.\n */\n @Input({ required: true })\n loadOuTree!: (chartId: string | null) => Observable<ShareOuNode[]>;\n\n /** Chart selector options; first entry should be the default chart (`id: null`). */\n @Input({ required: true }) loadChartOptions!: () => Observable<ShareOrgChartOption[]>;\n\n /**\n * Initial chart selection. Resolution order:\n * <list type=\"number\">\n * <item>{@link defaultChartId} when explicitly provided (string or null).</item>\n * <item>First option matching {@link defaultChartSystemKey} (e.g. <c>'apps'</c>).</item>\n * <item>Host order — <c>options[0]?.id ?? null</c>.</item>\n * </list>\n */\n @Input() defaultChartSystemKey?: string | null;\n\n /** Hard-coded chart id to pre-select. Takes priority over {@link defaultChartSystemKey}. */\n @Input() defaultChartId?: string | null;\n\n /**\n * Labels from the default (official) OU tree for stable display names on OU grants\n * when the picker shows an alternative chart.\n */\n @Input({ required: true }) loadOuLabelMap!: () => Observable<Record<string, string>>;\n\n @Input({ required: true })\n grantToUser!: (userId: string, level: string, applyToChildren: boolean, isDeny: boolean) => Observable<void>;\n\n @Input({ required: true })\n grantToOu!: (ouId: string, level: string, applyToChildren: boolean, isDeny: boolean) => Observable<void>;\n\n @Input({ required: true }) updatePermission!: (id: string, level: string) => Observable<void>;\n\n @Input({ required: true }) revokePermission!: (id: string) => Observable<void>;\n\n /** When true, show “apply to children” (e.g. folders). */\n @Input() showApplyToChildren = false;\n\n /**\n * When true, surfaces an \"Add as deny\" toggle in the add-permission row and renders\n * existing deny grants with red styling. Hosts whose backend does not support deny\n * grants (legacy callers) leave this false and the panel hides all deny affordances.\n */\n @Input() supportsDeny = false;\n\n /** Override level dropdown options (e.g. notes: View / Edit only). */\n @Input() permissionLevels?: SharePanelLevelOption[];\n\n /** i18n key for wildcard app grant label */\n @Input() everyoneLabelKey = 'files.share.everyone';\n\n /**\n * Optional apps-chart role-OU index for the tenant. When supplied, the panel:\n * <list type=\"bullet\">\n * <item>Renders existing OU grants whose ouId matches a row as <c>RolePrincipal</c>\n * chips (\"FFO in Circles\") instead of opaque OU labels.</item>\n * <item>Surfaces an \"Add role\" picker that translates the picked role to its\n * role-OU UUID and dispatches via {@link grantToOu}. Backend stores it as a\n * plain OU grant; <see cref=\"PermissionResolver\"/> resolves at access time via\n * the user's effective OU set.</item>\n * </list>\n * Hosts that don't have access to the apps-chart (or don't want the role flow) omit\n * this input — OU grants then render as generic OU principals.\n */\n @Input() loadRoleOus?: () => Observable<RoleOuLookupRow[]>;\n\n @Output() close = new EventEmitter<void>();\n\n private destroyRef = inject(DestroyRef);\n private i18n = inject(I18nService);\n\n permissions = signal<SharePermissionEntry[]>([]);\n loading = signal(true);\n searchQuery = '';\n newLevel = '';\n applyToChildren = false;\n\n /** Apps-chart role-OU index, populated lazily when {@link loadRoleOus} is provided. */\n roleOus = signal<RoleOuLookupRow[]>([]);\n /** Map<ouId, role row> — derived from roleOus for O(1) lookup during rendering. */\n private readonly roleOusByOuId = signal<Record<string, RoleOuLookupRow>>({});\n\n /** Two-way bound to the role picker's filter input. */\n roleSearchQuery = '';\n /** True while the role picker section is expanded. */\n showRolePicker = signal(false);\n /**\n * Two-way bound to the \"Add as deny\" toggle. When true, the next user/OU pick is\n * persisted as a deny grant. Reset to false after each successful grant so the next\n * pick defaults back to allow.\n */\n addAsDeny = false;\n searchResults = signal<ShareUserResult[]>([]);\n ouTree = signal<ShareOuNode[]>([]);\n showOuPicker = signal(false);\n chartOptions = signal<ShareOrgChartOption[]>([]);\n selectedOrgChartId = signal<string | null>(null);\n /** Default-tree id → display name for permission rows (OU grants). */\n private readonly ouLabelById = signal<Record<string, string>>({});\n\n private searchTimeout: ReturnType<typeof setTimeout> | null = null;\n /** Emits after chart options load; further emissions on user chart changes (no initial null). */\n private readonly selectedChartId$ = new ReplaySubject<string | null>(1);\n\n ngOnInit(): void {\n const levels = this.levelOptions;\n this.newLevel = levels[0]?.value ?? 'View';\n this.refreshPermissions();\n\n // Load the role-OU lookup table once. Failures degrade gracefully — OU grants then\n // render as generic OU principals (the v1 behaviour) instead of Role chips.\n this.loadRoleOus?.()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (rows) => {\n this.roleOus.set(rows);\n const byId: Record<string, RoleOuLookupRow> = {};\n for (const r of rows) byId[r.ouId] = r;\n this.roleOusByOuId.set(byId);\n },\n error: () => {\n this.roleOus.set([]);\n this.roleOusByOuId.set({});\n },\n });\n\n this.loadOuLabelMap()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (m) => this.ouLabelById.set(m),\n error: () => this.ouLabelById.set({}),\n });\n\n this.selectedChartId$\n .pipe(\n switchMap((id) => this.loadOuTree(id)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe({\n next: (tree) => this.ouTree.set(tree),\n error: () => this.ouTree.set([]),\n });\n\n this.loadChartOptions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (opts) => {\n this.chartOptions.set(opts);\n const initial = this.resolveInitialChartId(opts);\n this.selectedOrgChartId.set(initial);\n this.selectedChartId$.next(initial);\n },\n error: () => {\n this.chartOptions.set([]);\n this.selectedOrgChartId.set(null);\n this.selectedChartId$.next(null);\n },\n });\n }\n\n /**\n * Picks the chart id to seed the OU picker with. Honours explicit\n * {@link defaultChartId} first (null is a valid id), then {@link defaultChartSystemKey},\n * then falls back to host order.\n */\n private resolveInitialChartId(opts: ShareOrgChartOption[]): string | null {\n if (this.defaultChartId !== undefined) {\n const exists = opts.some((o) => o.id === this.defaultChartId);\n return exists ? (this.defaultChartId as string | null) : (opts[0]?.id ?? null);\n }\n const key = this.defaultChartSystemKey;\n if (key) {\n const match = opts.find((o) => o.systemKey === key);\n if (match) return match.id;\n }\n return opts[0]?.id ?? null;\n }\n\n onOrgChartSelectChange(chartId: string | null): void {\n this.selectedOrgChartId.set(chartId);\n this.selectedChartId$.next(chartId);\n }\n\n get levelOptions(): SharePanelLevelOption[] {\n const p = this.permissionLevels;\n return p && p.length > 0 ? p : SHARE_PANEL_DEFAULT_FILE_LEVELS;\n }\n\n refreshPermissions(): void {\n this.loading.set(true);\n this.loadPermissions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (perms) => {\n this.permissions.set(perms);\n this.loading.set(false);\n },\n error: () => {\n this.permissions.set([]);\n this.loading.set(false);\n },\n });\n }\n\n onSearchInput(): void {\n if (this.searchTimeout) clearTimeout(this.searchTimeout);\n const query = this.searchQuery.trim();\n if (query.length < 2) {\n this.searchResults.set([]);\n return;\n }\n\n this.searchTimeout = setTimeout(() => {\n this.searchUsers(query)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (items) => this.searchResults.set(items),\n error: () => this.searchResults.set([]),\n });\n }, 300);\n }\n\n onGrantToUser(user: ShareUserResult): void {\n this.searchResults.set([]);\n this.searchQuery = '';\n const isDeny = this.supportsDeny && this.addAsDeny;\n this.grantToUser(user.id, this.newLevel, this.applyToChildren, isDeny)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n // Reset deny toggle after each successful grant so allow is the default for the\n // next pick. Preserves the level dropdown which is genuinely sticky.\n this.addAsDeny = false;\n this.refreshPermissions();\n },\n });\n }\n\n onGrantToOu(ou: ShareOuNode): void {\n const isDeny = this.supportsDeny && this.addAsDeny;\n this.grantToOu(ou.id, this.newLevel, this.applyToChildren, isDeny)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.addAsDeny = false;\n this.refreshPermissions();\n },\n });\n }\n\n /**\n * Add a role grant. Resolves to the role-OU UUID and dispatches via {@link grantToOu}\n * so the backend stores it as a plain OU grant; PermissionResolver matches it at access\n * time via the user's effective OU set (apps-chart computed-from-role membership).\n */\n onGrantToRole(role: RoleOuLookupRow): void {\n const isDeny = this.supportsDeny && this.addAsDeny;\n this.grantToOu(role.ouId, this.newLevel, this.applyToChildren, isDeny)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.addAsDeny = false;\n this.roleSearchQuery = '';\n this.refreshPermissions();\n },\n });\n }\n\n /** Filtered role list — empty query returns all roles, otherwise case-insensitive substring match. */\n filteredRoles(): RoleOuLookupRow[] {\n const q = this.roleSearchQuery.trim().toLowerCase();\n const all = this.roleOus();\n if (!q) return all;\n return all.filter(\n (r) =>\n r.displayName.toLowerCase().includes(q)\n || r.roleKey.toLowerCase().includes(q)\n || r.appId.toLowerCase().includes(q),\n );\n }\n\n onUpdateLevel(perm: SharePermissionEntry, level: string): void {\n this.updatePermission(perm.id, level)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n onRevokePermission(perm: SharePermissionEntry): void {\n this.revokePermission(perm.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n getPermIcon(perm: SharePermissionEntry): string {\n // Deny rows take a distinct icon regardless of principal kind so the operator can\n // scan a long permission list and immediately spot revocations.\n if (perm.isDeny) return 'pi pi-ban';\n // Reverse-translate: an OuPrincipal whose ouId matches a known role-OU should render\n // as a role chip, even though the host stored it as an OU grant.\n if (perm.principal.kind === 'ou' && this.roleOusByOuId()[perm.principal.ouId]) {\n return 'pi pi-id-card';\n }\n return SharePanelComponent.principalIcon(perm.principal);\n }\n\n /** Maps a principal kind to its display icon. Static so hosts can reuse for menus. */\n static principalIcon(principal: SharePrincipal): string {\n switch (principal.kind) {\n case 'user': return 'pi pi-user';\n case 'role': return 'pi pi-id-card';\n case 'ou': return 'pi pi-sitemap';\n case 'app-everyone': return 'pi pi-globe';\n }\n }\n\n /** Logical start padding for OU hierarchy (roots align with section padding). */\n ouIndentStartPx(ou: ShareOuNode): number {\n const d = ou.depth ?? 0;\n return 12 + d * 18;\n }\n\n getPermLabel(perm: SharePermissionEntry): string {\n const p = perm.principal;\n if (p.displayName?.trim()) return p.displayName.trim();\n switch (p.kind) {\n case 'user':\n return `${p.userId.substring(0, 8)}…`;\n case 'role':\n // Hosts SHOULD pre-resolve role display names — this branch is the\n // worst-case fallback for an unresolved key.\n return `${p.appId}:${p.roleKey}`;\n case 'ou': {\n // Reverse-translate: if this OU id matches a known apps-chart role-OU, render\n // as the semantic role label instead of the opaque OU name.\n const role = this.roleOusByOuId()[p.ouId];\n if (role) return role.displayName;\n\n const fromDefault = this.ouLabelById()[p.ouId];\n if (fromDefault) return fromDefault;\n const ou = this.ouTree().find((o) => o.id === p.ouId);\n if (ou) return ou.displayName;\n return `${p.ouId.substring(0, 8)}…`;\n }\n case 'app-everyone':\n return p.appId === '*' ? this.i18n.t(this.everyoneLabelKey) : p.appId;\n }\n }\n}\n\n/**\n * One row in the role-OU lookup table the share panel uses to render OU grants as Role\n * chips and to drive the \"Add role\" picker. Hosts source this from\n * <c>OrgStructureApiService.listRoleOus()</c> in the desktop shell.\n */\nexport interface RoleOuLookupRow {\n /** Apps-chart role-OU UUID — what backend stores in `grantedToOuId` / `sharedWithOuId`. */\n ouId: string;\n appId: string;\n roleKey: string;\n /** Display name resolved by the host (e.g. \"FFO\" or \"Future Foresight Officer\"). */\n displayName: string;\n}\n","<div class=\"fac-overlay\" (click)=\"close.emit()\">\n <div class=\"fac-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"fac-header\">\n <h3>{{ titleKey | translate }}</h3>\n <span class=\"fac-target-name\">{{ targetName }}</span>\n <button\n type=\"button\"\n class=\"fac-close\"\n (click)=\"close.emit()\"\n [attr.aria-label]=\"'files.share.close' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <div class=\"fac-add-section\">\n <div class=\"fac-search-row\">\n <input\n type=\"text\"\n class=\"fac-input\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n [placeholder]=\"'files.share.search_placeholder' | translate\"\n [attr.aria-label]=\"'files.share.search_users' | translate\"\n />\n <select class=\"fac-select\" [(ngModel)]=\"newLevel\">\n @for (opt of levelOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.labelKey | translate }}</option>\n }\n </select>\n </div>\n\n @if (searchResults().length > 0) {\n <div class=\"fac-search-results\">\n @for (result of searchResults(); track result.id) {\n <div class=\"fac-search-item\" (click)=\"onGrantToUser(result)\">\n <i class=\"pi pi-user\" aria-hidden=\"true\"></i>\n <span>{{ result.firstName }} {{ result.lastName }}</span>\n <span class=\"fac-email\">{{ result.email }}</span>\n </div>\n }\n </div>\n }\n\n @if (chartOptions().length > 0) {\n <div class=\"fac-chart-row\">\n <label for=\"fac-org-chart-select\" class=\"fac-section-label\">{{\n 'files.share.org_chart' | translate\n }}</label>\n <select\n id=\"fac-org-chart-select\"\n class=\"fac-select\"\n [ngModel]=\"selectedOrgChartId()\"\n (ngModelChange)=\"onOrgChartSelectChange($event)\">\n @for (opt of chartOptions(); track $index) {\n <option [ngValue]=\"opt.id\">{{ opt.name }}</option>\n }\n </select>\n </div>\n }\n\n @if (showOuPicker()) {\n <div class=\"fac-ou-section\">\n <div class=\"fac-section-label\">{{ 'files.share.share_with_ou' | translate }}</div>\n @for (ou of ouTree(); track ou.id) {\n <button\n type=\"button\"\n class=\"fac-ou-item\"\n [style.padding-inline-start.px]=\"ouIndentStartPx(ou)\"\n (click)=\"onGrantToOu(ou)\"\n [attr.aria-label]=\"('files.share.share_with_ou_named' | translate) + ' ' + ou.displayName\"\n >\n <i class=\"pi pi-sitemap\" aria-hidden=\"true\"></i>\n <span dir=\"auto\">{{ ou.displayName }}</span>\n </button>\n }\n </div>\n }\n\n @if (loadRoleOus && roleOus().length > 0) {\n <div class=\"fac-role-section\">\n <div class=\"fac-section-label\">{{ 'files.share.share_with_role' | translate }}</div>\n <input\n type=\"text\"\n class=\"fac-input\"\n [(ngModel)]=\"roleSearchQuery\"\n [placeholder]=\"'files.share.role_search_placeholder' | translate\"\n [attr.aria-label]=\"'files.share.search_roles' | translate\"\n [hidden]=\"!showRolePicker()\" />\n @if (showRolePicker()) {\n <div class=\"fac-role-list\">\n @for (role of filteredRoles(); track role.ouId) {\n <button\n type=\"button\"\n class=\"fac-role-item\"\n (click)=\"onGrantToRole(role)\"\n [attr.aria-label]=\"('files.share.share_with_role_named' | translate) + ' ' + role.displayName\">\n <i class=\"pi pi-id-card\" aria-hidden=\"true\"></i>\n <span dir=\"auto\">{{ role.displayName }}</span>\n <span class=\"fac-role-app\">{{ role.appId }}</span>\n </button>\n }\n @if (filteredRoles().length === 0) {\n <div class=\"fac-empty\">{{ 'files.share.no_roles_match' | translate }}</div>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"fac-toggle-row\">\n <button type=\"button\" class=\"fac-link\" (click)=\"showOuPicker.set(!showOuPicker())\">\n {{ showOuPicker() ? ('files.share.hide_ous' | translate) : ('files.share.show_ous' | translate) }}\n </button>\n @if (loadRoleOus && roleOus().length > 0) {\n <button type=\"button\" class=\"fac-link\" (click)=\"showRolePicker.set(!showRolePicker())\">\n {{ showRolePicker() ? ('files.share.hide_roles' | translate) : ('files.share.show_roles' | translate) }}\n </button>\n }\n @if (showApplyToChildren) {\n <label class=\"fac-checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"applyToChildren\" />\n {{ 'files.share.apply_children' | translate }}\n </label>\n }\n @if (supportsDeny) {\n <label class=\"fac-checkbox-label fac-deny-toggle\"\n [title]=\"'files.share.deny_help' | translate\">\n <input type=\"checkbox\" [(ngModel)]=\"addAsDeny\" />\n <i class=\"pi pi-ban\" aria-hidden=\"true\"></i>\n {{ 'files.share.add_as_deny' | translate }}\n </label>\n }\n </div>\n </div>\n\n <div class=\"fac-perms-section\">\n <div class=\"fac-section-label\">{{ 'files.share.current_permissions' | translate }}</div>\n @if (loading()) {\n <div class=\"fac-loading\"><i class=\"pi pi-spin pi-spinner\" aria-hidden=\"true\"></i></div>\n } @else if (permissions().length === 0) {\n <div class=\"fac-empty\">{{ 'files.share.no_permissions' | translate }}</div>\n } @else {\n @for (perm of permissions(); track perm.id) {\n <div class=\"fac-perm-row\" [class.fac-perm-row-deny]=\"perm.isDeny\">\n <div class=\"fac-perm-info\">\n <i [class]=\"getPermIcon(perm)\" aria-hidden=\"true\"></i>\n <span class=\"fac-perm-name\" dir=\"auto\">{{ getPermLabel(perm) }}</span>\n @if (perm.isDeny) {\n <span class=\"fac-badge deny\">{{ 'files.share.denied' | translate }}</span>\n }\n @if (perm.isInherited) {\n <span class=\"fac-badge inherited\">{{ 'files.share.inherited' | translate }}</span>\n }\n </div>\n <div class=\"fac-perm-actions\">\n @if (!perm.isDeny) {\n <select\n class=\"fac-select sm\"\n [ngModel]=\"perm.level\"\n (ngModelChange)=\"onUpdateLevel(perm, $event)\"\n [disabled]=\"perm.isInherited === true\"\n >\n @for (opt of levelOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.labelKey | translate }}</option>\n }\n </select>\n }\n <button\n type=\"button\"\n class=\"fac-icon-btn danger\"\n (click)=\"onRevokePermission(perm)\"\n [disabled]=\"perm.isInherited === true\"\n [title]=\"'files.share.revoke' | translate\"\n >\n <i class=\"pi pi-trash\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n EventEmitter,\n forwardRef,\n inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n signal,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n ControlValueAccessor,\n FormsModule,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n Validator,\n ValidatorFn,\n AbstractControl,\n ValidationErrors,\n} from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Observable, ReplaySubject, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, filter, switchMap } from 'rxjs/operators';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport { I18nService } from '../../services/i18n.service';\nimport {\n AppEveryoneTerm,\n AudienceFilter,\n AudienceTerm,\n AudienceTermKind,\n AUDIENCE_LIMITS,\n AUDIENCE_PRESETS,\n AudiencePresetKind,\n ChartTerm,\n OuTerm,\n PresetTerm,\n RolesTerm,\n UsersTerm,\n} from '../../models/audience.model';\nimport type {\n ShareOrgChartOption,\n ShareOuNode,\n ShareUserResult,\n} from '../../models/share-panel.model';\nimport type { RoleOuLookupRow } from '../share-panel/share-panel.component';\n\n/** Bucket the picker is currently editing. Exported so hosts can drive `editTarget` if needed. */\nexport type AudienceEditTarget = 'includes' | 'excludes';\n\n/**\n * Strongly-typed context for the term-card `<ng-template>`. Without an explicit interface\n * the template's `let-term` falls back to `any`, defeating the discriminated-union narrowing\n * inside `@switch (term.kind)`. The `track` expression on the parent `@for` reads\n * `target` and `index` through this same context shape.\n */\ninterface TermCardContext {\n $implicit: AudienceTerm;\n target: AudienceEditTarget;\n index: number;\n}\n\n/**\n * Generic builder for {@link AudienceFilter}. Accepts an initial value, emits both the\n * full filter and a validity flag on every change. Reuses the same callback shapes as\n * {@link SharePanelComponent} so a host already wiring the share panel can drop this in\n * with no extra plumbing.\n *\n * Compaction policy: when the operator picks the same kind multiple times, the component\n * merges into a single term where it's safe to do so:\n * <list type=\"bullet\">\n * <item><b>users</b>: dedupes user ids into one {@link UsersTerm}.</item>\n * <item><b>roles</b>: per `appId`, dedupes role keys into one {@link RolesTerm}.</item>\n * <item><b>ou</b>: per `(chartId, includeDescendants)`, dedupes OU ids into one {@link OuTerm}.</item>\n * <item><b>app-everyone / chart / preset</b>: idempotent per kind+key.</item>\n * </list>\n * This keeps the term count well below {@link AUDIENCE_LIMITS.maxTermsPerFilter} for typical\n * use, and matches how the backend resolver would have unioned them anyway.\n */\n@Component({\n selector: 'fly-audience-builder',\n standalone: true,\n imports: [CommonModule, FormsModule, TranslatePipe],\n templateUrl: './audience-builder.component.html',\n styleUrl: './audience-builder.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AudienceBuilderComponent),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => AudienceBuilderComponent),\n multi: true,\n },\n ],\n})\nexport class AudienceBuilderComponent\n implements OnInit, OnChanges, OnDestroy, ControlValueAccessor, Validator {\n /** Initial audience filter. Two-way: changes emit via {@link audienceChange}. */\n @Input() value: AudienceFilter | null | undefined = { includes: [] };\n\n /** Hide the Excludes section entirely (e.g. for simple \"send to\" pickers). */\n @Input() showExcludes = true;\n\n /**\n * Which term kinds are selectable. Defaults to all six. Hosts that don't have a\n * concept of `chart` or `preset` should narrow this down to keep the UI focused.\n */\n @Input() supportedKinds: readonly AudienceTermKind[] = [\n 'users',\n 'roles',\n 'ou',\n 'app-everyone',\n 'chart',\n 'preset',\n ];\n\n /**\n * Anchor user id used when adding a `preset` term. Typically `auth.currentUser().id`.\n * If null and the operator picks a preset, the term is rejected with an inline error.\n */\n @Input() selfUserId: string | null = null;\n\n /** App ids the host wants to expose as `app-everyone` options. */\n @Input() appEveryoneOptions: { appId: string; displayName: string }[] = [];\n\n // ── Picker callbacks (same shapes as SharePanelComponent) ────────────────────\n\n @Input({ required: true }) searchUsers!: (query: string) => Observable<ShareUserResult[]>;\n\n @Input({ required: true })\n loadOuTree!: (chartId: string | null) => Observable<ShareOuNode[]>;\n\n @Input({ required: true }) loadChartOptions!: () => Observable<ShareOrgChartOption[]>;\n\n /**\n * Initial chart selection for the OU picker. Resolution order:\n * <list type=\"number\">\n * <item>If <see cref=\"defaultChartId\"/> is explicitly provided (string or null), use it.</item>\n * <item>Else if <see cref=\"defaultChartSystemKey\"/> is set, pick the first option whose\n * <c>systemKey</c> matches (e.g. <c>'apps'</c> → the platform Apps chart).</item>\n * <item>Else fall back to <c>options[0]?.id ?? null</c> (host-defined default order).</item>\n * </list>\n * Hosts that already know the tenant-scoped chart Guid use {@link defaultChartId};\n * hosts that only know the semantic kind (typically <c>'apps'</c>) use\n * {@link defaultChartSystemKey}.\n */\n @Input() defaultChartSystemKey?: string | null;\n\n /**\n * Hard-coded chart id to pre-select. Takes priority over {@link defaultChartSystemKey}.\n * Use <c>null</c> to force the default/official chart (id null) even when other charts\n * are listed first.\n */\n @Input() defaultChartId?: string | null;\n\n /**\n * Optional apps-chart role-OU index. When supplied, the picker exposes a \"Roles\" tab\n * surfacing role chips; without it, that tab is hidden even if `'roles'` is in\n * {@link supportedKinds}.\n */\n @Input() loadRoleOus?: () => Observable<RoleOuLookupRow[]>;\n\n // ── Outputs ──────────────────────────────────────────────────────────────────\n\n /** Fires on every successful add/remove with the current filter. */\n @Output() audienceChange = new EventEmitter<AudienceFilter>();\n\n /**\n * True when {@link AudienceFilter.includes} is non-empty and the term count is within\n * {@link AUDIENCE_LIMITS.maxTermsPerFilter}. Hosts should disable submit when false.\n */\n @Output() validityChange = new EventEmitter<boolean>();\n\n // ── Internal state (signals; computed where derived) ─────────────────────────\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly i18n = inject(I18nService);\n\n readonly includes = signal<AudienceTerm[]>([]);\n readonly excludes = signal<AudienceTerm[]>([]);\n\n readonly editTarget = signal<AudienceEditTarget>('includes');\n readonly pickerOpen = signal(false);\n readonly activeKind = signal<AudienceTermKind>('users');\n\n // User picker — signal-backed so OnPush + computed re-evaluates correctly. Keystrokes go\n // through a debounced Subject + switchMap so a slow \"fo\" result can never overwrite a\n // fresh \"foobar\" result (the previous setTimeout-based path had this race).\n readonly userSearchQuery = signal('');\n readonly userSearchResults = signal<ShareUserResult[]>([]);\n private readonly userSearch$ = new Subject<string>();\n\n // Role picker.\n readonly roleOus = signal<RoleOuLookupRow[]>([]);\n readonly roleSearchQuery = signal('');\n /**\n * Filtered role list as a `computed` so the template doesn't re-call a method on every\n * change-detection cycle.\n */\n readonly filteredRoles = computed<RoleOuLookupRow[]>(() => {\n const q = this.roleSearchQuery().trim().toLowerCase();\n const all = this.roleOus();\n if (!q) return all;\n return all.filter(\n (r) =>\n r.displayName.toLowerCase().includes(q)\n || r.roleKey.toLowerCase().includes(q)\n || r.appId.toLowerCase().includes(q),\n );\n });\n\n // OU picker.\n readonly ouTree = signal<ShareOuNode[]>([]);\n readonly chartOptions = signal<ShareOrgChartOption[]>([]);\n readonly selectedChartId = signal<string | null>(null);\n readonly ouIncludeDescendants = signal(false);\n /**\n * Chart-term picker entries — filters out the null-id default chart since `ChartTerm`\n * requires a real Guid. Avoids the UX trap where clicking \"Default Company\" surfaces\n * an inline error.\n */\n readonly chartTermOptions = computed<ShareOrgChartOption[]>(() =>\n this.chartOptions().filter((c) => c.id !== null),\n );\n private readonly selectedChartId$ = new ReplaySubject<string | null>(1);\n\n // Preset options exposed from the model so the template stays in sync with new presets.\n readonly presetOptions = AUDIENCE_PRESETS;\n\n // Validation surface (inline errors).\n readonly errorKey = signal<string | null>(null);\n\n /** True when the host disabled this control (template-driven `[disabled]` or reactive). */\n readonly disabled = signal(false);\n\n // ── ControlValueAccessor + Validator wiring ──────────────────────────────────\n // These let hosts bind the component via `formControl` / `formControlName` /\n // `[(ngModel)]` instead of plumbing `[value]` + `(audienceChange)` manually. The\n // (audienceChange) / (validityChange) outputs still fire — Angular forms infrastructure\n // is purely additive and template-driven hosts continue to work unchanged.\n private onChange: (value: AudienceFilter) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n private onValidatorChange: () => void = () => undefined;\n\n // ── Lifecycle ────────────────────────────────────────────────────────────────\n\n ngOnInit(): void {\n // applyValue() seeds includes/excludes — defer the initial emit so we don't trigger\n // ExpressionChangedAfterItHasBeenChecked when a parent template binding observes\n // (audienceChange) / (validityChange) in the same change-detection cycle.\n this.applyValue(this.value, /* emitImmediate */ false);\n queueMicrotask(() => this.emitState());\n\n if (this.loadRoleOus) {\n this.loadRoleOus()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (rows) => this.roleOus.set(rows),\n error: () => this.roleOus.set([]),\n });\n }\n\n this.selectedChartId$\n .pipe(\n switchMap((id) => this.loadOuTree(id)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe({\n next: (tree) => this.ouTree.set(tree),\n error: () => this.ouTree.set([]),\n });\n\n // Debounced user search: 300ms idle → switchMap cancels any in-flight request when a\n // newer query arrives, killing the \"stale result overwrites fresh result\" race the old\n // setTimeout path had. `filter(q.length >= 2)` preserves the same UX gate.\n this.userSearch$\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n filter((q) => q.length >= 2),\n switchMap((q) => this.searchUsers(q)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe({\n next: (items) => this.userSearchResults.set(items),\n error: () => this.userSearchResults.set([]),\n });\n\n this.loadChartOptions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (opts) => {\n this.chartOptions.set(opts);\n const initial = this.resolveInitialChartId(opts);\n this.selectedChartId.set(initial);\n this.selectedChartId$.next(initial);\n },\n error: () => {\n this.chartOptions.set([]);\n this.selectedChartId.set(null);\n this.selectedChartId$.next(null);\n },\n });\n\n if (this.supportedKinds.length > 0 && !this.supportedKinds.includes(this.activeKind())) {\n this.activeKind.set(this.supportedKinds[0]);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Re-hydrate when the host swaps the filter wholesale (e.g. editing a different rule).\n // First-mount initialisation is handled by ngOnInit so we skip the initial assignment\n // here. Picker UI state is also reset so a stale search query / open picker from the\n // previous draft doesn't bleed into the new one.\n //\n // We do NOT emit (audienceChange) / onChange — the host already KNOWS the value it\n // pushed. Echoing back via the change callback can create a feedback loop with two-way\n // bindings and reactive forms. Validity, however, may genuinely change with the new\n // value — emit that signal explicitly via the form-validator hook + (validityChange).\n if (changes['value'] && !changes['value'].firstChange) {\n this.applyValue(this.value, /* emitImmediate */ false);\n this.closePicker();\n this.errorKey.set(null);\n this.emitValidityOnly();\n }\n }\n\n ngOnDestroy(): void {\n this.userSearch$.complete();\n }\n\n /**\n * Replaces the in-component state from an external value. Null-safe — if the host\n * passes <c>null</c> or <c>undefined</c> (e.g. while a parent signal is loading),\n * we treat it as an empty filter rather than crashing.\n */\n private applyValue(v: AudienceFilter | null | undefined, emitImmediate: boolean): void {\n this.includes.set([...(v?.includes ?? [])]);\n this.excludes.set([...(v?.excludes ?? [])]);\n if (emitImmediate) this.emitState();\n }\n\n // ── Picker open/close + tabs ─────────────────────────────────────────────────\n\n openPicker(target: AudienceEditTarget): void {\n if (this.disabled()) return;\n this.editTarget.set(target);\n this.pickerOpen.set(true);\n this.errorKey.set(null);\n }\n\n closePicker(): void {\n this.pickerOpen.set(false);\n this.userSearchQuery.set('');\n this.userSearchResults.set([]);\n this.roleSearchQuery.set('');\n }\n\n selectKind(kind: AudienceTermKind): void {\n this.activeKind.set(kind);\n this.errorKey.set(null);\n }\n\n // ── User picker ──────────────────────────────────────────────────────────────\n\n onUserSearchInput(): void {\n const q = this.userSearchQuery().trim();\n if (q.length < 2) {\n this.userSearchResults.set([]);\n // Push the short query into the stream so distinctUntilChanged resets when the user\n // shortens and re-lengthens the query (otherwise \"foo\" → \"f\" → \"foo\" is a no-op).\n this.userSearch$.next(q);\n return;\n }\n this.userSearch$.next(q);\n }\n\n pickUser(user: ShareUserResult): void {\n this.addToActiveBucket((existing) => this.upsertUsersTerm(existing, user.id));\n this.userSearchQuery.set('');\n this.userSearchResults.set([]);\n }\n\n // ── Role picker ──────────────────────────────────────────────────────────────\n\n pickRole(role: RoleOuLookupRow): void {\n this.addToActiveBucket((existing) => this.upsertRolesTerm(existing, role.appId, role.roleKey));\n this.roleSearchQuery.set('');\n }\n\n // ── OU picker ────────────────────────────────────────────────────────────────\n\n onChartChange(chartId: string | null): void {\n this.selectedChartId.set(chartId);\n this.selectedChartId$.next(chartId);\n }\n\n pickOu(ou: ShareOuNode): void {\n const chartId = this.selectedChartId();\n const includeDescendants = this.ouIncludeDescendants();\n this.addToActiveBucket((existing) =>\n this.upsertOuTerm(existing, ou.id, chartId, includeDescendants),\n );\n }\n\n ouIndentStartPx(ou: ShareOuNode): number {\n const d = ou.depth ?? 0;\n return 12 + d * 18;\n }\n\n /**\n * Picks the chart id to seed the OU picker with. Honours explicit {@link defaultChartId}\n * first (even when null, since null is a valid id meaning \"default chart\"), then\n * {@link defaultChartSystemKey}, then falls back to host order. Lookup uses\n * <see cref=\"hasOwnProperty\"/> on the input keys to distinguish \"host did not set this\n * input\" from \"host set it to null\" — Angular reflects an unset input as <c>undefined</c>.\n */\n private resolveInitialChartId(opts: ShareOrgChartOption[]): string | null {\n if (this.defaultChartId !== undefined) {\n const exists = opts.some((o) => o.id === this.defaultChartId);\n return exists ? (this.defaultChartId as string | null) : (opts[0]?.id ?? null);\n }\n const key = this.defaultChartSystemKey;\n if (key) {\n const match = opts.find((o) => o.systemKey === key);\n if (match) return match.id;\n }\n return opts[0]?.id ?? null;\n }\n\n // ── App-everyone picker ──────────────────────────────────────────────────────\n\n pickAppEveryone(appId: string): void {\n this.addToActiveBucket((existing) => this.upsertAppEveryoneTerm(existing, appId));\n }\n\n // ── Chart picker ─────────────────────────────────────────────────────────────\n\n pickChart(chartId: string | null): void {\n if (!chartId) {\n this.errorKey.set('audience.error.chart_id_required');\n return;\n }\n this.addToActiveBucket((existing) => this.upsertChartTerm(existing, chartId));\n }\n\n // ── Preset picker ────────────────────────────────────────────────────────────\n\n pickPreset(preset: AudiencePresetKind): void {\n if (!this.selfUserId) {\n this.errorKey.set('audience.error.self_user_required');\n return;\n }\n const anchor = this.selfUserId;\n this.addToActiveBucket((existing) => this.upsertPresetTerm(existing, preset, anchor));\n }\n\n // ── Term removal ─────────────────────────────────────────────────────────────\n\n removeTerm(target: AudienceEditTarget, index: number): void {\n if (this.disabled()) return;\n const list = target === 'includes' ? this.includes() : this.excludes();\n const next = list.filter((_, i) => i !== index);\n if (target === 'includes') this.includes.set(next);\n else this.excludes.set(next);\n this.emitState();\n }\n\n removeUserId(target: AudienceEditTarget, termIndex: number, userId: string): void {\n this.editTermAt(target, termIndex, (term) => {\n if (term.kind !== 'users') return term;\n const next = term.userIds.filter((id) => id !== userId);\n return next.length === 0 ? null : { ...term, userIds: next };\n });\n }\n\n removeRoleKey(target: AudienceEditTarget, termIndex: number, roleKey: string): void {\n this.editTermAt(target, termIndex, (term) => {\n if (term.kind !== 'roles') return term;\n const next = term.roleKeys.filter((k) => k !== roleKey);\n return next.length === 0 ? null : { ...term, roleKeys: next };\n });\n }\n\n removeOuId(target: AudienceEditTarget, termIndex: number, ouId: string): void {\n this.editTermAt(target, termIndex, (term) => {\n if (term.kind !== 'ou') return term;\n const next = term.ouIds.filter((id) => id !== ouId);\n return next.length === 0 ? null : { ...term, ouIds: next };\n });\n }\n\n // ── Public read API ──────────────────────────────────────────────────────────\n\n /** Returns the current filter snapshot — useful for hosts that want to peek without subscribing. */\n snapshot(): AudienceFilter {\n return this.buildFilter();\n }\n\n // ── ControlValueAccessor implementation ──────────────────────────────────────\n\n /**\n * Called by the forms infrastructure to push a new value into the control. Mirrors the\n * `[value]` setter path — re-uses `applyValue` so template-driven and reactive callers\n * converge on the same hydration code.\n */\n writeValue(value: AudienceFilter | null | undefined): void {\n this.applyValue(value, /* emitImmediate */ false);\n }\n\n registerOnChange(fn: (value: AudienceFilter) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n if (isDisabled) this.closePicker();\n }\n\n // ── Validator implementation ─────────────────────────────────────────────────\n\n /**\n * Aligns Angular's reactive-forms validity with the component's own `validityChange`\n * output. Returns `audienceRequired` when includes is empty (the canonical \"zero\n * recipients\" guard) and `audienceTooManyTerms` when over the per-filter cap.\n * <br>\n * The output-event path (<see cref=\"emitState\"/>) reuses this method so there is ONE\n * definition of \"valid\" — the classic \"two almost-identical validators drifted\" bug\n * cannot recur here.\n */\n validate(_: AbstractControl): ValidationErrors | null {\n return this.validateFilter(this.buildFilter());\n }\n\n private validateFilter(candidate: AudienceFilter): ValidationErrors | null {\n if (candidate.includes.length === 0) return { audienceRequired: true };\n const total = candidate.includes.length + (candidate.excludes?.length ?? 0);\n if (total > AUDIENCE_LIMITS.maxTermsPerFilter) {\n return { audienceTooManyTerms: { actual: total, max: AUDIENCE_LIMITS.maxTermsPerFilter } };\n }\n return null;\n }\n\n registerOnValidatorChange(fn: () => void): void {\n this.onValidatorChange = fn;\n }\n\n // ── Term display helpers ─────────────────────────────────────────────────────\n\n ouLabel(ouId: string): string {\n const match = this.ouTree().find((o) => o.id === ouId);\n return match?.displayName ?? `${ouId.substring(0, 8)}…`;\n }\n\n roleLabel(appId: string, roleKey: string): string {\n const match = this.roleOus().find((r) => r.appId === appId && r.roleKey === roleKey);\n return match?.displayName ?? `${appId}:${roleKey}`;\n }\n\n appLabel(appId: string): string {\n if (appId === '*') return this.i18n.t('audience.app_everyone_wildcard');\n const match = this.appEveryoneOptions.find((a) => a.appId === appId);\n return match?.displayName ?? appId;\n }\n\n chartLabel(chartId: string): string {\n const match = this.chartOptions().find((c) => c.id === chartId);\n return match?.name ?? `${chartId.substring(0, 8)}…`;\n }\n\n /**\n * Locale key for a term kind. Replaces hyphens with underscores so the JSON file uses\n * one consistent naming convention (`audience.kind_app_everyone`, not the hyphen variant).\n */\n kindLocaleKey(kind: AudienceTermKind): string {\n return `audience.kind_${kind.replace(/-/g, '_')}`;\n }\n\n /** Same convention as {@link kindLocaleKey} but for preset names. */\n presetLocaleKey(preset: AudiencePresetKind): string {\n return `audience.preset_${preset.replace(/-/g, '_')}`;\n }\n\n /** Picon icon CSS class for a term kind tab — kept here so the template stays declarative. */\n kindIconClass(kind: AudienceTermKind): string {\n switch (kind) {\n case 'users': return 'pi pi-user';\n case 'roles': return 'pi pi-id-card';\n case 'ou': return 'pi pi-sitemap';\n case 'app-everyone': return 'pi pi-globe';\n case 'chart': return 'pi pi-share-alt';\n case 'preset': return 'pi pi-star';\n }\n }\n\n // ── Internal helpers — upsert + state emission ───────────────────────────────\n\n private addToActiveBucket(upsert: (existing: AudienceTerm[]) => AudienceTerm[]): void {\n if (this.disabled()) return;\n const target = this.editTarget();\n const current = target === 'includes' ? this.includes() : this.excludes();\n const next = upsert(current);\n if (this.totalTermCount(next, target) > AUDIENCE_LIMITS.maxTermsPerFilter) {\n this.errorKey.set('audience.error.too_many_terms');\n return;\n }\n if (target === 'includes') this.includes.set(next);\n else this.excludes.set(next);\n this.errorKey.set(null);\n this.emitState();\n }\n\n private editTermAt(\n target: AudienceEditTarget,\n index: number,\n fn: (term: AudienceTerm) => AudienceTerm | null,\n ): void {\n if (this.disabled()) return;\n const list = target === 'includes' ? this.includes() : this.excludes();\n const term = list[index];\n if (!term) return;\n const replaced = fn(term);\n const next = replaced === null\n ? list.filter((_, i) => i !== index)\n : list.map((t, i) => (i === index ? replaced : t));\n if (target === 'includes') this.includes.set(next);\n else this.excludes.set(next);\n this.emitState();\n }\n\n private totalTermCount(replacement: AudienceTerm[], target: AudienceEditTarget): number {\n const inc = target === 'includes' ? replacement : this.includes();\n const exc = target === 'excludes' ? replacement : this.excludes();\n return inc.length + exc.length;\n }\n\n private upsertUsersTerm(existing: AudienceTerm[], userId: string): AudienceTerm[] {\n const idx = existing.findIndex((t) => t.kind === 'users');\n if (idx < 0) {\n const term: UsersTerm = { kind: 'users', userIds: [userId] };\n return [...existing, term];\n }\n const term = existing[idx] as UsersTerm;\n if (term.userIds.includes(userId)) return existing; // idempotent\n if (term.userIds.length >= AUDIENCE_LIMITS.maxUserIdsPerTerm) {\n this.errorKey.set('audience.error.too_many_users_per_term');\n return existing;\n }\n return existing.map((t, i) =>\n i === idx ? { ...term, userIds: [...term.userIds, userId] } : t,\n );\n }\n\n private upsertRolesTerm(\n existing: AudienceTerm[],\n appId: string,\n roleKey: string,\n ): AudienceTerm[] {\n const idx = existing.findIndex((t) => t.kind === 'roles' && t.appId === appId);\n if (idx < 0) {\n const term: RolesTerm = { kind: 'roles', appId, roleKeys: [roleKey] };\n return [...existing, term];\n }\n const term = existing[idx] as RolesTerm;\n if (term.roleKeys.includes(roleKey)) return existing;\n if (term.roleKeys.length >= AUDIENCE_LIMITS.maxRoleKeysPerTerm) {\n this.errorKey.set('audience.error.too_many_roles_per_term');\n return existing;\n }\n return existing.map((t, i) =>\n i === idx ? { ...term, roleKeys: [...term.roleKeys, roleKey] } : t,\n );\n }\n\n private upsertOuTerm(\n existing: AudienceTerm[],\n ouId: string,\n chartId: string | null,\n includeDescendants: boolean,\n ): AudienceTerm[] {\n const idx = existing.findIndex(\n (t) =>\n t.kind === 'ou'\n && t.chartId === chartId\n && t.includeDescendants === includeDescendants,\n );\n if (idx < 0) {\n const term: OuTerm = {\n kind: 'ou',\n ouIds: [ouId],\n chartId,\n includeDescendants,\n };\n return [...existing, term];\n }\n const term = existing[idx] as OuTerm;\n if (term.ouIds.includes(ouId)) return existing;\n if (term.ouIds.length >= AUDIENCE_LIMITS.maxOuIdsPerTerm) {\n this.errorKey.set('audience.error.too_many_ous_per_term');\n return existing;\n }\n return existing.map((t, i) =>\n i === idx ? { ...term, ouIds: [...term.ouIds, ouId] } : t,\n );\n }\n\n private upsertAppEveryoneTerm(existing: AudienceTerm[], appId: string): AudienceTerm[] {\n const exists = existing.some((t) => t.kind === 'app-everyone' && t.appId === appId);\n if (exists) return existing;\n const term: AppEveryoneTerm = { kind: 'app-everyone', appId };\n return [...existing, term];\n }\n\n private upsertChartTerm(existing: AudienceTerm[], chartId: string): AudienceTerm[] {\n const exists = existing.some((t) => t.kind === 'chart' && t.chartId === chartId);\n if (exists) return existing;\n const term: ChartTerm = { kind: 'chart', chartId };\n return [...existing, term];\n }\n\n private upsertPresetTerm(\n existing: AudienceTerm[],\n preset: AudiencePresetKind,\n anchorUserId: string,\n ): AudienceTerm[] {\n const exists = existing.some(\n (t) => t.kind === 'preset' && t.preset === preset && t.anchorUserId === anchorUserId,\n );\n if (exists) return existing;\n const term: PresetTerm = { kind: 'preset', preset, anchorUserId };\n return [...existing, term];\n }\n\n private buildFilter(): AudienceFilter {\n const inc = this.includes();\n const exc = this.excludes();\n return {\n includes: inc,\n ...(exc.length > 0 ? { excludes: exc } : {}),\n ...(this.value?.options ? { options: this.value.options } : {}),\n };\n }\n\n private emitState(): void {\n const filter = this.buildFilter();\n this.audienceChange.emit(filter);\n this.validityChange.emit(this.computeValidity(filter));\n // Forward to the forms infrastructure so reactive forms see the change.\n this.onChange(filter);\n this.onTouched();\n this.onValidatorChange();\n }\n\n /**\n * Emits ONLY the validity signal (component output + forms-validator hook). Used by\n * <see cref=\"ngOnChanges\"/> when the host pushes a new value: the host already knows the\n * value it sent, so re-firing onChange / audienceChange is redundant and risks feedback\n * loops with two-way bindings; but the validity flag may genuinely have flipped and the\n * host needs that to enable / disable submit.\n */\n private emitValidityOnly(): void {\n const filter = this.buildFilter();\n this.validityChange.emit(this.computeValidity(filter));\n this.onValidatorChange();\n }\n\n private computeValidity(candidate: AudienceFilter): boolean {\n // Single-source: delegate to validateFilter so the output flag and the form-validator\n // result agree by construction.\n return this.validateFilter(candidate) === null;\n }\n}\n\n/**\n * Re-export the typed template context so test code (and very advanced hosts that build\n * their own term cards) can refer to it without reaching into the component module.\n */\nexport type AudienceTermCardContext = TermCardContext;\n","<div class=\"fab-root\">\n\n <!-- Includes section -->\n <div class=\"fab-bucket\">\n <div class=\"fab-bucket-header\">\n <div class=\"fab-section-label\" id=\"fab-includes-label\">{{ 'audience.includes' | translate }}</div>\n <button\n type=\"button\"\n class=\"fab-add-btn\"\n (click)=\"openPicker('includes')\"\n [attr.aria-expanded]=\"pickerOpen() && editTarget() === 'includes'\"\n [attr.aria-controls]=\"pickerOpen() && editTarget() === 'includes' ? 'fab-picker-region' : null\"\n >\n <i class=\"pi pi-plus\" aria-hidden=\"true\"></i>\n {{ 'audience.add_term' | translate }}\n </button>\n </div>\n\n @if (includes().length === 0) {\n <div class=\"fab-empty\">{{ 'audience.includes_empty' | translate }}</div>\n } @else {\n <ul class=\"fab-term-list\" aria-labelledby=\"fab-includes-label\">\n @for (term of includes(); track term) {\n <li class=\"fab-term\">\n <ng-container\n *ngTemplateOutlet=\"termCard; context: { $implicit: term, target: 'includes', index: $index }\">\n </ng-container>\n </li>\n }\n </ul>\n }\n </div>\n\n <!-- Excludes section -->\n @if (showExcludes) {\n <div class=\"fab-bucket fab-bucket-exclude\">\n <div class=\"fab-bucket-header\">\n <div class=\"fab-section-label\" id=\"fab-excludes-label\">{{ 'audience.excludes' | translate }}</div>\n <button\n type=\"button\"\n class=\"fab-add-btn\"\n (click)=\"openPicker('excludes')\"\n [attr.aria-expanded]=\"pickerOpen() && editTarget() === 'excludes'\"\n [attr.aria-controls]=\"pickerOpen() && editTarget() === 'excludes' ? 'fab-picker-region' : null\"\n >\n <i class=\"pi pi-plus\" aria-hidden=\"true\"></i>\n {{ 'audience.add_term' | translate }}\n </button>\n </div>\n\n @if (excludes().length === 0) {\n <div class=\"fab-empty\">{{ 'audience.excludes_empty' | translate }}</div>\n } @else {\n <ul class=\"fab-term-list\" aria-labelledby=\"fab-excludes-label\">\n @for (term of excludes(); track term) {\n <li class=\"fab-term\">\n <ng-container\n *ngTemplateOutlet=\"termCard; context: { $implicit: term, target: 'excludes', index: $index }\">\n </ng-container>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n <!-- Inline picker (shared across includes/excludes; gated by pickerOpen) -->\n @if (pickerOpen()) {\n <div\n id=\"fab-picker-region\"\n class=\"fab-picker\"\n role=\"region\"\n [attr.aria-label]=\"(editTarget() === 'includes'\n ? ('audience.adding_to_includes' | translate)\n : ('audience.adding_to_excludes' | translate))\"\n >\n <div class=\"fab-picker-header\">\n <span class=\"fab-picker-target\">\n {{\n editTarget() === 'includes'\n ? ('audience.adding_to_includes' | translate)\n : ('audience.adding_to_excludes' | translate)\n }}\n </span>\n <button type=\"button\" class=\"fab-close\" (click)=\"closePicker()\" [attr.aria-label]=\"'audience.close' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Kind tabs -->\n <div class=\"fab-kind-tabs\" role=\"tablist\">\n @for (kind of supportedKinds; track kind) {\n <button\n type=\"button\"\n role=\"tab\"\n class=\"fab-kind-tab\"\n [id]=\"'fab-tab-' + kind\"\n [class.active]=\"activeKind() === kind\"\n [attr.aria-selected]=\"activeKind() === kind\"\n [attr.aria-controls]=\"'fab-tabpanel-' + kind\"\n (click)=\"selectKind(kind)\"\n >\n <i [class]=\"kindIconClass(kind)\" aria-hidden=\"true\"></i>\n <span>{{ kindLocaleKey(kind) | translate }}</span>\n </button>\n }\n </div>\n\n @if (errorKey()) {\n <div class=\"fab-inline-error\" role=\"alert\">\n <i class=\"pi pi-exclamation-triangle\" aria-hidden=\"true\"></i>\n {{ errorKey()! | translate }}\n </div>\n }\n\n <!-- Per-kind picker bodies -->\n <div\n class=\"fab-picker-body\"\n role=\"tabpanel\"\n [id]=\"'fab-tabpanel-' + activeKind()\"\n [attr.aria-labelledby]=\"'fab-tab-' + activeKind()\"\n >\n @switch (activeKind()) {\n\n @case ('users') {\n <input\n type=\"text\"\n class=\"fab-input\"\n [ngModel]=\"userSearchQuery()\"\n (ngModelChange)=\"userSearchQuery.set($event); onUserSearchInput()\"\n [placeholder]=\"'audience.search_users_placeholder' | translate\"\n [attr.aria-label]=\"'audience.search_users_placeholder' | translate\"\n />\n @if (userSearchResults().length > 0) {\n <div class=\"fab-result-list\" role=\"list\">\n @for (u of userSearchResults(); track u.id) {\n <button type=\"button\" role=\"listitem\" class=\"fab-result-item\" (click)=\"pickUser(u)\">\n <i class=\"pi pi-user\" aria-hidden=\"true\"></i>\n <span>{{ u.firstName }} {{ u.lastName }}</span>\n <span class=\"fab-result-secondary\">{{ u.email }}</span>\n </button>\n }\n </div>\n } @else if (userSearchQuery().length >= 2) {\n <div class=\"fab-empty\">{{ 'audience.no_users_match' | translate }}</div>\n }\n }\n\n @case ('roles') {\n @if (loadRoleOus && roleOus().length > 0) {\n <input\n type=\"text\"\n class=\"fab-input\"\n [ngModel]=\"roleSearchQuery()\"\n (ngModelChange)=\"roleSearchQuery.set($event)\"\n [placeholder]=\"'audience.search_roles_placeholder' | translate\"\n [attr.aria-label]=\"'audience.search_roles_placeholder' | translate\"\n />\n <div class=\"fab-result-list\" role=\"list\">\n @for (role of filteredRoles(); track role.ouId) {\n <button type=\"button\" role=\"listitem\" class=\"fab-result-item\" (click)=\"pickRole(role)\">\n <i class=\"pi pi-id-card\" aria-hidden=\"true\"></i>\n <span>{{ role.displayName }}</span>\n <span class=\"fab-result-secondary\">{{ role.appId }}</span>\n </button>\n }\n @if (filteredRoles().length === 0) {\n <div class=\"fab-empty\">{{ 'audience.no_roles_match' | translate }}</div>\n }\n </div>\n } @else {\n <div class=\"fab-empty\">{{ 'audience.roles_unavailable' | translate }}</div>\n }\n }\n\n @case ('ou') {\n @if (chartOptions().length > 0) {\n <label for=\"fab-chart-select\" class=\"fab-mini-label\">\n {{ 'audience.org_chart' | translate }}\n </label>\n <select\n id=\"fab-chart-select\"\n class=\"fab-select\"\n [ngModel]=\"selectedChartId()\"\n (ngModelChange)=\"onChartChange($event)\"\n >\n @for (opt of chartOptions(); track $index) {\n <option [ngValue]=\"opt.id\">{{ opt.name }}</option>\n }\n </select>\n }\n <label class=\"fab-checkbox-label\">\n <input\n type=\"checkbox\"\n [ngModel]=\"ouIncludeDescendants()\"\n (ngModelChange)=\"ouIncludeDescendants.set($event)\"\n />\n {{ 'audience.include_descendants' | translate }}\n </label>\n @if (ouTree().length === 0) {\n <div class=\"fab-empty\">{{ 'audience.ou_tree_empty' | translate }}</div>\n } @else {\n <div class=\"fab-result-list fab-ou-tree\" role=\"list\">\n @for (ou of ouTree(); track ou.id) {\n <button\n type=\"button\"\n role=\"listitem\"\n class=\"fab-result-item\"\n [style.padding-inline-start.px]=\"ouIndentStartPx(ou)\"\n (click)=\"pickOu(ou)\"\n >\n <i class=\"pi pi-sitemap\" aria-hidden=\"true\"></i>\n <span>{{ ou.displayName }}</span>\n </button>\n }\n </div>\n }\n }\n\n @case ('app-everyone') {\n @if (appEveryoneOptions.length === 0) {\n <div class=\"fab-empty\">{{ 'audience.app_everyone_empty' | translate }}</div>\n } @else {\n <div class=\"fab-result-list\" role=\"list\">\n @for (app of appEveryoneOptions; track app.appId) {\n <button type=\"button\" role=\"listitem\" class=\"fab-result-item\" (click)=\"pickAppEveryone(app.appId)\">\n <i class=\"pi pi-globe\" aria-hidden=\"true\"></i>\n <span>{{ app.displayName }}</span>\n <span class=\"fab-result-secondary\">{{ app.appId }}</span>\n </button>\n }\n </div>\n }\n }\n\n @case ('chart') {\n @if (chartTermOptions().length === 0) {\n <div class=\"fab-empty\">{{ 'audience.chart_options_empty' | translate }}</div>\n } @else {\n <div class=\"fab-result-list\" role=\"list\">\n @for (opt of chartTermOptions(); track opt.id) {\n <button type=\"button\" role=\"listitem\" class=\"fab-result-item\" (click)=\"pickChart(opt.id)\">\n <i class=\"pi pi-share-alt\" aria-hidden=\"true\"></i>\n <span>{{ opt.name }}</span>\n </button>\n }\n </div>\n }\n }\n\n @case ('preset') {\n <div class=\"fab-result-list\" role=\"list\">\n @for (p of presetOptions; track p) {\n <button type=\"button\" role=\"listitem\" class=\"fab-result-item\" (click)=\"pickPreset(p)\">\n <i class=\"pi pi-star\" aria-hidden=\"true\"></i>\n <span>{{ presetLocaleKey(p) | translate }}</span>\n </button>\n }\n </div>\n }\n }\n </div>\n </div>\n }\n\n</div>\n\n<!-- Reusable term card template, parameterised by target bucket + index for removal callbacks -->\n<ng-template #termCard let-term let-target=\"target\" let-index=\"index\">\n <div class=\"fab-term-card\" [class.fab-term-exclude]=\"target === 'excludes'\">\n\n @switch (term.kind) {\n @case ('users') {\n <div class=\"fab-term-head\">\n <i class=\"pi pi-user\" aria-hidden=\"true\"></i>\n <span class=\"fab-term-title\">\n {{ 'audience.term_users' | translate: { count: term.userIds.length } }}\n </span>\n <button type=\"button\" class=\"fab-icon-btn danger\" (click)=\"removeTerm(target, index)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"fab-term-chips\">\n @for (id of term.userIds; track id) {\n <span class=\"fab-chip\">\n <i class=\"pi pi-user\" aria-hidden=\"true\"></i>\n <span>{{ id.substring(0, 8) }}…</span>\n <button type=\"button\" class=\"fab-chip-x\" (click)=\"removeUserId(target, index, id)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </span>\n }\n </div>\n }\n\n @case ('roles') {\n <div class=\"fab-term-head\">\n <i class=\"pi pi-id-card\" aria-hidden=\"true\"></i>\n <span class=\"fab-term-title\">\n {{ 'audience.term_roles' | translate: { app: appLabel(term.appId), count: term.roleKeys.length } }}\n </span>\n <button type=\"button\" class=\"fab-icon-btn danger\" (click)=\"removeTerm(target, index)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"fab-term-chips\">\n @for (k of term.roleKeys; track k) {\n <span class=\"fab-chip\">\n <i class=\"pi pi-id-card\" aria-hidden=\"true\"></i>\n <span>{{ roleLabel(term.appId, k) }}</span>\n <button type=\"button\" class=\"fab-chip-x\" (click)=\"removeRoleKey(target, index, k)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </span>\n }\n </div>\n }\n\n @case ('ou') {\n <div class=\"fab-term-head\">\n <i class=\"pi pi-sitemap\" aria-hidden=\"true\"></i>\n <span class=\"fab-term-title\">\n {{ 'audience.term_ous' | translate: { count: term.ouIds.length } }}\n @if (term.includeDescendants) {\n <span class=\"fab-badge\">{{ 'audience.descendants_badge' | translate }}</span>\n }\n </span>\n <button type=\"button\" class=\"fab-icon-btn danger\" (click)=\"removeTerm(target, index)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"fab-term-chips\">\n @for (id of term.ouIds; track id) {\n <span class=\"fab-chip\">\n <i class=\"pi pi-sitemap\" aria-hidden=\"true\"></i>\n <span>{{ ouLabel(id) }}</span>\n <button type=\"button\" class=\"fab-chip-x\" (click)=\"removeOuId(target, index, id)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </span>\n }\n </div>\n }\n\n @case ('app-everyone') {\n <div class=\"fab-term-head\">\n <i class=\"pi pi-globe\" aria-hidden=\"true\"></i>\n <span class=\"fab-term-title\">\n {{ 'audience.term_app_everyone' | translate: { app: appLabel(term.appId) } }}\n </span>\n <button type=\"button\" class=\"fab-icon-btn danger\" (click)=\"removeTerm(target, index)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n @case ('chart') {\n <div class=\"fab-term-head\">\n <i class=\"pi pi-share-alt\" aria-hidden=\"true\"></i>\n <span class=\"fab-term-title\">\n {{ 'audience.term_chart' | translate: { chart: chartLabel(term.chartId) } }}\n </span>\n <button type=\"button\" class=\"fab-icon-btn danger\" (click)=\"removeTerm(target, index)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n @case ('preset') {\n <div class=\"fab-term-head\">\n <i class=\"pi pi-star\" aria-hidden=\"true\"></i>\n <span class=\"fab-term-title\">\n {{ presetLocaleKey(term.preset) | translate }}\n </span>\n <button type=\"button\" class=\"fab-icon-btn danger\" (click)=\"removeTerm(target, index)\"\n [attr.aria-label]=\"'audience.remove_term' | translate\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n }\n </div>\n</ng-template>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\n\n/** Full-bleed loading overlay for window content (shell) or embedded hosts. */\n@Component({\n selector: 'fly-block-ui',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: './block-ui.component.html',\n styleUrl: './block-ui.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FlyBlockUiComponent {\n /** When false, the overlay is not rendered (host may use @if instead). */\n active = input.required<boolean>();\n\n /** i18n key for status text; empty uses `common.loading`. */\n messageKey = input('');\n\n readonly resolvedMessageKey = computed(() => {\n const k = this.messageKey()?.trim();\n return k && k.length > 0 ? k : 'common.loading';\n });\n}\n","@if (active()) {\n <div\n class=\"fly-block-ui\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n [attr.aria-label]=\"resolvedMessageKey() | translate\">\n <div class=\"fly-block-ui__card\">\n <i class=\"pi pi-spin pi-spinner fly-block-ui__spinner\" aria-hidden=\"true\"></i>\n <span class=\"fly-block-ui__text\">{{ resolvedMessageKey() | translate }}</span>\n </div>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport type { FlyFileInfo } from '../../models/file.model';\nimport Cropper from 'cropperjs';\n\n/**\n * Image upload component with built-in cropperjs cropping modal.\n *\n * Usage:\n * ```html\n * <fly-image-upload\n * [aspectRatio]=\"16/9\"\n * [currentImageId]=\"trend.coverImageId\"\n * sourceApp=\"circles\"\n * sourceEntityType=\"trend\"\n * (uploaded)=\"onImageUploaded($event)\"\n * (removed)=\"onImageRemoved()\"\n * />\n * ```\n */\n@Component({\n selector: 'fly-image-upload',\n standalone: true,\n imports: [TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"fly-image-upload\">\n @if (previewUrl()) {\n <div class=\"fly-image-upload__preview\">\n <img [src]=\"previewUrl()\" alt=\"\" class=\"fly-image-upload__img\" />\n <div class=\"fly-image-upload__overlay\">\n <button type=\"button\" class=\"fly-image-upload__action-btn\" (click)=\"triggerFileInput()\" [title]=\"'files.imageUpload.change' | translate\">\n <span class=\"pi pi-pencil\" aria-hidden=\"true\"></span>\n </button>\n <button type=\"button\" class=\"fly-image-upload__action-btn fly-image-upload__action-btn--danger\" (click)=\"removeImage()\" [title]=\"'files.imageUpload.remove' | translate\">\n <span class=\"pi pi-trash\" aria-hidden=\"true\"></span>\n </button>\n </div>\n </div>\n } @else {\n <button type=\"button\" class=\"fly-image-upload__dropzone\" (click)=\"triggerFileInput()\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event)\">\n @if (uploading()) {\n <span class=\"pi pi-spin pi-spinner fly-image-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-image-upload__label\">{{ 'files.imageUpload.uploading' | translate }}</span>\n } @else {\n <span class=\"pi pi-image fly-image-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-image-upload__label\">{{ 'files.imageUpload.placeholder' | translate }}</span>\n <span class=\"fly-image-upload__hint\">{{ sizeHint() }}</span>\n }\n </button>\n }\n\n @if (error()) {\n <div class=\"fly-image-upload__error\">{{ error() }}</div>\n }\n\n <input #fileInput type=\"file\" accept=\"image/*\" class=\"fly-image-upload__hidden\" (change)=\"onFileSelected($event)\" />\n\n @if (showCropper()) {\n <div class=\"fly-image-upload__crop-backdrop\" (click)=\"cancelCrop()\">\n <div class=\"fly-image-upload__crop-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"fly-image-upload__crop-header\">\n <h3>{{ 'files.imageUpload.crop' | translate }}</h3>\n </div>\n <div class=\"fly-image-upload__crop-body\">\n <img #cropImage [src]=\"rawImageUrl()\" alt=\"\" />\n </div>\n <div class=\"fly-image-upload__crop-footer\">\n <button type=\"button\" class=\"vos-btn sm platter\" (click)=\"cancelCrop()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"button\" class=\"vos-btn sm primary\" (click)=\"applyCrop()\">{{ 'files.imageUpload.apply' | translate }}</button>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [\n /* cropperjs v1 styles (MIT — Chen Fengyuan) */\n `.cropper-container{-webkit-touch-callout:none;direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:rgba(51,153,255,.75);overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:\" \";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC\")}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}`,\n `\n .fly-image-upload { display: flex; flex-direction: column; gap: 6px; }\n .fly-image-upload__hidden { display: none; }\n\n .fly-image-upload__dropzone {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 8px; padding: 24px; border: 2px dashed var(--separator-primary, #e5e7eb);\n border-radius: 12px; background: var(--fill-quaternary, #f9fafb); cursor: pointer;\n transition: border-color 0.15s, background 0.15s; min-height: 120px;\n }\n .fly-image-upload__dropzone:hover { border-color: var(--accent-primary, #0071e3); background: var(--fill-tertiary, #f3f4f6); }\n .fly-image-upload__icon { font-size: 28px; color: var(--label-tertiary, #9ca3af); }\n .fly-image-upload__label { font-size: 13px; color: var(--label-secondary, #6b7280); }\n .fly-image-upload__hint { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-image-upload__preview { position: relative; border-radius: 12px; overflow: hidden; }\n .fly-image-upload__img { display: block; width: 100%; max-height: 280px; object-fit: cover; border-radius: 12px; }\n .fly-image-upload__overlay {\n position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;\n gap: 12px; background: rgba(0,0,0,0.35); opacity: 0; transition: opacity 0.15s;\n }\n .fly-image-upload__preview:hover .fly-image-upload__overlay { opacity: 1; }\n .fly-image-upload__action-btn {\n width: 36px; height: 36px; border-radius: 50%; border: none; cursor: pointer;\n display: flex; align-items: center; justify-content: center;\n background: rgba(255,255,255,0.9); color: var(--label-primary, #1f2937); font-size: 14px;\n transition: background 0.15s;\n }\n .fly-image-upload__action-btn:hover { background: #fff; }\n .fly-image-upload__action-btn--danger:hover { background: #fee2e2; color: #dc2626; }\n\n .fly-image-upload__error { font-size: 12px; color: var(--system-red, #ef4444); }\n\n .fly-image-upload__crop-backdrop {\n position: fixed; inset: 0; z-index: 10000; display: flex; align-items: center; justify-content: center;\n background: rgba(0,0,0,0.6); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);\n }\n .fly-image-upload__crop-modal {\n background: var(--bg-primary, #fff); color: var(--label-primary, #1f2937);\n border-radius: 16px; overflow: hidden;\n max-width: 700px; width: 90vw; box-shadow: 0 20px 60px rgba(0,0,0,0.4);\n border: 1px solid var(--separator-primary, rgba(0,0,0,0.1));\n }\n .fly-image-upload__crop-header {\n padding: 16px 20px; border-bottom: 1px solid var(--separator-primary, #e5e7eb);\n background: var(--fill-quaternary, transparent);\n }\n .fly-image-upload__crop-header h3 {\n margin: 0; font-size: 16px; font-weight: 600; color: var(--label-primary, #1f2937);\n }\n .fly-image-upload__crop-body {\n max-height: 60vh; overflow: hidden; background: var(--fill-tertiary, #f3f4f6);\n }\n .fly-image-upload__crop-body img { display: block; max-width: 100%; }\n .fly-image-upload__crop-footer {\n display: flex; justify-content: flex-end; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--separator-primary, #e5e7eb);\n background: var(--fill-quaternary, transparent);\n }\n\n /* Dark theme */\n html.dark-theme .fly-image-upload__crop-modal {\n background: var(--bg-primary, #1c1c1e);\n border: 1px solid var(--separator-primary, rgba(255,255,255,0.1));\n }\n html.dark-theme .fly-image-upload__crop-body { background: var(--fill-tertiary, #2c2c2e); }\n `],\n})\nexport class FlyImageUploadComponent {\n private http = inject(HttpClient);\n private injector = inject(Injector);\n\n // ── Inputs ──\n aspectRatio = input(16 / 9);\n maxSizeBytes = input(5 * 1024 * 1024);\n currentImageId = input<string | null>(null);\n sourceApp = input('unknown');\n sourceEntityType = input<string | null>(null);\n sourceEntityId = input<string | null>(null);\n\n // ── Outputs ──\n uploaded = output<FlyFileInfo>();\n removed = output<void>();\n\n // ── State ──\n uploading = signal(false);\n error = signal<string | null>(null);\n showCropper = signal(false);\n rawImageUrl = signal<string>('');\n localBlob = signal<string | null>(null);\n\n fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n cropImage = viewChild<ElementRef<HTMLImageElement>>('cropImage');\n\n private cropper: Cropper | null = null;\n private selectedFile: File | null = null;\n\n /** Resolved preview URL — uses blob for local uploads, fetches authenticated for existing images */\n previewUrl = signal<string | null>(null);\n\n constructor() {\n // React to currentImageId changes — fetch authenticated blob\n effect((onCleanup) => {\n const local = this.localBlob();\n if (local) { this.previewUrl.set(local); return; }\n\n const id = this.currentImageId();\n if (!id) { this.previewUrl.set(null); return; }\n\n const sub = this.http.get(`/api/files/${id}/download`, { responseType: 'blob' }).subscribe({\n next: (blob) => this.previewUrl.set(URL.createObjectURL(blob)),\n error: () => this.previewUrl.set(null),\n });\n onCleanup(() => sub.unsubscribe());\n });\n }\n\n sizeHint = computed(() => {\n const mb = this.maxSizeBytes() / (1024 * 1024);\n return `Max ${mb}MB`;\n });\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n onDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n }\n\n onDrop(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n const file = e.dataTransfer?.files?.[0];\n if (file) this.processFile(file);\n }\n\n onFileSelected(e: Event): void {\n const input = e.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) this.processFile(file);\n input.value = '';\n }\n\n removeImage(): void {\n this.localBlob.set(null);\n this.previewUrl.set(null);\n this.error.set(null);\n this.removed.emit();\n }\n\n cancelCrop(): void {\n this.showCropper.set(false);\n this.destroyCropper();\n if (this.rawImageUrl()) URL.revokeObjectURL(this.rawImageUrl());\n this.rawImageUrl.set('');\n }\n\n applyCrop(): void {\n if (!this.cropper) return;\n const canvas = this.cropper.getCroppedCanvas({ maxWidth: 1920, maxHeight: 1080 });\n this.showCropper.set(false);\n this.destroyCropper();\n if (this.rawImageUrl()) URL.revokeObjectURL(this.rawImageUrl());\n this.rawImageUrl.set('');\n\n canvas.toBlob((blob) => {\n if (!blob) return;\n const fileName = this.selectedFile?.name ?? 'cropped-image.jpg';\n const file = new File([blob], fileName, { type: blob.type || 'image/jpeg' });\n this.uploadFile(file);\n }, 'image/jpeg', 0.9);\n }\n\n private processFile(file: File): void {\n this.error.set(null);\n\n if (!file.type.startsWith('image/')) {\n this.error.set('Only image files are allowed');\n return;\n }\n if (file.size > this.maxSizeBytes()) {\n const mb = this.maxSizeBytes() / (1024 * 1024);\n this.error.set(`File exceeds ${mb}MB limit`);\n return;\n }\n\n this.selectedFile = file;\n const url = URL.createObjectURL(file);\n this.rawImageUrl.set(url);\n this.showCropper.set(true);\n\n // Init cropperjs after the @if (showCropper()) block has rendered and\n // the #cropImage signal viewQuery is populated. setTimeout(0) used to\n // race here under Native Federation when fewer host CD passes happen\n // before the macrotask fires (cropImage() returned undefined and\n // initCropper bailed). afterNextRender is deterministic.\n afterNextRender(() => this.initCropper(), { injector: this.injector });\n }\n\n private initCropper(): void {\n this.destroyCropper();\n const imgEl = this.cropImage()?.nativeElement;\n if (!imgEl) return;\n this.cropper = new Cropper(imgEl, {\n aspectRatio: this.aspectRatio(),\n viewMode: 1,\n autoCropArea: 0.9,\n responsive: true,\n background: false,\n });\n }\n\n private destroyCropper(): void {\n this.cropper?.destroy();\n this.cropper = null;\n }\n\n private uploadFile(file: File): void {\n this.uploading.set(true);\n this.error.set(null);\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n formData.append('sourceApp', this.sourceApp());\n if (this.sourceEntityType()) formData.append('sourceEntityType', this.sourceEntityType()!);\n if (this.sourceEntityId()) formData.append('sourceEntityId', this.sourceEntityId()!);\n\n this.http.post<{ data: FlyFileInfo }>('/api/files/upload', formData).subscribe({\n next: (res) => {\n this.uploading.set(false);\n const info = res.data ?? (res as any);\n this.localBlob.set(URL.createObjectURL(file));\n this.uploaded.emit(info);\n },\n error: (err) => {\n this.uploading.set(false);\n this.error.set(err?.error?.message ?? 'Upload failed');\n },\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { HttpClient, HttpEventType } from '@angular/common/http';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport type { FlyFileInfo } from '../../models/file.model';\n\ninterface UploadSlot {\n file: File;\n progress: number; // 0–100\n status: 'uploading' | 'done' | 'error';\n info?: FlyFileInfo;\n error?: string;\n}\n\nconst FILE_ICONS: Record<string, string> = {\n 'application/pdf': 'pi-file-pdf',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'pi-file-word',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'pi-file-excel',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pi-file',\n 'image/': 'pi-image',\n 'video/': 'pi-video',\n 'audio/': 'pi-volume-up',\n};\n\nfunction iconForType(contentType: string): string {\n for (const [prefix, icon] of Object.entries(FILE_ICONS)) {\n if (contentType.startsWith(prefix)) return icon;\n }\n return 'pi-file';\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Multi-file upload with drag-drop, progress, and validation.\n *\n * Usage:\n * ```html\n * <fly-file-upload\n * [maxFiles]=\"5\"\n * [maxFileSizeBytes]=\"5242880\"\n * accept=\".pdf,.docx,.xlsx\"\n * [(files)]=\"trend.attachments\"\n * sourceApp=\"circles\"\n * sourceEntityType=\"trend\"\n * (filesChanged)=\"onAttachmentsChanged($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'fly-file-upload',\n standalone: true,\n imports: [TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"fly-file-upload\">\n @if (canAddMore()) {\n <div class=\"fly-file-upload__dropzone\"\n [class.fly-file-upload__dropzone--drag]=\"dragging()\"\n (click)=\"triggerFileInput()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <span class=\"pi pi-cloud-upload fly-file-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-file-upload__label\">{{ 'files.fileUpload.dropOrClick' | translate }}</span>\n <span class=\"fly-file-upload__hint\">{{ limitHint() }}</span>\n </div>\n }\n\n @if (error()) {\n <div class=\"fly-file-upload__error\">{{ error() }}</div>\n }\n\n @if (allSlots().length) {\n <ul class=\"fly-file-upload__list\">\n @for (slot of allSlots(); track slot.file.name + slot.file.size) {\n <li class=\"fly-file-upload__item\">\n <span class=\"pi {{ iconFor(slot) }} fly-file-upload__file-icon\" aria-hidden=\"true\"></span>\n <div class=\"fly-file-upload__file-info\">\n <span class=\"fly-file-upload__file-name\">{{ slot.file.name }}</span>\n <span class=\"fly-file-upload__file-size\">{{ formatFileSize(slot.file.size) }}</span>\n </div>\n @if (slot.status === 'uploading') {\n <div class=\"fly-file-upload__progress-track\">\n <div class=\"fly-file-upload__progress-fill\" [style.width.%]=\"slot.progress\"></div>\n </div>\n }\n @if (slot.status === 'error') {\n <span class=\"fly-file-upload__file-error\" [title]=\"slot.error ?? ''\">\n <span class=\"pi pi-exclamation-triangle\" aria-hidden=\"true\"></span>\n </span>\n }\n @if (slot.status === 'done') {\n <span class=\"pi pi-check-circle fly-file-upload__file-ok\" aria-hidden=\"true\"></span>\n }\n <button type=\"button\" class=\"fly-file-upload__remove-btn\" (click)=\"removeSlot(slot)\" [title]=\"'common.remove' | translate\">\n <span class=\"pi pi-times\" aria-hidden=\"true\"></span>\n </button>\n </li>\n }\n </ul>\n }\n\n @if (existingFiles().length && !allSlots().length) {\n <ul class=\"fly-file-upload__list\">\n @for (f of existingFiles(); track f.id) {\n <li class=\"fly-file-upload__item\">\n <span class=\"pi {{ iconForInfo(f) }} fly-file-upload__file-icon\" aria-hidden=\"true\"></span>\n <div class=\"fly-file-upload__file-info\">\n <span class=\"fly-file-upload__file-name\">{{ f.fileName }}</span>\n <span class=\"fly-file-upload__file-size\">{{ formatFileSize(f.sizeBytes) }}</span>\n </div>\n <span class=\"pi pi-check-circle fly-file-upload__file-ok\" aria-hidden=\"true\"></span>\n <button type=\"button\" class=\"fly-file-upload__remove-btn\" (click)=\"removeExisting(f)\" [title]=\"'common.remove' | translate\">\n <span class=\"pi pi-times\" aria-hidden=\"true\"></span>\n </button>\n </li>\n }\n </ul>\n }\n\n <input #fileInput type=\"file\" [accept]=\"accept()\" multiple class=\"fly-file-upload__hidden\" (change)=\"onFilesSelected($event)\" />\n </div>\n `,\n styles: [`\n .fly-file-upload { display: flex; flex-direction: column; gap: 8px; }\n .fly-file-upload__hidden { display: none; }\n\n .fly-file-upload__dropzone {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 6px; padding: 20px; border: 2px dashed var(--separator-primary, #e5e7eb);\n border-radius: 10px; background: var(--fill-quaternary, #f9fafb); cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n }\n .fly-file-upload__dropzone:hover,\n .fly-file-upload__dropzone--drag { border-color: var(--accent-primary, #0071e3); background: var(--fill-tertiary, #f3f4f6); }\n .fly-file-upload__icon { font-size: 24px; color: var(--label-tertiary, #9ca3af); }\n .fly-file-upload__label { font-size: 13px; color: var(--label-secondary, #6b7280); }\n .fly-file-upload__hint { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-file-upload__error { font-size: 12px; color: var(--system-red, #ef4444); padding: 4px 0; }\n\n .fly-file-upload__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }\n .fly-file-upload__item {\n display: flex; align-items: center; gap: 10px; padding: 8px 12px;\n border: 1px solid var(--separator-primary, #e5e7eb); border-radius: 8px;\n background: var(--fill-quaternary, #f9fafb); font-size: 13px;\n }\n .fly-file-upload__file-icon { font-size: 18px; color: var(--label-tertiary, #9ca3af); flex-shrink: 0; }\n .fly-file-upload__file-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }\n .fly-file-upload__file-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--label-primary, #1f2937); }\n .fly-file-upload__file-size { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-file-upload__progress-track { width: 60px; height: 4px; border-radius: 2px; background: var(--fill-tertiary, #e5e7eb); overflow: hidden; }\n .fly-file-upload__progress-fill { height: 100%; background: var(--accent-primary, #0071e3); border-radius: 2px; transition: width 0.2s; }\n\n .fly-file-upload__file-ok { color: var(--system-green, #22c55e); font-size: 14px; }\n .fly-file-upload__file-error { color: var(--system-red, #ef4444); font-size: 14px; }\n\n .fly-file-upload__remove-btn {\n background: none; border: none; cursor: pointer; color: var(--label-tertiary, #9ca3af);\n width: 24px; height: 24px; display: flex; align-items: center; justify-content: center;\n border-radius: 4px; transition: color 0.15s, background 0.15s; flex-shrink: 0;\n }\n .fly-file-upload__remove-btn:hover { color: var(--system-red, #ef4444); background: var(--fill-tertiary, #f3f4f6); }\n `],\n})\nexport class FlyFileUploadComponent {\n private http = inject(HttpClient);\n\n // ── Inputs ──\n maxFiles = input(5);\n maxFileSizeBytes = input(5 * 1024 * 1024);\n accept = input('');\n sourceApp = input('unknown');\n sourceEntityType = input<string | null>(null);\n sourceEntityId = input<string | null>(null);\n\n /** Optional: provide file IDs to auto-fetch metadata for pre-existing files (edit mode). */\n existingFileIds = input<string[] | null>(null);\n\n /** Two-way model for completed file metadata. */\n files = model<FlyFileInfo[]>([]);\n\n // ── Outputs ──\n filesChanged = output<FlyFileInfo[]>();\n\n // ── State ──\n error = signal<string | null>(null);\n dragging = signal(false);\n slots = signal<UploadSlot[]>([]);\n\n /** Pre-existing files loaded from the entity (before any new uploads this session). */\n existingFiles = signal<FlyFileInfo[]>([]);\n\n fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n constructor() {\n // Auto-fetch metadata for existing file IDs (edit mode)\n effect((onCleanup) => {\n const ids = this.existingFileIds();\n if (!ids?.length) return;\n\n const subs = ids.map(id =>\n this.http.get<{ data: FlyFileInfo }>(`/api/files/${id}`).subscribe({\n next: (res) => {\n const info = res.data ?? (res as any);\n if (info?.id) {\n this.existingFiles.update(list =>\n list.some(f => f.id === info.id) ? list : [...list, info]\n );\n this.files.update(list =>\n list.some(f => f.id === info.id) ? list : [...list, info]\n );\n }\n },\n })\n );\n onCleanup(() => subs.forEach(s => s.unsubscribe()));\n });\n }\n\n allSlots = computed(() => this.slots());\n\n canAddMore = computed(() => {\n const current = this.files().length + this.slots().filter(s => s.status === 'uploading').length;\n return current < this.maxFiles();\n });\n\n limitHint = computed(() => {\n const mb = this.maxFileSizeBytes() / (1024 * 1024);\n return `Max ${this.maxFiles()} files, ${mb}MB each`;\n });\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n onDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.dragging.set(true);\n }\n\n onDragLeave(e: DragEvent): void {\n e.preventDefault();\n this.dragging.set(false);\n }\n\n onDrop(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.dragging.set(false);\n const fileList = e.dataTransfer?.files;\n if (fileList) this.processFiles(Array.from(fileList));\n }\n\n onFilesSelected(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (input.files) this.processFiles(Array.from(input.files));\n input.value = '';\n }\n\n removeSlot(slot: UploadSlot): void {\n this.slots.update(s => s.filter(x => x !== slot));\n if (slot.info) {\n this.files.update(f => f.filter(x => x.id !== slot.info!.id));\n this.filesChanged.emit(this.files());\n }\n }\n\n removeExisting(f: FlyFileInfo): void {\n this.existingFiles.update(list => list.filter(x => x.id !== f.id));\n this.files.update(list => list.filter(x => x.id !== f.id));\n this.filesChanged.emit(this.files());\n }\n\n iconFor(slot: UploadSlot): string { return iconForType(slot.file.type); }\n iconForInfo(f: FlyFileInfo): string { return iconForType(f.contentType); }\n formatFileSize(bytes: number): string { return formatSize(bytes); }\n\n private processFiles(newFiles: File[]): void {\n this.error.set(null);\n const currentCount = this.files().length + this.slots().filter(s => s.status === 'uploading').length;\n const remaining = this.maxFiles() - currentCount;\n\n if (remaining <= 0) {\n this.error.set(`Maximum ${this.maxFiles()} files allowed`);\n return;\n }\n\n const toUpload = newFiles.slice(0, remaining);\n if (newFiles.length > remaining) {\n this.error.set(`Only ${remaining} more file(s) can be added`);\n }\n\n for (const file of toUpload) {\n if (file.size > this.maxFileSizeBytes()) {\n const mb = this.maxFileSizeBytes() / (1024 * 1024);\n this.error.set(`\"${file.name}\" exceeds ${mb}MB limit`);\n continue;\n }\n this.uploadFile(file);\n }\n }\n\n private uploadFile(file: File): void {\n const slot: UploadSlot = { file, progress: 0, status: 'uploading' };\n this.slots.update(s => [...s, slot]);\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n formData.append('sourceApp', this.sourceApp());\n if (this.sourceEntityType()) formData.append('sourceEntityType', this.sourceEntityType()!);\n if (this.sourceEntityId()) formData.append('sourceEntityId', this.sourceEntityId()!);\n\n this.http.post<{ data: FlyFileInfo }>('/api/files/upload', formData, {\n reportProgress: true,\n observe: 'events',\n }).subscribe({\n next: (event) => {\n if (event.type === HttpEventType.UploadProgress && event.total) {\n slot.progress = Math.round((event.loaded / event.total) * 100);\n this.slots.update(s => [...s]); // trigger signal change\n } else if (event.type === HttpEventType.Response) {\n const info = (event.body as any)?.data ?? event.body;\n slot.status = 'done';\n slot.progress = 100;\n slot.info = info;\n this.slots.update(s => [...s]);\n this.files.update(f => [...f, info]);\n this.filesChanged.emit(this.files());\n }\n },\n error: (err) => {\n slot.status = 'error';\n slot.error = err?.error?.message ?? 'Upload failed';\n this.slots.update(s => [...s]);\n },\n });\n }\n}\n","import { Injectable, Signal, computed, signal } from '@angular/core';\nimport type {\n AgentCommandHandle,\n AgentCommandRegistration,\n} from '../../models/agent-input.model';\n\n/**\n * Singleton registry of slash commands offered by the agent input palette.\n *\n * Lives in the DS so it crosses the federation boundary as a single instance via\n * `sharedMappings: ['@mohamedatia/fly-design-system']`. Federated remotes register\n * their commands at boot (and dispose on window close) without forking the shell.\n *\n * Storage is a signal store. `register` is O(1) for the unique-id case and O(n) when\n * replacing an existing id (filter then push). The append-then-replace strategy is\n * deliberate: registrations are rare (each one corresponds to a remote's app-init\n * effect), and the tradeoff buys us a stable id-collision contract — the *latest*\n * registration wins, and the previous handle's `dispose()` becomes a no-op rather\n * than removing the new entry.\n */\n@Injectable({ providedIn: 'root' })\nexport class AgentCommandRegistry {\n private readonly _commands = signal<readonly AgentCommandRegistration[]>([]);\n /** All currently-registered commands, in insertion order. */\n readonly all: Signal<readonly AgentCommandRegistration[]> = this._commands.asReadonly();\n\n /**\n * Returns a signal of commands whose scope is `'global'` OR whose `scope.appId` is in\n * the live app set. The signal recomputes when either the registry or `liveAppIds`\n * changes — pass a `Signal<ReadonlySet<string>>` from the host's app-registry service\n * for reactive filtering.\n */\n visible(liveAppIds: ReadonlySet<string> | Signal<ReadonlySet<string>>): Signal<readonly AgentCommandRegistration[]> {\n const liveSignal = isSignal<ReadonlySet<string>>(liveAppIds) ? liveAppIds : signal(liveAppIds).asReadonly();\n return computed(() => {\n const live = liveSignal();\n return this._commands().filter((cmd) => {\n if (cmd.scope === 'global') return true;\n return live.has(cmd.scope.appId);\n });\n });\n }\n\n /**\n * Register a single command. Returns a handle whose `dispose()` removes the row by\n * id. If the same id is later re-registered, the original handle's `dispose()`\n * becomes a no-op (the newer registration owns the row). Idempotent disposal.\n */\n register(cmd: AgentCommandRegistration): AgentCommandHandle {\n const generation = ++this._generation;\n this._commands.update((rows) => [...rows.filter((r) => r.id !== cmd.id), cmd]);\n this._owners.set(cmd.id, generation);\n return {\n dispose: () => {\n if (this._owners.get(cmd.id) === generation) {\n this._owners.delete(cmd.id);\n this._commands.update((rows) => rows.filter((r) => r.id !== cmd.id));\n }\n },\n };\n }\n\n /**\n * Bulk register. Rolls back on duplicate id within the input batch (throws before any\n * row lands). Cross-batch duplicates against existing rows follow the standard\n * \"latest wins\" rule and do NOT trigger rollback.\n *\n * Returns a handle whose `dispose()` tears down every row registered by this call.\n */\n registerAll(cmds: readonly AgentCommandRegistration[]): AgentCommandHandle {\n const seen = new Set<string>();\n for (const c of cmds) {\n if (seen.has(c.id)) {\n throw new Error(`AgentCommandRegistry.registerAll: duplicate id \"${c.id}\" in batch`);\n }\n seen.add(c.id);\n }\n const handles = cmds.map((c) => this.register(c));\n let disposed = false;\n return {\n dispose: () => {\n if (disposed) return;\n disposed = true;\n for (const h of handles) h.dispose();\n },\n };\n }\n\n /** Tear down by id. Idempotent. */\n unregister(id: string): void {\n if (this._owners.delete(id)) {\n this._commands.update((rows) => rows.filter((r) => r.id !== id));\n }\n }\n\n /** Monotonic counter; identifies which registration call currently owns each id. */\n private _generation = 0;\n /** id → generation. Used so a stale handle's `dispose()` is a no-op after replacement. */\n private readonly _owners = new Map<string, number>();\n}\n\n/** `isSignal` shim — narrows to either `Signal<T>` or a plain value. */\nfunction isSignal<T>(v: T | Signal<T>): v is Signal<T> {\n return typeof v === 'function';\n}\n","import { Injectable, Signal, Type, signal, type WritableSignal } from '@angular/core';\nimport type {\n AgentChipHostInputs,\n AgentCommandHandle,\n AgentDraggableItem,\n AgentDropRendererRegistration,\n} from '../../models/agent-input.model';\n\n/**\n * Singleton registry of chip-renderer components and keyboard-alternative draggable\n * items, keyed by `kind` and `appId`.\n *\n * Like {@link AgentCommandRegistry}, this lives in the DS so it crosses the federation\n * boundary as a single instance. Hosts (the shell `<fly-agent-input>`) lookup\n * renderers; remotes register them.\n *\n * Renderer lookup is `O(n)` over the registered list — the registry is small (one or\n * two entries per app) and lookups happen on drop, not per frame.\n *\n * Draggable storage is per-`appId` writable signal cached in a Map, so each `appId`\n * gets a stable {@link Signal} reference across reads (callers can `===`-compare).\n */\n@Injectable({ providedIn: 'root' })\nexport class AgentDropRegistry {\n private readonly _renderers = signal<readonly AgentDropRendererRegistration[]>([]);\n /** Per-appId writable store for draggables. Read-only mirror returned to callers. */\n private readonly _draggablesByApp = new Map<string, WritableSignal<readonly AgentDraggableItem[]>>();\n\n /**\n * Look up the chip-renderer component class for a `kind`. The newest registration for\n * a given `kind` wins, regardless of `appId` — we scan the list in reverse so a later\n * `register` call shadows an earlier one for the same `kind`.\n *\n * Returns `null` when no renderer is registered; the host falls back to a generic\n * `plainTextFallback` chip.\n */\n rendererFor(kind: string): Type<AgentChipHostInputs> | null {\n const list = this._renderers();\n for (let i = list.length - 1; i >= 0; i--) {\n if (list[i].kind === kind) return list[i].component as Type<AgentChipHostInputs>;\n }\n return null;\n }\n\n /**\n * Register a renderer for a `(kind, appId)` pair. Re-registering the same pair\n * replaces the prior entry; the disposal handle for the prior registration becomes\n * a no-op.\n *\n * Returns a {@link AgentCommandHandle} (re-used to keep the disposable shape uniform\n * across registries) whose `dispose()` removes this exact registration.\n */\n register<T = unknown>(reg: AgentDropRendererRegistration<T>): AgentCommandHandle {\n const generation = ++this._generation;\n const key = compositeKey(reg.kind, reg.appId);\n this._renderers.update((rows) => [\n ...rows.filter((r) => compositeKey(r.kind, r.appId) !== key),\n reg as AgentDropRendererRegistration,\n ]);\n this._owners.set(key, generation);\n return {\n dispose: () => {\n if (this._owners.get(key) === generation) {\n this._owners.delete(key);\n this._renderers.update((rows) => rows.filter((r) => compositeKey(r.kind, r.appId) !== key));\n }\n },\n };\n }\n\n /**\n * Apps publish their live \"draggable from focused window\" set so the keyboard\n * \"Attach from app…\" menu can offer them. Hosts call this each time the user-visible\n * draggable list changes; passing an empty array clears the entry for this `appId`.\n */\n publishDraggables(appId: string, items: readonly AgentDraggableItem[]): void {\n if (items.length === 0) {\n const existing = this._draggablesByApp.get(appId);\n if (existing) existing.set([]);\n return;\n }\n this.bucketFor(appId).set(items);\n }\n\n /**\n * Reactive read of the draggable set published for `appId`. Empty when none. The\n * returned signal is stable across calls (cached by `appId`), so consumers can use\n * it as a stable input to `computed()`.\n */\n draggablesFor(appId: string): Signal<readonly AgentDraggableItem[]> {\n return this.bucketFor(appId).asReadonly();\n }\n\n /** Lazy-init the per-appId writable bucket. Returns the writable handle for internal use. */\n private bucketFor(appId: string): WritableSignal<readonly AgentDraggableItem[]> {\n let bucket = this._draggablesByApp.get(appId);\n if (!bucket) {\n bucket = signal<readonly AgentDraggableItem[]>([]);\n this._draggablesByApp.set(appId, bucket);\n }\n return bucket;\n }\n\n private _generation = 0;\n private readonly _owners = new Map<string, number>();\n}\n\nfunction compositeKey(kind: string, appId: string): string {\n return `${kind}::${appId}`;\n}\n","import type { Type } from '@angular/core';\n\n/**\n * Agent input contracts.\n *\n * These types define the wire and DI surface for the new `<fly-agent-input>` orchestrator\n * (Phase 2+). Phase 1 ships only the contracts: payload envelope, command/drop registry\n * shapes, and chip-host inputs. The concrete components consume them later.\n *\n * Design rules:\n * - All fields are `readonly` — the registries store these in signal stores and we never\n * want a host mutating after registration. Hosts construct fresh objects to update.\n * - The discriminated kinds (`scope`, `mode`, `kind`) carry the entire variance — no\n * boolean flags. New variants extend the union without breaking existing consumers.\n * - The `Type<AgentChipHostInputs<T>>` shape is intentional: chip components declare\n * `payload`, `mode`, optional `onRemove` as Angular `input()` signals; the registry\n * wires them via `NgComponentOutlet` inputs in the consumer. The component reference\n * itself never leaks across the federation boundary by value — only by class identity.\n */\n\n/** Frozen MIME used by `flyAgentDraggable` and the drop-zone reader. Never change without a DS major. */\nexport const AGENT_DRAG_MIME = 'application/x-fly-agent-payload+json' as const;\n\n/** Frozen payload envelope version. Bump only with a published DS major. */\nexport const AGENT_PAYLOAD_VERSION = 1 as const;\n\n// ─── Commands ───────────────────────────────────────────────────────────────\n\n/**\n * Where a command surfaces. `'global'` = always offered. `{ appId }` = offered only when\n * the host's live `liveAppIds` set (passed to {@link AgentCommandRegistry.visible}) contains\n * that id. This lets a remote register its slash command at boot but only have it appear\n * in the palette while at least one of the remote's windows is open.\n */\nexport type AgentCommandScope = 'global' | { readonly appId: string };\n\n/**\n * A slash command offered by the agent input palette. Commands are deliberately shallow\n * descriptors — the host (shell) decides what happens on Send. The descriptor's role is\n * to make the palette row renderable (icon, label, kbd hint, app badge) and matchable\n * (id, aliases, drop-kind suggestions) without coupling DS to any business logic.\n */\nexport interface AgentCommand {\n /** Stable id, kebab-case. Becomes the slash text after `/`, e.g. `/analyze-trend`. */\n readonly id: string;\n /** i18n key for the visible label, e.g. `agent.command.analyze_trend.label`. */\n readonly labelKey: string;\n /** i18n key for an optional sublabel / description shown beneath the label. */\n readonly descriptionKey?: string;\n /** PrimeIcons class, e.g. `pi-chart-line`. */\n readonly icon?: string;\n /** App badge label key — appears as a small tag, e.g. `agent.command.app_badge.circles`. */\n readonly appBadgeKey?: string;\n /** Optional kbd hint i18n key. */\n readonly kbdHintKey?: string;\n /** When the command is keyword-matched against drop payload kinds, list those kinds here. */\n readonly suggestForDropKinds?: readonly string[];\n /** Extra match terms beyond id + label, used by the fuzzy filter. */\n readonly aliases?: readonly string[];\n /** When `'send'`, the command is inserted as a bound prefix and executed on Send. */\n readonly executeOn: 'send';\n /** Optional client-side gate. Return false to hide the command in this scope. */\n readonly isVisible?: () => boolean;\n}\n\n/** What hosts pass to {@link AgentCommandRegistry.register}. Adds the scope to {@link AgentCommand}. */\nexport interface AgentCommandRegistration extends AgentCommand {\n readonly scope: AgentCommandScope;\n}\n\n/** Disposable handle returned by {@link AgentCommandRegistry.register}. Idempotent `dispose()`. */\nexport interface AgentCommandHandle {\n dispose(): void;\n}\n\n// ─── Drag payloads ──────────────────────────────────────────────────────────\n\n/**\n * The wire envelope written to a `DataTransfer` by `flyAgentDraggable`. Renderers narrow\n * on `kind`; mismatches fall back to `plainTextFallback`.\n */\nexport interface AgentDragPayload<T = unknown> {\n /** Domain-stable kind, e.g. `circles.trend`. */\n readonly kind: string;\n /** Originating appId. Must match an entry in the host's app registry. */\n readonly appId: string;\n /** Frozen format version. Mismatch -> renderer falls back to text. */\n readonly version: typeof AGENT_PAYLOAD_VERSION;\n /** Domain object. Renderers narrow on `kind`. */\n readonly payload: T;\n /** Plain-text fallback written to the dataTransfer alongside the typed MIME. */\n readonly plainTextFallback: string;\n /** Optional command ids to highlight when this payload is dropped. */\n readonly suggestedCommandIds?: readonly string[];\n}\n\n/**\n * Where a chip is being rendered. `inline` = inside the input chip tray (removable);\n * `message` = embedded in a sent message bubble (not removable).\n */\nexport type AgentDropChipMode = 'inline' | 'message';\n\n/**\n * Public input shape for chip-renderer components. Components declare matching\n * `input()` signals; the registry wires them via `NgComponentOutlet`.\n */\nexport interface AgentChipHostInputs<T = unknown> {\n payload: AgentDragPayload<T>;\n mode: AgentDropChipMode;\n /** Called when the user clicks the chip's remove control (only in inline mode). */\n onRemove?: () => void;\n}\n\n/**\n * Keyboard-alternative draggable item. Hosts publish these via\n * {@link AgentDropRegistry.publishDraggables} so the \"Attach from app…\" menu can offer\n * them when pointer drag isn't available.\n */\nexport interface AgentDraggableItem<T = unknown> {\n /** Stable id within its app. Used as a list key in the kbd menu. */\n readonly id: string;\n readonly labelKey: string;\n readonly icon?: string;\n /** Builds the payload the moment the user picks the item. */\n build(): AgentDragPayload<T>;\n}\n\n/** Registry input shape for binding a chip-renderer component to a kind+appId pair. */\nexport interface AgentDropRendererRegistration<T = unknown> {\n readonly kind: string;\n readonly appId: string;\n readonly component: Type<AgentChipHostInputs<T>>;\n}\n\n// ─── Payload guards ─────────────────────────────────────────────────────────\n\n/**\n * Caps applied by {@link validateAgentPayload} / {@link trimAgentPayload}. The defaults\n * trade off \"fits comfortably in a single MQ frame\" against \"covers a richly-populated\n * trend or note card\". Hosts may pass a partial override.\n */\nexport interface AgentPayloadLimits {\n /** Cap on the JSON.stringify(envelope) byte length. Default 32 KB. */\n readonly maxJsonBytes: number;\n /** Cap on the plainTextFallback byte length. Default 8 KB. */\n readonly maxPlainTextFallbackBytes: number;\n /** Cap on any single string field inside payload (recursive). Default 4 KB. */\n readonly maxStringFieldBytes: number;\n}\n\nexport const DEFAULT_AGENT_PAYLOAD_LIMITS: AgentPayloadLimits = Object.freeze({\n maxJsonBytes: 32 * 1024,\n maxPlainTextFallbackBytes: 8 * 1024,\n maxStringFieldBytes: 4 * 1024,\n});\n\n/**\n * Stable failure reasons emitted by {@link validateAgentPayload}.\n * - `invalid_version` — `version` !== {@link AGENT_PAYLOAD_VERSION}.\n * - `invalid_kind` — `kind` is empty / not a string.\n * - `field_too_large` — a string field inside `payload` exceeds `maxStringFieldBytes`.\n * - `fallback_too_large` — `plainTextFallback` exceeds `maxPlainTextFallbackBytes`.\n * - `json_too_large` — the full JSON.stringify(envelope) exceeds `maxJsonBytes`.\n */\nexport type AgentPayloadValidationResult =\n | { readonly ok: true }\n | {\n readonly ok: false;\n readonly reason:\n | 'json_too_large'\n | 'fallback_too_large'\n | 'field_too_large'\n | 'invalid_version'\n | 'invalid_kind';\n /** Dotted property-access path to the offending field, e.g. `payload.title` or `payload.tags[2]`. NOT RFC 6901 JSON Pointer. */\n readonly fieldPath?: string;\n readonly actualBytes?: number;\n readonly limitBytes?: number;\n };\n","import {\n AGENT_PAYLOAD_VERSION,\n DEFAULT_AGENT_PAYLOAD_LIMITS,\n type AgentDragPayload,\n type AgentPayloadLimits,\n type AgentPayloadValidationResult,\n} from '../models/agent-input.model';\n\n/**\n * Pure utility helpers for agent drag payload size guarding.\n *\n * Used by `flyAgentDraggable` at `dragstart` (Phase 2) and by app pre-flight code that\n * wants a clean payload before constructing the directive input. No Angular DI, no\n * runtime side effects — safe to import from anywhere.\n *\n * Performance notes:\n * - The `TextEncoder` is lazily allocated and cached. The constructor runs once per\n * module instance even under federation (singleton DS).\n * - String trimming uses `Intl.Segmenter` when available (all evergreen browsers\n * including Safari 14.1+) so we cut on grapheme boundaries — emoji ZWJ sequences,\n * combining marks, regional indicator pairs all stay intact. Fallback is\n * UTF-16 code-unit slice, which is a graceful degradation: it can split a\n * surrogate pair, but the resulting JSON is still syntactically valid and\n * downstream renderers handle the replacement char.\n */\n\n/**\n * Thrown by {@link trimAgentPayload} when even a fully string-trimmed envelope still\n * exceeds `maxJsonBytes` (e.g. an envelope with thousands of nested empty objects /\n * array entries / property keys). Subclasses `RangeError` so callers using the standard\n * `instanceof RangeError` check still match, while exposing the structured fields\n * (`actualBytes`, `limitBytes`, `reason: 'json_too_large'`) needed for telemetry and\n * symmetric handling with {@link AgentPayloadValidationResult} failures.\n */\nexport class AgentPayloadOversizeError extends RangeError {\n readonly reason = 'json_too_large' as const;\n constructor(\n message: string,\n readonly actualBytes: number,\n readonly limitBytes: number,\n ) {\n super(message);\n this.name = 'AgentPayloadOversizeError';\n }\n}\n\n/** Cap on the dotted `fieldPath` string so a 10 MB property-key payload can't lock dev tools when `console.warn`d. */\nconst FIELD_PATH_MAX_CHARS = 256;\n\n/** Append a path segment, capping the result at {@link FIELD_PATH_MAX_CHARS} chars (with `…` marker). */\nfunction appendPath(base: string, segment: string): string {\n const next = base + segment;\n if (next.length <= FIELD_PATH_MAX_CHARS) return next;\n return next.slice(0, FIELD_PATH_MAX_CHARS - 1) + '…';\n}\n\nlet _cachedEncoder: TextEncoder | null = null;\nfunction getEncoder(): TextEncoder {\n return (_cachedEncoder ??= new TextEncoder());\n}\n\n/** UTF-8 byte length of `s`. Cheap; cached encoder. */\nexport function utf8ByteLength(s: string): number {\n return getEncoder().encode(s).length;\n}\n\n/**\n * Trim `input` so the UTF-8 byte length of the result is `<= maxBytes`. When trimming\n * occurs, append `ellipsis` (default `…`, U+2026) — its bytes are included in the cap.\n *\n * Idempotent: `trimAgentString(trimAgentString(s, n), n)` equals `trimAgentString(s, n)`.\n *\n * Edge cases:\n * - `maxBytes` shorter than the ellipsis itself returns an empty string.\n * - `Intl.Segmenter` (when present) ensures we never split a grapheme cluster.\n * - When the encoded length is already within the cap, returns `input` unchanged.\n */\nexport function trimAgentString(input: string, maxBytes: number, ellipsis = '…'): string {\n if (maxBytes <= 0) return '';\n const enc = getEncoder();\n const inputLen = enc.encode(input).length;\n if (inputLen <= maxBytes) return input;\n\n const ellipsisLen = enc.encode(ellipsis).length;\n if (maxBytes < ellipsisLen) return '';\n const budget = maxBytes - ellipsisLen;\n\n // Segmenter path: walk graphemes, accumulate until next would overflow.\n const segmenterCtor =\n typeof Intl !== 'undefined' && (Intl as unknown as { Segmenter?: typeof Intl.Segmenter }).Segmenter;\n if (segmenterCtor) {\n const segmenter = new segmenterCtor(undefined, { granularity: 'grapheme' });\n let used = 0;\n let acc = '';\n for (const seg of segmenter.segment(input)) {\n const segLen = enc.encode(seg.segment).length;\n if (used + segLen > budget) break;\n acc += seg.segment;\n used += segLen;\n }\n return acc + ellipsis;\n }\n\n // Fallback: code-unit slice; verify byte length and shrink until under budget.\n let cut = input.length;\n while (cut > 0 && enc.encode(input.slice(0, cut)).length > budget) {\n cut--;\n }\n return input.slice(0, cut) + ellipsis;\n}\n\n/**\n * Validate an {@link AgentDragPayload} against the supplied limits (or\n * {@link DEFAULT_AGENT_PAYLOAD_LIMITS} when omitted). Returns `{ ok: true }` or a\n * structured failure with the offending field path and byte counts.\n *\n * Order of checks (cheap → expensive):\n * 1. `version` matches the frozen {@link AGENT_PAYLOAD_VERSION}.\n * 2. `kind` is a non-empty string.\n * 3. `plainTextFallback` fits its cap.\n * 4. Every string in `payload` (recursively) fits the per-field cap.\n * 5. The full `JSON.stringify(envelope)` fits the JSON cap.\n *\n * The walker stops on the first oversize string field — the intent is to surface\n * actionable feedback, not enumerate every offender.\n */\nexport function validateAgentPayload(\n payload: AgentDragPayload<unknown>,\n limits?: Partial<AgentPayloadLimits>,\n): AgentPayloadValidationResult {\n const eff: AgentPayloadLimits = { ...DEFAULT_AGENT_PAYLOAD_LIMITS, ...(limits ?? {}) };\n\n if (payload.version !== AGENT_PAYLOAD_VERSION) {\n return { ok: false, reason: 'invalid_version' };\n }\n if (typeof payload.kind !== 'string' || payload.kind.length === 0) {\n return { ok: false, reason: 'invalid_kind' };\n }\n\n const fbBytes = utf8ByteLength(payload.plainTextFallback ?? '');\n if (fbBytes > eff.maxPlainTextFallbackBytes) {\n return {\n ok: false,\n reason: 'fallback_too_large',\n fieldPath: 'plainTextFallback',\n actualBytes: fbBytes,\n limitBytes: eff.maxPlainTextFallbackBytes,\n };\n }\n\n const fieldFailure = walkStringsForOverage(payload.payload, 'payload', eff.maxStringFieldBytes);\n if (fieldFailure) return fieldFailure;\n\n const json = safeStringify(payload);\n const jsonBytes = utf8ByteLength(json);\n if (jsonBytes > eff.maxJsonBytes) {\n return {\n ok: false,\n reason: 'json_too_large',\n actualBytes: jsonBytes,\n limitBytes: eff.maxJsonBytes,\n };\n }\n\n return { ok: true };\n}\n\n/**\n * Returns a NEW payload with all string fields trimmed to fit the per-field cap, the\n * `plainTextFallback` trimmed to its cap, and the full envelope re-checked against the\n * JSON cap. Idempotent — a second call against the trimmed result yields equal output.\n *\n * Throws {@link AgentPayloadOversizeError} only if even an empty trim couldn't shrink it\n * under the cap (e.g. an envelope with 1000+ nested empty objects). The error subclasses\n * `RangeError`, so legacy `instanceof RangeError` checks still match. Apps that hit this\n * should re-shape `payload` rather than call again.\n */\nexport function trimAgentPayload<T>(\n payload: AgentDragPayload<T>,\n limits?: Partial<AgentPayloadLimits>,\n): AgentDragPayload<T> {\n const eff: AgentPayloadLimits = { ...DEFAULT_AGENT_PAYLOAD_LIMITS, ...(limits ?? {}) };\n\n const trimmedFallback = trimAgentString(payload.plainTextFallback ?? '', eff.maxPlainTextFallbackBytes);\n const trimmedPayload = mapStrings(payload.payload, (s) => trimAgentString(s, eff.maxStringFieldBytes)) as T;\n\n const next: AgentDragPayload<T> = {\n ...payload,\n plainTextFallback: trimmedFallback,\n payload: trimmedPayload,\n };\n\n const jsonBytes = utf8ByteLength(safeStringify(next));\n if (jsonBytes > eff.maxJsonBytes) {\n throw new AgentPayloadOversizeError(\n `AgentDragPayload exceeds maxJsonBytes (${jsonBytes} > ${eff.maxJsonBytes}) after string trimming. Re-shape the payload.`,\n jsonBytes,\n eff.maxJsonBytes,\n );\n }\n return next;\n}\n\n// ─── Internal helpers ───────────────────────────────────────────────────────\n\n/**\n * Recursively walks `value`, returning the first string field that exceeds `maxBytes`\n * (as a structured failure). Returns `null` when every string fits.\n *\n * Path uses dotted property-access notation: `payload.body`, `payload.tags[2]`. Cycles\n * are detected via a WeakSet so attacker-crafted self-references don't loop forever.\n * Path strings are capped at {@link FIELD_PATH_MAX_CHARS} characters via {@link appendPath}\n * to prevent a malicious payload with multi-MB property keys from producing a multi-MB\n * `fieldPath` that locks up dev tools when logged.\n */\nfunction walkStringsForOverage(\n value: unknown,\n path: string,\n maxBytes: number,\n seen: WeakSet<object> = new WeakSet(),\n): AgentPayloadValidationResult | null {\n if (typeof value === 'string') {\n const bytes = utf8ByteLength(value);\n if (bytes > maxBytes) {\n return {\n ok: false,\n reason: 'field_too_large',\n fieldPath: path,\n actualBytes: bytes,\n limitBytes: maxBytes,\n };\n }\n return null;\n }\n if (value === null || typeof value !== 'object') return null;\n if (seen.has(value as object)) return null;\n seen.add(value as object);\n\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const r = walkStringsForOverage(value[i], appendPath(path, `[${i}]`), maxBytes, seen);\n if (r) return r;\n }\n return null;\n }\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n const r = walkStringsForOverage(v, appendPath(path, `.${k}`), maxBytes, seen);\n if (r) return r;\n }\n return null;\n}\n\n/**\n * Recursively maps every string leaf via `fn`, preserving object/array structure.\n * Cycles are short-circuited to `null` rather than throwing — the caller already\n * has a JSON.stringify cap that will catch any pathological input.\n */\nfunction mapStrings(value: unknown, fn: (s: string) => string, seen: WeakSet<object> = new WeakSet()): unknown {\n if (typeof value === 'string') return fn(value);\n if (value === null || typeof value !== 'object') return value;\n if (seen.has(value as object)) return null;\n seen.add(value as object);\n\n if (Array.isArray(value)) {\n return value.map((v) => mapStrings(v, fn, seen));\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = mapStrings(v, fn, seen);\n }\n return out;\n}\n\n/** `JSON.stringify` with a cycle-safe replacer — defends against attacker-crafted graphs. */\nfunction safeStringify(value: unknown): string {\n const seen = new WeakSet<object>();\n return JSON.stringify(value, (_k, v) => {\n if (v !== null && typeof v === 'object') {\n if (seen.has(v as object)) return '[Circular]';\n seen.add(v as object);\n }\n return v;\n });\n}\n","import { Directive, HostListener, inject, input } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport {\n AGENT_DRAG_MIME,\n type AgentDragPayload,\n} from '../models/agent-input.model';\nimport { validateAgentPayload } from '../utils/agent-payload-guards';\n\n/**\n * Strict whitelist for the ghost element id. Letter-led ASCII, allows word/hyphen/colon/dot,\n * capped at 128 chars. Anything else is rejected before reaching `getElementById` so a\n * future maintainer can't swap to `querySelector` and quietly reintroduce a CSS-injection\n * vector. (`getElementById` itself is string-equality-safe; the whitelist is defence-in-depth.)\n */\nconst GHOST_ID_PATTERN = /^[A-Za-z][\\w\\-:.]{0,127}$/;\n\n/**\n * Single canonical way to declare a drag source for the agent input.\n *\n * Apply on any element a remote wants to make draggable into the `<fly-agent-input>`:\n *\n * ```html\n * <article [flyAgentDraggable]=\"() => buildPayload(trend)\" flyAgentDraggableGhostId=\"trend-ghost\">…</article>\n * ```\n *\n * On `dragstart` the directive:\n * 1. Resolves the payload (calls the builder fn if supplied; otherwise reads the\n * static value).\n * 2. Validates against {@link DEFAULT_AGENT_PAYLOAD_LIMITS} via\n * {@link validateAgentPayload}. On failure it `console.warn`s with the structured\n * reason and writes ONLY the `text/plain` fallback — the receiver still sees a\n * legible drop, but the typed envelope is skipped so a misconfigured app can't\n * corrupt downstream consumers with an oversize payload.\n * 3. Writes the typed MIME (`application/x-fly-agent-payload+json`) plus the\n * `text/plain` fallback so non-Fly drop targets still get useful text.\n * 4. Sets `effectAllowed = 'copy'` (we never *move* domain objects across windows).\n * 5. When `flyAgentDraggableGhostId` resolves to an element in the DOM, calls\n * `setDragImage` to use that element as the drag preview; otherwise the browser\n * default applies.\n *\n * Notes:\n * - Builder form is preferred over static — it captures fresh state at `dragstart`,\n * not at directive init. A static `AgentDragPayload` is fine for items whose\n * domain object never changes after the row mounts.\n * - The directive sets `[attr.draggable]=\"true\"` so callers don't have to.\n */\n@Directive({\n selector: '[flyAgentDraggable]',\n standalone: true,\n host: {\n '[attr.draggable]': '\"true\"',\n },\n})\nexport class FlyAgentDraggableDirective<T = unknown> {\n /**\n * Either a static payload or a builder evaluated at `dragstart` (preferred — captures\n * fresh state). `input.required` so misuse fails at template compile time.\n */\n readonly flyAgentDraggable = input.required<AgentDragPayload<T> | (() => AgentDragPayload<T>)>();\n\n /**\n * Optional ghost element id (an existing element in the DOM whose snapshot becomes\n * the drag image). Falls back to the default browser drag image when absent or the\n * element can't be resolved.\n *\n * Must be a valid HTML id (ASCII, letter-led). `getElementById` is intentional —\n * do NOT swap to `querySelector` without re-introducing this whitelist.\n */\n readonly flyAgentDraggableGhostId = input<string | undefined>(undefined);\n\n private readonly doc = inject(DOCUMENT);\n\n @HostListener('dragstart', ['$event'])\n onDragStart(ev: DragEvent): void {\n const dt = ev.dataTransfer;\n if (!dt) return;\n\n const payload = this.resolvePayload();\n const validation = validateAgentPayload(payload);\n\n if (!validation.ok) {\n // eslint-disable-next-line no-console\n console.warn('[flyAgentDraggable] payload validation failed; degrading to text/plain', validation);\n dt.setData('text/plain', payload.plainTextFallback ?? '');\n dt.effectAllowed = 'copy';\n return;\n }\n\n dt.setData(AGENT_DRAG_MIME, JSON.stringify(payload));\n dt.setData('text/plain', payload.plainTextFallback ?? '');\n dt.effectAllowed = 'copy';\n\n const ghostId = this.flyAgentDraggableGhostId();\n if (ghostId) {\n if (!GHOST_ID_PATTERN.test(ghostId)) {\n // Don't echo the rejected id (caller-controlled, could be huge).\n // eslint-disable-next-line no-console\n console.warn('[flyAgentDraggable] ignoring ghost id', { reason: 'invalid_ghost_id' });\n } else {\n const ghost = this.doc.getElementById(ghostId);\n if (ghost) {\n // Center the drag image; ResizeObserver-aware sizing is left to the host element.\n dt.setDragImage(ghost, ghost.clientWidth / 2, ghost.clientHeight / 2);\n }\n }\n }\n }\n\n private resolvePayload(): AgentDragPayload<T> {\n const raw = this.flyAgentDraggable();\n return typeof raw === 'function' ? (raw as () => AgentDragPayload<T>)() : raw;\n }\n}\n","import {\n Directive,\n ElementRef,\n Renderer2,\n OnDestroy,\n effect,\n inject,\n input,\n} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\n/**\n * Renders an authenticated image into a host `<img>` element by fetching the\n * resource as a blob through Angular's `HttpClient` and binding the resulting\n * object URL to the host's `src` attribute.\n *\n * Why this exists: every Business / Supporting app stores files in the Files\n * Manager service, which authenticates with a Bearer JWT. A raw `<img src>`\n * request bypasses the Angular HTTP interceptor — the browser issues the GET\n * without the Authorization header, so the response is 401 and the image is\n * broken. The standard workaround is roughly fifteen lines of `effect` +\n * `URL.createObjectURL` + `URL.revokeObjectURL` per call site (see prior\n * inline copies in `FlyImageUploadComponent` and the Circles trend-detail\n * cover). This directive centralizes that pattern so:\n *\n * * Memory hygiene is automatic — the previous object URL is revoked\n * whenever the input changes and on destroy. Easy to forget inline.\n * * Error handling is uniform — a fetch failure clears the host `src`\n * so the browser shows its broken-image affordance once, not the prior\n * image stuck on screen.\n * * A future protocol change (per-request signed URLs, CDN tokens, etc.)\n * lands in one place rather than across every app's image bindings.\n *\n * Usage:\n *\n * ```html\n * <img [flySecureSrc]=\"trend.coverImageId\" alt=\"\" class=\"cover-img\" />\n * ```\n *\n * Pass a full URL when the resource lives somewhere other than the default\n * Files Manager download endpoint:\n *\n * ```html\n * <img [flySecureSrc]=\"'/api/avatars/' + user.id\" alt=\"\" />\n * ```\n *\n * A bare file id (no `/` prefix) is resolved against\n * `/api/files/{id}/download`, which matches the Files Manager convention\n * used everywhere in the platform. Anything that starts with `/` is treated\n * as a literal URL and passed through unchanged — apps with bespoke download\n * routes (signed Excel exports, attachment thumbnails, …) keep working\n * without a wrapper.\n */\n@Directive({\n selector: 'img[flySecureSrc]',\n standalone: true,\n})\nexport class FlySecureSrcDirective implements OnDestroy {\n /**\n * File id or absolute path. Passing `null` / `undefined` / `''` clears the\n * `src` attribute and revokes the previous blob. Useful when binding to a\n * signal whose value can become empty (e.g. after a file is detached).\n */\n readonly flySecureSrc = input<string | null | undefined>();\n\n private readonly http = inject(HttpClient);\n private readonly host = inject(ElementRef<HTMLImageElement>);\n private readonly renderer = inject(Renderer2);\n\n /**\n * The object URL currently bound to the host's `src` attribute. Tracked so\n * we can revoke it before binding a new one (avoids leaking blob memory\n * across rapid input changes — e.g. carousel scrubbing) and on destroy.\n */\n private currentUrl: string | null = null;\n\n constructor() {\n effect((onCleanup) => {\n const raw = this.flySecureSrc();\n this.releaseCurrent();\n this.renderer.removeAttribute(this.host.nativeElement, 'src');\n\n if (!raw) return;\n\n const url = raw.startsWith('/') ? raw : `/api/files/${raw}/download`;\n const sub = this.http\n .get(url, { responseType: 'blob' })\n .subscribe({\n next: (blob) => {\n const objectUrl = URL.createObjectURL(blob);\n this.currentUrl = objectUrl;\n this.renderer.setAttribute(this.host.nativeElement, 'src', objectUrl);\n },\n // A 401 / 403 / 404 here means the image is unavailable for this user.\n // Don't loop or retry — clear the src and let the host page render its\n // own placeholder. Logging is intentionally silent: it's expected on\n // permission boundaries (e.g. shared-evidence on a trend you can read\n // but whose file you can't), and stack-traces would be noise.\n error: () => {\n this.releaseCurrent();\n this.renderer.removeAttribute(this.host.nativeElement, 'src');\n },\n });\n\n onCleanup(() => sub.unsubscribe());\n });\n }\n\n ngOnDestroy(): void {\n this.releaseCurrent();\n }\n\n private releaseCurrent(): void {\n if (this.currentUrl) {\n URL.revokeObjectURL(this.currentUrl);\n this.currentUrl = null;\n }\n }\n}\n","import type { FlyLocaleEntry } from './fly-locale-catalog.model';\n\n/**\n * Verbatim TypeScript port of the C# `LanguageDTO[] _AllLanguages` array supplied by\n * product. **31 entries**, in the canonical order. Three RTL flagged: `he-IL`, `ur-IN`,\n * `ar-AE`. Includes `cmn-Hant-TW` for Chinese and `ka-GE` for Georgian.\n *\n * The order matches the C# source byte-for-byte — do not re-sort. Downstream tests\n * (`fly-locale-catalog.spec.ts`) pin the count, the unique-key constraints, and the\n * RTL set; if you reorder or add an entry, those tests will guide the fix.\n *\n * The strings carry Cyrillic, Hebrew, Vietnamese, Thai, Indonesian, Bengali, Devanagari,\n * Urdu, Catalan, Polish, Korean, Russian, Japanese, Han, Turkish, Romanian, Norwegian,\n * Hungarian, Greek, Finnish, Danish, Dutch, Swedish, Portuguese, Italian, German,\n * Spanish, French, English, Arabic, and Georgian. The file is saved as UTF-8 without\n * BOM (matches every other locale file in the repo). The `…` (U+2026) ellipsis is\n * preserved verbatim.\n */\nexport const FLY_LOCALE_CATALOG: readonly FlyLocaleEntry[] = Object.freeze([\n {\n prefix: 'UK',\n dialect: 'uk-UA',\n englishName: 'Ukrainian',\n arabicName: 'الأوكرانية',\n nativeName: 'Українська',\n detected: 'Виявлена мова',\n searching: 'Шукаючи',\n elevating: 'Підняття до',\n translating: 'Переклад на',\n generatingAnswersForYou: 'Створення відповідей для вас...',\n learnMore: 'Дізнайтеся більше',\n waitingForResponseMsg: 'Будь ласка, наберіться терпіння, ми ще думаємо',\n isRtl: false,\n },\n {\n prefix: 'HE',\n dialect: 'he-IL',\n englishName: 'Hebrew',\n arabicName: 'العبرية',\n nativeName: 'עברית',\n detected: 'שפה מזוהה',\n searching: 'מחפש אחר',\n elevating: 'מרומם ל',\n translating: 'תרגום ל',\n generatingAnswersForYou: 'מייצר עבורך תשובות...',\n learnMore: 'למידע נוסף',\n waitingForResponseMsg: 'אנא התאזרו בסבלנות, אנחנו עדיין חושבים',\n isRtl: true,\n },\n {\n prefix: 'VI',\n dialect: 'vi-VN',\n englishName: 'Vietnamese',\n arabicName: 'الفيتنامية',\n nativeName: 'Tiếng Việt',\n detected: 'Ngôn ngữ được phát hiện',\n searching: 'Tìm kiếm',\n elevating: 'Nâng lên',\n translating: 'Dịch sang',\n generatingAnswersForYou: 'Đang tạo câu trả lời cho bạn...',\n learnMore: 'Tìm hiểu thêm',\n waitingForResponseMsg: 'Vui lòng kiên nhẫn, chúng tôi vẫn đang suy nghĩ',\n isRtl: false,\n },\n {\n prefix: 'TH',\n dialect: 'th-TH',\n englishName: 'Thai',\n arabicName: 'التايلاندية',\n nativeName: 'ไทย',\n detected: 'ภาษาที่ตรวจพบ',\n searching: 'ค้นหา',\n elevating: 'ยกระดับเป็น',\n translating: 'การแปล',\n generatingAnswersForYou: 'กำลังสร้างคำตอบให้กับคุณ...',\n learnMore: 'เรียนรู้เพิ่มเติม',\n waitingForResponseMsg: 'โปรดอดใจรอ, พวกเรายังคงกำลังคิดอยู่',\n isRtl: false,\n },\n {\n prefix: 'ID',\n dialect: 'id-ID',\n englishName: 'Indonesian',\n arabicName: 'الإندونيسية',\n nativeName: 'Bahasa Indonesia',\n detected: 'Bahasa yang terdeteksi',\n searching: 'Mencari',\n elevating: 'Meninggalkan ke',\n translating: 'Menerjemahkan ke',\n generatingAnswersForYou: 'Menghasilkan jawaban untuk Anda...',\n learnMore: 'Cari tahu lebih lanjut',\n waitingForResponseMsg: 'Harap bersabar, kami masih sedang berpikir',\n isRtl: false,\n },\n {\n prefix: 'BN',\n dialect: 'bn-BD',\n englishName: 'Bengali',\n arabicName: 'البنغالية',\n nativeName: 'বাংলা',\n detected: 'সনাক্ত করা ভাষা',\n searching: 'খুঁজছি',\n elevating: 'উন্নত',\n translating: 'অনুবাদ',\n generatingAnswersForYou: 'আপনার জন্য উত্তর তৈরি করা হচ্ছে...',\n learnMore: 'আরো জানুন',\n waitingForResponseMsg: 'অনুগ্রহ করে ধৈর্য ধরুন, আমরা এখনও চিন্তা করছি',\n isRtl: false,\n },\n {\n prefix: 'HI',\n dialect: 'hi-IN',\n englishName: 'Hindi',\n arabicName: 'الهندية',\n nativeName: 'हिन्दी',\n detected: 'पता चला भाषा',\n searching: 'के लिए खोज रहे हैं',\n elevating: 'के लिए ऊंचा',\n translating: 'अनुवाद करना',\n generatingAnswersForYou: 'आपके लिए उत्तर तैयार किया जा रहा है...',\n learnMore: 'और जानें',\n waitingForResponseMsg: 'कृपया धैर्य रखें, हम अभी सोच रहे हैं',\n isRtl: false,\n },\n {\n prefix: 'UR',\n dialect: 'ur-IN',\n englishName: 'Urdu',\n arabicName: 'الأردية',\n nativeName: 'اردو',\n detected: 'پتہ چلا زبان',\n searching: 'کے لیے تلاش',\n elevating: 'بلند کرنا',\n translating: 'ترجمہ کرنا',\n generatingAnswersForYou: 'آپ کے لیے جوابات تیار کیے جا رہے ہیں...',\n learnMore: 'مزید جانیں',\n waitingForResponseMsg: 'براہ کرم صبر کریں، ہم ابھی سوچ رہے ہیں۔',\n isRtl: true,\n },\n {\n prefix: 'CA',\n dialect: 'ca-ES',\n englishName: 'Catalan',\n arabicName: 'الكتالانية',\n nativeName: 'Català',\n detected: 'Idioma detectat',\n searching: 'Buscant',\n elevating: 'Elevant a',\n translating: 'Traduir a',\n generatingAnswersForYou: 'Generant respostes per a tu...',\n learnMore: 'Aprèn més',\n waitingForResponseMsg: 'Si us plau, tingueu paciència, encara estem pensant',\n isRtl: false,\n },\n {\n prefix: 'PL',\n dialect: 'pl-PL',\n englishName: 'Polish',\n arabicName: 'البولندية',\n nativeName: 'Polski',\n detected: 'Wykryty język',\n searching: 'Szukać',\n elevating: 'Podniesienie do',\n translating: 'Tłumaczenie na',\n generatingAnswersForYou: 'Generowanie odpowiedzi dla Ciebie...',\n learnMore: 'Dowiedz się więcej',\n waitingForResponseMsg: 'Proszę o cierpliwość, nadal myślimy',\n isRtl: false,\n },\n {\n prefix: 'KO',\n dialect: 'ko-KR',\n englishName: 'Korean',\n arabicName: 'الكورية',\n nativeName: '한국어',\n detected: '탐지 언어',\n searching: '검색',\n elevating: '상승',\n translating: '번역',\n generatingAnswersForYou: '답변을 생성하는 중...',\n learnMore: '더 알아보기',\n waitingForResponseMsg: '잠시만 기다려 주세요, 저희는 아직 생각 중입니다',\n isRtl: false,\n },\n {\n prefix: 'RU',\n dialect: 'ru-RU',\n englishName: 'Russian',\n arabicName: 'الروسية',\n nativeName: 'Русский',\n detected: 'Обнаруженный язык',\n searching: 'В поисках',\n elevating: 'Поднимаясь до',\n translating: 'Перевод',\n generatingAnswersForYou: 'Генерация ответов для вас...',\n learnMore: 'Узнать больше',\n waitingForResponseMsg: 'Пожалуйста, подождите, мы всё ещё думаем',\n isRtl: false,\n },\n {\n prefix: 'JA',\n dialect: 'ja-JP',\n englishName: 'Japanese',\n arabicName: 'اليابانية',\n nativeName: '日本語',\n detected: '検出言語',\n searching: '探している',\n elevating: '昇格',\n translating: '翻訳',\n generatingAnswersForYou: 'あなたのための答えを生成中...',\n learnMore: 'もっと詳しく',\n waitingForResponseMsg: '少々お待ちください、ただいま考え中です',\n isRtl: false,\n },\n {\n prefix: 'ZH',\n dialect: 'cmn-Hant-TW',\n englishName: 'Chinese',\n arabicName: 'الصينية',\n nativeName: '中文',\n detected: '检测语言',\n searching: '搜索',\n elevating: '提升到',\n translating: '翻译成',\n generatingAnswersForYou: '为您生成答案...',\n learnMore: '了解更多',\n waitingForResponseMsg: '请耐心等待,我们还在思考',\n isRtl: false,\n },\n {\n prefix: 'TR',\n dialect: 'tr-TR',\n englishName: 'Turkish',\n arabicName: 'التركية',\n nativeName: 'Türkçe',\n detected: 'Tespit edilen dil',\n searching: 'Arama',\n elevating: 'Yükseltme',\n translating: 'Çevirme',\n generatingAnswersForYou: 'Sizin için yanıtlar üretiliyor...',\n learnMore: 'Daha fazla bilgi edin',\n waitingForResponseMsg: 'Lütfen sabırlı olun, hâlâ düşünüyoruz',\n isRtl: false,\n },\n {\n prefix: 'RO',\n dialect: 'ro-RO',\n englishName: 'Romanian',\n arabicName: 'الرومانية',\n nativeName: 'Română',\n detected: 'Limba detectată',\n searching: 'Căutare de',\n elevating: 'Elevator la',\n translating: 'Traducerea în',\n generatingAnswersForYou: 'Generarea de răspunsuri pentru tine...',\n learnMore: 'Află mai multe',\n waitingForResponseMsg: 'Vă rugăm să aveți răbdare, încă ne gândim',\n isRtl: false,\n },\n {\n prefix: 'NO',\n dialect: 'nb-NO',\n englishName: 'Norwegian',\n arabicName: 'النرويجية',\n nativeName: 'Norsk',\n detected: 'Oppdaget språk',\n searching: 'Leter etter',\n elevating: 'Løfter til',\n translating: 'Oversette til',\n generatingAnswersForYou: 'Genererer svar for deg...',\n learnMore: 'Lær mer',\n waitingForResponseMsg: 'Vennligst vær tålmodig, vi tenker fortsatt',\n isRtl: false,\n },\n {\n prefix: 'HU',\n dialect: 'hu-HU',\n englishName: 'Hungarian',\n arabicName: 'الهنغارية',\n nativeName: 'Magyar',\n detected: 'Detektált nyelv',\n searching: 'Keresés-ra,-re',\n elevating: 'Felemelve',\n translating: 'Fordítás',\n generatingAnswersForYou: 'Válaszok generálása az Ön számára...',\n learnMore: 'Tudj meg többet',\n waitingForResponseMsg: 'Kérjük, legyen türelemmel, még gondolkodunk',\n isRtl: false,\n },\n {\n prefix: 'EL',\n dialect: 'el-GR',\n englishName: 'Greek',\n arabicName: 'اليونانية',\n nativeName: 'Ελληνικά',\n detected: 'Εντοπισμένη γλώσσα',\n searching: 'Ψάχνοντας για',\n elevating: 'Ανυψώ',\n translating: 'Μεταφράζοντας σε',\n generatingAnswersForYou: 'Δημιουργία απαντήσεων για εσάς...',\n learnMore: 'Μάθε περισσότερα',\n waitingForResponseMsg: 'Παρακαλώ περιμένετε με υπομονή, σκεφτόμαστε ακόμα',\n isRtl: false,\n },\n {\n prefix: 'FI',\n dialect: 'fi-FI',\n englishName: 'Finnish',\n arabicName: 'الفنلندية',\n nativeName: 'Suomi',\n detected: 'Havaittu kieli',\n searching: 'Etsimässä',\n elevating: 'Nousee jhk',\n translating: 'Kääntäen',\n generatingAnswersForYou: 'Luodaan vastauksia sinulle...',\n learnMore: 'Lue lisää',\n waitingForResponseMsg: 'Ole hyvä ja ole kärsivällinen, ajattelemme yhä',\n isRtl: false,\n },\n {\n prefix: 'DA',\n dialect: 'da-DK',\n englishName: 'Danish',\n arabicName: 'الدانماركية',\n nativeName: 'Dansk',\n detected: 'Opdaget sprog',\n searching: 'Leder efter',\n elevating: 'Hæve til',\n translating: 'Oversættelse til',\n generatingAnswersForYou: 'Generer svar til dig...',\n learnMore: 'Lær mere',\n waitingForResponseMsg: 'Vent venligst tålmodigt, vi tænker stadig',\n isRtl: false,\n },\n {\n prefix: 'NL',\n dialect: 'nl-NL',\n englishName: 'Dutch',\n arabicName: 'الهولندية',\n nativeName: 'Nederlands',\n detected: 'Gedetecteerde taal',\n searching: 'Op zoek naar',\n elevating: 'Verheffen tot',\n translating: 'Vertalen naar',\n generatingAnswersForYou: 'Antwoorden voor u genereren...',\n learnMore: 'Lees meer',\n waitingForResponseMsg: 'Gelieve geduld te hebben, we zijn nog aan het nadenken',\n isRtl: false,\n },\n {\n prefix: 'SV',\n dialect: 'sv-SE',\n englishName: 'Swedish',\n arabicName: 'السويدية',\n nativeName: 'Svenska',\n detected: 'Upptäckt språk',\n searching: 'Söker efter',\n elevating: 'Upphöjande till',\n translating: 'Översätta till',\n generatingAnswersForYou: 'Genererar svar åt dig...',\n learnMore: 'Läs mer',\n waitingForResponseMsg: 'Vänligen ha tålamod, vi tänker fortfarande',\n isRtl: false,\n },\n {\n prefix: 'PT',\n dialect: 'pt-PT',\n englishName: 'Portuguese',\n arabicName: 'البرتغالية',\n nativeName: 'Português',\n detected: 'Idioma detectado',\n searching: 'Procurando por',\n elevating: 'Elevando para',\n translating: 'Traduzindo para',\n generatingAnswersForYou: 'Gerando respostas para você...',\n learnMore: 'Saiba mais',\n waitingForResponseMsg: 'Por favor, tenha paciência, ainda estamos a pensar',\n isRtl: false,\n },\n {\n prefix: 'IT',\n dialect: 'it-IT',\n englishName: 'Italian',\n arabicName: 'الإيطالية',\n nativeName: 'Italiano',\n detected: 'Lingua rilevata',\n searching: 'Alla ricerca di',\n elevating: 'Elevare a',\n translating: 'Tradurre in',\n generatingAnswersForYou: 'Generazione di risposte per te...',\n learnMore: 'Scopri di più',\n waitingForResponseMsg: 'Per favore, abbi pazienza, stiamo ancora pensando',\n isRtl: false,\n },\n {\n prefix: 'DE',\n dialect: 'de-DE',\n englishName: 'German',\n arabicName: 'الألمانية',\n nativeName: 'Deutsch',\n detected: 'Erkannte Sprache',\n searching: 'Auf der Suche nach',\n elevating: 'Erhöhung zu',\n translating: 'Übersetzung auf',\n generatingAnswersForYou: 'Wir generieren Antworten für Sie...',\n learnMore: 'Erfahre mehr',\n waitingForResponseMsg: 'Bitte haben Sie Geduld, wir denken noch nach',\n isRtl: false,\n },\n {\n prefix: 'ES',\n dialect: 'es-AR',\n englishName: 'Spanish',\n arabicName: 'الأسبانية',\n nativeName: 'Español',\n detected: 'Idioma detectado',\n searching: 'Buscando',\n elevating: 'Elevando a',\n translating: 'Traduciendo a',\n generatingAnswersForYou: 'Generando respuestas para ti...',\n learnMore: 'Aprende más',\n waitingForResponseMsg: 'Por favor, ten paciencia, todavía estamos pensando',\n isRtl: false,\n },\n {\n prefix: 'FR',\n dialect: 'fr-FR',\n englishName: 'French',\n arabicName: 'الفرنسية',\n nativeName: 'Français',\n detected: 'Langue détectée',\n searching: 'À la recherche de',\n elevating: 'Élever à',\n translating: 'Traduire par',\n generatingAnswersForYou: 'Générer des réponses pour vous...',\n learnMore: 'En savoir plus',\n waitingForResponseMsg: 'Veuillez patienter, nous réfléchissons encore',\n isRtl: false,\n },\n {\n prefix: 'EN',\n dialect: 'en-US',\n englishName: 'English',\n arabicName: 'الإنجليزية',\n nativeName: 'English',\n detected: 'Detected language',\n searching: 'Searching for',\n elevating: 'Elevating to',\n translating: 'Translating to',\n generatingAnswersForYou: 'Generating answers for you...',\n learnMore: 'Learn more',\n waitingForResponseMsg: 'Please bear with us, we are still thinking',\n isRtl: false,\n },\n {\n prefix: 'AR',\n dialect: 'ar-AE',\n englishName: 'Arabic',\n arabicName: 'العربية',\n nativeName: 'العربية',\n detected: 'اللغة المكتشفة',\n searching: 'البحث عن',\n elevating: 'رفع إلى',\n translating: 'ترجمة إلى',\n generatingAnswersForYou: 'جارٍ إنشاء إجابات لك...',\n learnMore: 'تعرف على المزيد',\n waitingForResponseMsg: 'نرجو منك التحلّي بالصبر، نحن ما زلنا نفكر',\n isRtl: true,\n },\n {\n prefix: 'KA',\n dialect: 'ka-GE',\n englishName: 'Georgian',\n arabicName: 'الجورجية',\n nativeName: 'ქართული',\n detected: 'გამოვლენილი ენა',\n searching: 'ძიება',\n elevating: 'ამაღლება',\n translating: 'თარგმნა',\n generatingAnswersForYou: 'პასუხების გენერირება თქვენთვის...',\n learnMore: 'გაიგე მეტი',\n waitingForResponseMsg: 'გთხოვთ მოითმინოთ, ჯერ კიდევ ვფიქრობთ',\n isRtl: false,\n },\n]) as readonly FlyLocaleEntry[];\n\n/**\n * Lookup by BCP-47 dialect (e.g. `'ar-AE'`). Case-insensitive per BCP-47 §2.1.1\n * (subtags are case-insensitive on the wire) — accepts `'en-US'`, `'en-us'`,\n * `'EN-US'`, etc. all as the canonical EN entry. The catalog itself keeps its\n * canonical casing for display.\n *\n * Returns `undefined` when not found; callers decide whether to fall back to `'en-US'`.\n */\nexport function findLocaleByDialect(dialect: string): FlyLocaleEntry | undefined {\n if (typeof dialect !== 'string' || dialect.length === 0) return undefined;\n const lower = dialect.toLowerCase();\n return FLY_LOCALE_CATALOG.find((e) => e.dialect.toLowerCase() === lower);\n}\n\n/**\n * Lookup by short prefix (e.g. `'AR'`). Prefixes are unique in the catalog (asserted by tests).\n * Case-insensitive — accepts `'AR'`, `'ar'`, `'Ar'`. Catalog stores prefixes uppercase\n * for display.\n */\nexport function findLocaleByPrefix(prefix: string): FlyLocaleEntry | undefined {\n if (typeof prefix !== 'string' || prefix.length === 0) return undefined;\n const lower = prefix.toLowerCase();\n return FLY_LOCALE_CATALOG.find((e) => e.prefix.toLowerCase() === lower);\n}\n\n/**\n * Type-narrowing helper for entries flagged RTL.\n *\n * Named with the `Entry` suffix to avoid colliding with the existing\n * `isRtlLocale(lang: string)` from `i18n.service.ts`, which answers a different\n * question (is the *UI* locale code RTL?). Both helpers coexist in `public-api`.\n */\nexport function isRtlLocaleEntry(\n entry: FlyLocaleEntry,\n): entry is FlyLocaleEntry & { isRtl: true } {\n return entry.isRtl === true;\n}\n","/*\n * @mohamedatia/fly-design-system — Public API\n * https://www.npmjs.com/package/@mohamedatia/fly-design-system\n *\n * This is the single entry point for Business / Supporting App developers.\n * Import everything from '@mohamedatia/fly-design-system' — never from relative shell paths.\n *\n * NOTE: This package is published under @mohamedatia/fly-design-system until the @fly\n * npm org is created. It will be republished as @fly/design-system once available.\n *\n * v1.3.0: FlyThemeService (html theme classes), hardened I18nService (AbortSignal, ErrorHandler, RTL helpers).\n * v1.3.1: loadBundle normalizes locale JSON (flat or nested objects; rejects invalid leaves).\n * v1.3.2: loadBundle returns boolean; LoadBundleOptions.silent skips ErrorHandler on failure.\n * v1.3.7: MockAuthService base class + MockAuthConfig for Business App mock auth via fileReplacements.\n * User model extended with optional avatar, source, twoFactorEnabled, createdAt fields.\n * v1.3.8: AuthService.init() no-op added so Business Apps can call init() in APP_INITIALIZER\n * without branching between standalone and embedded modes.\n * v1.3.9: MockAuthService field initializers moved into constructor to fix ngDevMode ReferenceError\n * when the package is loaded in a production-mode bundle (no ngDevMode global defined).\n * v1.4.0: ContextMenuComponent (positioned menu, keyboard nav, focus management) moved from desktop\n * shell to design system. MessageBoxService + MessageBoxComponent added (Windows Forms-style\n * modal dialogs with localized button labels, focus management, and Escape key support).\n * MessageBoxButtons, MessageBoxIcon, DialogResult, MessageBoxOptions, MessageBoxButton exported.\n * v1.5.0: SharePanelComponent — generic share/ACL overlay; host supplies API callbacks and optional\n * permission level options (file ACL vs note-style View/Edit).\n * v1.6.0: SharePanelComponent — `loadOuTree(chartId: string | null)`; optional `loadChartOptions` for\n * default vs alternative org charts (OU grants still use real OU ids). `ShareOrgChartOption` exported.\n * v1.7.0: SharePanelComponent — `loadChartOptions` and `loadOuLabelMap` are required; chart tree loads after\n * options resolve (no spurious null fetch). `loadOuLabelMap` supplies default-tree labels for OU rows.\n * v1.8.0: `WindowInstance` optional `contentUiBlocked` / `contentUiBlockMessageKey`; `WindowManagerService`\n * `beginContentUiBlock` / `endContentUiBlock` default no-ops; `FlyBlockUiComponent` for shell window overlay.\n * v1.10.0: SharePanelComponent — `supportsDeny` input + `isDeny?` on `SharePermissionEntry`. Surfaces an\n * \"Add as deny\" toggle in the add-permission row and renders existing deny grants with red\n * accent + ban icon. `grantToUser` / `grantToOu` callbacks gain a fourth `isDeny: boolean`\n * parameter (additive — existing 3-arg callers won't compile until updated). New locale keys\n * `files.share.add_as_deny`, `files.share.deny_help`, `files.share.denied` (en/ar/fr/ur).\n * Backed by Files Manager `FilePermission.IsDeny` and Notes `NoteShareLevel.Deny`.\n * v2.0.0: BREAKING — `SharePermissionEntry` adopts the `SharePrincipal` discriminated union\n * (`{ kind: 'user' | 'role' | 'ou' | 'app-everyone', ... }`) instead of the v1\n * `grantedToUserId` / `grantedToOuId` / `grantedToAppId` set-which-is-set fields.\n * Hosts must translate domain DTOs to/from the new shape (see\n * `file-access-control.component.ts` and `notes.component.ts` for migration patterns).\n * The `role` kind is reserved for the planned apps-chart role-as-principal flow;\n * hosts should not emit it until the backend's `PermissionResolver` enumerates a\n * user's full OU set (direct + computed-from-role memberships).\n * v2.1.0: AudienceBuilderComponent — generic <fly-audience-builder> form-control for composing\n * a `Fly.Shared.Core.Audience.AudienceFilter`. TypeScript model (`AudienceFilter`,\n * `AudienceTerm` discriminated union, `AUDIENCE_LIMITS`) mirrors the C# polymorphic\n * shape byte-for-byte (`kind` discriminator: users/roles/ou/app-everyone/chart/preset).\n * Reuses share-panel callback shapes (searchUsers, loadOuTree, loadChartOptions,\n * loadRoleOus). Distinct from share-panel: emits `(audienceChange)` + `(validityChange)`\n * instead of auto-persisting; hosts save on submit. New `audience.*` locale namespace.\n * v2.3.0: Deep-link launch contract — `LAUNCH_CONTEXT` injection token + `LaunchContext`\n * type for federated remotes to receive a route + params payload when the host\n * opens (or re-opens) their window via a `?app=&route=¶ms=` URL on the shell.\n * Token resolves to `Signal<LaunchContext | null>`; `null` when no host provider.\n * Backed by `Fly.Shared.Core.Apps.IDeepLinkBuilder` for outbound URL generation.\n * v2.2.0: AudienceBuilderComponent now implements `ControlValueAccessor` + `Validator` so\n * hosts can bind via `formControl` / `formControlName` / `[(ngModel)]`. Existing\n * `[value]` + `(audienceChange)` + `(validityChange)` API still works (forms wiring\n * is purely additive). `AUDIENCE_PRESETS` const exported for hosts that build their\n * own preset pickers. `OuTerm.chartId` and `OuTerm.includeDescendants` are now\n * REQUIRED (no longer optional) so wire round-trips are deterministic — emit explicit\n * `null` / `boolean` rather than `undefined`. New `AudienceErrorCodes` mirror added.\n * v2.4.0: SharePanelComponent + AudienceBuilderComponent — `defaultChartSystemKey` and\n * `defaultChartId` inputs let hosts pre-select a specific chart in the OU picker\n * without knowing the tenant-scoped Guid. `ShareOrgChartOption` gains an optional\n * `systemKey` field so platform-managed charts (`'apps'`, `'default-company'`) are\n * identifiable across tenants. New `SHARE_ORG_CHART_SYSTEM_KEY_APPS` /\n * `SHARE_ORG_CHART_SYSTEM_KEY_DEFAULT` constants exported.\n * v2.5.0: Agent input contracts (Phase 1 of the `<fly-agent-input>` plan) — additive only.\n * `AgentCommandRegistry` + `AgentDropRegistry` (singletons via `providedIn: 'root'`,\n * shared across federation), `flyAgentDraggable` directive, payload-guard helpers\n * (`validateAgentPayload`, `trimAgentPayload`, `trimAgentString`, `utf8ByteLength`),\n * and the cross-cutting `FLY_LOCALE_CATALOG` (31 entries, frozen — verbatim port of\n * `Fly.Shared.Core.LanguageDTO[]`). Three RTL flagged: `he-IL`, `ur-IN`, `ar-AE`.\n * The catalog's RTL helper is exported as `isRtlLocaleEntry` to avoid colliding with\n * the existing `isRtlLocale(lang: string)` from `i18n.service.ts`.\n * No UI consumers yet — Phase 2 wires the registries into the shell input component.\n * v2.9.0: Federation-safe cross-app deep-linking contract. The shell publishes\n * every launch onto a `FLYOS_LAUNCH_EVENT` (`'flyos:launch'`) window\n * CustomEvent AND a `globalThis[FlyosPendingLaunchesGlobalKey]` registry,\n * both keyed by `appId`. New exports: `FLYOS_LAUNCH_EVENT`,\n * `FlyosPendingLaunchesGlobalKey`, `FlyLaunchEventDetail`,\n * `FlyosPendingLaunches`. `LAUNCH_CONTEXT` is now documented as\n * shell-internal — Native Federation can split the InjectionToken across\n * host/remote bundles, so federated remotes must consume the\n * event + registry surfaces. See `skills/cross-app-deep-linking.md`.\n * Also: new `SourceAppResolver` service + `APP_LOOKUP` adapter token,\n * centralising the canonicalization rule that strips `-service` from\n * JWT client_ids (`circles-service` → `circles`) so chips, banners,\n * and launchers stay consistent across the shell.\n * v2.5.1: New `MessageBoxService.showAcknowledged()` entry point returning\n * `DialogResultWithAcknowledgement` for \"Don't ask again\"-style flows.\n * The `dontAskAgain` config (`MessageBoxDontAskAgainConfig`) lives ONLY on\n * `MessageBoxOptionsWithAcknowledgement` — the base `MessageBoxOptions`\n * no longer carries it, so the type system enforces \"checkbox ⇒ caller\n * MUST use `showAcknowledged()`\" and eliminates the silent-discard path\n * on `show()`. Existing `show()` callers are unaffected. Case-insensitive\n * `findLocaleByDialect` / `findLocaleByPrefix` (BCP-47 §2.1.1). See\n * `.workflow/plans/agent-input-component.md` Phase 2b-1.\n * See docs/ExternalAppsGuide/03-frontend-app.md.\n */\n\n// ─── Models ──────────────────────────────────────────────────────────────────\nexport type { DesktopApp, DesktopAppKind } from './lib/models/app.model';\nexport type {\n WindowInstance,\n WindowState,\n ChildWindowData,\n LaunchContext,\n FlyLaunchEventDetail,\n FlyosPendingLaunches,\n} from './lib/models/window.model';\nexport {\n WINDOW_DATA,\n LAUNCH_CONTEXT,\n FLYOS_LAUNCH_EVENT,\n FlyosPendingLaunchesGlobalKey,\n} from './lib/models/window.model';\nexport type { User } from './lib/models/user.model';\n\nexport type {\n SharePermissionEntry,\n SharePrincipal,\n SharePrincipalKind,\n UserPrincipal,\n RolePrincipal,\n OuPrincipal,\n AppEveryonePrincipal,\n ShareUserResult,\n ShareOuNode,\n ShareOrgChartOption,\n SharePanelLevelOption,\n} from './lib/models/share-panel.model';\nexport {\n SHARE_ORG_CHART_SYSTEM_KEY_DEFAULT,\n SHARE_ORG_CHART_SYSTEM_KEY_APPS,\n} from './lib/models/share-panel.model';\n\n// ─── Audience Targeting ──────────────────────────────────────────────────────\nexport type {\n AudienceFilter,\n AudienceTerm,\n AudienceTermKind,\n UsersTerm,\n RolesTerm,\n OuTerm,\n AppEveryoneTerm,\n ChartTerm,\n PresetTerm,\n AudiencePresetKind,\n AudienceOptions,\n} from './lib/models/audience.model';\nexport {\n AUDIENCE_LIMITS,\n AUDIENCE_TERM_KINDS,\n AUDIENCE_PRESETS,\n} from './lib/models/audience.model';\n\n/**\n * Stable error codes returned by audience-aware backend endpoints. Mirror of\n * `Fly.Shared.Core.Audience.AudienceErrorCodes`. Compare on these strings, not on HTTP\n * status, so localized messages can change without breaking integrations.\n */\nexport const AUDIENCE_ERROR_CODES = {\n invalidFilter: 'INVALID_AUDIENCE_FILTER',\n audienceTooLarge: 'AUDIENCE_TOO_LARGE',\n resolverUnavailable: 'AUDIENCE_RESOLVER_UNAVAILABLE',\n invalidAudienceKind: 'INVALID_AUDIENCE_KIND',\n} as const;\nexport type AudienceErrorCode =\n (typeof AUDIENCE_ERROR_CODES)[keyof typeof AUDIENCE_ERROR_CODES];\n\nexport type { AudienceEditTarget } from './lib/components/audience-builder/audience-builder.component';\n\n// ─── Remote App Registration ─────────────────────────────────────────────────\nexport type { RemoteAppDef } from './lib/models/remote-app.model';\n\n// ─── Services ────────────────────────────────────────────────────────────────\nexport { AuthService } from './lib/services/auth.service';\nexport type { LoadBundleOptions } from './lib/services/i18n.service';\nexport { I18nService, RTL_LOCALE_SET, isRtlLocale } from './lib/services/i18n.service';\nexport {\n FlyThemeService,\n type FlyThemeMode,\n DEFAULT_FLY_THEME_MODE,\n FLY_THEME_MODE_IDS,\n normalizeFlyTheme,\n} from './lib/services/fly-theme.service';\nexport {\n WindowManagerService,\n StandaloneWindowManagerService,\n type OpenWindowOptions,\n} from './lib/services/window-manager.service';\nexport { FlyRemoteRouter } from './lib/services/fly-remote-router.service';\nexport {\n SourceAppResolver,\n APP_LOOKUP,\n type AppLookup,\n type AppLookupEntry,\n} from './lib/services/source-app-resolver.service';\nexport {\n loadRemoteStyles,\n unloadRemoteStyles,\n} from './lib/services/fly-remote-styles';\nexport {\n FLY_REMOTE_ROUTES,\n FLY_REMOTE_BASE_PATH,\n type FlyRemoteRoute,\n type FlyRemoteMatch,\n matchFlyRoutePattern,\n} from './lib/services/fly-remote-router.types';\nexport { FlyRemoteRouterOutletComponent } from './lib/components/fly-remote-router-outlet/fly-remote-router-outlet.component';\n\n// ─── Pipes ───────────────────────────────────────────────────────────────────\nexport { TranslatePipe } from './lib/pipes/translate.pipe';\n\n// ─── Mock Auth (for fileReplacements in dev/mock builds) ─────────────────────\nexport { MockAuthService, type MockAuthConfig } from './lib/services/auth.service.mock';\n\n// ─── Components ──────────────────────────────────────────────────────────────\nexport {\n ContextMenuComponent,\n type ContextMenuItem,\n type ContextMenuSection,\n} from './lib/components/context-menu/context-menu.component';\n\nexport {\n MessageBoxComponent,\n} from './lib/components/message-box/message-box.component';\n\nexport {\n MessageBoxService,\n MessageBoxButtons,\n MessageBoxIcon,\n DialogResult,\n type MessageBoxOptions,\n type MessageBoxOptionsWithAcknowledgement,\n type MessageBoxDontAskAgainConfig,\n type MessageBoxButton,\n type DialogResultWithAcknowledgement,\n} from './lib/components/message-box/message-box.service';\n\nexport {\n SharePanelComponent,\n SHARE_PANEL_DEFAULT_FILE_LEVELS,\n type RoleOuLookupRow,\n} from './lib/components/share-panel/share-panel.component';\n\nexport {\n AudienceBuilderComponent,\n} from './lib/components/audience-builder/audience-builder.component';\n\nexport { FlyBlockUiComponent } from './lib/components/block-ui/block-ui.component';\n\n// ─── File Upload Components ─────────────────────────────────────────────────\nexport type { FlyFileInfo } from './lib/models/file.model';\n\nexport { FlyImageUploadComponent } from './lib/components/image-upload/fly-image-upload.component';\n\nexport { FlyFileUploadComponent } from './lib/components/file-upload/fly-file-upload.component';\n\n// ─── Agent input — registries, directives, types (Phase 1) ──────────────────\nexport {\n AgentCommandRegistry,\n AgentDropRegistry,\n} from './lib/services/agent-input';\n\nexport { FlyAgentDraggableDirective } from './lib/directives/fly-agent-draggable.directive';\nexport { FlySecureSrcDirective } from './lib/directives/fly-secure-src.directive';\n\nexport {\n AGENT_DRAG_MIME,\n AGENT_PAYLOAD_VERSION,\n DEFAULT_AGENT_PAYLOAD_LIMITS,\n} from './lib/models/agent-input.model';\n\nexport type {\n AgentCommand,\n AgentCommandScope,\n AgentCommandHandle,\n AgentCommandRegistration,\n AgentDragPayload,\n AgentDropChipMode,\n AgentChipHostInputs,\n AgentDraggableItem,\n AgentDropRendererRegistration,\n AgentPayloadLimits,\n AgentPayloadValidationResult,\n} from './lib/models/agent-input.model';\n\nexport {\n utf8ByteLength,\n trimAgentString,\n trimAgentPayload,\n validateAgentPayload,\n AgentPayloadOversizeError,\n} from './lib/utils/agent-payload-guards';\n\n// ─── Cross-cutting locale catalog (dictation today, future translation feature) ──\nexport type { FlyLocaleEntry } from './lib/models/fly-locale-catalog.model';\nexport {\n FLY_LOCALE_CATALOG,\n findLocaleByDialect,\n findLocaleByPrefix,\n isRtlLocaleEntry,\n} from './lib/models/fly-locale-catalog';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","DOCUMENT"],"mappings":"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"}
|