@flyos/design-system 3.2.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5082,6 +5082,14 @@ interface FlyBreadcrumbItem {
5082
5082
  label: string;
5083
5083
  /** When set, the crumb renders as a real `<a>`. Omit for a `<button>` (e.g. a client-side handler with no addressable URL). */
5084
5084
  href?: string;
5085
+ /**
5086
+ * `<path d="…">` data for a 14px stroked icon leading the crumb
5087
+ * (`fill:none; stroke:currentColor; stroke-width:1.8; stroke-linecap:round;
5088
+ * stroke-linejoin:round`). `currentColor` is what makes the icon tint with
5089
+ * the label on hover/current with no extra rule. Omit for a label-only
5090
+ * crumb — mixing icon and non-icon crumbs in one trail is fine.
5091
+ */
5092
+ iconPath?: string;
5085
5093
  }
5086
5094
  /** An overflow-collapsed middle crumb — never interactive, never emitted by {@link FlyBreadcrumbComponent.navigate}. */
5087
5095
  interface FlyBreadcrumbOverflowMarker {
@@ -5148,6 +5156,100 @@ declare class FlyBreadcrumbComponent {
5148
5156
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyBreadcrumbComponent, "fly-breadcrumb", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "maxVisible": { "alias": "maxVisible"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "hasCurrentPage": { "alias": "hasCurrentPage"; "required": false; "isSignal": true; }; }, { "navigate": "navigate"; }, never, never, true, never>;
5149
5157
  }
5150
5158
 
5159
+ /**
5160
+ * One crumb in a window's header trail.
5161
+ *
5162
+ * Extends the design-system item rather than restating it so `<fly-breadcrumb>`
5163
+ * consumes the published array directly — the shell adds a handler, nothing else.
5164
+ *
5165
+ * Labels are ALREADY LOCALIZED. The trail is an app's own nouns ("Trends",
5166
+ * "Q3 budget", a document title); the window chrome cannot localize those and must
5167
+ * not pretend to by taking a key it would resolve against the shell's bundle.
5168
+ */
5169
+ interface WindowBreadcrumb extends FlyBreadcrumbItem {
5170
+ /**
5171
+ * Invoked when this crumb is activated. The final crumb is the current page and
5172
+ * is never interactive (see `FlyBreadcrumbComponent`), so a handler on it is
5173
+ * dead weight, not a bug waiting to happen.
5174
+ */
5175
+ navigate?: () => void;
5176
+ }
5177
+ /** Cross-bundle store key + sync event — same shape as `FLY_MAGIC_BAR_STORE_KEY`. */
5178
+ declare const FLY_WINDOW_BREADCRUMBS_STORE_KEY = "__flyWindowBreadcrumbs__";
5179
+ declare const FLY_WINDOW_BREADCRUMBS_EVENT = "fly:window-breadcrumbs";
5180
+ /**
5181
+ * Where an app publishes the breadcrumb trail its window's header strip renders.
5182
+ *
5183
+ * The design puts a trail inside the window
5184
+ * (`UX/FlyOS Desktop-app/MainContent.dc.html`, `nav[aria-label="Breadcrumb"]`), and
5185
+ * the window chrome (`WindowComponent`) renders whatever this registry holds for
5186
+ * its window id, falling back to the plain window title when nothing has published.
5187
+ *
5188
+ * ## Why the state lives on `globalThis`
5189
+ *
5190
+ * Same reasoning as {@link MagicBarRegistry} (`services/magic-bar/`), and the same
5191
+ * direction of travel (remote → shell chrome). This service is `providedIn: 'root'`,
5192
+ * but a root instance is not *reliably* shared across the federation boundary: the
5193
+ * shell builds the design system from workspace source while remotes consume the
5194
+ * published package, and Native Federation collapses those into one runtime
5195
+ * instance only when version negotiation succeeds — a split there is invisible at
5196
+ * build time and would otherwise present as a window whose breadcrumb silently
5197
+ * never appears, for federated apps only. Keeping the state on the one substrate
5198
+ * every bundle shares makes this store fork-proof: whichever copy of this service
5199
+ * publishes, every copy's `trail()` agrees. Each instance mirrors the store into a
5200
+ * local signal and re-reads on the sync event, so `WindowComponent`'s template —
5201
+ * which reads `trail()` inside its own reactive context — repaints whichever
5202
+ * bundle actually published.
5203
+ *
5204
+ * Simpler than `MagicBarRegistry` on purpose: a breadcrumb trail is addressed
5205
+ * directly by the window id its publisher already has (via `WINDOW_DATA`), so
5206
+ * there is no owner-vs-active-window arbitration, no per-action indexing and no
5207
+ * publish-fingerprint dedup to carry — `publish()` just replaces the entry.
5208
+ *
5209
+ * ```ts
5210
+ * const win = inject(WINDOW_DATA);
5211
+ * const crumbs = inject(WindowBreadcrumbsRegistry);
5212
+ * crumbs.publish(win.id, [
5213
+ * { id: 'root', label: circleName, navigate: () => this.showList() },
5214
+ * { id: 'trend', label: trend.title },
5215
+ * ]);
5216
+ * ```
5217
+ */
5218
+ declare class WindowBreadcrumbsRegistry {
5219
+ private readonly _trails;
5220
+ private _syncedStore;
5221
+ private _syncedRevision;
5222
+ /** Every published trail, keyed by window id. Reactive — read it inside a template/computed/effect. */
5223
+ readonly all: Signal<ReadonlyMap<string, readonly WindowBreadcrumb[]>>;
5224
+ constructor();
5225
+ /**
5226
+ * This window's published trail, or an empty array.
5227
+ *
5228
+ * A plain method over a signal read, not a per-id `computed`: it is called from
5229
+ * the window template, where the signal read is tracked whatever the call depth,
5230
+ * and a `computed` cache keyed by a mutable window id would outlive its window.
5231
+ */
5232
+ trail(windowId: string): readonly WindowBreadcrumb[];
5233
+ /**
5234
+ * Replace a window's trail. Publishing an empty array is how an app goes back to
5235
+ * showing the plain window title — it is a state, not a clear.
5236
+ */
5237
+ publish(windowId: string, crumbs: readonly WindowBreadcrumb[]): void;
5238
+ /** Drop a window's trail entirely. The window chrome calls this when it is destroyed. */
5239
+ clear(windowId: string): void;
5240
+ /**
5241
+ * Re-read the shared store. Cheap no-op unless a real mutation landed.
5242
+ *
5243
+ * Keys on store IDENTITY as well as revision — see the identical note on
5244
+ * `MagicBarRegistry.sync`: a revision counter alone cannot distinguish "nothing
5245
+ * changed" from "the `globalThis` slot now holds a brand-new store that happens
5246
+ * to be at the same revision" (every spec's `beforeEach` replaces the store).
5247
+ */
5248
+ private sync;
5249
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WindowBreadcrumbsRegistry, never>;
5250
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<WindowBreadcrumbsRegistry>;
5251
+ }
5252
+
5151
5253
  /**
5152
5254
  * A node in a {@link import('./tree-nav.component').FlyTreeNavComponent} tree. The
5153
5255
  * component is a **two-level** disclosure list (sections with pages) — a `children`
@@ -6280,8 +6382,9 @@ interface GanttDependencyDelete {
6280
6382
  * Pure, dependency-free geometry + tree helpers for {@link FlyGanttComponent}.
6281
6383
  *
6282
6384
  * Kept out of the component so the date-scale math (date ⇄ px), the tree flatten/collapse,
6283
- * the group-span aggregation, the dependency-link resolution and the RTL coordinate mapping
6284
- * can all be unit-tested in isolation. Nothing here touches Angular, signals, the DOM, or i18n.
6385
+ * the group-span aggregation, the dependency-link resolution + elbow routing, and the RTL
6386
+ * coordinate mapping can all be unit-tested in isolation. Nothing here touches Angular,
6387
+ * signals, the DOM, or i18n.
6285
6388
  *
6286
6389
  * **Time model.** Every date is normalised to **UTC midnight** so the horizontal scale is
6287
6390
  * DST- and timezone-agnostic: one calendar day is always exactly one grid unit regardless of
@@ -6304,6 +6407,10 @@ interface GanttFlatRow {
6304
6407
  hasChildren: boolean;
6305
6408
  collapsed: boolean;
6306
6409
  }
6410
+ /** Render shape a row resolves to — decides which geometry fields on its VM are meaningful. */
6411
+ type RowShape = 'bar' | 'milestone' | 'group' | 'empty';
6412
+ /** Which end of a bar a link gesture grabbed / was dropped on. */
6413
+ type GanttLinkAnchor = 'start' | 'finish';
6307
6414
  /** A gridline / header cell: logical `x` of its left edge, its pixel `width`, and label. */
6308
6415
  interface GanttTick {
6309
6416
  x: number;
@@ -6313,9 +6420,16 @@ interface GanttTick {
6313
6420
  key: string;
6314
6421
  }
6315
6422
 
6316
- type RowShape = 'bar' | 'milestone' | 'group' | 'empty';
6317
- /** Which end of a bar a link gesture grabbed / was dropped on. */
6318
- type LinkAnchor = 'start' | 'finish';
6423
+ /** An in-flight link drag, in render space. `x0,y0` is the fixed origin; `x1,y1` follows the pointer. */
6424
+ interface GanttLinkGesture {
6425
+ readonly fromId: string;
6426
+ readonly anchor: GanttLinkAnchor;
6427
+ readonly x0: number;
6428
+ readonly y0: number;
6429
+ readonly x1: number;
6430
+ readonly y1: number;
6431
+ }
6432
+
6319
6433
  /** One fully-resolved, render-space row ready for the template. */
6320
6434
  interface GanttRowVm {
6321
6435
  flat: GanttFlatRow;
@@ -6420,36 +6534,22 @@ declare class FlyGanttComponent {
6420
6534
  readonly MIN_LABEL_W = 140;
6421
6535
  readonly MAX_LABEL_W = 720;
6422
6536
  readonly selectedId: _angular_core.WritableSignal<string | null>;
6423
- /** Key (`from~to~type`) of the dependency arrow the user has selected, if any. */
6424
- readonly selectedLinkKey: _angular_core.WritableSignal<string | null>;
6425
6537
  private readonly _collapsed;
6426
6538
  /** Live drag preview `{id,start,end}` folded into geometry while a gesture runs. */
6427
6539
  private readonly _dragPreview;
6428
- /** Rubber-band link gesture render-space anchor + cursor, and its origin row + edge. */
6429
- readonly linkGesture: _angular_core.WritableSignal<{
6430
- fromId: string;
6431
- anchor: LinkAnchor;
6432
- x0: number;
6433
- y0: number;
6434
- x1: number;
6435
- y1: number;
6436
- } | null>;
6437
6540
  readonly dragTooltip: _angular_core.WritableSignal<{
6438
6541
  x: number;
6439
6542
  y: number;
6440
6543
  text: string;
6441
6544
  } | null>;
6442
6545
  /** True while a divider drag is in flight (suppresses text selection host-wide). */
6443
- readonly resizingLabels: _angular_core.WritableSignal<boolean>;
6444
6546
  /** User-chosen pane width; `null` = still following the {@link labelWidth} input. */
6445
- private readonly _labelWidthOverride;
6446
6547
  private readonly bodyRef;
6447
6548
  readonly rtl: _angular_core.Signal<boolean>;
6448
6549
  readonly pxPerDay: _angular_core.Signal<number>;
6449
6550
  readonly domain: _angular_core.Signal<GanttDomain>;
6450
6551
  readonly innerWidth: _angular_core.Signal<number>;
6451
6552
  /** Label-pane width actually rendered — the user's dragged width, else the input. */
6452
- readonly effectiveLabelWidth: _angular_core.Signal<number>;
6453
6553
  /** Full visible list after tree flatten/collapse. */
6454
6554
  private readonly _flat;
6455
6555
  /** Capped list actually rendered. */
@@ -6482,21 +6582,19 @@ declare class FlyGanttComponent {
6482
6582
  /** Inline-start label indent for a tree depth. */
6483
6583
  indentFor(depth: number): number;
6484
6584
  /**
6485
- * Pointer-drag the divider. Forward-in-time is `+x` LTR and `-x` RTL, and the label pane sits
6486
- * on the inline-start side in both, so the same sign flip that mirrors the timeline also
6487
- * mirrors "drag outward = wider".
6585
+ * The divider's own state machine, in {@link GanttLabelPane}. It is composed rather than
6586
+ * inlined because it is the one region of this component with no coupling to the chart: give it
6587
+ * a direction, a fallback width and somewhere to report a committed value and it is complete.
6588
+ * The subtle part — that "wider" flips physical sign under RTL for BOTH the drag and the arrow
6589
+ * keys — is stated once there instead of twice here.
6488
6590
  */
6591
+ private readonly _labelPane;
6592
+ /** Painted width of the label pane — the user's dragged value, else the clamped input. */
6593
+ readonly effectiveLabelWidth: _angular_core.Signal<number>;
6594
+ /** True mid-drag; drives the host's resizing cursor/affordance. */
6595
+ readonly resizingLabels: _angular_core.WritableSignal<boolean>;
6489
6596
  onLabelResizePointerDown(ev: PointerEvent): void;
6490
- /**
6491
- * Keyboard resize on the focused divider. ArrowRight/Left grow/shrink by the *inline* meaning
6492
- * of the key, so under RTL the arrow that points away from the pane is still the one that
6493
- * widens it. `Home`/`End` jump to the bounds, Enter/Escape restore the input width.
6494
- *
6495
- * Typed `Event` for the same reason as {@link onLabelRowKeydown}: Angular's strict template
6496
- * checker types `(keydown)` `$event` as `Event`, so the cast is done here once.
6497
- */
6498
6597
  onLabelResizeKeydown(ev: Event): void;
6499
- /** Drop the user's dragged width and fall back to the {@link labelWidth} input. */
6500
6598
  resetLabelWidth(): void;
6501
6599
  isCollapsed(id: string): boolean;
6502
6600
  toggleCollapse(id: string, ev?: Event): void;
@@ -6516,13 +6614,19 @@ declare class FlyGanttComponent {
6516
6614
  private _nudgeSelected;
6517
6615
  onBarPointerDown(ev: PointerEvent, vm: GanttRowVm, mode: 'move' | 'resize-start' | 'resize-end'): void;
6518
6616
  /**
6519
- * Start a link gesture from one end of a bar. Which end it started on, plus which end of the
6520
- * target row it is dropped nearest to, is what selects the {@link GanttDependencyType}so all
6521
- * four MS-Project relationships are reachable with the same single drag.
6617
+ * The dependency-drawing gesture, in {@link GanttLinkGestures}. Composed rather than inlined
6618
+ * because it is a self-contained second gesture whose interesting part is a RULE the end you
6619
+ * start on plus the end you drop nearest, selects the relationship type — which reads far better beside
6620
+ * its own hit-testing than in the middle of this component.
6522
6621
  */
6523
- onLinkPointerDown(ev: PointerEvent, vm: GanttRowVm, anchor: LinkAnchor): void;
6622
+ private readonly _links;
6623
+ /** Key (`from~to~type`) of the dependency arrow the user has selected, if any. */
6624
+ readonly selectedLinkKey: _angular_core.WritableSignal<string | null>;
6625
+ /** The in-flight rubber-band gesture, or `null` — the template draws it when present. */
6626
+ readonly linkGesture: _angular_core.WritableSignal<GanttLinkGesture | null>;
6524
6627
  /** Rubber-band path for an in-flight link gesture (render space). */
6525
6628
  readonly linkGesturePath: _angular_core.Signal<string | null>;
6629
+ onLinkPointerDown(ev: PointerEvent, vm: GanttRowVm, anchor: GanttLinkAnchor): void;
6526
6630
  /**
6527
6631
  * Resolve a row's `backgroundColor` into the low-alpha band colour actually painted.
6528
6632
  * `color-mix` does the fade in the consumer's own colour space, so a token, a hex, an
@@ -6530,28 +6634,6 @@ declare class FlyGanttComponent {
6530
6634
  */
6531
6635
  private _tintFor;
6532
6636
  private _mapTicks;
6533
- /**
6534
- * Route a dependency elbow for any of the four relationship kinds (render space).
6535
- *
6536
- * The kind names the two endpoints, so it decides both the anchor x's and the direction the
6537
- * arrow travels: leaving a *finish* edge moves forward in time, leaving a *start* edge moves
6538
- * backward; entering a *start* edge approaches from behind, entering a *finish* edge from
6539
- * ahead. `fwd` folds RTL in, so none of that branches on direction.
6540
- *
6541
- * One turn suffices when the entry stub lies ahead of the exit stub in the approach
6542
- * direction. When it does not — overlapping or reversed bars, which SS/FF/SF hit constantly —
6543
- * a straight drop would cut back through the bars, so the elbow detours via the gap between
6544
- * the two rows instead.
6545
- */
6546
- private _route;
6547
- /** Convert a pointer event to a coordinate inside the body SVG (render space). */
6548
- private _toBodyPoint;
6549
- /**
6550
- * The row a link gesture was dropped on **and which of its ends** the drop landed nearest —
6551
- * the second half of the type derivation. A milestone has no width, so both of its ends are
6552
- * the same point and it is reported as `start`, giving the FS/SS pair anyone actually wants.
6553
- */
6554
- private _dropTargetAt;
6555
6637
  private _ariaFor;
6556
6638
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyGanttComponent, never>;
6557
6639
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyGanttComponent, "fly-gantt", never, { "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "dependencies": { "alias": "dependencies"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "showToday": { "alias": "showToday"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "labelWidth": { "alias": "labelWidth"; "required": false; "isSignal": true; }; "resizableLabels": { "alias": "resizableLabels"; "required": false; "isSignal": true; }; "rowHeight": { "alias": "rowHeight"; "required": false; "isSignal": true; }; "maxRows": { "alias": "maxRows"; "required": false; "isSignal": true; }; }, { "rowDatesChange": "rowDatesChange"; "dependencyCreate": "dependencyCreate"; "dependencyDelete": "dependencyDelete"; "rowClick": "rowClick"; "rowDblClick": "rowDblClick"; "labelWidthChange": "labelWidthChange"; }, never, never, true, never>;
@@ -7871,7 +7953,13 @@ interface MagicBarActionSpec {
7871
7953
  /** What a publisher supplies for one action. */
7872
7954
  interface MagicBarAction extends MagicBarActionSpec {
7873
7955
  readonly menu?: MagicBarRadioMenu;
7874
- readonly onSelect?: () => void;
7956
+ /**
7957
+ * Invoked on activation. The argument is the DOM element the renderer painted
7958
+ * for this action — see {@link MagicBarActionView.run} for why it is passed and
7959
+ * what a publisher may do with it. Ignore it and this is the zero-argument
7960
+ * handler it has always been.
7961
+ */
7962
+ readonly onSelect?: (trigger?: HTMLElement) => void;
7875
7963
  }
7876
7964
  /**
7877
7965
  * What the shell renders. `run()` always exists and always dispatches to the
@@ -7880,7 +7968,43 @@ interface MagicBarAction extends MagicBarActionSpec {
7880
7968
  */
7881
7969
  interface MagicBarActionView extends MagicBarActionSpec {
7882
7970
  readonly menu: MagicBarRadioMenuView | null;
7883
- run(): void;
7971
+ /**
7972
+ * Fire the publisher's newest handler for this id.
7973
+ *
7974
+ * ## Why it carries the trigger element
7975
+ * An action that opens a POPOVER the publisher owns — the canonical case is a
7976
+ * listing screen's advanced-filter panel — has to position that popover under
7977
+ * the button the user just pressed. The publisher cannot find that button:
7978
+ * embedded, it is painted by `fly-magic-actions` inside the shell's top-bar
7979
+ * pill, in the shell's DOM, several stacking contexts and one federation
7980
+ * boundary away from the remote that published the action. Before this argument
7981
+ * existed, PPM's projects register had to anchor its panel to its own page
7982
+ * header instead, which put the panel in the middle of the window while the
7983
+ * button that opened it sat in the chrome above — an affordance with no visible
7984
+ * relationship to its own trigger.
7985
+ *
7986
+ * Passing the element rather than modelling the popover is deliberate. The
7987
+ * panel's CONTENT is app schema (see {@link MagicBarSearch.onOpenFilters} for
7988
+ * the same ruling), so it must stay in the publisher's own DOM and injection
7989
+ * context; only its POSITION is chrome-relative. An element reference crosses
7990
+ * the federation boundary without any of the coupling a descriptor would need —
7991
+ * a DOM node is a DOM node in every bundle. `fly-filter-panel`'s `[anchorEl]`
7992
+ * is the intended consumer.
7993
+ *
7994
+ * ## What a publisher must not assume
7995
+ * The element is the trigger AS PAINTED RIGHT NOW. It is valid for the duration
7996
+ * of the popover, not beyond: a re-publish that drops this action id destroys it
7997
+ * (`@for (…; track action.id)`), and a mode switch repaints it in a different
7998
+ * chrome entirely. Hold it in a signal the popover's open-state clears, never in
7999
+ * long-lived state, and never mutate it.
8000
+ *
8001
+ * It is OPTIONAL because not every renderer has one to give — a keyboard-driven
8002
+ * invocation, a synthetic call in a test, an inline composer that paints no
8003
+ * button. A publisher that receives `undefined` must still work: for a popover
8004
+ * that means falling back to its own in-page anchoring, which is exactly what
8005
+ * `fly-filter-panel` does when `[anchorEl]` is null.
8006
+ */
8007
+ run(trigger?: HTMLElement): void;
7884
8008
  }
7885
8009
  /** Render surface of a group — the dedupe key for {@link MagicBarGroup}. */
7886
8010
  interface MagicBarGroupSpec {
@@ -7982,7 +8106,7 @@ interface MagicBarSearch extends MagicBarSearchSpec {
7982
8106
  * a descriptor for them would be business logic the design system cannot
7983
8107
  * validate or render honestly.
7984
8108
  */
7985
- readonly onOpenFilters?: () => void;
8109
+ readonly onOpenFilters?: (trigger?: HTMLElement) => void;
7986
8110
  }
7987
8111
  interface MagicBarSearchView extends MagicBarSearchSpec {
7988
8112
  /** True iff the publisher can open an advanced-search overlay. */
@@ -7994,7 +8118,13 @@ interface MagicBarSearchView extends MagicBarSearchSpec {
7994
8118
  * this member shipped first, and renaming it would be a ds-compat MAJOR.
7995
8119
  */
7996
8120
  query(text: string): void;
7997
- openFilters(): void;
8121
+ /**
8122
+ * Open the publisher's advanced-search overlay. Carries the Filters button the
8123
+ * shell painted, for the same reason and under the same caveats as
8124
+ * {@link MagicBarActionView.run} — a publisher whose overlay is a popover
8125
+ * anchors it there instead of guessing at a position inside its own page.
8126
+ */
8127
+ openFilters(trigger?: HTMLElement): void;
7998
8128
  }
7999
8129
  /**
8000
8130
  * One view's complete claim on the magic bar.
@@ -9795,6 +9925,15 @@ type FlyCurrencySelectorMode = 'single' | 'multi';
9795
9925
  * reference data through its own gateway route.
9796
9926
  */
9797
9927
  type FlyCurrencyFetchFn = () => Observable<readonly FlyCurrency[]>;
9928
+ /**
9929
+ * Host-supplied loader for the CALLING TENANT's default currency, used to pre-fill an empty
9930
+ * single-select. Same escape hatch as {@link FlyCurrencyFetchFn}, for the same consumers: an
9931
+ * offline surface, a fixture-driven test, or an app that proxies the platform's reference routes.
9932
+ *
9933
+ * Resolving to `null` means "this tenant has no default" and leaves the control empty — the
9934
+ * ordinary answer for a tenant with no country, not an error.
9935
+ */
9936
+ type FlyTenantDefaultCurrencyFetchFn = () => Observable<FlyCurrency | null>;
9798
9937
  /** The control's value: the picked code in single mode, the picked codes in multi mode. */
9799
9938
  type FlyCurrencySelectorValue = string | readonly string[] | null;
9800
9939
 
@@ -9869,6 +10008,30 @@ declare class FlyCurrencySelectorComponent implements ControlValueAccessor {
9869
10008
  readonly currencies: _angular_core.InputSignal<readonly FlyCurrency[] | null>;
9870
10009
  /** Host-supplied loader, used when `[currencies]` is absent. Falls back to `GET /api/currencies/brief`. */
9871
10010
  readonly fetchFn: _angular_core.InputSignal<FlyCurrencyFetchFn | null>;
10011
+ /**
10012
+ * Pre-fill an EMPTY single-select with the calling tenant's default currency
10013
+ * (`GET /api/currencies/default`, or `[tenantDefaultFetchFn]`). On by default.
10014
+ *
10015
+ * An amount is nearly always denominated in the tenant's reporting currency, and a form that
10016
+ * opens empty makes every user restate a fact the platform already holds — while an untouched
10017
+ * field silently saves null, which downstream money formatting cannot render at all.
10018
+ *
10019
+ * Deliberately narrow. It applies only when ALL of these hold, because outside them a
10020
+ * preselection would be a guess rather than a default:
10021
+ * - `mode="single"` — a multi-select accumulates a SET, and seeding one member of a set
10022
+ * states something the tenant currency does not say.
10023
+ * - not `locked()` — a frozen value is authoritative; proposing one contradicts the lock.
10024
+ * - the control is still empty — a written value always wins.
10025
+ *
10026
+ * It fires at most once per instance: clearing the field by hand latches it off, so the value
10027
+ * cannot reappear and read as the clear having not registered.
10028
+ *
10029
+ * A host that supplied `[currencies]` or `[fetchFn]` is never taken to the platform endpoint —
10030
+ * see {@link tenantDefaultFetchFn}, which is how such a host opts back in.
10031
+ */
10032
+ readonly applyTenantDefault: _angular_core.InputSignal<boolean>;
10033
+ /** Host-supplied loader for {@link applyTenantDefault}. Falls back to `GET /api/currencies/default`. */
10034
+ readonly tenantDefaultFetchFn: _angular_core.InputSignal<FlyTenantDefaultCurrencyFetchFn | null>;
9872
10035
  /** Restrict the offered set to these ISO 4217 codes (case-insensitive). Empty = offer everything. */
9873
10036
  readonly allowedCodes: _angular_core.InputSignal<readonly string[]>;
9874
10037
  /**
@@ -9927,6 +10090,12 @@ declare class FlyCurrencySelectorComponent implements ControlValueAccessor {
9927
10090
  private readonly _selectedCodes;
9928
10091
  private readonly _cvaDisabled;
9929
10092
  private _fetchStarted;
10093
+ /** Guards the once-per-instance tenant-default resolve. */
10094
+ private _tenantDefaultStarted;
10095
+ /** Latches once the default has been applied, or ruled out by any commit (pick, clear, write). */
10096
+ private _tenantDefaultSettled;
10097
+ /** The resolved row, kept so a `writeValue(null)` arriving AFTER the fetch can still use it. */
10098
+ private _tenantDefaultRow;
9930
10099
  private readonly searchEl?;
9931
10100
  private readonly triggerEl?;
9932
10101
  private _onChange;
@@ -9987,6 +10156,14 @@ declare class FlyCurrencySelectorComponent implements ControlValueAccessor {
9987
10156
  onOptionHover(index: number): void;
9988
10157
  retry(): void;
9989
10158
  private _load;
10159
+ private _loadTenantDefault;
10160
+ /**
10161
+ * Applies the resolved default to a still-empty control.
10162
+ *
10163
+ * Called from both ends of a race with no fixed winner: the fetch may land before the forms
10164
+ * layer writes, or after it writes the empty value a form is built with.
10165
+ */
10166
+ private _applyTenantDefaultIfEmpty;
9990
10167
  writeValue(value: FlyCurrencySelectorValue): void;
9991
10168
  registerOnChange(fn: (v: FlyCurrencySelectorValue) => void): void;
9992
10169
  registerOnTouched(fn: () => void): void;
@@ -9996,7 +10173,7 @@ declare class FlyCurrencySelectorComponent implements ControlValueAccessor {
9996
10173
  private _commit;
9997
10174
  private _touch;
9998
10175
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyCurrencySelectorComponent, never>;
9999
- 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; }; "locked": { "alias": "locked"; "required": false; "isSignal": true; }; "lockedReasonKey": { "alias": "lockedReasonKey"; "required": false; "isSignal": true; }; "lockedReasonParams": { "alias": "lockedReasonParams"; "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>;
10176
+ 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; }; "applyTenantDefault": { "alias": "applyTenantDefault"; "required": false; "isSignal": true; }; "tenantDefaultFetchFn": { "alias": "tenantDefaultFetchFn"; "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; }; "locked": { "alias": "locked"; "required": false; "isSignal": true; }; "lockedReasonKey": { "alias": "lockedReasonKey"; "required": false; "isSignal": true; }; "lockedReasonParams": { "alias": "lockedReasonParams"; "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>;
10000
10177
  }
10001
10178
 
10002
10179
  /** The platform endpoint the catalogue reads. Relative — the host's gateway + auth interceptors apply. */
@@ -10015,6 +10192,21 @@ declare const FLY_CURRENCIES_BRIEF_ENDPOINT = "/api/currencies/brief";
10015
10192
  * `GET /api/currencies/brief` is allowed to return.
10016
10193
  */
10017
10194
  declare function flyUnwrapCurrencies(res: unknown): readonly FlyCurrency[];
10195
+ /** The platform endpoint serving the CALLING TENANT's default currency. Relative, like its
10196
+ * catalogue sibling — the host's gateway + auth interceptors apply, and the answer is scoped to
10197
+ * whatever tenant that auth resolves to. */
10198
+ declare const FLY_CURRENCY_DEFAULT_ENDPOINT = "/api/currencies/default";
10199
+ /**
10200
+ * Unwraps the single-row shape of `GET /api/currencies/default`.
10201
+ *
10202
+ * `null` is a SUCCESS answer, not a failure: a tenant with no country has no default currency,
10203
+ * and a platform-scoped caller has no tenant whose currency could be meant. Anything that is not
10204
+ * recognisably a currency row — an envelope with `data: null`, an error body, an HTML login page
10205
+ * from a misrouted request — collapses to `null` for the same reason
10206
+ * {@link flyUnwrapCurrencies} returns `[]`: a picker must degrade to "no preselection", never
10207
+ * preselect something the platform did not vouch for.
10208
+ */
10209
+ declare function flyUnwrapCurrency(res: unknown): FlyCurrency | null;
10018
10210
  /**
10019
10211
  * **`FlyCurrencyCatalogService`** — the one ISO-code → {@link FlyCurrency} adapter for the
10020
10212
  * platform currency catalogue (`GET /api/currencies/brief`).
@@ -10340,11 +10532,29 @@ declare class FlyClickOutsideDirective {
10340
10532
  * Defaults to always-on for an always-mounted consumer.
10341
10533
  */
10342
10534
  readonly enabled: _angular_core.InputSignal<boolean>;
10535
+ /**
10536
+ * Extra element(s) that count as INSIDE even though they are not in the host —
10537
+ * the escape hatch for a popover whose TRIGGER cannot be wrapped by the host.
10538
+ *
10539
+ * The docblock's canonical shape puts the host around trigger and panel both, and
10540
+ * that is still the right answer whenever it is available. It is not always: a
10541
+ * panel anchored to a control in the desktop shell's chrome (a magic-bar filter
10542
+ * toggle) has its trigger in another component, another stacking context and
10543
+ * another bundle. Left unlisted, the trigger reads as outside, and because this
10544
+ * directive fires on `pointerdown` — strictly BEFORE the trigger's own `click` —
10545
+ * pressing an open panel's own toggle dismisses it and the toggle then reopens it.
10546
+ * The panel appears not to close at all, which reads as this directive being
10547
+ * broken rather than as an ordering problem.
10548
+ *
10549
+ * A single element or an array; `null`/empty (the default) keeps the host-only
10550
+ * behaviour byte-for-byte.
10551
+ */
10552
+ readonly ignore: _angular_core.InputSignal<HTMLElement | readonly (HTMLElement | null)[] | null>;
10343
10553
  /** Emitted once when a pointer press lands outside the host while enabled. */
10344
10554
  readonly flyClickOutside: _angular_core.OutputEmitterRef<void>;
10345
10555
  protected onDocumentPointerDown(event: Event): void;
10346
10556
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyClickOutsideDirective, never>;
10347
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FlyClickOutsideDirective, "[flyClickOutside]", never, { "enabled": { "alias": "flyClickOutsideEnabled"; "required": false; "isSignal": true; }; }, { "flyClickOutside": "flyClickOutside"; }, never, never, true, never>;
10557
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FlyClickOutsideDirective, "[flyClickOutside]", never, { "enabled": { "alias": "flyClickOutsideEnabled"; "required": false; "isSignal": true; }; "ignore": { "alias": "flyClickOutsideIgnore"; "required": false; "isSignal": true; }; }, { "flyClickOutside": "flyClickOutside"; }, never, never, true, never>;
10348
10558
  }
10349
10559
 
10350
10560
  /**
@@ -11528,9 +11738,43 @@ declare class FlyPaginationComponent {
11528
11738
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyPaginationComponent, "fly-pagination", never, { "page": { "alias": "page"; "required": true; "isSignal": true; }; "totalPages": { "alias": "totalPages"; "required": true; "isSignal": true; }; "rangeText": { "alias": "rangeText"; "required": false; "isSignal": true; }; "showEdges": { "alias": "showEdges"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; }, never, never, true, never>;
11529
11739
  }
11530
11740
 
11741
+ declare function canGoPrev$1(page: number): boolean;
11742
+ declare function canGoNext$1(page: number, totalPages: number): boolean;
11743
+ /** Clamp a requested page into `[1, max(1, totalPages)]`. */
11744
+ declare function clampPage$1(page: number, totalPages: number): number;
11745
+
11746
+ /**
11747
+ * Numbered list pager — back arrow, one pill per page, forward arrow — for the
11748
+ * lists that want every page as a target rather than `fly-pagination`'s
11749
+ * «prev / page of total / next» band. Shares the list's surface and continues
11750
+ * its border (see `COMPONENTS.md`): pair with a list container that sets
11751
+ * `border-bottom: 0` so the two read as one panel.
11752
+ *
11753
+ * <fly-pager [page]="page()" [totalPages]="totalPages()" (goToPage)="goTo($event)" />
11754
+ *
11755
+ * `page`/the emitted target are 0-indexed (array-index pagination); buttons
11756
+ * display `page + 1`. This is the opposite convention from `fly-pagination`
11757
+ * (1-indexed) — the two are separate components for separate list shapes, not
11758
+ * a shared base, so pick the one matching how the caller already indexes its
11759
+ * pages rather than converting at the call site.
11760
+ */
11761
+ declare class FlyPagerComponent {
11762
+ readonly page: _angular_core.InputSignal<number>;
11763
+ readonly totalPages: _angular_core.InputSignal<number>;
11764
+ /** Emits the target page (already clamped to bounds), 0-indexed. */
11765
+ readonly goToPage: _angular_core.OutputEmitterRef<number>;
11766
+ protected readonly prevEnabled: _angular_core.Signal<boolean>;
11767
+ protected readonly nextEnabled: _angular_core.Signal<boolean>;
11768
+ protected readonly pages: _angular_core.Signal<number[]>;
11769
+ protected goTo(target: number): void;
11770
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyPagerComponent, never>;
11771
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyPagerComponent, "fly-pager", never, { "page": { "alias": "page"; "required": true; "isSignal": true; }; "totalPages": { "alias": "totalPages"; "required": true; "isSignal": true; }; }, { "goToPage": "goToPage"; }, never, never, true, never>;
11772
+ }
11773
+
11774
+ /** 0-indexed sibling of `pagination.logic.ts` — see `pager.component.ts` for why. */
11531
11775
  declare function canGoPrev(page: number): boolean;
11532
11776
  declare function canGoNext(page: number, totalPages: number): boolean;
11533
- /** Clamp a requested page into `[1, max(1, totalPages)]`. */
11777
+ /** Clamp a requested page into `[0, max(0, totalPages - 1)]`. */
11534
11778
  declare function clampPage(page: number, totalPages: number): number;
11535
11779
 
11536
11780
  type CardLayout = 'row' | 'column';
@@ -11692,6 +11936,18 @@ declare class FlyCardActionsComponent {
11692
11936
  * - Deferred pages set `showSearchButton` true, drop the per-field handlers,
11693
11937
  * and commit staged criteria on `(search)`.
11694
11938
  *
11939
+ * ## Three placements, and how to pick one
11940
+ * - **In flow** (neither `anchored` nor `anchorEl`) — a block in the page. Opening
11941
+ * it pushes the content below it down. Only right for a page whose filters are
11942
+ * part of its permanent furniture.
11943
+ * - **`[anchored]`** — a dropdown pinned to the trailing edge of a `position:
11944
+ * relative` ancestor the page supplies (the wrapper around its search box).
11945
+ * - **`[anchorEl]`** — a dropdown pinned to a specific ELEMENT anywhere on screen,
11946
+ * including one outside this component's own DOM subtree. See {@link anchorEl}.
11947
+ *
11948
+ * `anchorEl` wins when both are set, so a page can bind it optionally and fall
11949
+ * back to `anchored` in whichever mode has no element to offer.
11950
+ *
11695
11951
  * Matching the source, the panel renders nothing while `open` is false.
11696
11952
  */
11697
11953
  declare class FlyFilterPanelComponent {
@@ -11710,19 +11966,100 @@ declare class FlyFilterPanelComponent {
11710
11966
  * `[expandable]`.
11711
11967
  */
11712
11968
  readonly anchored: _angular_core.InputSignal<boolean>;
11969
+ /**
11970
+ * The element this panel hangs off — a dropdown pinned under a specific trigger
11971
+ * rather than under whichever ancestor happens to be positioned.
11972
+ *
11973
+ * ## The case it exists for
11974
+ * A listing screen's filter toggle does not necessarily live in the screen.
11975
+ * Embedded in the desktop shell, the toggle is a magic-bar action painted by
11976
+ * `fly-magic-actions` in the top-bar pill — the shell's DOM, above the window,
11977
+ * across a federation boundary. `[anchored]` cannot reach it: it pins to a
11978
+ * positioned ancestor, and the nearest one is inside the app's own page header.
11979
+ * PPM's projects register shipped exactly that way, and the result was a panel
11980
+ * floating mid-window while the button that opened it sat in the chrome above,
11981
+ * with nothing tying the two together. `MagicBarActionView.run(trigger)` hands
11982
+ * the publisher that button; binding it here is the other half.
11983
+ *
11984
+ * ## What changes when it is set
11985
+ * The host is **portalled to `<body>`** and switched to `position: fixed`. Both
11986
+ * are forced rather than chosen: a shell window establishes a containing block
11987
+ * (`transform` / `backdrop-filter`) and clips its content box, so a panel left in
11988
+ * the app's subtree resolves `fixed` against the window instead of the viewport
11989
+ * AND is clipped at the window's top edge — which is exactly where a panel
11990
+ * hanging off the chrome above it needs to paint. Placement is then measured from
11991
+ * the anchor's rect on every open, resize and scroll, mirrored under RTL, and
11992
+ * clamped so a trigger near a viewport edge still opens fully on screen.
11993
+ *
11994
+ * ## Lifetime
11995
+ * `null` (the default) restores the in-flow/`anchored` behaviour, and the host
11996
+ * returns to where it was declared. Bind it to a signal your open-state clears —
11997
+ * the element the magic bar hands you is the button AS PAINTED, and a re-publish
11998
+ * or a mode switch destroys it.
11999
+ */
12000
+ readonly anchorEl: _angular_core.InputSignal<HTMLElement | null>;
11713
12001
  /** Clear-filters pressed — the page resets its own filter state. */
11714
12002
  readonly cleared: _angular_core.OutputEmitterRef<void>;
11715
- /** Close (×) pressed — the page flips its open flag. */
12003
+ /** Close (×) pressed, or a dismissing press outside — the page flips its open flag. */
11716
12004
  readonly closed: _angular_core.OutputEmitterRef<void>;
11717
12005
  /** Search pressed — deferred pages commit staged criteria and query. */
11718
12006
  readonly searched: _angular_core.OutputEmitterRef<void>;
11719
12007
  /** Whether the `[filter-more]` advanced fields are revealed. */
11720
12008
  protected readonly showMore: _angular_core.WritableSignal<boolean>;
12009
+ /** True while the panel is a `<body>`-portalled, anchor-positioned dropdown. */
12010
+ protected readonly floating: _angular_core.Signal<boolean>;
12011
+ /**
12012
+ * Whether a press outside the panel should dismiss it.
12013
+ *
12014
+ * Only while the panel FLOATS over the page. In flow it is a block OF the page,
12015
+ * and closing it because the user clicked the table it filters would discard
12016
+ * staged criteria on an unrelated interaction. Floating, the opposite holds: an
12017
+ * overlay that survives a click elsewhere is the "panel will not collapse on
12018
+ * click-away" bug.
12019
+ */
12020
+ protected readonly dismissable: _angular_core.Signal<boolean>;
11721
12021
  private readonly _host;
12022
+ private readonly _doc;
11722
12023
  private readonly _destroyRef;
11723
12024
  private _clipObserver;
11724
12025
  private _placeRaf;
12026
+ /** Marks where the host was declared, so un-portalling puts it back exactly. */
12027
+ private _portalHome;
12028
+ private _floatTeardown;
11725
12029
  constructor();
12030
+ /**
12031
+ * Move the host to `<body>`, leaving a comment node where it was declared.
12032
+ *
12033
+ * The comment is what makes this reversible. Angular keeps rendering into the
12034
+ * host wherever it sits — relocating a DOM node does not detach a view — but the
12035
+ * component cannot ask the DOM "where were you?" after the fact, and the original
12036
+ * parent may itself be torn down while the panel is open. Un-portalling therefore
12037
+ * re-inserts before the marker while the marker is still attached, and simply
12038
+ * leaves the host where it is otherwise.
12039
+ */
12040
+ private _portal;
12041
+ private _unportal;
12042
+ /**
12043
+ * Pin the panel under {@link anchorEl}: {@link ANCHOR_GAP} below its bottom edge,
12044
+ * its trailing edge overhanging the anchor's by {@link ANCHOR_OVERHANG}, clamped
12045
+ * into the viewport on both axes.
12046
+ *
12047
+ * Trailing edge, not "right": the anchor's OWN computed direction decides which
12048
+ * physical side that is, so the panel opens inward from the trigger under both LTR
12049
+ * and RTL with nothing passed by the caller. The final clamp is in physical pixels
12050
+ * and therefore direction-agnostic — a trigger 30px from the viewport edge yields
12051
+ * the same on-screen result either way.
12052
+ */
12053
+ private _placeFloating;
12054
+ /**
12055
+ * Re-place on anything that can move the anchor under an already-open panel: the
12056
+ * viewport resizing, the shell window being dragged or resized (which moves or
12057
+ * resizes the anchor's own box), and scrolling ANYWHERE — captured, because the
12058
+ * anchor lives in the chrome and the scroller that shifts it is not necessarily an
12059
+ * ancestor of this host, which is now in `<body>`.
12060
+ */
12061
+ private _observeFloating;
12062
+ private _teardownFloating;
11726
12063
  private _place;
11727
12064
  /** Nearest ancestor that clips/scrolls horizontally — the shell window's
11728
12065
  * content area when hosted, a page scroller when standalone, else null
@@ -11731,7 +12068,7 @@ declare class FlyFilterPanelComponent {
11731
12068
  private _observeClipAncestor;
11732
12069
  private _teardownPlacement;
11733
12070
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyFilterPanelComponent, never>;
11734
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyFilterPanelComponent, "fly-filter-panel", never, { "open": { "alias": "open"; "required": true; "isSignal": true; }; "titleKey": { "alias": "titleKey"; "required": false; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "hasMore": { "alias": "hasMore"; "required": false; "isSignal": true; }; "showSearchButton": { "alias": "showSearchButton"; "required": false; "isSignal": true; }; "anchored": { "alias": "anchored"; "required": false; "isSignal": true; }; }, { "cleared": "cleared"; "closed": "closed"; "searched": "searched"; }, never, ["[filter-status]", "*", "[filter-more]"], true, never>;
12071
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyFilterPanelComponent, "fly-filter-panel", never, { "open": { "alias": "open"; "required": true; "isSignal": true; }; "titleKey": { "alias": "titleKey"; "required": false; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "hasMore": { "alias": "hasMore"; "required": false; "isSignal": true; }; "showSearchButton": { "alias": "showSearchButton"; "required": false; "isSignal": true; }; "anchored": { "alias": "anchored"; "required": false; "isSignal": true; }; "anchorEl": { "alias": "anchorEl"; "required": false; "isSignal": true; }; }, { "cleared": "cleared"; "closed": "closed"; "searched": "searched"; }, never, ["[filter-status]", "*", "[filter-more]"], true, never>;
11735
12072
  }
11736
12073
 
11737
12074
  interface FlyCellContext {
@@ -12621,13 +12958,39 @@ interface SegmentedOption {
12621
12958
  declare function nextSegmentIndex(current: number, key: string, length: number, rtl: boolean): number | null;
12622
12959
 
12623
12960
  /**
12624
- * Segmented radiogroup one anatomy for form segmented controls (the
12625
- * llm-throttle level picker) and list status-pill filters (the legacy
12626
- * `.signals-page-statusfilter`, which is also the visual source).
12961
+ * Visual anatomy. `'track'` (default) is the enclosed pill-in-a-groove control
12962
+ * the detail-tabs recipe (D2 §1.3). `'pills'` is the canon Filters dialog's status
12963
+ * row (`Home.dc.html`, `role="radiogroup"` under the "Status" eyebrow): freestanding
12964
+ * bordered pills that wrap, with the selection filled in `--accent`.
12627
12965
  *
12628
- * a11y: `role="radiogroup"` + `role="radio"` segments, roving tabindex
12629
- * (selected segment is the tab stop), RTL-aware arrow-key navigation with
12630
- * wrap-around; arrows move both selection and focus.
12966
+ * They are one component because they are one control — same option list, same
12967
+ * selection model, same keyboard behaviour differing only in whether the group
12968
+ * paints a container around itself. They are not one STYLE because the track's
12969
+ * `--w14` selection reads as a tab among tabs, which is right inside a groove and
12970
+ * wrong for a filter row where the pills sit directly on a panel plate.
12971
+ */
12972
+ type SegmentedVariant = 'track' | 'pills';
12973
+ /**
12974
+ * Segmented control — one anatomy for form segmented controls (the llm-throttle
12975
+ * level picker), list status-pill filters (the legacy `.signals-page-statusfilter`,
12976
+ * which is also the visual source), and the canon filter-panel status row.
12977
+ *
12978
+ * ## Two selection models
12979
+ * Single-select (default) is a `role="radiogroup"` over `role="radio"` segments,
12980
+ * driven by {@link value}. Multi-select ({@link multiple}) is a `role="group"` of
12981
+ * `aria-pressed` toggle buttons, driven by {@link values}. Both are here rather than
12982
+ * split across two components because everything a reader has to learn — the option
12983
+ * list, the count badge, the two variants, the RTL handling — is shared, and a filter
12984
+ * row routinely needs the multi-select one while looking identical.
12985
+ *
12986
+ * The a11y models genuinely differ and the branch is not cosmetic: a radiogroup is
12987
+ * ONE tab stop with arrow keys moving the selection, while a group of toggle buttons
12988
+ * is individually tabbable and arrow keys must not change anything (moving selection
12989
+ * on arrow would silently toggle filters as a keyboard user walked the row).
12990
+ *
12991
+ * a11y: roving tabindex in single-select (the selected segment is the tab stop),
12992
+ * RTL-aware arrow-key navigation with wrap-around; arrows move both selection and
12993
+ * focus. Multi-select leaves the native tab order alone and binds no arrow keys.
12631
12994
  */
12632
12995
  declare class FlySegmentedComponent {
12633
12996
  private readonly i18n;
@@ -12636,12 +12999,32 @@ declare class FlySegmentedComponent {
12636
12999
  readonly value: _angular_core.ModelSignal<string | undefined>;
12637
13000
  readonly disabled: _angular_core.InputSignal<boolean>;
12638
13001
  readonly ariaLabelKey: _angular_core.InputSignal<string | undefined>;
13002
+ /** See {@link SegmentedVariant}. */
13003
+ readonly variant: _angular_core.InputSignal<SegmentedVariant>;
13004
+ /**
13005
+ * Switch to multi-select: every pressed option is carried in {@link values} and
13006
+ * clicking one toggles it. {@link value} is ignored in this mode.
13007
+ *
13008
+ * A separate model rather than widening `value` to `string | string[]`: a consumer
13009
+ * would then have to narrow on every read, and every EXISTING consumer's
13010
+ * `[(value)]` binding would stop type-checking — a ds-compat MAJOR for a feature
13011
+ * none of them asked for.
13012
+ */
13013
+ readonly multiple: _angular_core.InputSignal<boolean>;
13014
+ /**
13015
+ * The pressed options in {@link multiple} mode. Order is the consumer's; this
13016
+ * component appends on select and filters on deselect, so a caller that treats it
13017
+ * as a set is unaffected and one that treats it as a list keeps its ordering.
13018
+ */
13019
+ readonly values: _angular_core.ModelSignal<readonly string[]>;
12639
13020
  protected readonly selectedIndex: _angular_core.Signal<number>;
13021
+ /** Selected in whichever model is active. */
13022
+ protected isOn(value: string): boolean;
12640
13023
  protected tabIndexFor(index: number): number;
12641
13024
  protected select(value: string): void;
12642
13025
  protected onKey(event: KeyboardEvent): void;
12643
13026
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlySegmentedComponent, never>;
12644
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlySegmentedComponent, "fly-segmented", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "ariaLabelKey": { "alias": "ariaLabelKey"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
13027
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlySegmentedComponent, "fly-segmented", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "ariaLabelKey": { "alias": "ariaLabelKey"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "values": { "alias": "values"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "values": "valuesChange"; }, never, never, true, never>;
12645
13028
  }
12646
13029
 
12647
13030
  /**
@@ -13102,6 +13485,6 @@ declare const AUDIENCE_ERROR_CODES: {
13102
13485
  };
13103
13486
  type AudienceErrorCode = (typeof AUDIENCE_ERROR_CODES)[keyof typeof AUDIENCE_ERROR_CODES];
13104
13487
 
13105
- 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, ENTITY_LINK_LAUNCHER, 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_CURRENCIES_BRIEF_ENDPOINT, 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, FlyAppUnavailableComponent, 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, FlyCurrencyCatalogService, FlyCurrencySelectorComponent, FlyDataTableComponent, FlyDatePipe, FlyDateTimePipe, FlyDebouncer, FlyDecimalNumberPipe, FlyDeepLinkPrefetchService, 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, FlyMoneyPipe, FlyPaginationComponent, FlyPeoplePickerComponent, FlyPointsTierComponent, FlyProgressComponent, FlyRelativeTimePipe, FlyRemoteContextService, FlyRemoteRouter, FlyRemoteRouterOutletComponent, FlySearchInputComponent, FlySectionHeaderComponent, FlySecureSrcDirective, FlySegmentedComponent, FlySelectComponent, FlySkeletonComponent, FlySliderComponent, FlySparklineComponent, FlySpinnerComponent, FlyStandaloneAuthCallbackComponent, FlyStandaloneAuthService, FlyStandaloneMagicActionsComponent, FlyStateMessageComponent, FlyDynamicFormComponent as FlySurveyFormComponent, FlyTabComponent, FlyTabsComponent, FlyTagsInputComponent, FlyThemeService, FlyTimePipe, FlyToastService, FlyToggleComponent, FlyTooltipDirective, FlyTreeNavComponent, FlyTypeaheadComponent, FlyUserDirectoryService, FlyWindowHelpService, FlyWindowTitleService, FlyosPendingLaunchesGlobalKey, FlyosShellHandlesLaunchRequestsGlobalKey, FlyosShellOwnsHistoryGlobalKey, GANTT_DEPENDENCY_TYPES, GANTT_ROW_TINT_ALPHA, 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, flyFormatMoney, flyFormatTime, flyFullNumber, flyNextEnabledIndex, flyNextSegmentIndex, flyRelativeTime, flyResolveActiveTab, flyRoleGuard, flyScanPendingDelayMs, flyScanRetry, flySignedCompact, flySkinToneLabelKey, flyStandaloneAuthGuard, flyStandaloneAuthInterceptor, flyToDateOnly, flyToPage, flyUnwrap, flyUnwrapCurrencies, 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, prefetchRemoteStyles, 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 };
13106
- 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, EntityLinkLauncher, EntityLinkSelection, FilterGroup, FlyAchievementRow, FlyApiError, FlyApiResponse, FlyAppHomeLayout, FlyAppModule, FlyAppModuleSection, FlyAppUnavailableState, 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, FlyDeepLinkPrefetchRoute, FlyDrawerBodyPadding, FlyDrawerPosition, FlyDrawerSide, FlyDrawerSize, FlyDrawerVariant, FlyEmojiCategory, FlyEmojiCell, FlyEmojiEntry, FlyEmojiPack, FlyEmojiPackEntry, FlyEmojiPackManifest, FlyEmojiPickerSize, FlyEmojiPickerTab, FlyEmojiSection, FlyFileInfo, FlyFileSelection, FlyFormAnswer, FlyFormAnswerValue, FlyFormDefinition, FlyFormFieldOptions, FlyFormOption, FlyFormQuestion, FlyFormQuestionType, FlyFormScoreDisplay, FlyFormatMoneyOptions, FlyLaunchEventDetail, FlyLaunchRequestDetail, FlyLeaderboardRow, FlyLiveRefreshOptions, FlyLocaleEntry, FlyMagicBarIconName, FlyMetaItem, FlyModerationLoadPageRequest, FlyModerationLockThreadRequest, FlyModerationOpenSubjectRequest, FlyModerationReport, FlyModerationReportPage, FlyModerationResolutionStatus, FlyModerationResolveRequest, FlyMoneyDisplay, 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, GanttDependencyDelete, GanttDependencyType, GanttRow, GanttRowDatesChange, GanttRowKind, GanttZoom, IconButtonVariant, LaunchContext, LoadBundleOptions, LoadRemoteStylesOptions, 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 };
13488
+ 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, ENTITY_LINK_LAUNCHER, 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_CURRENCIES_BRIEF_ENDPOINT, FLY_CURRENCY_DEFAULT_ENDPOINT, 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_BREADCRUMBS_EVENT, FLY_WINDOW_BREADCRUMBS_STORE_KEY, FLY_WINDOW_HELP_HINT_EVENT, FLY_WINDOW_PAGE_TITLE_EVENT, FlyAchievementProgressComponent, FlyActionMenuComponent, FlyActionStackComponent, FlyAgentDraggableDirective, FlyAnimatedEmojiComponent, FlyAppHomeComponent, FlyAppTopbarComponent, FlyAppUnavailableComponent, 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, FlyCurrencyCatalogService, FlyCurrencySelectorComponent, FlyDataTableComponent, FlyDatePipe, FlyDateTimePipe, FlyDebouncer, FlyDecimalNumberPipe, FlyDeepLinkPrefetchService, 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, FlyMoneyPipe, FlyPagerComponent, FlyPaginationComponent, FlyPeoplePickerComponent, FlyPointsTierComponent, FlyProgressComponent, FlyRelativeTimePipe, FlyRemoteContextService, FlyRemoteRouter, FlyRemoteRouterOutletComponent, FlySearchInputComponent, FlySectionHeaderComponent, FlySecureSrcDirective, FlySegmentedComponent, FlySelectComponent, FlySkeletonComponent, FlySliderComponent, FlySparklineComponent, FlySpinnerComponent, FlyStandaloneAuthCallbackComponent, FlyStandaloneAuthService, FlyStandaloneMagicActionsComponent, FlyStateMessageComponent, FlyDynamicFormComponent as FlySurveyFormComponent, FlyTabComponent, FlyTabsComponent, FlyTagsInputComponent, FlyThemeService, FlyTimePipe, FlyToastService, FlyToggleComponent, FlyTooltipDirective, FlyTreeNavComponent, FlyTypeaheadComponent, FlyUserDirectoryService, FlyWindowHelpService, FlyWindowTitleService, FlyosPendingLaunchesGlobalKey, FlyosShellHandlesLaunchRequestsGlobalKey, FlyosShellOwnsHistoryGlobalKey, GANTT_DEPENDENCY_TYPES, GANTT_ROW_TINT_ALPHA, 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, WindowBreadcrumbsRegistry, WindowManagerService, applySkinTone, applySuggestion, ariaSort, buildCron, canConfirm, canGoNext$1 as canGoNext, canGoPrev$1 as canGoPrev, captureFocus, clampMagicBarSearchWidth, clampPage$1 as 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, flyFormatMoney, flyFormatTime, flyFullNumber, flyNextEnabledIndex, flyNextSegmentIndex, flyRelativeTime, flyResolveActiveTab, flyRoleGuard, flyScanPendingDelayMs, flyScanRetry, flySignedCompact, flySkinToneLabelKey, flyStandaloneAuthGuard, flyStandaloneAuthInterceptor, flyToDateOnly, flyToPage, flyUnwrap, flyUnwrapCurrencies, flyUnwrapCurrency, 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, canGoNext as pagerCanGoNext, canGoPrev as pagerCanGoPrev, clampPage as pagerClampPage, parseCron, parseStepUpChallenge, parseTags, prefetchRemoteStyles, 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 };
13489
+ 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, EntityLinkLauncher, EntityLinkSelection, FilterGroup, FlyAchievementRow, FlyApiError, FlyApiResponse, FlyAppHomeLayout, FlyAppModule, FlyAppModuleSection, FlyAppUnavailableState, 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, FlyDeepLinkPrefetchRoute, FlyDrawerBodyPadding, FlyDrawerPosition, FlyDrawerSide, FlyDrawerSize, FlyDrawerVariant, FlyEmojiCategory, FlyEmojiCell, FlyEmojiEntry, FlyEmojiPack, FlyEmojiPackEntry, FlyEmojiPackManifest, FlyEmojiPickerSize, FlyEmojiPickerTab, FlyEmojiSection, FlyFileInfo, FlyFileSelection, FlyFormAnswer, FlyFormAnswerValue, FlyFormDefinition, FlyFormFieldOptions, FlyFormOption, FlyFormQuestion, FlyFormQuestionType, FlyFormScoreDisplay, FlyFormatMoneyOptions, FlyLaunchEventDetail, FlyLaunchRequestDetail, FlyLeaderboardRow, FlyLiveRefreshOptions, FlyLocaleEntry, FlyMagicBarIconName, FlyMetaItem, FlyModerationLoadPageRequest, FlyModerationLockThreadRequest, FlyModerationOpenSubjectRequest, FlyModerationReport, FlyModerationReportPage, FlyModerationResolutionStatus, FlyModerationResolveRequest, FlyMoneyDisplay, 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, FlyTenantDefaultCurrencyFetchFn, FlyThemeMode, FlyTooltipPlacement, FlyTreeNavNode, FlyTypeaheadOption, FlyWindowHelpHintEventDetail, FlyWindowHelpPublisher, FlyWindowPageTitleEventDetail, FlyWindowTitlePublisher, FlyosPendingLaunches, FocusRestore, FormBannerKind, GanttDependency, GanttDependencyCreate, GanttDependencyDelete, GanttDependencyType, GanttRow, GanttRowDatesChange, GanttRowKind, GanttZoom, IconButtonVariant, LaunchContext, LoadBundleOptions, LoadRemoteStylesOptions, 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, SegmentedVariant, ShareOrgChartOption, ShareOuNode, SharePanelLevelOption, SharePermissionEntry, SharePrincipal, SharePrincipalKind, ShareUserResult, StateMessageKind, StepUpChallenge, StepUpReauthHandler, StepUpReauthRequest, TabsVariant, ToastAction, ToastEntry, ToastOptions, ToastVariant, User, UserPrincipal, UsersTerm, WindowBreadcrumb, WindowHelpHint, WindowInstance, WindowState };
13107
13490
  //# sourceMappingURL=flyos-design-system.d.ts.map