@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.
- package/fesm2022/flyos-design-system.mjs +2948 -575
- package/fesm2022/flyos-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/scss/_app-surface-tokens.scss +228 -13
- package/scss/_app-surface-utilities.scss +7 -2
- package/scss/_business-app-buttons.scss +35 -8
- package/scss/_fly-theme.scss +9 -0
- package/scss/{_vos-button-mixins.scss → _fos-button-mixins.scss} +28 -28
- package/scss/_ink-baseline.scss +29 -29
- package/scss/_nova-glass.scss +451 -0
- package/scss/_nova-motion-mixins.scss +42 -0
- package/scss/_nova-motion.scss +324 -0
- package/scss/_nova-tokens.scss +356 -0
- package/scss/_nova-type.scss +188 -0
- package/scss/_shell-embed-bridge.scss +120 -81
- package/scss/_theme-dark.scss +11 -1
- package/scss/_theme-light.scss +31 -10
- package/scss/_tokens.scss +17 -9
- package/types/flyos-design-system.d.ts +1642 -36
- package/types/flyos-design-system.d.ts.map +1 -1
|
@@ -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
|
|
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
|
-
/**
|
|
5163
|
-
private static readonly
|
|
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
|
|
5382
|
-
*
|
|
5383
|
-
*
|
|
5384
|
-
*
|
|
5385
|
-
*
|
|
5386
|
-
*
|
|
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
|
|
7349
|
-
* values (
|
|
7350
|
-
*
|
|
7351
|
-
* bare standalone usage where
|
|
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
|
|
8468
|
-
*
|
|
8469
|
-
*
|
|
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
|
-
*
|
|
8490
|
-
*
|
|
8491
|
-
*
|
|
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,
|
|
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`):
|
|
10342
|
-
*
|
|
10343
|
-
*
|
|
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
|