@flyos/design-system 1.7.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1779,8 +1779,11 @@ declare class I18nService {
1779
1779
  * is a safe default that an integrator can override without coordination.
1780
1780
  *
1781
1781
  * Scope: only the keys the **shippable** DS components reference today
1782
- * (`common.*` toolbar/link/emoji-picker labels + `agent.lookup.*` + `select.*` + `typeahead.*` + `cron.*` + `gantt.*` + `form.*` + `captcha.*` + `comment.*` + `canvas_board.*` + `moderation.*` + `people_picker.*` + `pagination.*` + `tree_nav.*`). When a new DS component
1783
- * starts using `| translate`, add its keys here so it stays self-sufficient.
1782
+ * (`common.*` toolbar/link/emoji-picker labels + `agent.lookup.*` + `select.*` + `typeahead.*` + `cron.*` + `gantt.*` + `form.*` + `captcha.*` + `comment.*` + `canvas_board.*` + `moderation.*` + `people_picker.*` + `currency_selector.*` + `pagination.*` + `tree_nav.*` + `magic_actions.*`). When a new DS component
1783
+ * starts using `| translate` **or `I18nService.t()`**, add its keys here so it stays
1784
+ * self-sufficient — `fly-magic-actions` shipped resolving three keys that existed only in the
1785
+ * shell bundle, so an External App rendering it got the raw key string as every disabled
1786
+ * tooltip and every radio-menu trigger's accessible name (S1-review F5).
1784
1787
  * Values are copied verbatim from the shell's `public/locale/*.json` — keep
1785
1788
  * them in sync if either side changes.
1786
1789
  */
@@ -4407,6 +4410,18 @@ interface ContextMenuItem {
4407
4410
  * further children, each rendered as another nested `fly-context-menu` instance.
4408
4411
  */
4409
4412
  children?: ContextMenuItem[];
4413
+ /**
4414
+ * Set on EVERY item of a mutually-exclusive group (e.g. a Status/Sort radio menu) to opt
4415
+ * that whole group into radio semantics: `undefined` (default, omitted) renders the plain
4416
+ * `role="menuitem"` row this component always has; a `boolean` here renders
4417
+ * `role="menuitemradio"` with `aria-checked` and the selected row's 600-weight + accent-
4418
+ * check treatment (skill §6 "selected --w08 + 600 + accent check"). Additive — a caller
4419
+ * that never sets this sees no change. The row's own `icon` is untouched and keeps
4420
+ * rendering as today; the accent check this adds is a SEPARATE trailing indicator, so a
4421
+ * caller mid-migration (still passing `icon: 'pi-check'` on the selected row) does not get
4422
+ * a doubled glyph in the leading position — only a second, dedicated one at the row's end.
4423
+ */
4424
+ selected?: boolean;
4410
4425
  }
4411
4426
  interface ContextMenuSection {
4412
4427
  label?: string;
@@ -4470,7 +4485,7 @@ declare class ContextMenuComponent implements AfterViewInit, OnDestroy {
4470
4485
  align: _angular_core.InputSignal<ContextMenuAlign>;
4471
4486
  /** See {@link ContextMenuPlacement}. Ignored without an `[anchor]`. */
4472
4487
  placement: _angular_core.InputSignal<ContextMenuPlacement>;
4473
- sections: _angular_core.InputSignal<ContextMenuSection[]>;
4488
+ sections: _angular_core.InputSignal<readonly ContextMenuSection[]>;
4474
4489
  /**
4475
4490
  * Optional containing rect (viewport coords, e.g. from
4476
4491
  * `el.getBoundingClientRect()`) to keep the menu inside — for menus opened
@@ -4698,10 +4713,24 @@ declare class MessageBoxService {
4698
4713
  * current `MessageBoxService` request describes (icon, message, button set) and resolves that
4699
4714
  * request with the user's choice — the design-system replacement for native `alert()`/`confirm()`
4700
4715
  * dialogs, which the platform disallows (see `feedback_no_native_browser_dialogs`).
4716
+ *
4717
+ * ## The mobile confirm card (S5.4)
4718
+ * On mobile chrome the dialog stops being a fixed 400px plate floating in the middle of
4719
+ * a desktop and becomes the design's **confirm card**: full width less a 16px margin on
4720
+ * each side, one step rounder, and with its actions on a full-width row at the 44px
4721
+ * touch floor. That is a host class, not a media query, so the threshold stays where
4722
+ * S5.1 put it — see {@link FLY_VIEWPORT_IS_MOBILE}.
4723
+ *
4724
+ * This is the confirm surface users actually meet: `MessageBoxService` has ~59 call
4725
+ * sites across the shell and the core apps, while the DS's other confirm surface
4726
+ * (`fly-confirm-dialog`, the standalone business-app kit's port) has none outside the
4727
+ * design lab. Both got the treatment; only this one changes what anyone sees today.
4701
4728
  */
4702
4729
  declare class MessageBoxComponent implements AfterViewInit {
4703
4730
  private readonly injectedService;
4704
4731
  private elRef;
4732
+ /** Mobile chrome → the full-bleed confirm card. Read by the host class binding. */
4733
+ protected readonly isMobile: _angular_core.Signal<boolean>;
4705
4734
  /**
4706
4735
  * Optional service override. When bound, the component renders THIS instance's
4707
4736
  * state instead of the root singleton — the mechanism that lets each desktop
@@ -5072,6 +5101,26 @@ type FlyDrawerSize = 'sm' | 'md' | 'lg' | 'xl';
5072
5101
  type FlyDrawerSide = 'end' | 'start';
5073
5102
  /** Standard body padding tier. `none` = full-bleed (consumer draws its own). */
5074
5103
  type FlyDrawerBodyPadding = 'none' | 'sm' | 'md' | 'lg';
5104
+ /**
5105
+ * - `'auto'` (default) — `sheet` while the host application is wearing mobile chrome,
5106
+ * `side` otherwise. Reads {@link FLY_VIEWPORT_IS_MOBILE}, which the shell binds to
5107
+ * its ONE breakpoint predicate; unprovided (bare tests, a standalone External App
5108
+ * that has not opted in) it is `false`, so `auto` is `side` and nothing changes.
5109
+ * - `'side'` — the classic edge-pinned panel, sliding in along the inline axis (see
5110
+ * {@link FlyDrawerSide}). Pin this when a drawer must stay edge-anchored even on a
5111
+ * phone; it is an override of the platform default, so it wants a reason next to it.
5112
+ * - `'sheet'` — a bottom-anchored panel spanning the full inline size, sliding up from
5113
+ * the block-end edge with rounded top corners. `side` is ignored in this mode (there
5114
+ * is no edge to pick — a sheet always anchors to the bottom).
5115
+ *
5116
+ * S5.4 of the UX-refresh program converts every drawer to a sheet on mobile. It does
5117
+ * that HERE, once, rather than as ~50 per-call-site bindings: a viewport fact threaded
5118
+ * through fifty feature components is fifty chances to drift, and each one of those
5119
+ * components would be reaching for a viewport answer from inside an app surface —
5120
+ * precisely the container-vs-viewport trap. The call sites keep saying what the drawer
5121
+ * IS; the platform says how it presents.
5122
+ */
5123
+ type FlyDrawerVariant = 'auto' | 'side' | 'sheet';
5075
5124
  /**
5076
5125
  * Where the drawer is anchored.
5077
5126
  * - `absolute` (default) — clipped to the nearest positioned ancestor, i.e. the
@@ -5117,14 +5166,18 @@ type FlyDrawerPosition = 'absolute' | 'fixed';
5117
5166
  declare class FlyDrawerComponent {
5118
5167
  private host;
5119
5168
  private destroyRef;
5169
+ /** The host app's mobile-chrome flag — the only thing `variant="auto"` consults. */
5170
+ private readonly hostIsMobile;
5120
5171
  /** Drives mount + slide. Controlled by the parent. */
5121
5172
  readonly open: _angular_core.InputSignal<boolean>;
5122
5173
  /** Width tier → inline-size (sm 360 / md 480 / lg 640 / xl min(960px, 94%)). */
5123
5174
  readonly size: _angular_core.InputSignal<FlyDrawerSize>;
5124
5175
  /** Convenience title shown in the default header (ignored if `[flyDrawerHeader]` is projected). Treated as an i18n key. */
5125
5176
  readonly heading: _angular_core.InputSignal<string | null>;
5126
- /** Edge to pin to. `end` (default) slides from inline-end; RTL flips it. */
5177
+ /** Edge to pin to. `end` (default) slides from inline-end; RTL flips it. Ignored when the resolved variant is `sheet`. */
5127
5178
  readonly side: _angular_core.InputSignal<FlyDrawerSide>;
5179
+ /** `auto` (default — sheet on mobile), `side` (edge-pinned) or `sheet` (bottom-anchored). See {@link FlyDrawerVariant}. */
5180
+ readonly variant: _angular_core.InputSignal<FlyDrawerVariant>;
5128
5181
  /** Close when the scrim is clicked. */
5129
5182
  readonly dismissOnScrim: _angular_core.InputSignal<boolean>;
5130
5183
  /** Close on Escape. */
@@ -5154,13 +5207,20 @@ declare class FlyDrawerComponent {
5154
5207
  readonly leaving: _angular_core.WritableSignal<boolean>;
5155
5208
  readonly headingId = "fly-drawer-heading";
5156
5209
  readonly labelledBy: _angular_core.Signal<"fly-drawer-heading" | null>;
5210
+ /**
5211
+ * `variant` with `'auto'` collapsed to the concrete one that renders. Everything
5212
+ * downstream (the panel class, the sheet's own geometry) reads THIS, never the raw
5213
+ * input, so `auto` is resolved in exactly one place.
5214
+ */
5215
+ readonly resolvedVariant: _angular_core.Signal<"side" | "sheet">;
5157
5216
  /** Size/side classes as an ngClass map (kept off the `[class]` string binding,
5158
5217
  * which can race the leaving toggle and stutter the animation). */
5159
5218
  readonly panelClass: _angular_core.Signal<{
5160
5219
  [x: string]: boolean;
5220
+ 'fly-drawer__panel--sheet': boolean;
5161
5221
  }>;
5162
- /** Name of the exit keyframe — used to ignore bubbled child animationend events. */
5163
- private static readonly EXIT_ANIM;
5222
+ /** Exit keyframe names one per variant — used to ignore bubbled child animationend events. */
5223
+ private static readonly EXIT_ANIMS;
5164
5224
  /** Element focused before the drawer opened, restored on close. */
5165
5225
  private previouslyFocused;
5166
5226
  /** Parent element whose overflow we lock while open. */
@@ -5181,7 +5241,7 @@ declare class FlyDrawerComponent {
5181
5241
  private releaseScrollLock;
5182
5242
  private restoreFocus;
5183
5243
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyDrawerComponent, never>;
5184
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyDrawerComponent, "fly-drawer", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "side": { "alias": "side"; "required": false; "isSignal": true; }; "dismissOnScrim": { "alias": "dismissOnScrim"; "required": false; "isSignal": true; }; "dismissOnEscape": { "alias": "dismissOnEscape"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "hideCloseButton": { "alias": "hideCloseButton"; "required": false; "isSignal": true; }; "bodyPadding": { "alias": "bodyPadding"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "openChange": "openChange"; }, never, ["[flyDrawerHeader]", "*", "[flyDrawerFooter]"], true, never>;
5244
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyDrawerComponent, "fly-drawer", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "side": { "alias": "side"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "dismissOnScrim": { "alias": "dismissOnScrim"; "required": false; "isSignal": true; }; "dismissOnEscape": { "alias": "dismissOnEscape"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "hideCloseButton": { "alias": "hideCloseButton"; "required": false; "isSignal": true; }; "bodyPadding": { "alias": "bodyPadding"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "openChange": "openChange"; }, never, ["[flyDrawerHeader]", "*", "[flyDrawerFooter]"], true, never>;
5185
5245
  }
5186
5246
 
5187
5247
  /**
@@ -5363,6 +5423,16 @@ interface FlySelectRenderGroup {
5363
5423
  key: string | null;
5364
5424
  options: FlySelectOption[];
5365
5425
  }
5426
+ /** Resolved fixed-position geometry for the portaled panel. */
5427
+ interface FlySelectPanelPosition {
5428
+ readonly top: number | null;
5429
+ readonly bottom: number | null;
5430
+ readonly left: number | null;
5431
+ readonly right: number | null;
5432
+ readonly minWidth: number;
5433
+ readonly maxHeight: number;
5434
+ readonly flipAbove: boolean;
5435
+ }
5366
5436
  /**
5367
5437
  * **`fly-select`** — the design-system searchable select / combobox.
5368
5438
  *
@@ -5378,12 +5448,29 @@ interface FlySelectRenderGroup {
5378
5448
  * each input defaults to the `select.*` key in `DS_BASELINE_LOCALES` (en/ar/fr/ur), and passing the
5379
5449
  * input still wins. It used to default to a hardcoded English literal that every consumer had to
5380
5450
  * remember to override — none did, so a searchable select read "Search…" under ar/fr/ur.
5381
- * Styling uses DS theme tokens (`--surface-card`,
5382
- * `--surface-border`, `--text-color`, `--primary-color`, …) with light-neutral fallbacks so it stays
5383
- * readable in consumers that haven't mapped the tokens.
5384
- *
5385
- * Pattern mirrors {@link EntityLookupComponent}: an absolutely-positioned panel (no CDK Overlay),
5386
- * signal-driven `activeIndex` keyboard nav, and a `document:mousedown` click-outside guard.
5451
+ * Styling composes the Nova token language (`--w*` ramp, `--accent`, `nova-glass.popover`) — see
5452
+ * `skills/desktop-design-language.md` §3.2 and `.workflow/plans/ux-refresh/notes/S1.7-form-family.md`.
5453
+ *
5454
+ * **Positioning (S1.7 — Nova):** the panel is `position: fixed`, measured from the trigger, and
5455
+ * **portaled to `<body>`** the same way {@link ContextMenuComponent} escapes a clipping/glass
5456
+ * ancestor — see that file's `ngAfterViewInit` for the precedent. Two DS-1.x findings this fixes:
5457
+ * the panel used to be `position: absolute` against a `position: relative` host, which is immune to
5458
+ * the transformed-ancestor trap but vulnerable to an `overflow: hidden` ancestor (a drawer body, an
5459
+ * app-window panel) clipping it; and `nova-glass.popover` puts `backdrop-filter` on the listbox,
5460
+ * and a `backdrop-filter` ancestor (e.g. a glass drawer) turns into a *backdrop root* — a nested
5461
+ * `backdrop-filter` then samples the ancestor's own painted content instead of the wallpaper and
5462
+ * reads as flat mud. Body-parenting resolves BOTH at once: once the panel is a direct child of
5463
+ * `<body>` it is no longer a descendant of any clipping or glass ancestor, so it escapes the clip
5464
+ * *and* is never "nested" glass — no `$nested: true` needed, the full translucent recipe renders
5465
+ * correctly every time. The panel flips above the trigger when fewer than 180px of room remains
5466
+ * below it, clamps its `max-height` into 120–242px, and closes (not repositions — D2 §3.2) on any
5467
+ * outside pointerdown (capture phase, so it isn't defeated by an inner `stopPropagation`), any
5468
+ * ancestor scroll (capture phase — scroll doesn't bubble, and a select routinely sits inside a
5469
+ * scrolling drawer body), or a window resize. Mirrors {@link FlyTooltipDirective}'s scroll/resize
5470
+ * dismiss idiom.
5471
+ *
5472
+ * Pattern mirrors {@link EntityLookupComponent}: no CDK Overlay, signal-driven `activeIndex`
5473
+ * keyboard nav.
5387
5474
  */
5388
5475
  declare class FlySelectComponent implements ControlValueAccessor {
5389
5476
  private readonly host;
@@ -5434,9 +5521,37 @@ declare class FlySelectComponent implements ControlValueAccessor {
5434
5521
  private _touched;
5435
5522
  private readonly searchEl?;
5436
5523
  private readonly triggerEl?;
5524
+ /** Signal query (not a decorator): the panel is created/destroyed by the template's `@if`, and the
5525
+ * portal effect below needs to react every time a NEW instance mounts, not just once at init. */
5526
+ private readonly panelEl;
5527
+ private readonly document;
5528
+ private readonly destroyRef;
5529
+ /** Trigger geometry sampled at open time (and cleared on close) — the only input the fixed
5530
+ * position math needs. Re-sampled on open, never on scroll/resize: those close the panel
5531
+ * instead of repositioning it (D2 §3.2), so there is nothing to keep in sync while it's up. */
5532
+ private readonly _triggerRect;
5533
+ private readonly _triggerRtl;
5437
5534
  private _onChange;
5438
5535
  private _onTouched;
5536
+ private readonly _onOutsidePointerDown;
5537
+ private readonly _onOutsideScroll;
5538
+ private readonly _onWindowResize;
5539
+ constructor();
5540
+ /** Registered only while open (mirrors {@link FlyTooltipDirective}'s show/hide discipline) —
5541
+ * a page can carry many selects, and there is no reason for a closed one to keep three
5542
+ * window-level listeners live. */
5543
+ private _attachDismissListeners;
5544
+ private _detachDismissListeners;
5439
5545
  readonly effectiveDisabled: _angular_core.Signal<boolean>;
5546
+ /**
5547
+ * Fixed-position geometry for the panel, computed purely from the trigger rect sampled at open
5548
+ * time — no post-render measurement pass. Flips above the trigger under 180px of room below (and
5549
+ * only when there's MORE room above), clamps `max-height` into 120–242px, and anchors the panel's
5550
+ * reading-start edge to the trigger's reading-start edge (RTL-aware), growing toward reading-end —
5551
+ * the same anchor behaviour the CSS `inset-inline: 0 auto` gave it before it needed a physical
5552
+ * `position: fixed` value to escape its ancestor.
5553
+ */
5554
+ readonly panelPosition: _angular_core.Signal<FlySelectPanelPosition | null>;
5440
5555
  readonly placeholderText: _angular_core.Signal<string>;
5441
5556
  readonly searchPlaceholderText: _angular_core.Signal<string>;
5442
5557
  readonly noResultsText: _angular_core.Signal<string>;
@@ -5469,6 +5584,8 @@ declare class FlySelectComponent implements ControlValueAccessor {
5469
5584
  toggleOpen(): void;
5470
5585
  open(): void;
5471
5586
  close(refocusTrigger?: boolean): void;
5587
+ /** Sampled once per open — see the `_triggerRect` field doc for why this never re-samples while open. */
5588
+ private _sampleTriggerRect;
5472
5589
  onTriggerKeydown(ev: KeyboardEvent): void;
5473
5590
  onPanelKeydown(ev: KeyboardEvent): void;
5474
5591
  private _selectActive;
@@ -5480,7 +5597,6 @@ declare class FlySelectComponent implements ControlValueAccessor {
5480
5597
  /** Clear the whole selection from the trigger ✕. Stops propagation so it never opens the panel. */
5481
5598
  clear(ev?: Event): void;
5482
5599
  onSearchInput(value: string): void;
5483
- onDocumentMouseDown(ev: MouseEvent): void;
5484
5600
  private _normalizedValue;
5485
5601
  private _emit;
5486
5602
  private _markTouched;
@@ -7136,6 +7252,1038 @@ declare class AgentFlightAnimator {
7136
7252
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AgentFlightAnimator>;
7137
7253
  }
7138
7254
 
7255
+ /**
7256
+ * Magic-bar contribution contract (UX v2 "Nova", D5 §4).
7257
+ *
7258
+ * The magic bar is the shell's top-bar toolbar pill. Unlike the fixed right
7259
+ * cluster (Help / Tasks / Notifications / assistant orb — shell-owned, an app can
7260
+ * never remove it), the pill's contents belong to **whatever view the user is
7261
+ * looking at**, and the design's reference implementation re-publishes the whole
7262
+ * set on every selection, tab and save (`pubTabActions`). Two consequences shape
7263
+ * every type below:
7264
+ *
7265
+ * 1. **A contribution is a full replace, never a patch.** There is no "add one
7266
+ * action" call, because the publisher never knows what the previous view left
7267
+ * behind. That also collapses D5's `search: null` ("suppress") vs `search`
7268
+ * absent distinction — under full replace both simply mean "this view offers
7269
+ * no search".
7270
+ * 2. **Render data and behaviour are separated in the type system.** Each family
7271
+ * has a `*Spec` base carrying ONLY the fields that affect what is painted;
7272
+ * the publisher-facing type extends it with callbacks, and the shell-facing
7273
+ * `*View` type extends it with bound invokers. The base IS the equality
7274
+ * surface {@link MagicBarRegistry} dedupes on — a re-publish whose specs are
7275
+ * unchanged must not disturb the shell, even though its closures are brand
7276
+ * new objects every time (an arrow function in a component method never
7277
+ * compares equal to its predecessor). See `magic-bar-projection.ts`.
7278
+ *
7279
+ * **Strings are i18n keys, never resolved text** — same rule as
7280
+ * {@link AgentCommandRegistration} (`labelKey` / `descriptionKey` / `hintKey`),
7281
+ * for the same two reasons: a contribution outlives a locale switch (a resolved
7282
+ * label would silently go stale until the publisher happened to re-publish), and
7283
+ * keys are locale-invariant so the dedupe fingerprint doesn't churn when the user
7284
+ * changes language. Keys resolve in the OWNING app's bundle.
7285
+ *
7286
+ * **Every `*Key` has an optional `*Params` sibling** ({@link MagicBarTextParams}),
7287
+ * fed straight to `I18nService.t(key, params)`. Without it a count-carrying string
7288
+ * ("Search 1,204 tasks…") forces the publisher to pass pre-formatted TEXT as the
7289
+ * key: it renders correctly in `en`, renders identically untranslated in ar/fr/ur,
7290
+ * and no locale tool can see it. Params participate in the dedupe fingerprint, so
7291
+ * a changing count re-paints.
7292
+ *
7293
+ * Which of D5 §4's "dynamics the shell must honor" live where:
7294
+ *
7295
+ * | # | Dynamic | Owner |
7296
+ * |---|---|---|
7297
+ * | 1 | Live re-publication, idempotent replace | {@link MagicBarRegistry} (here) |
7298
+ * | 2 | Disabled ≠ hidden, auto disabled-tooltip | contract keeps `disabled` rows; `fly-magic-actions` renders + suffixes |
7299
+ * | 3 | `toolbarPopIn` 40 ms stagger | renderer — it tracks on {@link MagicBarActionSpec.id}, which is why ids are unique across the WHOLE contribution |
7300
+ * | 4 | i18n on every label/tip | contract (keys + params, above) |
7301
+ * | 5 | Fixed right cluster is not contributable | contract — no slot exists for it |
7302
+ * | 6 | Mobile renders the same contribution | contract carries no form-factor branch; `openWidth` is a desktop hint mobile ignores |
7303
+ * | 7 | `shortcut` reserved (design has no shortcut affordance yet) | contract — carried, unrendered |
7304
+ *
7305
+ * On dynamic 3 specifically: the registry's dedupe does NOT stop the stagger
7306
+ * replaying, and believing it does would produce a renderer that re-animates on
7307
+ * every click. Dedupe fires only when *nothing painted* changed, and the dominant
7308
+ * case — `disabled: !hasSelection` — changes the fingerprint on every selection.
7309
+ * What holds the DOM still is the renderer's `@for (…; track item.id)`.
7310
+ */
7311
+ /** How an action paints. `'text'` is the labelled-pill form (calendar's "Today"). */
7312
+ type MagicBarActionKind = 'icon' | 'text' | 'toggle';
7313
+ /**
7314
+ * Semantic colour of an action. `'danger'` is the red Delete treatment (red glyph
7315
+ * + red 18 % hover tint, D7); `'success'` is the green "Mark as complete" pressed
7316
+ * state (D5 §1.4 + §4 prop table: "pressed bg tint-sel / green for complete").
7317
+ *
7318
+ * A union rather than the boolean `danger` this started as: the design already
7319
+ * demands a second colour, and widening a shipped `danger?: boolean` into a union
7320
+ * later would mean REMOVING an interface member — MAJOR under `tools/ds-compat`
7321
+ * (rule 7), which forks the federation singleton for every remote.
7322
+ */
7323
+ type MagicBarTone = 'default' | 'danger' | 'success';
7324
+ /**
7325
+ * Interpolation params for one i18n key — the `params` argument of
7326
+ * `I18nService.t(key, params)`, substituting `{{name}}` placeholders.
7327
+ *
7328
+ * Values are `string | number` only: the fingerprint has to encode them, and the
7329
+ * renderer resolves them through `t()`, which stringifies. A `Date` or a nested
7330
+ * object would fingerprint as `{}` and paint as `[object Object]`.
7331
+ */
7332
+ type MagicBarTextParams = Readonly<Record<string, string | number>>;
7333
+ /**
7334
+ * Identity of a contribution's publisher, and the arbitration key the shell uses
7335
+ * to pick which contribution the bar renders.
7336
+ *
7337
+ * `windowId` is optional but strongly preferred: two windows of the same app can
7338
+ * be open on different selections, and keying on `appId` alone would let the
7339
+ * background one paint the focused one's toolbar. It is optional only because a
7340
+ * federated remote that predates per-window plumbing can still contribute —
7341
+ * {@link MagicBarRegistry} resolves an `appId`-keyed slot as a fallback.
7342
+ *
7343
+ * It only has to be unique **within the publishing app** (the shell passes its own
7344
+ * `win-<appId>-<timestamp>` window id; a tab index or a route-derived id is equally
7345
+ * valid) — {@link magicBarOwnerKey} scopes it by `appId`, so a value another app
7346
+ * also uses can never cross over.
7347
+ */
7348
+ interface MagicBarOwnerRef {
7349
+ readonly appId: string;
7350
+ readonly windowId?: string;
7351
+ }
7352
+ /**
7353
+ * Storage/arbitration key for an owner. Exported because the shell computes it
7354
+ * on the janitor path (`clear` after a window closes) without holding the
7355
+ * publisher.
7356
+ *
7357
+ * **Both fields key the slot**, even though the shell's own ids
7358
+ * (`win-<appId>-<timestamp>`) are already unique. `windowId` is publisher-supplied
7359
+ * DATA that crosses the federation boundary, and the field is documented only as
7360
+ * "two windows of the same app" — nothing stops a remote passing a tab index or a
7361
+ * route-derived id. Keyed on `windowId` alone, two apps that both call their first
7362
+ * window `"1"` would share a slot: one silently paints the other's chrome, and the
7363
+ * shell's janitor `clear()` wipes the wrong one.
7364
+ */
7365
+ declare function magicBarOwnerKey(owner: MagicBarOwnerRef): string;
7366
+ /** One `menuitemradio` row. `value` is the publisher's own vocabulary. */
7367
+ interface MagicBarRadioOption {
7368
+ readonly value: string;
7369
+ readonly labelKey: string;
7370
+ /** Params for {@link labelKey} — the count-badged option ("All statuses ({{count}})"). */
7371
+ readonly labelParams?: MagicBarTextParams;
7372
+ }
7373
+ /** Render surface of a radio menu — the dedupe key for {@link MagicBarRadioMenu}. */
7374
+ interface MagicBarRadioMenuSpec {
7375
+ /** Eyebrow above the options ("Filter by status" / "Sort by"). */
7376
+ readonly titleKey: string;
7377
+ /** Params for {@link titleKey}. */
7378
+ readonly titleParams?: MagicBarTextParams;
7379
+ readonly options: readonly MagicBarRadioOption[];
7380
+ /** Current selection — check glyph + 600 weight on the matching row. */
7381
+ readonly value: string;
7382
+ /** The unfiltered/unsorted baseline; the trigger shows its accent dot iff `value !== defaultValue`. */
7383
+ readonly defaultValue: string;
7384
+ }
7385
+ /** What a publisher supplies for a radio menu. */
7386
+ interface MagicBarRadioMenu extends MagicBarRadioMenuSpec {
7387
+ readonly onSelect?: (value: string) => void;
7388
+ }
7389
+ /** What the shell renders. `select` always exists; it no-ops when the publisher supplied no handler. */
7390
+ interface MagicBarRadioMenuView extends MagicBarRadioMenuSpec {
7391
+ select(value: string): void;
7392
+ }
7393
+ /**
7394
+ * Render surface of an action — the dedupe key for {@link MagicBarAction}.
7395
+ *
7396
+ * `id` must be unique across the WHOLE contribution (every group, plus `primary`
7397
+ * and `overflow`), not merely within its group: it is the address the shell's
7398
+ * invoker resolves against the publisher's latest handlers.
7399
+ */
7400
+ interface MagicBarActionSpec {
7401
+ readonly id: string;
7402
+ /** i18n key — the `aria-label` and the default tooltip. */
7403
+ readonly labelKey: string;
7404
+ /** Params for {@link labelKey}, e.g. `{ count: 3 }` for "Delete {{count}} items". */
7405
+ readonly labelParams?: MagicBarTextParams;
7406
+ /**
7407
+ * Inner-SVG geometry for a 24×24 glyph (`stroke-width: 1.8`, round caps) —
7408
+ * the design's icon transport. Reference {@link FLY_MAGIC_BAR_ICONS} by name
7409
+ * rather than hand-authoring; a publisher MAY author its own, subject to the
7410
+ * contract below.
7411
+ *
7412
+ * **This value is not trusted.** The renderer parses it against a closed
7413
+ * allowlist — self-closing `path`/`circle`/`rect`/`ellipse`/`line`/`polyline`/
7414
+ * `polygon` elements carrying geometry attributes only (`d`, `cx`, `points`,
7415
+ * …) — and binds the result as real attributes. It is never assigned as HTML.
7416
+ * Anything else (a container element, an `on*` handler, `style`, `href`,
7417
+ * `fill="url(…)"`, a stray text node) rejects the WHOLE fragment: the button
7418
+ * renders with no glyph and logs. See `magic-actions-icon.ts`.
7419
+ *
7420
+ * The type stays `string` deliberately. Narrowing it to a branded/opaque type
7421
+ * would be a ds-compat MAJOR, and it would not buy anything the renderer's own
7422
+ * validation does not already guarantee — a nominal type describes where a
7423
+ * value came from, not what it contains.
7424
+ */
7425
+ readonly iconPath?: string;
7426
+ /** Default `'icon'`. */
7427
+ readonly kind?: MagicBarActionKind;
7428
+ /** Dimmed (`opacity .38`), NEVER hidden — a vanishing action teaches the user nothing. */
7429
+ readonly disabled?: boolean;
7430
+ /**
7431
+ * Tooltip override while disabled. Absent is the normal case: the renderer
7432
+ * auto-suffixes the resolved label ("… — select an item first"). Resolution
7433
+ * and the connector phrasing are the renderer's job precisely because they are
7434
+ * locale work, and this store holds keys rather than text.
7435
+ */
7436
+ readonly disabledTipKey?: string;
7437
+ /** Params for {@link disabledTipKey}. */
7438
+ readonly disabledTipParams?: MagicBarTextParams;
7439
+ /** Tooltip override while enabled. Absent → the renderer uses `labelKey`. */
7440
+ readonly tipKey?: string;
7441
+ /** Params for {@link tipKey}. */
7442
+ readonly tipParams?: MagicBarTextParams;
7443
+ /**
7444
+ * Semantic colour. Default `'default'`; `'danger'` is the ONLY thing that makes
7445
+ * an icon red (D7), `'success'` the green completed-toggle treatment.
7446
+ */
7447
+ readonly tone?: MagicBarTone;
7448
+ /** `aria-pressed` for `kind: 'toggle'`. */
7449
+ readonly pressed?: boolean;
7450
+ /** Small accent dot — a non-default filter/sort is active. */
7451
+ readonly badgeDot?: boolean;
7452
+ /**
7453
+ * Reserved (D5 §4 item 7). The designs carry no keyboard-shortcut affordance
7454
+ * anywhere; the field exists so adding one later is a renderer change rather
7455
+ * than a contract break. Nothing renders it today.
7456
+ */
7457
+ readonly shortcut?: string;
7458
+ }
7459
+ /** What a publisher supplies for one action. */
7460
+ interface MagicBarAction extends MagicBarActionSpec {
7461
+ readonly menu?: MagicBarRadioMenu;
7462
+ readonly onSelect?: () => void;
7463
+ }
7464
+ /**
7465
+ * What the shell renders. `run()` always exists and always dispatches to the
7466
+ * publisher's LATEST handler for this id — including after a re-publish the
7467
+ * registry deliberately did not propagate (see `magic-bar-projection.ts`).
7468
+ */
7469
+ interface MagicBarActionView extends MagicBarActionSpec {
7470
+ readonly menu: MagicBarRadioMenuView | null;
7471
+ run(): void;
7472
+ }
7473
+ /** Render surface of a group — the dedupe key for {@link MagicBarGroup}. */
7474
+ interface MagicBarGroupSpec {
7475
+ readonly id: string;
7476
+ /** i18n key for the `role="group"` aria-label ("Signal actions"). */
7477
+ readonly labelKey: string;
7478
+ /** Framed variant: 2 px gaps + a trailing separator. Plain (default) uses 8 px gaps. */
7479
+ readonly framed?: boolean;
7480
+ }
7481
+ interface MagicBarGroup extends MagicBarGroupSpec {
7482
+ readonly items: readonly MagicBarAction[];
7483
+ }
7484
+ interface MagicBarGroupView extends MagicBarGroupSpec {
7485
+ readonly items: readonly MagicBarActionView[];
7486
+ }
7487
+ /**
7488
+ * Render surface of the expanding search field — the dedupe key for
7489
+ * {@link MagicBarSearch}.
7490
+ *
7491
+ * This is a per-page typeahead, NOT a command palette: neither design package
7492
+ * has a global ⌘K surface, and the only "command" affordance is the Ask-AI menu.
7493
+ */
7494
+ interface MagicBarSearchSpec {
7495
+ /** Context-aware placeholder key ("Search tasks…", "Search events…"). */
7496
+ readonly placeholderKey: string;
7497
+ /** Params for {@link placeholderKey}, e.g. `{ count: 1204 }` for "Search {{count}} tasks…". */
7498
+ readonly placeholderParams?: MagicBarTextParams;
7499
+ /**
7500
+ * The text the search field should SHOW — literal text, not an i18n key, because
7501
+ * it is the user's own query rather than a caption.
7502
+ *
7503
+ * Exists because a view can arrive **already filtered**: a deep link carrying
7504
+ * `?q=…`, a restored session, a filter applied from a detail pane. Without it the
7505
+ * box renders empty over a visibly filtered list, and the user is looking at a
7506
+ * contradiction the chrome cannot explain.
7507
+ *
7508
+ * ## Why it is not called `query`
7509
+ * {@link MagicBarSearchView} — which extends this interface — already declares
7510
+ * `query(text: string): void`, the late-bound invoker. A `query?: string` here
7511
+ * would make that view an illegal extension (TS2430: `(text: string) => void` is
7512
+ * not assignable to `string | undefined`), and the only other way out — renaming
7513
+ * the invoker — removes a member of a shipped exported interface, which is a
7514
+ * ds-compat MAJOR (rule 7) and forks the federation singleton for every remote.
7515
+ * So the field takes the name that pairs with the invoker instead of colliding
7516
+ * with it: `queryText` is the text, `query()` submits it.
7517
+ *
7518
+ * ## Precedence — this is a SEED, not a controlled value
7519
+ * The field's live text is owned by the **shell**, because the user types into
7520
+ * it. This field is the publisher's chance to move it, and the shell adopts the
7521
+ * published value exactly three times:
7522
+ *
7523
+ * 1. the first time it binds this view,
7524
+ * 2. when {@link MagicBarContribution.viewKey} changes (reset-on-navigate — the
7525
+ * previous view's query must not survive into the next one), and
7526
+ * 3. when the published value **itself changes** from the one previously
7527
+ * published.
7528
+ *
7529
+ * A re-publish carrying an UNCHANGED `queryText` never touches what the user has
7530
+ * typed. That third clause is the whole rule: the dominant re-publish is
7531
+ * `disabled: !hasSelection` flipping on a selection change, and a shell that
7532
+ * re-read `queryText` on every emitted view would revert a keystroke every time
7533
+ * the user selected a row mid-search — the classic controlled-input bug. The rule
7534
+ * is authored once, as {@link magicBarSearchText}, so no renderer re-derives it.
7535
+ *
7536
+ * `undefined` and `''` are **different** and the difference is load-bearing:
7537
+ * absent means "this view does not manage the field" (nothing is ever forced),
7538
+ * `''` means "clear it". Both the fingerprint and the seed comparison distinguish
7539
+ * them.
7540
+ *
7541
+ * ## Do not echo the user's keystrokes back through this field
7542
+ * A publisher that mirrors its `onQuery` argument straight back into `queryText`
7543
+ * is harmless (the seed changes to text the field already shows). A publisher
7544
+ * that mirrors it back **debounced** is not: typing "abc" then publishing
7545
+ * `queryText: 'a'` 300 ms later is, by rule 3, a genuine publisher-initiated
7546
+ * change, and the field snaps back to "a". Publish here only for state the view
7547
+ * owns independently of the field.
7548
+ */
7549
+ readonly queryText?: string;
7550
+ /**
7551
+ * Expanded width in px — a **desktop layout hint**, carried verbatim.
7552
+ *
7553
+ * The design's range is 140–420 (default 230), but this store deliberately does
7554
+ * NOT validate or clamp it: enforcing a paint range here would reject a whole
7555
+ * contribution over a cosmetic hint (leaving the previous view's actions in the
7556
+ * chrome), and mobile ignores the field entirely, so there is no single range to
7557
+ * enforce. `fly-magic-actions` clamps to the design range at paint time and is
7558
+ * the only place that decides what an out-of-range or non-finite value means.
7559
+ */
7560
+ readonly openWidth?: number;
7561
+ /** Accent dot on the Filters button — a non-default filter is applied. */
7562
+ readonly filtersActive?: boolean;
7563
+ }
7564
+ interface MagicBarSearch extends MagicBarSearchSpec {
7565
+ readonly onQuery?: (query: string) => void;
7566
+ /**
7567
+ * Opens the view's own Advanced-search overlay. Presence of this handler is
7568
+ * what makes the Filters button exist — the DS deliberately does not model the
7569
+ * dialog itself. Its fields are app schema (Circles' PESTLE/horizon grid), and
7570
+ * a descriptor for them would be business logic the design system cannot
7571
+ * validate or render honestly.
7572
+ */
7573
+ readonly onOpenFilters?: () => void;
7574
+ }
7575
+ interface MagicBarSearchView extends MagicBarSearchSpec {
7576
+ /** True iff the publisher can open an advanced-search overlay. */
7577
+ readonly hasFilters: boolean;
7578
+ /**
7579
+ * Submit the field's current text to the publisher's newest `onQuery`. The
7580
+ * inbound half — what the field should SHOW — is
7581
+ * {@link MagicBarSearchSpec.queryText}, and that asymmetry in naming is forced:
7582
+ * this member shipped first, and renaming it would be a ds-compat MAJOR.
7583
+ */
7584
+ query(text: string): void;
7585
+ openFilters(): void;
7586
+ }
7587
+ /**
7588
+ * One view's complete claim on the magic bar.
7589
+ *
7590
+ * Identity (`appId` / `windowId`) is deliberately absent: it belongs to the
7591
+ * {@link MagicBarPublisher} that was minted for this owner, so a later publish
7592
+ * cannot re-target another app's slot.
7593
+ */
7594
+ interface MagicBarContribution {
7595
+ /**
7596
+ * What the publisher is showing, e.g. `'tasks:detail'`. A change here is
7597
+ * reset-on-navigate: the registry replaces the slot wholesale rather than
7598
+ * reconciling, so nothing from the previous view can survive.
7599
+ */
7600
+ readonly viewKey: string;
7601
+ readonly search?: MagicBarSearch | null;
7602
+ /** Ordered clusters, separator-joined. */
7603
+ readonly groups?: readonly MagicBarGroup[];
7604
+ /** The accent-filled CTA ("New task", "Add signal"). */
7605
+ readonly primary?: MagicBarAction | null;
7606
+ /**
7607
+ * Ids of {@link AgentCommand}s this view considers most relevant, most-relevant
7608
+ * first — the Ask-AI menu's per-view sets.
7609
+ *
7610
+ * Ids, not command objects: the platform already models commands (manifest
7611
+ * `commands[]` → `AgentCommandRegistry`), and D5 §6 item 9 is explicit that
7612
+ * production must source these from manifests instead of the mock's hardcoded
7613
+ * `{ title, note, prompt }` triples. Duplicating that model here would fork the
7614
+ * palette and reintroduce hardcoded prompt text. Unknown ids are dropped by the
7615
+ * resolver; an empty list leaves the shell's affinity ranking in charge.
7616
+ */
7617
+ readonly quickCommandIds?: readonly string[];
7618
+ /** The "…" overflow set. Reserved design intent (D5 §6 item 8) — Print / Export / Settings. */
7619
+ readonly overflow?: readonly MagicBarAction[];
7620
+ }
7621
+ /** The shell-facing projection of a contribution. See `magic-bar-projection.ts`. */
7622
+ interface MagicBarView {
7623
+ readonly appId: string;
7624
+ readonly windowId?: string;
7625
+ /** {@link magicBarOwnerKey} of the publisher. */
7626
+ readonly ownerKey: string;
7627
+ readonly viewKey: string;
7628
+ readonly search: MagicBarSearchView | null;
7629
+ readonly groups: readonly MagicBarGroupView[];
7630
+ readonly primary: MagicBarActionView | null;
7631
+ readonly quickCommandIds: readonly string[];
7632
+ readonly overflow: readonly MagicBarActionView[];
7633
+ }
7634
+ /**
7635
+ * A view's handle on its magic-bar slot. Minted once per publisher (not per
7636
+ * publish) because the publish rate is the whole point of this surface: the
7637
+ * sibling registries hand back a handle per `register()` and expect a handful of
7638
+ * calls per app lifetime, whereas a magic-bar publisher re-emits on every
7639
+ * selection change. Handing out a fresh handle each time would leave the caller
7640
+ * holding a dead one and force it to reassign on every keystroke.
7641
+ */
7642
+ interface MagicBarPublisher {
7643
+ readonly owner: MagicBarOwnerRef;
7644
+ /**
7645
+ * Replace this owner's contribution. No-op after {@link dispose}, and no-op
7646
+ * after the shell has {@link MagicBarRegistry.clear}ed this owner key.
7647
+ *
7648
+ * **Publish is last-writer-wins and eviction is not** — a deliberate asymmetry.
7649
+ * A stale publisher (one that has been replaced on this key by a newer one)
7650
+ * cannot `dispose()` the newer one out of the slot, but it *can* still take the
7651
+ * slot back by publishing. Symmetry would need a "newest publisher wins" rule
7652
+ * enforced on write, which would make the first publish of a replacement
7653
+ * publisher silently drop whenever two live views briefly share a key. The
7654
+ * exposure is bounded: two live publishers on one owner key only happen while a
7655
+ * view is being replaced in place, and the loser re-publishes on its next
7656
+ * selection change. The unbounded case — a publisher that outlives its window —
7657
+ * is closed by `clear()`'s tombstone, not by write ordering.
7658
+ */
7659
+ publish(contribution: MagicBarContribution): void;
7660
+ /**
7661
+ * Release the slot. Idempotent, and a no-op if another publisher has since
7662
+ * taken this owner key — the same stale-handle rule the sibling registries use.
7663
+ */
7664
+ dispose(): void;
7665
+ }
7666
+
7667
+ /**
7668
+ * Cross-bundle store key + sync event.
7669
+ *
7670
+ * Exported for the same reason {@link FLY_REMOTE_CONTEXT_STORE_KEY} is — test
7671
+ * isolation and devtools — but NOT as a hand-writable integration path the way
7672
+ * that one is. Slots hold live functions, so a caller writing the slot directly
7673
+ * would have to reproduce the projection, the fingerprint and the session
7674
+ * bookkeeping. The DS API is the only supported writer.
7675
+ */
7676
+ declare const FLY_MAGIC_BAR_STORE_KEY = "__flyMagicBar__";
7677
+ declare const FLY_MAGIC_BAR_EVENT = "fly:magic-bar";
7678
+ /**
7679
+ * The magic bar's contribution store: apps publish what the top-bar pill should
7680
+ * offer for the view they are showing, the shell renders whichever contribution
7681
+ * belongs to the window the user is in.
7682
+ *
7683
+ * Why the state lives on `globalThis`
7684
+ * -----------------------------------
7685
+ * Same reasoning as {@link FlyRemoteContextService}, and the same direction of
7686
+ * travel (remote → shell chrome). This service is `providedIn: 'root'`, but a
7687
+ * root instance is not *reliably* shared across the federation boundary: the
7688
+ * shell builds the design system from workspace source while remotes consume the
7689
+ * published package, and Native Federation collapses those into one runtime
7690
+ * instance only when version negotiation succeeds. That negotiation has silently
7691
+ * split before. A split here would be invisible at build time and would present
7692
+ * as an empty toolbar for federated apps only — exactly the class of bug
7693
+ * `fly-federation-singleton-guard` exists to shout about. Keeping the state on
7694
+ * the one substrate every bundle shares makes THIS store fork-proof — which
7695
+ * contribution is published, which one is active, and the handlers behind it all
7696
+ * survive a split — and behaves identically to a plain signal store when there
7697
+ * isn't one. Each instance mirrors the store into signals and re-reads on the sync
7698
+ * event, so reactivity works whichever copy published.
7699
+ *
7700
+ * **What this does NOT harden: the Ask-AI menu.** A contribution's
7701
+ * `quickCommandIds` resolve against `AgentCommandRegistry`, a plain
7702
+ * `providedIn: 'root'` singleton with no `globalThis` backing. Under a fork the
7703
+ * toolbar therefore paints correctly while the quick-command menu comes back
7704
+ * empty — for federated apps only. S2.3 owns that decision (resolve fork-safely,
7705
+ * or accept the degradation deliberately); see the S1.5 note.
7706
+ *
7707
+ * Idempotent re-publication
7708
+ * -------------------------
7709
+ * A view re-publishes its whole contribution on every selection change. Only a
7710
+ * change to the *painted* fields propagates; the handlers behind an unchanged
7711
+ * projection are still swapped for the newest ones. `magic-bar-projection.ts`
7712
+ * carries that argument in full — it is the single most load-bearing property of
7713
+ * this store, and the reason `active()` can be held across dozens of publishes
7714
+ * without re-rendering and without ever firing a stale closure.
7715
+ *
7716
+ * What this service does NOT own
7717
+ * ------------------------------
7718
+ * **Window arbitration.** The registry stores every owner's contribution and
7719
+ * renders whichever one {@link setActiveOwner} names; deciding *which* window is
7720
+ * active is the shell's job (focus, minimize, close — none of which the DS can
7721
+ * see). Until the shell names one, {@link active} is `null`: an empty bar is a
7722
+ * loud, trivially-diagnosed failure, whereas a last-publisher-wins default would
7723
+ * paint a BACKGROUND window's Delete button into the chrome of the focused one.
7724
+ * S2.2 wires this from the shell's focused-window signal, alongside the existing
7725
+ * `WINDOW_ROUTE` per-window plumbing.
7726
+ */
7727
+ declare class MagicBarRegistry {
7728
+ private readonly _views;
7729
+ private readonly _activeOwner;
7730
+ private _syncedStore;
7731
+ private _syncedRevision;
7732
+ /**
7733
+ * Owner key → the last publish fault already reported for it. Instance-local, not
7734
+ * store-level: the thing being rate-limited is a throw into ONE app's
7735
+ * `ErrorHandler`, so each realm is entitled to its own single shout.
7736
+ */
7737
+ private readonly _lastFault;
7738
+ /** Every published contribution, keyed by {@link magicBarOwnerKey}. */
7739
+ readonly all: Signal<ReadonlyMap<string, MagicBarView>>;
7740
+ /** Owner the shell has nominated, or `null` when it has nominated none. */
7741
+ readonly activeOwner: Signal<MagicBarOwnerRef | null>;
7742
+ /**
7743
+ * The contribution the shell should render.
7744
+ *
7745
+ * Falls back from the window-keyed slot to an `appId`-keyed one so a remote
7746
+ * that publishes without a `windowId` still reaches the bar, then asserts the
7747
+ * resolved view belongs to the nominated app — see {@link resolveView}, which
7748
+ * {@link viewFor} shares so the two can never answer differently. Identity is
7749
+ * stable while the active view's painted content is unchanged, including across
7750
+ * publishes by OTHER windows.
7751
+ */
7752
+ readonly active: Signal<MagicBarView | null>;
7753
+ constructor();
7754
+ /**
7755
+ * Mint a publisher for one owner. Call once per view host (component
7756
+ * constructor), keep the result, `publish()` as often as the view changes, and
7757
+ * `dispose()` on teardown — a `DestroyRef.onDestroy` is the intended shape.
7758
+ *
7759
+ * The slot is claimed on the FIRST publish, not here, so a publisher that is
7760
+ * created and destroyed without ever publishing cannot evict whoever currently
7761
+ * owns the key.
7762
+ */
7763
+ publisher(owner: MagicBarOwnerRef): MagicBarPublisher;
7764
+ /**
7765
+ * Force-clear an owner's slot regardless of who published it. The shell's
7766
+ * janitor path: a window closing, or a remote that tore down without disposing,
7767
+ * must not leave its actions painted in the chrome.
7768
+ *
7769
+ * Two properties the janitor depends on, both learned the hard way:
7770
+ *
7771
+ * 1. **It clears the `appId` fallback slot too** when a `windowId` is given. The
7772
+ * janitor only ever knows the closing window (`{ appId, windowId }`), while a
7773
+ * remote that published WITHOUT a window id — precisely the case
7774
+ * {@link active}'s fallback exists to serve — sits in `a:<appId>`. Clearing
7775
+ * only the window slot would strand that one on `globalThis`, holding
7776
+ * `onSelect` closures that retain a destroyed component tree, and the shell
7777
+ * would paint the dead window's toolbar the next time the app opened.
7778
+ * The cost is deliberate, and PERMANENT for publishers minted before this
7779
+ * call: with two windows of one app open and only the windowId-less fallback
7780
+ * published, closing either revokes the fallback key at the current session
7781
+ * watermark — which the survivor's session is necessarily under — so the
7782
+ * survivor's future publishes are dropped too, for the rest of its life, not
7783
+ * merely until its next publish. That is not fixable with a smarter
7784
+ * watermark: two publishers sharing the fallback key are indistinguishable
7785
+ * at clear time (the janitor knows which WINDOW closed, not which SESSION
7786
+ * was publishing on the shared key), so any cutoff that reliably kills the
7787
+ * closing window's zombie can also kill the survivor. An empty bar is the
7788
+ * safe state (see {@link active}); recovery needs a publisher minted AFTER
7789
+ * the clear — a reopened window, or `publisherFor` called fresh. The real
7790
+ * lesson: a multi-window app should pass `windowId` and get its own slots.
7791
+ * 2. **It is a tombstone, not a delete.** `WindowManagerService.closeWindow`
7792
+ * marks the window `isClosing` and removes it 250 ms later, so the component
7793
+ * — and the `effect()` that publishes for it — outlives the janitor. A plain
7794
+ * delete leaves the publisher's own `disposed` flag false, so its next run
7795
+ * re-claims the key and a zombie contribution survives until `DestroyRef`
7796
+ * fires. Every publisher minted before this call is revoked permanently; one
7797
+ * minted after (a reopened window) owns the key normally.
7798
+ */
7799
+ clear(owner: MagicBarOwnerRef): void;
7800
+ /**
7801
+ * Nominate the owner whose contribution {@link active} resolves to. `null`
7802
+ * hands the bar back to the shell's own default (search only).
7803
+ */
7804
+ setActiveOwner(owner: MagicBarOwnerRef | null): void;
7805
+ /**
7806
+ * Direct, non-reactive read of one owner's contribution — the split-proof
7807
+ * escape hatch for callers outside an injection/reactive context. Applies the
7808
+ * SAME resolution as {@link active}, fallback included.
7809
+ */
7810
+ viewFor(owner: MagicBarOwnerRef): MagicBarView | null;
7811
+ private write;
7812
+ /**
7813
+ * Surface a publish fault LOUDLY on its first occurrence for an owner, then stay
7814
+ * quiet until the fault changes or a good publish lands.
7815
+ *
7816
+ * The sibling precedent (`AgentCommandRegistry.registerAll`) throws on a
7817
+ * once-per-boot path, so throwing outright is proportionate there. Here the
7818
+ * intended wiring is `effect(() => this.bar.publish(this.contribution()))`, so a
7819
+ * single duplicate action id would otherwise throw on EVERY selection change
7820
+ * forever — an unbounded stream of `ErrorHandler` toasts that buries the one
7821
+ * report the developer needed. Rethrowing the first occurrence keeps the loudest
7822
+ * possible signal (a real stack, through the app's own `ErrorHandler`); the
7823
+ * repeats are dropped, not the bug. A different fault message, or a recurrence
7824
+ * after a good publish, is loud again.
7825
+ */
7826
+ private reportFaultOnce;
7827
+ private drop;
7828
+ /**
7829
+ * Late binding of invokers to the newest publish. Closes over the owner key
7830
+ * only — never over a slot — so it survives every replacement, including one
7831
+ * written by another federated copy of this service.
7832
+ */
7833
+ private handlerSource;
7834
+ /**
7835
+ * Re-read the shared store. Cheap no-op unless a real mutation landed.
7836
+ *
7837
+ * The memo keys on store IDENTITY as well as revision: the revision counter
7838
+ * alone cannot distinguish "nothing changed" from "the `globalThis` slot now
7839
+ * holds a brand-new store that happens to be at the same revision". That is not
7840
+ * hypothetical — every spec's `beforeEach` replaces the store, and instances
7841
+ * from earlier tests are still subscribed (a `providedIn: 'root'` service has no
7842
+ * teardown hook for its `globalThis` listener, matching `FlyRemoteContextService`).
7843
+ */
7844
+ private sync;
7845
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MagicBarRegistry, never>;
7846
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<MagicBarRegistry>;
7847
+ }
7848
+
7849
+ /**
7850
+ * The precedence rule for {@link MagicBarSearchSpec.queryText}, authored once.
7851
+ *
7852
+ * ## The problem
7853
+ * The magic bar's search field has two writers. The **user** types into it, and the
7854
+ * **publisher** can move it — a deep link arriving with `?q=…`, a restored session,
7855
+ * a filter applied from a detail pane. Neither can be made subordinate to the other
7856
+ * by fiat:
7857
+ *
7858
+ * - Make the publisher's value authoritative on every emitted view and you get the
7859
+ * classic controlled-input bug. The dominant re-publish in this contract is
7860
+ * `disabled: !hasSelection` flipping on a selection change, which changes the
7861
+ * fingerprint and therefore emits a new view carrying the SAME `queryText`. A
7862
+ * renderer that re-read it would revert the user's keystroke every time they
7863
+ * clicked a row mid-search.
7864
+ * - Make the field authoritative once the user has touched it and a legitimate
7865
+ * publisher-initiated change — the deep link this field exists for — silently
7866
+ * fails to land.
7867
+ *
7868
+ * ## The rule
7869
+ * `queryText` is a **seed, not a controlled value**. The field adopts it exactly
7870
+ * three times: on first bind, on a `viewKey` change (reset-on-navigate), and when
7871
+ * the published value itself changes from the previously published one. Everything
7872
+ * else leaves the field alone.
7873
+ *
7874
+ * That is what {@link magicBarSearchText} computes. It is a pure function of
7875
+ * (previous publisher state, next publisher state) — deliberately NOT a function of
7876
+ * the field's current text, because whether to adopt must not depend on what the
7877
+ * user happens to have typed. A publisher re-publishing `queryText: 'open'` must
7878
+ * re-assert it identically whether the field currently reads `'open'`, `'opened'`
7879
+ * or `''`.
7880
+ *
7881
+ * ## Why this lives in the design system rather than in the shell
7882
+ * Same reasoning as `clampMagicBarSearchWidth`: the DS does not ship the magic-bar
7883
+ * search-field renderer (the shell composes `fly-search-input` itself, and D5 §4
7884
+ * dynamic 6 has a mobile bar rendering the same contribution), but the rule is part
7885
+ * of the CONTRACT, not of any one renderer. Documented-but-unimplemented precedence
7886
+ * would be re-derived per renderer, and the two would disagree on exactly the case
7887
+ * that is hard to notice.
7888
+ */
7889
+ /**
7890
+ * The publisher-side inputs the field's text is seeded from — the two fields
7891
+ * {@link magicBarSearchText} compares, lifted out of {@link MagicBarView} so a
7892
+ * renderer can retain them without retaining a whole view (and with it every
7893
+ * `run()` closure behind it).
7894
+ */
7895
+ interface MagicBarSearchSeed {
7896
+ /** {@link MagicBarContribution.viewKey} of the contribution being rendered. */
7897
+ readonly viewKey: string;
7898
+ /**
7899
+ * {@link MagicBarSearchSpec.queryText}. `undefined` (the view does not manage the
7900
+ * field) and `''` (clear it) are different values and must be passed through as
7901
+ * such — do not normalise one into the other before calling.
7902
+ */
7903
+ readonly queryText?: string;
7904
+ }
7905
+ /**
7906
+ * The text the field must be forced to, or `null` to leave whatever the user has
7907
+ * typed in place.
7908
+ *
7909
+ * `previous` is the seed from the last publish the renderer saw — `null` on first
7910
+ * bind. Store `next` as the new `previous` on every call, whether or not this
7911
+ * returned a string: the comparison is against the last value the PUBLISHER sent,
7912
+ * not against the last value the field adopted, and conflating the two makes an
7913
+ * A → B → A publish sequence stop re-asserting A.
7914
+ *
7915
+ * A view with no search at all never reaches here — the renderer has nothing to
7916
+ * seed. A view whose search omits `queryText` still seeds `''` on navigate, which
7917
+ * is the reset-on-navigate behaviour the contract already required.
7918
+ *
7919
+ * Within an unchanged view, the three transitions behave differently on purpose
7920
+ * (S2 review finding 1 — the model doc is the contract, and it says absent means
7921
+ * "this view does not manage the field; nothing is ever forced"):
7922
+ *
7923
+ * `'a' → 'b'` force `'b'` — the publisher changed a value it manages
7924
+ * `undefined → ''` force `''` — the publisher STARTED managing, asking for a clear
7925
+ * `'a' → undefined` leave alone — the publisher STOPPED managing; forcing `''`
7926
+ * here is the controlled-input revert bug: a view
7927
+ * that seeds from `?q=` and naturally omits the
7928
+ * field when no query param exists would wipe the
7929
+ * user's typed text on its next disabled-flip
7930
+ * re-publish
7931
+ */
7932
+ declare function magicBarSearchText(previous: MagicBarSearchSeed | null, next: MagicBarSearchSeed): string | null;
7933
+
7934
+ /**
7935
+ * Allowlist parser for {@link MagicBarActionSpec.iconPath} — the geometry-only
7936
+ * gate between a publisher-supplied glyph fragment and the DOM.
7937
+ *
7938
+ * ## Why this exists rather than a sanitizer call
7939
+ *
7940
+ * `iconPath` is inner-SVG markup (see `magic-actions-icons.ts`), and it used to
7941
+ * reach the DOM through `[innerHTML]` + `DomSanitizer.bypassSecurityTrustHtml()`.
7942
+ * Two facts make that untenable:
7943
+ *
7944
+ * 1. An `<svg>` fragment is not a closed world. `<foreignObject>` is an HTML
7945
+ * integration point, so `<foreignObject><img src=x onerror=…>` executes;
7946
+ * `<a xlink:href="javascript:…">` wrapping the glyph is live under a click
7947
+ * the user is being invited to make; `on*` handlers and `<style>` need no
7948
+ * integration point at all.
7949
+ * 2. `DomSanitizer.sanitize(SecurityContext.HTML, …)` is not the answer either:
7950
+ * Angular's HTML element allowlist contains no SVG shape elements, so it
7951
+ * strips `<path>`/`<circle>`/`<rect>` along with the attack — every glyph in
7952
+ * the curated table would render empty. Sanitizing HTML is the wrong tool for
7953
+ * an SVG payload.
7954
+ *
7955
+ * Making `iconPath` the bare `d` attribute its name suggests was considered and
7956
+ * rejected: 11 of the 22 curated entries are multi-element (`<circle>+<path>`,
7957
+ * `<rect>+<path>…`), several ported byte-verbatim from the UX drop, so a single
7958
+ * `d` cannot express them without re-authoring geometry — and narrowing a public
7959
+ * `string` field's meaning is exactly the ds-compat MAJOR that 1.8.0 freezes.
7960
+ *
7961
+ * So the field keeps its type and its markup transport, and the RENDERER stops
7962
+ * trusting it: this module parses the fragment against a closed element/
7963
+ * attribute/value allowlist and hands the component structured nodes, which the
7964
+ * template binds as real Angular attributes. No `innerHTML`, no sanitizer
7965
+ * bypass, no HTML parser anywhere in the path — an attribute binding cannot
7966
+ * introduce an element or a handler, so injection is structurally impossible
7967
+ * rather than filtered.
7968
+ *
7969
+ * ## Reject, never strip
7970
+ *
7971
+ * Any violation drops the ENTIRE fragment. This mirrors `Fly.Sdk.Svg`'s
7972
+ * server-side reject-on-violation policy, and it is the safer failure mode for a
7973
+ * toolbar: a half-rendered glyph looks like it worked, so nobody investigates. A
7974
+ * rejected glyph renders as an empty 16px box on a button whose accessible name
7975
+ * and behaviour are untouched, and logs once.
7976
+ */
7977
+ /** Elements a glyph may contain — pure geometry, no containers, no references. */
7978
+ declare const FLY_MAGIC_BAR_ICON_ELEMENTS: readonly ["path", "circle", "rect", "ellipse", "line", "polyline", "polygon"];
7979
+ type FlyMagicBarIconElement = (typeof FLY_MAGIC_BAR_ICON_ELEMENTS)[number];
7980
+ /** One allowlisted element and its allowlisted attributes, ready to bind. */
7981
+ interface FlyMagicBarIconNode {
7982
+ readonly tag: FlyMagicBarIconElement;
7983
+ readonly attrs: Readonly<Record<string, string>>;
7984
+ }
7985
+
7986
+ /** Design range for {@link MagicBarSearchSpec.openWidth} (D2 §3.1) — see {@link clampMagicBarSearchWidth}. */
7987
+ declare const MAGIC_BAR_SEARCH_WIDTH_MIN = 140;
7988
+ declare const MAGIC_BAR_SEARCH_WIDTH_MAX = 420;
7989
+ declare const MAGIC_BAR_SEARCH_WIDTH_DEFAULT = 230;
7990
+ /**
7991
+ * Clamp a {@link MagicBarSearchSpec.openWidth} hint to the design's documented
7992
+ * range. `magic-bar.model.ts` deliberately does not validate this field itself
7993
+ * (rejecting a whole contribution over a cosmetic hint would be worse than a
7994
+ * clamp) and names `fly-magic-actions` as "the only place that decides what an
7995
+ * out-of-range or non-finite value means".
7996
+ *
7997
+ * `fly-magic-actions` does not render the search field itself — search is a
7998
+ * separate DS component (D2 §3.1's `SearchField`, not yet ported) — but until
7999
+ * that renderer ships, this is the one place the clamp rule is authored, so a
8000
+ * future consumer imports it instead of re-deriving the 140–420/230 constants.
8001
+ */
8002
+ declare function clampMagicBarSearchWidth(width: number | undefined): number;
8003
+ /**
8004
+ * `<fly-magic-actions>` — renders the magic bar's dynamic action cluster: an
8005
+ * ordered set of {@link MagicBarGroupView}s (framed tab-actions, plain
8006
+ * record-actions, separator-joined), each action icon-only/text/toggle, with the
8007
+ * Status/Sort `menuitemradio` pattern where an action carries a `menu`, plus the
8008
+ * optional accent `primary` CTA.
8009
+ *
8010
+ * ## Why `primary` lives here (reversing half the S1.4 ruling)
8011
+ * This component originally rendered `groups` only, on the reasoning that the
8012
+ * accent CTA is a visually distinct, separately-composed element. First contact
8013
+ * with a real consumer (`features/desktop/magic-bar/magic-bar-pill`) showed that
8014
+ * reasoning costs more than it saves, because {@link parseMagicBarIcon} — the
8015
+ * closed-allowlist parser that makes a publisher's `iconPath` safe to render — is
8016
+ * internal to this component. A composer outside it has no way to draw a
8017
+ * contributed glyph at all, so `primary` had to be smuggled back in as a
8018
+ * synthetic one-item group: an invented group id, an invented group `labelKey`,
8019
+ * and a spurious `role="group"` wrapped around a single button, announced to a
8020
+ * screen-reader user as a group of one. Every place a CONTRIBUTED glyph is
8021
+ * painted now lives in the component that owns the parser.
8022
+ *
8023
+ * ## What is still NOT rendered here, and why
8024
+ * - **The search field** — a separate DS component (D2 §3.1's `SearchField`); this
8025
+ * file owns only its width rule, {@link clampMagicBarSearchWidth}.
8026
+ * - **The Ask-AI orb** — shell chrome keyed on `quickCommandIds`, no glyph of the
8027
+ * publisher's.
8028
+ * - **The `overflow` kebab** — and this one is a deliberate *deferral*, not a
8029
+ * boundary. Its rows would render through `fly-context-menu`, whose
8030
+ * `ContextMenuItem` carries `icon` as a PrimeIcons CLASS NAME and has no
8031
+ * `disabled`; so an overflow action's `iconPath` cannot be painted and a
8032
+ * disabled overflow row cannot be shown as disabled, wherever the kebab is
8033
+ * composed. Moving it here would relocate that limitation rather than remove
8034
+ * it, while making this component own a "More actions" string it cannot ship
8035
+ * into the shell bundle on its own. The prerequisite is two optional fields on
8036
+ * `ContextMenuItem`; see the S2.13 note.
8037
+ *
8038
+ * ## What this component must never do (S1.5 contract, `MagicBarRegistry`)
8039
+ * - **Never cache `run()`/`select()`.** They are late-bound invokers — read fresh
8040
+ * off the `MagicBarActionView`/`MagicBarRadioMenuView` on every call, never
8041
+ * captured into a local variable that outlives the click.
8042
+ * - **Never reach for a publisher's `onSelect`.** Only the projected view's
8043
+ * `run()`/`menu.select()` exist on the types this component accepts.
8044
+ *
8045
+ * ## The stagger guard
8046
+ * `toolbarPopIn` (40 ms/action) is a static `animation:` on `.fma-btn`, replayed
8047
+ * only when the browser creates a NEW element — never on a property-only
8048
+ * re-render of a persisted one. `@for (…; track action.id)` is what makes that
8049
+ * true: `action.id` is unique across the WHOLE contribution — `primary` included
8050
+ * (the model's own invariant) — so a re-publish that only flips
8051
+ * `disabled`/`pressed`/`badgeDot` on existing ids reuses the same DOM nodes and
8052
+ * the finished animation is left alone. A re-publish whose group genuinely
8053
+ * gains/loses ids creates/destroys the corresponding elements, and only THOSE
8054
+ * replay. Do not `track $index` — that defeats this and re-pops the whole group
8055
+ * on every selection change.
8056
+ *
8057
+ * `primary` sits in its own single-child wrapper rather than directly in the row,
8058
+ * so `nova-stagger`'s `:nth-child` arithmetic gives it a fixed delay instead of
8059
+ * one that shifts with how many framed groups (and therefore separators) happen
8060
+ * to precede it.
8061
+ */
8062
+ declare class FlyMagicActionsComponent {
8063
+ protected readonly i18n: I18nService;
8064
+ /** Ordered clusters — framed tab-actions before plain record-actions (D2 §2.3). */
8065
+ readonly groups: _angular_core.InputSignal<readonly MagicBarGroupView[]>;
8066
+ /**
8067
+ * The accent-filled CTA ("New task", "Add signal"), or `null`. Optional: a view
8068
+ * that offers no primary action passes nothing, and no accent disc is painted.
8069
+ */
8070
+ readonly primary: _angular_core.InputSignal<MagicBarActionView | null>;
8071
+ /** Id of the action whose radio menu is open, or `null`. Only one open at a time. */
8072
+ protected readonly openMenuActionId: _angular_core.WritableSignal<string | null>;
8073
+ private readonly menuAnchor;
8074
+ protected readonly menuAnchorEl: _angular_core.Signal<HTMLElement | null>;
8075
+ /** The scrolling group row — the box {@link measure} interrogates. Absent while `groups` is empty. */
8076
+ private readonly rowRef;
8077
+ /**
8078
+ * The action whose radio menu is open, resolved against the CURRENT projection
8079
+ * rather than captured when the menu opened — so a re-publish that
8080
+ * changes the menu's `value`/`options` while it is open renders the new state,
8081
+ * and one that drops the action entirely closes the menu instead of leaving an
8082
+ * orphan bound to a stale view.
8083
+ *
8084
+ * Exists because the menu is rendered once, outside the group loops (S1-review
8085
+ * F9): a `<fly-context-menu>` inserted beside its button would shift every
8086
+ * later `.fma-btn`'s `:nth-child` index and with it its stagger delay.
8087
+ */
8088
+ protected readonly openAction: _angular_core.Signal<MagicBarActionView | null>;
8089
+ /**
8090
+ * When the open action leaves the projection, ACTUALLY close — do not merely
8091
+ * stop rendering (S2 review finding 4). Left set, `openMenuActionId` +
8092
+ * `menuAnchor` are a re-open trap: a later publish that re-adds the same id
8093
+ * would resurrect the menu with no user action, anchored to an element the
8094
+ * `@for (…; track action.id)` has since destroyed — undefined placement plus
8095
+ * a retained DOM node. The effect fires on the same projection change that
8096
+ * un-rendered the menu, so there is no frame in between to observe.
8097
+ */
8098
+ private readonly closeWhenActionLeaves;
8099
+ /**
8100
+ * True once the GROUP row's content no longer fits its container. Drives the
8101
+ * fade-mask + horizontal-scroll treatment (house style: "icon-only toolbars
8102
+ * with horizontal-ellipsis overflow, never a second row" — skill §9 rule 6).
8103
+ * Buttons stay reachable by scroll/Tab rather than being clipped-and-hidden.
8104
+ *
8105
+ * Only the groups scroll. `primary` sits outside `.fma` precisely so the fade
8106
+ * can never reach it: a call to action that dissolves into a gradient, or that
8107
+ * has to be scrolled to, is the opposite of an overflow affordance.
8108
+ */
8109
+ protected readonly isOverflowing: _angular_core.WritableSignal<boolean>;
8110
+ constructor();
8111
+ /**
8112
+ * Identity function that types the `#actionButton` template's context.
8113
+ *
8114
+ * `NgTemplateOutlet` gives a template no context type — `let-projected` is
8115
+ * `any` — and Angular has no declarative way to annotate one. Passing it through
8116
+ * here and binding the result with `@let` makes every read inside that block
8117
+ * (`.kind`, `.disabled`, `.menu`) type-checked again. The alternative was
8118
+ * duplicating the block per call site, which trades a checked template for an
8119
+ * unchecked copy of the security-critical glyph binding.
8120
+ */
8121
+ protected asAction(action: MagicBarActionView): MagicBarActionView;
8122
+ /** `i18n.t(labelKey, labelParams)` — the resolved, interpolated label text. */
8123
+ protected resolvedLabel(action: MagicBarActionView): string;
8124
+ /**
8125
+ * The tooltip text. Disabled ⇒ `disabledTipKey` verbatim, or the auto-suffixed
8126
+ * `"{label} — {reason}"` — the connector + default reason are the renderer's
8127
+ * job precisely because the store only holds i18n keys (never resolved text,
8128
+ * never a locale decision baked in). Enabled ⇒ `tipKey` override, else the
8129
+ * label itself.
8130
+ */
8131
+ protected tooltipFor(action: MagicBarActionView): string;
8132
+ /**
8133
+ * Accessible name for a radio-menu trigger — richer than the plain label so a
8134
+ * screen-reader user hears the current value without opening the menu
8135
+ * ("Sort by: Newest first"), matching the visual badge-dot affordance.
8136
+ */
8137
+ protected triggerAriaLabel(action: MagicBarActionView): string;
8138
+ /**
8139
+ * The glyph's allowlisted geometry nodes, which the template binds as real
8140
+ * attributes on real `<svg:*>` elements.
8141
+ *
8142
+ * `iconPath` is publisher-supplied markup and is NOT trusted: this used to be
8143
+ * `bypassSecurityTrustHtml()` into `[innerHTML]`, which made an SVG fragment's
8144
+ * escape hatches (`<foreignObject>` → HTML integration point, `<a
8145
+ * xlink:href="javascript:…">`, `on*` handlers, `<style>`) live inside the
8146
+ * shell's own chrome. See `magic-actions-icon.ts` for why sanitizing the HTML
8147
+ * was not an option (Angular's HTML allowlist has no SVG shapes, so it strips
8148
+ * every glyph) and why `iconPath` could not become a bare `d`.
8149
+ *
8150
+ * `parseMagicBarIcon` memoizes, so this is safe to call from the template on
8151
+ * every change-detection pass AND returns a stable array identity, which is
8152
+ * what stops `@for (…; track $index)` rebuilding the glyph each time.
8153
+ */
8154
+ protected iconNodes(action: MagicBarActionView): readonly FlyMagicBarIconNode[];
8155
+ /** `null` (not `'default'`) so `[attr.data-tone]` omits the attribute entirely for the common case. */
8156
+ protected toneAttr(action: MagicBarActionView): string | null;
8157
+ /**
8158
+ * A radio-menu trigger derives its badge from the menu spec itself
8159
+ * (`value !== defaultValue`) rather than trusting a separately-set
8160
+ * `badgeDot` — the menu already carries both fields precisely for this
8161
+ * comparison, and deriving it here can't drift out of sync with a publisher
8162
+ * that forgets to keep the two in step. An action with no menu falls back to
8163
+ * the authored `badgeDot` verbatim.
8164
+ */
8165
+ protected hasBadge(action: MagicBarActionView): boolean;
8166
+ /** `aria-pressed` for `kind: 'toggle'` only — omitted (not `false`) for every other kind. */
8167
+ protected pressedAttr(action: MagicBarActionView): boolean | null;
8168
+ protected menuSections(action: MagicBarActionView): ContextMenuSection[];
8169
+ protected activate(action: MagicBarActionView, event: Event): void;
8170
+ protected onMenuAction(action: MagicBarActionView, value: string): void;
8171
+ protected closeMenu(): void;
8172
+ private toggleMenu;
8173
+ /**
8174
+ * Toggle {@link isOverflowing} when `.fma`'s content stops fitting. CSS alone
8175
+ * can't express "is this scrollable" as a selector, and a fixed always-on fade
8176
+ * would mislead when the row already fits — so the check has to run in JS.
8177
+ *
8178
+ * ## What this measures, and what it used to measure
8179
+ * The scroll box is `.fma`, NOT the host. The host is a plain flex container
8180
+ * whose in-flow children are `.fma` (which clips its OWN overflow) and the
8181
+ * primary wrapper — so the host's scrollable overflow area is exactly its
8182
+ * content box and `scrollWidth - clientWidth` is structurally always 0. It was
8183
+ * measured on the host before this change, where the fade mask could never
8184
+ * engage no matter how badly the row overflowed. Nothing failed: the feature was
8185
+ * simply inert, and jsdom performs no layout so no unit test could see it.
8186
+ *
8187
+ * ## Two passes, both needed
8188
+ * `ResizeObserver` catches the box changing under fixed content (window resize,
8189
+ * the pill sharing space with a longer search field). It does NOT fire when the
8190
+ * CONTENT changes inside a box that is already clamped at its maximum — a
8191
+ * re-publish that adds an action to a row that exactly fitted. That is what the
8192
+ * `afterRenderEffect` covers, and it must be an after-RENDER pass: the `effect`
8193
+ * below re-targets the observer as `.fma` mounts, but it runs before the browser
8194
+ * has laid the new content out, so a measurement there reads the previous frame.
8195
+ * Same split, same reasoning as `board-editor-chrome-metrics.ts`.
8196
+ *
8197
+ * `ResizeObserver` is optional — absent (Node/jsdom) the after-render pass still
8198
+ * runs and reads 0s, which reports "not overflowing" rather than throwing.
8199
+ */
8200
+ private watchOverflow;
8201
+ private measure;
8202
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyMagicActionsComponent, never>;
8203
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyMagicActionsComponent, "fly-magic-actions", never, { "groups": { "alias": "groups"; "required": true; "isSignal": true; }; "primary": { "alias": "primary"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8204
+ }
8205
+
8206
+ /**
8207
+ * Curated stroke-icon table for magic-bar actions (D2 §2, D5 §1.6/§1.9).
8208
+ *
8209
+ * A value is **inner SVG markup only** — one or more `<path>`/`<circle>`/`<rect>`
8210
+ * fragments with no wrapping `<svg>` tag. `fly-magic-actions` supplies the shell
8211
+ * (`viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"
8212
+ * stroke-linecap="round" stroke-linejoin="round"`) — matches
8213
+ * `ToolbarActions.dc.html`'s own transport ("raw SVG inner markup rendered into a
8214
+ * 24×24 viewBox … svg").
8215
+ *
8216
+ * `MagicBarActionSpec.iconPath` accepts ANY string — a publisher is free to author
8217
+ * its own glyph — but without a shared table, every app hand-authors `M4 4h16…`
8218
+ * literals with inconsistent stroke widths and no dedupe. This is that table.
8219
+ * Reference by name: `iconPath: FLY_MAGIC_BAR_ICONS.trash`.
8220
+ *
8221
+ * Provenance is marked per group below. The first group is ported verbatim (byte-
8222
+ * identical geometry) from the UX drop so real shipped surfaces keep their exact
8223
+ * look; the second is original, same-convention artwork for named actions the drop
8224
+ * doesn't expose as a standalone path. Swap an "original" entry for a sourced one
8225
+ * if a verbatim path turns up later — this table is additive, not frozen.
8226
+ */
8227
+ /**
8228
+ * The full curated table. Publishers reference it by name
8229
+ * (`iconPath: FLY_MAGIC_BAR_ICONS.trash`); nothing stops passing an arbitrary
8230
+ * string instead — {@link MagicBarActionSpec.iconPath} stays `string`.
8231
+ */
8232
+ declare const FLY_MAGIC_BAR_ICONS: {
8233
+ /** Signal-detail "View trace" — no standalone path in the drop; an activity/pulse line. */
8234
+ readonly viewTrace: "<path d=\"M3 12h4l2-7 4 14 2-7h6\"/>";
8235
+ /** Signal-detail "Archive". */
8236
+ readonly archive: "<rect x=\"3\" y=\"4\" width=\"18\" height=\"4\" rx=\"1\"/><path d=\"M5 8v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8\"/><path d=\"M10 13h4\"/>";
8237
+ /** Task-list "Sort by" trigger. */
8238
+ readonly sort: "<path d=\"M7 4v16\"/><path d=\"M3 8l4-4 4 4\"/><path d=\"M17 20V4\"/><path d=\"M13 16l4 4 4-4\"/>";
8239
+ /** Task-detail "Add audience". */
8240
+ readonly addAudience: "<circle cx=\"9\" cy=\"7\" r=\"3.2\"/><path d=\"M2.5 19.4a6.5 6.5 0 0 1 13 0\"/><path d=\"M16 10.5a3 3 0 1 0 0-5.8\"/><path d=\"M18.5 19.4a5.6 5.6 0 0 0-3-5\"/>";
8241
+ /** Task-detail "Add tag". */
8242
+ readonly addTag: "<path d=\"M20 13.5 12.5 21a2 2 0 0 1-2.8 0L4 15.3a2 2 0 0 1 0-2.8L11.5 5H18a2 2 0 0 1 2 2v6.5Z\"/><circle cx=\"15\" cy=\"9\" r=\"1.4\"/>";
8243
+ /** Task-detail "Assign robot". */
8244
+ readonly assignRobot: "<rect x=\"4\" y=\"8\" width=\"16\" height=\"11\" rx=\"3\"/><path d=\"M12 8V4\"/><circle cx=\"12\" cy=\"3\" r=\"1.2\"/><path d=\"M8 13v2M16 13v2\"/>";
8245
+ /** Task-detail "Add subtask". */
8246
+ readonly addSubtask: "<path d=\"M9 6h11M9 12h11M9 18h7\"/><path d=\"M4 6h.01M4 12h.01\"/><path d=\"M4.5 16h3M6 14.5v3\"/>";
8247
+ /**
8248
+ * Calendar magic-bar "View" trigger (S4.2) — a 4-cell grid standing in for the
8249
+ * year/month/week/day/agenda mode switcher behind it. No standalone glyph for
8250
+ * this exists in the UX drop's curated set (`today`/`settings` cover Today and
8251
+ * the settings gear, not the mode switcher).
8252
+ */
8253
+ readonly calendarView: "<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"2.5\"/><path d=\"M3.5 12h17M12 3.5v17\"/>";
8254
+ /** `UX/FlyOS Desktop-app/MainContent.dc.html:927` (`pubTabActions`'s local `P` table). */
8255
+ readonly addEvidence: "<path d=\"M10.5 13.5a4 4 0 0 0 5.7 0l2-2a4 4 0 0 0-5.7-5.7l-.6.6\"/><path d=\"M13.5 10.5a4 4 0 0 0-5.7 0l-2 2a4 4 0 0 0 4.2 6.5\"/><path d=\"M17.5 15.5v5M15 18h5\"/>";
8256
+ /** `MainContent.dc.html:928`. Reused for every "Edit …" action (evidence, link, task). */
8257
+ readonly edit: "<path d=\"M4 20h4.2L19 9.2a2 2 0 0 0 0-2.8l-1.4-1.4a2 2 0 0 0-2.8 0L4 15.8V20z\"/><path d=\"M13.5 6.5l4 4\"/>";
8258
+ /** `MainContent.dc.html:929`. Circle-minus — "Remove evidence", distinct from the full-trash `delete`. */
8259
+ readonly remove: "<circle cx=\"12\" cy=\"12\" r=\"8.6\"/><path d=\"M8.2 12h7.6\"/>";
8260
+ /** `MainContent.dc.html:930`. */
8261
+ readonly unlink: "<path d=\"M9.6 14.4l-1.4 1.4a3.8 3.8 0 0 1-5.4-5.4l1.9-1.9\"/><path d=\"M14.4 9.6l1.4-1.4a3.8 3.8 0 0 1 5.4 5.4l-1.9 1.9\"/><path d=\"M4.8 4.8l14.4 14.4\"/>";
8262
+ /** `MainContent.dc.html:931`. */
8263
+ readonly link: "<path d=\"M10.5 13.5a4 4 0 0 0 5.7 0l2.6-2.6a4 4 0 0 0-5.7-5.7l-1 1\"/><path d=\"M13.5 10.5a4 4 0 0 0-5.7 0l-2.6 2.6a4 4 0 0 0 5.7 5.7l1-1\"/>";
8264
+ /** `Home.dc.html:619` — the `+` glyph ("Add signal" / "Add trend" / New-task CTA). */
8265
+ readonly add: "<path d=\"M12 5v14M5 12h14\"/>";
8266
+ /** `Home.dc.html:445`. */
8267
+ readonly filter: "<path d=\"M4 6h16M7 12h10M10 18h4\"/>";
8268
+ /** `Home.dc.html:613`. */
8269
+ readonly export: "<path d=\"M12 16V7M8 11l4-4 4 4\"/><path d=\"M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3\"/>";
8270
+ /** `Home.dc.html:616`. */
8271
+ readonly import: "<path d=\"M12 4v9M8 9l4 4 4-4\"/><path d=\"M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3\"/>";
8272
+ /** `Home.dc.html:547` — "Mark as complete". */
8273
+ readonly check: "<circle cx=\"12\" cy=\"12\" r=\"8.6\"/><path d=\"M8.4 12.3l2.6 2.6 4.6-5\"/>";
8274
+ /** `Home.dc.html:550` — "Watch task". */
8275
+ readonly watch: "<path d=\"M2.5 12S6 5.8 12 5.8 21.5 12 21.5 12 18 18.2 12 18.2 2.5 12 2.5 12z\"/><circle cx=\"12\" cy=\"12\" r=\"2.8\"/>";
8276
+ /** `Home.dc.html:553` — the full trash-can; the danger "Delete" family. */
8277
+ readonly trash: "<path d=\"M4.5 7h15\"/><path d=\"M9.5 7V5.2h5V7\"/><path d=\"M6.5 7l.8 12a1.8 1.8 0 0 0 1.8 1.7h5.8a1.8 1.8 0 0 0 1.8-1.7L17.5 7\"/><path d=\"M10.5 11v6M13.5 11v6\"/>";
8278
+ /** `Home.dc.html:969`. */
8279
+ readonly close: "<path d=\"M6 6l12 12M18 6L6 18\"/>";
8280
+ /** `Home.dc.html:1090` — calendar's settings-gear `pageActions` entry. */
8281
+ readonly settings: "<circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.4 13a7.4 7.4 0 0 0 0-2l2-1.5-2-3.5-2.4.7a7.4 7.4 0 0 0-1.7-1L15 3h-4l-.3 2.7a7.4 7.4 0 0 0-1.7 1l-2.4-.7-2 3.5L6.6 11a7.4 7.4 0 0 0 0 2l-2 1.5 2 3.5 2.4-.7a7.4 7.4 0 0 0 1.7 1L11 21h4l.3-2.7a7.4 7.4 0 0 0 1.7-1l2.4.7 2-3.5-2-1.5z\"/>";
8282
+ /** `Home.dc.html:1151` — calendar-with-check, the "Today" text action's glyph. */
8283
+ readonly today: "<path d=\"M3.5 8.5h17M7 3.2v3.4M17 3.2v3.4\"/><rect x=\"3.5\" y=\"5.5\" width=\"17\" height=\"15\" rx=\"2.6\"/><path d=\"M8 13l2.2 2.2L14 11\"/>";
8284
+ };
8285
+ type FlyMagicBarIconName = keyof typeof FLY_MAGIC_BAR_ICONS;
8286
+
7139
8287
  /**
7140
8288
  * Single canonical way to declare a drag source for the agent input.
7141
8289
  *
@@ -7345,13 +8493,36 @@ type FlyTooltipPlacement = 'top' | 'bottom' | 'left' | 'right';
7345
8493
  * is `pointer-events: none` so it never eats a click or intercepts the hover.
7346
8494
  *
7347
8495
  * ## Theming + RTL
7348
- * The surface is styled from desktop-shell tokens that carry BOTH light and dark
7349
- * values (`--glass-bg-elevated`, `--surface-border`/`--separator`, `--text-color`/
7350
- * `--label-primary`), with a self-consistent dark-surface + light-text fallback for
7351
- * bare standalone usage where the DS theme layer isn't present. Placement is mirrored
8496
+ * The surface is Nova's `--mat-tip-a`/`-b` material (skill §4) a two-stop gradient
8497
+ * that carries BOTH light and dark values (`_nova-tokens.scss`, `html.light-theme` /
8498
+ * `html.dark-theme`), with a self-consistent dark-plate + white-text literal fallback
8499
+ * for bare standalone usage where no DS theme layer is present. Placement is mirrored
7352
8500
  * under `dir="rtl"` (a requested `left` lands on the reading-end side) and text aligns
7353
8501
  * to the logical start. Honours `prefers-reduced-motion`.
7354
8502
  *
8503
+ * ## Why this stays opaque, no `backdrop-filter` (read before adding blur)
8504
+ * A body-parented tooltip can land over ANY backdrop — a light app surface, a dark
8505
+ * canvas, the wallpaper — and it used to inherit `--glass-bg-elevated`, a TRANSLUCENT,
8506
+ * wallpaper-adaptive fill the shell recomputes at `:root` from the current wallpaper's
8507
+ * luminance, independent of `<html>`'s own light/dark theme class. Under a dark
8508
+ * wallpaper it became a ~54%-alpha dark plate even while the page was `light-theme`;
8509
+ * composited over a light surface (~rgb(143,141,140)) the paired white ink landed at
8510
+ * ~2.8:1 — "tooltips are white-on-white in the light theme" (commit 7aa921690, 2026-08-
8511
+ * 04). The directive's OWN doc comment at the time claimed a fallback existed; it
8512
+ * didn't — the `var()`s carried none, so the failure was silent until measured live.
8513
+ *
8514
+ * `--mat-tip-a`/`-b` do not reproduce that failure class: they are keyed on
8515
+ * `html.light-theme` / `html.dark-theme` directly (fixed per THEME), never recomputed
8516
+ * from the wallpaper at runtime, so the plate always matches the theme the page is
8517
+ * actually in. The residual risk — a light plate over a coincidentally dark LOCAL
8518
+ * backdrop (not the wallpaper) — only softens the plate/backdrop edge; the near-opaque
8519
+ * alpha (80–86%, D3 §1.6) keeps the ink-on-plate contrast itself unaffected, unlike the
8520
+ * ~2.8:1 failure above where the FILL's own colour was wrong. This is also why no
8521
+ * `backdrop-filter` is added here even though the material recipe allows it elsewhere:
8522
+ * the ratified design spec forces tooltips opaque and suppresses blur outright (D1 §7
8523
+ * item 10 / D3 §"Tooltips: ... fixed near-opaque fills"), so this file matches that
8524
+ * intentionally rather than reaching for a `glass.popover()`-style thin blur tier.
8525
+ *
7355
8526
  * The tip text is caller-supplied and assumed already-localized — no baseline i18n
7356
8527
  * strings are shipped.
7357
8528
  */
@@ -8095,6 +9266,204 @@ declare class FlyPeoplePickerComponent {
8095
9266
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyPeoplePickerComponent, "fly-people-picker", never, { "searchFn": { "alias": "searchFn"; "required": true; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "excludeIds": { "alias": "excludeIds"; "required": false; "isSignal": true; }; "initialSelection": { "alias": "initialSelection"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, never, never, true, never>;
8096
9267
  }
8097
9268
 
9269
+ /**
9270
+ * One ISO 4217 currency as the selector renders it.
9271
+ *
9272
+ * `code` is the identity: it is what {@link FlyCurrencySelectorComponent} emits and
9273
+ * what a record should persist — never the row's database id, which is an
9274
+ * implementation detail of whichever service served it.
9275
+ */
9276
+ interface FlyCurrency {
9277
+ /** ISO 4217 alpha-3 code (`AED`, `USD`, `XOF`). Unique. */
9278
+ readonly code: string;
9279
+ /** Display name, already resolved to the caller's locale by the server. */
9280
+ readonly name: string;
9281
+ /** Display symbol (`$`, `€`, `د.إ`). NOT unique — several currencies share `$`, which is exactly why every row also shows its code. */
9282
+ readonly symbol: string;
9283
+ /**
9284
+ * ISO 4217 minor-unit exponent: 0 (JPY, KRW, the CFA francs), 2 (most), or 3
9285
+ * (BHD, IQD, JOD, KWD, LYD, OMR, TND). Carried through so a host formatting the
9286
+ * amount next to the picked currency doesn't have to assume 2 and misprice a dinar.
9287
+ */
9288
+ readonly decimalDigits: number;
9289
+ /**
9290
+ * Issuing country's flag emoji, or null/absent for the multi-country union
9291
+ * currencies (XAF/XOF/XPF/XCD). The component degrades to a code tile either way —
9292
+ * see {@link FlyCurrencySelectorComponent} on why the emoji alone is not enough.
9293
+ */
9294
+ readonly flag?: string | null;
9295
+ /** Optional ISO 3166 alpha-2 codes of the countries using it, when the host fetched the richer `/api/currencies` shape. Purely informational. */
9296
+ readonly countryCodes?: readonly string[];
9297
+ }
9298
+ /** Single pick (replaces the selection, value is `string | null`) vs multi pick (chips accumulate, value is `string[]`). */
9299
+ type FlyCurrencySelectorMode = 'single' | 'multi';
9300
+ /**
9301
+ * Host-supplied loader, for a consumer that must not hit `/api/currencies/brief`
9302
+ * directly — an offline surface, a fixture-driven test, or an app that proxies
9303
+ * reference data through its own gateway route.
9304
+ */
9305
+ type FlyCurrencyFetchFn = () => Observable<readonly FlyCurrency[]>;
9306
+ /** The control's value: the picked code in single mode, the picked codes in multi mode. */
9307
+ type FlyCurrencySelectorValue = string | readonly string[] | null;
9308
+
9309
+ /**
9310
+ * **`fly-currency-selector`** — pick one currency or several from the platform's ISO 4217
9311
+ * catalogue, showing each with its flag, code, symbol and localized name.
9312
+ *
9313
+ * Pre-canned for the Controller's `GET /api/currencies/brief` (`CurrencyBriefDto`): with no
9314
+ * data inputs it loads that endpoint itself through the host's `HttpClient`, so the gateway
9315
+ * routing and auth interceptor apply and a consuming app writes one tag and nothing else.
9316
+ * A host that must not reach the platform directly supplies `[currencies]` (static rows) or
9317
+ * `[fetchFn]` (its own loader) instead — the same transport-agnostic escape hatch
9318
+ * `fly-entity-lookup` and `fly-people-picker` offer.
9319
+ *
9320
+ * Implements `ControlValueAccessor`, so it drops into reactive forms like `fly-select`. The
9321
+ * value is the ISO 4217 **code** (`string | null` single, `string[]` multi) — never the row
9322
+ * id, which belongs to whichever service served the list.
9323
+ *
9324
+ * ## Why every row shows a code, not just a flag
9325
+ * Two independent reasons, both of which the picker must survive:
9326
+ * 1. Windows renders flag emoji as two letters (no glyphs in Segoe UI Emoji). The component
9327
+ * measures this once and falls back to a styled code tile — deliberate-looking, not broken.
9328
+ * 2. Four currencies (XAF/XOF/XPF/XCD) serve many countries and have NO representative flag,
9329
+ * so `flag` is legitimately null. Picking one member state's would be wrong, not imprecise.
9330
+ *
9331
+ * Search matches word-wise AND across code, name and symbol — the same semantics as the
9332
+ * backend's `?search=`, so filtering client-side over the bounded catalogue cannot disagree
9333
+ * with what a server-side filter would have returned.
9334
+ *
9335
+ * i18n is self-sufficient through the `currency_selector.*` keys in `DS_BASELINE_LOCALES`
9336
+ * (en/ar/fr/ur); RTL works via logical CSS.
9337
+ *
9338
+ * @example
9339
+ * ```html
9340
+ * <!-- Loads /api/currencies/brief itself: -->
9341
+ * <fly-currency-selector [(ngModel)]="invoiceCurrency" [pinnedCodes]="['AED','USD','EUR']" />
9342
+ *
9343
+ * <!-- Multi-select, restricted to what the tenant trades in: -->
9344
+ * <fly-currency-selector
9345
+ * mode="multi"
9346
+ * [allowedCodes]="tenantCurrencies()"
9347
+ * (selectionDetailChange)="onCurrenciesPicked($event)" />
9348
+ * ```
9349
+ */
9350
+ declare class FlyCurrencySelectorComponent implements ControlValueAccessor {
9351
+ private readonly http;
9352
+ private readonly _i18n;
9353
+ /** `'single'` (default) replaces the pick; `'multi'` accumulates chips. Set-once at compose time. */
9354
+ readonly mode: _angular_core.InputSignal<FlyCurrencySelectorMode>;
9355
+ /** Static rows — supply these to skip the fetch entirely (offline surfaces, fixtures). */
9356
+ readonly currencies: _angular_core.InputSignal<readonly FlyCurrency[] | null>;
9357
+ /** Host-supplied loader, used when `[currencies]` is absent. Falls back to `GET /api/currencies/brief`. */
9358
+ readonly fetchFn: _angular_core.InputSignal<FlyCurrencyFetchFn | null>;
9359
+ /** Restrict the offered set to these ISO 4217 codes (case-insensitive). Empty = offer everything. */
9360
+ readonly allowedCodes: _angular_core.InputSignal<readonly string[]>;
9361
+ /**
9362
+ * Codes to surface in a "frequently used" group above the full list, in the order given.
9363
+ * Deliberately empty by default: which currencies matter is the consuming app's business
9364
+ * fact, and baking a house list into the design system would ship that opinion everywhere.
9365
+ */
9366
+ readonly pinnedCodes: _angular_core.InputSignal<readonly string[]>;
9367
+ /** Disable the whole control (also driven by reactive-forms `setDisabledState`). */
9368
+ readonly disabled: _angular_core.InputSignal<boolean>;
9369
+ /** Show the trigger clear (✕) affordance when there is a selection. */
9370
+ readonly clearable: _angular_core.InputSignal<boolean>;
9371
+ /** Trigger text when nothing is picked. Omit for the localized default. */
9372
+ readonly placeholder: _angular_core.InputSignal<string | null>;
9373
+ /** Placeholder for the in-panel search box. Omit for the localized default. */
9374
+ readonly searchPlaceholder: _angular_core.InputSignal<string | null>;
9375
+ /** Optional accessible name for the trigger (else the consumer's `<label for>` should reference it). */
9376
+ readonly ariaLabel: _angular_core.InputSignal<string>;
9377
+ /** The picked ISO 4217 codes, emitted after every pick / removal / clear. */
9378
+ readonly selectionChange: _angular_core.OutputEmitterRef<readonly string[]>;
9379
+ /** The picked rows in full — so a host formatting an amount has `symbol` + `decimalDigits` without re-resolving. */
9380
+ readonly selectionDetailChange: _angular_core.OutputEmitterRef<readonly FlyCurrency[]>;
9381
+ /** Emits when the panel opens (`true`) / closes (`false`). */
9382
+ readonly openedChange: _angular_core.OutputEmitterRef<boolean>;
9383
+ private readonly _uid;
9384
+ readonly listboxId: string;
9385
+ readonly triggerId: string;
9386
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
9387
+ readonly searchTerm: _angular_core.WritableSignal<string>;
9388
+ readonly activeIndex: _angular_core.WritableSignal<number>;
9389
+ readonly loading: _angular_core.WritableSignal<boolean>;
9390
+ readonly loadFailed: _angular_core.WritableSignal<boolean>;
9391
+ /** True when flag emoji compose on this platform; false routes every tile to the code fallback. */
9392
+ readonly flagsRenderable: _angular_core.WritableSignal<boolean>;
9393
+ private readonly _loaded;
9394
+ private readonly _selectedCodes;
9395
+ private readonly _cvaDisabled;
9396
+ private _fetchStarted;
9397
+ private readonly searchEl?;
9398
+ private readonly triggerEl?;
9399
+ private _onChange;
9400
+ private _onTouched;
9401
+ constructor();
9402
+ readonly effectiveDisabled: _angular_core.Signal<boolean>;
9403
+ readonly isMulti: _angular_core.Signal<boolean>;
9404
+ readonly placeholderText: _angular_core.Signal<string>;
9405
+ readonly searchPlaceholderText: _angular_core.Signal<string>;
9406
+ readonly noResultsText: _angular_core.Signal<string>;
9407
+ readonly loadingText: _angular_core.Signal<string>;
9408
+ readonly errorText: _angular_core.Signal<string>;
9409
+ readonly retryText: _angular_core.Signal<string>;
9410
+ readonly clearText: _angular_core.Signal<string>;
9411
+ readonly pinnedGroupText: _angular_core.Signal<string>;
9412
+ readonly allGroupText: _angular_core.Signal<string>;
9413
+ /** Every offered row, after the `allowedCodes` restriction. */
9414
+ readonly available: _angular_core.Signal<readonly FlyCurrency[]>;
9415
+ private readonly _byCode;
9416
+ private readonly _selectedSet;
9417
+ /** Picked rows in pick order. A code with no matching row yet (value set before the fetch landed) is skipped, not faked. */
9418
+ readonly selected: _angular_core.Signal<readonly FlyCurrency[]>;
9419
+ readonly hasSelection: _angular_core.Signal<boolean>;
9420
+ /**
9421
+ * Rows matching the search box. Word-wise AND over code / name / symbol — every
9422
+ * whitespace-separated token must match something, in any order, which is the same
9423
+ * contract `LookupQuery.ToLikePatterns` gives the backend's `?search=`.
9424
+ */
9425
+ readonly filtered: _angular_core.Signal<readonly FlyCurrency[]>;
9426
+ /** The pinned rows, in the order the host listed them, minus anything the search filtered out. */
9427
+ readonly pinned: _angular_core.Signal<readonly FlyCurrency[]>;
9428
+ /** Everything not already shown in the pinned group. */
9429
+ readonly rest: _angular_core.Signal<readonly FlyCurrency[]>;
9430
+ /** Flat keyboard-navigation order — pinned group first, matching the render order. */
9431
+ readonly navOptions: _angular_core.Signal<readonly FlyCurrency[]>;
9432
+ optionId(index: number): string;
9433
+ readonly activeDescendant: _angular_core.Signal<string>;
9434
+ navIndexOf(code: string): number;
9435
+ isSelected(code: string): boolean;
9436
+ /**
9437
+ * Two-letter tile shown when the platform can't compose flag emoji. ISO 4217 codes are
9438
+ * built as "country code + currency initial" (AED = AE + Dirham), so the first two letters
9439
+ * ARE the country for the overwhelming majority — a correct-by-construction fallback rather
9440
+ * than an arbitrary truncation.
9441
+ */
9442
+ tileCode(currency: FlyCurrency): string;
9443
+ toggleOpen(): void;
9444
+ open(): void;
9445
+ close(restoreFocus?: boolean): void;
9446
+ pick(currency: FlyCurrency): void;
9447
+ remove(code: string, event?: Event): void;
9448
+ clear(event?: Event): void;
9449
+ onTriggerKeydown(event: KeyboardEvent): void;
9450
+ onPanelKeydown(event: KeyboardEvent): void;
9451
+ onSearchInput(value: string): void;
9452
+ onOptionHover(index: number): void;
9453
+ retry(): void;
9454
+ private _load;
9455
+ writeValue(value: FlyCurrencySelectorValue): void;
9456
+ registerOnChange(fn: (v: FlyCurrencySelectorValue) => void): void;
9457
+ registerOnTouched(fn: () => void): void;
9458
+ setDisabledState(isDisabled: boolean): void;
9459
+ /** The form-control value: the single code (or null) in single mode, the code array in multi. */
9460
+ private _controlValue;
9461
+ private _commit;
9462
+ private _touch;
9463
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyCurrencySelectorComponent, never>;
9464
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyCurrencySelectorComponent, "fly-currency-selector", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "currencies": { "alias": "currencies"; "required": false; "isSignal": true; }; "fetchFn": { "alias": "fetchFn"; "required": false; "isSignal": true; }; "allowedCodes": { "alias": "allowedCodes"; "required": false; "isSignal": true; }; "pinnedCodes": { "alias": "pinnedCodes"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "selectionDetailChange": "selectionDetailChange"; "openedChange": "openedChange"; }, never, never, true, never>;
9465
+ }
9466
+
8098
9467
  /**
8099
9468
  * Document-wide open-overlay stack — Escape arbitration for stacked overlays.
8100
9469
  *
@@ -8257,6 +9626,47 @@ declare class FlyClickOutsideDirective {
8257
9626
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FlyClickOutsideDirective, "[flyClickOutside]", never, { "enabled": { "alias": "flyClickOutsideEnabled"; "required": false; "isSignal": true; }; }, { "flyClickOutside": "flyClickOutside"; }, never, never, true, never>;
8258
9627
  }
8259
9628
 
9629
+ /**
9630
+ * Whether the host application is currently wearing MOBILE chrome.
9631
+ *
9632
+ * ## Why the DS asks instead of measuring
9633
+ * A second `matchMedia` inside the design system would be a second breakpoint
9634
+ * mechanism, and two predicates that answer "is this a phone" drift the first time
9635
+ * anyone retunes one of them. The shell already owns exactly one such predicate
9636
+ * (`ShellViewportService`, S5.1) and mirrors it three ways — a class on `<html>`, a
9637
+ * signal for templates, and the shell's own inset arithmetic. This token is the
9638
+ * fourth route to that SAME answer, not a new one: the shell binds it to
9639
+ * `ShellViewportService.isMobile` and nothing here evaluates a query.
9640
+ *
9641
+ * ## Default: `false`, deliberately
9642
+ * Unprovided, every DS overlay behaves exactly as it did before this token existed
9643
+ * — desktop geometry, no mobile branch. That matters for two populations:
9644
+ *
9645
+ * - **Standalone External Apps** (Circles/Thoughts/PPM) render on their own page
9646
+ * with no FlyOS shell. They opt in by providing this from their own breakpoint
9647
+ * source; until they do, nothing about them changes.
9648
+ * - **Tests and Storybook-style harnesses** that construct a DS component bare.
9649
+ *
9650
+ * A default of "measure the window" would have been the opposite trade: silently
9651
+ * correct in the shell, silently surprising everywhere else, and impossible to
9652
+ * override downward.
9653
+ *
9654
+ * ## Consumers
9655
+ * `fly-drawer` (`variant="auto"` → `sheet` on mobile) and `fly-message-box` /
9656
+ * `fly-confirm-dialog` (the full-bleed confirm card). Each reads the signal and
9657
+ * either resolves an input or stamps a host class — none of them re-derive a
9658
+ * width, so retuning the threshold is still a one-line change in the shell.
9659
+ *
9660
+ * @example Shell wiring (`app.config.ts`)
9661
+ * ```ts
9662
+ * {
9663
+ * provide: FLY_VIEWPORT_IS_MOBILE,
9664
+ * useFactory: () => inject(ShellViewportService).isMobile,
9665
+ * }
9666
+ * ```
9667
+ */
9668
+ declare const FLY_VIEWPORT_IS_MOBILE: InjectionToken<Signal<boolean>>;
9669
+
8260
9670
  /**
8261
9671
  * Debounce primitives — the shared replacement for the `setTimeout` / `clearTimeout`
8262
9672
  * pairs hand-rolled in every list screen and typeahead across the estate.
@@ -8374,6 +9784,28 @@ type FlySearchInputSize = 'sm' | 'md' | 'lg';
8374
9784
  * is wrong half the time. The two-way `[(value)]` gives you the live text and
8375
9785
  * `(queryChange)` gives you the settled query, explicitly. Reactive-forms hosts wire
8376
9786
  * `(queryChange)` to `control.setValue(...)`.
9787
+ *
9788
+ * ## Nova morph (`collapsible`)
9789
+ * `[collapsible]` renders the Nova SearchField morph — a circular magnifier that
9790
+ * grows into a pill (D2 §3.1: 28×28 closed, `--fly-search-expanded-width` open,
9791
+ * default 230px, `--nova-ease-structural` / `--nova-duration-settle`). Two extras
9792
+ * beyond the geometry:
9793
+ * - **Controlled or uncontrolled**, your choice — see {@link open}. Every existing
9794
+ * consumer is uncontrolled (the default) and is unaffected.
9795
+ * - **A trailing slot** for composing something like the Home magic-bar's inline
9796
+ * Filters button, instead of hand-rolling the whole field per app:
9797
+ * ```html
9798
+ * <fly-search-input [collapsible]="true" [showFilterToggle]="false" ...>
9799
+ * <button flySearchTrailing type="button" (click)="openFilters()">Filters</button>
9800
+ * </fly-search-input>
9801
+ * ```
9802
+ * Rendered only while the field is expanded (never in the closed circle, so
9803
+ * projected content can't visibly break the morph geometry) and never while
9804
+ * `disabled`. It adds to the pill's content width same as the clear/filter
9805
+ * buttons do — widen `--fly-search-expanded-width` to fit it. This is a
9806
+ * SEPARATE mechanism from {@link showFilterToggle}'s built-in chevron; use
9807
+ * whichever fits — the chevron for the common toggle-a-panel case, this slot
9808
+ * when the affordance itself (icon, label, badge) needs to be bespoke.
8377
9809
  */
8378
9810
  declare class FlySearchInputComponent {
8379
9811
  private readonly i18n;
@@ -8438,6 +9870,30 @@ declare class FlySearchInputComponent {
8438
9870
  readonly showFilterToggle: _angular_core.InputSignal<boolean>;
8439
9871
  /** Reflects the host panel's open state — rotates the chevron and sets `aria-expanded`. */
8440
9872
  readonly filterPanelOpen: _angular_core.InputSignal<boolean>;
9873
+ /**
9874
+ * Controls a `collapsible` field's open/closed state from the OUTSIDE, the
9875
+ * `open`/`onToggle` contract Nova's SearchField spec calls for (D2 §3.1).
9876
+ * `null` (the default) means UNCONTROLLED — every existing consumer, which
9877
+ * never passes this input — and the field keeps managing its own expand/
9878
+ * collapse exactly as it always has (focus, hover, held value, filter panel).
9879
+ *
9880
+ * Passing `true`/`false` makes it CONTROLLED, the same "the host decides,
9881
+ * this component only asks" shape {@link filterPanelOpen}/{@link
9882
+ * filterToggled} already establish two properties up: the host binds `[open]`
9883
+ * and listens on {@link expandedChange}, which doubles as `onToggle` while
9884
+ * controlled (see its doc). Only consulted when {@link collapsible} is
9885
+ * `true` — open/closed has no meaning for an always-open field.
9886
+ *
9887
+ * Why not a `model()` two-way signal like {@link value}: `isExpanded` here
9888
+ * is normally the OUTPUT of several independent low-level signals (focus,
9889
+ * hover, held value, filter-panel state), not one value the component owns
9890
+ * outright — a `model()` would have to pick one of those to be "the" source
9891
+ * of truth and the others would silently stop mattering. An `input` that
9892
+ * simply overrides the rendered state when non-null, paired with the
9893
+ * existing `expandedChange` intent signal, lets the low-level triggers
9894
+ * keep working unchanged underneath in BOTH modes.
9895
+ */
9896
+ readonly open: _angular_core.InputSignal<boolean | null>;
8441
9897
  /**
8442
9898
  * The settled query — fires `debounceMs` after typing stops, and immediately on
8443
9899
  * clear.
@@ -8464,9 +9920,18 @@ declare class FlySearchInputComponent {
8464
9920
  /** Fires when the user clears the box (button or Escape). */
8465
9921
  readonly cleared: _angular_core.OutputEmitterRef<void>;
8466
9922
  /**
8467
- * Fires whenever a `collapsible` field expands (`true`) or collapses (`false`).
8468
- * Lets a host react to the reveal e.g. yield sibling space to the growing
8469
- * field, or dim a title while the search is open.
9923
+ * Fires whenever a `collapsible` field's internal gesture state (focus, hover,
9924
+ * held value, filter panel) says it should expand (`true`) or collapse
9925
+ * (`false`). Lets a host react to the reveal e.g. yield sibling space to
9926
+ * the growing field, or dim a title while the search is open.
9927
+ *
9928
+ * While {@link open} is bound (controlled mode), this is the `onToggle` half
9929
+ * of the D2 §3.1 `open`/`onToggle` contract: it reports what the user's
9930
+ * gesture WANTS, not the currently-rendered state (that stays pinned to
9931
+ * whatever `open` says until the host reacts) — the same request/response
9932
+ * shape {@link filterToggled} already uses for the filter panel. A host that
9933
+ * doesn't bind `open` never notices the difference: with `open` unset the
9934
+ * wanted state and the rendered state are the same value by construction.
8470
9935
  */
8471
9936
  readonly expandedChange: _angular_core.OutputEmitterRef<boolean>;
8472
9937
  /**
@@ -8486,9 +9951,23 @@ declare class FlySearchInputComponent {
8486
9951
  private readonly inputFocused;
8487
9952
  private readonly hovered;
8488
9953
  /**
8489
- * Whether a `collapsible` field is currently open. Non-collapsible fields are
8490
- * always "expanded". Open when: the field has focus, OR (hover trigger) it's
8491
- * hovered, OR it holds a query and {@link stayExpandedWithValue} is on.
9954
+ * What the field's own low-level gesture signals want its open state to be:
9955
+ * open when the field has focus, OR (hover trigger) it's hovered, OR it
9956
+ * holds a query and {@link stayExpandedWithValue} is on, OR the filter panel
9957
+ * is open (otherwise moving the pointer from the chevron to the panel
9958
+ * collapses the field out from under the gesture, taking its own anchor
9959
+ * with it). Non-collapsible fields always want "expanded".
9960
+ *
9961
+ * This is the UNCONTROLLED answer — see {@link isExpanded} for what actually
9962
+ * renders, and {@link expandedChange} for how this reaches a controlled host.
9963
+ */
9964
+ private readonly desiredExpanded;
9965
+ /**
9966
+ * Whether a `collapsible` field is currently RENDERED open. Equals {@link
9967
+ * desiredExpanded} unless a controlled {@link open} is bound, in which case
9968
+ * the bound value wins outright — the host is the single source of truth,
9969
+ * same as `[open]` on a controlled `<fly-drawer>`. Non-collapsible fields
9970
+ * ignore `open` entirely (always "expanded"; open/closed has no meaning).
8492
9971
  */
8493
9972
  readonly isExpanded: _angular_core.Signal<boolean>;
8494
9973
  /** Collapsed + a pointer trigger ⇒ the whole control is the button that expands it. */
@@ -8517,7 +9996,7 @@ declare class FlySearchInputComponent {
8517
9996
  /** Moves focus into the input — for hosts wiring a `/` or Ctrl+F shortcut. */
8518
9997
  focus(): void;
8519
9998
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlySearchInputComponent, never>;
8520
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlySearchInputComponent, "fly-search-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "placeholderKey": { "alias": "placeholderKey"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelKey": { "alias": "ariaLabelKey"; "required": false; "isSignal": true; }; "debounceMs": { "alias": "debounceMs"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "expandTrigger": { "alias": "expandTrigger"; "required": false; "isSignal": true; }; "stayExpandedWithValue": { "alias": "stayExpandedWithValue"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "showFilterToggle": { "alias": "showFilterToggle"; "required": false; "isSignal": true; }; "filterPanelOpen": { "alias": "filterPanelOpen"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "queryChange": "queryChange"; "searched": "searched"; "submitted": "submitted"; "cleared": "cleared"; "expandedChange": "expandedChange"; "filterToggled": "filterToggled"; }, never, never, true, never>;
9999
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlySearchInputComponent, "fly-search-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "placeholderKey": { "alias": "placeholderKey"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelKey": { "alias": "ariaLabelKey"; "required": false; "isSignal": true; }; "debounceMs": { "alias": "debounceMs"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "expandTrigger": { "alias": "expandTrigger"; "required": false; "isSignal": true; }; "stayExpandedWithValue": { "alias": "stayExpandedWithValue"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "showFilterToggle": { "alias": "showFilterToggle"; "required": false; "isSignal": true; }; "filterPanelOpen": { "alias": "filterPanelOpen"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "queryChange": "queryChange"; "searched": "searched"; "submitted": "submitted"; "cleared": "cleared"; "expandedChange": "expandedChange"; "filterToggled": "filterToggled"; }, never, ["[flySearchTrailing]"], true, never>;
8521
10000
  }
8522
10001
 
8523
10002
  /**
@@ -9114,6 +10593,14 @@ declare function resolveStateMessageKey(kind: StateMessageKind, override?: strin
9114
10593
  * Empty / loading / error / success / warning page state.
9115
10594
  * Source visual: the legacy `.circles-state-message` block (+ `--error`
9116
10595
  * modifier). Extra CTAs project into the default slot.
10596
+ *
10597
+ * `kind="empty"` renders the D2 §3.3 EmptyState anatomy (UX-refresh S1.9): a
10598
+ * 46px icon TILE (radius 16, `var(--w07)` fill, `var(--w12)` border) instead
10599
+ * of a bare washed-out glyph, `messageKey` promoted to a bold title, and an
10600
+ * optional `noteKey` for the lighter description line underneath. `noteKey`
10601
+ * is additive — omitting it renders exactly the single-line empty state that
10602
+ * shipped before this task, just inside the new icon tile. Every other kind
10603
+ * (`loading`/`error`/`success`/`warning`) is visually unchanged.
9117
10604
  */
9118
10605
  declare class FlyStateMessageComponent {
9119
10606
  readonly kind: _angular_core.InputSignal<StateMessageKind>;
@@ -9121,6 +10608,8 @@ declare class FlyStateMessageComponent {
9121
10608
  readonly messageKey: _angular_core.InputSignal<string | undefined>;
9122
10609
  /** `pi-*` class override, e.g. `pi-bolt`. */
9123
10610
  readonly iconClass: _angular_core.InputSignal<string | undefined>;
10611
+ /** Lighter description line under the title — `kind="empty"` only. Omit for the single-line empty state. */
10612
+ readonly noteKey: _angular_core.InputSignal<string | undefined>;
9124
10613
  readonly retryLabelKey: _angular_core.InputSignal<string>;
9125
10614
  /** Renders the retry button (kind=error only). */
9126
10615
  readonly showRetry: _angular_core.InputSignal<boolean>;
@@ -9128,7 +10617,7 @@ declare class FlyStateMessageComponent {
9128
10617
  protected readonly icon: _angular_core.Signal<string>;
9129
10618
  protected readonly resolvedMessageKey: _angular_core.Signal<string | undefined>;
9130
10619
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyStateMessageComponent, never>;
9131
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyStateMessageComponent, "fly-state-message", never, { "kind": { "alias": "kind"; "required": false; "isSignal": true; }; "messageKey": { "alias": "messageKey"; "required": false; "isSignal": true; }; "iconClass": { "alias": "iconClass"; "required": false; "isSignal": true; }; "retryLabelKey": { "alias": "retryLabelKey"; "required": false; "isSignal": true; }; "showRetry": { "alias": "showRetry"; "required": false; "isSignal": true; }; }, { "retried": "retried"; }, never, ["*"], true, never>;
10620
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyStateMessageComponent, "fly-state-message", never, { "kind": { "alias": "kind"; "required": false; "isSignal": true; }; "messageKey": { "alias": "messageKey"; "required": false; "isSignal": true; }; "iconClass": { "alias": "iconClass"; "required": false; "isSignal": true; }; "noteKey": { "alias": "noteKey"; "required": false; "isSignal": true; }; "retryLabelKey": { "alias": "retryLabelKey"; "required": false; "isSignal": true; }; "showRetry": { "alias": "showRetry"; "required": false; "isSignal": true; }; }, { "retried": "retried"; }, never, ["*"], true, never>;
9132
10621
  }
9133
10622
 
9134
10623
  /** Inline busy indicator — spinner glyph plus optional label. */
@@ -9165,6 +10654,17 @@ declare class FlyActionStackComponent {
9165
10654
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyActionStackComponent, "fly-action-stack", never, { "triggerVariant": { "alias": "triggerVariant"; "required": false; "isSignal": true; }; "triggerTooltipKey": { "alias": "triggerTooltipKey"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
9166
10655
  }
9167
10656
 
10657
+ /**
10658
+ * As of UX-refresh S1.9, `status` also recognizes the D2 §5 priority
10659
+ * vocabulary (`critical`/`urgent`/`high`/`normal`/`low`), coloured from the
10660
+ * same shared Nova tone map as the five ratified status values
10661
+ * (`published`/`review`/`approved`/`draft`/`archived` — `nova-status-tone()`
10662
+ * / `nova-priority-tone()` in `app-surface/styles/_mixins.scss`). This is
10663
+ * additive to the existing 10-value workflow-status set, not a new input:
10664
+ * apps pass a priority the exact same way they already pass a status —
10665
+ * `[status]="item.priority"` — and must have a matching `common.status.
10666
+ * <value>` locale entry, same as today.
10667
+ */
9168
10668
  declare class StatusBadgeComponent {
9169
10669
  status: _angular_core.InputSignal<string>;
9170
10670
  /** Render as a colour-coded "status light" dot with the label on hover/SR
@@ -9178,6 +10678,62 @@ declare class StatusBadgeComponent {
9178
10678
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusBadgeComponent, "fly-status-badge", never, { "status": { "alias": "status"; "required": true; "isSignal": true; }; "dot": { "alias": "dot"; "required": false; "isSignal": true; }; "domain": { "alias": "domain"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
9179
10679
  }
9180
10680
 
10681
+ /**
10682
+ * TypeScript mirror of the Sass `nova-priority-tone()` / `nova-status-tone()`
10683
+ * functions in `app-surface/styles/_mixins.scss`.
10684
+ *
10685
+ * The kit owns this map ONCE (UX-refresh S1.9 — see the Sass file's own
10686
+ * comment for the full RAD justification: 20 Stage-4 apps would otherwise each
10687
+ * re-derive "Critical → red, Urgent/High → orange…"). It is authored twice —
10688
+ * once as a Sass function for a component's own compile-time literal classes
10689
+ * (`.status-badge--critical { color: ui.nova-priority-tone('critical'); }`),
10690
+ * once here as a plain object — because a Sass `@function` cannot be called
10691
+ * from an Angular template. Anything binding a colour off a RUNTIME value
10692
+ * (page data, not a fixed template literal — e.g. `[style.color]` on a
10693
+ * hand-composed leading status dot) reads this map instead.
10694
+ *
10695
+ * Values are CSS custom-property NAMES (no `var()` wrapper), so a caller binds
10696
+ * them through Angular:
10697
+ *
10698
+ * ```html
10699
+ * <span [style.color]="'var(' + novaPriorityToneVar(item.priority) + ')'"></span>
10700
+ * ```
10701
+ *
10702
+ * Bind with `[style.color]` — never interpolate into a literal `style="…"`
10703
+ * attribute. A static `style` attribute containing `{{ }}` is not a binding at
10704
+ * all: Angular emits it as an inline style, which the platform's strict CSP
10705
+ * (`style-src 'self' 'nonce-…'`) blocks outright, and the failure surfaces as a
10706
+ * silently uncoloured dot plus a console entry naming a sha256 nobody can trace
10707
+ * back to here. `[style.color]` is set via the CSSOM and is unaffected.
10708
+ *
10709
+ * Keep this in sync with `_mixins.scss`'s two functions — `nova-tone.spec.ts`
10710
+ * pins both maps' key/value pairs so a drift between the Sass and TS copies
10711
+ * fails a test instead of shipping a colour mismatch between a component's own
10712
+ * CSS classes and a page's hand-bound dot.
10713
+ */
10714
+ /** D2 §5 priority map. Keys are lower-case; unknown keys resolve via {@link novaPriorityToneVar}'s fallback. */
10715
+ declare const NOVA_PRIORITY_TONE: Readonly<Record<string, string>>;
10716
+ /**
10717
+ * D2 §5 status map. `under-review` is the canonical key; `review` is accepted
10718
+ * as a synonym — it is the shorter key `fly-status-badge`'s pre-existing
10719
+ * status vocabulary already shipped for the same real-world state.
10720
+ */
10721
+ declare const NOVA_STATUS_TONE: Readonly<Record<string, string>>;
10722
+ /** The ramp's own "meta / neutral" step — the fallback for a key neither map recognizes. */
10723
+ declare const NOVA_TONE_FALLBACK = "--w42";
10724
+ /**
10725
+ * Resolves a priority string to a Nova custom-property NAME (e.g. `--sys-red`),
10726
+ * case-insensitive.
10727
+ *
10728
+ * Accepts nullish. A status/priority field is routinely optional in the domain
10729
+ * models these badges render, so `undefined` reaching here is ordinary data,
10730
+ * not a caller bug — and the signature freezes at 1.8.0, where widening it later
10731
+ * would be a MAJOR. Nullish resolves to the same neutral step as an unknown key.
10732
+ */
10733
+ declare function novaPriorityToneVar(priority: string | null | undefined): string;
10734
+ /** Resolves a status string to a Nova custom-property NAME (e.g. `--sys-green`), case-insensitive. Accepts nullish — see {@link novaPriorityToneVar}. */
10735
+ declare function novaStatusToneVar(status: string | null | undefined): string;
10736
+
9181
10737
  declare class DashboardKpiComponent {
9182
10738
  label: _angular_core.InputSignal<string>;
9183
10739
  value: _angular_core.InputSignal<string | number>;
@@ -9208,7 +10764,7 @@ interface FlyMetaItem {
9208
10764
  * global `.mono` utility for the small monospace value treatment.
9209
10765
  */
9210
10766
  declare class FlyMetaListComponent {
9211
- readonly items: _angular_core.InputSignal<FlyMetaItem[]>;
10767
+ readonly items: _angular_core.InputSignal<readonly FlyMetaItem[]>;
9212
10768
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyMetaListComponent, never>;
9213
10769
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyMetaListComponent, "fly-meta", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; }, {}, never, ["*"], true, never>;
9214
10770
  }
@@ -9221,6 +10777,19 @@ declare class FlyMetaListComponent {
9221
10777
  *
9222
10778
  * <fly-pagination [page]="page()" [totalPages]="totalPages()"
9223
10779
  * [rangeText]="rangeText()" (pageChange)="goToPage($event)" />
10780
+ *
10781
+ * Restyled to the D2 §5 pagination canon (UX-refresh S1.9): prev/next are 26px
10782
+ * circular arrow buttons (an SVG chevron replaces the old text label; the
10783
+ * label survives as the button's `aria-label`, already wired) and the current
10784
+ * indicator is a solid-accent pill with tabular numerals. D2 describes a row
10785
+ * of numbered "page dots" for the reference signals-list pager — this kit
10786
+ * deliberately keeps the existing prev/current/next SHAPE rather than adding a
10787
+ * numbered-page-range renderer (a new page-window/ellipsis computation, not a
10788
+ * restyle) and applies the same visual language — 26px circular arrows, a
10789
+ * 24px-tall accent-filled current indicator, tabular-nums — to it instead; see
10790
+ * `.workflow/plans/ux-refresh/notes/S1.9-content-primitives.md` for the full
10791
+ * reasoning. `data-arrow` on the prev/next glyphs mirrors under RTL exactly
10792
+ * like the existing first/last chevrons.
9224
10793
  */
9225
10794
  declare class FlyPaginationComponent {
9226
10795
  readonly page: _angular_core.InputSignal<number>;
@@ -9244,6 +10813,17 @@ declare function canGoNext(page: number, totalPages: number): boolean;
9244
10813
  declare function clampPage(page: number, totalPages: number): number;
9245
10814
 
9246
10815
  type CardLayout = 'row' | 'column';
10816
+ /**
10817
+ * Row-layout density (UX-refresh S1.9, D2 §5). `roomy` (default) is today's
10818
+ * anatomy unchanged. `compact` is the real behaviour the design calls for when
10819
+ * a detail pane opens beside the list — NOT a size token: the title drops to
10820
+ * 12.5px and `fly-card-status` is hidden (the design moves status INTO the
10821
+ * meta strip in compact mode; since the card has no way to know which
10822
+ * projected meta chip IS the status, the app renders that chip itself — see
10823
+ * COMPONENTS.md). Column layout ignores this input; it has its own fixed
10824
+ * density.
10825
+ */
10826
+ type CardDensity = 'roomy' | 'compact';
9247
10827
  /**
9248
10828
  * Listing card shell — one anatomy for the three reference card patterns:
9249
10829
  *
@@ -9273,9 +10853,20 @@ type CardLayout = 'row' | 'column';
9273
10853
  * Hover: the default interactive hover darkens the hairline and keeps the
9274
10854
  * resting shadow (cluster/trend source); `lift` opts into the
9275
10855
  * translateY/`--shadow-filter` raise for pages that want it.
10856
+ *
10857
+ * Row-layout visual canon (D2 §5, UX-refresh S1.9): a plain (non-selectable)
10858
+ * row rests transparent and tints `var(--w04)` on hover, separated from its
10859
+ * siblings by a 1px `var(--w07)` hairline rendered as a host pseudo-element —
10860
+ * NOT a border, so it disappears under `[selectable]`'s card treatment
10861
+ * (bordered `var(--w07)`/`var(--w04)`, selected → `var(--accent)`/
10862
+ * `var(--tint-sel)`, hover → `var(--w06)`/`var(--w14)`) without a seam. Rows
10863
+ * animate in with `itemIn`, staggered 40ms; column cards use `riseIn`,
10864
+ * staggered 55ms (skill §5's item/card stagger split).
9276
10865
  */
9277
10866
  declare class FlyCardComponent {
9278
10867
  readonly layout: _angular_core.InputSignal<CardLayout>;
10868
+ /** Row-layout density (`roomy` default / `compact`) — ignored in column layout. */
10869
+ readonly density: _angular_core.InputSignal<CardDensity>;
9279
10870
  /** Renders the hover/focus-revealed selection checkbox — row layout only. */
9280
10871
  readonly selectable: _angular_core.InputSignal<boolean>;
9281
10872
  readonly selected: _angular_core.ModelSignal<boolean>;
@@ -9304,7 +10895,7 @@ declare class FlyCardComponent {
9304
10895
  */
9305
10896
  protected onKey(event: Event): void;
9306
10897
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyCardComponent, never>;
9307
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyCardComponent, "fly-card", never, { "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "lift": { "alias": "lift"; "required": false; "isSignal": true; }; "selectLabelKey": { "alias": "selectLabelKey"; "required": false; "isSignal": true; }; "selectLabel": { "alias": "selectLabel"; "required": false; "isSignal": true; }; }, { "selected": "selectedChange"; "activated": "activated"; }, never, ["fly-card-media", "fly-card-title", "*", "fly-card-body", "fly-card-meta", "fly-card-status", "fly-card-footer", "fly-card-actions"], true, never>;
10898
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyCardComponent, "fly-card", never, { "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "lift": { "alias": "lift"; "required": false; "isSignal": true; }; "selectLabelKey": { "alias": "selectLabelKey"; "required": false; "isSignal": true; }; "selectLabel": { "alias": "selectLabel"; "required": false; "isSignal": true; }; }, { "selected": "selectedChange"; "activated": "activated"; }, never, ["fly-card-media", "fly-card-title", "*", "fly-card-body", "fly-card-meta", "fly-card-status", "fly-card-footer", "fly-card-actions"], true, never>;
9308
10899
  }
9309
10900
 
9310
10901
  /**
@@ -10071,6 +11662,7 @@ declare function initialExpanded(sections: readonly Pick<FlyAppModuleSection, 'c
10071
11662
  */
10072
11663
  declare function sectionHintKey(section: Pick<FlyAppModuleSection, 'collapsible' | 'hintKey' | 'collapsedHintKey'>, expanded: boolean): string | null;
10073
11664
 
11665
+ type TabsVariant = 'underline' | 'segmented';
10074
11666
  /**
10075
11667
  * Underline tab row + panels — visual port of the signal-detail sidecard tab
10076
11668
  * row (`.llc__tabs` / `.llc__tab`); also replaces the job-profile
@@ -10085,6 +11677,14 @@ declare function sectionHintKey(section: Pick<FlyAppModuleSection, 'collapsible'
10085
11677
  * </fly-tabs>
10086
11678
  * ```
10087
11679
  *
11680
+ * `variant="segmented"` (UX-refresh S1.9, D2 §1.3) renders the OTHER tab
11681
+ * anatomy the source design uses for its detail-page tab strips (Metadata /
11682
+ * Evidence / Linked trends / … and Tasks' 3-tab row): a pill-shaped
11683
+ * `role="tablist"` track with the active tab as a raised pill inside it,
11684
+ * instead of an underline baseline. Same component, same a11y wiring, same
11685
+ * `fly-tab` children — only the CSS skin switches; `underline` (default)
11686
+ * keeps every existing consumer pixel-identical.
11687
+ *
10088
11688
  * a11y: `role="tablist"`/`tab`/`tabpanel` with `aria-selected`/`aria-controls`
10089
11689
  * wiring, roving tabindex (active tab is the tab stop), RTL-aware arrow-key
10090
11690
  * navigation with wrap-around and Home/End; arrows move both selection and
@@ -10099,6 +11699,8 @@ declare class FlyTabsComponent {
10099
11699
  readonly selected: _angular_core.ModelSignal<string | undefined>;
10100
11700
  /** Group label for the tablist. */
10101
11701
  readonly ariaLabelKey: _angular_core.InputSignal<string | undefined>;
11702
+ /** Tab-strip skin — `underline` (default, unchanged) or `segmented` (D2 §1.3 pill track). */
11703
+ readonly variant: _angular_core.InputSignal<TabsVariant>;
10102
11704
  protected readonly tabItems: _angular_core.Signal<readonly any[]>;
10103
11705
  readonly activeId: _angular_core.Signal<string | null>;
10104
11706
  tabId(id: string): string;
@@ -10106,7 +11708,7 @@ declare class FlyTabsComponent {
10106
11708
  protected select(id: string): void;
10107
11709
  protected onKey(event: KeyboardEvent): void;
10108
11710
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyTabsComponent, never>;
10109
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyTabsComponent, "fly-tabs", never, { "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "ariaLabelKey": { "alias": "ariaLabelKey"; "required": false; "isSignal": true; }; }, { "selected": "selectedChange"; }, ["tabItems"], ["*"], true, never>;
11711
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyTabsComponent, "fly-tabs", never, { "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "ariaLabelKey": { "alias": "ariaLabelKey"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, { "selected": "selectedChange"; }, ["tabItems"], ["*"], true, never>;
10110
11712
  }
10111
11713
  /**
10112
11714
  * One tab of a `fly-tabs` group: declares the tab button (id, label, optional
@@ -10270,7 +11872,7 @@ declare function nextSegmentIndex(current: number, key: string, length: number,
10270
11872
  declare class FlySegmentedComponent {
10271
11873
  private readonly i18n;
10272
11874
  private readonly el;
10273
- readonly options: _angular_core.InputSignal<SegmentedOption[]>;
11875
+ readonly options: _angular_core.InputSignal<readonly SegmentedOption[]>;
10274
11876
  readonly value: _angular_core.ModelSignal<string | undefined>;
10275
11877
  readonly disabled: _angular_core.InputSignal<boolean>;
10276
11878
  readonly ariaLabelKey: _angular_core.InputSignal<string | undefined>;
@@ -10338,9 +11940,11 @@ declare class FlySliderComponent {
10338
11940
  declare function clampSliderValue(value: number, min: number, max: number): number;
10339
11941
  /**
10340
11942
  * Gradient fill for the range track (the legacy confidence-slider
10341
- * `--rng-track`): brand teal→purple up to the value, rest neutral. All colour
10342
- * stops resolve through tokens so themes restyle the track. Mirrored under RTL
10343
- * (native range inputs flip, `to right` would not).
11943
+ * `--rng-track`): D2 §1.3's confidence-meter recipe, `linear-gradient(90deg, var(--accent),
11944
+ * var(--sys-teal))` this slider IS that confidence control (the class docblock names it as the
11945
+ * port), so the fill up to the value runs accent→teal, the rest sits at the Nova input-border
11946
+ * tier (`--w14`). All colour stops resolve through tokens so themes restyle the track. Mirrored
11947
+ * under RTL (native range inputs flip, `to right` would not).
10344
11948
  */
10345
11949
  declare function sliderTrackGradient(value: number, min: number, max: number, rtl: boolean): string;
10346
11950
 
@@ -10553,6 +12157,8 @@ declare function enterActivatesNatively(tagName: string, inputType?: string | nu
10553
12157
  * focus is trapped while open and returns to the prior element on close.
10554
12158
  */
10555
12159
  declare class FlyConfirmDialogComponent {
12160
+ /** Mobile chrome → the full-bleed confirm card. Read by the host class binding. */
12161
+ protected readonly isMobile: _angular_core.Signal<boolean>;
10556
12162
  readonly open: _angular_core.InputSignal<boolean>;
10557
12163
  readonly kind: _angular_core.InputSignal<ConfirmKind>;
10558
12164
  readonly titleKey: _angular_core.InputSignal<string>;
@@ -10628,7 +12234,7 @@ declare function nextEnabledIndex(items: readonly ActionMenuItem[], current: num
10628
12234
  declare class FlyActionMenuComponent {
10629
12235
  private readonly el;
10630
12236
  private readonly injector;
10631
- readonly items: _angular_core.InputSignal<ActionMenuItem[]>;
12237
+ readonly items: _angular_core.InputSignal<readonly ActionMenuItem[]>;
10632
12238
  readonly triggerTooltipKey: _angular_core.InputSignal<string>;
10633
12239
  /** Id of the activated item. */
10634
12240
  readonly selected: _angular_core.OutputEmitterRef<string>;
@@ -10736,6 +12342,6 @@ declare const AUDIENCE_ERROR_CODES: {
10736
12342
  };
10737
12343
  type AudienceErrorCode = (typeof AUDIENCE_ERROR_CODES)[keyof typeof AUDIENCE_ERROR_CODES];
10738
12344
 
10739
- 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_SCAN_PENDING_DEFAULT_DELAY_MS, FLY_SCAN_PENDING_MAX_RETRIES, FLY_SCAN_PENDING_STATUS, 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, FlyFileDownloadService, 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, flyApiErrorMessage, flyCaptchaBase64Utf8, flyCaptchaBuildToken, flyCaptchaSha256Hex, flyCompactNumber, flyDebounced, flyDecimalNumber, flyDownloadBlob, flyDuration, flyEmojiFor, flyEmojiIsTonable, flyEmojiPackUrl, flyExportFileName, flyFirstEnabledIndex, flyFormatBytes, flyFormatDate, flyFormatDateTime, flyFormatTime, flyFullNumber, flyNextEnabledIndex, flyNextSegmentIndex, flyRelativeTime, flyResolveActiveTab, flyRoleGuard, flyScanPendingDelayMs, flyScanRetry, flySignedCompact, flySkinToneLabelKey, flyStandaloneAuthGuard, flyStandaloneAuthInterceptor, flyToDateOnly, flyToPage, flyUnwrap, flyUnwrapLenient, 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 };
10740
- 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, FlyApiError, FlyApiResponse, 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, FlyPageMeta, FlyPageResult, FlyPaged, FlyPeoplePickerMode, FlyPeoplePickerOption, FlyPeopleSearchFn, FlyPointsSummary, FlyRemoteContext, FlyRemoteEagerRoute, FlyRemoteLazyRoute, FlyRemoteLoadedComponent, 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 };
12345
+ 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_MAGIC_BAR_EVENT, FLY_MAGIC_BAR_ICONS, FLY_MAGIC_BAR_STORE_KEY, 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_SCAN_PENDING_DEFAULT_DELAY_MS, FLY_SCAN_PENDING_MAX_RETRIES, FLY_SCAN_PENDING_STATUS, FLY_SEARCH_DEBOUNCE_MS, FLY_SKIN_TONES, FLY_STANDALONE_AUTH_CONFIG, FLY_THEME_MODE_IDS, FLY_VIEWPORT_IS_MOBILE, 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, FlyCurrencySelectorComponent, FlyDataTableComponent, FlyDatePipe, FlyDateTimePipe, FlyDebouncer, FlyDecimalNumberPipe, FlyDetailCardComponent, FlyDetailShellComponent, FlyDrawerComponent, FlyDurationPipe, FlyDynamicFormComponent, FlyEmojiPickerComponent, FlyFieldComponent, FlyFileDownloadService, FlyFileUploadComponent, FlyFilterPanelComponent, FlyFormBannerComponent, FlyFormFooterComponent, FlyFormGridComponent, FlyFormSectionComponent, FlyFullNumberPipe, FlyGanttComponent, FlyHubClient, FlyIconButtonComponent, FlyIfAdminDirective, FlyIfRoleDirective, FlyImageUploadComponent, FlyLeaderboardComponent, FlyMagicActionsComponent, 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, MAGIC_BAR_SEARCH_WIDTH_DEFAULT, MAGIC_BAR_SEARCH_WIDTH_MAX, MAGIC_BAR_SEARCH_WIDTH_MIN, MagicBarRegistry, MessageBoxButtons, MessageBoxComponent, MessageBoxIcon, MessageBoxService, MockAuthService, NOVA_PRIORITY_TONE, NOVA_STATUS_TONE, NOVA_TONE_FALLBACK, 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, clampMagicBarSearchWidth, clampPage, clampSliderValue, connectRemoteLaunch, enterActivatesNatively, filterGroup, filterSuggestions, findLocaleByDialect, findLocaleByPrefix, firstEnabledIndex, firstModuleIndex, flattenModules, flyAdminGuard, flyApiErrorMessage, flyCaptchaBase64Utf8, flyCaptchaBuildToken, flyCaptchaSha256Hex, flyCompactNumber, flyDebounced, flyDecimalNumber, flyDownloadBlob, flyDuration, flyEmojiFor, flyEmojiIsTonable, flyEmojiPackUrl, flyExportFileName, flyFirstEnabledIndex, flyFormatBytes, flyFormatDate, flyFormatDateTime, flyFormatTime, flyFullNumber, flyNextEnabledIndex, flyNextSegmentIndex, flyRelativeTime, flyResolveActiveTab, flyRoleGuard, flyScanPendingDelayMs, flyScanRetry, flySignedCompact, flySkinToneLabelKey, flyStandaloneAuthGuard, flyStandaloneAuthInterceptor, flyToDateOnly, flyToPage, flyUnwrap, flyUnwrapLenient, hasAnyRoleIn, healNativeFederationCacheOnce, initialExpanded, isAccentColor, isChunkLoadError, isFlyAuthStorePopulated, isNativeFederationCacheError, isRtlLocale, isRtlLocaleEntry, isValidCron, isValidSingleField, loadRemoteStyles, magicBarOwnerKey, magicBarSearchText, matchFlyRoutePattern, nextEnabledIndex, nextModuleIndex, nextSegmentIndex, nextSort, normalizeFlyTheme, normalizeRoles, novaPriorityToneVar, novaStatusToneVar, 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 };
12346
+ 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, CardDensity, CardLayout, ChartTerm, ChildWindowData, ChipTone, ConfirmKind, ConnectRemoteLaunchOptions, ContextMenuAlign, ContextMenuItem, ContextMenuSection, CronAdvancedFieldDef, CronMode, CronParts, CronWeekday, DesktopApp, DesktopAppCategory, DesktopAppKind, DetailSection, DialogResultWithAcknowledgement, EmbeddedSessionProbe, EntityLinkSelection, FilterGroup, FlyAchievementRow, FlyApiError, FlyApiResponse, 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, FlyCurrency, FlyCurrencyFetchFn, FlyCurrencySelectorMode, FlyCurrencySelectorValue, FlyDrawerBodyPadding, FlyDrawerPosition, FlyDrawerSide, FlyDrawerSize, FlyDrawerVariant, FlyEmojiCategory, FlyEmojiCell, FlyEmojiEntry, FlyEmojiPack, FlyEmojiPackEntry, FlyEmojiPackManifest, FlyEmojiPickerSize, FlyEmojiPickerTab, FlyEmojiSection, FlyFileInfo, FlyFileSelection, FlyFormAnswer, FlyFormAnswerValue, FlyFormDefinition, FlyFormFieldOptions, FlyFormOption, FlyFormQuestion, FlyFormQuestionType, FlyFormScoreDisplay, FlyLaunchEventDetail, FlyLaunchRequestDetail, FlyLeaderboardRow, FlyLiveRefreshOptions, FlyLocaleEntry, FlyMagicBarIconName, FlyMetaItem, FlyModerationLoadPageRequest, FlyModerationLockThreadRequest, FlyModerationOpenSubjectRequest, FlyModerationReport, FlyModerationReportPage, FlyModerationResolutionStatus, FlyModerationResolveRequest, FlyNavigableItem, FlyPageMeta, FlyPageResult, FlyPaged, FlyPeoplePickerMode, FlyPeoplePickerOption, FlyPeopleSearchFn, FlyPointsSummary, FlyRemoteContext, FlyRemoteEagerRoute, FlyRemoteLazyRoute, FlyRemoteLoadedComponent, 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, MagicBarAction, MagicBarActionKind, MagicBarActionSpec, MagicBarActionView, MagicBarContribution, MagicBarGroup, MagicBarGroupSpec, MagicBarGroupView, MagicBarOwnerRef, MagicBarPublisher, MagicBarRadioMenu, MagicBarRadioMenuSpec, MagicBarRadioMenuView, MagicBarRadioOption, MagicBarSearch, MagicBarSearchSeed, MagicBarSearchSpec, MagicBarSearchView, MagicBarTextParams, MagicBarTone, MagicBarView, 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, TabsVariant, ToastAction, ToastEntry, ToastOptions, ToastVariant, User, UserPrincipal, UsersTerm, WindowHelpHint, WindowInstance, WindowState };
10741
12347
  //# sourceMappingURL=flyos-design-system.d.ts.map