@flyos/design-system 1.2.0 → 1.4.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.
@@ -1661,14 +1661,18 @@ interface LoadBundleOptions {
1661
1661
  /**
1662
1662
  * Shared I18nService for the shell and Business Apps.
1663
1663
  *
1664
- * **Merge order** (later keys win): DS baseline → shell layer remote bundles
1665
- * in registration order.
1664
+ * **Merge order** (later keys win): DS baseline → remote bundles in registration
1665
+ * order shell layer.
1666
1666
  *
1667
1667
  * - Baseline: {@link DS_BASELINE_LOCALES} — built-in strings for DS components
1668
1668
  * (markdown editor, entity lookup) so they render localized labels even in a
1669
1669
  * standalone consumer that never populated the shell layer. Always overridable.
1670
- * - Shell: `setShellTranslations()` after loading `locale/{lang}.json` and API overrides.
1671
- * - Remotes: `loadBundle()` per manifest `localeBaseUrl`.
1670
+ * - Remotes: `loadBundle()` per manifest `localeBaseUrl`. May ADD any key and may
1671
+ * override the baseline, but cannot redefine a key the shell owns — the dictionary
1672
+ * is global, so allowing that let one remote restyle the whole desktop's wording.
1673
+ * - Shell: `setShellTranslations()` after loading `locale/{lang}.json` and API
1674
+ * overrides. Highest priority, which also makes the per-tenant
1675
+ * `/api/i18n/desktop-shell/{lang}` overrides authoritative over every app.
1672
1676
  */
1673
1677
  declare class I18nService {
1674
1678
  private readonly errorHandler;
@@ -1677,9 +1681,32 @@ declare class I18nService {
1677
1681
  private readonly _bundleOrder;
1678
1682
  private readonly _locale;
1679
1683
  private readonly _version;
1684
+ /** `${bundleId}|${locale}` pairs already reported by {@link warnOnSuppressedShellKeys}. */
1685
+ private readonly _warnedCollisions;
1680
1686
  /** Built-in DS strings for the active locale (falls back to `en` for any
1681
1687
  * locale we don't ship). Lowest-priority layer — always overridable. */
1682
1688
  private readonly _baseline;
1689
+ /**
1690
+ * Merge order, lowest priority first: DS baseline → remote bundles (registration
1691
+ * order) → shell.
1692
+ *
1693
+ * The shell layer is LAST, and that is the whole point. Translations live in one
1694
+ * flat, global dictionary with no per-app scoping, so when remote bundles were
1695
+ * merged last, any remote that happened to define a key the shell also defines
1696
+ * silently rewrote that string for the ENTIRE desktop — every other app included.
1697
+ *
1698
+ * That was not hypothetical: the Circles remote's bundle shares 63 keys with the
1699
+ * shell and differed on 27 of them, one being `common.label.dashboard`, which is
1700
+ * how it came to own the Arabic display name of a Core App it has nothing to do
1701
+ * with. The symptom is near-impossible to chase from the outside — editing the
1702
+ * shell's own `locale/{lang}.json` simply has no effect at runtime, with nothing
1703
+ * logged.
1704
+ *
1705
+ * A remote may still override the DS baseline (bundles are merged after it), which
1706
+ * is the layer explicitly documented as always-overridable, and it may still add
1707
+ * any key the shell does not define. What it can no longer do is redefine a string
1708
+ * the shell owns. {@link loadBundle} warns in dev when a bundle tries.
1709
+ */
1683
1710
  private readonly _merged;
1684
1711
  readonly locale: _angular_core.Signal<string>;
1685
1712
  readonly version: _angular_core.Signal<number>;
@@ -1694,6 +1721,20 @@ declare class I18nService {
1694
1721
  * @returns whether the bundle was loaded successfully.
1695
1722
  */
1696
1723
  loadBundle(opts: LoadBundleOptions): Promise<boolean>;
1724
+ /**
1725
+ * Dev-only: report keys a bundle defines that the shell already owns.
1726
+ *
1727
+ * These are now silently ignored (the shell wins), so without this the app would
1728
+ * simply not use strings the remote shipped and nobody would know which ones. The
1729
+ * previous precedence was worse — it applied them, changing wording across the
1730
+ * whole desktop, also silently. Either way the failure is invisible, which is the
1731
+ * argument for saying it out loud exactly once, when the bundle loads.
1732
+ *
1733
+ * A hit is not automatically a bug: an app legitimately reuses shared keys it does
1734
+ * not intend to redefine, so only keys whose VALUE differs are worth reporting.
1735
+ * The fix on the app's side is to namespace the key under its own app id.
1736
+ */
1737
+ private warnOnSuppressedShellKeys;
1697
1738
  removeBundle(id: string): void;
1698
1739
  clearRemoteBundles(): void;
1699
1740
  t(key: string, params?: Record<string, string | number>): string;
@@ -2507,6 +2548,161 @@ declare class FlyWindowTitleService {
2507
2548
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<FlyWindowTitleService>;
2508
2549
  }
2509
2550
 
2551
+ /**
2552
+ * One candidate/selected person. Mirrors the fields of the Controller's
2553
+ * `UserLookupDto` the component actually renders (`id`/`displayName`/
2554
+ * `avatarUrl`); `email` is optional and purely decorative (chip tooltip).
2555
+ * A host wiring `/api/users/lookup` maps the response 1:1 into this shape.
2556
+ */
2557
+ interface FlyPeoplePickerOption {
2558
+ readonly id: string;
2559
+ readonly displayName: string;
2560
+ readonly email?: string;
2561
+ readonly avatarUrl?: string;
2562
+ }
2563
+ /** Single pick (replaces the current selection) vs multi pick (adds, chips accumulate). */
2564
+ type FlyPeoplePickerMode = 'single' | 'multi';
2565
+
2566
+ /** The exact shape `fly-people-picker` binds to `[searchFn]`. */
2567
+ type FlyPeopleSearchFn = (query: string) => Observable<readonly FlyPeoplePickerOption[]>;
2568
+ /**
2569
+ * **`FlyUserDirectoryService`** — the one id→person adapter for the platform user
2570
+ * directory (`GET /api/users/lookup?q=`, `POST /api/users/resolve`).
2571
+ *
2572
+ * Every app that renders a *list* of people — comment authors, contributors,
2573
+ * approvers, credits, audit rows — needs the same thing: turn a `userId` into a
2574
+ * name without issuing one request per row. Before this service each app wrote
2575
+ * its own copy (Circles `UserResolverService`, Thoughts `UserLookupService`,
2576
+ * plus hand-rolled `/api/users/resolve` calls in the shell and admin portal),
2577
+ * and every copy re-derived the same read-through cache. This is that cache,
2578
+ * once, in the design system.
2579
+ *
2580
+ * The HTTP call rides the **host's** `HttpClient`, so the host's gateway routing,
2581
+ * auth interceptor, and correlation headers all apply — the same arrangement
2582
+ * `fly-entity-lookup` uses. The DS never configures a base URL of its own.
2583
+ *
2584
+ * ## `label()` is read-through — hosts do not prime
2585
+ *
2586
+ * {@link label} is a *signal-backed* accessor: on a cache miss it queues the id
2587
+ * and returns `null`, then the queued ids are resolved in ONE batched request a
2588
+ * microtask later. Because the read happens inside Angular's reactive context,
2589
+ * a template calling `label(id)` re-renders by itself when the answer lands —
2590
+ * no `computed` shadow state, no `prime()` call at each fetch site.
2591
+ *
2592
+ * That last point is the whole reason this exists. The prime-then-read shape it
2593
+ * replaces required every host to (a) keep the raw page separate from the mapped
2594
+ * page, (b) derive the mapped page through a `computed`, and (c) remember to
2595
+ * prime on *every* fetch path — root load, load-more, load-replies, refetch. Miss
2596
+ * one path and that path silently renders GUIDs, with nothing failing. Making the
2597
+ * cache read-through deletes the whole bug class.
2598
+ *
2599
+ * ## Failure is graceful, and never a retry storm
2600
+ *
2601
+ * A failed lookup caches nothing, so callers fall back to whatever they render
2602
+ * for an unresolved id (typically the raw id). Deliberate asymmetry in retry
2603
+ * behaviour, because a render-driven read must not hammer a broken endpoint:
2604
+ *
2605
+ * - **Render-driven** ({@link label}) attempts an id **once**. After a failure it
2606
+ * stays unresolved for the session rather than re-requesting on every
2607
+ * change-detection pass.
2608
+ * - **Explicit** ({@link prime}, {@link resolve}, {@link invalidate}) always
2609
+ * re-attempts. A host re-fetching a page therefore retries naturally, and a
2610
+ * retry button can call {@link invalidate}.
2611
+ *
2612
+ * Unknown / cross-tenant ids are omitted by the endpoint rather than erroring, so
2613
+ * they simply never resolve — which is also the correct behaviour for a
2614
+ * standalone External App where `/api/users/*` isn't reachable at all.
2615
+ *
2616
+ * @example Comment thread — one binding, no plumbing
2617
+ * ```html
2618
+ * <fly-comment-thread
2619
+ * [rootPage]="rootPage()"
2620
+ * [resolveDisplayName]="directory.label" />
2621
+ * ```
2622
+ * ```ts
2623
+ * protected readonly directory = inject(FlyUserDirectoryService);
2624
+ * ```
2625
+ *
2626
+ * @example People picker — search + prefill
2627
+ * ```html
2628
+ * <fly-people-picker
2629
+ * [searchFn]="directory.search()"
2630
+ * [initialSelection]="selected()" />
2631
+ * ```
2632
+ */
2633
+ declare class FlyUserDirectoryService {
2634
+ private readonly http;
2635
+ /** id → person, for everything resolved so far. Signal-backed so {@link label} is reactive. */
2636
+ private readonly entries;
2637
+ /** Ids with a request in the air — so a re-render cannot duplicate an in-flight lookup. */
2638
+ private readonly inFlight;
2639
+ /**
2640
+ * Ids {@link label} has already attempted at least once. Checked ONLY on the
2641
+ * render-driven path: it is what stops a persistently failing endpoint from
2642
+ * being re-requested on every change-detection pass. Explicit callers ignore it.
2643
+ */
2644
+ private readonly attempted;
2645
+ /** Ids queued by {@link label}, awaiting the batched microtask flush. */
2646
+ private readonly queued;
2647
+ private flushScheduled;
2648
+ /**
2649
+ * Display name for `id`, or `null` when it is not (yet) resolved — on a miss the
2650
+ * id is queued for the next batched resolve. Null rather than the raw id on
2651
+ * purpose: a GUID is not a name, and the caller should render its own fallback
2652
+ * (or localized placeholder) instead of the DS guessing one.
2653
+ *
2654
+ * Bound as a value (`[resolveDisplayName]="directory.label"`), so it is an arrow
2655
+ * property rather than a method — `this` stays correct without the host wrapping
2656
+ * it in a closure.
2657
+ */
2658
+ readonly label: (id: string | null | undefined) => string | null;
2659
+ /**
2660
+ * The full resolved person for `id` (name, email, avatar), or `null` when not yet
2661
+ * known. Same read-through queueing as {@link label} — use it when a surface can
2662
+ * render an avatar rather than just a name.
2663
+ */
2664
+ readonly option: (id: string | null | undefined) => FlyPeoplePickerOption | null;
2665
+ /**
2666
+ * Eagerly resolves any ids not already known, merging them into the cache.
2667
+ * Optional — {@link label} resolves on demand — but useful to warm the cache
2668
+ * before a render, or to force a retry after a failed auto-attempt (explicit
2669
+ * calls are not subject to the once-only rule; see the class doc).
2670
+ */
2671
+ prime(ids: readonly (string | null | undefined)[]): void;
2672
+ /**
2673
+ * Bulk-resolves ids to picker options — for prefilling `fly-people-picker`'s
2674
+ * `[initialSelection]` from stored ids. Requests are chunked to the endpoint's
2675
+ * {@link RESOLVE_BATCH_SIZE} cap rather than truncated, so a large selection
2676
+ * resolves fully instead of silently losing its tail. Resolved rows also land in
2677
+ * the cache, so a later {@link label} for the same id is free. Empty in → empty
2678
+ * out with no request.
2679
+ */
2680
+ resolve(ids: readonly (string | null | undefined)[]): Observable<FlyPeoplePickerOption[]>;
2681
+ /**
2682
+ * Drops cached entries so the next read re-resolves them — the retry hook for a
2683
+ * host that surfaces a "couldn't load names" affordance. Omit `ids` to clear the
2684
+ * whole cache.
2685
+ */
2686
+ invalidate(ids?: readonly string[]): void;
2687
+ /**
2688
+ * A `searchFn` over the platform users directory — bind straight to
2689
+ * `<fly-people-picker [searchFn]>`. Results are cached too, so picking someone
2690
+ * makes their name available to {@link label} without another round-trip.
2691
+ */
2692
+ search(): FlyPeopleSearchFn;
2693
+ /** Queues a render-driven miss, honouring the once-only rule. */
2694
+ private queueForRender;
2695
+ private flush;
2696
+ /** Issues the (chunked) resolve calls for `ids` and merges whatever comes back. */
2697
+ private fetch;
2698
+ private post;
2699
+ private merge;
2700
+ private distinct;
2701
+ private chunk;
2702
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyUserDirectoryService, never>;
2703
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<FlyUserDirectoryService>;
2704
+ }
2705
+
2510
2706
  /**
2511
2707
  * fly-remote-styles — Shell-layer CSS loader for Native Federation remotes.
2512
2708
  *
@@ -6146,6 +6342,13 @@ interface FlyCommentLockToggleRequest {
6146
6342
  * eager load-all) — the explicit fix for the legacy unpaged-children scale bug
6147
6343
  * — and each level pages independently via `loadMore`.
6148
6344
  *
6345
+ * The `comments` core app owns no user profile data, so `FlyComment` carries
6346
+ * `authorUserId` and an OPTIONAL `authorDisplayName`. Rather than make every host
6347
+ * map names in itself (and render GUIDs when it forgets), bind
6348
+ * `[resolveDisplayName]` to `FlyUserDirectoryService.label` — see
6349
+ * {@link FlyCommentThreadComponent.resolveDisplayName}. Still transport-agnostic:
6350
+ * the resolver is a function the host hands over, not a call this component makes.
6351
+ *
6149
6352
  * i18n is self-sufficient through the `comment.*` keys in `DS_BASELINE_LOCALES`
6150
6353
  * (en/ar/fr/ur), overridable by any consumer key of the same name. RTL works via
6151
6354
  * logical CSS. Styling uses DS theme tokens (`--surface-*`, `--label-*`,
@@ -6158,6 +6361,7 @@ interface FlyCommentLockToggleRequest {
6158
6361
  * [rootPage]="rootPage()"
6159
6362
  * [repliesByParent]="repliesByParent()"
6160
6363
  * [currentUserId]="me.id"
6364
+ * [resolveDisplayName]="directory.label"
6161
6365
  * [canModerateThread]="canModerate()"
6162
6366
  * [isLocked]="thread().isLocked"
6163
6367
  * (loadReplies)="onLoadReplies($event)"
@@ -6192,6 +6396,23 @@ declare class FlyCommentThreadComponent {
6192
6396
  /** Thread-scoped moderator permission (lock/unlock). Additive — distinct from the
6193
6397
  * per-comment `canModerate` flag, which gates delete-any on that specific comment. */
6194
6398
  readonly canModerateThread: _angular_core.InputSignal<boolean>;
6399
+ /**
6400
+ * Optional id→name lookup, for the common case where the backend DTO carries only
6401
+ * `authorUserId`. The `comments` core app owns no user profile data, so without
6402
+ * this every host had to map display names into `authorDisplayName` itself — and
6403
+ * a host that forgot rendered raw GUIDs at the reader.
6404
+ *
6405
+ * Bind `FlyUserDirectoryService.label` (a signal-backed read-through cache that
6406
+ * resolves on demand and batches). Because the component reads it during render,
6407
+ * the name appears by itself once the lookup lands — the host keeps a plain
6408
+ * page signal, with no `computed` derivation and no priming.
6409
+ *
6410
+ * The component still never calls an API: this is a function the HOST supplies,
6411
+ * exactly like `fly-entity-lookup`'s `LOOKUP_APP_NAME_RESOLVER`. Absent (or
6412
+ * returning `null`), rendering falls back as before. See {@link authorLabel} for
6413
+ * the resolution order.
6414
+ */
6415
+ readonly resolveDisplayName: _angular_core.InputSignal<((userId: string) => string | null) | null>;
6195
6416
  /** Expand a collapsed reply subtree — always page 1 of that parent. */
6196
6417
  readonly loadReplies: _angular_core.OutputEmitterRef<{
6197
6418
  parentCommentId: string;
@@ -6254,6 +6475,19 @@ declare class FlyCommentThreadComponent {
6254
6475
  repliesFor(commentId: string): FlyCommentPage | undefined;
6255
6476
  replyDraft(commentId: string): string;
6256
6477
  isOwn(comment: FlyComment): boolean;
6478
+ /**
6479
+ * The name to render for a comment's author. Resolution order:
6480
+ * explicit `authorDisplayName` (a host that already knows the name, or a
6481
+ * backend that returns one, always wins) → {@link resolveDisplayName} →
6482
+ * the raw `authorUserId`.
6483
+ *
6484
+ * The raw id remains the last resort rather than a placeholder: it is stable,
6485
+ * unique, and lets a reader correlate two comments by the same author even
6486
+ * when the directory is unreachable.
6487
+ */
6488
+ authorLabel(comment: FlyComment): string;
6489
+ /** First character of {@link authorLabel}, for the avatar-initials fallback. */
6490
+ authorInitial(comment: FlyComment): string;
6257
6491
  canReport(comment: FlyComment): boolean;
6258
6492
  canReply(): boolean;
6259
6493
  canDeleteComment(comment: FlyComment): boolean;
@@ -6287,7 +6521,7 @@ declare class FlyCommentThreadComponent {
6287
6521
  onSortPick(next: 'newest' | 'oldest'): void;
6288
6522
  private _setDraft;
6289
6523
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyCommentThreadComponent, never>;
6290
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyCommentThreadComponent, "fly-comment-thread", never, { "rootPage": { "alias": "rootPage"; "required": true; "isSignal": true; }; "repliesByParent": { "alias": "repliesByParent"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; "isLocked": { "alias": "isLocked"; "required": false; "isSignal": true; }; "currentUserId": { "alias": "currentUserId"; "required": false; "isSignal": true; }; "isReadonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "canModerateThread": { "alias": "canModerateThread"; "required": false; "isSignal": true; }; }, { "loadReplies": "loadReplies"; "loadMore": "loadMore"; "submit": "submit"; "edit": "edit"; "delete": "delete"; "report": "report"; "lockToggle": "lockToggle"; "sortChange": "sortChange"; }, never, never, true, never>;
6524
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyCommentThreadComponent, "fly-comment-thread", never, { "rootPage": { "alias": "rootPage"; "required": true; "isSignal": true; }; "repliesByParent": { "alias": "repliesByParent"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; "isLocked": { "alias": "isLocked"; "required": false; "isSignal": true; }; "currentUserId": { "alias": "currentUserId"; "required": false; "isSignal": true; }; "isReadonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "canModerateThread": { "alias": "canModerateThread"; "required": false; "isSignal": true; }; "resolveDisplayName": { "alias": "resolveDisplayName"; "required": false; "isSignal": true; }; }, { "loadReplies": "loadReplies"; "loadMore": "loadMore"; "submit": "submit"; "edit": "edit"; "delete": "delete"; "report": "report"; "lockToggle": "lockToggle"; "sortChange": "sortChange"; }, never, never, true, never>;
6291
6525
  }
6292
6526
 
6293
6527
  /**
@@ -6990,6 +7224,22 @@ type FlyTooltipPlacement = 'top' | 'bottom' | 'left' | 'right';
6990
7224
  * host's `getBoundingClientRect()`, so it escapes every overflow-clip and app-window
6991
7225
  * bound. It flips placement + clamps to the viewport so it's always fully visible.
6992
7226
  *
7227
+ * ## `data-tooltip` is the SAME primitive now (the global clipping fix)
7228
+ * `[data-tooltip]` used to be a CSS-only `::before`/`::after` pair in
7229
+ * `_app-surface-utilities.scss`. A pseudo-element is a child box of its host, so it is
7230
+ * clipped by ANY scrolling / `overflow: hidden` ancestor — which is why the boards
7231
+ * toolbar rail (a `overflow-y: auto` plate) rendered every tool tip cut off inside its
7232
+ * own 47px-wide column. No z-index can fix that: clipping is not a stacking question.
7233
+ * `position: fixed` on the pseudo would not fix it either, because the same plates carry
7234
+ * `backdrop-filter`, and a filtered ancestor is a containing block for fixed descendants.
7235
+ *
7236
+ * The fix is to have ONE tooltip implementation, and it is this one: the selector now
7237
+ * also matches `[data-tooltip]`, and when no `flyTooltip` text is bound the directive
7238
+ * reads the host's `data-tooltip` attribute at show time. Reading it lazily (rather than
7239
+ * binding it) is what lets components that write the attribute IMPERATIVELY — the DS icon
7240
+ * button resolves an i18n key into it — participate by simply listing this directive in
7241
+ * `hostDirectives`, with no input to keep in sync.
7242
+ *
6993
7243
  * ## Behaviour
6994
7244
  * - Shows on `mouseenter` AND `focus` (keyboard users), after `flyTooltipDelay` ms.
6995
7245
  * - Hides immediately on `mouseleave` / `blur` / `Escape` / scroll / wheel / destroy.
@@ -7034,7 +7284,14 @@ declare class FlyTooltipDirective implements OnDestroy {
7034
7284
  private readonly onKeydown;
7035
7285
  constructor();
7036
7286
  ngOnDestroy(): void;
7037
- /** Trimmed text, or `''` when there's nothing meaningful to show. */
7287
+ /**
7288
+ * Trimmed text, or `''` when there's nothing meaningful to show.
7289
+ *
7290
+ * Falls back to the host's `data-tooltip` attribute — read from the DOM rather than through an
7291
+ * input, because the DS icon button writes it imperatively from a resolved i18n key (and re-writes
7292
+ * it on every locale change). A signal input could not see that; an attribute read at show time
7293
+ * always reports the current label.
7294
+ */
7038
7295
  private normalizedText;
7039
7296
  scheduleShow(): void;
7040
7297
  private show;
@@ -7055,7 +7312,7 @@ declare class FlyTooltipDirective implements OnDestroy {
7055
7312
  */
7056
7313
  private ensureStyles;
7057
7314
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyTooltipDirective, never>;
7058
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FlyTooltipDirective, "[flyTooltip]", never, { "text": { "alias": "flyTooltip"; "required": false; "isSignal": true; }; "flyTooltipPlacement": { "alias": "flyTooltipPlacement"; "required": false; "isSignal": true; }; "flyTooltipDisabled": { "alias": "flyTooltipDisabled"; "required": false; "isSignal": true; }; "flyTooltipDelay": { "alias": "flyTooltipDelay"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
7315
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FlyTooltipDirective, "[flyTooltip], [data-tooltip]", never, { "text": { "alias": "flyTooltip"; "required": false; "isSignal": true; }; "flyTooltipPlacement": { "alias": "flyTooltipPlacement"; "required": false; "isSignal": true; }; "flyTooltipDisabled": { "alias": "flyTooltipDisabled"; "required": false; "isSignal": true; }; "flyTooltipDelay": { "alias": "flyTooltipDelay"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
7059
7316
  }
7060
7317
 
7061
7318
  /**
@@ -7256,18 +7513,29 @@ declare function isRtlLocaleEntry(entry: FlyLocaleEntry): entry is FlyLocaleEntr
7256
7513
  /** True when `err` is a failed lazy/dynamic module (chunk) load. */
7257
7514
  declare function isChunkLoadError(err: unknown): boolean;
7258
7515
  /**
7259
- * sessionStorage key recording that this tab session's single chunk-error
7260
- * reload was already spent. It persists across the reload it triggers (an
7261
- * in-memory flag resets on reload and cannot guard a loop).
7516
+ * sessionStorage key recording WHEN this tab session last spent its chunk-error
7517
+ * reload (epoch ms). It persists across the reload it triggers (an in-memory
7518
+ * flag resets on reload and cannot guard a loop).
7262
7519
  */
7263
7520
  declare const FLY_CHUNK_RELOAD_FLAG = "fly:chunk-reload-attempted";
7264
7521
  /**
7265
- * One-shot self-heal for a stale client after a redeploy. Permits exactly ONE
7266
- * reload per tab session, so a reload that keeps failing (a chunk truly missing
7267
- * from the current build, or a genuinely-down host) does NOT loop.
7522
+ * How long a spent self-heal attempt stays spent. Within the window a repeat
7523
+ * failure falls through to the caller's error UI (loop guard); after it the
7524
+ * heal re-arms. A permanent one-shot stranded long-lived tabs on environments
7525
+ * that redeploy repeatedly (e.g. a Helm upgrade→rollback→retry cycle flips the
7526
+ * served build several times in an afternoon — each flip needs its own reload,
7527
+ * but only the first ever got one). 10 min is far above any error→reload→error
7528
+ * loop period (seconds) while well below the gap between distinct redeploys.
7529
+ */
7530
+ declare const FLY_RELOAD_REARM_MS: number;
7531
+ /**
7532
+ * Self-heal for a stale client after a redeploy. Permits ONE reload per
7533
+ * {@link FLY_RELOAD_REARM_MS} window per tab session, so a reload that keeps
7534
+ * failing (a chunk truly missing from the current build, or a genuinely-down
7535
+ * host) does NOT loop — but a LATER redeploy re-arms it.
7268
7536
  *
7269
7537
  * @returns `true` when a reload was initiated (the page will navigate away);
7270
- * `false` when the session's reload was already spent or sessionStorage is
7538
+ * `false` when the window's reload was already spent or sessionStorage is
7271
7539
  * unavailable — callers should surface a fallback / stop rather than spin.
7272
7540
  */
7273
7541
  declare function reloadOnceForChunkError(): boolean;
@@ -7290,10 +7558,11 @@ declare function reloadOnceForChunkError(): boolean;
7290
7558
  */
7291
7559
  declare function isNativeFederationCacheError(err: unknown): boolean;
7292
7560
  /**
7293
- * sessionStorage key recording that this tab session's single Native-Federation
7294
- * cache-heal (revalidation sweep + reload) was already spent separate from
7295
- * {@link FLY_CHUNK_RELOAD_FLAG} so a plain chunk-404 reload and a shared-bundle
7296
- * revalidation sweep each get one independent attempt.
7561
+ * sessionStorage key recording WHEN this tab session last spent its
7562
+ * Native-Federation cache-heal (revalidation sweep + reload; epoch ms)
7563
+ * separate from {@link FLY_CHUNK_RELOAD_FLAG} so a plain chunk-404 reload and a
7564
+ * shared-bundle revalidation sweep each get one independent attempt per
7565
+ * {@link FLY_RELOAD_REARM_MS} window.
7297
7566
  */
7298
7567
  declare const FLY_NF_CACHE_HEAL_FLAG = "nf-cache-heal-attempted";
7299
7568
  /**
@@ -7559,6 +7828,13 @@ declare class FlyModerationQueueComponent {
7559
7828
  readonly error: _angular_core.InputSignal<string | null>;
7560
7829
  /** The currently applied status filter; `null` = "All". Host-controlled, like `[sort]` on `fly-comment-thread`. */
7561
7830
  readonly status: _angular_core.InputSignal<FlyCommentReportStatus | null>;
7831
+ /**
7832
+ * Optional id→name lookup for the reporter column, mirroring
7833
+ * `fly-comment-thread`'s input of the same name. Bind
7834
+ * `FlyUserDirectoryService.label`; absent, rows fall back to the raw id.
7835
+ * See {@link reporterLabel} for the resolution order.
7836
+ */
7837
+ readonly resolveDisplayName: _angular_core.InputSignal<((userId: string) => string | null) | null>;
7562
7838
  /** A status-filter pick (page resets to 1) or a `loadMore` (next page at the current filter). */
7563
7839
  readonly loadPage: _angular_core.OutputEmitterRef<FlyModerationLoadPageRequest>;
7564
7840
  /** Resolve a report as `ActionTaken` or `Dismissed`, with an optional note and delete-the-comment flag. */
@@ -7591,6 +7867,12 @@ declare class FlyModerationQueueComponent {
7591
7867
  shortId(id: string): string;
7592
7868
  subjectHref(r: FlyModerationReport): string;
7593
7869
  subjectDisplay(r: FlyModerationReport): string;
7870
+ /**
7871
+ * Who filed the report. Resolution order: explicit `reporterDisplayName` →
7872
+ * {@link resolveDisplayName} → the raw `reporterUserId`. Same contract as
7873
+ * `fly-comment-thread`'s `authorLabel`.
7874
+ */
7875
+ reporterLabel(r: FlyModerationReport): string;
7594
7876
  formatDate(iso: string): string;
7595
7877
  onStatusPick(next: FlyCommentReportStatus | null): void;
7596
7878
  loadMore(): void;
@@ -7613,24 +7895,9 @@ declare class FlyModerationQueueComponent {
7613
7895
  /** Only one row can be in the lock-confirm state at a time, so a class query is unambiguous. */
7614
7896
  private focusLockCancelButton;
7615
7897
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyModerationQueueComponent, never>;
7616
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyModerationQueueComponent, "fly-moderation-queue", never, { "page": { "alias": "page"; "required": true; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; }, { "loadPage": "loadPage"; "resolve": "resolve"; "lockThread": "lockThread"; "openSubject": "openSubject"; }, never, never, true, never>;
7898
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyModerationQueueComponent, "fly-moderation-queue", never, { "page": { "alias": "page"; "required": true; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "resolveDisplayName": { "alias": "resolveDisplayName"; "required": false; "isSignal": true; }; }, { "loadPage": "loadPage"; "resolve": "resolve"; "lockThread": "lockThread"; "openSubject": "openSubject"; }, never, never, true, never>;
7617
7899
  }
7618
7900
 
7619
- /**
7620
- * One candidate/selected person. Mirrors the fields of the Controller's
7621
- * `UserLookupDto` the component actually renders (`id`/`displayName`/
7622
- * `avatarUrl`); `email` is optional and purely decorative (chip tooltip).
7623
- * A host wiring `/api/users/lookup` maps the response 1:1 into this shape.
7624
- */
7625
- interface FlyPeoplePickerOption {
7626
- readonly id: string;
7627
- readonly displayName: string;
7628
- readonly email?: string;
7629
- readonly avatarUrl?: string;
7630
- }
7631
- /** Single pick (replaces the current selection) vs multi pick (adds, chips accumulate). */
7632
- type FlyPeoplePickerMode = 'single' | 'multi';
7633
-
7634
7901
  /**
7635
7902
  * **`fly-people-picker`** — a thin design-system wrapper over `fly-typeahead`
7636
7903
  * pre-canned for the platform Controller's users lookup
@@ -8536,8 +8803,14 @@ declare class FlyButtonComponent {
8536
8803
  * Circular 34px icon-only button (ported from the legacy global
8537
8804
  * `.circles-iconbtn` disc — both render identically until the P6 sweep).
8538
8805
  *
8539
- * `tooltipKey` resolves through {@link I18nService} and wires BOTH
8540
- * `data-tooltip` (CSS tooltip) and `aria-label`, re-resolving on locale change.
8806
+ * `tooltipKey` resolves through {@link I18nService} and wires BOTH `data-tooltip` and
8807
+ * `aria-label`, re-resolving on locale change.
8808
+ *
8809
+ * The label is FLOATED by {@link FlyTooltipDirective} (a body-parented `position: fixed`
8810
+ * node), listed here as a host directive. It used to be a CSS `::before` on
8811
+ * `[data-tooltip]`, which any scrolling or `overflow: hidden` ancestor clipped — the
8812
+ * boards toolbar rail cut every tip off inside its own column. The directive reads the
8813
+ * attribute this component writes, so there is no input to keep in sync.
8541
8814
  */
8542
8815
  declare class FlyIconButtonComponent {
8543
8816
  private readonly i18n;
@@ -8549,7 +8822,7 @@ declare class FlyIconButtonComponent {
8549
8822
  readonly tooltipKey: _angular_core.InputSignal<string | undefined>;
8550
8823
  constructor();
8551
8824
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyIconButtonComponent, never>;
8552
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyIconButtonComponent, "button[fly-icon-button]", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "tooltipKey": { "alias": "tooltipKey"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
8825
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyIconButtonComponent, "button[fly-icon-button]", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "tooltipKey": { "alias": "tooltipKey"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof FlyTooltipDirective; inputs: {}; outputs: {}; }]>;
8553
8826
  }
8554
8827
 
8555
8828
  type ChipTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger';
@@ -9300,6 +9573,18 @@ interface FlyAppModuleSection {
9300
9573
  /** i18n key for the column heading. Omit for an untitled column. */
9301
9574
  titleKey?: string;
9302
9575
  modules: FlyAppModule[];
9576
+ /**
9577
+ * Card shape on the landing. `feature` is the tall icon-over-title card,
9578
+ * `compact` the short horizontal row. Defaults to `feature` for the first
9579
+ * section and `compact` for the rest.
9580
+ */
9581
+ layout?: 'feature' | 'compact';
9582
+ /** Renders the section behind a disclosure, collapsed initially. */
9583
+ collapsible?: boolean;
9584
+ /** i18n key for the aside shown beside a collapsible section's heading when OPEN. */
9585
+ hintKey?: string;
9586
+ /** i18n key for that aside when the section is COLLAPSED. Falls back to `hintKey`. */
9587
+ collapsedHintKey?: string;
9303
9588
  }
9304
9589
 
9305
9590
  /**
@@ -9416,6 +9701,113 @@ declare function nextModuleIndex(modules: readonly FlyAppModule[], from: number,
9416
9701
  /** First focusable row, or -1 when every row is disabled. */
9417
9702
  declare function firstModuleIndex(modules: readonly FlyAppModule[]): number;
9418
9703
 
9704
+ /**
9705
+ * `<fly-app-home>` — a business app's landing page: brand strip, hero, and one card
9706
+ * per module.
9707
+ *
9708
+ * The sibling of {@link FlyAppTopbarComponent}, and deliberately fed by the SAME
9709
+ * `FlyAppModuleSection[]`. An app declares its modules once; the switcher is how you
9710
+ * move between them once you are inside, this is the front door you arrive at. Two
9711
+ * registries would drift, and the drift would show as a module reachable from one and
9712
+ * not the other.
9713
+ *
9714
+ * ```html
9715
+ * <fly-app-home
9716
+ * brandLabelKey="common.label.thoughts"
9717
+ * titleKey="thoughts.home.title"
9718
+ * subtitleKey="thoughts.home.subtitle"
9719
+ * [sections]="navSections"
9720
+ * (moduleSelected)="open($event)">
9721
+ * <span app-home-brand><fly-thoughts-logo /></span>
9722
+ * <div app-home-actions><!-- locale / theme / profile --></div>
9723
+ * <ng-template flyModuleIcon="ideas"><svg …></svg></ng-template>
9724
+ * </fly-app-home>
9725
+ * ```
9726
+ *
9727
+ * Generalized from the Circles landing, whose layout was sound but whose content was
9728
+ * hardcoded — one inline `<svg>` and one `@if` per module, plus a bespoke card for each
9729
+ * non-module destination. Here every card is data, and a destination that is not really
9730
+ * a module (a gallery, a cross-cutting control room) is just another {@link FlyAppModule}
9731
+ * with a projected icon. That was the test of whether this abstraction was real.
9732
+ *
9733
+ * Icons reuse `flyModuleIcon` — the SAME directive the topbar takes — so an app that
9734
+ * renders both declares its icon templates once per surface, in the same syntax.
9735
+ *
9736
+ * a11y: cards are real `<button>`s in a labelled group; a collapsible section is a
9737
+ * disclosure (`aria-expanded` + `aria-controls`), and the region carries the section
9738
+ * heading. Layout is logical-property only, so it mirrors under `dir="rtl"` on its own —
9739
+ * the one exception is the chevron/arrow glyphs, which are directional by meaning and
9740
+ * flip explicitly.
9741
+ */
9742
+ declare class FlyAppHomeComponent {
9743
+ /** i18n key for the brand name beside the mark. Omit to render the mark alone. */
9744
+ readonly brandLabelKey: _angular_core.InputSignal<string | undefined>;
9745
+ /** i18n key for the hero headline. */
9746
+ readonly titleKey: _angular_core.InputSignal<string | undefined>;
9747
+ /** i18n key for the hero sub-line. */
9748
+ readonly subtitleKey: _angular_core.InputSignal<string | undefined>;
9749
+ /** The app's modules, grouped. Same array the topbar takes. */
9750
+ readonly sections: _angular_core.InputSignal<readonly FlyAppModuleSection[]>;
9751
+ /** i18n key for the card group's `aria-label`. */
9752
+ readonly modulesLabelKey: _angular_core.InputSignal<string>;
9753
+ /** Emits the selected module's `key`. Disabled modules never emit. */
9754
+ readonly moduleSelected: _angular_core.OutputEmitterRef<string>;
9755
+ /** Emits when the brand is activated. */
9756
+ readonly brandSelected: _angular_core.OutputEmitterRef<void>;
9757
+ private readonly icons;
9758
+ /**
9759
+ * Expanded section indices. Seeded from the inputs and then owned by the user —
9760
+ * `linkedSignal` semantics on purpose: re-declaring `sections` (a locale switch
9761
+ * re-evaluating labels, say) must not slam a section the user opened shut again.
9762
+ */
9763
+ private readonly userToggled;
9764
+ private readonly expandedSet;
9765
+ /** Presentation-resolved sections, so the template stays declarative. */
9766
+ readonly rows: _angular_core.Signal<{
9767
+ index: number;
9768
+ section: FlyAppModuleSection;
9769
+ layout: _flyos_design_system.FlyAppHomeLayout;
9770
+ expanded: boolean;
9771
+ hintKey: string | null;
9772
+ }[]>;
9773
+ protected iconFor(key: string): _angular_core.TemplateRef<unknown> | undefined;
9774
+ protected toggle(index: number): void;
9775
+ protected select(module: FlyAppModule): void;
9776
+ protected sectionId(index: number): string;
9777
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyAppHomeComponent, never>;
9778
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyAppHomeComponent, "fly-app-home", never, { "brandLabelKey": { "alias": "brandLabelKey"; "required": false; "isSignal": true; }; "titleKey": { "alias": "titleKey"; "required": false; "isSignal": true; }; "subtitleKey": { "alias": "subtitleKey"; "required": false; "isSignal": true; }; "sections": { "alias": "sections"; "required": false; "isSignal": true; }; "modulesLabelKey": { "alias": "modulesLabelKey"; "required": false; "isSignal": true; }; }, { "moduleSelected": "moduleSelected"; "brandSelected": "brandSelected"; }, ["icons"], ["[app-home-brand]", "[app-home-actions]"], true, never>;
9779
+ }
9780
+
9781
+ /** Card shape a section renders with on the landing. */
9782
+ type FlyAppHomeLayout = 'feature' | 'compact';
9783
+ /**
9784
+ * The section's card shape, applying the default when it declares none: the FIRST
9785
+ * section is the app's front door and gets tall feature cards; everything after it is
9786
+ * secondary and gets compact rows.
9787
+ *
9788
+ * Positional rather than required because the common case — one prominent section plus
9789
+ * a "supporting" tail — should need no configuration at all, and an app that wants
9790
+ * something else says so explicitly.
9791
+ */
9792
+ declare function sectionLayout(section: Pick<FlyAppModuleSection, 'layout'>, index: number): FlyAppHomeLayout;
9793
+ /**
9794
+ * Which sections start expanded: every non-collapsible one, plus none of the
9795
+ * collapsible ones.
9796
+ *
9797
+ * Returned as a `Set` of indices rather than mutating the sections, so the input array
9798
+ * stays the app's immutable declaration and re-rendering with new data cannot resurrect
9799
+ * a stale open/closed state.
9800
+ */
9801
+ declare function initialExpanded(sections: readonly Pick<FlyAppModuleSection, 'collapsible'>[]): ReadonlySet<number>;
9802
+ /**
9803
+ * The hint key for a collapsible section in its current state, or null when it has none.
9804
+ *
9805
+ * `collapsedHintKey` falls back to `hintKey` so an app that wants one message in both
9806
+ * states declares one key. A non-collapsible section never shows a hint — the hint
9807
+ * exists to explain what is hidden.
9808
+ */
9809
+ declare function sectionHintKey(section: Pick<FlyAppModuleSection, 'collapsible' | 'hintKey' | 'collapsedHintKey'>, expanded: boolean): string | null;
9810
+
9419
9811
  /**
9420
9812
  * Underline tab row + panels — visual port of the signal-detail sidecard tab
9421
9813
  * row (`.llc__tabs` / `.llc__tab`); also replaces the job-profile
@@ -10081,6 +10473,6 @@ declare const AUDIENCE_ERROR_CODES: {
10081
10473
  };
10082
10474
  type AudienceErrorCode = (typeof AUDIENCE_ERROR_CODES)[keyof typeof AUDIENCE_ERROR_CODES];
10083
10475
 
10084
- export { AGENT_DRAG_MIME, AGENT_PAYLOAD_VERSION, APP_LOOKUP, AUDIENCE_ERROR_CODES, AUDIENCE_LIMITS, AUDIENCE_PRESETS, AUDIENCE_TERM_KINDS, AgentActionBus, AgentActionUnsupportedDispatchError, AgentCommandRegistry, AgentDropRegistry, AgentFlightAnimator, AgentLookupRegistry, AgentPayloadOversizeError, AudienceBuilderComponent, AuthService, BilingualFieldComponent, CRON_MODES, CRON_WEEKDAYS, ContextMenuComponent, DEFAULT_AGENT_PAYLOAD_LIMITS, DEFAULT_FLY_THEME_MODE, DS_BASELINE_LOCALES, DashboardKpiComponent, DialogResult, EntityLookupComponent, FLYOS_LAUNCH_EVENT, FLYOS_LAUNCH_REQUEST_EVENT, FLYOS_REMOTE_ROUTE_EVENT, FLY_ACCENT_PROPERTY, FLY_ADMIN_ROLES, FLY_CHUNK_RELOAD_FLAG, FLY_COMPACT_THRESHOLD, FLY_COUNTRIES, FLY_EMOJI_BY_ID, FLY_EMOJI_CATEGORIES, FLY_EMOJI_CATEGORY_BY_ID, FLY_EMOJI_DEFAULT_CATEGORIES, FLY_EMOJI_PACK, FLY_EMOJI_PACK_MISSING_MESSAGE, FLY_EMOJI_PREVIEW_COUNT, FLY_EMPTY_VALUE, FLY_LOCALE_CATALOG, FLY_NF_CACHE_HEAL_FLAG, FLY_RELOAD_DEBOUNCE_MS, FLY_REMOTE_BASE_PATH, FLY_REMOTE_CONTEXT_EVENT, FLY_REMOTE_CONTEXT_STORE_KEY, FLY_REMOTE_ROUTES, FLY_SEARCH_DEBOUNCE_MS, FLY_SKIN_TONES, FLY_STANDALONE_AUTH_CONFIG, FLY_THEME_MODE_IDS, FLY_WINDOW_HELP_HINT_EVENT, FLY_WINDOW_PAGE_TITLE_EVENT, FlyAchievementProgressComponent, FlyActionMenuComponent, FlyActionStackComponent, FlyAgentDraggableDirective, FlyAnimatedEmojiComponent, FlyAppTopbarComponent, FlyAuthLiveRefresh, FlyBadgeWallComponent, FlyBlockUiComponent, FlyBreadcrumbComponent, FlyButtonComponent, FlyBytesPipe, FlyCaptchaComponent, FlyCardActionsComponent, FlyCardBodyComponent, FlyCardComponent, FlyCardFooterComponent, FlyCardGridComponent, FlyCardMediaComponent, FlyCardMetaComponent, FlyCardStatusComponent, FlyCardTitleComponent, FlyCellDirective, FlyCheckboxComponent, FlyChipComponent, FlyChunkReloadErrorHandler, FlyClickOutsideDirective, FlyCollapsibleComponent, FlyCommentThreadComponent, FlyCompactNumberPipe, FlyConfirmDialogComponent, FlyControlDirective, FlyCronBuilderComponent, FlyDataTableComponent, FlyDatePipe, FlyDateTimePipe, FlyDebouncer, FlyDecimalNumberPipe, FlyDetailCardComponent, FlyDetailShellComponent, FlyDrawerComponent, FlyDurationPipe, FlyDynamicFormComponent, FlyEmojiPickerComponent, FlyFieldComponent, FlyFileUploadComponent, FlyFilterPanelComponent, FlyFormBannerComponent, FlyFormFooterComponent, FlyFormGridComponent, FlyFormSectionComponent, FlyFullNumberPipe, FlyGanttComponent, FlyHubClient, FlyIconButtonComponent, FlyIfAdminDirective, FlyIfRoleDirective, FlyImageUploadComponent, FlyLeaderboardComponent, FlyMetaListComponent, FlyModalComponent, FlyModerationQueueComponent, FlyModuleIconDirective, FlyPaginationComponent, FlyPeoplePickerComponent, FlyPointsTierComponent, FlyProgressComponent, FlyRelativeTimePipe, FlyRemoteContextService, FlyRemoteRouter, FlyRemoteRouterOutletComponent, FlySearchInputComponent, FlySectionHeaderComponent, FlySecureSrcDirective, FlySegmentedComponent, FlySelectComponent, FlySkeletonComponent, FlySliderComponent, FlySparklineComponent, FlySpinnerComponent, FlyStandaloneAuthCallbackComponent, FlyStandaloneAuthService, FlyStateMessageComponent, FlyDynamicFormComponent as FlySurveyFormComponent, FlyTabComponent, FlyTabsComponent, FlyTagsInputComponent, FlyThemeService, FlyTimePipe, FlyToastService, FlyToggleComponent, FlyTooltipDirective, FlyTreeNavComponent, FlyTypeaheadComponent, FlyWindowHelpService, FlyWindowTitleService, FlyosPendingLaunchesGlobalKey, FlyosShellHandlesLaunchRequestsGlobalKey, FlyosShellOwnsHistoryGlobalKey, GANTT_ZOOMS, I18nService, LAUNCH_CONTEXT, MessageBoxButtons, MessageBoxComponent, MessageBoxIcon, MessageBoxService, MockAuthService, OverlayStack, PRESENCE_COLORS, PageHeaderComponent, RTL_LOCALE_SET, SHARE_ORG_CHART_SYSTEM_KEY_APPS, SHARE_ORG_CHART_SYSTEM_KEY_DEFAULT, SHARE_PANEL_DEFAULT_FILE_LEVELS, STATE_DEFAULT_ICONS, STATE_DEFAULT_MESSAGE_KEYS, STEP_UP_CODE, STEP_UP_REAUTH_HANDLER, STEP_UP_RETURN_KEY, SUPPORTED_AGENT_PAYLOAD_VERSIONS, SharePanelComponent, SourceAppResolver, StandaloneWindowManagerService, StatusBadgeComponent, StepUpService, ToastHostComponent, TranslatePipe, WINDOW_DATA, WINDOW_HELP_HINT, WindowManagerService, applySkinTone, applySuggestion, ariaSort, buildCron, canConfirm, canGoNext, canGoPrev, captureFocus, clampPage, clampSliderValue, connectRemoteLaunch, enterActivatesNatively, filterGroup, filterSuggestions, findLocaleByDialect, findLocaleByPrefix, firstEnabledIndex, firstModuleIndex, flattenModules, flyAdminGuard, flyCaptchaBase64Utf8, flyCaptchaBuildToken, flyCaptchaSha256Hex, flyCompactNumber, flyDebounced, flyDecimalNumber, flyDownloadBlob, flyDuration, flyEmojiFor, flyEmojiIsTonable, flyEmojiPackUrl, flyExportFileName, flyFirstEnabledIndex, flyFormatBytes, flyFormatDate, flyFormatDateTime, flyFormatTime, flyFullNumber, flyNextEnabledIndex, flyNextSegmentIndex, flyRelativeTime, flyResolveActiveTab, flyRoleGuard, flySignedCompact, flySkinToneLabelKey, flyStandaloneAuthGuard, flyStandaloneAuthInterceptor, flyToDateOnly, hasAnyRoleIn, healNativeFederationCacheOnce, isAccentColor, isChunkLoadError, isFlyAuthStorePopulated, isNativeFederationCacheError, isRtlLocale, isRtlLocaleEntry, isValidCron, isValidSingleField, loadRemoteStyles, matchFlyRoutePattern, nextEnabledIndex, nextModuleIndex, nextSegmentIndex, nextSort, normalizeFlyTheme, normalizeRoles, overlayStack, parseCron, parseStepUpChallenge, parseTags, presenceColorFor, printConsoleSecurityWarning, provideFlyChunkReloadRecovery, provideFlyEmojiPack, provideFlyStandaloneAuth, reloadOnceForChunkError, requestAppLaunch, resolveActiveModule, resolveActiveSection, resolveActiveTab, resolveCellValue, resolveStateIcon, resolveStateMessageKey, restoreFocus, sameTags, sliderTrackGradient, sparklinePath, sparklinePoints, stepUpInterceptor, stepUpReturnKey, trimAgentPayload, trimAgentString, unloadRemoteStyles, utf8ByteLength, validateAgentPayload, warnIfEmbeddedSessionMissing };
10085
- export type { ActionMenuItem, AgentAction, AgentActionDispatch, AgentActionVerb, AgentChipHostInputs, AgentCommand, AgentCommandContextBinding, AgentCommandHandle, AgentCommandRegistration, AgentCommandScope, AgentCommandSlashSpec, AgentDragPayload, AgentDraggableItem, AgentDropChipMode, AgentDropRendererRegistration, AgentEnvelopeAttachment, AgentMcpScope, AgentMessageEnvelope, AgentPayloadLimits, AgentPayloadValidationResult, AppEveryonePrincipal, AppEveryoneTerm, AppLookup, AppLookupEntry, AudienceEditTarget, AudienceErrorCode, AudienceFilter, AudienceOptions, AudiencePresetKind, AudienceTerm, AudienceTermKind, BreadcrumbItem, ButtonSize, ButtonVariant, CardLayout, ChartTerm, ChildWindowData, ChipTone, ConfirmKind, ConnectRemoteLaunchOptions, ContextMenuAlign, ContextMenuItem, ContextMenuSection, CronAdvancedFieldDef, CronMode, CronParts, CronWeekday, DesktopApp, DesktopAppCategory, DesktopAppKind, DetailSection, DialogResultWithAcknowledgement, EmbeddedSessionProbe, EntityLinkSelection, FilterGroup, FlyAchievementRow, FlyAppModule, FlyAppModuleSection, FlyAuthRefreshPayload, FlyAuthStoreReadable, FlyBadgeTile, FlyBreadcrumbItem, FlyCaptchaChallenge, FlyCaptchaSolution, FlyCaptchaState, FlyCellContext, FlyColumn, FlyColumnKind, FlyComment, FlyCommentDeleteRequest, FlyCommentEditRequest, FlyCommentLoadMoreRequest, FlyCommentLoadRepliesRequest, FlyCommentLockToggleRequest, FlyCommentPage, FlyCommentReportReason, FlyCommentReportRequest, FlyCommentReportStatus, FlyCommentSubmitRequest, FlyCountry, FlyDrawerSide, FlyDrawerSize, FlyEmojiCategory, FlyEmojiCell, FlyEmojiEntry, FlyEmojiPack, FlyEmojiPackEntry, FlyEmojiPackManifest, FlyEmojiPickerSize, FlyEmojiPickerTab, FlyEmojiSection, FlyFileInfo, FlyFileSelection, FlyFormAnswer, FlyFormAnswerValue, FlyFormDefinition, FlyFormFieldOptions, FlyFormOption, FlyFormQuestion, FlyFormQuestionType, FlyFormScoreDisplay, FlyLaunchEventDetail, FlyLaunchRequestDetail, FlyLeaderboardRow, FlyLiveRefreshOptions, FlyLocaleEntry, FlyMetaItem, FlyModerationLoadPageRequest, FlyModerationLockThreadRequest, FlyModerationOpenSubjectRequest, FlyModerationReport, FlyModerationReportPage, FlyModerationResolutionStatus, FlyModerationResolveRequest, FlyNavigableItem, FlyPeoplePickerMode, FlyPeoplePickerOption, FlyPointsSummary, FlyRemoteContext, FlyRemoteMatch, FlyRemoteRoute, FlyRemoteRouteEventDetail, FlySearchExpandTrigger, FlySearchInputSize, FlySecureSrcState, FlySelectOption, FlySelectValue, FlySkeletonAnimation, FlySkeletonLayout, FlySkeletonShape, FlySkinTone, FlySort, FlyStandaloneAuthConfig, FlyFileSelection as FlySurveyFileSelection, FlyFormAnswer as FlySurveyFormAnswer, FlyFormAnswerValue as FlySurveyFormAnswerValue, FlyFormDefinition as FlySurveyFormDefinition, FlyFormFieldOptions as FlySurveyFormFieldOptions, FlyFormOption as FlySurveyFormOption, FlyFormQuestion as FlySurveyFormQuestion, FlyFormQuestionType as FlySurveyQuestionType, FlyThemeMode, FlyTooltipPlacement, FlyTreeNavNode, FlyTypeaheadOption, FlyWindowHelpHintEventDetail, FlyWindowHelpPublisher, FlyWindowPageTitleEventDetail, FlyWindowTitlePublisher, FlyosPendingLaunches, FocusRestore, FormBannerKind, GanttDependency, GanttDependencyCreate, GanttRow, GanttRowDatesChange, GanttRowKind, GanttZoom, IconButtonVariant, LaunchContext, LoadBundleOptions, LookupDescriptor, LookupHandle, LookupRegistration, LookupResult, LookupSearch, MessageBoxButton, MessageBoxDontAskAgainConfig, MessageBoxOptions, MessageBoxOptionsWithAcknowledgement, MockAuthConfig, OpenWindowOptions, OuPrincipal, OuTerm, OverlayHandle, PageHeaderVariant, PresetTerm, ProgressTone, RemoteAppDef, RequestAppLaunchOptions, RoleOuLookupRow, RolePrincipal, RolesTerm, SegmentedOption, ShareOrgChartOption, ShareOuNode, SharePanelLevelOption, SharePermissionEntry, SharePrincipal, SharePrincipalKind, ShareUserResult, StateMessageKind, StepUpChallenge, StepUpReauthHandler, StepUpReauthRequest, ToastAction, ToastEntry, ToastOptions, ToastVariant, User, UserPrincipal, UsersTerm, WindowHelpHint, WindowInstance, WindowState };
10476
+ export { AGENT_DRAG_MIME, AGENT_PAYLOAD_VERSION, APP_LOOKUP, AUDIENCE_ERROR_CODES, AUDIENCE_LIMITS, AUDIENCE_PRESETS, AUDIENCE_TERM_KINDS, AgentActionBus, AgentActionUnsupportedDispatchError, AgentCommandRegistry, AgentDropRegistry, AgentFlightAnimator, AgentLookupRegistry, AgentPayloadOversizeError, AudienceBuilderComponent, AuthService, BilingualFieldComponent, CRON_MODES, CRON_WEEKDAYS, ContextMenuComponent, DEFAULT_AGENT_PAYLOAD_LIMITS, DEFAULT_FLY_THEME_MODE, DS_BASELINE_LOCALES, DashboardKpiComponent, DialogResult, EntityLookupComponent, FLYOS_LAUNCH_EVENT, FLYOS_LAUNCH_REQUEST_EVENT, FLYOS_REMOTE_ROUTE_EVENT, FLY_ACCENT_PROPERTY, FLY_ADMIN_ROLES, FLY_CHUNK_RELOAD_FLAG, FLY_COMPACT_THRESHOLD, FLY_COUNTRIES, FLY_EMOJI_BY_ID, FLY_EMOJI_CATEGORIES, FLY_EMOJI_CATEGORY_BY_ID, FLY_EMOJI_DEFAULT_CATEGORIES, FLY_EMOJI_PACK, FLY_EMOJI_PACK_MISSING_MESSAGE, FLY_EMOJI_PREVIEW_COUNT, FLY_EMPTY_VALUE, FLY_LOCALE_CATALOG, FLY_NF_CACHE_HEAL_FLAG, FLY_RELOAD_DEBOUNCE_MS, FLY_RELOAD_REARM_MS, FLY_REMOTE_BASE_PATH, FLY_REMOTE_CONTEXT_EVENT, FLY_REMOTE_CONTEXT_STORE_KEY, FLY_REMOTE_ROUTES, FLY_SEARCH_DEBOUNCE_MS, FLY_SKIN_TONES, FLY_STANDALONE_AUTH_CONFIG, FLY_THEME_MODE_IDS, FLY_WINDOW_HELP_HINT_EVENT, FLY_WINDOW_PAGE_TITLE_EVENT, FlyAchievementProgressComponent, FlyActionMenuComponent, FlyActionStackComponent, FlyAgentDraggableDirective, FlyAnimatedEmojiComponent, FlyAppHomeComponent, FlyAppTopbarComponent, FlyAuthLiveRefresh, FlyBadgeWallComponent, FlyBlockUiComponent, FlyBreadcrumbComponent, FlyButtonComponent, FlyBytesPipe, FlyCaptchaComponent, FlyCardActionsComponent, FlyCardBodyComponent, FlyCardComponent, FlyCardFooterComponent, FlyCardGridComponent, FlyCardMediaComponent, FlyCardMetaComponent, FlyCardStatusComponent, FlyCardTitleComponent, FlyCellDirective, FlyCheckboxComponent, FlyChipComponent, FlyChunkReloadErrorHandler, FlyClickOutsideDirective, FlyCollapsibleComponent, FlyCommentThreadComponent, FlyCompactNumberPipe, FlyConfirmDialogComponent, FlyControlDirective, FlyCronBuilderComponent, FlyDataTableComponent, FlyDatePipe, FlyDateTimePipe, FlyDebouncer, FlyDecimalNumberPipe, FlyDetailCardComponent, FlyDetailShellComponent, FlyDrawerComponent, FlyDurationPipe, FlyDynamicFormComponent, FlyEmojiPickerComponent, FlyFieldComponent, FlyFileUploadComponent, FlyFilterPanelComponent, FlyFormBannerComponent, FlyFormFooterComponent, FlyFormGridComponent, FlyFormSectionComponent, FlyFullNumberPipe, FlyGanttComponent, FlyHubClient, FlyIconButtonComponent, FlyIfAdminDirective, FlyIfRoleDirective, FlyImageUploadComponent, FlyLeaderboardComponent, FlyMetaListComponent, FlyModalComponent, FlyModerationQueueComponent, FlyModuleIconDirective, FlyPaginationComponent, FlyPeoplePickerComponent, FlyPointsTierComponent, FlyProgressComponent, FlyRelativeTimePipe, FlyRemoteContextService, FlyRemoteRouter, FlyRemoteRouterOutletComponent, FlySearchInputComponent, FlySectionHeaderComponent, FlySecureSrcDirective, FlySegmentedComponent, FlySelectComponent, FlySkeletonComponent, FlySliderComponent, FlySparklineComponent, FlySpinnerComponent, FlyStandaloneAuthCallbackComponent, FlyStandaloneAuthService, FlyStateMessageComponent, FlyDynamicFormComponent as FlySurveyFormComponent, FlyTabComponent, FlyTabsComponent, FlyTagsInputComponent, FlyThemeService, FlyTimePipe, FlyToastService, FlyToggleComponent, FlyTooltipDirective, FlyTreeNavComponent, FlyTypeaheadComponent, FlyUserDirectoryService, FlyWindowHelpService, FlyWindowTitleService, FlyosPendingLaunchesGlobalKey, FlyosShellHandlesLaunchRequestsGlobalKey, FlyosShellOwnsHistoryGlobalKey, GANTT_ZOOMS, I18nService, LAUNCH_CONTEXT, MessageBoxButtons, MessageBoxComponent, MessageBoxIcon, MessageBoxService, MockAuthService, OverlayStack, PRESENCE_COLORS, PageHeaderComponent, RTL_LOCALE_SET, SHARE_ORG_CHART_SYSTEM_KEY_APPS, SHARE_ORG_CHART_SYSTEM_KEY_DEFAULT, SHARE_PANEL_DEFAULT_FILE_LEVELS, STATE_DEFAULT_ICONS, STATE_DEFAULT_MESSAGE_KEYS, STEP_UP_CODE, STEP_UP_REAUTH_HANDLER, STEP_UP_RETURN_KEY, SUPPORTED_AGENT_PAYLOAD_VERSIONS, SharePanelComponent, SourceAppResolver, StandaloneWindowManagerService, StatusBadgeComponent, StepUpService, ToastHostComponent, TranslatePipe, WINDOW_DATA, WINDOW_HELP_HINT, WindowManagerService, applySkinTone, applySuggestion, ariaSort, buildCron, canConfirm, canGoNext, canGoPrev, captureFocus, clampPage, clampSliderValue, connectRemoteLaunch, enterActivatesNatively, filterGroup, filterSuggestions, findLocaleByDialect, findLocaleByPrefix, firstEnabledIndex, firstModuleIndex, flattenModules, flyAdminGuard, flyCaptchaBase64Utf8, flyCaptchaBuildToken, flyCaptchaSha256Hex, flyCompactNumber, flyDebounced, flyDecimalNumber, flyDownloadBlob, flyDuration, flyEmojiFor, flyEmojiIsTonable, flyEmojiPackUrl, flyExportFileName, flyFirstEnabledIndex, flyFormatBytes, flyFormatDate, flyFormatDateTime, flyFormatTime, flyFullNumber, flyNextEnabledIndex, flyNextSegmentIndex, flyRelativeTime, flyResolveActiveTab, flyRoleGuard, flySignedCompact, flySkinToneLabelKey, flyStandaloneAuthGuard, flyStandaloneAuthInterceptor, flyToDateOnly, hasAnyRoleIn, healNativeFederationCacheOnce, initialExpanded, isAccentColor, isChunkLoadError, isFlyAuthStorePopulated, isNativeFederationCacheError, isRtlLocale, isRtlLocaleEntry, isValidCron, isValidSingleField, loadRemoteStyles, matchFlyRoutePattern, nextEnabledIndex, nextModuleIndex, nextSegmentIndex, nextSort, normalizeFlyTheme, normalizeRoles, overlayStack, parseCron, parseStepUpChallenge, parseTags, presenceColorFor, printConsoleSecurityWarning, provideFlyChunkReloadRecovery, provideFlyEmojiPack, provideFlyStandaloneAuth, reloadOnceForChunkError, requestAppLaunch, resolveActiveModule, resolveActiveSection, resolveActiveTab, resolveCellValue, resolveStateIcon, resolveStateMessageKey, restoreFocus, sameTags, sectionHintKey, sectionLayout, sliderTrackGradient, sparklinePath, sparklinePoints, stepUpInterceptor, stepUpReturnKey, trimAgentPayload, trimAgentString, unloadRemoteStyles, utf8ByteLength, validateAgentPayload, warnIfEmbeddedSessionMissing };
10477
+ export type { ActionMenuItem, AgentAction, AgentActionDispatch, AgentActionVerb, AgentChipHostInputs, AgentCommand, AgentCommandContextBinding, AgentCommandHandle, AgentCommandRegistration, AgentCommandScope, AgentCommandSlashSpec, AgentDragPayload, AgentDraggableItem, AgentDropChipMode, AgentDropRendererRegistration, AgentEnvelopeAttachment, AgentMcpScope, AgentMessageEnvelope, AgentPayloadLimits, AgentPayloadValidationResult, AppEveryonePrincipal, AppEveryoneTerm, AppLookup, AppLookupEntry, AudienceEditTarget, AudienceErrorCode, AudienceFilter, AudienceOptions, AudiencePresetKind, AudienceTerm, AudienceTermKind, BreadcrumbItem, ButtonSize, ButtonVariant, CardLayout, ChartTerm, ChildWindowData, ChipTone, ConfirmKind, ConnectRemoteLaunchOptions, ContextMenuAlign, ContextMenuItem, ContextMenuSection, CronAdvancedFieldDef, CronMode, CronParts, CronWeekday, DesktopApp, DesktopAppCategory, DesktopAppKind, DetailSection, DialogResultWithAcknowledgement, EmbeddedSessionProbe, EntityLinkSelection, FilterGroup, FlyAchievementRow, FlyAppHomeLayout, FlyAppModule, FlyAppModuleSection, FlyAuthRefreshPayload, FlyAuthStoreReadable, FlyBadgeTile, FlyBreadcrumbItem, FlyCaptchaChallenge, FlyCaptchaSolution, FlyCaptchaState, FlyCellContext, FlyColumn, FlyColumnKind, FlyComment, FlyCommentDeleteRequest, FlyCommentEditRequest, FlyCommentLoadMoreRequest, FlyCommentLoadRepliesRequest, FlyCommentLockToggleRequest, FlyCommentPage, FlyCommentReportReason, FlyCommentReportRequest, FlyCommentReportStatus, FlyCommentSubmitRequest, FlyCountry, FlyDrawerSide, FlyDrawerSize, FlyEmojiCategory, FlyEmojiCell, FlyEmojiEntry, FlyEmojiPack, FlyEmojiPackEntry, FlyEmojiPackManifest, FlyEmojiPickerSize, FlyEmojiPickerTab, FlyEmojiSection, FlyFileInfo, FlyFileSelection, FlyFormAnswer, FlyFormAnswerValue, FlyFormDefinition, FlyFormFieldOptions, FlyFormOption, FlyFormQuestion, FlyFormQuestionType, FlyFormScoreDisplay, FlyLaunchEventDetail, FlyLaunchRequestDetail, FlyLeaderboardRow, FlyLiveRefreshOptions, FlyLocaleEntry, FlyMetaItem, FlyModerationLoadPageRequest, FlyModerationLockThreadRequest, FlyModerationOpenSubjectRequest, FlyModerationReport, FlyModerationReportPage, FlyModerationResolutionStatus, FlyModerationResolveRequest, FlyNavigableItem, FlyPeoplePickerMode, FlyPeoplePickerOption, FlyPeopleSearchFn, FlyPointsSummary, FlyRemoteContext, FlyRemoteMatch, FlyRemoteRoute, FlyRemoteRouteEventDetail, FlySearchExpandTrigger, FlySearchInputSize, FlySecureSrcState, FlySelectOption, FlySelectValue, FlySkeletonAnimation, FlySkeletonLayout, FlySkeletonShape, FlySkinTone, FlySort, FlyStandaloneAuthConfig, FlyFileSelection as FlySurveyFileSelection, FlyFormAnswer as FlySurveyFormAnswer, FlyFormAnswerValue as FlySurveyFormAnswerValue, FlyFormDefinition as FlySurveyFormDefinition, FlyFormFieldOptions as FlySurveyFormFieldOptions, FlyFormOption as FlySurveyFormOption, FlyFormQuestion as FlySurveyFormQuestion, FlyFormQuestionType as FlySurveyQuestionType, FlyThemeMode, FlyTooltipPlacement, FlyTreeNavNode, FlyTypeaheadOption, FlyWindowHelpHintEventDetail, FlyWindowHelpPublisher, FlyWindowPageTitleEventDetail, FlyWindowTitlePublisher, FlyosPendingLaunches, FocusRestore, FormBannerKind, GanttDependency, GanttDependencyCreate, GanttRow, GanttRowDatesChange, GanttRowKind, GanttZoom, IconButtonVariant, LaunchContext, LoadBundleOptions, LookupDescriptor, LookupHandle, LookupRegistration, LookupResult, LookupSearch, MessageBoxButton, MessageBoxDontAskAgainConfig, MessageBoxOptions, MessageBoxOptionsWithAcknowledgement, MockAuthConfig, OpenWindowOptions, OuPrincipal, OuTerm, OverlayHandle, PageHeaderVariant, PresetTerm, ProgressTone, RemoteAppDef, RequestAppLaunchOptions, RoleOuLookupRow, RolePrincipal, RolesTerm, SegmentedOption, ShareOrgChartOption, ShareOuNode, SharePanelLevelOption, SharePermissionEntry, SharePrincipal, SharePrincipalKind, ShareUserResult, StateMessageKind, StepUpChallenge, StepUpReauthHandler, StepUpReauthRequest, ToastAction, ToastEntry, ToastOptions, ToastVariant, User, UserPrincipal, UsersTerm, WindowHelpHint, WindowInstance, WindowState };
10086
10478
  //# sourceMappingURL=flyos-design-system.d.ts.map